ふにゃ1(開発状況)
ヘルプにステージメーカーのページ追加しました!
ステージメーカーを根本的に作り直したので、ヘルプのほうもVB版のコピーではなく1から書き直しています。
一応、あの頃の自分の言葉遣いをある程度意識した文章にしています。
ヘルプにステージメーカーのページ追加しました!
ステージメーカーを根本的に作り直したので、ヘルプのほうもVB版のコピーではなく1から書き直しています。
一応、あの頃の自分の言葉遣いをある程度意識した文章にしています。

キャラ配置とステージ増減できるようになった!!
めんどくさくなったのでコミットごとのコメントはやめときます。
キャラ配置は、VB版とは違って、ドラッグ&ドロップではなく、普通のマップチップと同じようにクリックで配置するようにしました。
ドラッグアイコンが思うように変更できなかったのと、マップチップと操作方法が違うのも混乱するだろうという考えのもとで変更しました。
マップ増減は、ボタンポチポチでどんどん増やしたり減らしたりできます。
ふにゃさんみたいにマップ入れ替え(マップ3と2を入れ替えて3が先に出てくるようにするとか)に対応してもいいかもしれませんね。
シェアボタンできてきた! pic.twitter.com/i9SgLuXpDI
— 📛松田美文 (@matsuda323) January 12, 2025
今だとFediverse系(Mastodon、Misskey、Bluesky等)とか、mixi2とかもあるし、ボタンの追加にも対応したいかも。

ColorPicker的なのがWPF標準にはなかったので、自前で色指定ダイアログ作りました。
色指定ダイアログの調整。
明るい背景色でもステージの境界がわかるように調整しました。
毎度毎度メニューからステージメーカー開くの面倒なので、ショートカットキー設定しました。
ついでにヘルプも。
ゲーム的には最も重要なキャラクター配置機能を作り始めました。
ただ、VB版と同様のドラッグアンドドロップによる操作がなんだかうまく作れなかったので、違う方法を考えようと思います。
今は実装進める気はないけど、もっといい感じにやる方法あったのでメモがてらコメント。
JavaScriptで画像をクリップボードにコピーする方法 | Coding Haku
画像添付できるかも!って話です。
バグ修正したやつ、リリースしました。
実はもう一個バグが見つかっていて、コード上は修正完了しているんですが、そっちは別に危なくないバグなんで、リリースは後日別の修正と一緒に、ということにします。
の前に、コード上修正が完了したバグのやつ。
バグったというよりは、VB6の仕様の考慮漏れにより未実装だったやつです。
で、そのバグ修正で新たにバグるようなことがあるから、修正後即日リリースみたいなことはあまりしたくないというのが、2個目のコミット。
ふにゃ1のステージファイルはVB6でも読めるShift_JISで書かれているので、ステージメーカーで書けたとしても、絵文字や難しい漢字などShift_JISにない文字は保存しちゃいけないのです。
ということで、使えない文字があった場合にはエラーを出して保存させないようにしました。
バリデーションはWPF公式のマニュアルを参考に。
もっと簡単な書き方ないのかと他の記事も見たんですが、みんなだいたい同じようなやり方でした。
背景色の対応。
単純に背景色を表示すると、黒いマップに黒い背景色を設定した場合などに、マップがどこにあるのか見えなくなるので、白く光らせて闇に浮かぶようにしました。
光の色は白固定なので、白いマップに白い背景だと光が見えなくて結局マップを見失いますが、今のところは対応していません。
なお、ゲーム本体のほうは、マップの境目が見えないのも一つのゲーム性と考え、この光は入れないつもりです。
確認したらやっぱりリリース版でもバグってたので、チェリーピックしました。
もうちょっとバグないか確認したらアップする予定。
あと、ダウンロードページで、ファイルサイズ大きめなのに表記してなかったので、表記するようにしました。
これも本体と一緒にアップ予定。
大きすぎるステージはエラーになり、小さすぎるステージは何もできずミスになるので、範囲に制限を設けました。
エラーを出すほうがいいかなとか思ったりもしましたが、黙って範囲を修正する方向で対応しました。
これは秘密機能関連のバグ修正。
公開中のバージョン2.0.0にも同じバグがあったらチェリーピックしてこの修正だけ先にリリースしたほうがいいかも。
昨日は「WPFらしく」なんて抜かしてましたが、WPFは座標が小数になる都合上、スクロールの具合でマス目に隙間が生まれてしまうので、ゲーム本体と同じ、一度に描画する方式に変えました。
ステージサイズとかを反映する機能。
毎回地形全部を描画しなおすとさすがに重かったので、再描画が最小限になるような調整も入れています。
そしていよいよマウスでぐりぐりやって編集する機能。
ファイルを開くときのマウス操作にも反応してしまったので、ちょっとそのあたりの制御も入れています。
編集する機能に遅れてマップチップ選択機能。
マップ側でスポイトすることもできますし、チップ側で選択することもできます。
これで既存ステージの地形を変えたりはできるようになりました。
他に必要なのは…
できればやるやつは、
こんくらいかな。
WidthとHeightが実は幅と高さより1少ない値出たので、正しい名前にしときました。
んで、コミットメッセージの詳細にも書いてありますが、WidthとHeightを正しい意味に再定義しました。
見た目だけだったキーボードショートカットを実装。
ステージメーカーをゲーム側に入れたのでそのことを追記。
ずっと気になってたMapTextの無駄さをどうにかしました。
読み込みの瞬間にしか使ってないのにフィールドとしてずっと保持していたんですよね。
ゲーム本体のほうはマップ表示を原作通りの方法で行いましたが、ステージメーカーは初めから原作と違う方法で実装しているので、マップ表示も素直にWPFらしくやってます。
新規マップの大きさ初期値が1x1のプレイ不可能なサイズだったので、調整しました。
マップセレクトができるようになりました。
これもだいたいXAMLのバインディングで実現していて、INotifyPropertyChangedの件は、その準備となります。
本当はマップ表示までやってしまいたかったんですけどね。
ステージメーカー開発再開!
このあたりはUIの便利機能。
昨年はバインディングうまくいかなくていろいろ試行錯誤していましたが、結局手抜きせずDependencyPropertyやINotifyPropertyChangedを使うのが近道でした。
もっと本格的にMVVMをやったりたくさんのプロパティを扱うならReactivePropertyなどのフレームワークに頼るべきなのでしょうが、この規模なら直接実装で問題なしです。
ファイル保存に対応しました!
とはいえ、まだステージ本体の編集はできないんですがね。
ファイル読み込みはゲーム本体側の処理を流用。
大晦日にやってたファイル分離はこのためだったというわけです。
これ、VB版では摩擦力20がステージメーカー上での上限だったのですが、実は未公開の炎のステージでこの上限をぶっちぎった100という数値が使われていたので、数値直接指定でのみ使えるようにしておきました。
使いやすいプリセット選択肢やスライダーでは引き続き20が上限です。
ってことで、年越し前後のイベント。
第22回アストルティア★ハッピーくじ『年末大勝負くじ☆2024』 (2024/12/23更新)|目覚めし冒険者の広場
ちょっと前に発表されてたハッピーくじ、やっと交換してきました。
相変わらず参加賞と確定3等しか当たってないですが。
参加賞はアクロバットスターのしぐさです。
モーション自体は1.0からずっとあったのに結構今更感。
お正月イベント「新春とってもヘビ~な鏡餅!」 (2024/12/27更新)|目覚めし冒険者の広場
お正月イベント!
一発バトルして終わりの簡単なイベントなんだけど、イベント会場見て回ったりとかバトルの準備とかだらだらやってたら、まあまあ時間を食ってしまいました。
せっかくバトルの準備したんだしとか思っていきなり強ボス周回しだしたのが良くなかったか。
まあ、時間かけた分、クエスト化してない拾い物イベントもしっかりこなせたし、良しとするか。
蛇姫からのヘルプ巳~|目覚めし冒険者の広場
懐かしすぎるというか、12年も前の上、ゲーム本編に出てこなかったキャラだから覚えてる人少なそうな蛇姫のイベント。
とりあえず私は、衣装借りたのと、参加賞のためのノルマ1体討伐だけやっときました。
でも年明けてもこの進行度合い、大討伐イベントとしては微妙な勢いだなァ。
運営側は、イベント景品をもって新年を迎えられるように、全ノルマ達成したらイベント終了を待たずに景品を配布できるようにしたとか言ってた気がするけど、普通に道半ばのまま年越してしまいました。
12年後にはダッピール本人も登場したりするんだろうか…。
他の写真は以下から。日記には1枚しか載せなかったけど各バトルも写真撮ってるよ。
写真置き場「2024/12/31」
写真置き場「2025/01/01」
本当はステージメーカーまで作ってしまいたかったのですが、今回は旧バージョンを取り下げたということもあり、完成より公開を優先しました。
今日のコミットは、公開のための最終調整だけです。
作りかけのステージメーカーは、非表示にしただけで、内部的には残してあります。
ここからは今後の構想です。
今回、未完成なバージョンをあえてバージョン2として公開しました。
本当は、ステージメーカーも含めた完成版をお披露目したかったというのはもちろんですし、なんなら、プレイ記録画面のように、新しい機能ももっと追加したかったのです。
つまり、今なすべき課題は、旧バージョンの再現と、新機能の開発です。
優先すべきは当然旧バージョンの再現ですし、構想中の新機能の中には、ゲームのプレイ感覚を大きく変えうるものも含まれます。
だから、旧バージョンの再現と新機能の開発は、明確にバージョンを分けたほうがいいと思ったのです。
ということで、今後の開発は、旧バージョンの再現を目指す2系と、新機能を目指す3系に分けようと思います。
とはいえ、2系を開発しつつ3系も並行するなんて器用な真似が私にできるはずがないので、新機能のうちプレイ感覚がそんなに変わらないのは2系に取り込みつつ、2系が完全に終わってから本格的な3系開発という流れになるかと思います。
そこまで…できたらいいなァ。
これはこれで考えていることがあるけど、今から書いても考えてもまとまらないのでまた後日…。
ちゃんと公開するためには同梱用のステージも入れとかないとね。
ゼロGステージはもともとステージじゃないふりをしたファイルを同梱しておいて、条件達成時にリネームする仕組みでしたが、元ファイルを削除されてしまったり、リネーム済みのファイルを持ち越して別環境で新たに始めると問題を起こすようになっていたので、仕組みから変えました。
実行ファイルに元ファイルが埋め込まれるようにしたので、リネームではなく新たに生成されるようになります。
起動時にはもう既にゲームが始まっていて動き始めているのですが、プレイヤーの気分としては、タイトル画面の見た目なので、動いてないつもりなんですよ。
だから、プレイ中のBGMがのっけから流れ始めるとちょっとおかしな気分になるわけです。
ということで、キャラクターの動作がタイトルの時点で始まるという挙動は維持したまま、BGMは気分的な開始のタイミングに合わせました。
これも細かいけど、初期フォルダの調整。
ステージファイルがある場所ですな。
ステージメーカーに流用するためにCleaterからステージ関連以外を分離してたわけだけど、本当に流用しようとしたら、分離がまだ足りなかったので、ステージのデータ関連と、ステージを動かす部分を分離しました。
本来は、ステージを動かす部分がステージのデータ関連を持っているhasの関係なのですが、それをやるにはちょっと密結合すぎてしんどかったので、ステージを動かす部分がステージのデータ関連でもあるというisの関係として分離しました。
実装的には、メンバ変数として持つか、継承するかの違い。
ということで、ステージメーカーの本格的な実装を始めようとコードをいじくりまわしたけど、まともに動くほど進行はしてないです。
いつもの。
いくつか大きな改善点や新機能を用意したもので忘れかけてたけど、このプロジェクトの今の目的は、公開停止したVB版の代わりを早期に提供すること。
だからこそ、本来最適であろうゲームエンジンを使わず、愚直なWPFを使ったのです。
ステージメーカーのほうは再現にとどまらない大規模改変になりそうだし、ひとまずここはゲーム本体だけで公開したほうがいいかも。
お正月イベント「新春とってもヘビ~な鏡餅!」 (2024/12/27更新)|目覚めし冒険者の広場
蛇姫からのヘルプ巳~|目覚めし冒険者の広場
この辺やってた。
思ったより時間かかったので写真とかは年越し写真と一緒に明日の日記にでも。
これは本体側の話。
結局単なるHTMLファイルにしました。
WindowsHelpはもちろん、HTMLヘルプ(CHM)も、今どきのWindowsには搭載されていないし、XAMLはUI作成用であって文書作成向けではないので不適任。
別にファイルを隠したいわけでもないので、1ファイルにまとめていない単なるHTMLファイル群にしたというわけです。
これ、拡大率100%、つまり普通の画面だと、ふにゃが嫌な感じにぼやけてしまうので、調整した形です。
同じ症状はプレイ記録画面のバナナにも表れますが、文字列幅がどうしても少数になってしまう都合上、こちらの解決は難しそうです。
で、このコミットがステージメーカー側。
これまでずっと別の実行ファイルとして提供してきましたが、もうゲーム本体に組み込むことにしました。
マップメーカーはもともと複数ウィンドウを使うものだったのですが、なんかそういう構成はだいぶ前から使われなくなっているので、1ウィンドウに全部収める構成に変更しています。
ツールバーのアイコンは一応自作です。
アセンブリ情報からバージョン情報を取るように変更。
こうしたほうがバージョンアップ時に必要な修正箇所が少なくて済むし、何よりこれがVB版の挙動だったんですよね。
VB版はソース紛失でバージョンアップできなくなり、あの実装の恩恵を受けることはありませんでしたが、今回はちゃんとバージョンアップできる体制ですからね。
あとはヘルプを作り直すだけかな。
WindowsHelpはもう使えないし、HTMLかな。
あるいは、WPFらしくXAMLかな?

バージョン情報ダイアログも作って、本体の完成は残すところヘルプのみ。
こっから先は、各コミットに関するコメントを、昨日書けなかった分も含め、順不同で。
秘密機能のスピードオプションはVB版では2倍速と1/2倍速に変更できましたが、これに加え、10倍速と1/10倍速も選べるようにしました。
これは本来funyak向けに考えていた機能で、アクションが難しい部分ではスローにしたり、待つ必要がある部分で倍速にしたり、というのを想定したものです。
こういったピンポイント利用をしやすくするため、スピード変更機能にショートカットキーも追加しました。
激しく非推奨ですが、設定ファイルを直接いじると、50倍速までは出せます。
コミット履歴からもわかるように、WPFでは、キーボードショートカットとメニューに表記されているショートカットっぽいテキストは別物です。
ショートカットキーさえ知っていれば、未解禁のメニューも実質押せるってわけです。
なので、解禁前は、実行しようとしても無視するようにしました。
ふにゃが寝ます!
寝てるとかわいいので、WPF版に移植するとしても、絶対にここは外してはいけないのです!!
メッセージ表示をモードレスにした都合上、最初のタイトル表記の時点から「自爆」メニューが使えるようになってしまったので、それに対するピンポイント対応です。
自爆できないようにするというのも選択肢ではあったのですが、ここはなんかできるようにしときたいと思ったので。
今回WPFを使って実装を進めているわけですが、別にWPFに詳しいわけでも得意なわけでもなく、DataContextの設定の仕方すら満足に知らなかったのです。
開発を手っ取り早く済ませたい都合上、これまでも「WPFの機能をちゃんと知っていればもっと簡潔に書けるのに」と思ったことは何度もありましたし、これからも何度もあるでしょう。
今回のDataContextの件は、無事知ることができたので簡潔に書けた例です。
ま、まあ、コードビハインドの1行がXAMLの1行になっただけなので、行数的には変わってないんですけどね。
XAML上で候補が出るようになったのはうれしい。
ふにゃのバナナ数のカンストは現在5000ですが、もっとカンストらしく9999とかにしたいなーとか思って、その準備段階として、定数で書くようにしました。
なお、秘密機能の条件のほうは、要求数据え置きです。
昨日めちゃくちゃ頑張ってたのがここ。
今どきの言い方をするなら、実績とかアチーブメントとかいうやつですね。
VB版ではふにゃの顔をダブルクリックすると、殺風景なメッセージボックスに何の説明もなく数字とtrue/Falseが並べて表示されましたが、これをもっとわかるようにしたのがWPF版でのこの変更です。
取ったバナナの数をわかりやすく表記し、秘密機能もどれがどれかわかるように表示します。
あと、今更条件を隠す意味もないと思ったので、画面上に条件も表示するようにしました。
前後しますが、プレイ記録画面実装に合わせるため、秘密機能が出てきたときのテキストも変更しました。
名前とは別にプレイ記録画面で説明も出るようにしたので、名前としては簡潔なものにしました。
一応統一感を意識して、簡潔な英単語1語にしています。
サンプル画像を使うステージと、画像が無くなってた時のフォールバック対応。
指定された画像がないときは、サンプルステージ用の画像を使うようにしました。
ステージファイルを開くメニューから選択するのが面倒ってときに、エクスプローラーからドラッグ&ドロップできると嬉しいなってことで。
こういうのってビジネスソフト向けの機能な気もしますが、WPFがそもそもゲームよりビジネス用途向けの技術なんで、こういうのをするのは簡単なんですよね。
Cleaterがロジック全部込みの、いわゆる“神クラス”(参考)になっていて、機能調整しにくい状態になっていたので、分離して使いやすくしました。
本当はステージデータ関連を分離したかったのですが、ステージデータ関連はあらゆる機能に密蜜の密に密結合していて、分離しようとするとかなり大変なロジックの修正が必要になってしまったので、逆に考えてステージデータ無関係な部分をきりのいい単位で分離しました。
ステージデータ関連の処理を分離したかった理由がこれ。
GitHub Copilotが書いたコミットメッセージからは何も意図が伝わってきませんが、ステージデータの読み込みに失敗したときにバグらないようにする対応です。
読み込み途中は、ステージデータを持っているCleaterオブジェクトをもう一つ用意しておいて、読み込み成功したときだけ、ゲーム画面が持っているCleaterオブジェクト本体と置き換えるようにしています。
こうしたことで、失敗したときに、途中まで読み込んだデータで画面上のステージが書き換えられてしまうことがなく、壊れたデータを開いてしまったときにも安全になったのです。
これは共通処理の切り出し。
ふにゃのモーションがランダムに流れるバージョン情報も再現しました。
今のところ、実行ファイルのプロパティで見られるバージョンと自動連動する機能はありませんが、それも開発中です。
Windows Formsと同じ方法だとエラーが出たんですよね…。
日記に書くほどのものでもなさそうだけど、一応書いたので。
おきがえリポちゃん ~ 花華メイドレス&華商人のたすき ~ (2024/12/24)|目覚めし冒険者の広場
今月の貸衣装。


女性陣の花華メイドレスはこんな感じ。
和風でメイドって言うと、女中かな。

男性陣の華商人のたすきはこう。
こっちはカミハルムイで普通に商売してそう。

いろいろ頑張ろうとしたらコミットが中途半端な状態になったので今日は画像だけ。
詳しくは明日の日記にでも。
書き忘れてたんで追記。
来週、もとい、来年の放送情報。
まあ、普通にメニューで選択中のオプションとか、機能の解禁状況で表示切り替えたりとか、そういう基本的なところですな。
GitHub Copilotにコミットメッセージ任せたらステージセレクトの件がスルーされましたが、オプション変えたときの反応です。
秘密機能本体の実装も進んできたというわけです。
大昔のソフトだし公式ページに全シークレット書いてるのでネタバレ自重しないんですが、無重力に関するバグ修正です。
ここはちゃんとVB6のコードを解析できていたのですが、なぜか解析したコードを転記していませんでした。
無重力で飛び上がったら天井に頭ぶつけるか死ぬまで操作が効かないって状況になってしまっていました。
ここは実質動きの変わらない気分的な修正。
ショートカットキーの実装です。
これまでメニューイベントはClickイベントで実装していましたが、ショートカットキーの実装に当たって、WPFの流儀に従ってコマンドで実装しなおしました。
ショートカットキー本体とショートカットキーの表示が別管理になっているというのがちょっと微妙なところですが。
時々やっとかないと忘れる説明更新。
課題「#32 削除前に尋ねる」の対応です。
一行で終わり!
ウィルス扱いされる件の再確認が済んだら、リリースしようかと思います。
それまでは、単純に自分一人で便利に使います。
一応、CIビルド版はGitHub Actionsからダウンロードできます。
設定の保存名のReverseが機能解禁状況と設定値で同じになっていて、うまく読み書きできない状態だったので、解禁状況のほうを名前変更しました。
スピードのほうは最初から想定して「SpeedSet」にしてたのになァ。
VB版からのデータ引継ぎに対応しました!
ただ、今のところVB版とWPF版を共存できる環境がないので、テストはできていません。
また、最初にVB版のデータを引き継いだ後は、WPF版専用の場所に別形式で保存するので、VB版に設定を書き戻すことは想定していません。
魔法の迷宮ボスモンスター「人食い火竜」登場! (2024/12/23)|目覚めし冒険者の広場
新コインボス。
まだ戦ってないどころかコインすら当てていませんが、討伐報酬だけはクリスマスプレゼントでもらいました。
まあ、3キャラ合わせて福引券2万枚ぐらいはあるので、引いたらコインぐらいいくらか当たるでしょう。
設定&記録の読み書きができるようになりました!
これでバナナ収集要素も秘密機能も成立します。
もちろん、音楽とかの設定も、軌道のたびにやり直す必要はありません。
秘密機能由来のゲーム速度や重力などの設定も保存しますが、そのあたりは変数があるだけで中身は未実装。
あと、VB版とは記録場所が違うので、今のところ互換性はありません。
まあ、レジストリにいることはわかっているので、引継ぎ機能は作れると思いますが。
再生のたびにイベントをつけたり外したりしていたら、どこかで対応関係がずれるのか、ループがバグったりしたので、修正しました。
VB版にはなかった画面サイズ変更機能が付いたので、それへの対応。
VB版からの変更点追記。
コミットメッセージはAI任せにすることもありますし、今日のコミットにも使っていますが、これに関してはAIが大ウソついたので、手書きしました。
READMEに概要だけ書いたのを見て、ソースコードに実装したと勘違いするの、たぶん疑似相関に騙されてる感じですね。
疑似相関というのは、「体重の重い子供ほど学力が高い」みたいなやつで、本当は体重と学力に因果関係なんてないのに、年齢でどっちも上がっていくから、まるで因果関係があるような数値が出るんですね。
今回のでいうと、ソースコードに実装したら、文書にその概要を書き、コミットメッセージにも概要を書くわけです。
そうすると、ソースコード→文書、ソースコード→コミットメッセージの因果関係が生まれるわけですが、一つのコミットにまとめると、文書→コミットメッセージの因果関係もあるように見えるのです。
だから、論理的な判断ではなく、文字列の解釈だけで結果を出すようなAIは間違った結果を出すわけですね。
クリスマスイベント「もうひとつの星夜祭」 (2024/12/4)|目覚めし冒険者の広場
ふにゃ1の移植で忙しいけど、そろそろ期限も近付いてきたのでやりましたよ。

クリスマスツリーがまがまがしくなっています。
でもこれはこれで好き。

メインストーリーのネタバレじゃないイベントボスなので隠さず写真載せるよ。
帝国三将軍のクリスマスバージョンです。
冬のイベントボスがたまに使う雪だるま攻撃、今回はふんだんに使ってきました。
あっちもこっちも雪だるま!

クリア報酬は装備品のボンボントップスセット。
足装備だけ、クリア後の収集要素として、タイツ(ハイソックス?)付きの靴もあります。
写真で穿いてるのがまさにそれ。
ここには直接載せないけど、このセットとは別に傘装備の羽をつけてもいい感じ。

イベントエリアで買える家具はこんな感じ。
机と椅子はファンシー系を目指すハウジングなら季節問わず使えそう。
ガラスのツリーは庭用もあります。
他の写真は以下から。
写真置き場「2024/12/23」
音楽の設定画面の調整。
デフォルトで音楽鳴らさないようにしておくと、ファイルだけ設定しても鳴らないので、ファイル設定だけでなるようにデフォルトでオンになるようにしておきました。
さらに、オフなのにファイルを設定して混乱しないように、オフの間はファイルを設定できないようにしました。
ちなみにこのコミットメッセージはAI製。
ループ機能も実装しました。
VB版ではコントロール自身がよしなにしてくれていたのですが、WPF版ではループ用のコードを書いています。
さらに、WPF版では、ループするかしないかの設定もできるので、音楽としてファンファーレみたいな短いのを設定しても違和感なく鳴らせます。
このコミットメッセージはAIが出したのがろくでもない内容だったので心のこもった手書きです。