Preserve both player strength and max strength
This commit is contained in:
@@ -27,7 +27,12 @@ void restore_player(struct rogue_state *rs)
|
||||
int32_t i; THING *obj;
|
||||
//rs->P.gold = purse;
|
||||
max_hp = rs->P.hitpoints;
|
||||
pstats.s_str = max_stats.s_str = rs->P.strength;
|
||||
pstats.s_str = rs->P.strength & 0xffff;
|
||||
max_stats.s_str = rs->P.strength >> 16;
|
||||
if ( max_stats.s_str < 12 )
|
||||
max_stats.s_str = 12;
|
||||
if ( pstats.s_str > max_stats.s_str )
|
||||
pstats.s_str = max_stats.s_str;
|
||||
pstats.s_lvl = rs->P.level;
|
||||
pstats.s_exp = rs->P.experience;
|
||||
for (i=0; i<rs->P.packsize; i++)
|
||||
|
||||
@@ -273,7 +273,7 @@ int32_t rogue_replay2(uint8_t *newdata,uint64_t seed,char *keystrokes,int32_t nu
|
||||
if ( (fp= fopen("checkfile","wb")) != 0 )
|
||||
{
|
||||
save_file(rs,fp,0);
|
||||
fprintf(stderr,"gold.%d hp.%d strength.%d level.%d exp.%d dungeon.%d data[%d]\n",rs->P.gold,rs->P.hitpoints,rs->P.strength,rs->P.level,rs->P.experience,rs->P.dungeonlevel,rs->playersize);
|
||||
fprintf(stderr,"gold.%d hp.%d strength.%d/%d level.%d exp.%d dungeon.%d data[%d]\n",rs->P.gold,rs->P.hitpoints,rs->P.strength&0xffff,rs->P.strength>>16,rs->P.level,rs->P.experience,rs->P.dungeonlevel,rs->playersize);
|
||||
if ( newdata != 0 && rs->playersize > 0 )
|
||||
memcpy(newdata,rs->playerdata,rs->playersize);
|
||||
}
|
||||
|
||||
@@ -1437,7 +1437,7 @@ rs_write_object(struct rogue_state *rs,FILE *savef, THING *o)
|
||||
//fprintf(stderr,"KILLED\n");
|
||||
rs->P.gold = -1;
|
||||
rs->P.hitpoints = -1;
|
||||
rs->P.strength = -1;
|
||||
rs->P.strength = 0;
|
||||
rs->P.level = -1;
|
||||
rs->P.experience = -1;
|
||||
rs->P.dungeonlevel = -1;
|
||||
@@ -1448,11 +1448,11 @@ rs_write_object(struct rogue_state *rs,FILE *savef, THING *o)
|
||||
{
|
||||
rs->P.gold = purse;
|
||||
rs->P.hitpoints = max_hp;
|
||||
rs->P.strength = pstats.s_str; //max_stats.s_str;
|
||||
rs->P.strength = (pstats.s_str & 0xffff) | (max_stats.s_str << 16);
|
||||
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,pstats.s_str,pstats.s_lvl,pstats.s_exp,level);
|
||||
//fprintf(stderr,"%ld gold.%d hp.%d strength.%d/%d level.%d exp.%d %d\n",ftell(savef),purse,max_hp,pstats.s_str,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 && o->o_type != AMULET )
|
||||
|
||||
@@ -387,7 +387,8 @@ UniValue rogue_playerobj(std::vector<uint8_t> playerdata,uint256 playertxid,uint
|
||||
obj.push_back(Pair("pack",a));
|
||||
obj.push_back(Pair("packsize",(int64_t)P.packsize));
|
||||
obj.push_back(Pair("hitpoints",(int64_t)P.hitpoints));
|
||||
obj.push_back(Pair("strength",(int64_t)P.strength));
|
||||
obj.push_back(Pair("strength",(int64_t)(P.strength&0xffff)));
|
||||
obj.push_back(Pair("maxstrength",(int64_t)(P.strength>>16)));
|
||||
obj.push_back(Pair("level",(int64_t)P.level));
|
||||
obj.push_back(Pair("experience",(int64_t)P.experience));
|
||||
obj.push_back(Pair("dungeonlevel",(int64_t)P.dungeonlevel));
|
||||
@@ -863,12 +864,12 @@ char *rogue_extractgame(char *str,int32_t *numkeysp,std::vector<uint8_t> &newdat
|
||||
newdata[i] = newplayer[i];
|
||||
((uint8_t *)&endP)[i] = newplayer[i];
|
||||
}
|
||||
if ( endP.gold <= 0 || endP.hitpoints <= 0 || endP.strength <= 0 || endP.level <= 0 || endP.experience <= 0 || endP.dungeonlevel <= 0 )
|
||||
if ( endP.gold <= 0 || endP.hitpoints <= 0 || (endP.strength&0xffff) <= 0 || endP.level <= 0 || endP.experience <= 0 || endP.dungeonlevel <= 0 )
|
||||
{
|
||||
fprintf(stderr,"zero value character was killed -> no playerdata\n");
|
||||
newdata.resize(0);
|
||||
}
|
||||
sprintf(str,"extracted $$$gold.%d hp.%d strength.%d level.%d exp.%d dl.%d\n",endP.gold,endP.hitpoints,endP.strength,endP.level,endP.experience,endP.dungeonlevel);
|
||||
sprintf(str,"extracted $$$gold.%d hp.%d strength.%d/%d level.%d exp.%d dl.%d\n",endP.gold,endP.hitpoints,endP.strength&0xffff,endP.strength>>16,endP.level,endP.experience,endP.dungeonlevel);
|
||||
fprintf(stderr,"%s\n",str);
|
||||
} else num = 0;
|
||||
}
|
||||
@@ -993,7 +994,7 @@ UniValue rogue_finishgame(uint64_t txfee,struct CCcontract_info *cp,cJSON *param
|
||||
newdata[i] = player[i];
|
||||
((uint8_t *)&P)[i] = player[i];
|
||||
}
|
||||
if ( P.gold <= 0 || P.hitpoints <= 0 || P.strength <= 0 || P.level <= 0 || P.experience <= 0 || P.dungeonlevel <= 0 )
|
||||
if ( P.gold <= 0 || P.hitpoints <= 0 || (P.strength&0xffff) <= 0 || P.level <= 0 || P.experience <= 0 || P.dungeonlevel <= 0 )
|
||||
{
|
||||
fprintf(stderr,"zero value character was killed -> no playerdata\n");
|
||||
newdata.resize(0);
|
||||
@@ -1005,7 +1006,7 @@ UniValue rogue_finishgame(uint64_t txfee,struct CCcontract_info *cp,cJSON *param
|
||||
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(MakeTokensCC1vout(cp->evalcode,1,mypk));
|
||||
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));
|
||||
fprintf(stderr,"\nextracted $$$gold.%d hp.%d strength.%d/%d level.%d exp.%d dl.%d n.%d size.%d\n",P.gold,P.hitpoints,P.strength&0xffff,P.strength>>16,P.level,P.experience,P.dungeonlevel,n,(int32_t)sizeof(P));
|
||||
cashout = (uint64_t)P.gold * mult;
|
||||
if ( funcid == 'H' && maxplayers > 1 )
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user