From 82b8ae689a41b3ec32708a15a6a79b1de49b6a3a Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 10 Feb 2019 07:33:44 -1100 Subject: [PATCH] Player death -> loss of player data --- src/cc/rogue/state.c | 38 +++++++++++++++++--------- src/cc/rogue_rpc.cpp | 63 +++++++++++++++++++++++++------------------- 2 files changed, 61 insertions(+), 40 deletions(-) diff --git a/src/cc/rogue/state.c b/src/cc/rogue/state.c index b97c5035f..b47b83faf 100644 --- a/src/cc/rogue/state.c +++ b/src/cc/rogue/state.c @@ -1428,21 +1428,33 @@ rs_write_object(struct rogue_state *rs,FILE *savef, THING *o) if ( o->_o._o_packch != 0 ) { item = &rs->P.roguepack[rs->P.packsize]; - if ( rs->P.packsize++ == 0 ) + if ( pstats.s_hpt <= 0 ) { - rs->P.gold = purse; - rs->P.hitpoints = max_hp; - rs->P.strength = max_stats.s_str; - rs->P.level = pstats.s_lvl; - rs->P.experience = 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 ) - packsave(item,o->_o._o_type,o->_o._o_launch,o->_o._o_damage,sizeof(o->_o._o_damage),o->_o._o_hurldmg,sizeof(o->_o._o_hurldmg),o->_o._o_count,o->_o._o_which,o->_o._o_hplus,o->_o._o_dplus,o->_o._o_arm,o->_o._o_flags,o->_o._o_group); + fprintf(stderr,"KILLED\n"); + rs->P.gold = -1; + rs->P.hitpoints = -1; + rs->P.strength = -1; + rs->P.level = -1; + rs->P.experience = -1; + rs->P.dungeonlevel = -1; + } + else + { + if ( rs->P.packsize++ == 0 ) + { + rs->P.gold = purse; + rs->P.hitpoints = max_hp; + rs->P.strength = max_stats.s_str; + rs->P.level = pstats.s_lvl; + rs->P.experience = 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 ) + packsave(item,o->_o._o_type,o->_o._o_launch,o->_o._o_damage,sizeof(o->_o._o_damage),o->_o._o_hurldmg,sizeof(o->_o._o_hurldmg),o->_o._o_count,o->_o._o_which,o->_o._o_hplus,o->_o._o_dplus,o->_o._o_arm,o->_o._o_flags,o->_o._o_group); + } } - rs_write_marker(savef, RSID_OBJECT); rs_write_int(savef, o->_o._o_type); rs_write_coord(savef, o->_o._o_pos); diff --git a/src/cc/rogue_rpc.cpp b/src/cc/rogue_rpc.cpp index 0ba5bc6ae..11c2d28ae 100644 --- a/src/cc/rogue_rpc.cpp +++ b/src/cc/rogue_rpc.cpp @@ -194,10 +194,12 @@ CScript rogue_highlanderopret(uint8_t funcid,uint256 gametxid,CPubKey pk,std::ve uint8_t rogue_highlanderopretdecode(uint256 &gametxid,CPubKey &pk,std::vector &playerdata,CScript scriptPubKey) { - std::vector vopret,vopret2; uint8_t *script,e,f; uint256 tokenid; std::vector voutPubkeys; - if ( (f= DecodeTokenOpRet(scriptPubKey,e,tokenid,voutPubkeys,vopret,vopret2)) == 'c' || f == 't' ) + std::vector vopret,vopret2; uint8_t e,f; uint256 tokenid; std::vector voutPubkeys; + GetOpReturnData(scriptPubKey,vopret); + 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); + else if ( (f= DecodeTokenOpRet(scriptPubKey,e,tokenid,voutPubkeys,vopret,vopret2)) == 'c' || f == 't' ) { - script = (uint8_t *)vopret.data(); 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); @@ -208,9 +210,8 @@ uint8_t rogue_highlanderopretdecode(uint256 &gametxid,CPubKey &pk,std::vector &keystrokes,CScript scriptPubKey) { - std::vector vopret; uint8_t *script,e,f; + std::vector vopret; uint8_t e,f; GetOpReturnData(scriptPubKey,vopret); - script = (uint8_t *)vopret.data(); if ( vopret.size() > 2 && E_UNMARSHAL(vopret,ss >> e; ss >> f; ss >> gametxid; ss >> batontxid; ss >> pk; ss >> keystrokes) != 0 && e == EVAL_ROGUE && f == 'K' ) { return(f); @@ -220,9 +221,8 @@ uint8_t rogue_keystrokesopretdecode(uint256 &gametxid,uint256 &batontxid,CPubKey uint8_t rogue_registeropretdecode(uint256 &gametxid,uint256 &playertxid,CScript scriptPubKey) { - std::vector vopret; uint8_t *script,e,f; + std::vector vopret; uint8_t e,f; GetOpReturnData(scriptPubKey,vopret); - script = (uint8_t *)vopret.data(); if ( vopret.size() > 2 && E_UNMARSHAL(vopret,ss >> e; ss >> f; ss >> gametxid; ss >> playertxid) != 0 && e == EVAL_ROGUE && f == 'R' ) { return(f); @@ -232,9 +232,8 @@ uint8_t rogue_registeropretdecode(uint256 &gametxid,uint256 &playertxid,CScript uint8_t rogue_newgameopreturndecode(int64_t &buyin,int32_t &maxplayers,CScript scriptPubKey) { - std::vector vopret; uint8_t *script,e,f; + std::vector vopret; uint8_t e,f; GetOpReturnData(scriptPubKey,vopret); - script = (uint8_t *)vopret.data(); if ( vopret.size() > 2 && E_UNMARSHAL(vopret,ss >> e; ss >> f; ss >> buyin; ss >> maxplayers) != 0 && e == EVAL_ROGUE && f == 'G' ) { return(f); @@ -817,7 +816,6 @@ UniValue rogue_finishgame(uint64_t txfee,struct CCcontract_info *cp,cJSON *param mtx.vin.push_back(CTxIn(gametxid,1+maxplayers+regslot,CScript())); if ( funcid == 'H' ) mtx.vin.push_back(CTxIn(gametxid,0,CScript())); - //mtx.vout.push_back(MakeCC1vout(cp->evalcode,1,mypk)); mtx.vout.push_back(MakeTokensCC1vout(cp->evalcode, 1, mypk)); if ( num > 0 ) { @@ -827,19 +825,27 @@ UniValue rogue_finishgame(uint64_t txfee,struct CCcontract_info *cp,cJSON *param newdata[i] = player[i]; ((uint8_t *)&P)[i] = player[i]; } - fprintf(stderr,"\nextracted $$$gold.%d hp.%d strength.%d level.%d exp.%d dl.%d n.%d size.%d\n",P.gold,P.hitpoints,P.strength,P.level,P.experience,P.dungeonlevel,n,(int32_t)sizeof(P)); - cashout = (uint64_t)P.gold * mult; - if ( funcid == 'H' && maxplayers > 1 ) + if ( P.gold < 0 || P.hitpoints < 0 || P.strength < 0 || P.level < 0 || P.experience < 0 || P.dungeonlevel < 0 ) { - if ( numplayers != maxplayers || (numplayers - rogue_playersalive(tmp,gametxid,maxplayers)) > 1 && (P.dungeonlevel > 1 || P.gold < 10000 || P.level < 20) ) - return(cclib_error(result,"highlander must be a winner or last one standing")); - cashout += numplayers * buyin; + fprintf(stderr,"was killed -> no playerdata\n"); + newdata.resize(0); } - if ( cashout >= txfee ) + else { - if ( (inputsum= AddCClibInputs(cp,mtx,roguepk,cashout,16,cp->unspendableCCaddr)) > (uint64_t)P.gold*mult ) - CCchange = (inputsum - cashout); - mtx.vout.push_back(CTxOut(cashout,CScript() << ParseHex(HexStr(mypk)) << OP_CHECKSIG)); + fprintf(stderr,"\nextracted $$$gold.%d hp.%d strength.%d level.%d exp.%d dl.%d n.%d size.%d\n",P.gold,P.hitpoints,P.strength,P.level,P.experience,P.dungeonlevel,n,(int32_t)sizeof(P)); + cashout = (uint64_t)P.gold * mult; + if ( funcid == 'H' && maxplayers > 1 ) + { + if ( numplayers != maxplayers || (numplayers - rogue_playersalive(tmp,gametxid,maxplayers)) > 1 && (P.dungeonlevel > 1 || P.gold < 10000 || P.level < 20) ) + return(cclib_error(result,"highlander must be a winner or last one standing")); + cashout += numplayers * buyin; + } + if ( cashout >= txfee ) + { + if ( (inputsum= AddCClibInputs(cp,mtx,roguepk,cashout,16,cp->unspendableCCaddr)) > (uint64_t)P.gold*mult ) + CCchange = (inputsum - cashout); + mtx.vout.push_back(CTxOut(cashout,CScript() << ParseHex(HexStr(mypk)) << OP_CHECKSIG)); + } } //for (i=0; i_o._o_type,o->_o._o_packch,o->_o._o_packch); @@ -847,14 +853,17 @@ UniValue rogue_finishgame(uint64_t txfee,struct CCcontract_info *cp,cJSON *param mtx.vout.push_back(MakeCC1vout(cp->evalcode,CCchange + (batonvalue-2*txfee),roguepk)); Myprivkey(mypriv); CCaddr1of2set(cp,roguepk,mypk,mypriv,myrogueaddr); - //rawtx = FinalizeCCTx(0,cp,mtx,mypk,txfee,rogue_highlanderopret(funcid,gametxid,mypk,newdata)); - CScript opret = rogue_highlanderopret(funcid, gametxid, mypk, newdata); - - std::vector vopretNonfungible; - GetOpReturnData(opret, vopretNonfungible); - rawtx = FinalizeCCTx(0, cp, mtx, mypk, txfee, EncodeTokenCreateOpRet('c', Mypubkey(), std::string("???"), std::string("??????"), vopretNonfungible)); - + if ( newdata.size() == 0 ) + rawtx = FinalizeCCTx(0,cp,mtx,mypk,txfee,opret); + else + { + char seedstr[32]; + sprintf(seedstr,"%llu",(long long)seed); + std::vector vopretNonfungible; + GetOpReturnData(opret, vopretNonfungible); + rawtx = FinalizeCCTx(0, cp, mtx, mypk, txfee, EncodeTokenCreateOpRet('c', Mypubkey(), std::string(seedstr), gametxid.GetHex(), vopretNonfungible)); + } return(rogue_rawtxresult(result,rawtx,0)); } result.push_back(Pair("result","success"));