🚀 主要機能: • Everything is Box哲学による革新的アーキテクチャ • WebAssemblyブラウザー対応プレイグラウンド • アーティスト協同制作デモ - 複数Boxインスタンス実証 • 視覚的デバッグシステム - DebugBox完全統合 • static box Mainパターン - メモリ安全設計 ⚡ 言語機能: • NOT/AND/OR/除算演算子完全実装 • ジェネリクス/テンプレートシステム • 非同期処理(nowait/await) • try/catchエラーハンドリング • Canvas統合グラフィックス 🎨 ブラウザー体験: • 9種類のインタラクティブデモ • リアルタイムコード実行 • WebCanvas/WebConsole/WebDisplay • モバイル対応完了 🤖 Built with Claude Code collaboration Ready for public release!
218 lines
5.1 KiB
Plaintext
218 lines
5.1 KiB
Plaintext
// 🎲 サイコロ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!") |