diff --git a/src/simulation/Air.cpp b/src/simulation/Air.cpp index 81bb267368..6769346ee0 100644 --- a/src/simulation/Air.cpp +++ b/src/simulation/Air.cpp @@ -352,6 +352,31 @@ void Air::Invert() } } +// called when loading saves / stamps to ensure nothing "leaks" the first frame +void Air::RecalculateBlockAirMaps() +{ + for (int i = 0; i <= sim.parts_lastActiveIndex; i++) + { + int type = sim.parts[i].type; + // Real TTAN would only block if there was enough TTAN + // but it would be more expensive and complicated to actually check that + // so just block for a frame, if it wasn't supposed to block it will continue allowing air next frame + if (type == PT_TTAN) + { + int x = ((int)(sim.parts[i].x+0.5f))/CELL, y = ((int)(sim.parts[i].y+0.5f))/CELL; + bmap_blockair[y][x] = 1; + bmap_blockairh[y][x] = 0x8; + } + // mostly accurate insulator blocking, besides checking GEL + else if ((type == PT_HSWC && sim.parts[i].life != 10) || sim.elements[type].HeatConduct <= (rand()%250)) + { + int x = ((int)(sim.parts[i].x+0.5f))/CELL, y = ((int)(sim.parts[i].y+0.5f))/CELL; + if (!(bmap_blockairh[y][x]&0x8)) + bmap_blockairh[y][x]++; + } + } +} + Air::Air(Simulation & simulation): sim(simulation), airMode(0), diff --git a/src/simulation/Air.h b/src/simulation/Air.h index 0fc6b4f6aa..3b5fc6c1bd 100644 --- a/src/simulation/Air.h +++ b/src/simulation/Air.h @@ -33,6 +33,7 @@ class Air void Clear(); void ClearAirH(); void Invert(); + void RecalculateBlockAirMaps(); Air(Simulation & sim); }; diff --git a/src/simulation/Simulation.cpp b/src/simulation/Simulation.cpp index 72889839f7..d4fb9709a9 100644 --- a/src/simulation/Simulation.cpp +++ b/src/simulation/Simulation.cpp @@ -216,6 +216,7 @@ int Simulation::Load(int fullX, int fullY, GameSave * save) } gravWallChanged = true; + air->RecalculateBlockAirMaps(); return 0; } @@ -533,7 +534,7 @@ SimulationSample Simulation::GetSample(int x, int y) { sample.WallType = bmap[y/CELL][x/CELL]; } - sample.AirPressure = pv[y/CELL][x/CELL]; + sample.AirPressure = (int)air->bmap_blockair[y/CELL][x/CELL]; sample.AirTemperature = hv[y/CELL][x/CELL]; sample.AirVelocityX = vx[y/CELL][x/CELL]; sample.AirVelocityY = vy[y/CELL][x/CELL];