Skip to content

Commit 20b1282

Browse files
committed
Merge remote-tracking branch 'upstream/develop' into origin/ae-attach-discard-by-health-3
# Conflicts: # docs/Whats-New.md
2 parents cf714e5 + bae6b77 commit 20b1282

21 files changed

+209
-55
lines changed

CREDITS.md

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -354,6 +354,7 @@ This page lists all the individual contributions to the project by their author.
354354
- Fix `Hospital=yes` building can't kick out infantry after loading a save
355355
- `Edit/Clear Hate-Value` Trigger Action
356356
- `Set Force Enemy` Trigger Action
357+
- Fixed the issue where computer players did not search for new enemies after defeating them or forming alliances with them
357358
- **NetsuNegi**:
358359
- Forbidding parallel AI queues by type
359360
- Jumpjet crash speed fix when crashing onto building
@@ -457,6 +458,7 @@ This page lists all the individual contributions to the project by their author.
457458
- Fix an issue that game crashes when spawnee has been removed and is not real dead
458459
- Aggressive attack move mission
459460
- Amphibious access vehicle
461+
- Fix an issue that spawned `Strafe` aircraft on aircraft carriers may not be able to return normally if aircraft carriers moved a short distance when the aircraft is landing
460462
- **Ollerus**:
461463
- Build limit group enhancement
462464
- Customizable rocker amplitude
@@ -469,7 +471,8 @@ This page lists all the individual contributions to the project by their author.
469471
- Promotion animation deglobalization
470472
- Forcing specific weapon by range
471473
- Attached effect attach/discard by health
472-
- Attached effect with `ExtraWarheads`
474+
- Attached effect with `ExtraWarheads` and `FeedbackWeapon`
475+
- `AuxWeapon`
473476
- **NaotoYuuki** - Vertical & meteor trajectory projectile prototypes
474477
- **handama** - AI script action to `16005 Jump Back To Previous Script`
475478
- **TaranDahl (航味麻酱)**:
@@ -498,6 +501,8 @@ This page lists all the individual contributions to the project by their author.
498501
- Fix an issue where AI would select unreachable buildings and get stuck when looking for buildings like tank bunkers, bio reactors, etc
499502
- Prone speed customization
500503
- RadarInvisible for non-enemy house
504+
- Allow miners do area guard
505+
- Make harvesters do addtional scan after unload
501506
- **tyuah8**:
502507
- Drive/Jumpjet/Ship/Teleport locomotor did not power on when it is un-piggybacked bugfix
503508
- Destroyed unit leaves sensors bugfix

docs/Contributing.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ To distribute the workload and make the project more manageable, we have establi
2525
- `T1` complexity by default
2626
- Unhardcodings/customizations - contributions that only make something customizable through the INI or other way (by the modder usually), without adding too much code to handle the customization
2727
- `T1` complexity by default
28+
- Restored featues (from TS, RA2 etc.), assuming no extra changes or additions apart from the ones necessary to function in YR with extensions (the reviewer has to verify that)
29+
- `T1` complexity by default
2830
- New features
2931
- Extensions of existing systems - add logic to existing systems, doesn't warrant it's own entity or type classes generally, but may introduce new hooks
3032
- Examples: feedback weapon logic, superweapon launch warhead logic, a new type of trajectory that uses existing custom trajectory framework, etc.

docs/Fixed-or-Improved-Logics.md

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -222,6 +222,8 @@ This page describes all ingame logics that are fixed or improved in Phobos witho
222222
- Separated the AirstrikeClass pointer between the attacker/aircraft and the target to avoid erroneous overwriting issues.
223223
- Fixed the bug that buildings will always be tinted as airstrike owner.
224224
- Fixed the bug that 'AllowAirstrike=no' cannot completely prevent air strikes from being launched against it.
225+
- Fixed the issue where computer players did not search for new enemies after defeating them or forming alliances with them.
226+
- Fixed an issue that spawned `Strafe` aircraft on aircraft carriers may not be able to return normally if aircraft carriers moved a short distance when the aircraft is landing.
225227

226228
## Fixes / interactions with other extensions
227229

@@ -1332,6 +1334,17 @@ MinimapColor= ; integer - Red,Green,Blue
13321334

13331335
## Vehicles
13341336

1337+
### Allow miners do area guard
1338+
1339+
- In vanilla, when miners enter area guard mission, they immediately switch to harvest mission. Now you can make them perform area guard mission normally like other technos.
1340+
- We made it work only for miners controlled by the player, because this will prevent AI's miners from going work.
1341+
1342+
In `rulesmd.ini`:
1343+
```ini
1344+
[SOMEVEHICLE] ; VehicleType
1345+
Harvester.CanGuardArea=no ; boolean
1346+
```
1347+
13351348
### Bunker entering check dehardcode
13361349

13371350
- In vanilla, vehicles entering tank bunkers are subject to a series of hardcoding restrictions, including having to have turrets, having to have weapons, and not having Hover speed types. Now you can skip these restrictions.
@@ -1348,7 +1361,6 @@ BunkerableAnyway=false ; boolean
13481361
Skipping checks with this feature doesn't mean that vehicles and tank bunkers will interact correctly. Following the simple checks performed by the provider of this feature, bunkerability is mainly determined by Locomotor. The details about locomotors' bunkerability can be found on [ModEnc](https://modenc.renegadeprojects.com/Bunkerable).
13491362
```
13501363

1351-
13521364
### Customizing crushing tilt and slowdown
13531365

13541366
- Vehicles with `Crusher=true` and `OmniCrusher=true` / `MovementZone=CrusherAll` were hardcoded to tilt when crushing vehicles / walls respectively. This now obeys `TiltsWhenCrushes` but can be customized individually for these two scenarios using `TiltsWhenCrusher.Vehicles` and `TiltsWhenCrusher.Overlays`, which both default to `TiltsWhenCrushes`.
@@ -1428,6 +1440,20 @@ DeployingAnim.ReverseForUndeploy=true ; boolean
14281440
DeployingAnim.UseUnitDrawer=true ; boolean
14291441
```
14301442

1443+
### Make harvesters do addtional scan after unload
1444+
1445+
- In vanilla, miners will remember their current location when they reach full load and move to that location after unloading. This makes miners to gradually move deeper into the mine and ignore the closer minerals.
1446+
- Now you can have the miner search for the nearest mineral again after unloading. If a closer mineral is found, the miner will go to that location instead of the previously recorded location.
1447+
1448+
In `rulesmd.ini`:
1449+
```ini
1450+
[General]
1451+
HarvesterScanAfterUnload=false ; boolean
1452+
1453+
[SOMEVEHICLE]
1454+
HarvesterScanAfterUnload= ; boolean, default to [General] -> HarvesterScanAfterUnload
1455+
```
1456+
14311457
### Preserve Iron Curtain / Force Shield status on type conversion
14321458

14331459
![image](_static/images/preserve-ic.gif)

docs/New-or-Enhanced-Logics.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,8 @@ This page describes all the engine features that are either new and introduced b
7979
- `AttachEffect.Delays` can be used to set the delays for recreating the effects on the TechnoType after they expire. Defaults to 0 (immediately), negative values mean the effects are not recreated. Delay matching the position in `AttachTypes` is used for that type, or the last listed delay if not available.
8080
- `AttachEffect.InitialDelays` can be used to set the delays before first creating the effects on TechnoType. Defaults to 0 (immediately). Delay matching the position in `AttachTypes` is used for that type, or the last listed delay if not available.
8181
- `AttachEffect.RecreationDelays` is used to determine if the effect can be recreated if it is removed completely (e.g `AttachEffect.RemoveTypes`), and if yes, how long this takes. Defaults to -1, meaning no recreation. Delay matching the position in `AttachTypes` is used for that type, or the last listed delay if not available.
82-
82+
- Note that neither `InitialDelays` or `RecreationDelays` count down if the effect cannot currently be active due to `DiscardOn` condition.
83+
8384
- AttachEffectTypes can be attached to objects via Warheads using `AttachEffect.AttachTypes`.
8485
- `AttachEffect.DurationOverrides` can be used to override the default durations. Duration matching the position in `AttachTypes` is used for that type, or the last listed duration if not available.
8586
- `AttachEffect.CumulativeRefreshAll` if set to true makes it so that trying to attach `Cumulative=true` effect to a target that already has `Cumulative.MaxCount` amount of effects will refresh duration of all attached effects of the same type instead of only the one with shortest remaining duration. If `AttachEffect.CumulativeRefreshAll.OnAttach` is also set to true, this refresh applies even if the target does not have maximum allowed amount of effects of same type.

docs/Whats-New.md

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -370,8 +370,11 @@ New:
370370
- Customize airstrike targets (by NetsuNegi)
371371
- Aggressive attack move mission (by CrimRecya)
372372
- Amphibious access vehicle (by CrimRecya)
373+
- Allow miners do area guard (by TaranDahl)
374+
- Make harvesters do addtional scan after unload (by TaranDahl)
373375
- Attached effect attach/discard by health (by Ollerus)
374-
- Attached effect with `ExtraWarheads` (by Ollerus)
376+
- Attached effect with `ExtraWarheads` and `FeedbackWeapon` (by Ollerus)
377+
- [AuxWeapon](New-or-Enhanced-Logics.md#auxiliary-weapon) (by Ollerus)
375378
376379
Vanilla fixes:
377380
- Fixed sidebar not updating queued unit numbers when adding or removing units when the production is on hold (by CrimRecya)
@@ -392,10 +395,12 @@ Vanilla fixes:
392395
- Fixed an issue that game crashes when spawnee has been removed and is not real dead (by CrimRecya)
393396
- Separated the AirstrikeClass pointer between the attacker/aircraft and the target to avoid erroneous overwriting issues (by NetsuNegi)
394397
- Fixed the bug that buildings will always be tinted as airstrike owner (by NetsuNegi)
398+
- Fixed the issue where computer players did not search for new enemies after defeating them or forming alliances with them (by FlyStar)
395399
396400
Phobos fixes:
397401
- Fixed an issue that MCV will self-destruct when using trigger 107 to teleport (by CrimRecya)
398402
- Fixed the bug that 'AllowAirstrike=no' cannot completely prevent air strikes from being launched against it (by NetsuNegi)
403+
- Fixed an issue that spawned `Strafe` aircraft on aircraft carriers may not be able to return normally if aircraft carriers moved a short distance when the aircraft is landing (by CrimRecya)
399404
400405
Fixes / interactions with other extensions:
401406
- Allowed `AuxBuilding` and Ares' `SW.Aux/NegBuildings` to count building upgrades (by Ollerus)

docs/locale/zh_CN/LC_MESSAGES/Contributing.po

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,11 @@ msgid ""
107107
"without adding too much code to handle the customization"
108108
msgstr "去硬编码/自定义功能——仅通过 Modder 可用的 INI 或其他方式使得某些功能得以自定义而不增加过多代码。"
109109

110+
msgid ""
111+
"Restored featues (from TS, RA2 etc.), assuming no extra changes or additions apart from the ones necessary to function in YR with extensions (the reviewer has to verify that)"
112+
msgstr ""
113+
"复原功能(来自 TS、RA2 等),要求 **除** 在 YR 中与扩展共同工作所 **必须** 的更改外 **未** 进行其他添改(需审查人员验证该情况)"
114+
110115
#: ../../Contributing.md:28
111116
msgid "New features"
112117
msgstr "新功能"

src/Ext/Aircraft/Hooks.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,10 @@ long __stdcall AircraftClass_IFlyControl_IsStrafe(IFlyControl const* ifly)
9292
pWeapon = pThis->GetWeapon(pExt->CurrentAircraftWeaponIndex)->WeaponType;
9393
else if (pThis->Target)
9494
pWeapon = pThis->GetWeapon(pThis->SelectWeapon(pThis->Target))->WeaponType;
95+
else if (pExt->LastWeaponType)
96+
pWeapon = pExt->LastWeaponType;
97+
else
98+
pWeapon = pThis->GetWeapon(0)->WeaponType;
9599

96100
if (pWeapon)
97101
{
@@ -170,7 +174,7 @@ static int GetDelay(AircraftClass* pThis, bool isLastShot)
170174
auto const pWeaponExt = WeaponTypeExt::ExtMap.Find(pWeapon);
171175
int delay = pWeapon->ROF;
172176

173-
if (isLastShot || pExt->Strafe_BombsDroppedThisRound == pWeaponExt->Strafing_Shots || (pWeaponExt->Strafing_UseAmmoPerShot && !pThis->Ammo))
177+
if (isLastShot || pExt->Strafe_BombsDroppedThisRound == pWeaponExt->Strafing_Shots.Get(5) || (pWeaponExt->Strafing_UseAmmoPerShot && !pThis->Ammo))
174178
{
175179
pThis->MissionStatus = (int)AirAttackStatus::FlyToPosition;
176180
delay = pWeaponExt->Strafing_EndDelay.Get((pWeapon->Range + (Unsorted::LeptonsPerCell * 4)) / pThis->Type->Speed);

src/Ext/House/Hooks.ForceEnemy.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,8 @@ DEFINE_HOOK(0x4FD772, HouseClass_ClearForceEnemy, 0xA) // HouseClass_UpdateAI
3232
if (pThis)
3333
{
3434
HouseExt::ExtMap.Find(pThis)->SetForceEnemyIndex(-1);
35-
pThis->UpdateAngerNodes(0, nullptr);
35+
pThis->UpdateAngerNodes(0, pThis);
36+
return R->Origin() + 0xA;
3637
}
3738

3839
return 0;

src/Ext/Rules/Body.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -262,6 +262,8 @@ void RulesExt::ExtData::LoadBeforeTypeData(RulesClass* pThis, CCINIClass* pINI)
262262

263263
this->DamagedSpeed.Read(exINI, GameStrings::General, "DamagedSpeed");
264264

265+
this->HarvesterScanAfterUnload.Read(exINI, GameStrings::General, "HarvesterScanAfterUnload");
266+
265267
// Section AITargetTypes
266268
int itemsCount = pINI->GetKeyCount("AITargetTypes");
267269
for (int i = 0; i < itemsCount; ++i)
@@ -482,6 +484,7 @@ void RulesExt::ExtData::Serialize(T& Stm)
482484
.Process(this->ProneSpeed_Crawls)
483485
.Process(this->ProneSpeed_NoCrawls)
484486
.Process(this->DamagedSpeed)
487+
.Process(this->HarvesterScanAfterUnload)
485488
;
486489
}
487490

src/Ext/Rules/Body.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,8 @@ class RulesExt
217217

218218
Valueable<double> DamagedSpeed;
219219

220+
Valueable<bool> HarvesterScanAfterUnload;
221+
220222
ExtData(RulesClass* OwnerObject) : Extension<RulesClass>(OwnerObject)
221223
, Storage_TiberiumIndex { -1 }
222224
, HarvesterDumpAmount { 0.0f }
@@ -379,6 +381,8 @@ class RulesExt
379381
, ProneSpeed_NoCrawls { 1.5 }
380382

381383
, DamagedSpeed { 0.75 }
384+
385+
, HarvesterScanAfterUnload { false }
382386
{ }
383387

384388
virtual ~ExtData() = default;

src/Ext/TAction/Body.cpp

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -426,7 +426,7 @@ bool TActionExt::EditAngerNode(TActionClass* pThis, HouseClass* pHouse, ObjectCl
426426
HouseClass::FindByCountryIndex(pThis->Value);
427427

428428
setValue(pTargetHouse);
429-
pHouse->UpdateAngerNodes(0, nullptr);
429+
pHouse->UpdateAngerNodes(0, pHouse);
430430
}
431431
else if (pThis->Value == -1)
432432
{
@@ -435,7 +435,7 @@ bool TActionExt::EditAngerNode(TActionClass* pThis, HouseClass* pHouse, ObjectCl
435435
setValue(pTargetHouse);
436436
}
437437

438-
pHouse->UpdateAngerNodes(0, nullptr);
438+
pHouse->UpdateAngerNodes(0, pHouse);
439439
}
440440

441441
return true;
@@ -460,7 +460,7 @@ bool TActionExt::ClearAngerNode(TActionClass* pThis, HouseClass* pHouse, ObjectC
460460
continue;
461461

462462
pAngerNode.AngerLevel = 0;
463-
pHouse->UpdateAngerNodes(0, nullptr);
463+
pHouse->UpdateAngerNodes(0, pHouse);
464464
break;
465465
}
466466
}
@@ -472,7 +472,7 @@ bool TActionExt::ClearAngerNode(TActionClass* pThis, HouseClass* pHouse, ObjectC
472472
pAngerNode.AngerLevel = 0;
473473
}
474474

475-
pHouse->UpdateAngerNodes(0, nullptr);
475+
pHouse->UpdateAngerNodes(0, pHouse);
476476
}
477477

478478
return true;
@@ -494,19 +494,19 @@ bool TActionExt::SetForceEnemy(TActionClass* pThis, HouseClass* pHouse, ObjectCl
494494
!pHouse->IsAlliedWith(pTargetHouse))
495495
{
496496
pHouseExt->SetForceEnemyIndex(pTargetHouse->GetArrayIndex());
497-
pHouse->UpdateAngerNodes(0, nullptr);
497+
pHouse->UpdateAngerNodes(0, pHouse);
498498
}
499499
}
500500
else
501501
{
502502
pHouseExt->SetForceEnemyIndex(-2);
503-
pHouse->UpdateAngerNodes(0, nullptr);
503+
pHouse->UpdateAngerNodes(0, pHouse);
504504
}
505505
}
506506
else if (pThis->Param3 == -1)
507507
{
508508
pHouseExt->SetForceEnemyIndex(-1);
509-
pHouse->UpdateAngerNodes(0, nullptr);
509+
pHouse->UpdateAngerNodes(0, pHouse);
510510
}
511511

512512
return true;

src/Ext/Techno/Body.Internal.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ void TechnoExt::ObjectKilledBy(TechnoClass* pVictim, TechnoClass* pKiller)
3939
CoordStruct TechnoExt::GetFLHAbsoluteCoords(TechnoClass* pThis, CoordStruct pCoord, bool isOnTurret)
4040
{
4141
auto const pType = pThis->GetTechnoType();
42-
auto const pFoot = abstract_cast<FootClass*>(pThis);
42+
auto const pFoot = abstract_cast<FootClass*, true>(pThis);
4343
Matrix3D mtx;
4444

4545
// Step 1: get body transform matrix
@@ -49,7 +49,7 @@ CoordStruct TechnoExt::GetFLHAbsoluteCoords(TechnoClass* pThis, CoordStruct pCoo
4949
mtx.MakeIdentity();
5050

5151
// Steps 2-3: turret offset and rotation
52-
if (isOnTurret && pThis->HasTurret())
52+
if (isOnTurret && (pType->Turret || !pFoot)) // If building has no turret, it's TurretFacing is TargetDirection
5353
{
5454
TechnoTypeExt::ApplyTurretOffset(pType, &mtx);
5555

src/Ext/TechnoType/Body.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -550,6 +550,9 @@ void TechnoTypeExt::ExtData::LoadFromINIFile(CCINIClass* const pINI)
550550
this->Overload_ParticleSys.Read(exINI, pSection, "Overload.ParticleSys");
551551
this->Overload_ParticleSysCount.Read(exINI, pSection, "Overload.ParticleSysCount");
552552

553+
this->Harvester_CanGuardArea.Read(exINI, pSection, "Harvester.CanGuardArea");
554+
this->HarvesterScanAfterUnload.Read(exINI, pSection, "HarvesterScanAfterUnload");
555+
553556
// Ares 0.2
554557
this->RadarJamRadius.Read(exINI, pSection, "RadarJamRadius");
555558

@@ -1018,6 +1021,9 @@ void TechnoTypeExt::ExtData::Serialize(T& Stm)
10181021
.Process(this->Overload_DeathSound)
10191022
.Process(this->Overload_ParticleSys)
10201023
.Process(this->Overload_ParticleSysCount)
1024+
1025+
.Process(this->Harvester_CanGuardArea)
1026+
.Process(this->HarvesterScanAfterUnload)
10211027
;
10221028
}
10231029
void TechnoTypeExt::ExtData::LoadFromStream(PhobosStreamReader& Stm)

src/Ext/TechnoType/Body.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -344,6 +344,9 @@ class TechnoTypeExt
344344
NullableIdx<VocClass> Overload_DeathSound;
345345
Nullable<ParticleSystemTypeClass*> Overload_ParticleSys;
346346
Valueable<int> Overload_ParticleSysCount;
347+
348+
Valueable<bool> Harvester_CanGuardArea;
349+
Nullable<bool> HarvesterScanAfterUnload;
347350

348351
ExtData(TechnoTypeClass* OwnerObject) : Extension<TechnoTypeClass>(OwnerObject)
349352
, HealthBar_Hide { false }
@@ -643,6 +646,9 @@ class TechnoTypeExt
643646
, Overload_DeathSound {}
644647
, Overload_ParticleSys {}
645648
, Overload_ParticleSysCount { 5 }
649+
650+
, Harvester_CanGuardArea { false }
651+
, HarvesterScanAfterUnload {}
646652
{ }
647653

648654
virtual ~ExtData() = default;

src/Ext/TerrainType/Hooks.Passable.cpp

Lines changed: 24 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -103,14 +103,7 @@ DEFINE_HOOK(0x6D57C1, TacticalClass_DrawLaserFencePlacement_BuildableTerrain, 0x
103103
GET(CellClass*, pCell, ESI);
104104

105105
if (auto const pTerrain = pCell->GetTerrain(false))
106-
{
107-
auto const pTypeExt = TerrainTypeExt::ExtMap.Find(pTerrain->Type);
108-
109-
if (pTypeExt->CanBeBuiltOn)
110-
return ContinueChecks;
111-
112-
return DontDraw;
113-
}
106+
return TerrainTypeExt::ExtMap.Find(pTerrain->Type)->CanBeBuiltOn ? ContinueChecks : DontDraw;
114107

115108
return ContinueChecks;
116109
}
@@ -125,9 +118,7 @@ DEFINE_HOOK(0x5684B1, MapClass_PlaceDown_BuildableTerrain, 0x6)
125118
{
126119
if (auto const pTerrain = pCell->GetTerrain(false))
127120
{
128-
auto const pTypeExt = TerrainTypeExt::ExtMap.Find(pTerrain->Type);
129-
130-
if (pTypeExt->CanBeBuiltOn)
121+
if (TerrainTypeExt::ExtMap.Find(pTerrain->Type)->CanBeBuiltOn)
131122
{
132123
pCell->RemoveContent(pTerrain, false);
133124
TerrainTypeExt::Remove(pTerrain);
@@ -137,3 +128,25 @@ DEFINE_HOOK(0x5684B1, MapClass_PlaceDown_BuildableTerrain, 0x6)
137128

138129
return 0;
139130
}
131+
132+
// Buildable-upon TerrainTypes Hook #4 -> Allow placing walls on top of terrain
133+
DEFINE_HOOK(0x5FD2B6, OverlayClass_Unlimbo_SkipTerrainCheck, 0x9)
134+
{
135+
enum { Unlimbo = 0x5FD2CA, NoUnlimbo = 0x5FD2C3 };
136+
137+
GET(CellClass* const, pCell, EAX);
138+
139+
if (!Game::IsActive)
140+
return Unlimbo;
141+
142+
if (auto const pTerrain = pCell->GetTerrain(false))
143+
{
144+
if (!TerrainTypeExt::ExtMap.Find(pTerrain->Type)->CanBeBuiltOn)
145+
return NoUnlimbo;
146+
147+
pCell->RemoveContent(pTerrain, false);
148+
TerrainTypeExt::Remove(pTerrain);
149+
}
150+
151+
return Unlimbo;
152+
}

0 commit comments

Comments
 (0)