diff --git a/src/simulation/Simulation.cpp b/src/simulation/Simulation.cpp index 4053c6e88..9b88986d0 100644 --- a/src/simulation/Simulation.cpp +++ b/src/simulation/Simulation.cpp @@ -294,36 +294,43 @@ void Simulation::Load(const GameSave *originalSave, bool includePressure, Vec2signs.size() && signs.size() < MAXSIGNS; i++) { - if (save->signs[i].text[0]) + if (save->signs[i].text.length()) { sign tempSign = save->signs[i]; tempSign.x += partP.X; tempSign.y += partP.Y; + if (!InBounds(tempSign.x, tempSign.y)) + { + continue; + } signs.push_back(tempSign); } } - for (auto bpos : save->blockSize.OriginRect()) + for (auto bpos : RectSized(blockP, save->blockSize) & CELLS.OriginRect()) { - if(save->blockMap[bpos]) + auto spos = bpos - blockP; + if (save->blockMap[spos]) { - bmap[blockP.Y + bpos.Y][blockP.X + bpos.X] = save->blockMap[bpos]; - fvx[blockP.Y + bpos.Y][blockP.X + bpos.X] = save->fanVelX[bpos]; - fvy[blockP.Y + bpos.Y][blockP.X + bpos.X] = save->fanVelY[bpos]; + bmap[bpos.Y][bpos.X] = save->blockMap[spos]; + fvx[bpos.Y][bpos.X] = save->fanVelX[spos]; + fvy[bpos.Y][bpos.X] = save->fanVelY[spos]; } if (includePressure) { if (save->hasPressure) { - pv[blockP.Y + bpos.Y][blockP.X + bpos.X] = save->pressure[bpos]; - vx[blockP.Y + bpos.Y][blockP.X + bpos.X] = save->velocityX[bpos]; - vy[blockP.Y + bpos.Y][blockP.X + bpos.X] = save->velocityY[bpos]; + pv[bpos.Y][bpos.X] = save->pressure[spos]; + vx[bpos.Y][bpos.X] = save->velocityX[spos]; + vy[bpos.Y][bpos.X] = save->velocityY[spos]; } if (save->hasAmbientHeat) - hv[blockP.Y + bpos.Y][blockP.X + bpos.X] = save->ambientHeat[bpos]; + { + hv[bpos.Y][bpos.X] = save->ambientHeat[spos]; + } if (save->hasBlockAirMaps) { - air->bmap_blockair[blockP.Y + bpos.Y][blockP.X + bpos.X] = save->blockAir[bpos]; - air->bmap_blockairh[blockP.Y + bpos.Y][blockP.X + bpos.X] = save->blockAirh[bpos]; + air->bmap_blockair[bpos.Y][bpos.X] = save->blockAir[spos]; + air->bmap_blockairh[bpos.Y][bpos.X] = save->blockAirh[spos]; } } } @@ -4085,11 +4092,6 @@ String Simulation::BasicParticleInfo(Particle const &sample_part) const return sampleInfo.Build(); } -bool Simulation::InBounds(int x, int y) -{ - return (x>=0 && y>=0 && x=0 ? 0 : y); diff --git a/src/simulation/Simulation.h b/src/simulation/Simulation.h index f274d36cc..cd2df682b 100644 --- a/src/simulation/Simulation.h +++ b/src/simulation/Simulation.h @@ -218,7 +218,10 @@ public: Simulation(); ~Simulation(); - bool InBounds(int x, int y); + static bool InBounds(int x, int y) + { + return RES.OriginRect().Contains({ x, y }); + } // These don't really belong anywhere at the moment, so go here for loop edge mode static int remainder_p(int x, int y);