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