1
0
Fork 0

Compare commits

..

2 Commits

Author SHA1 Message Date
HyperJeanJean 00e5f7b768
Merge d47951a0a6 into 7546c1acab 2025-07-14 08:03:53 +00:00
HyperJeanJean d47951a0a6 Change: Select snow line height by level instead of coverage
The snow coverage was too random, it could produce maps with snow
heights too low or too high with the exact same settings.

Now the snow line height is determined by choosing an aproxiamte level,
similar to the water level. A custom value can also be entered.
2025-07-11 19:58:10 +02:00
12 changed files with 78 additions and 84 deletions

View File

@ -103,14 +103,14 @@ void SpriteFontCache::ClearFontCache()
const Sprite *SpriteFontCache::GetGlyph(GlyphID key)
{
SpriteID sprite = static_cast<SpriteID>(key & ~SPRITE_GLYPH);
SpriteID sprite = this->GetUnicodeGlyph(static_cast<char32_t>(key & ~SPRITE_GLYPH));
if (sprite == 0) sprite = this->GetUnicodeGlyph('?');
return GetSprite(sprite, SpriteType::Font);
}
uint SpriteFontCache::GetGlyphWidth(GlyphID key)
{
SpriteID sprite = static_cast<SpriteID>(key & ~SPRITE_GLYPH);
SpriteID sprite = this->GetUnicodeGlyph(static_cast<char32_t>(key & ~SPRITE_GLYPH));
if (sprite == 0) sprite = this->GetUnicodeGlyph('?');
return SpriteExists(sprite) ? GetSprite(sprite, SpriteType::Font)->width + ScaleFontTrad(this->fs != FS_NORMAL ? 1 : 0) : 0;
}
@ -120,7 +120,7 @@ GlyphID SpriteFontCache::MapCharToGlyph(char32_t key, [[maybe_unused]] bool allo
assert(IsPrintable(key));
SpriteID sprite = this->GetUnicodeGlyph(key);
if (sprite == 0) return 0;
return SPRITE_GLYPH | sprite;
return SPRITE_GLYPH | key;
}
bool SpriteFontCache::GetDrawGlyphShadow()

View File

@ -105,8 +105,8 @@ static ChangeInfoResult RoadStopChangeInfo(uint first, uint last, int prop, Byte
AddStringForMapping(GRFStringID{buf.ReadWord()}, [rs = rs.get()](StringID str) { RoadStopClass::Get(rs->class_index)->name = str; });
break;
case 0x0C: // The draw modes
rs->draw_mode = static_cast<RoadStopDrawModes>(buf.ReadByte());
case 0x0C: // The draw mode
rs->draw_mode = static_cast<RoadStopDrawMode>(buf.ReadByte());
break;
case 0x0D: // Cargo types for random triggers

View File

@ -298,7 +298,7 @@ void DrawRoadStopTile(int x, int y, RoadType roadtype, const RoadStopSpec *spec,
RoadStopDrawModes draw_mode;
if (spec->flags.Test(RoadStopSpecFlag::DrawModeRegister)) {
draw_mode = static_cast<RoadStopDrawModes>(object.GetRegister(0x100));
draw_mode = static_cast<RoadStopDrawMode>(object.GetRegister(0x100));
} else {
draw_mode = spec->draw_mode;
}

View File

@ -76,7 +76,7 @@ ScriptController::ScriptController(::CompanyID company) :
/* static */ uint ScriptController::GetTick()
{
return ScriptObject::GetActiveInstance().GetController().ticks;
return ScriptObject::GetActiveInstance().GetController()->ticks;
}
/* static */ int ScriptController::GetOpsTillSuspend()
@ -96,9 +96,9 @@ ScriptController::ScriptController(::CompanyID company) :
/* static */ HSQOBJECT ScriptController::Import(const std::string &library, const std::string &class_name, int version)
{
ScriptController &controller = ScriptObject::GetActiveInstance().GetController();
Squirrel &engine = *ScriptObject::GetActiveInstance().engine;
HSQUIRRELVM vm = engine.GetVM();
ScriptController *controller = ScriptObject::GetActiveInstance().GetController();
Squirrel *engine = ScriptObject::GetActiveInstance().engine;
HSQUIRRELVM vm = engine->GetVM();
ScriptInfo *lib = ScriptObject::GetActiveInstance().FindLibrary(library, version);
if (lib == nullptr) {
@ -114,11 +114,11 @@ ScriptController::ScriptController(::CompanyID company) :
std::string fake_class;
LoadedLibraryList::iterator it = controller.loaded_library.find(library_name);
if (it != controller.loaded_library.end()) {
LoadedLibraryList::iterator it = controller->loaded_library.find(library_name);
if (it != controller->loaded_library.end()) {
fake_class = (*it).second;
} else {
int next_number = ++controller.loaded_library_count;
int next_number = ++controller->loaded_library_count;
/* Create a new fake internal name */
fake_class = fmt::format("_internalNA{}", next_number);
@ -128,14 +128,14 @@ ScriptController::ScriptController(::CompanyID company) :
sq_pushstring(vm, fake_class);
sq_newclass(vm, SQFalse);
/* Load the library */
if (!engine.LoadScript(vm, lib->GetMainScript(), false)) {
if (!engine->LoadScript(vm, lib->GetMainScript(), false)) {
throw sq_throwerror(vm, fmt::format("there was a compile error when importing '{}' version {}", library, version));
}
/* Create the fake class */
sq_newslot(vm, -3, SQFalse);
sq_pop(vm, 1);
controller.loaded_library[library_name] = fake_class;
controller->loaded_library[library_name] = fake_class;
}
/* Find the real class inside the fake class (like 'sets.Vector') */

View File

@ -45,7 +45,7 @@ void SimpleCountedObject::Release()
* Get the storage associated with the current ScriptInstance.
* @return The storage.
*/
static ScriptStorage &GetStorage()
static ScriptStorage *GetStorage()
{
return ScriptObject::GetActiveInstance().GetStorage();
}
@ -65,7 +65,7 @@ ScriptObject::ActiveInstance::~ActiveInstance()
}
ScriptObject::DisableDoCommandScope::DisableDoCommandScope()
: AutoRestoreBackup(GetStorage().allow_do_command, false)
: AutoRestoreBackup(GetStorage()->allow_do_command, false)
{}
/* static */ ScriptInstance &ScriptObject::GetActiveInstance()
@ -78,181 +78,181 @@ ScriptObject::DisableDoCommandScope::DisableDoCommandScope()
/* static */ void ScriptObject::SetDoCommandDelay(uint ticks)
{
assert(ticks > 0);
GetStorage().delay = ticks;
GetStorage()->delay = ticks;
}
/* static */ uint ScriptObject::GetDoCommandDelay()
{
return GetStorage().delay;
return GetStorage()->delay;
}
/* static */ void ScriptObject::SetDoCommandMode(ScriptModeProc *proc, ScriptObject *instance)
{
GetStorage().mode = proc;
GetStorage().mode_instance = instance;
GetStorage()->mode = proc;
GetStorage()->mode_instance = instance;
}
/* static */ ScriptModeProc *ScriptObject::GetDoCommandMode()
{
return GetStorage().mode;
return GetStorage()->mode;
}
/* static */ ScriptObject *ScriptObject::GetDoCommandModeInstance()
{
return GetStorage().mode_instance;
return GetStorage()->mode_instance;
}
/* static */ void ScriptObject::SetDoCommandAsyncMode(ScriptAsyncModeProc *proc, ScriptObject *instance)
{
GetStorage().async_mode = proc;
GetStorage().async_mode_instance = instance;
GetStorage()->async_mode = proc;
GetStorage()->async_mode_instance = instance;
}
/* static */ ScriptAsyncModeProc *ScriptObject::GetDoCommandAsyncMode()
{
return GetStorage().async_mode;
return GetStorage()->async_mode;
}
/* static */ ScriptObject *ScriptObject::GetDoCommandAsyncModeInstance()
{
return GetStorage().async_mode_instance;
return GetStorage()->async_mode_instance;
}
/* static */ void ScriptObject::SetLastCommand(const CommandDataBuffer &data, Commands cmd)
{
ScriptStorage &s = GetStorage();
Debug(script, 6, "SetLastCommand company={:02d} cmd={} data={}", s.root_company, cmd, FormatArrayAsHex(data));
s.last_data = data;
s.last_cmd = cmd;
ScriptStorage *s = GetStorage();
Debug(script, 6, "SetLastCommand company={:02d} cmd={} data={}", s->root_company, cmd, FormatArrayAsHex(data));
s->last_data = data;
s->last_cmd = cmd;
}
/* static */ bool ScriptObject::CheckLastCommand(const CommandDataBuffer &data, Commands cmd)
{
ScriptStorage &s = GetStorage();
Debug(script, 6, "CheckLastCommand company={:02d} cmd={} data={}", s.root_company, cmd, FormatArrayAsHex(data));
if (s.last_cmd != cmd) return false;
if (s.last_data != data) return false;
ScriptStorage *s = GetStorage();
Debug(script, 6, "CheckLastCommand company={:02d} cmd={} data={}", s->root_company, cmd, FormatArrayAsHex(data));
if (s->last_cmd != cmd) return false;
if (s->last_data != data) return false;
return true;
}
/* static */ void ScriptObject::SetDoCommandCosts(Money value)
{
GetStorage().costs = CommandCost(INVALID_EXPENSES, value); // Expense type is never read.
GetStorage()->costs = CommandCost(INVALID_EXPENSES, value); // Expense type is never read.
}
/* static */ void ScriptObject::IncreaseDoCommandCosts(Money value)
{
GetStorage().costs.AddCost(value);
GetStorage()->costs.AddCost(value);
}
/* static */ Money ScriptObject::GetDoCommandCosts()
{
return GetStorage().costs.GetCost();
return GetStorage()->costs.GetCost();
}
/* static */ void ScriptObject::SetLastError(ScriptErrorType last_error)
{
GetStorage().last_error = last_error;
GetStorage()->last_error = last_error;
}
/* static */ ScriptErrorType ScriptObject::GetLastError()
{
return GetStorage().last_error;
return GetStorage()->last_error;
}
/* static */ void ScriptObject::SetLastCost(Money last_cost)
{
GetStorage().last_cost = last_cost;
GetStorage()->last_cost = last_cost;
}
/* static */ Money ScriptObject::GetLastCost()
{
return GetStorage().last_cost;
return GetStorage()->last_cost;
}
/* static */ void ScriptObject::SetRoadType(RoadType road_type)
{
GetStorage().road_type = road_type;
GetStorage()->road_type = road_type;
}
/* static */ RoadType ScriptObject::GetRoadType()
{
return GetStorage().road_type;
return GetStorage()->road_type;
}
/* static */ void ScriptObject::SetRailType(RailType rail_type)
{
GetStorage().rail_type = rail_type;
GetStorage()->rail_type = rail_type;
}
/* static */ RailType ScriptObject::GetRailType()
{
return GetStorage().rail_type;
return GetStorage()->rail_type;
}
/* static */ void ScriptObject::SetLastCommandRes(bool res)
{
GetStorage().last_command_res = res;
GetStorage()->last_command_res = res;
}
/* static */ bool ScriptObject::GetLastCommandRes()
{
return GetStorage().last_command_res;
return GetStorage()->last_command_res;
}
/* static */ void ScriptObject::SetLastCommandResData(CommandDataBuffer data)
{
GetStorage().last_cmd_ret = std::move(data);
GetStorage()->last_cmd_ret = std::move(data);
}
/* static */ const CommandDataBuffer &ScriptObject::GetLastCommandResData()
{
return GetStorage().last_cmd_ret;
return GetStorage()->last_cmd_ret;
}
/* static */ void ScriptObject::SetCompany(::CompanyID company)
{
if (GetStorage().root_company == INVALID_OWNER) GetStorage().root_company = company;
GetStorage().company = company;
if (GetStorage()->root_company == INVALID_OWNER) GetStorage()->root_company = company;
GetStorage()->company = company;
_current_company = company;
}
/* static */ ::CompanyID ScriptObject::GetCompany()
{
return GetStorage().company;
return GetStorage()->company;
}
/* static */ ::CompanyID ScriptObject::GetRootCompany()
{
return GetStorage().root_company;
return GetStorage()->root_company;
}
/* static */ bool ScriptObject::CanSuspend()
{
Squirrel *squirrel = ScriptObject::GetActiveInstance().engine;
return GetStorage().allow_do_command && squirrel->CanSuspend();
return GetStorage()->allow_do_command && squirrel->CanSuspend();
}
/* static */ ScriptEventQueue &ScriptObject::GetEventQueue()
{
return GetStorage().event_queue;
return GetStorage()->event_queue;
}
/* static */ ScriptLogTypes::LogData &ScriptObject::GetLogData()
{
return GetStorage().log_data;
return GetStorage()->log_data;
}
/* static */ void ScriptObject::SetCallbackVariable(int index, int value)
{
if (static_cast<size_t>(index) >= GetStorage().callback_value.size()) GetStorage().callback_value.resize(index + 1);
GetStorage().callback_value[index] = value;
if (static_cast<size_t>(index) >= GetStorage()->callback_value.size()) GetStorage()->callback_value.resize(index + 1);
GetStorage()->callback_value[index] = value;
}
/* static */ int ScriptObject::GetCallbackVariable(int index)
{
return GetStorage().callback_value[index];
return GetStorage()->callback_value[index];
}
/* static */ CommandCallbackData *ScriptObject::GetDoCommandCallback()
@ -310,8 +310,8 @@ ScriptObject::DisableDoCommandScope::DisableDoCommandScope()
IncreaseDoCommandCosts(res.GetCost());
if (!_generating_world) {
/* Charge a nominal fee for asynchronously executed commands */
Squirrel &engine = *ScriptObject::GetActiveInstance().engine;
Squirrel::DecreaseOps(engine.GetVM(), 100);
Squirrel *engine = ScriptObject::GetActiveInstance().engine;
Squirrel::DecreaseOps(engine->GetVM(), 100);
}
if (callback != nullptr) {
/* Insert return value into to stack and throw a control code that

View File

@ -100,7 +100,7 @@ void ScriptInstance::Initialize(const std::string &main_script, const std::strin
void ScriptInstance::RegisterAPI()
{
squirrel_register_std(*this->engine);
squirrel_register_std(this->engine);
}
bool ScriptInstance::LoadCompatibilityScript(std::string_view api_version, Subdirectory dir)
@ -318,10 +318,9 @@ void ScriptInstance::CollectGarbage()
}
ScriptStorage &ScriptInstance::GetStorage()
ScriptStorage *ScriptInstance::GetStorage()
{
assert(this->storage != nullptr);
return *this->storage;
return this->storage;
}
ScriptLogTypes::LogData &ScriptInstance::GetLogData()

View File

@ -91,7 +91,7 @@ public:
/**
* Get the storage of this script.
*/
class ScriptStorage &GetStorage();
class ScriptStorage *GetStorage();
/**
* Get the log pointer of this script.
@ -146,11 +146,7 @@ public:
/**
* Get the controller attached to the instance.
*/
class ScriptController &GetController()
{
assert(this->controller != nullptr);
return *this->controller;
}
class ScriptController *GetController() { return controller; }
/**
* Return the "this script died" value

View File

@ -536,7 +536,7 @@ void Squirrel::Initialize()
sq_setforeignptr(this->vm, this);
sq_pushroottable(this->vm);
squirrel_register_global_std(*this);
squirrel_register_global_std(this);
/* Set consts table as delegate of root table, so consts/enums defined via require() are accessible */
sq_pushconsttable(this->vm);

View File

@ -82,20 +82,20 @@ SQInteger SquirrelStd::notifyallexceptions(HSQUIRRELVM vm)
return SQ_ERROR;
}
void squirrel_register_global_std(Squirrel &engine)
void squirrel_register_global_std(Squirrel *engine)
{
/* We don't use squirrel_helper here, as we want to register to the global
* scope and not to a class. */
engine.AddMethod("require", &SquirrelStd::require, ".s");
engine.AddMethod("notifyallexceptions", &SquirrelStd::notifyallexceptions, ".b");
engine->AddMethod("require", &SquirrelStd::require, ".s");
engine->AddMethod("notifyallexceptions", &SquirrelStd::notifyallexceptions, ".b");
}
void squirrel_register_std(Squirrel &engine)
void squirrel_register_std(Squirrel *engine)
{
/* We don't use squirrel_helper here, as we want to register to the global
* scope and not to a class. */
engine.AddMethod("min", &SquirrelStd::min, ".ii");
engine.AddMethod("max", &SquirrelStd::max, ".ii");
engine->AddMethod("min", &SquirrelStd::min, ".ii");
engine->AddMethod("max", &SquirrelStd::max, ".ii");
sqstd_register_mathlib(engine.GetVM());
sqstd_register_mathlib(engine->GetVM());
}

View File

@ -52,12 +52,12 @@ public:
/**
* Register all standard functions we want to give to a script.
*/
void squirrel_register_std(Squirrel &engine);
void squirrel_register_std(Squirrel *engine);
/**
* Register all standard functions that are available on first startup.
* @note this set is very limited, and is only meant to load other scripts and things like that.
*/
void squirrel_register_global_std(Squirrel &engine);
void squirrel_register_global_std(Squirrel *engine);
#endif /* SQUIRREL_STD_HPP */

View File

@ -3331,7 +3331,7 @@ draw_default_foundation:
auto result = GetRoadStopLayout(ti, stopspec, st, type, view, regs100);
if (result.has_value()) {
if (stopspec->flags.Test(RoadStopSpecFlag::DrawModeRegister)) {
stop_draw_mode = static_cast<RoadStopDrawModes>(regs100[0]);
stop_draw_mode = static_cast<RoadStopDrawMode>(regs100[0]);
}
if (type == StationType::RoadWaypoint && stop_draw_mode.Test(RoadStopDrawMode::WaypGround)) {
draw_ground = true;

View File

@ -427,7 +427,6 @@ struct TimetableWindow : Window {
void DrawTimetablePanel(const Rect &r) const
{
const Vehicle *v = this->vehicle;
if (v->GetNumOrders() == 0) return;
Rect tr = r.Shrink(WidgetDimensions::scaled.framerect);
int i = this->vscroll->GetPosition();
VehicleOrderID order_id = (i + 1) / 2;