Extract roc

This commit is contained in:
jl777
2019-02-16 07:19:14 -11:00
parent 4c2dfcbc8e
commit ec0a203d88
4 changed files with 62 additions and 11 deletions

View File

@@ -89,6 +89,7 @@ UniValue rogue_playerinfo(uint64_t txfee,struct CCcontract_info *cp,cJSON *param
UniValue rogue_players(uint64_t txfee,struct CCcontract_info *cp,cJSON *params); UniValue rogue_players(uint64_t txfee,struct CCcontract_info *cp,cJSON *params);
UniValue rogue_games(uint64_t txfee,struct CCcontract_info *cp,cJSON *params); UniValue rogue_games(uint64_t txfee,struct CCcontract_info *cp,cJSON *params);
UniValue rogue_setname(uint64_t txfee,struct CCcontract_info *cp,cJSON *params); UniValue rogue_setname(uint64_t txfee,struct CCcontract_info *cp,cJSON *params);
UniValue rogue_extract(uint64_t txfee,struct CCcontract_info *cp,cJSON *params);
#else #else
bool sudoku_validate(struct CCcontract_info *cp,int32_t height,Eval *eval,const CTransaction tx); bool sudoku_validate(struct CCcontract_info *cp,int32_t height,Eval *eval,const CTransaction tx);
@@ -118,6 +119,8 @@ UniValue CClib_method(struct CCcontract_info *cp,char *method,cJSON *params)
return(rogue_bailout(txfee,cp,params)); return(rogue_bailout(txfee,cp,params));
else if ( strcmp(method,"highlander") == 0 ) else if ( strcmp(method,"highlander") == 0 )
return(rogue_highlander(txfee,cp,params)); return(rogue_highlander(txfee,cp,params));
else if ( strcmp(method,"extract") == 0 )
return(rogue_extract(txfee,cp,params));
else if ( strcmp(method,"playerinfo") == 0 ) else if ( strcmp(method,"playerinfo") == 0 )
return(rogue_playerinfo(txfee,cp,params)); return(rogue_playerinfo(txfee,cp,params));
else if ( strcmp(method,"players") == 0 ) else if ( strcmp(method,"players") == 0 )

View File

@@ -232,14 +232,14 @@ void rogue_bailout(struct rogue_state *rs)
fprintf(stderr,"error issuing (%s)\n",cmd); fprintf(stderr,"error issuing (%s)\n",cmd);
} }
int32_t rogue_replay2(uint8_t *newdata,uint64_t seed,char *keystrokes,int32_t num,struct rogue_player *player) int32_t rogue_replay2(uint8_t *newdata,uint64_t seed,char *keystrokes,int32_t num,struct rogue_player *player,int32_t sleepmillis)
{ {
struct rogue_state *rs; FILE *fp; int32_t i; struct rogue_state *rs; FILE *fp; int32_t i;
rs = (struct rogue_state *)calloc(1,sizeof(*rs)); rs = (struct rogue_state *)calloc(1,sizeof(*rs));
rs->seed = seed; rs->seed = seed;
rs->keystrokes = keystrokes; rs->keystrokes = keystrokes;
rs->numkeys = num; rs->numkeys = num;
rs->sleeptime = 0*50000; rs->sleeptime = sleepmillis * 1000;
if ( player != 0 ) if ( player != 0 )
{ {
rs->P = *player; rs->P = *player;
@@ -320,7 +320,7 @@ int32_t rogue_replay(uint64_t seed,int32_t sleeptime)
} }
if ( num > 0 ) if ( num > 0 )
{ {
rogue_replay2(0,seed,keystrokes,num,0); rogue_replay2(0,seed,keystrokes,num,0,0);
mvaddstr(LINES - 2, 0, (char *)"replay completed"); mvaddstr(LINES - 2, 0, (char *)"replay completed");
endwin(); endwin();
} }

View File

@@ -392,7 +392,7 @@ int32_t roguefname(char *fname,uint64_t seed,int32_t counter);
int32_t flushkeystrokes(struct rogue_state *rs); int32_t flushkeystrokes(struct rogue_state *rs);
int32_t rogue_restorepack(struct rogue_state *rs); int32_t rogue_restorepack(struct rogue_state *rs);
void restore_player(struct rogue_state *rs); void restore_player(struct rogue_state *rs);
int32_t rogue_replay2(uint8_t *newdata,uint64_t seed,char *keystrokes,int32_t num,struct rogue_player *player); int32_t rogue_replay2(uint8_t *newdata,uint64_t seed,char *keystrokes,int32_t num,struct rogue_player *player,int32_t sleepmillis);
void rogue_bailout(struct rogue_state *rs); void rogue_bailout(struct rogue_state *rs);
/* /*

View File

@@ -34,7 +34,7 @@ struct rogue_player
int32_t gold,hitpoints,strength,level,experience,packsize,dungeonlevel,pad; int32_t gold,hitpoints,strength,level,experience,packsize,dungeonlevel,pad;
struct rogue_packitem roguepack[MAXPACK]; struct rogue_packitem roguepack[MAXPACK];
}; };
int32_t rogue_replay2(uint8_t *newdata,uint64_t seed,char *keystrokes,int32_t num,struct rogue_player *player); int32_t rogue_replay2(uint8_t *newdata,uint64_t seed,char *keystrokes,int32_t num,struct rogue_player *player,int32_t sleepmillis);
#define ROGUE_DECLARED_PACK #define ROGUE_DECLARED_PACK
void rogue_packitemstr(char *packitemstr,struct rogue_packitem *item); void rogue_packitemstr(char *packitemstr,struct rogue_packitem *item);
@@ -826,6 +826,54 @@ UniValue rogue_keystrokes(uint64_t txfee,struct CCcontract_info *cp,cJSON *param
} else return(cclib_error(result,"couldnt reparse params")); } else return(cclib_error(result,"couldnt reparse params"));
} }
UniValue rogue_extract(uint64_t txfee,struct CCcontract_info *cp,cJSON *params)
{
UniValue result; CPubKey mypk,roguepk; int32_t i,n,num,regslot,numkeys,err; std::string symbol,pname,maxplayers,batonht,batonvout; CTransaction gametx; uint64_t seed,mult; int64_t buyin,batonvalue; char myrogueaddr[64],fname[64],*keystrokes = 0; std::vector<uint8_t> playerdata; uint256 batontxid,playertxid,gametxid; FILE *fp;
mypk = pubkey2pk(Mypubkey());
roguepk = GetUnspendable(cp,0);
GetCCaddress1of2(cp,myrogueaddr,roguepk,mypk);
result.push_back(Pair("name","rogue"));
result.push_back(Pair("method",method));
result.push_back(Pair("myrogueaddr",myrogueaddr));
if ( (params= cclib_reparse(&n,params)) != 0 )
{
if ( n > 0 )
{
gametxid = juint256(jitem(params,0));
result.push_back(Pair("gametxid",gametxid.GetHex()));
if ( (err= rogue_isvalidgame(cp,gameheight,gametx,buyin,maxplayers,gametxid)) == 0 )
{
if ( rogue_findbaton(cp,playertxid,&keystrokes,numkeys,regslot,playerdata,batontxid,batonvout,batonvalue,batonht,gametxid,gametx,maxplayers,myrogueaddr,numplayers,symbol,pname) == 0 )
{
UniValue obj; struct rogue_player P;
seed = rogue_gamefields(obj,maxplayers,buyin,gametxid,myrogueaddr);
fprintf(stderr,"(%s) found baton %s numkeys.%d seed.%llu playerdata.%d\n",pname.size()!=0?pname.c_str():Rogue_pname,batontxid.ToString().c_str(),numkeys,(long long)seed,(int32_t)playerdata.size());
memset(&P,0,sizeof(P));
if ( playerdata.size() > 0 )
{
for (i=0; i<playerdata.size(); i++)
((uint8_t *)&P)[i] = playerdata[i];
}
if ( keystrokes != 0 )
{
sprintf(fname,"%llu.0",(long long)seed);
if ( (fp= fopen(fname,"wb")) != 0 )
{
if ( fwrite(keystrokes,1,numkeys,fp) != numkeys )
fprintf(stderr,"error writing %s\n",fname);
fclose(fp);
}
num = rogue_replay2(player,seed,keystrokes,numkeys,playerdata.size()==0?0:&P,50);
if ( keystrokes != 0 )
free(keystrokes);
} else num = 0;
}
}
}
}
return(result);
}
UniValue rogue_finishgame(uint64_t txfee,struct CCcontract_info *cp,cJSON *params,char *method) UniValue rogue_finishgame(uint64_t txfee,struct CCcontract_info *cp,cJSON *params,char *method)
{ {
//vin0 -> highlander vout from creategame TCBOO //vin0 -> highlander vout from creategame TCBOO
@@ -869,15 +917,11 @@ UniValue rogue_finishgame(uint64_t txfee,struct CCcontract_info *cp,cJSON *param
result.push_back(Pair("gametxid",gametxid.GetHex())); result.push_back(Pair("gametxid",gametxid.GetHex()));
if ( (err= rogue_isvalidgame(cp,gameheight,gametx,buyin,maxplayers,gametxid)) == 0 ) if ( (err= rogue_isvalidgame(cp,gameheight,gametx,buyin,maxplayers,gametxid)) == 0 )
{ {
if ( maxplayers == 1 )
mult /= 2;
if ( rogue_findbaton(cp,playertxid,&keystrokes,numkeys,regslot,playerdata,batontxid,batonvout,batonvalue,batonht,gametxid,gametx,maxplayers,myrogueaddr,numplayers,symbol,pname) == 0 ) if ( rogue_findbaton(cp,playertxid,&keystrokes,numkeys,regslot,playerdata,batontxid,batonvout,batonvalue,batonht,gametxid,gametx,maxplayers,myrogueaddr,numplayers,symbol,pname) == 0 )
{ {
UniValue obj; struct rogue_player P; UniValue obj; struct rogue_player P;
if ( pname.size() == 0 )
pname = Rogue_pname;
seed = rogue_gamefields(obj,maxplayers,buyin,gametxid,myrogueaddr); seed = rogue_gamefields(obj,maxplayers,buyin,gametxid,myrogueaddr);
fprintf(stderr,"(%s) found baton %s numkeys.%d seed.%llu playerdata.%d\n",pname.c_str(),batontxid.ToString().c_str(),numkeys,(long long)seed,(int32_t)playerdata.size()); fprintf(stderr,"(%s) found baton %s numkeys.%d seed.%llu playerdata.%d\n",pname.size()!=0?pname.c_str():Rogue_pname,batontxid.ToString().c_str(),numkeys,(long long)seed,(int32_t)playerdata.size());
memset(&P,0,sizeof(P)); memset(&P,0,sizeof(P));
if ( playerdata.size() > 0 ) if ( playerdata.size() > 0 )
{ {
@@ -886,7 +930,7 @@ UniValue rogue_finishgame(uint64_t txfee,struct CCcontract_info *cp,cJSON *param
} }
if ( keystrokes != 0 ) if ( keystrokes != 0 )
{ {
num = rogue_replay2(player,seed,keystrokes,numkeys,playerdata.size()==0?0:&P); num = rogue_replay2(player,seed,keystrokes,numkeys,playerdata.size()==0?0:&P,0);
if ( keystrokes != 0 ) if ( keystrokes != 0 )
free(keystrokes); free(keystrokes);
} else num = 0; } else num = 0;
@@ -909,6 +953,8 @@ UniValue rogue_finishgame(uint64_t txfee,struct CCcontract_info *cp,cJSON *param
} }
else else
{ {
if ( maxplayers == 1 )
mult /= 2;
cpTokens = CCinit(&tokensC, EVAL_TOKENS); cpTokens = CCinit(&tokensC, EVAL_TOKENS);
mtx.vout.push_back(MakeCC1vout(EVAL_TOKENS, txfee, GetUnspendable(cpTokens,NULL))); // marker to token cc addr, burnable and validated mtx.vout.push_back(MakeCC1vout(EVAL_TOKENS, txfee, GetUnspendable(cpTokens,NULL))); // marker to token cc addr, burnable and validated
mtx.vout.push_back(MakeTokensCC1vout(cp->evalcode,1,mypk)); mtx.vout.push_back(MakeTokensCC1vout(cp->evalcode,1,mypk));
@@ -933,6 +979,8 @@ UniValue rogue_finishgame(uint64_t txfee,struct CCcontract_info *cp,cJSON *param
Myprivkey(mypriv); Myprivkey(mypriv);
CCaddr1of2set(cp,roguepk,mypk,mypriv,myrogueaddr); CCaddr1of2set(cp,roguepk,mypk,mypriv,myrogueaddr);
CScript opret; CScript opret;
if ( pname.size() == 0 )
pname = Rogue_pname;
if ( newdata.size() == 0 ) if ( newdata.size() == 0 )
{ {
opret = rogue_highlanderopret(funcid, gametxid, regslot, mypk, nodata,pname); opret = rogue_highlanderopret(funcid, gametxid, regslot, mypk, nodata,pname);