diff --git a/source/scriptinterface/ScriptConversions.h b/source/scriptinterface/ScriptConversions.h index 5fd917268d..a0bd267760 100644 --- a/source/scriptinterface/ScriptConversions.h +++ b/source/scriptinterface/ScriptConversions.h @@ -23,6 +23,8 @@ #include "ScriptExtraHeaders.h" // for typed arrays #include +#include +#include #include namespace Script @@ -32,6 +34,21 @@ namespace Script */ template bool FromJSVal(const ScriptRequest& rq, const JS::HandleValue val, T& ret); +template +bool FromJSVal(const ScriptRequest& rq, JS::HandleValue v, std::optional& out) +{ + if (v.isNullOrUndefined()) + { + out = std::nullopt; + return true; + } + T value; + if (!FromJSVal(rq, v, value)) + return false; + out = std::move(value); + return true; +} + /** * Convert a C++ type to a JS::Value. (This might trigger GC. The return * value must be rooted if you don't want it to be collected.) diff --git a/source/simulation2/components/ICmpIdentity.cpp b/source/simulation2/components/ICmpIdentity.cpp index bdb318e97c..19fd7f7939 100644 --- a/source/simulation2/components/ICmpIdentity.cpp +++ b/source/simulation2/components/ICmpIdentity.cpp @@ -1,4 +1,4 @@ -/* Copyright (C) 2022 Wildfire Games. +/* Copyright (C) 2025 Wildfire Games. * This file is part of 0 A.D. * * 0 A.D. is free software: you can redistribute it and/or modify @@ -21,6 +21,7 @@ #include "simulation2/system/InterfaceScripted.h" #include "simulation2/scripting/ScriptComponent.h" +#include BEGIN_INTERFACE_WRAPPER(Identity) @@ -43,7 +44,8 @@ public: std::wstring GetCiv() override { - return m_Script.Call("GetCiv"); + std::optional civ{m_Script.Call>("GetCiv")}; + return !civ || !civ.has_value() ? L"" : *civ; } };