// 🎲 サイコロRPGバトル - RandomBoxとDebugBoxを活用した戦闘システム！

print("⚔️ === Dice RPG Battle ===" )
print("RandomBoxを使ったダイスバトルシステム\n")

// デバッグトラッキング開始
DEBUG = new DebugBox()
DEBUG.startTracking()

// 戦闘ログ記録用
battleLog = new ArrayBox()

// キャラクターBox定義
box Character {
    init {
        name,
        hp,
        maxHp,
        attack,
        defense,
        dice,
        math
    }
    
    // ダメージを受ける
    func takeDamage(damage) {
        me.hp = me.hp - damage
        if (me.hp < 0) {
            me.hp = 0
        }
    }
    
    // 生存確認
    func isAlive() {
        return me.hp > 0
    }
    
    // HP表示（整数演算のみ）
    func getHpBar() {
        // HP比率を10倍して計算 (HP * 10) / maxHP
        hpx10 = me.hp * 10
        
        // 整数除算を手動実装
        filled = 0
        temp = hpx10
        loop(temp >= me.maxHp) {
            temp = temp - me.maxHp
            filled = filled + 1
        }
        
        // filledが10を超えないように制限
        if (filled > 10) {
            filled = 10
        }
        
        bar = "["
        i = 0
        loop(i < 10) {
            if (i < filled) {
                bar = bar + "■"
            } else {
                bar = bar + "□"
            }
            i = i + 1
        }
        bar = bar + "]"
        return bar
    }
    
    // ステータス表示
    func showStatus() {
        print(me.name + " HP: " + me.hp + "/" + me.maxHp + " " + me.getHpBar())
        print("  ATK: " + me.attack + " DEF: " + me.defense)
    }
}

// キャラクター作成関数
function createCharacter(name, hp, attack, defense) {
    char = new Character()
    char.name = name
    char.hp = hp
    char.maxHp = hp
    char.attack = attack
    char.defense = defense
    char.dice = new RandomBox()
    char.math = new MathBox()
    DEBUG.trackBox(char, "Character-" + name)
    return char
}

// バトル実行関数
function performAttack(attacker, defender) {
    print("\n⚔️ " + attacker.name + " の攻撃！")
    
    // 攻撃ダイスロール (1-6)
    attackRoll = attacker.dice.randInt(1, 6)
    print("🎲 攻撃ダイス: " + attackRoll)
    
    // 防御ダイスロール (1-6)
    defenseRoll = defender.dice.randInt(1, 6)
    print("🛡️ " + defender.name + " の防御ダイス: " + defenseRoll)
    
    // ダメージ計算
    baseDamage = attacker.attack + attackRoll
    defense = defender.defense + defenseRoll
    damage = baseDamage - defense
    
    if (damage < 0) {
        damage = 0
    }
    
    // クリティカル判定 (6が出たら2倍)
    if (attackRoll == 6) {
        print("💥 クリティカルヒット！")
        damage = damage * 2
    }
    
    // ダメージ適用
    defender.takeDamage(damage)
    
    if (damage > 0) {
        print("💢 " + defender.name + " に " + damage + " ダメージ！")
    } else {
        print("🛡️ " + defender.name + " は攻撃を完全に防いだ！")
    }
    
    // バトルログに記録
    logEntry = attacker.name + " → " + defender.name + ": " + damage + " damage"
    battleLog.push(logEntry)
    
    return damage
}

// メインゲーム
print("\n🎮 ゲーム開始！\n")

// プレイヤーとエネミー作成
player = createCharacter("勇者", 50, 10, 5)
enemy = createCharacter("ゴブリン", 30, 8, 3)

// 初期ステータス表示
print("📊 初期ステータス:")
player.showStatus()
enemy.showStatus()

// バトルループ
turn = 1
battleContinue = true
loop(battleContinue) {
    print("\n========== ターン " + turn + " ==========")
    
    // プレイヤーのターン
    if (player.isAlive()) {
        performAttack(player, enemy)
    }
    
    // エネミーのターン
    if (enemy.isAlive()) {
        performAttack(enemy, player)
    }
    
    // 現在のステータス表示
    print("\n📊 現在のステータス:")
    player.showStatus()
    enemy.showStatus()
    
    // 終了条件チェック
    playerAlive = player.isAlive()
    enemyAlive = enemy.isAlive()
    
    if (not playerAlive) {
        battleContinue = false
    }
    if (not enemyAlive) {
        battleContinue = false
    }
    
    turn = turn + 1
    
    // 安全装置（無限ループ防止）
    if (turn > 50) {
        print("\n⏱️ タイムアップ！引き分け！")
        break
    }
}

// 勝敗判定
print("\n🏁 === バトル終了！ ===")
playerAlive = player.isAlive()
enemyAlive = enemy.isAlive()

if (playerAlive) {
    if (not enemyAlive) {
        print("🎉 勇者の勝利！")
    } else {
        print("🤝 引き分け！")
    }
} else {
    if (enemyAlive) {
        print("💀 ゴブリンの勝利...")
    } else {
        print("🤝 引き分け！")
    }
}

// バトルログ表示
print("\n📜 === バトルログ ===")
i = 0
loop(i < battleLog.length()) {
    print("[" + (i + 1) + "] " + battleLog.get(i))
    i = i + 1
}

// デバッグ情報
print("\n💾 === メモリレポート ===")
print(DEBUG.memoryReport())

print("\n✅ Dice RPG Battle completed!")