tarinai/ACHIEVEMENT_AUDIT.md
2026-07-17 12:25:23 +09:00

15 KiB
Raw Blame History

実績システム詳細監査レポート

対象: tarinai - コピー(8).zip
監査対象: 全64実績、解除イベント、進捗リセット、保存・復元、サーバー同期、関連する衝突・死亡処理

1. 修正した不具合

「あ^~たまらねぇぜ」(self_zunchi_death)

確定仕様

  • おしり鋲を抜いてずんちを排出しただけでは解除しない。
  • 排出ずんちが一度本人の当たり判定外まで離れた後、本人へ戻って衝突する必要がある。
  • 本人に戻って衝突しても、非致死なら解除しない。
  • 本人への帰還衝突で本人が死亡した場合のみ解除する。
  • プレイヤーが保持した、または一度停止した排出ずんちは対象外。
  • バウンス柵などで反射・加速したこと自体は失格条件ではない。

今回確認した実原因

おしり鋲から排出されるずんちは本人の中心付近±8pxに生成されます。一方、旧判定は生成直後から本人との高速衝突を有効としていたため、まだ外へ飛び出す前の重なりで全弾が自己衝突扱いになり得ました。この初動衝突はダメージ、速度の18%化、同一個体への0.55秒ヒットクールダウンを発生させるため、

排出 → バウンス柵で反射・加速 → 本人へ帰還して致死衝突

という本来の達成経路を阻害していました。

また、以前確認した別の不具合として、致死衝突時は死亡処理内で生存個体ID t.id が解放されるため、ダメージ後に所有者IDを比較すると正しい本人死亡でも一致判定を失う問題がありました。

修正

  • 排出ずんちに achievementBurstClearedOwner を追加し、生成時は未成立に設定。
  • 本人の当たり判定外まで一度離れた時点で帰還判定を有効化。
  • それ以前の生成直後オーバーラップは、ダメージ・減速・ヒットクールダウンを含めて完全に無視。
  • 帰還後の致死衝突では、ダメージ適用前に所有者一致を保持して、死亡処理によるID解放後も解除できるよう維持。
  • バウンス柵による反射・加速では資格を失わない。

追加回帰テストでは以下を確認済みです。

  1. 生成直後の本人との重なり → ダメージなし、解除なし。
  2. 本人から一度離れる → 帰還判定が有効化。
  3. バウンス柵相当の高速帰還で本人へ致死衝突 → 解除する。
  4. 帰還しても非致死 → 解除しない。
  5. 他個体への致死衝突 → 解除しない。
  6. 停止・保持済みの排出ずんち → 解除しない。

「敵の敵は味方」(enemy_enemy_friend)

原因

30体以上の状態で連続数を稼いだあと、個体数が30未満へ落ちても、その間にアリを倒さなければ旧連続数が残っていました。その後30体へ戻すと、過去の連続数から再開できました。

修正

死亡処理の時点で生存数を再計算し、30体未満になった瞬間に連続数を0へ戻すよう変更しました。フィールド進捗リセット時には、同一Worldオブジェクトに残り得るランタイム状態と危険アイテム戦闘追跡も破棄するようにしました。


2. 全64実績の実装条件

生態・繁殖系

# 実績 実装上の解除条件
1 はじめての繁殖 繁殖成功イベントが1回発生。
2 ずんちどれい 自然な戦績判定による変身。戦闘5回以上、勝率30%以下などの条件を満たし、戦績経路で奴隷化に成功。単なる生成・手動付与は対象外。
3 たりない王 自然な戦績判定による変身。戦闘6回以上、勝率75%以上などを満たし、戦績経路で王化に成功。
4 5世代のずんちどれい 同一観察世界で、自然発生した奴隷の「世代番号」に5世代連続の並びが成立。直系血統限定ではない。
5 3世代のたりない王 同一観察世界で、自然発生した王の世代番号に3世代連続の並びが成立。
6 たりない不在のアリの巣 生きたアリの巣が1個以上あり、生存たりないが0体。
7 ベビーブーム 同一World内の60ゲーム秒のローリング区間で繁殖30回。内部IDには旧閾値 50 が残るが、表示と実判定は30で一致。
8 偉大なる母 累計繁殖成功3333回。内部IDには旧閾値 1000 が残る。進捗は永続。
9 天寿 死因が「天寿を全うした」と正規化される死亡。
10 25体全員が病気 生存25体以上で、全員がずんち病・爆発病・喧嘩病のいずれかを持つ。睡眠病だけの個体は不適格。
11 幸せなコロニー 6日目以降、コロニー気分 happy をゲーム内1日分連続維持。
12 直接給餌33回 現在の観察世界で、成功した直接の食べ物プレゼントを33回。
13 25体を5分守る 生存25体以上を300ゲーム秒維持。天寿以外の死亡でタイマー再開始。天寿でも結果として25体未満になれば条件未達へ戻る。
14 アリ25匹 生きたアリが同時に25匹以上。
15 過保護 同一個体に直接食料10回以上、かつ直接の薬・治療3回以上。
16 自給自足 生存20体以上、複製機0個を600ゲーム秒維持。直接給餌するとタイマーをリセット。
17 雨宿り 天候が小雨、生存20体以上、全生存個体が雨宿り判定。
18 永遠の歴史 10世代以上の誕生、または世界の最大世代が10以上。
19 町医者 実際にHPを1以上回復した応急手当を累計50回。
20 繁殖を求めし者 ラブ餅影響下の成功繁殖を累計721回。

実験・危険行動系

# 実績 実装上の解除条件
21 あ^~たまらねぇぜ おしり鋲由来の排出ずんちが一度本人から離れ、停止・保持されないまま本人へ帰還して衝突し、その衝突ダメージで本人が死亡。バウンス柵による反射・加速は有効。今回再修正。
22 10秒で50死亡 同一World内の10ゲーム秒ローリング区間で死亡50件。
23 サッカーボール死 通常の ball が速度285以上で衝突し、その衝突ダメージが致死。風船は対象外。
24 戦闘中の危険アイテム連鎖死 戦闘ペアの一方が危険カテゴリ由来の新しいダメージで死亡し、その相手も後に危険カテゴリ由来で死亡。現在、同一World内で第1死亡から第2死亡までの明示的な時間制限はない。
25 ヘコヘコ中に着火 繁殖儀式状態の個体へ着火。着火による状態変更前の儀式状態を参照。
26 下剤中の餓死 下剤効果が有効なフレームで、飢餓・空腹系の死因により死亡。
27 アリ100匹討伐 アリ死亡を累計100件。永続進捗。
28 絶対零度未満 生きたアイテム位置の温度計算値が -273.15℃ 未満。温度効果は重複加算されるため到達可能。
29 サウナ→水風呂 同一生存個体が快適域外の高温状態に入り、15ゲーム秒以内に快適域外の低温状態へ移行。
30 薬品台帳コンプリート 応急手当、鎮静剤、睡眠薬、下剤、プロテイン、ニテロプ、弾薬、謎の薬、水銀、巨大化薬、小型化薬の11種を各1回使用。鎖と王冠は対象外。
31 水銀で天寿 水銀寿命モードが有効な個体が天寿で死亡。
32 敵の敵は味方 生存30体以上の状態で、危険カテゴリのアイテムを直近ダメージ源とするアリ死亡を10連続。危険アイテムでたりないを傷つけると連続数リセット。30体未満になった時点でも今回リセットするよう修正。
33 革命 王が喧嘩死し、直前0.1ゲーム秒以内の戦闘加害者がずんちどれい。
34 火に油 喧嘩餅を受けた個体が30ゲーム秒以内に参加する喧嘩が開始。
35 王の完全満足 生存中の王がプロテイン状態と巨大化薬状態を同時に持つ。
36 奴隷の完全満足 生存中の奴隷がニテロプ状態と小型化薬状態を同時に持つ。
37 混沌を求めし者 喧嘩餅効果中の個体を少なくとも一方に含む喧嘩開始を累計666回。
38 粘着爆弾15渡し 同一の生きた粘着爆弾の受け渡し回数が15回。保存対象。
39 電線で7体感電 同一の通常電線 wire が7体の異なる生存たりないを感電させる。絶縁電線は対象外。

建築・環境系

# 実績 実装上の解除条件
40 100個設置 プレイヤーによる配置を累計100回。永続進捗。
41 機械化産業 永続進捗上でロープ・棒・バネを各1回以上配置し、信号駆動先がONになった履歴も成立。現実装は「現在同時に存在」ではなく履歴ANDで、信号源も検知器だけに厳密限定されていない。
42 情報化産業 電線または絶縁電線が、回路基板Aの出力端子と回路基板Bの入力端子を直接接続し、A出力とB入力がともにON。
43 ロボット掃除 ロボット掃除機が有効対象を200回処理。内部IDには旧閾値 100 が残るが表示・実判定は200。
44 ミニマリスト 6日目以降、生存たりない1体以上、気分 happy、現在存在するプレイヤー設置物が10個以下。
45 無計画都市 プレイヤー設置物を設置後30ゲーム秒以内に削除する行為を累計30回。
46 潔癖ロボット世界 生存アイテムがすべてロボット掃除機、生存たりない0、生存アリ0。さらに少なくとも1台が全6対象マスク、高速モード、稼働中。複数台可。
47 メガロポリス 生存たりない100体以上、複製機10個以上、草ベッド・巣箱・パイプ合計15個以上。
48 トイレ5個 生きたトイレが5個以上。
49 公園の地面変更 フィールド種別が park の状態で、有効な地面変更を1回。
50 1秒で地面4変更 壁時計の1秒ローリング区間で有効な地面変更4回。

操作・プレイ継続系

# 実績 実装上の解除条件
51 5分間観察 最後の介入操作から300ゲーム秒。配置・削除・直接給餌・つつく・掴む・射撃・リンク等は介入として記録。閲覧だけは介入にならない。
52 9スロット保存 9個すべてのセーブスロットに保存ハッシュが存在。
53 1秒で4空クリック 空フィールドクリックを壁時計1秒以内に4回。内部IDには旧名称 pause_spam が残る。
54 Undo大量蘇生 1回のUndoで死亡個体数が10体以上減る。
55 30秒保持 同一の生存たりないを30,000ms連続してプレイヤー保持。タブ非表示で保持タイマーをリセット。
56 Undo 20回 成功したUndoを累計20回。永続進捗。
57 Redo 20回 成功したRedoを累計20回。永続進捗。
58 ぬいぐるみを飛ばす つつく操作の共通ターゲット処理からぬいぐるみを飛ばす。
59 スナイパー 発砲を累計333回。命中不要。
60 一桁FPS 計測FPSが0より大きく10未満。非表示タブ由来の大きなフレーム間隔は計測から除外。
61 7日連続起動 ローカル暦の日付で7日連続してゲームを開く。永続進捗。
62 24時間連続プレイ 実績システム読込時点から壁時計で24時間経過。タブ非表示中も経過時間に含まれる。
63 1時間連続プレイ 同様に壁時計で1時間経過。
64 真のたりない観察者 自身を除く63実績がすべて解除済み。

3. 監査で残した仕様上の注意点

以下はコード上の不達成バグではありませんが、表示文から期待される意味と実装の範囲に差があります。条件変更はゲームデザイン判断になるため、今回は勝手に変更していません。

戦闘ペア危険死

最初の危険死で相手を記録したあと、同一World内では期限がありません。その相手がかなり後になって別の危険アイテムで死亡しても成立し得ます。フィールド進捗リセット時の追跡残留は今回除去しました。

機械化産業

現在は「ロープ・棒・バネを過去に各1回以上配置した」という永続履歴と、「信号駆動先がONになった履歴」のANDです。現在同じ設備として存在する必要はありません。また信号系は回路基板出力も信号源になり得るため、表示文を「検知器の信号」に厳密限定して読む場合は条件が広めです。

敵の敵は味方の「無傷」

現在のリセット対象は、危険カテゴリのアイテムによるたりないへのダメージです。通常の非危険ダメージまで含む「一切のダメージなし」ではありません。今回、30体未満への人口低下で連続数が残る明確な不具合のみ修正しました。

互換性のため残っている旧内部ID

以下は内部ID名と現行閾値が異なりますが、表示文と実際の解除条件は一致しています。ID変更は既存保存データ・サーバー集計との互換性を壊すため変更していません。

  • birth_50_in_60_seconds → 現行は30回
  • great_mother_1000_births → 現行は3333回
  • robot_cleaner_100 → 現行は200回
  • pause_spam_4_in_1_second → 現行条件は空フィールドクリック

4. 検証結果

以下を修正版に対して実行し、すべて成功しました。

  • JavaScript全ファイルの node --check
  • Python監査スクリプトのコンパイル確認
  • achievement_api.php のPHP構文確認
  • 全64実績の定義・UI・同期監査
  • プレイスタイル実績の境界値・リセット範囲・永続化監査
  • 実績イベント統合監査
  • サーバー状態・旧形式移行・並行同期監査
  • 「あたまらねぇぜ」専用回帰テスト6ケース生成直後除外・離脱後帰還を含む

最終テスト結果はいずれも [OK] です。