じっくりテトレットでめりこむことがある

最近よく暇つぶしにHSPTVを立ち上げてellerさん(id:eller)のじっくりテトレットで遊ぶんですが、まれにめり込むバグに遭遇します。なかなか再現できないのでどういうときに発生するのかなーと調べたら左右キーどちらかと上キーを同時に押したときに発生するようです。

  • 再現できるように出現するテトリミノをランダムから固定に変更
  • 再現できるようにstick代替モジュールを自動キー操作に変更
  • HSPTV関連をコメントアウト
  • バグの簡単な修正(コメントアウト中)

してみたので、差分を載せます。

--- tetlet.hsp.orig	Fri Apr 11 17:49:48 2008
+++ tetlet.hsp	Fri Apr 11 17:51:37 2008
@@ -1,4 +1,4 @@
-#include "hsptv.as"
+
 
 // 独自stick定義モジュール
 #undef stick
@@ -19,19 +19,7 @@
 
 #deffunc _stick var vTarget, int NO_TRIGGER, int CHECK_MODE, local tmp
     vTarget = 0
-    repeat 6; = length(KEY_CODE)           // start.ax軽量化のために定数化
-        getkey tmp, KEY_CODE(cnt)
-        vTarget = vTarget << 1 | tmp
-    loop
-    if (CHECK_MODE == WIN_ACTIVE_CHECK_ON) & (ginfo_act == -1){
-        // HSPウィンドウがアクティブでない
-        prev = vTarget
-        vTarget = 0
-    } else {
-        tmp = vTarget
-        vTarget &= (-1 ^ prev) | NO_TRIGGER
-        prev = tmp
-    }
+    if mainloopcount@ == 40 || mainloopcount@ == 84 : vTarget = 6 : return
     return
 #define global stick(%1, %2=0, %3=1) _stick %1, %2, %3
 #global
@@ -180,7 +168,7 @@
     cls 1
     randomize
 
-    hsptv_up -1, ""
+    ;hsptv_up -1, ""
 
     dim block_type, 4, 7 // Zが時計回り
     block_type( 0, 0 ) = $0660, $0660, $0660, $0660 // ■
@@ -209,7 +197,8 @@
 *restart
     gosub *reload_highscore
     memset map, 0, AREA_WIDTH * AREA_HEIGHT
-    next_type = rnd(7)
+    ;next_type = rnd(7)
+    next_type = 1
     state = STATE_NORMAL
     score = 0
     gosub *create_new_tetrimino
@@ -226,7 +215,7 @@
     }
     if state == STATE_GAMEOVER {
         if state_limit : state_limit--
-        if state_limit == 1 : hsptv_up score, ""
+        ;if state_limit == 1 : hsptv_up score, ""
         if ( state_limit == 0 ) & ( keys >> 4 & 1 ) : goto *restart
     }
     if state == STATE_NORMAL {
@@ -234,6 +223,7 @@
     }
     gosub *draw
     wait 2
+    mainloopcount ++
     goto *main
 
 *draw
@@ -310,6 +300,7 @@
         }
     }
     if keys & 2 {
+        ;gosub *draw_ghost // とりあえずこれで直るよ!!
         moving_y = ghost_y
         fall_count = fall_limit
     }
@@ -352,7 +343,8 @@
     moving_y = -2
     moving_rot = 0          // 動かしているテトリミノの回転
     moving_type = next_type // 動かしているテトリミノの種類(兼色の種類)
-    next_type = rnd(7)
+    ;next_type = rnd(7)
+    next_type = 3
     if hit_check( map, block_type( moving_rot, moving_type ), moving_x, moving_y ) {
         // ゲームオーバー
         state = STATE_GAMEOVER
@@ -363,6 +355,7 @@
 
 *reload_highscore
     repeat HIGHSCORE_MAX
-        hsptv_getrank highscore(cnt), ranker_name(cnt), s, cnt
+        ;hsptv_getrank highscore(cnt), ranker_name(cnt), s, cnt
+        highscore(cnt) = 0 : ranker_name(cnt) = ""
     loop
     return