1
0
mirror of https://github.com/OpenTTD/OpenTTD synced 2026-01-24 04:34:16 +01:00

Change: [Script] ScripTiletList::[Add|Remove]Rectangle are now suspendable

This commit is contained in:
glx22
2025-12-20 03:53:59 +01:00
committed by Loïc Guilloux
parent 36ccc5e005
commit ec5e7ed5e0
2 changed files with 58 additions and 8 deletions

View File

@@ -30,13 +30,32 @@ ScriptObject *ScriptTileList::CloneObject() const
return clone;
}
void ScriptTileList::AddRectangle(TileIndex t1, TileIndex t2)
bool ScriptTileList::AddRectangle(TileIndex t1, TileIndex t2)
{
if (!::IsValidTile(t1)) return;
if (!::IsValidTile(t2)) return;
if (!::IsValidTile(t1)) return false;
if (!::IsValidTile(t2)) return false;
TileArea ta(t1, t2);
for (TileIndex t : ta) this->AddItem(t.base());
ScriptObject::DisableDoCommandScope disabler{};
OrthogonalTileIterator begin = ta.begin();
if (disabler.GetOriginalValue() && this->resume_iter.has_value()) {
begin = this->resume_iter.value();
}
for (OrthogonalTileIterator iter = begin; iter != ta.end(); ++iter) {
TileIndex t = iter;
if (disabler.GetOriginalValue() && iter != begin && ScriptController::GetOpsTillSuspend() < 0) {
this->resume_iter = iter;
return true;
}
this->AddItem(t.base());
ScriptController::DecreaseOps(5);
}
this->resume_iter.reset();
return false;
}
void ScriptTileList::AddTile(TileIndex tile)
@@ -46,13 +65,32 @@ void ScriptTileList::AddTile(TileIndex tile)
this->AddItem(tile.base());
}
void ScriptTileList::RemoveRectangle(TileIndex t1, TileIndex t2)
bool ScriptTileList::RemoveRectangle(TileIndex t1, TileIndex t2)
{
if (!::IsValidTile(t1)) return;
if (!::IsValidTile(t2)) return;
if (!::IsValidTile(t1)) return false;
if (!::IsValidTile(t2)) return false;
TileArea ta(t1, t2);
for (TileIndex t : ta) this->RemoveItem(t.base());
ScriptObject::DisableDoCommandScope disabler{};
OrthogonalTileIterator begin = ta.begin();
if (disabler.GetOriginalValue() && this->resume_iter.has_value()) {
begin = this->resume_iter.value();
}
for (OrthogonalTileIterator iter = begin; iter != ta.end(); ++iter) {
TileIndex t = iter;
if (disabler.GetOriginalValue() && iter != begin && ScriptController::GetOpsTillSuspend() < 0) {
this->resume_iter = iter;
return true;
}
this->RemoveItem(t.base());
ScriptController::DecreaseOps(5);
}
this->resume_iter.reset();
return false;
}
void ScriptTileList::RemoveTile(TileIndex tile)

View File

@@ -20,6 +20,8 @@
* @ingroup ScriptList
*/
class ScriptTileList : public ScriptList {
private:
std::optional<OrthogonalTileIterator> resume_iter;
protected:
virtual bool SaveObject(HSQUIRRELVM) const override;
virtual ScriptObject *CloneObject() const override;
@@ -30,8 +32,13 @@ public:
* @param tile_to The other corner of the tiles to add.
* @pre ScriptMap::IsValidTile(tile_from).
* @pre ScriptMap::IsValidTile(tile_to).
* @suspendable
*/
#ifdef DOXYGEN_API
void AddRectangle(TileIndex tile_from, TileIndex tile_to);
#else
bool AddRectangle(TileIndex tile_from, TileIndex tile_to);
#endif /* DOXYGEN_API */
/**
* Add a tile to the to-be-evaluated tiles.
@@ -46,8 +53,13 @@ public:
* @param tile_to The other corner of the files to remove.
* @pre ScriptMap::IsValidTile(tile_from).
* @pre ScriptMap::IsValidTile(tile_to).
* @suspendable
*/
#ifdef DOXYGEN_API
void RemoveRectangle(TileIndex tile_from, TileIndex tile_to);
#else
bool RemoveRectangle(TileIndex tile_from, TileIndex tile_to);
#endif /* DOXYGEN_API */
/**
* Remove a tile from the list.