From bf85e4ac3832a3bbeedc17dc99f4b417d6c9b518 Mon Sep 17 00:00:00 2001 From: Stan Date: Fri, 11 Dec 2020 14:07:48 +0000 Subject: [PATCH] Allow boolean and u16 modifications for C++ Allow boolean modifications JavaScript Allow territory influence weight, and root, to be changed via tech. Differential Revision: https://code.wildfiregames.com/D3069 This was SVN commit r24373. --- .../mods/public/globalscripts/Technologies.js | 18 +++++++++++++++++- .../components/CCmpTerritoryInfluence.cpp | 14 +++++++++++--- .../ICmpValueModificationManager.cpp | 18 ++++++++++++++---- .../components/ICmpValueModificationManager.h | 10 ++++++---- 4 files changed, 48 insertions(+), 12 deletions(-) diff --git a/binaries/data/mods/public/globalscripts/Technologies.js b/binaries/data/mods/public/globalscripts/Technologies.js index 703811410e..e7fd9442bd 100644 --- a/binaries/data/mods/public/globalscripts/Technologies.js +++ b/binaries/data/mods/public/globalscripts/Technologies.js @@ -23,9 +23,25 @@ function GetTechModifiedProperty(modifications, classes, originalValue) // is about as efficient, but splitting makes it easier to report errors. if (typeof originalValue === "string") return GetTechModifiedProperty_string(modifications, classes, originalValue); - return GetTechModifiedProperty_numeric(modifications, classes, originalValue); + if (typeof originalValue === "number") + return GetTechModifiedProperty_numeric(modifications, classes, originalValue); + return GetTechModifiedProperty_generic(modifications, classes, originalValue); } +function GetTechModifiedProperty_generic(modifications, classes, originalValue) +{ + for (let modification of modifications) + { + if (!DoesModificationApply(modification, classes)) + continue; + if (!modification.replace) + warn("GetTechModifiedProperty: modification format not recognised : " + uneval(modification)); + + return modification.replace; + } + + return originalValue; +} function GetTechModifiedProperty_numeric(modifications, classes, originalValue) { diff --git a/source/simulation2/components/CCmpTerritoryInfluence.cpp b/source/simulation2/components/CCmpTerritoryInfluence.cpp index 47498ea4db..7b8ce13888 100644 --- a/source/simulation2/components/CCmpTerritoryInfluence.cpp +++ b/source/simulation2/components/CCmpTerritoryInfluence.cpp @@ -1,4 +1,4 @@ -/* Copyright (C) 2017 Wildfire Games. +/* Copyright (C) 2020 Wildfire Games. * This file is part of 0 A.D. * * 0 A.D. is free software: you can redistribute it and/or modify @@ -75,12 +75,20 @@ public: virtual bool IsRoot() const { - return m_Root; + CmpPtr cmpValueModificationManager(GetSystemEntity()); + if (!cmpValueModificationManager) + return m_Root; + + return cmpValueModificationManager->ApplyModifications(L"TerritoryInfluence/Root", m_Root, GetEntityId()); } virtual u16 GetWeight() const { - return m_Weight; + CmpPtr cmpValueModificationManager(GetSystemEntity()); + if (!cmpValueModificationManager) + return m_Weight; + + return cmpValueModificationManager->ApplyModifications(L"TerritoryInfluence/Weight", m_Weight, GetEntityId()); } virtual u32 GetRadius() const diff --git a/source/simulation2/components/ICmpValueModificationManager.cpp b/source/simulation2/components/ICmpValueModificationManager.cpp index 7588c9c292..b3aa35cfc7 100644 --- a/source/simulation2/components/ICmpValueModificationManager.cpp +++ b/source/simulation2/components/ICmpValueModificationManager.cpp @@ -1,4 +1,4 @@ -/* Copyright (C) 2012 Wildfire Games. +/* Copyright (C) 2020 Wildfire Games. * This file is part of 0 A.D. * * 0 A.D. is free software: you can redistribute it and/or modify @@ -30,20 +30,30 @@ class CCmpValueModificationManagerScripted : public ICmpValueModificationManager public: DEFAULT_SCRIPT_WRAPPER(ValueModificationManagerScripted) - virtual fixed ApplyModifications(std::wstring valueName, fixed currentValue, entity_id_t entity) + virtual fixed ApplyModifications(std::wstring valueName, fixed currentValue, entity_id_t entity) const { return m_Script.Call("ApplyModifications", valueName, currentValue, entity); } - virtual u32 ApplyModifications(std::wstring valueName, u32 currentValue, entity_id_t entity) + virtual u32 ApplyModifications(std::wstring valueName, u32 currentValue, entity_id_t entity) const { return m_Script.Call("ApplyModifications", valueName, currentValue, entity); } - virtual std::wstring ApplyModifications(std::wstring valueName, std::wstring currentValue, entity_id_t entity) + virtual u16 ApplyModifications(std::wstring valueName, u16 currentValue, entity_id_t entity) const + { + return m_Script.Call("ApplyModifications", valueName, currentValue, entity); + } + + virtual std::wstring ApplyModifications(std::wstring valueName, std::wstring currentValue, entity_id_t entity) const { return m_Script.Call("ApplyModifications", valueName, currentValue, entity); } + + virtual bool ApplyModifications(std::wstring valueName, bool currentValue, entity_id_t entity) const + { + return m_Script.Call("ApplyModifications", valueName, currentValue, entity); + } }; REGISTER_COMPONENT_SCRIPT_WRAPPER(ValueModificationManagerScripted) diff --git a/source/simulation2/components/ICmpValueModificationManager.h b/source/simulation2/components/ICmpValueModificationManager.h index 8218ad12a2..a56b8d46af 100644 --- a/source/simulation2/components/ICmpValueModificationManager.h +++ b/source/simulation2/components/ICmpValueModificationManager.h @@ -1,4 +1,4 @@ -/* Copyright (C) 2012 Wildfire Games. +/* Copyright (C) 2020 Wildfire Games. * This file is part of 0 A.D. * * 0 A.D. is free software: you can redistribute it and/or modify @@ -30,9 +30,11 @@ class ICmpValueModificationManager : public IComponent { public: - virtual fixed ApplyModifications(std::wstring valueName, fixed currentValue, entity_id_t entity) = 0; - virtual u32 ApplyModifications(std::wstring valueName, u32 currentValue, entity_id_t entity) = 0; - virtual std::wstring ApplyModifications(std::wstring valueName, std::wstring currentValue, entity_id_t entity) = 0; + virtual fixed ApplyModifications(std::wstring valueName, fixed currentValue, entity_id_t entity) const = 0; + virtual u32 ApplyModifications(std::wstring valueName, u32 currentValue, entity_id_t entity) const = 0; + virtual u16 ApplyModifications(std::wstring valueName, u16 currentValue, entity_id_t entity) const = 0; + virtual std::wstring ApplyModifications(std::wstring valueName, std::wstring currentValue, entity_id_t entity) const = 0; + virtual bool ApplyModifications(std::wstring valueName, bool currentValue, entity_id_t entity) const = 0; DECLARE_INTERFACE_TYPE(ValueModificationManager) };