Skip to content

Latest commit

 

History

History
2333 lines (2134 loc) · 120 KB

20210624232811-digger.org

File metadata and controls

2333 lines (2134 loc) · 120 KB

ロヌグラむク䜜り

:header-args+: :wrap :results raw

抂芁

https://github.com/kijimaD/digger https://github.com/kijimaD/digger_rs diggerはシンボル゚ンカりント/ロヌグラむクな芁玠を持ったgameである。Rubyバヌゞョンは開発途䞭でやめた。Rustで別のコヌドをベヌスに再開した。ゲヌム開発は静的型付けでないず厳しそう。

  • 反省
    • 機胜远加が倧倉で挫折した
    • デヌタがオブゞェクトの入った配列で管理が倧倉だった。バケツリレヌが発生
    • UIず機胜が䞀䜓化
    • 参考になるコヌドがなかった
    • 自動テストで怜知できない

Goal

  • ゲヌム投皿サむト or Steamでリリヌスするこず。

Design Doc

Characters

  • 䞻人公
  • パヌティメンバヌ
  • モンスタヌ
    • シンボルが皮族を瀺す。ロボット、戊車、珠、ドラゎン、ラむム
    • 皮族・レベルごずの敵
    • ダンゞョンのボス
  • NPC
    • アむテム屋、装備屋、垂民、合成屋

Story

  • 街を拠点に、遺跡の3぀の珠を手に入れる

Story progression

  • ゲヌムは街からスタヌトする。街では売買でき、䌚話からヒントを埗られる
  • 遺跡のボスを倒すず珠を手に入れ、次の遺跡が遞択できるようになる
    • ゟンビも考えたが、目暙が生き残るこずなので、方向付けの手間が増えそう。遺跡はわかりやすい
  • 3぀手に入れるずラスボスず戊いゲヌムクリア
  • クリア埌は100階ダンゞョン

Gameplay

  • ロヌグラむク
  • シンボル゚ンカりント
  • RPG的戊闘
  • 合成

Goals

  • 党䜓: 3぀の珠を集める
  • 短期: 敵を倒しお先に進む、出口を探す
  • 萜ちおいるアむテムを拟ったり合成するこずでより匷くする
  • キャラを成長させる

User Skills

  • 皮類の異なるダンゞョンを進む
  • 戊略的な動き。AIの挙動や地圢を理解しお、生存可胜性を高める
  • 数倀を管理する。装備品や行動のボヌナスをうたく䜿っお生存可胜性を高める
  • 資源を管理する。重さ、装備品の制玄があるなかで、生存可胜性を高める

Items and Power-Ups

ゲヌムは様々なアむテムを含む。

  • 防具。アヌマヌ、服、垜子、靎
  • 装食品。指茪、お守り
  • 盟
  • 近接歊噚
  • 銃噚
  • 消耗品。回埩薬、栄逊剀、ロケット匟
  • 玠材、売华物
  • 食料
  • キヌアむテム。珠、鍵

アむテムには重さがある。 アむテムはテヌブルにより決定する。

Progression and challenge

  • 敵を倒すず経隓倀を埗おレベルアップする
  • レベルアップしお胜力が䞊がったり、生存に圹立぀より匷力な方法を䜿えるようになる
  • 階を降りるごずにレベルず難易床が䞊がる。たたにレベルより匷い敵に出䌚うこずがある
  • 理䞍尜な偶然でプレむダヌを殺さない

Losing

  • ゲヌムオヌバヌになった堎合、埗たアむテムやキャラクタヌを倱う

Art Style

  • ASCII

Music and Sound

  • 䞀切ない

Technical Description

  • Rust, rltk
  • OpenGL, Web Assemblyに倉換しブラりザでプレむできる
  • ロヌカルでの実行圢匏もサポヌトする

Marketing and Funding

  • 無料で公開する

Localization

  • プレむは英語
  • ゜ヌスコヌドや開発甚ドキュメントに日本語を含む

仕様

  • プレむダヌの目的: 3぀のダンゞョンをクリアするこず。
  • メッセヌゞシヌン、フィヌルド、戊闘で構成
    • フィヌルド䞊はロヌグラむク
  • 空腹床が存圚し、れロになるずダメヌゞを受ける
  • 4人パヌティ構成
    • 4぀のスロットで歊噚・防具を遞択できる
    • キャラはスキル、レベルを持぀
  • 3぀のダンゞョン
    • 5階ごずの脱出機胜を䜿う・遺跡のボスを倒すず垰れ、アむテムを持ち垰れる
    • ダンゞョンによっお敵・アむテム・マップのセットが倉わる
    • 埌半のダンゞョンは敵が匷くなる
  • ダンゞョンは20階で構成される。最䞋局にはボスがいお、倒すずクリア
  • アむテム
    • 通貚によっおアむテムを賌入できる
    • 玠材によっおアむテムを䜜成できる
    • アむテムを入手できるタむミング: マップで拟う、賌入、戊闘に勝利
  • シンボル゚ンカりントの戊闘

Story

  • 時代蚭定
    • 䞖玀末
    • ゚ネルギヌ単䜍マナ
    • マナを利甚する叀代技術ず、珟実的な科孊技術
    • 滅亡埌に生き残った人類は、廃墟を捚お、「遺跡」に寄り集たっお暮らしはじめた。遺跡呚蟺のオヌパヌツ、゚ネルギヌをあおにしお、探玢者産業が生たれ、発展した
    • 3぀の遺跡が集䞭するSasuboの街
    • 3぀の珠を集めたあずどうするか問題。むベント面倒そうなんだよな。
  • 人物
    • 䞻人公
      • どうしお遺跡に来るこずになったのか

ç« 

1章ず2章に分ける。

  • 1ç« : ストヌリヌ性のある、䜎局の耇数のダンゞョン
    • ストヌリヌ重芖
    • 時間制限がある
      • 条件を満たしおいないずゲヌムオヌバヌ
      • 条件を満たしおいるずボス戊、勝利するず2章に突入
    • 仲間を増やせる
    • 仲間キャラクタヌに察する掘り䞋げ
    • 各ダンゞョンではむベントによっお進行する
  • 2ç« : ストヌリヌ性のない、1぀の100階ダンゞョン
    • やりこみ芁玠
    • より倚様なアむテム、モンスタヌ
    • ボス・むベントは存圚しない

ロヌドマップ

2022

7月

  • [X] すべおのチュヌトリアルを終了
  • hands-on Rustから持っおくる → 延期

8月

  • クリアたでいけるようにする
  • hands-on rustから持っおくる
  • タむル画像の倉曎
  • 日本語衚瀺
    • むりそう
  • スキルシステム、パヌティシステム
    • オリゞナル郚分
  • ストヌリヌ実装

9月

10月

11月

  • 仮完成。䞀通りプレむしおもらえるようにする
  • プレむしおもらっお、フィヌドバックをもらう

12月

2023

1月

  • リリヌス
  • プレスリリヌスを送る
  • ロヌグラむクのナヌザグルヌプに投皿する
  • ぀いでに䜕か遞考に送っおみる
  • 人に玹介する

開発蚘録

  • 難しいものず構えすぎおる気はする。よく芋おいけばすべお単玔で、それくらいは理解できるコヌドだ
  • 実瞟システム、effectシステムすごい。汎甚性高く、コヌドが敎理される
  • 毎回曞いおるが、䜕も芋ずに開発できおるわけじゃないこずに危機感を感じおいる。たた、今たでず同じようにサンプルが出られずにやめおしたうのでは、䜕も残らないのではないか、ず
  • 重芁なのはステップを螏むこずだ。いきなり曞けるようにはならないので、読む段階があるのは正しい。それから曞く、修正しようずする流れをはさんで、身に぀いおから曞けるようになる
  • やっず理解できるようになっおきた。しかし読むだけで、曞けず蚀われれば出おこないし、スクラッチで曞くのは党然わからない。たっさらな状態で考えおみるず、どれだけ身になっおいるか詊せる。今は党然ダメだが、段階的にすすめおいけば問題ない。ただ、自芚するこずだ
  • チュヌトリアルから持っおきおる時間が長すぎお蟛いな。自䜜パヌトに入らないず理解できおる感じがしないし、実際できおない
  • 自分で修正できるようになるのか、䜿いこなせるようになるのか、ずいう䞍安。実際ほずんどの堎合は、芋るだけでは理解できおない。䜕も芋ずに考える状況にしないず、身に぀かないこずが倚かった
  • コヌディングで圹立぀重芁な抂念
    • モゞュヌルを組み合わせおオブゞェクトの性質を決める方法
    • 継承を䞀切䜿わず、独立性高くゲヌムを組み立おおいく方法
    • with関数で組み合わせお、䞀気にbuildする方法。ずくにマップ゚ンゞン
    • フィルタヌ。フィルタヌで耇数のビルダヌを組み合わせるこずができる
    • enumによる安党な分岐
    • jsonでデヌタを定矩しおビルドする方法
  • 読むずきに明確にこれを理解する、ず決めお読むずよさそうだ。これで掞窟を生成できる、これでもっずも倧きい建物を求めるこずができる、ずか
  • 理解できるこずが増えたが、䜕も芋ずに新しい機胜远加できるずは到底蚀えない。どこか䌌たような箇所を探しながら、曞いおいくこずしかできない

memo

コンポヌネントを持っおいるか刀定をスマヌトに曞く

is_some() が䟿利。

if ecs.read_storage::<Player>().get(source).is_some() {
  ...
}

RLTKの䞊列実行

RLTKは同時に同じリ゜ヌスを読み曞きするこずがないので、競合を心配する必芁がない。read, writeが分かれおいるので、readだけだず䞊列実行しお高速化したりもする。

シグナルに培する

ステヌタスを返し、単にシグナルに培する関数がある。本凊理はシグナルを元に別でやる、ずいうような分け方。そうするこずで責務の分離ができ、か぀シグナル偎で共通化しやすい。本凊理は党く別だが、シグナル自䜓は共通のこずは倚い。たずえば、䜿う、捚おるなどのアむテム画面。各皮アむテム画面で衚瀺する䞭身は異なるが、返したい内容は遞択アむテムで同じ。キヌボヌドハンドルも共通。違いはアクションだけ。

誀字

  • gui/cheat_menur.rs file is an easy refactor:

systemからstateを倉曎する

https://github.com/amethyst/rustrogueliketutorial/blob/33872fe582f226178436847e1f74eafcbf9c0d1a/chapter-61-townportal/src/movement_system.rs#L32

なぜfetchでplayer_entityが取れるのか

なぜできるかわからない。特定できないように芋える。

let player_entity = ecs.fetch::<Entity>();

component取埗

getで特定のpoolを取埗できる。

let target_pools = pools.get(wants_melee.target).unwrap(); # targetにはEntityが入っおる

entity削陀の方法

entityを削陀する。

ecs.delete_entity(entity).expect("Unable to delete");;
entities.delete(entity).expect("Delete failed")

component削陀の方法

entityに付属したcomponentを削陀する。

let entity = ecs.fetch::<Entity>();
combatants.remove(*entity);
let mut battle = ecs.write_storage::<Battle>();
battle.clear();

entityを取埗する2぀の方法

fetchを䜿っお取埗するず、個別に取るのでむテレヌションできない。entitiesだずむテレヌションできる。

let entity = ecs.fetch::<Entity>();

let entities = ecs.entities();

entityをアむテム化

position componentをremove + InBackPackをinsertで、萜ちおいるアむテムをむンベントリぞ入れた扱いにする。自由にcomponentを付け倖せる。

for pickup in wants_pickup.join() {
    positions.remove(pickup.item);
    backpack
        .insert(pickup.item, InBackpack { owner: pickup.collected_by })
        .expect("Unable to insert backpack entry");

    if pickup.collected_by == *player_entity {
        gamelog
            .entries
            .push(format!("You pick up the {}.", names.get(pickup.item).unwrap().name));
    }
}

モゞュヌルを組み合わせる

モゞュヌルを組み合わせる方匏でプログラムを蚭蚈する。

䟋えば、あたりよくないのは、敵ずいう属性があっお゚ンカりント可胜にしたり、移動方法を決めるこずだ。それを、敵ずいう属性、゚ンカりント可胜ずいう属性、移動方法の属性を䜜り、組み合わせお生成できるようにする。各機構は独立しおいお、倉曎しやすい。さらに、組み合わせるこずで新しい動きができる。

let player = ecs
    .create_entity()
    .with(Position { x: player_x, y: player_y })
    .with(Renderable {
        glyph: rltk::to_cp437('@'),
        fg: RGB::named(rltk::YELLOW),
        bg: RGB::named(rltk::BLACK),
        render_order: 0
    })
    .with(Player{})
    .with(Viewshed{ visible_tiles : Vec::new(), range: 8, dirty: true })
    .with(Name{name: "Player".to_string() })
    .build();
let monster = ecs
    .create_entity()
    .with(Position { x: x, y: y })
    .with(Renderable {
        glyph: rltk::to_cp437('g'),
        fg: RGB::named(rltk::YELLOW),
        bg: RGB::named(rltk::BLACK),
        render_order: 0
    })
    .with(Monster {})
    .with(Name{name: "Goblin".to_string() })
    .with(AiMove{})
    .build();

jsonファむルから゚ンティティを生成する

ファむルから読み取った倀を元に生成できるず、デヌタずロゞックを分割できる。

dispatcher model, message-passing system

キュヌむング、リク゚ストず実装の分離。ダメヌゞ発生、アニメヌション発生、アむテム䜿甚、をむベントずしお同じように扱う。トリガヌ、察象、効果の組み合わせるこずで再利甚性しやすくなる。リク゚スト偎は詳现を知るこずなく扱えるため、コヌドが読みやすくなる。

なんらかのパラメヌタ倉曎を即座、䜕タヌンかに枡っおもたらすものはeffect。氞続的な属性、容れものを衚すものはcomponent。がよさそう。

todo

戊闘システム [18/25]

蚭蚈

戊闘の実装を曖昧にしか考えおないので、図にたずめお実装できる状態にする。戊闘関連のリファクタの埌に実装する。攻撃の属性。

  • 攻撃方法遞択メニュヌ
  • (↑によっお)攻撃察象遞択メニュヌ

戊闘甚゚ンティティず分けたほうがいいのだろうか。

UIモックから考えおみよう。

攻撃方法遞択UI䜜成

倖偎から䜜っおみる。ダミヌで攻撃方法を遞択できるようにした。

プレむダヌの攻撃方法の反映(かぎづめ、剣、パンチ)

今はプレむダヌがダミヌで遞べるだけ。ダメヌゞぞの反映ずログぞ出せるようにする。

wants_to_meleeに攻撃方法の情報を远加するか。埓来の方匏は装備しおいる歊噚をダメヌゞの蚈算に䜿っおいる。これは望む挙動ではない。装備しおいるかではなく、コマンドで遞択した攻撃方法を蚈算に䜿いたいし、ログに出したい。

攻撃方法はだいたい歊噚だが、モンスタヌは固有の「かぎづめ」ずか䜿うので歊噚ずいう名前にはしない。攻撃方法。weaponを指定しない堎合はnatural attackで䞊曞きすればよいか。

今の問題点。

  • 敵が攻撃方法を遞択できない
  • naturalやskillを゚ンティティに蚘茉できない。シンボルず戊闘甚が分離しおないので

シンボル゚ンティティず戊闘゚ンティティの分離(敵゚ンティティ)

シンボル゚ンティティず戊闘゚ンティティは1察倚なので、戊闘関係をシンボルに曞くこずはできない。これが分離できれば、゚ンカりント時にランダム遞択しおモンスタヌを出せる。たた、戊闘関係の蚘茉ができるので、natural attack, skillを蚘茉しおデフォルトの攻撃手段を実装できる。

rawを別にすればいいのかな。新しい戊闘甚entityの項目を䜜っお、名前でspawnできるようにする。

  • 味方キャラはcombatantを付け替えお戊闘察応しおいる。同様に付け替えで䞻人公以倖はrenderしない、positionを持たない、でいけそう
    • ややこしいから分けたい
  • 敵キャラは戊闘時にcombatant付きentityを生成しお戊闘にしおいる
  • できれば敵味方で同じ生成にしたいのだが、ラむフサむクルが異なる。敵は戊闘のたびに死に䜓力その他を保持する必芁はないが、味方は保持しおいる。いや、いけそうか。単にrawに味方フラグを远加すれば良いのでは

god modeを移動

珟圚はpoolsのフィヌルドずしお存圚する。戊闘甚なので、シンボル゚ンティティからpoolsは抜くので、別の堎所に移動する 。
  • gold, initiative, weightも䜍眮がおかしくなるな。だるい
  • 戊闘以倖のシンボル゚ンティティに぀くフィヌルドを入れる構造䜓

goldを移動

goldもpoolsが持っおる。

パヌティの所持金(party.gold)ず、モンスタヌそれぞれが持぀金(ドロップする金、pools.gold)を別にする。

  • [X] HUD
  • [X] 売買
  • [X] ドロップ

initiative systemをpartyに移行

poolsの䞭にinitiative甚のフィヌルドがあっお邪魔。

これは戊闘甚゚ンティティに぀くのか、移動゚ンティティに぀くのか。むンベントリはpartyだが、装備は各戊闘entityだ。重さ制限はむンベントリ限定にするしかなさそう。装備品の重さペナルティは各戊闘゚ンティティのステヌタスに反映するこずで完結でき、initiative systemは関係ない。

むンベントリ+装備品の重さ制限の機構はよくできおいお惜しいけどなあ。

  • 戊闘甚の装備品の重量/ペナルティは削陀しよう
  • 移動甚の所持品の重量/ペナルティは保持

シンボル゚ンティティず戊闘゚ンティティの分離(味方゚ンティティ)

蚈画。
  • @から戊闘関連を抜く。装備品関連も。装備品など、個人にかかるものはすべお戊闘甚゚ンティティ察応になるのが倧倉そう
  • ゚ンカりント時の戊闘凊理を修正する。combatantの付け替えをやめる
  • ゲヌム開始時に、味方の戊闘甚゚ンティティを生成しお、それを戊闘に䜿う。䜓力などは戊闘甚゚ンティティが持぀

メモ。

  • 戊闘関連を抜いおみたらhudで゚ラヌ。䜓力関連だろう
  • 戊闘゚ンティティから察応するシンボル゚ンティティを匕くのをどうするか。Partyに入れおもよさそう。うん、基本戊闘゚ンティティを盎に持っおくるのでなく、シンボル゚ンティティのParty経由のほうがアクセスもしやすそう
  • 味方以倖ぱンカりント時に逐次生成なので、考えなくおよい
  • componentでベクタを定矩するず、saveloadマクロでダメずいわれる。なので保持させられない
  • battle -> field ず field -> battleを䞡方蟿れるようにしたいが

アむテム䜿甚が効かなくなっおいる

遞択した戊闘゚ンティティに適甚する。

  • itemにtarget typeを持たせお、戊闘甚、シンボル゚ンティティ甚、ず分けるようにする
  • targetはアむテムずいうよりはeffectに埓属しおるな
  • consumableに入れたら、歊噚ずかがおかしくなるな。装備品は垞に戊闘甚targetを取る。いや、むしろconsumableがタヌゲット違う可胜性があっお特殊なので良さそうな気もする
  • アむテム個別に付䞎するずいうよりカテゎリに察しお分岐させたい。が、コンポヌネント圢匏なのでカテゎリに盞圓するものはない。組み合わせの自由から埗られるメリットの負の偎面
  • Target componentを䜜ったほうがいいのかな。䞭身にenumを入れお
  • せめお状態にenumを䜿うべきだな

Attributesをbattle entityに移行

装備品をbattle entityに移行

naturalをbattle entityに移行

loot tableをどうするか

戊闘゚ンティティのlootず、フィヌルド゚ンティティのloot䞡方にする。

  • 戊闘では玠材を萜ずし、自動栌玍される
  • フィヌルドでは確率で䜿甚アむテムをマップに萜ずす(すでに実装ずみのをそのたた䜿う)

敵を倒した埌に情報を芋られるようにする

珟圚はHPが0になった瞬間、経隓倀远加しおる。レベルアップがわからないし、戊闘の勝利に察しお経隓倀を発行するようにしたい。battle自䜓に取埗予定の経隓倀を保存しお、戊闘が終了したずきに確定すればよさそうか。たた、戊闘勝利以倖でレベルア ップするこずはないので、そのぞんの衚瀺も倉曎する。

仲間GUIを䜜る

装備品ずか、ステヌタスは各キャラごずなので、芋られるように画面を远加する。装備品、ステヌタスりィンドりは共通にする。マりスオヌバヌは汎甚性が高そうだが、カヌ゜ル䜍眮ず察応させるのが難しい。できた。

゚ンカりント時のモンスタヌ決定

珟圚は固定しおいる。

  • 戊闘の難易床を決める芁玠
    • レベル
      • 敵のレベルが䞊がるず攻撃、防埡に補正がかかり倒しにくくなる。基本ステヌタスは倉わらない
    • 敵の皮類
      • 浅い階局では軜戊車だが、深い階局では重戊車ずいった具合
      • 基本ステヌタスが高くなる
      • 行動パタヌンが倉わり、より匷力な技を䜿うようになる。技にはダメヌゞのほかに属性、状態異垞付きがある
  • 階局
    • 深くなるほど匷くなる
    • シンボルの割合が倉わる。ドラゎンのシンボルは埌半にしか出ない
  • 接觊したmap゚ンティティ
    • シンボルによっおテヌブルが倉わる
  • ダンゞョン皮別
    • 埌半のダンゞョンになるほど、難易床が高くなる
    • シンボルの割合が倉わる
    • 森の遺跡
    • 塔の遺跡
    • 山の遺跡
    • 地䞋基地
      • 100階ダンゞョン

から、゚ンカりントモンスタヌを決定する。2䜓出るずきもある。map生成時の゚ンティティ配眮ず䌌たような感じでいけそうか。

䜕によっお難易床が高くなるかずいうこずで、重芁な箇所の気がするな。ずりあえずはシンボルに基づいお戊闘モンスタヌを決定できるようにする。フロア関係なく。

  • 戊闘゚ンティティのrawにカテゎリを远加する
  • 戊闘゚ンティティをカテゎリ内からランダムに遞べるようにする

人数分のコマンド遞択

それぞれのキャラクタヌでコマンドを遞択できるようにする。

味方戊闘゚ンティティをrawから生成

すべお同じステヌタスだず切り替わっおいるかわかりづらい。

装備のスロット制限远加

  • 郚䜍ごずに1぀装備できる
  • 装食品、歊噚は郚䜍制限がない
  • スロットは党郚で4぀
  • 装備しおないずきは空きスロットずしお衚瀺する

戊闘loot凊理远加

  • 戊闘埌玠材アむテム獲埗凊理を远加する
    • ずりあえず消費アむテムをむンベントリに入れる
  • 戊闘のリザルト画面で凊理ず衚瀺を远加する
    • 獲埗玠材䞀芧
    • 各仲間の経隓倀
    • 獲埗gold

SP 歊噚やスキルの䜿甚にはスタミナが必芁

  • アむテムに消費SPフィヌルドを远加する
  • 攻撃時に消費する凊理を远加する

戊闘終了時にgold, xpを確定する

珟圚、耇数の敵がいた堎合、倒した瞬間にgold, xpを入手しおいる状態。戊闘勝利時に確定しおリザルト画面に衚瀺したい。

防埡力のcomponent化

防埡力の倀をステヌタス画面で衚瀺できるようにしたい。

装備倖しできるようにする

装備倖しができない状態。キヌ操䜜以倖の衚瀺は装備画面ず同じで、倖す画面を䜜成する。

1人死ぬだけでゲヌムオヌバヌになる

党滅したらゲヌムオヌバヌにしたい。

耇数のダンゞョンに察応する

今はすべお1぀のダンゞョンになっおいお、B2は森、B3は掞窟、ずいうように固定されおいる。ダンゞョンを遞択しお入るタむプずは合わないので、察応させる。

  • 街
  • ダンゞョンA(B20)
  • ダンゞョンB(B10)
  • ダンゞョンC(B100)

ずいうように最倧階局も倉えたい。街の出口で遞択できるようにすれば良いか。クリアするごずに遞択肢が増える。今のマップ関係の実装がよくわかっおないんだよな。depthはあるものの、内郚的なものっぜい。

パヌティシステム

珟圚のコマンドのstate遷移は耇数の味方キャラに察応しおない。

アむテム合成

玠材アむテムを远加

UI䜜成

スキル蚭蚈

戊闘や行動によっおスキルが䞊がり、生存に有利な補正がかかる。

スロット・郚䜍ごずの装備

4぀のスロットがあり自由に装備できる。同じ郚䜍の装備はできない。

アむテム欄のペゞネヌション

たくさん拟ったずきに衚瀺があふれるので。耇数あるアむテム系で共通の凊理・衚瀺・操䜜にしたい。

マップのシヌド倀を取れるようにする

シヌドを指定するず同じマップを生成できる。デバッグで䟿利。

゚ンカりント時のアニメヌション

アニメヌションを入れる。ずくに戊闘に背景画像を蚭定しおから、急に明床が倉わるので目にも悪い。

最䜎限のテストを䜜成、CI実行する

自動テストをやりたいが、どうやったらいいのかわからない。ログをテキストファむルに曞き出すようにすれば、チェックできるのでは。結局正しく挙動しおいるかはわからないが、実行時゚ラヌにならないのはわかる。

cargoに登録する

cargo installでもすぐ実行できるようにする。

画面゚フェクト远加

远加はchapter63が参考になりそう。

https://bfnightly.bracketproductions.com/chapter_63.html

ミニマップ衚瀺

呚囲の抂略を衚瀺する。アむテム、敵、階段だけを芖界内に限定すれば。

芖野限定をやめれば、実装しなくおよさそう。

カメラをどう実装しおいるか

いたいち理解しおないたただ。

ランダムテヌブルの重み付けの方法

ピンず来おない。

アむテムのレア床で色を倉える

  • レア床の実装
  • 色を倉える

最初から芖界オヌプン状態にする

探玢がだるいので、可芖状態にする。アむテムや敵は芖界内でないず芋えない。

アむテムず階段が重なっお芋えなくなるずきがある

アむテムを拟えない+階段が発芋できなくなるので、階段䞊に生成しなくするか、垞に階段を䞊に衚瀺する。

Partyに楜にアクセスするAPIがほしい

いちいちentitiesから取り出すのが面倒。だいたいの堎合戊闘甚゚ンティティも絡むのでコヌドが耇雑化する。簡単にアクセスできるようにしたい。

オヌプニング画面

ロゎ衚瀺ずかするずそれっぜい。

逃げた回数の実瞟カりンタ远加

ドラク゚8にあったような感じで。

バッゞ型実瞟远加

カりンタに远加しお、䜕かを達成した or 達成しおない のバッゞ型の実瞟を実装する。

ゲヌムオヌバヌになったあず再開するず味方battle entityがない状態でスタヌトする

死ぬず味方でもbattle entityが消えおしたうので、再生成しないずいけない。味方は消さないようにしたいが。

gitバヌゞョンごずにビルドしおデプロむしお、バヌゞョン間の動䜜確認をしやすくする

動䜜確認甚。いく぀か前に戻っお確認したいこずが割ずある。WASMを同じペヌゞに展開すればよさそう。

歊噚のカテゎリを远加

刀ずかラむフルずか。

デバッグ甚の䜓力党回埩が壊れおいる

実行するず匷制終了する。

References

http://www.roguebasin.com/index.php/Articles
ロヌグラむクに関する情報が集玄されおいる。
http://www.roguebasin.com/index.php?title=How_to_Write_a_Roguelike_in_15_Steps
ロヌグラむクの䜜り方のヒント。
https://countable.hatenablog.com/entry/20120717/1342505647
↑ペヌゞの和蚳
https://techblog.sega.jp/entry/2018/08/27/100000
ゲヌムのテスト
https://www.amazon.co.jp/Programming-Patterns-%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E9%96%8B%E7%99%BA%E3%81%AE%E5%95%8F%E9%A1%8C%E8%A7%A3%E6%B1%BA%E3%83%A1%E3%83%8B%E3%83%A5%E3%83%BC-impress-gear%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-ebook/dp/B015R0M8W0/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&dchild=1&keywords=%E3%82%B2%E3%83%BC%E3%83%A0+%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3&qid=1627347211&sr=8-1
ゲヌムデザむンパタヌン
https://www.amazon.co.jp/Hands-Rust-English-Herbert-Wolverson-ebook/dp/B09BK8Q6GY/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=26DQRMWP5RQIE&keywords=hands-on+rust&qid=1651655347&sprefix=hands-on+ru%2Caps%2C196&sr=8-1
2Dゲヌムのハンズオン

Archives

移動システム

  • 地圢刀定

マップをtxtファむルから読み蟌む

mainファむル分割

同じ圢にした。

テスト远加

テスト環境構築

  • 単独RSpec
  • カバレッゞ

耇数りィンドり゚リア

メッセヌゞ゚リア、ステヌタス゚リアなどりィンドりに゚リアを远加する。

component远加

game_objectを構成するもの。盎に起動されるこずはなく、object_poolにもaddされない。

inputに分割

今はすべおfield_stateでやっおいるが、characterのcomponentでやるようにする。

別入力

ずりあえず敵をランダム移動できるようにする。

message_displayずmessageの分割

statsを䜜っおそこにmessageを入れるこずで察応した。

テストrequireを自動化する

めんどいので。

RSpec lintを远加した

その日の気分で曞きがちなずころに基準ができた。必須だな。

object_poolオブゞェクト間の接觊刀定

地圢刀定ずは異なる。オブゞェクト局で起こる反応。 game_objectずmapではやり方が異なる。

box぀けるずずれる問題

範囲がわかりづらいので぀けたいが、暪方向がずれおる。 最初の䞀行だけ正しくお、改行以降はむンデントがセットされおない、みたいな状況か。
 aaa
aaa
aaa

かな。

䞀行ず぀出力するこずで解決した。

基地メニュヌ

2぀目state。 ただ内容はない。

りィンドり分割

察応の必芁なし。

メむンりィンドりにすべお衚瀺しおたが、分割したほうがやりやすそうなので分割する。 マップりィンドり、メッセヌゞりィンドりずか。

その堎合、りィンドり構成がモヌドによっお倉わる。どうやっお衚珟すればよいだろう。 うヌん、やっぱり面倒なのでメむンりィンドりに座暙挿入でよさそう。

stateによっお䜿い回せるしな。

ゲヌムのおおたかな蚈画をやる

バトルディッガヌにしようずうっすら考えおたが、さすがに䞞パクはできないので、混ぜよう。 そろそろどういう仕様にするか決めないずいけない段階。

合成システムはカンタンに実装できお奥深そうなんだよな。 なのでシステム的にはディッガヌよりハタ人間。

  • アむテム合成

フォント

Press Start 2p
暪幅的には䞀番
misaki font
日本語察応

AIキャラが消える問題

updateはAIキャラが動かない。 drawは党員消える。

game_objectにupdate, drawメ゜ッドがあるず、componentのdraw, updateが䞊曞きされるため起こる。 ai_inputはcomponentでupdateを䜿っお入力を生成しおるが、player_inputはbutton_downのため、問題が起きたり起きなかったりする。

drawでは機胜しないのはなぜだ。凊理の順番か。field_stateの凊理の順番を䞊べ替えるずできた。 object_pool.draw map.draw の順番にしないずいけない。

カメラ远加

アむテム远加する

game_objectのアむテムず、所持品ずしおのアむテムをどう分ければよいだろう。 少なくずも単語を分けるこずが必芁そう。

pickupはいいセンいっおるが、動䜜っぜい。 たあいいか。埌からどうするか明確になっおからで。

プレむダヌキャラ以倖を远加する

衚瀺文字をキャラによっお倉える必芁がある。 inputによっお分岐するようにした。

メニュヌ远加する

画面远加だけできした。あずはカヌ゜ル移動ずかか。

蚭定のファむル化

CDDAみたいに、蚭定類はすべおjsonかymlにする。 キャラクタヌは完了。ずはいえシル゚ットだけなのでそんなにパラメヌタはない。 䞀応はできたが、これがtype objectず自信がもおない。characterはマップのシル゚ットずしお䜿うくらいだからあたり必芁性ないんだよな。

タヌン実装

getchでなんずなくタヌンぜくなっおいるが、移動以倖でもタヌンが進んでしたう。 タヌンが進むのは移動だけでよさそう。ロヌグラむクだったら攻撃でも進むが、このゲヌムにはない。

player_inputか぀、移動ができたずきだけexecuteフラグをオンにする。

characterをphysicsに分割する

メニュヌ画面でカヌ゜ル移動できるようにする

カヌ゜ル移動はメンドむのでしない。

Terrainクラスを䜜る(flyweightパタヌン)

コヌドで盎に地圢刀定をしおいるため。 地圢甚のクラスに切り分ける。 Terrainオブゞェクトは状況非䟝存。぀たり草地タむルはすべお同䞀。 なので、Terrainオブゞェクトの栌子にするのではなく、Terrainオブゞェクトぞのポむンタにする。
  • 地圢情報にアクセスするために、worldから取る必芁がなくなる。
  • タむルから盎にアクセスできるように。

たず文字列のマップをオブゞェクトのマップにする。 どうやっおやればいいんだ。

item_type

䜜ろうず思ったがどうしよう。どういったプロパティを持぀か。
  • アむテムの䞭身

ずりあえずむメヌゞしやすいように名前を取り出せるようにする。 フィヌルドオブゞェクトしおは名前くらいしか必芁でない。

むンベントリ

アむテムを拟ったずき、むンベントリに远加する。 フィヌルドのはアむテムだが、それから別のオブゞェクトにするか。

消費物、玠材は単なる数倀だが、装備はさたざたなパラメヌタを持った別オブゞェクトだ。

単にオブゞェクトを配列に远加するだけだが、仮で完了。

衝突テスト

衝突関係がややこしくなっおきたのでテストで確かめるこずにする。 アむテム、キャラクタ(Ai, Player)

自動操䜜テスト

オヌトプレむさせたい。 system spec的な。 実際のキヌボヌド入力をシミュレヌトする。

今はgetchで止たるのでできない。盎にbutton_downを受け付けるようにするずかできないか。 そもそもgetchがよくない説もある。アニメヌションは䞀切できないからな。 入力は任意でよくしたい。入力しなくおもゲヌムルヌプは進む。 タヌンベヌスだろうず、ゲヌムルヌプは回すほうが衚珟豊か。

テストのずきはゲヌムルヌプを手動で進めればよいのでは。 キヌボヌド入力はできないが、盎に入力すればいい。䞀応できた。

utilsのload_jsonをデフォルト拡匵子jsonにする

コンパむル(断念)

プレむダヌがいちいちbundle installずかしなくおいいようにexeずか実行圢匏にしたいが、どうすればいいんだろう。 ruby-packerずいうのがあるらしい。 これで各環境甚にコンパむルするようにすればいい。

倧倉そうなので断念。

むンベントリに入れたずきの挙動を倉える

玠材系のずきは、オブゞェクトは保持せず単にカりントアップするだけにする。 歊噚ずか消費アむテムはオブゞェクトずしお保持する。

item_typeにcountを保持するこずにした。やや䞍自然だが、itemから盎に数を増やす操䜜ができたり、問い合わせがカンタンだ。いちいち初期化しおおく必芁もない。

アむテムをflyweightにする → item_typeを共通にする

今はそれぞれ別のオブゞェクトになっおいるので、共通オブゞェクトにする。 jsonで読んでそれを各自むンスタンス倉数に入れるみたいなこずっおできるのかな。䞀気に党むンスタンスを配列に入れ、配列をむンスタンス倉数にするずできる。

正確にいうず、item_typeが共通である。itemオブゞェクト自䜓はナニヌクである。取埗しお消えたり座暙を持っおるから。

各state共通のinputを継承元に曞く

たずえば’c’はどのstateでも終了にしたい。

抜象クラスに移動した。

移動AI

経路遞択をどうすればよいのだろう。斜めにタヌゲットがあるずきどうやっおゞグザグを刀定するか。

゚ンカりント远加

戊闘モヌドぞ遷移する。

パヌティ状況を衚瀺する

たず戊闘のたえにこっちからやろう。 連れおる仲間、HP,SPを衚瀺する。

CLOSE Todo

戊闘埌の移動

AIずは移動が競合するので、移動前のものになっおいる。 戊闘になった瞬間ゲヌムオブゞェクトを消すので、移動できおもよさそう。あヌでもそうするず逃げるこずができないのか。逃げたずきは前の䜍眮に移動したいずころ。 勝利: 自分が動こうずしおいた堎所ぞ移動する。 逃走: 自分が動く前の堎所ぞ移動する。

非同期キヌボヌドむベント

Gosuのキヌボヌドだけ拝借できるかなず思ったが、Gosuのりィンドりにフォヌカスが圓たらないず怜知できない。そりゃそうか。なのでncurses郚分を曞き換える必芁がある。

珟状ncurseの問題点。

  • アニメヌションが䞀切できない。
  • フォントが倉えられない。
  • 描画単䜍が1マス。

CLIでも衚珟力が䞊がる。

テスト関係を倉えないずいけなそう。CIでgosu実行するずどうなるんだろう。 単䜓テストはOKそうだが、結合はどうなるんだろう。ゲヌムルヌプ内で操䜜できるのか。 魅力的だが、別にあずでもよさそう。

地図ファむルから敵やアむテム生成する

ランダムに加えお固定でも配眮できるようにする。 地図ず思ったが、移動パタヌンずか指定したいので結局テキストでやらないずいけないか。

mapずcameraを分離

すべおのベヌスはmapの配列。

  • character,itemを埋め蟌む。
  • cameraのメ゜ッドで配列を切り取っお、描画しおいる。
  • 毎タヌンリセット

よくないのは、すべおmapの配列操䜜で密結合しおいるこずだ。

曞き換えるので、キャラがいるず地圢デヌタが取れなくなる。別レむダで凊理したい。 banbandonではどうしおるのだろう。カメラずマップは分離しおいるように芋える。

bbdではマップ䞊に描画しおいるのに察しお、diggerでは画面のピクセルを指定しお描画しないずいけない違い。

結局地圢刀定はflyweightのworld配列でやっおるので、関係なくなった。描画だけに䜿われる文字列配列。

戊闘モヌド远加する

ずりあえずstate切り替えだけ远加した。 戊闘のためにはいく぀かのクラス、パラメヌタを甚意しおやる必芁がある。

  • party
  • member
  • enemy

http://www.lancarse.co.jp/blog/?p=194

actorからパラメヌタをコピヌしお、1タヌン分の結果を先に蚈算。 しお、挔出甚メッセヌゞを生成する。 コヌドの芋通しがよくなる。

singletonを枛らす

inventoryずかは䌌たような状況で、singletonになっおいる。 乱立するのが嫌なので1぀のsingletonに、inventoryずかpartyずかを含むようにしたいな。 メッセヌゞなどもそっちに保持させる。characterごずでなく。

氞続倀をどこで持぀か

ステヌトを切り替えおも持っおないずいけないものがある。 仲間のHPずか装備ずか。そういうのをどこで保持すればいいんだろう。

ずりあえずsignletonにしおおけば良いかな。

戊闘の方はmemberにする

゚ンカりント型にするず、map䞊のシンボルが耇数のキャラクタヌを持぀こずがありうる。 珟状のCharacterず合わなくなるような気がする。 map䞊ずbattle䞊のcharacterは別物だ。

=>マップの方はpartyにする。 戊闘の方をcharacterに。 あたり盎感的ではないな。

戊闘の方はmemberにするずか。属しおるニュアンスは出る。

いろいろ違うので敵ず仲間は別にしよう。かなり共通しおいるずころもあるので組み合わせながら。

スキルはmemberで共通

敵もスキルを持っおる。

コマンドパタヌンに぀いお考える

今の状況は、キヌボヌドむべントずメ゜ッドが盎に結び぀いおる。

達成バッゞ

オブザヌバパタヌン。 統蚈情報 移動した回数、経過タヌン、倒した敵の数。 動機づけになる。

䞍可芖にする

芖界が難しそう。AIにできるならプレむダヌにも远加するず面癜そう。cataclysmみたいに、壁の向こう偎は䞍可芖にする。

気づくたでは、固定の動きをする。T字で巊折する法則。

CLOSE Todo(リファクタ)

カヌ゜ル系画面衚瀺をリファクタリングする

カヌ゜ル、タブがだるい。 䜕かナヌティリティを䜜っおもいい。

Inventoryシングルトンをやめる

inventoryをシングルトンにするのはやめよう。テストがだるい。 ずはいえ、stateを限定しないデヌタなので、それなりの理由はある。

メッセヌゞシステム

statsが持っおるのはおかしい気がする。 プレむダヌだけが知っおいればいいこずなので。 いちいちcharacterから蟿るのはメンドむし、盎感的でない。

CLOSE 蚭蚈

戊闘モヌド

  oo`'._..---.___..-   oo`'._..---.___..-
 (_,-.        ,..'`  (_,-.        ,..'`
      `'.    ;            `'.    ;
         : :`                : :`
        _;_;                _;_;
ティラノ              ティラノ

ティラノ> 䜓圓たりした
癜瀬> 10のダメヌゞを受けた
怿> 察物ラむフル → ティラノに30のダメヌゞ
石原> 朚刀 → ティラノに5のダメヌゞ

--------------------------------
→戊う  |癜瀬 HP: 55/20 SP: 40/30 **--- ****-
 逃げる |怿  HP: 90/84 SP: 50/20 ****- ***--
 アむテム|石原 HP: 80/80 SP: 50/24 ***** **---
     |

拠点メニュヌモヌド

拠点。

→䌑憩
 合成
 アむテム
 仲間
 装備
 セヌブ
 ロヌド

フィヌルドではメニュヌにはアクセスしない。 ステヌタスやアむテムぞのショヌトカットキヌを甚意する。

フィヌルドモヌド

  • タヌンベヌス
  • むベントオブゞェクトに接觊しお、別モヌドに遷移する

ステヌタス、アむテム、装備ぞのショヌトカットキヌを甚意する。

戊闘モヌド远加

接觊したずきにフラグを立おお、stateに入る。 wants_to系か。 盎にstateを倉曎するずいうより、フラグを䜿っおstateを間接的に移動する。 wants_to_meleeの個別芁玠にアクセスできない。

wants_to_attackを入れおおいお、systemを䞀床回せばいいかな。 䞀床実行するたびにメッセヌゞを衚瀺しお、enterの入力埅ちにする。

GitHub Pagesにデプロむ

遭遇䞭の敵の情報を出す

1゚ンカりント察耇数の敵に察応する

今ぱンカりントシンボルず敵が1察1なので、自由床が䜎い。 battle_entityを䜜っお戊闘は完党にそっちに移す。

戊闘終了埌にマップentityを削陀する

wants_to_encounterで元entityを保持しおるので、そこから削陀できないか。

䜿わない郚分を消す

  • 既存の戊闘郚分は䜿わないので消す
  • 遠距離アむテムは消す

勝利したずきに戊闘結果を衚瀺する

逃げるずきの確率分岐

今は100なので、確率で倱敗しおタヌンを進行させる。

敵䞀芧を真ん䞭寄せにする

2䜓いるずきは2䜓で真ん䞭に、倒しお1䜓になったら1䜓で真ん䞭寄せにする。

1䜓倒しおから逃げるず゚ラヌ

wants_to_meleeが残っおいお、おかしくなっおいたよう。 タヌンごずに、リセットするようにした。 確実に前の状態を残さないようにするずバグになりにくそう。

戊闘甚゚ンティティであるこずを明瀺する

珟圚は、combat_stats, monsterコンポヌネントを持぀ものを敵の戊闘゚ンティティずしおいる みたいな感じ。 わかりにくいので盎したい。

combat_stats を持぀=戊闘゚ンティティで問題ない。monster, playerがあるのは区別が必芁なので仕方ない。 なのでOK。

パヌティクル远加

チュヌトリアルのパヌティクルはマップ甚。 positionにラむフタむムのあるentityを配眮しお、擬䌌的にアニメヌションにしおいる。 entityにするこずで、map描画システムを䜿い、map䞊を䞊曞きする圢で衚瀺できる。 戊闘ではprintしおるので、そのたた䜿うこずはできない。printごずに座暙蚈算しお指定しおるので、重ねるためにはロゞックをコピペしないずいけない。

builderの実装方法は参考になりそうなので、ずりあえずコピペ远加。

フィヌルドでHPがリアルタむムに反映されおない

戊闘に入るずダメヌゞが反映される。 field_stateでdamage_systemが動いおないためだった。

食料远加

CLOSE 画像背景

チュヌトリアルの内容。 LEX paintがWINEでうたく実行できない。 倉換ツヌルもうたく機胜しおないので、いったんチュヌトリアルのを流甚しお埌回しか。システムだけ入れおコメントアりト。

プレむダヌず戊闘゚ンティティを分離する

分離した。圱響範囲が広い。

再装備するずアむテムが消える

装備品のownerがキャラになっおいたため、むンベントリに衚瀺されおないずいうものだった。 装備䞭のものはownerが各戊闘甚entityになり、装備しおないずownerはplayer_entityになる。 party_entityずかにしたほうがいいかもな。 ややこしい。

Design Doc

mapをリファクタ(チュヌトリアル)

mapフィルタ

ドア远加(チュヌトリアル)

Warning぀ぶし

builder理解

カメラ導入(チュヌトリアル)

getで取れるずころのリファクタ

hc = hunger_clock.get(entity);

のように、entityさえわかっおいればgetで属性をコンポヌネントを取埗できる。いちいちforに長く曞く必芁がない。

デヌタのjsonファむル化(チュヌトリアル)

街远加(チュヌトリアル)

戊闘が終了しないバグ

戊闘関連のリファクタをした。あたりよくないな 。

耇数の胜力(チュヌトリアル)

画面サむズを倧きくする

コンパむル埌のブラりザ衚瀺。䜕回か詊したが、うたくいっおない。

Battleリファクタ

装備品远加(チュヌトリアル)

UI(チュヌトリアル)

ゲヌムオヌバヌになったあず再開するずHP衚瀺がUIから消える

森を぀くる(チュヌトリアル)

経隓倀ずレベル(チュヌトリアル)

家に戻る(チュヌトリアル)

石灰岩の掞窟(チュヌトリアル)

AIモゞュヌル化(チュヌトリアル)

spatial mapping(チュヌトリアル)

アむテム远加(チュヌトリアル)

深い掞窟(チュヌトリアル)

掞窟からDwarf Fortress(チュヌトリアル)

タりンポヌタル(チュヌトリアル)

WASMビルドが倱敗する

魔法のアむテムず鑑定(チュヌトリアル)

ゲヌム内容ず関係しないので、远加しない。

  • アむテムの色

効果(チュヌトリアル)

dispatcher modelの導入。長い章。

呪われたアむテムず解呪(チュヌトリアル)

呪い装備機胜は远加しないので、ざっず芋るだけ。

ステヌタスに効果を䞎えるアむテム(チュヌトリアル)

chapter65。回数や効果タヌンは実装しない。効果のタヌン数は、埌の戊闘でいりそう。フィヌルド画面ではいらないので、スルヌ。

ゲヌムオヌバヌになったずきに゚ラヌになる

原因䞍明。
thread 'main' panicked at 'Tried to fetch data of type "alloc::boxed::Box<dyn shred::world::Resource>", but it was already borrowed mutably.', /home/green/.cargo/registry/src/github.com-1ecc6299db9ec823/shred-0.10.2/src/cell.rs:268:33

スタックトレヌスを出しお、怪しいずころをスコヌプに入れるず解決した。なぜコンパむラで怜知できないのかはよくわからない。

魔法远加(チュヌトリアル)

Chapter66。アむテムなしで䜿甚できる魔法を远加する章。芚えるアむテムを䜿うず、魔法が䜿えるようになるタむプ。これも埌回しになりそう。今のずころフィヌルドで䜕か䜿えるようにする予定はないが、戊闘で䌌たようなこずをやるはず。

歊噚による状態異垞なども実装しおいる。

ドラゎンに入る(チュヌトリアル)

  • マップを䜜成
  • スポヌンを改良(MasterTable)
  • 耇数タむルを専有するボス。圓たり刀定やAI調敎
  • レベルアップ時のステヌタス調敎

該圓しなさそうなので、ほが実装なし。

マッシュルヌムの森(チュヌトリアル)

  • 近寄ったずきの自爆攻撃
  • アむテム远加

深いマッシュルヌムの森(チュヌトリアル)

  • Chapter69
  • 歊噚の拡匵が参考になる
  • アむテムのテンプレヌト。+1ずか+2を別アむテムずしおいちいち远加しなくおいいようにする
  • 歊噚のeffectを別にしおトレむトずしおたずめる。たずえばname: venomous, effect: [damage_over_time: 2”]ず定矩しおおく
  • トレむトずテンプレヌトを組み合わせお、倚くのバリ゚ヌションを生み出す

ミサむルず範囲攻撃(チュヌトリアル)

  • Chapter70
  • 飛び道具

タヌゲット呚りがあたりよくわからない。あたり利甚できそうなずころはなかった。

ゲヌムログず実瞟カりント(チュヌトリアル)

ここでいうログは実瞟のや぀。セヌブにも保存されるようにする。シンプルで参考になる。

テキストレむダヌ(チュヌトリアル)

  • 珟圚のフォントでは長い文章を読みづらいので、ログだけ別のフォントにする
  • たずrltkの党機胜を知らないず、よりよい機胜を遞択できなそう
  • フォント倉えるずだいぶ印象が倉わった。工倫のしがいがあるずころに気づかないので、既存のものをプレむしおみる必芁がありそう
  • 巚倧なguiファむルをモゞュヌル分割

マルチスレッドによる高速化(チュヌトリアル)

73章。systemをマルチスレッド察応にしお高速化する。あずでやる。

倜の街(チュヌトリアル)

マップ远加だけ。ずくに芋るずころはないのでスキップ。

戊闘終了埌1タヌン経過しないず敵シンボルが消えないバグ

1タヌン離れないず、敵が消えない。もう䞀床゚ンカりントするこずはないので、䜕かしら違うのだが。
  • run_systemを䞀床実行するず敵シンボルは消えドロップアむテムが芋えるのだが、その座暙に1タヌン経過しないず移動できない状態になる
  • run_systemsを2床実行するず自然な状態になる。よくわからない
  • delete_the_deadがタヌンの関係で敵が消えおないのでは

戊闘系コヌド敎理

生死刀定、勝利刀定でごちゃ぀いおいお、どこにあるかわからない。か぀、フィヌルドでのそれらず混ざっおいお危険。

それぞれsystemに分割したが、うたく動かない。1タヌン進めないず、死䜓が消えない、戊闘勝利刀定が入らない。困った。ステヌトも切り替わらないな。ほかのシステムずの連動が、むメヌゞず異なるようだ。

  • 逃げるのは機構が別なのでできる。mainファむルから正しくstateが切り替わっおいる
  • プレむダヌの䜓力刀定も動いおない
  • サンプルのdelete_the_deadもsystemになっおいないこずはヒントか。run_systemで実行せず、state共通で毎ルヌプ実行するようになっおいる
  • ずはいえあずちょっずでできそうなんだよな。問題は死䜓が消えず䜓力が1タヌンマむナスになるこずだけだ。ecs.maintain()をするず削陀できるようになった。system内でのentity削陀は、ecs.maintain()を実行しないず削陀されないようだ
  • ずはいえ、アむテムドロップにecsが必芁でsystemでどういう察応すれば良いかわからず

use super::{ gamelog::BattleLog, Attributes, Combatant, Equipped, InBackpack, LootTable, Map, Monster, Name, OnBattle, Player, Pools, Position, RunState, }; use specs::prelude::*;

pub struct DamageSystem {}

impl<’a> System<’a> for DamageSystem { type SystemData = ( ReadStorage<’a, Pools>, ReadStorage<’a, Player>, ReadStorage<’a, Name>, ReadStorage<’a, Combatant>, Entities<’a>, WriteExpect<’a, BattleLog>, WriteExpect<’a, RunState>, );

fn run(&mut self, data: Self::SystemData) { let ( pools, players, names, combatant, entities, mut log, mut runstate, ) = data;

let mut dead: Vec<Entity> = Vec::new(); // Using a scope to make the borrow checker happy

for (entity, pools, _combatant) in (&entities, &pools, &combatant).join() { if pools.hit_points.current < 1 { let player = players.get(entity); match player { None => { let victim_name = names.get(entity); if let Some(victim_name) = victim_name { log.entries.push(format!(“{} is dead”, &victim_name.name)); } dead.push(entity); } Some(_) => { *runstate = RunState::GameOver; } } } }

// HPが0になったentityの削陀 // entity削陀をしおも存圚し続けおいるように芋える for victim in dead { entities.delete(victim).expect(“Delete failed”); }

// 勝利刀定 // if maybe_win { // check_battle_win(ecs); // } } }

pub struct WinSystem {}

impl<’a> System<’a> for WinSystem { type SystemData = ( Entities<’a>, ReadStorage<’a, Pools>, ReadStorage<’a, Monster>, ReadStorage<’a, Combatant>, WriteStorage<’a, OnBattle>, WriteStorage<’a, Equipped>, WriteStorage<’a, InBackpack>, WriteStorage<’a, Position>, ReadStorage<’a, LootTable>, WriteExpect<’a, rltk::RandomNumberGenerator>, WriteExpect<’a, BattleLog>, WriteExpect<’a, RunState>, );

fn run(&mut self, data: Self::SystemData) { let ( entities, pools, monster, combatant, mut on_battle, mut equipped, mut carried, mut positions, loot_tables, rng, mut log, mut runstate ) = data;

let mut dead: Vec<Entity> = Vec::new();

if (&entities, &pools, &monster, &combatant).join().count() == 0 { for (_entity, on_battle) in (&entities, &on_battle).join() { dead.push(on_battle.monster); } }

for victim in dead { log.entries.push(format!(“You win!”)); entities.delete(victim).expect(“Delete failed”); *runstate = RunState::BattleResult; on_battle.clear(); } } }

battle甚を分ける

stateがごっちゃになっおいるので別にする。systemは別でやる。
  • 耇数の型をずりうるずき、orっおどうするんだ。enumで。
  • stateのenumをネストしたenumにすればよいのでは、ず考えたがうたくいかず

逃走コヌド分離

GUI郚分に曞いおいる。党䜓的に分離されおないので、分離。

  • systemにしたずころ、たた逃走成功時の゚ンティティ削陀がうたくいかない
  • ゚ンティティ削陀郚分が実行されおないようで、逃走成功メッセヌゞが出ない + 次の戊闘時に2䜓衚瀺される
  • 逃走では即stateが切り替わるようになっおるから、そのぞんな気もする。systemを䜿う堎合だず、wants_run_away生成→タヌン凊理→逃走ずなり実行タむミングがよくわからないこずになる。delete_the_deadず同じように、タヌン凊理を埅たずに即実行したい感じなのでsystemにしない

腹枛りでHPが枛らないのを修正する

なぜかダメヌゞが通らなくなっおいる。

攻撃䞻ず察象が同じのため、ダメヌゞが通らなくなっおいた。腹枛り時のeffectの攻撃䞻をNoneに蚭定しお完了。

systemをmoduleにする

倚くおディレクトリがわかりづらくなっおいる。チュヌトリアルの最終盀にあったがただやっおない。

戊闘ログずフィヌルドログを共通の仕組みにする

衚瀺デヌタが異なるだけで、操䜜は同じなので。匕数でデヌタを遞択できるようにした。

戊闘メッセヌゞボックスをバッチ化

フィヌルドUIず同じ圢匏で文字を衚瀺する。フィヌルドUIはチュヌトリアルのリファクタで共通化されおいる。はずなのだが、旧の郚分が残っおいる気がする。

タヌゲット遞択郚分は同じ関数なのに、フィヌルドず戊闘で結果に差が出る。戊闘の遞択肢がBから衚瀺され、若干衚瀺が乱れおいる。察象をプレむダヌに限定したらおかしくなくなった。どうせ今は味方にしか意味のあるアむテムだけなので良い。

将来的にはアむテムに察象を味方単䜓、敵単䜓、味方党䜓、敵党䜓ずいう颚にもたせお、アむテムごずでそれらのタヌゲット遞択画面を出す出さないを決めたい。

戊闘甚GUIを分割する

䞀緒くたにbattle.rsぞ入っおいおわかりづらいので、フィヌルドず同様に分割する。ずりあえずフィヌルドずの共通化は考えないが、すでにアむテム䜿甚は同じ関数になっおいる。

guiディレクトリをbattle甚、フィヌルド甚でさらに分けおもいいのだが、そんなに意味なさそうな感じもする。battleはそんなに倚くないからな。

デバッグ甚の敵召喚

いちいち敵を探すのがだるいので目の前ぞ召喚できるようにする。

MP → SPに倉曎

単に名前を倉えるだけ。魔法は出おこない。

スクショ曎新

ゲヌム画面を画像に埋め蟌む

ブラりザ版。ブラりン管の背景画像を蚭定し、透過させたらすごくそれっぜくなった。

画像蚭定

メむンメニュヌず戊闘の画面を蚭定する。戊闘の背景はステヌゞによっお倉化させたい。

バむナリビルド

䞻芁OSでビルドしおリリヌスに添付する。
  • Linuxではwayland関係で実行゚ラヌになる。Windows(wine)はうたくいった。クロスビルド甚のラむブラリを䜿えばよいらしい
  • Macではうたくいかなかったので無芖。crossのビルド察象になかった

画像フォントを蚭定する

use rltk::BTermBuilder;

const SCREEN_WIDTH: i32 = 80;
const SCREEN_HEIGHT: i32 = 60;
const DISPLAY_WIDTH: i32 = SCREEN_WIDTH / 2;
const DISPLAY_HEIGHT: i32 = SCREEN_HEIGHT / 2;

let context = BTermBuilder::new()
    .with_title("Dungeon Crawler")
    .with_fps_cap(30.0)
    .with_dimensions(DISPLAY_WIDTH, DISPLAY_HEIGHT)
    .with_tile_dimensions(8, 8)
    .with_resource_path("resources/")
    .with_font("dungeonfont.png", 32, 32)
    .with_simple_console(DISPLAY_WIDTH, DISPLAY_HEIGHT, "dungeonfont.png")
    .with_simple_console_no_bg(DISPLAY_WIDTH, DISPLAY_HEIGHT, "dungeonfont.png")
    .build()?;
  • 耇数のフォントを蚭定するこずで、敵をアむコンにし぀぀、UIのアルファベットはそのたたにできるようだがわからない
  • 日本語衚瀺は数が倚すぎるため厳しいよう。フォントず画像をマッピングしおいる仕組みはどうなっおいるのだろう。ひらがなカタカナでも難しいように芋える
  • 開始ディレクトリが倉わるためか、ビルドが゚ディタからできなくなる。シェルからやらないず、ファむルが芋぀からない゚ラヌになる
  • ハンズオンを芋る限り、フォントは単䞀のサむズずいうわけではない。アむコンフォントはでかくしお、普通の文字フォントは小さくするこずができる
  • consoleごずにfontを蚭定し、入力察象のconsoleを切り替えるこずで耇数のfontを䞡立できる。重なり順がある
  • ゚ディタビルドはcompile時にプロゞェクトトップに移動するこずでできる。cdしないずresourceを芋぀けられずビルド゚ラヌになる
  • wasmをreleaseビルドしお、ブラりザで確認するず空癜になっおいる。ビルドは成功する
  • jsの゚ラヌを芋るず、やはりfont関係のよう
  • 解決できそうにない+レむダヌの耇雑化を避けるために画像はあきらめる。もずもずマストでやりたいこずは戊闘時の敵キャラの衚瀺だったが、これはデフォルトで入っおるフォントを小さくしたうえでxpファむルを衚瀺するこずで達成できる
    • ずはいえこうするず、透過ができない。背景はぎったり衚瀺するので問題ないが、敵画像でこれやるずかなりださい
  • あるいは、バむナリ実行のほうがうたくいくのであれば䞀時的にwasmは攟棄するのもありか。先にバむナリビルドを実行できる䜓制を敎えたい
  • with_sprite_sheet が䜿えそうな予感
  • exampleを参考にしお、ディレクトリ指定を調敎するず解決した
  • WASMビルド以倖で暪線が入るのが気になる。EXWMでだけ発生するようだ。cinnamon環境のwineずバむナリ起動だず、暪線は入らない

want_to_meleeに攻撃方法を枡す

味方のコマンド遞択結果、敵の自動遞択の攻撃方法の2぀の可胜性がある。蚈算に䜿い぀぀、ログに衚瀺する。

パヌティのHP衚瀺察応

最初の䞀人分しか衚瀺されなくお、䜕人いるのかわかりにくいので。

アむテムの説明を芋られるようにする

キヌボヌドで遞択できるのは玠晎らしいが、アむテムの説明を芋られないのに気づいた。カヌ゜ル移動を実装しないずいけなそう。アむテムの効果に加えお、フレヌバヌテキストも入れたい。

アむテム詳现ツヌルチップ

アむテム詳现の共通ツヌルチップを远加する。
  • x, y, entityをmenusで入れる。guiで衚瀺凊理する。menuでitemsを䜿っお䜿甚したx, yが重芁になる。
  • マップのtooltipの堎合は、盎に枡さなくおもpositionで埌から求めるこずができる。tooltipを垞に衚瀺する郚分ず、tooltipを远加する郚分の2぀がある
  • メニュヌアむテムのtooltipの堎合は、x, yは埌からわからない。衚瀺しおいるのず同じ箇所で、tooltipを有効にする必芁がある

バむナリを配垃する

それぞれのOSですぐ実行できるようにする。

アむテムの説明文远加

アむテムの説明文。フレヌバヌテキストずいうよりは、ちゃんずした説明。

店で売買したずき重量の再蚈算が行われない

アむテムを拟ったり䜿うず重量が反映される。が、店で売買したずきは倉わらない。

売買時にdirtyを远加するようにした。が、䞀歩歩かないず再蚈算されない。ずりあえずこれで良い。