シルバニア

時間経過のアルゴリズムが気になったので調べてみました。
ゲーム内で妖精から、ゆめポイントが増えると時間の流れがゆっくりになると言われます。実際にプレイしていると、たしかにそのようです。
ゆめポイントと時間経過の速さとは具体的にどのように関係しているのでしょうか?



時間経過は、77E1Hから始まるサブルーチンの中で行われています。
一歩歩くごとに、または、一定時間経過((CCBEH)=3CHになったとき(2秒に1回))でコールされます。
ただし、CCBEHの値は十字キーを押しているときやメニュー画面を開いているときは0に固定され、カウントアップが停止します。


   ; 時間経過ルーチン 77E1H~
   LD C,0FH
   LD HL,CCE4H ; (CCE4H)・・・ゆめポイント(HIGH)
   LD B,(HL)
   INC HL ; (CCE5H)・・・ゆめポイント(LOW)
   LD C,(HL)
   SRL B
   RR C
   SRL B
   RR C
   SRL B
   RR C
   SRL B
   RR C
   SRL B
   RR C ; BC←BC/32
   LD HL,782BH ; 782BH・・・時間カウンター増分テーブルのベースアドレス
   ADD HL,BC
   LD A,(HL) ; A←時間カウンター増分
   LD HL,0CCC4H ; (CCC4H)・・・自転車フラグ
   BIT 2,(HL)
   JR Z,780B
   SUB A,10H
   ; 780BH
   LD HL,0CCC0H ; (CCC0H)・・・時間カウンター
   ADD A,(HL)
   LD (HL),A ; (CCC0H)←(CCC0H)+A-(10H(自転車に乗っているとき))
   LD HL,0CCBDH ; (CCBDH)・・・分
   LD A,(HL)
   ADC A,0H
   LD (HL),A



CCC0Hは時間カウンター(わたしが勝手に名づけました。)です。この値がサブルーチンコールのたびに増分だけ上乗せされてゆき、キャリーが発生したときに、またそのときに限って、分(CCBDH)が+1されます。
増分は782BHからの16バイトのテーブルに定義されています。(時間カウンター増分テーブルと勝手に名づけました。)

   ; 時間カウンター増分テーブル
   DB F8H,E0H,D0H,C0H,B0H,AH,90H,80H,70H,68H,60H,50H,48H,40H,38H,30H

時間経過ルーチンのプログラムからわかるように、ゆめポイントを32で割った値を変位としてテーブルにアクセスします。
たしかに、ゆめポイントが多いほど時間経過がゆっくりになっていますね。
また、自転車に乗っているときは増分が-10Hされるので、更に時間経過がゆっくりになります。
ゆめポイントが512以上になると、変位がテーブルの外に出てしまい、かえって時間経過が早くなりますが、通常プレイ時にゆめポイントが512以上になることがあるのかどうかは未検証です。わたしはすぐに家具を買ってしまうので、ゆめポイントがなかなか貯まらず・・・。(;^_^)