From 6c1d59e8a2912ba2346fbed722f149b74c77f8ac Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 6 Feb 2019 02:25:28 -1100 Subject: [PATCH] Opreturn player data --- src/cc/rogue/rogue.c | 8 ++++++-- src/cc/rogue/rogue.h | 5 +++-- src/cc/rogue/save.c | 2 ++ src/cc/rogue/state.c | 3 ++- src/cc/rogue_rpc.cpp | 41 +++++++++++++++++++++++++++-------------- 5 files changed, 40 insertions(+), 19 deletions(-) diff --git a/src/cc/rogue/rogue.c b/src/cc/rogue/rogue.c index aeb509832..6ea858493 100644 --- a/src/cc/rogue/rogue.c +++ b/src/cc/rogue/rogue.c @@ -160,7 +160,7 @@ int32_t flushkeystrokes(struct rogue_state *rs) return(0); } -int32_t rogue_replay2(uint64_t seed,char *keystrokes,int32_t num) +int32_t rogue_replay2(uint8_t *player,uint64_t seed,char *keystrokes,int32_t num) { struct rogue_state *rs; FILE *fp; int32_t i; rs = (struct rogue_state *)calloc(1,sizeof(*rs)); @@ -186,9 +186,13 @@ int32_t rogue_replay2(uint64_t seed,char *keystrokes,int32_t num) fprintf(stderr,"elapsed %d seconds\n",(uint32_t)time(NULL)-starttime); sleep(1);*/ if ( (fp= fopen("checkfile","wb")) != 0 ) + { save_file(rs,fp,0); + if ( rs->playersize > 0 ) + memcpy(player,rs->playerdata,rs->playersize); + } free(rs); - return(0); + return(rs->playersize); } #endif diff --git a/src/cc/rogue/rogue.h b/src/cc/rogue/rogue.h index 6502ed775..4dcee238d 100644 --- a/src/cc/rogue/rogue.h +++ b/src/cc/rogue/rogue.h @@ -321,7 +321,7 @@ struct rogue_packitem struct rogue_player { - int32_t gold,hitpoints,strength,level,experience,packsize; + int32_t gold,hitpoints,strength,level,experience,packsize,dungeonlevel,pad; struct rogue_packitem roguepack[MAXPACK]; }; @@ -330,9 +330,10 @@ struct rogue_state uint64_t seed; char *keystrokes; uint32_t needflush,replaydone; - int32_t numkeys,ind,num,guiflag,counter,sleeptime; + int32_t numkeys,ind,num,guiflag,counter,sleeptime,playersize; struct rogue_player P; char buffered[8192]; + uint8_t playerdata[10000]; }; extern struct rogue_state globalR; diff --git a/src/cc/rogue/save.c b/src/cc/rogue/save.c index 57811176a..8a40a9fb8 100644 --- a/src/cc/rogue/save.c +++ b/src/cc/rogue/save.c @@ -167,7 +167,9 @@ save_file(struct rogue_state *rs,FILE *savef,int32_t guiflag) { fprintf(stderr,"%02x",((uint8_t *)&rs->P)[i]); histo[((uint8_t *)&rs->P)[i]]++; + rs->playerdata[i] = ((uint8_t *)&rs->P)[i]; } + rs->playersize = n; fprintf(stderr," packsize.%d n.%d\n",rs->P.packsize,n); if ( (fp= fopen(rogue_packfname(rs,fname),"wb")) != 0 ) { diff --git a/src/cc/rogue/state.c b/src/cc/rogue/state.c index d99f1b0dc..226392e83 100644 --- a/src/cc/rogue/state.c +++ b/src/cc/rogue/state.c @@ -1388,7 +1388,8 @@ rs_write_object(struct rogue_state *rs,FILE *savef, THING *o) rs->P.strength = max_stats.s_str; rs->P.level = pstats.s_lvl; rs->P.experience = pstats.s_exp; - fprintf(stderr,"%ld gold.%d hp.%d strength.%d level.%d exp.%d\n",ftell(savef),purse,max_hp,max_stats.s_str,pstats.s_lvl,pstats.s_exp); + rs->P.dungeonlevel = level; + fprintf(stderr,"%ld gold.%d hp.%d strength.%d level.%d exp.%d %d\n",ftell(savef),purse,max_hp,max_stats.s_str,pstats.s_lvl,pstats.s_exp,level); }; fprintf(stderr,"object (%s) x.%d y.%d type.%d pack.(%c:%d)\n",inv_name(o,FALSE),o->_o._o_pos.x,o->_o._o_pos.y,o->_o._o_type,o->_o._o_packch,o->_o._o_packch); if ( rs->P.packsize < MAXPACK ) diff --git a/src/cc/rogue_rpc.cpp b/src/cc/rogue_rpc.cpp index b39845c81..c2afade28 100644 --- a/src/cc/rogue_rpc.cpp +++ b/src/cc/rogue_rpc.cpp @@ -101,19 +101,19 @@ CScript rogue_keystrokesopret(uint256 gametxid,uint256 batontxid,CPubKey pk,std: return(opret); } -CScript rogue_highlanderopret(uint256 gametxid,uint256 registertxid,CPubKey pk,std::vectorplayerdata) +CScript rogue_highlanderopret(uint256 gametxid,CPubKey pk,std::vectorplayerdata) { CScript opret; uint8_t evalcode = EVAL_ROGUE; - opret << OP_RETURN << E_MARSHAL(ss << evalcode << 'K' << gametxid << registertxid << pk << playerdata); + opret << OP_RETURN << E_MARSHAL(ss << evalcode << 'K' << gametxid << pk << playerdata); return(opret); } -uint8_t rogue_highlanderopretdecode(uint256 &gametxid,uint256 ®istertxid,CPubKey &pk,std::vector &playerdata,CScript scriptPubKey) +uint8_t rogue_highlanderopretdecode(uint256 &gametxid,CPubKey &pk,std::vector &playerdata,CScript scriptPubKey) { std::vector vopret; uint8_t *script,e,f; GetOpReturnData(scriptPubKey,vopret); script = (uint8_t *)vopret.data(); - if ( vopret.size() > 2 && E_UNMARSHAL(vopret,ss >> e; ss >> f; ss >> gametxid; ss >> registertxid; ss >> pk; ss >> playerdata) != 0 && e == EVAL_ROGUE && f == 'H' ) + if ( vopret.size() > 2 && E_UNMARSHAL(vopret,ss >> e; ss >> f; ss >> gametxid; ss >> pk; ss >> playerdata) != 0 && e == EVAL_ROGUE && (f == 'H' || f == 'Q') ) { return(f); } @@ -195,9 +195,9 @@ int32_t rogue_iamregistered(int32_t maxplayers,uint256 gametxid,CTransaction tx, return(0); } -void rogue_gamefields(UniValue &obj,int64_t maxplayers,int64_t buyin,uint256 gametxid,char *myrogueaddr) +uint64_t rogue_gamefields(UniValue &obj,int64_t maxplayers,int64_t buyin,uint256 gametxid,char *myrogueaddr) { - CBlockIndex *pindex; int32_t ht,delay; uint256 hashBlock; uint64_t seed; char cmd[512]; CTransaction tx; + CBlockIndex *pindex; int32_t ht,delay; uint256 hashBlock; uint64_t seed=0; char cmd[512]; CTransaction tx; if ( GetTransaction(gametxid,tx,hashBlock,false) != 0 && (pindex= komodo_blockindex(hashBlock)) != 0 ) { ht = pindex->GetHeight(); @@ -222,6 +222,7 @@ void rogue_gamefields(UniValue &obj,int64_t maxplayers,int64_t buyin,uint256 gam } obj.push_back(Pair("maxplayers",maxplayers)); obj.push_back(Pair("buyin",ValueFromAmount(buyin))); + return(seed); } int32_t rogue_isvalidgame(struct CCcontract_info *cp,CTransaction &tx,int64_t &buyin,int32_t &maxplayers,uint256 txid) @@ -286,7 +287,7 @@ int32_t rogue_playerdata(struct CCcontract_info *cp,uint256 &origplayergame,CPub { GetOpReturnData(playertx.vout[numvouts-1].scriptPubKey,vopret); script = (uint8_t *)vopret.data(); - if ( vopret.size() > 34 && script[0] == EVAL_ROGUE && (script[1] == 'H' || script[1] == 'S') ) + if ( vopret.size() > 34 && script[0] == EVAL_ROGUE && (script[1] == 'H' || script[1] == 'Q' || script[1] == 'S') ) { memcpy(&highlander,script+2,sizeof(highlander)); highlander = revuint256(highlander); @@ -295,7 +296,7 @@ int32_t rogue_playerdata(struct CCcontract_info *cp,uint256 &origplayergame,CPub { if ( GetTransaction(highlander,highlandertx,hashBlock,false) != 0 && (numvouts= highlandertx.vout.size()) > 0 ) { - if ( rogue_highlanderopretdecode(origplayergame,registertxid,pk,playerdata,highlandertx.vout[numvouts-1].scriptPubKey) == 'H' ) + if ( (f= rogue_highlanderopretdecode(origplayergame,registertxid,pk,playerdata,highlandertx.vout[numvouts-1].scriptPubKey)) == 'H' || f == 'Q' ) { if ( highlandertx.vin[0].prevout.hash == origplayergame && highlandertx.vin[0].prevout.n == 0 && rogue_isvalidgame(cp,gametx,buyin,maxplayers,origplayergame) == 0 && maxplayers > 1 ) return(0); @@ -592,8 +593,8 @@ UniValue rogue_keystrokes(uint64_t txfee,struct CCcontract_info *cp,cJSON *param Myprivkey(mypriv); CCaddr1of2set(cp,roguepk,mypk,mypriv,destaddr); rawtx = FinalizeCCTx(0,cp,mtx,mypk,txfee,rogue_keystrokesopret(gametxid,batontxid,mypk,keystrokes)); - fprintf(stderr,"KEYSTROKES.(%s)\n",rawtx.c_str()); - return(rogue_rawtxresult(result,rawtx,0)); + //fprintf(stderr,"KEYSTROKES.(%s)\n",rawtx.c_str()); + return(rogue_rawtxresult(result,rawtx,1)); } else return(cclib_error(result,"keystrokes tx was too late")); } else return(cclib_error(result,"couldnt find batontxid")); } else return(cclib_error(result,"invalid gametxid")); @@ -618,7 +619,7 @@ UniValue rogue_highlander(uint64_t txfee,struct CCcontract_info *cp,cJSON *param return(result); } -int32_t rogue_replay2(uint64_t seed,char *keystrokes,int32_t num); +int32_t rogue_replay2(uint8_t *player,uint64_t seed,char *keystrokes,int32_t num); UniValue rogue_bailout(uint64_t txfee,struct CCcontract_info *cp,cJSON *params) { @@ -627,7 +628,7 @@ UniValue rogue_bailout(uint64_t txfee,struct CCcontract_info *cp,cJSON *params) // vout0 -> 1% ingame gold // get any playerdata, get all keystrokes, replay game and compare final state CMutableTransaction mtx = CreateNewContextualCMutableTransaction(Params().GetConsensus(), komodo_nextheight()); - UniValue result(UniValue::VOBJ); CTransaction gametx; int64_t buyin,batonvalue; int32_t n,numkeys,maxplayers,batonht,batonvout; char myrogueaddr[64],*keystrokes = 0; std::vector playerdata; uint256 batontxid,gametxid; CPubKey mypk,roguepk; + UniValue result(UniValue::VOBJ); std::string rawtx; CTransaction gametx; int64_t buyin,batonvalue; int32_t n,num,numkeys,maxplayers,batonht,batonvout; char myrogueaddr[64],*keystrokes = 0; std::vector playerdata,newdata; uint256 batontxid,gametxid; CPubKey mypk,roguepk; uint8_t player[10000],mypriv[32]; if ( txfee == 0 ) txfee = 10000; mypk = pubkey2pk(Mypubkey()); @@ -645,9 +646,21 @@ UniValue rogue_bailout(uint64_t txfee,struct CCcontract_info *cp,cJSON *params) { if ( rogue_findbaton(cp,&keystrokes,numkeys,playerdata,batontxid,batonvout,batonvalue,batonht,gametxid,gametx,maxplayers,myrogueaddr) == 0 && keystrokes != 0 ) { - fprintf(stderr,"found baton %s numkeys.%d\n",batontxid.ToString().c_str(),numkeys); - rogue_replay2(4419709268196762041,keystrokes,numkeys); + UniValue obj; + seed = uint64_t rogue_gamefields(obj,maxplayers,buyin,gametxid,myrogueaddr); + fprintf(stderr,"found baton %s numkeys.%d seed.%llu\n",batontxid.ToString().c_str(),numkeys,(long long)seed); + num = rogue_replay2(player,seed,keystrokes,numkeys); //4419709268196762041 free(keystrokes); + newdata.resize(num); + for (i=0; ievalcode,batonvalue-txfee,roguepk)); + Myprivkey(mypriv); + CCaddr1of2set(cp,roguepk,mypk,mypriv,destaddr); + rawtx = FinalizeCCTx(0,cp,mtx,mypk,txfee,rogue_highlanderopret(gametxid,mypk,newdata)); + return(rogue_rawtxresult(result,rawtx,0)); } result.push_back(Pair("result","success")); }