diff --git a/src/client/GameSave.cpp b/src/client/GameSave.cpp index 8588728f6..90b33c0d9 100644 --- a/src/client/GameSave.cpp +++ b/src/client/GameSave.cpp @@ -18,6 +18,7 @@ extern "C" } GameSave::GameSave(GameSave & save): + majorVersion(save.majorVersion), waterEEnabled(save.waterEEnabled), legacyEnable(save.legacyEnable), gravityEnable(save.gravityEnable), @@ -162,6 +163,7 @@ void GameSave::InitData() // Called on every new GameSave, except the copy constructor void GameSave::InitVars() { + majorVersion = 0; waterEEnabled = false; legacyEnable = false; gravityEnable = false; @@ -567,6 +569,7 @@ void GameSave::readOPS(char * data, int dataLength) unsigned partsCount = 0; unsigned int blockX, blockY, blockW, blockH, fullX, fullY, fullW, fullH; int savedVersion = inputData[4]; + majorVersion = savedVersion; bool fakeNewerVersion = false; // used for development builds only bson b; @@ -1149,12 +1152,6 @@ void GameSave::readOPS(char * data, int dataLength) if (savedVersion < 91) particles[newIndex].temp = 283.15; break; - case PT_STKM: - case PT_STKM2: - case PT_FIGH: - if (savedVersion < 88 && particles[newIndex].ctype == OLD_SPC_AIR) - particles[newIndex].ctype = SPC_AIR; - break; case PT_FILT: if (savedVersion < 89) { @@ -1322,6 +1319,7 @@ void GameSave::readPSv(char * saveDataChar, int dataLength) if (saveData[4]>SAVE_VERSION) throw ParseException(ParseException::WrongVersion, "Save from newer version"); ver = saveData[4]; + majorVersion = saveData[4]; if (ver<34) { @@ -1857,9 +1855,6 @@ void GameSave::readPSv(char * saveDataChar, int dataLength) particles[i-1].ctype = (((firw_data[caddress]))<<16) | (((firw_data[caddress+1]))<<8) | ((firw_data[caddress+2])); } } - if (ver < 88) //fix air blowing stickmen - if ((particles[i-1].type == PT_STKM || particles[i-1].type == PT_STKM2 || particles[i-1].type == PT_FIGH) && particles[i-1].ctype == OLD_SPC_AIR) - particles[i-1].ctype = SPC_AIR; if (ver < 89) { if (particles[i-1].type == PT_FILT) diff --git a/src/client/GameSave.h b/src/client/GameSave.h index b619346ff..f01bb3492 100644 --- a/src/client/GameSave.h +++ b/src/client/GameSave.h @@ -43,6 +43,7 @@ public: int blockWidth, blockHeight; bool fromNewerVersion; + int majorVersion; bool hasPressure; bool hasAmbientHeat; diff --git a/src/graphics/Renderer.cpp b/src/graphics/Renderer.cpp index 8749d061a..8ec34beb9 100644 --- a/src/graphics/Renderer.cpp +++ b/src/graphics/Renderer.cpp @@ -1505,20 +1505,17 @@ void Renderer::render_parts() } else if (colour_mode != COLOUR_HEAT) { - if (cplayer->elemelem > 0) + if (cplayer->fan) { - if (cplayer->elem == SPC_AIR) - { - colr = PIXR(0x8080FF); - colg = PIXG(0x8080FF); - colb = PIXB(0x8080FF); - } - else - { - colr = PIXR(elements[cplayer->elem].Colour); - colg = PIXG(elements[cplayer->elem].Colour); - colb = PIXB(elements[cplayer->elem].Colour); - } + colr = PIXR(0x8080FF); + colg = PIXG(0x8080FF); + colb = PIXB(0x8080FF); + } + else if (cplayer->elem < PT_NUM && cplayer->elem > 0) + { + colr = PIXR(elements[cplayer->elem].Colour); + colg = PIXG(elements[cplayer->elem].Colour); + colb = PIXB(elements[cplayer->elem].Colour); } else { diff --git a/src/simulation/Simulation.cpp b/src/simulation/Simulation.cpp index f12423951..5f4e179e6 100644 --- a/src/simulation/Simulation.cpp +++ b/src/simulation/Simulation.cpp @@ -165,12 +165,23 @@ int Simulation::Load(int fullX, int fullY, GameSave * save, bool includePressure player.spwn = 1; player.elem = PT_DUST; player.rocketBoots = false; + + if ((save->majorVersion < 93 && parts[i].ctype == SPC_AIR) || + (save->majorVersion < 88 && parts[i].ctype == OLD_SPC_AIR)) + { + player.fan = true; + } break; case PT_STKM2: Element_STKM::STKM_init_legs(this, &player2, i); player2.spwn = 1; player2.elem = PT_DUST; player2.rocketBoots = false; + if ((save->majorVersion < 93 && parts[i].ctype == SPC_AIR) || + (save->majorVersion < 88 && parts[i].ctype == OLD_SPC_AIR)) + { + player2.fan = true; + } break; case PT_SPAWN: player.spawnID = i; @@ -2084,9 +2095,11 @@ void Simulation::clear_sim(void) player.spwn = 0; player.spawnID = -1; player.rocketBoots = false; + player.fan = false; player2.spwn = 0; player2.spawnID = -1; player2.rocketBoots = false; + player2.fan = false; //memset(pers_bg, 0, WINDOWW*YRES*PIXELSIZE); //memset(fire_r, 0, sizeof(fire_r)); //memset(fire_g, 0, sizeof(fire_g)); @@ -3014,20 +3027,7 @@ int Simulation::create_part(int p, int x, int y, int t, int v) if (t>=0 && tIsValidElement(parts[i].ctype)) + if (!playerp->fan && parts[i].ctype && sim->IsValidElement(parts[i].ctype)) STKM_set_element(sim, playerp, parts[i].ctype); playerp->frames++; @@ -89,7 +89,7 @@ int Element_STKM::run_stickman(playerst *playerp, UPDATE_FUNC_ARGS) { parts[i].temp += 1; //Death - if (parts[i].life<1 || (sim->pv[y/CELL][x/CELL]>=4.5f && playerp->elem != SPC_AIR) ) //If his HP is less than 0 or there is very big wind... + if (parts[i].life<1 || (sim->pv[y/CELL][x/CELL]>=4.5f && !playerp->fan) ) //If his HP is less than 0 or there is very big wind... { for (r=-2; r<=1; r++) { @@ -385,7 +385,7 @@ int Element_STKM::run_stickman(playerst *playerp, UPDATE_FUNC_ARGS) { sim->kill_part(ID(r)); } if (sim->bmap[(ry+y)/CELL][(rx+x)/CELL]==WL_FAN) - playerp->elem = SPC_AIR; + playerp->fan = true; else if (sim->bmap[(ry+y)/CELL][(rx+x)/CELL]==WL_EHOLE) playerp->rocketBoots = false; else if (sim->bmap[(ry+y)/CELL][(rx+x)/CELL]==WL_GRAV /* && parts[i].type!=PT_FIGH */) @@ -413,11 +413,23 @@ int Element_STKM::run_stickman(playerst *playerp, UPDATE_FUNC_ARGS) { else { int np = -1; - if (playerp->elem == SPC_AIR) + if (playerp->fan) { for(int j = -4; j < 5; j++) for (int k = -4; k < 5; k++) - sim->create_part(-2, rx + 3*((((int)playerp->pcomm)&0x02) == 0x02) - 3*((((int)playerp->pcomm)&0x01) == 0x01)+j, ry+k, SPC_AIR); + { + int airx = rx + 3*((((int)playerp->pcomm)&0x02) == 0x02) - 3*((((int)playerp->pcomm)&0x01) == 0x01)+j; + int airy = ry+k; + sim->pv[airy/CELL][airx/CELL] += 0.03f; + if (airy + CELL < YRES) + sim->pv[airy/CELL+1][airx/CELL] += 0.03f; + if (airx + CELL < XRES) + { + sim->pv[airy/CELL][airx/CELL+1] += 0.03f; + if (airy + CELL < YRES) + sim->pv[airy/CELL+1][airx/CELL+1] += 0.03f; + } + } } else if (playerp->elem==PT_LIGH && playerp->frames<30)//limit lightning creation rate np = -1; @@ -460,7 +472,7 @@ int Element_STKM::run_stickman(playerst *playerp, UPDATE_FUNC_ARGS) { parts[np].temp=parts[np].life*power/2.5; parts[np].tmp2=1; } - else if (playerp->elem != SPC_AIR) + else if (!playerp->fan) { parts[np].vx -= -gvy*(5*((((int)playerp->pcomm)&0x02) == 0x02) - 5*(((int)(playerp->pcomm)&0x01) == 0x01)); parts[np].vy -= gvx*(5*((((int)playerp->pcomm)&0x02) == 0x02) - 5*(((int)(playerp->pcomm)&0x01) == 0x01)); @@ -669,6 +681,7 @@ void Element_STKM::STKM_init_legs(Simulation * sim, playerst *playerp, int i) playerp->comm = 0; playerp->pcomm = 0; playerp->frames = 0; + playerp->fan = false; } //#TPT-Directive ElementHeader Element_STKM static void STKM_set_element(Simulation *sim, playerst *playerp, int element) @@ -678,13 +691,19 @@ void Element_STKM::STKM_set_element(Simulation *sim, playerst *playerp, int elem || sim->elements[element].Properties&TYPE_GAS || sim->elements[element].Properties&TYPE_LIQUID || sim->elements[element].Properties&TYPE_ENERGY - || element == PT_LOLZ || element == PT_LOVE || element == SPC_AIR) + || element == PT_LOLZ || element == PT_LOVE) { if (!playerp->rocketBoots || element != PT_PLSM) + { playerp->elem = element; + playerp->fan = false; + } } if (element == PT_TESC || element == PT_LIGH) + { playerp->elem = PT_LIGH; + playerp->fan = false; + } }