///|
/// JSON 序列化 - 战斗状态导入/导出
// ─── 将卡牌转为JSON字符串 ───
pub fn card_to_json(card : Card) -> String {
let type_str = match card.card_type {
Attack => "\"attack\""
Skill => "\"skill\""
Ability => "\"ability\""
}
let arch_str = match card.archetype {
Basic => "\"basic\""
Fortress => "\"fortress\""
Overload => "\"overload\""
}
let target_str = match card.target {
Single => "\"single\""
Self => "\"self\""
Aoe => "\"aoe\""
}
"{" +
"\"id\":\"" + card.id + "\"," +
"\"name\":\"" + card.name + "\"," +
"\"name_en\":\"" + card.name_en + "\"," +
"\"type\":" + type_str + "," +
"\"archetype\":" + arch_str + "," +
"\"cost\":" + card.cost.to_string() + "," +
"\"target\":" + target_str + "," +
"\"effect\":\"" + card.effect + "\"," +
"\"base_damage\":" + card.base_damage.to_string() + "," +
"\"base_armor\":" + card.base_armor.to_string() + "," +
"\"self_damage\":" + card.self_damage.to_string() + "," +
"\"sonic_boom\":" + card.sonic_boom.to_string() + "," +
"\"pollution_modifier\":" + card.pollution_modifier.to_string() + "," +
"\"exhaust\":" + card.exhaust.to_string() + "," +
"\"retain\":" + card.retain.to_string() +
"}"
}
// ─── 卡牌数组转JSON ───
pub fn cards_to_json(cards : Array[Card]) -> String {
if cards.length() == 0 { return "[]" }
let mut s = "["
let mut i = 0
while i < cards.length() {
s = s + card_to_json(cards[i])
if i < cards.length() - 1 { s = s + "," }
i = i + 1
}
s + "]"
}
// ─── 战斗状态转JSON(摘要) ───
pub fn battle_summary_to_json(state : BattleState) -> String {
"{" +
"\"turn\":" + state.turn_number.to_string() + "," +
"\"player_hp\":" + state.player.hp.to_string() + "," +
"\"player_max_hp\":" + state.player.max_hp.to_string() + "," +
"\"player_armor\":" + state.player.armor.to_string() + "," +
"\"player_ap\":" + state.player.ap.to_string() + "," +
"\"enemy_hp\":" + state.enemy.hp.to_string() + "," +
"\"enemy_max_hp\":" + state.enemy.max_hp.to_string() + "," +
"\"enemy_armor\":" + state.enemy.armor.to_string() + "," +
"\"enemy_name\":\"" + state.enemy.name + "\"," +
"\"enemy_is_boss\":" + state.enemy.is_boss.to_string() + "," +
"\"pollution\":" + state.pollution.to_string() + "," +
"\"pollution_level\":\"" + get_pollution_level(state.pollution).name + "\"," +
"\"phase\":\"" + phase_to_string(state.phase) + "\"," +
"\"hand_size\":" + state.player.hand.length().to_string() + "," +
"\"deck_size\":" + state.player.deck.length().to_string() + "," +
"\"discard_size\":" + state.player.discard.length().to_string() + "," +
"\"sonic_boom_stacks\":" + get_sonic_boom_stacks(state.enemy).to_string() + "," +
"\"abilities_count\":" + state.player.permanent_abilities.length().to_string() +
"}"
}
// ─── 阶段转字符串 ───
fn phase_to_string(phase : BattlePhase) -> String {
match phase {
PlayerTurn => "\"player_turn\""
EnemyTurn => "\"enemy_turn\""
Victory_ => "\"victory\""
Defeat_ => "\"defeat\""
}
}
// ─── 获取声爆层数 ───
fn get_sonic_boom_stacks(enemy : EnemyState) -> Int {
let mut stacks = 0
let mut i = 0
while i < enemy.debuffs.length() {
if enemy.debuffs[i].debuff_type == SonicBoom { stacks = stacks + enemy.debuffs[i].stacks }
i = i + 1
}
stacks
}
// ─── 角色转JSON ───
pub fn character_to_json(char : Character) -> String {
"{" +
"\"id\":\"" + char.id + "\"," +
"\"name\":\"" + char.name + "\"," +
"\"name_en\":\"" + char.name_en + "\"," +
"\"title\":\"" + char.title + "\"," +
"\"max_hp\":" + char.max_hp.to_string() + "," +
"\"relic\":\"" + char.relic + "\"," +
"\"relic_effect\":\"" + char.relic_effect + "\"," +
"\"lore\":\"" + char.lore + "\"" +
"}"
}
// ─── 敌人转JSON ───
pub fn enemy_to_json(enemy : Enemy) -> String {
"{" +
"\"id\":\"" + enemy.id + "\"," +
"\"name\":\"" + enemy.name + "\"," +
"\"name_en\":\"" + enemy.name_en + "\"," +
"\"lore\":\"" + enemy.lore + "\"," +
"\"hp_1p\":" + enemy.hp_1p.to_string() + "," +
"\"hp_2p\":" + enemy.hp_2p.to_string() + "," +
"\"is_boss\":" + enemy.is_boss.to_string() + "," +
"\"has_phase2\":" + enemy.has_phase2.to_string() + "," +
"\"actions_count\":" + enemy.actions.length().to_string() +
"}"
}
// ─── 生成完整战斗报告JSON ───
pub fn full_battle_report(state : BattleState) -> String {
"{" +
"\"game\":\"Abyssal Chord\"," +
"\"engine\":\"MoonBit\"," +
"\"character\":" + character_to_json(state.player_char) + "," +
"\"enemy\":" + enemy_to_json(state.enemy_data) + "," +
"\"battle_state\":" + battle_summary_to_json(state) + "," +
"\"log_count\":" + state.log.length().to_string() +
"}"
}
// ─── 验证JSON字符串基本格式 ───
pub fn is_valid_json_summary(json_str : String) -> Bool {
// 基本检查:以{开头,以}结尾
let len = json_str.length()
if len < 2 { return false }
json_str[0] == '{' && json_str[len - 1] == '}'
}
// ─── 获取卡牌统计 ───
pub fn card_statistics() -> String {
let total = total_card_count()
let zl = zhong_lv_cards().length()
let xy = xian_yin_cards().length()
let neutral = 4
"{" +
"\"total_cards\":" + total.to_string() + "," +
"\"zhong_lv\":" + zl.to_string() + "," +
"\"xian_yin\":" + xy.to_string() + "," +
"\"neutral\":" + neutral.to_string() +
"}"
}
// ─── 获取敌人统计 ───
pub fn enemy_statistics() -> String {
let total = total_enemy_count()
let normal = 5
let bosses = 2
"{" +
"\"total_enemies\":" + total.to_string() + "," +
"\"normal\":" + normal.to_string() + "," +
"\"bosses\":" + bosses.to_string() +
"}"
}