diff --git a/src/cc/dapps/dappstd.c b/src/cc/dapps/dappstd.c index 1ab3e6427..f98a3af63 100644 --- a/src/cc/dapps/dappstd.c +++ b/src/cc/dapps/dappstd.c @@ -805,7 +805,7 @@ int32_t flushkeystrokes_local(struct games_state *rs,int32_t waitflag) #ifdef STANDALONE char fname[1024]; FILE *fp; int32_t i,retflag = -1; rs->counter++; - gamesfname(fname,rs->seed,rs->counter); + gamesfname(fname,rs->origseed,rs->counter); if ( (fp= fopen(fname,"wb")) != 0 ) { if ( fwrite(rs->buffered,1,rs->num,fp) == rs->num ) @@ -813,7 +813,7 @@ int32_t flushkeystrokes_local(struct games_state *rs,int32_t waitflag) rs->num = 0; retflag = 0; fclose(fp); - gamesfname(fname,rs->seed,rs->counter+1); + gamesfname(fname,rs->origseed,rs->counter+1); if ( (fp= fopen(fname,"wb")) != 0 ) // truncate next file fclose(fp); //fprintf(stderr,"savefile <- %s retflag.%d\n",fname,retflag); @@ -844,7 +844,7 @@ int32_t flushkeystrokes(struct games_state *rs,int32_t waitflag) { if ( rs->num > 0 ) { - if ( games_progress(rs,waitflag,rs->seed,rs->buffered,rs->num) > 0 ) + if ( games_progress(rs,waitflag,rs->origseed,rs->buffered,rs->num) > 0 ) { flushkeystrokes_local(rs,waitflag); memset(rs->buffered,0,sizeof(rs->buffered)); @@ -868,7 +868,7 @@ int32_t games_replay2(uint8_t *newdata,uint64_t seed,char *keystrokes,int32_t nu { struct games_state *rs; FILE *fp; int32_t i,n; void *ptr; rs = (struct games_state *)calloc(1,sizeof(*rs)); - rs->seed = seed; + rs->seed = rs->origseed = seed; rs->keystrokes = keystrokes; rs->numkeys = num; rs->sleeptime = sleepmillis * 1000; @@ -891,7 +891,7 @@ int32_t games_replay2(uint8_t *newdata,uint64_t seed,char *keystrokes,int32_t nu for (i=0; i<10000; i++) { memset(rs,0,sizeof(*rs)); - rs->seed = seed; + rs->seed = rs->origseed = seed; rs->keystrokes = keystrokes; rs->numkeys = num; rs->sleeptime = 0; @@ -1009,6 +1009,61 @@ int32_t games_replay(uint64_t seed,int32_t sleeptime) return(num); } +char games_readchar(struct rogue_state *rs) +{ + char c,ch = -1; + if ( rs != 0 && rs->guiflag == 0 ) + { + static uint32_t counter; + if ( rs->ind < rs->numkeys ) + { + c = rs->keystrokes[rs->ind++]; + if ( 0 ) + { + static FILE *fp; static int32_t counter; + if ( fp == 0 ) + fp = fopen("log","wb"); + if ( fp != 0 ) + { + fprintf(fp,"%d: (%c) seed.%llu\n",counter,c,(long long)rs->origseed); + fflush(fp); + counter++; + } + } + return(c); + } + if ( rs->replaydone != 0 && counter++ < 3 ) + fprintf(stderr,"replay finished but readchar called\n"); + rs->replaydone = (uint32_t)time(NULL); + if ( counter < 3 || (counter & 1) == 0 ) + return('y'); + else return(ESCAPE); + } + if ( rs == 0 || rs->guiflag != 0 ) + { + ch = (char) getch(); + if (ch == 3) + { + _quit(); + return(27); + } + if ( rs != 0 && rs->guiflag != 0 ) + { + if ( rs->num < sizeof(rs->buffered) ) + { + rs->buffered[rs->num++] = ch; + if ( rs->num > (sizeof(rs->buffered)*9)/10 && rs->needflush == 0 ) + { + rs->needflush = (uint32_t)time(NULL); + //fprintf(stderr,"needflush.%u %d of %d\n",rs->needflush,rs->num,(int32_t)sizeof(rs->buffered)); + //sleep(3); + } + } else fprintf(stderr,"buffer filled without flushed\n"); + } + } else fprintf(stderr,"readchar rs.%p non-gui error?\n",rs); + return(ch); +} + int32_t games_setplayerdata(struct games_state *rs,char *gametxidstr) { char cmd[32768]; int32_t i,n,retval=-1; char params[1024],*filestr=0,*pname,*statusstr,*datastr,fname[128]; long allocsize; cJSON *retjson,*array,*item,*resultjson; diff --git a/src/cc/tetris.c b/src/cc/tetris.c index 305bf0c3b..3047e0e55 100644 --- a/src/cc/tetris.c +++ b/src/cc/tetris.c @@ -696,40 +696,57 @@ void *gamesiterate(struct games_state *rs) next = newwin(6, 10, 0, 2 * (tg->cols + 1) + 1); hold = newwin(6, 10, 7, 2 * (tg->cols + 1) + 1); score = newwin(6, 10, 14, 2 * (tg->cols + 1 ) + 1); - while (running) + while ( running != 0 ) { - running = tg_tick(rs,tg, move); - display_board(board, tg); - display_piece(next, tg->next); - display_piece(hold, tg->stored); - display_score(score, tg); - if ( (counter++ % 5) == 0 ) - doupdate(); - sleep_milli(10); - c = getch(); - switch ( c ) + running = tg_tick(rs,tg,move); + if ( rs->guiflag != 0 ) { - case KEY_LEFT: - c = 'h'; - break; - case KEY_RIGHT: - c = 'l'; - break; - case KEY_UP: - c = 'k'; - break; - case KEY_DOWN: - c = 'j'; - break; + display_board(board,tg); + display_piece(next,tg->next); + display_piece(hold,tg->stored); + display_score(score,tg); + if ( (counter++ % 5) == 0 ) + doupdate(); + sleep_milli(10); + c = games_readchar(rs); + switch ( c ) + { + case KEY_LEFT: + c = 'h'; + break; + case KEY_RIGHT: + c = 'l'; + break; + case KEY_UP: + c = 'k'; + break; + case KEY_DOWN: + c = 'j'; + break; + } + if ( c < 0 || skipcount == 0x7f ) + { + if ( skipcount > 0 ) + issue_games_events(rs,Gametxidstr,eventid-skipcount,skipcount | 0x80); + if ( c != -1 ) + issue_games_events(rs,Gametxidstr,eventid,c); + skipcount = 0; + } else skipcount++; } - if ( c < 0 || skipcount == 0x7f ) + else { + if ( skipcount == 0 ) + { + c = games_readchar(rs); + if ( (c & 0x80) != 0 ) + { + skipcount = (c & 0x7f); + c = 'S'; + } + } if ( skipcount > 0 ) - issue_games_events(rs,Gametxidstr,eventid-skipcount,skipcount | 0x80); - if ( c != -1 ) - issue_games_events(rs,Gametxidstr,eventid,c); - skipcount = 0; - } else skipcount++; + skipcount--; + } eventid++; switch ( c ) { @@ -785,13 +802,14 @@ int tetris(int argc, char **argv) { #ifdef _WIN32 #ifdef _MSC_VER - rs->seed = _strtoui64(argv[1], NULL, 10); + rs->origseed = _strtoui64(argv[1], NULL, 10); #else - rs->seed = atol(argv[1]); // windows, but not MSVC + rs->origseed = atol(argv[1]); // windows, but not MSVC #endif // _MSC_VER #else - rs->seed = atol(argv[1]); // non-windows + rs->origseed = atol(argv[1]); // non-windows #endif // _WIN32 + rs->seed = rs->origseed; strcpy(Gametxidstr,argv[2]); fprintf(stderr,"setplayerdata\n"); if ( games_setplayerdata(rs,Gametxidstr) < 0 ) diff --git a/src/cc/tetris.h b/src/cc/tetris.h index 9fce377d7..317dad62b 100644 --- a/src/cc/tetris.h +++ b/src/cc/tetris.h @@ -182,7 +182,7 @@ struct games_player struct games_state { - uint64_t seed; + uint64_t seed,origseed; char *keystrokes,*keystrokeshex; uint32_t needflush,replaydone; int32_t numkeys,ind,num,guiflag,counter,sleeptime,playersize,restoring,lastnum;