Index: binaries/data/mods/public/art/actors/props/special/common/waypoint_flag.xml =================================================================== --- binaries/data/mods/public/art/actors/props/special/common/waypoint_flag.xml +++ /dev/null @@ -1,91 +0,0 @@ - - - - - - - - - - props/waypoint_flag.dae - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - basic_trans.xml - Index: binaries/data/mods/public/art/actors/props/special/common/waypoint_flag_athen.xml =================================================================== --- /dev/null +++ binaries/data/mods/public/art/actors/props/special/common/waypoint_flag_athen.xml @@ -0,0 +1,17 @@ + + + + + + + + + + props/waypoint_flag.dae + + + + + + basic_trans.xml + Index: binaries/data/mods/public/art/actors/props/special/common/waypoint_flag_brit.xml =================================================================== --- /dev/null +++ binaries/data/mods/public/art/actors/props/special/common/waypoint_flag_brit.xml @@ -0,0 +1,17 @@ + + + + + + + + + + props/waypoint_flag.dae + + + + + + basic_trans.xml + Index: binaries/data/mods/public/art/actors/props/special/common/waypoint_flag_cart.xml =================================================================== --- /dev/null +++ binaries/data/mods/public/art/actors/props/special/common/waypoint_flag_cart.xml @@ -0,0 +1,17 @@ + + + + + + + + + + props/waypoint_flag.dae + + + + + + basic_trans.xml + Index: binaries/data/mods/public/art/actors/props/special/common/waypoint_flag_gaul.xml =================================================================== --- /dev/null +++ binaries/data/mods/public/art/actors/props/special/common/waypoint_flag_gaul.xml @@ -0,0 +1,17 @@ + + + + + + + + + + props/waypoint_flag.dae + + + + + + basic_trans.xml + Index: binaries/data/mods/public/art/actors/props/special/common/waypoint_flag_iber.xml =================================================================== --- /dev/null +++ binaries/data/mods/public/art/actors/props/special/common/waypoint_flag_iber.xml @@ -0,0 +1,17 @@ + + + + + + + + + + props/waypoint_flag.dae + + + + + + basic_trans.xml + Index: binaries/data/mods/public/art/actors/props/special/common/waypoint_flag_kush.xml =================================================================== --- /dev/null +++ binaries/data/mods/public/art/actors/props/special/common/waypoint_flag_kush.xml @@ -0,0 +1,17 @@ + + + + + + + + + + props/waypoint_flag.dae + + + + + + basic_trans.xml + Index: binaries/data/mods/public/art/actors/props/special/common/waypoint_flag_mace.xml =================================================================== --- /dev/null +++ binaries/data/mods/public/art/actors/props/special/common/waypoint_flag_mace.xml @@ -0,0 +1,17 @@ + + + + + + + + + + props/waypoint_flag.dae + + + + + + basic_trans.xml + Index: binaries/data/mods/public/art/actors/props/special/common/waypoint_flag_maur.xml =================================================================== --- /dev/null +++ binaries/data/mods/public/art/actors/props/special/common/waypoint_flag_maur.xml @@ -0,0 +1,17 @@ + + + + + + + + + + props/waypoint_flag.dae + + + + + + basic_trans.xml + Index: binaries/data/mods/public/art/actors/props/special/common/waypoint_flag_pers.xml =================================================================== --- /dev/null +++ binaries/data/mods/public/art/actors/props/special/common/waypoint_flag_pers.xml @@ -0,0 +1,17 @@ + + + + + + + + + + props/waypoint_flag.dae + + + + + + basic_trans.xml + Index: binaries/data/mods/public/art/actors/props/special/common/waypoint_flag_ptol.xml =================================================================== --- /dev/null +++ binaries/data/mods/public/art/actors/props/special/common/waypoint_flag_ptol.xml @@ -0,0 +1,17 @@ + + + + + + + + + + props/waypoint_flag.dae + + + + + + basic_trans.xml + Index: binaries/data/mods/public/art/actors/props/special/common/waypoint_flag_rome.xml =================================================================== --- /dev/null +++ binaries/data/mods/public/art/actors/props/special/common/waypoint_flag_rome.xml @@ -0,0 +1,17 @@ + + + + + + + + + + props/waypoint_flag.dae + + + + + + basic_trans.xml + Index: binaries/data/mods/public/art/actors/props/special/common/waypoint_flag_sele.xml =================================================================== --- /dev/null +++ binaries/data/mods/public/art/actors/props/special/common/waypoint_flag_sele.xml @@ -0,0 +1,17 @@ + + + + + + + + + + props/waypoint_flag.dae + + + + + + basic_trans.xml + Index: binaries/data/mods/public/art/actors/props/special/common/waypoint_flag_spart.xml =================================================================== --- /dev/null +++ binaries/data/mods/public/art/actors/props/special/common/waypoint_flag_spart.xml @@ -0,0 +1,17 @@ + + + + + + + + + + props/waypoint_flag.dae + + + + + + basic_trans.xml + Index: binaries/data/mods/public/simulation/templates/special/rallypoint.xml =================================================================== --- binaries/data/mods/public/simulation/templates/special/rallypoint.xml +++ binaries/data/mods/public/simulation/templates/special/rallypoint.xml @@ -1,9 +1,13 @@ + + Rally point flag + true + true - props/special/common/waypoint_flag.xml + props/special/common/waypoint_flag_{civ}.xml Index: binaries/data/mods/public/simulation/templates/special/rallypoints/athen.xml =================================================================== --- /dev/null +++ binaries/data/mods/public/simulation/templates/special/rallypoints/athen.xml @@ -0,0 +1,6 @@ + + + + athen + + Index: binaries/data/mods/public/simulation/templates/special/rallypoints/brit.xml =================================================================== --- /dev/null +++ binaries/data/mods/public/simulation/templates/special/rallypoints/brit.xml @@ -0,0 +1,6 @@ + + + + brit + + Index: binaries/data/mods/public/simulation/templates/special/rallypoints/cart.xml =================================================================== --- /dev/null +++ binaries/data/mods/public/simulation/templates/special/rallypoints/cart.xml @@ -0,0 +1,6 @@ + + + + cart + + Index: binaries/data/mods/public/simulation/templates/special/rallypoints/gaul.xml =================================================================== --- /dev/null +++ binaries/data/mods/public/simulation/templates/special/rallypoints/gaul.xml @@ -0,0 +1,6 @@ + + + + gaul + + Index: binaries/data/mods/public/simulation/templates/special/rallypoints/iber.xml =================================================================== --- /dev/null +++ binaries/data/mods/public/simulation/templates/special/rallypoints/iber.xml @@ -0,0 +1,6 @@ + + + + iber + + Index: binaries/data/mods/public/simulation/templates/special/rallypoints/kush.xml =================================================================== --- /dev/null +++ binaries/data/mods/public/simulation/templates/special/rallypoints/kush.xml @@ -0,0 +1,6 @@ + + + + kush + + Index: binaries/data/mods/public/simulation/templates/special/rallypoints/mace.xml =================================================================== --- /dev/null +++ binaries/data/mods/public/simulation/templates/special/rallypoints/mace.xml @@ -0,0 +1,6 @@ + + + + mace + + Index: binaries/data/mods/public/simulation/templates/special/rallypoints/maur.xml =================================================================== --- /dev/null +++ binaries/data/mods/public/simulation/templates/special/rallypoints/maur.xml @@ -0,0 +1,6 @@ + + + + maur + + Index: binaries/data/mods/public/simulation/templates/special/rallypoints/pers.xml =================================================================== --- /dev/null +++ binaries/data/mods/public/simulation/templates/special/rallypoints/pers.xml @@ -0,0 +1,6 @@ + + + + pers + + Index: binaries/data/mods/public/simulation/templates/special/rallypoints/ptol.xml =================================================================== --- /dev/null +++ binaries/data/mods/public/simulation/templates/special/rallypoints/ptol.xml @@ -0,0 +1,6 @@ + + + + ptol + + Index: binaries/data/mods/public/simulation/templates/special/rallypoints/rome.xml =================================================================== --- /dev/null +++ binaries/data/mods/public/simulation/templates/special/rallypoints/rome.xml @@ -0,0 +1,6 @@ + + + + rome + + Index: binaries/data/mods/public/simulation/templates/special/rallypoints/sele.xml =================================================================== --- /dev/null +++ binaries/data/mods/public/simulation/templates/special/rallypoints/sele.xml @@ -0,0 +1,6 @@ + + + + sele + + Index: binaries/data/mods/public/simulation/templates/special/rallypoints/spart.xml =================================================================== --- /dev/null +++ binaries/data/mods/public/simulation/templates/special/rallypoints/spart.xml @@ -0,0 +1,6 @@ + + + + spart + + Index: binaries/data/mods/public/simulation/templates/template_structure.xml =================================================================== --- binaries/data/mods/public/simulation/templates/template_structure.xml +++ binaries/data/mods/public/simulation/templates/template_structure.xml @@ -103,7 +103,7 @@ - special/rallypoint + special/rallypoints/{civ} art/textures/misc/rallypoint_line.png art/textures/misc/rallypoint_line_mask.png 0.25 Index: binaries/data/mods/public/simulation/templates/template_territory_pull.xml =================================================================== --- binaries/data/mods/public/simulation/templates/template_territory_pull.xml +++ binaries/data/mods/public/simulation/templates/template_territory_pull.xml @@ -34,7 +34,7 @@ false true - props/special/common/waypoint_flag.xml + props/special/common/waypoint_flag_factions.xml true Index: source/simulation2/components/CCmpRallyPointRenderer.cpp =================================================================== --- source/simulation2/components/CCmpRallyPointRenderer.cpp +++ source/simulation2/components/CCmpRallyPointRenderer.cpp @@ -1,4 +1,4 @@ -/* Copyright (C) 2019 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 @@ -17,6 +17,9 @@ #include "precompiled.h" #include "CCmpRallyPointRenderer.h" +#include "ICmpIdentity.h" + +#include std::string CCmpRallyPointRenderer::GetSchema() { @@ -221,11 +224,14 @@ if (m_MarkerEntityIds[i] == INVALID_ENTITY) { // No marker exists yet, create one first - CComponentManager& componentMgr = GetSimContext().GetComponentManager(); - // Allocate a new entity for the marker if (!m_MarkerTemplate.empty()) { + CmpPtr cmpIdentity(GetEntityHandle()); + if(cmpIdentity) + boost::replace_all(m_MarkerTemplate, L"{civ}", cmpIdentity->GetCiv()); + + CComponentManager& componentMgr = GetSimContext().GetComponentManager(); m_MarkerEntityIds[i] = componentMgr.AllocateNewLocalEntity(); if (m_MarkerEntityIds[i] != INVALID_ENTITY) m_MarkerEntityIds[i] = componentMgr.AddEntity(m_MarkerTemplate, m_MarkerEntityIds[i]); @@ -259,19 +265,6 @@ continue; m_LastOwner = ownerId; - CmpPtr cmpPlayerManager(GetSystemEntity()); - // cmpPlayerManager should not be null as long as this method is called on-demand instead of at Init() time - // (we can't rely on component initialization order in Init()) - if (!cmpPlayerManager) - continue; - - CmpPtr cmpPlayer(GetSimContext(), cmpPlayerManager->GetPlayerByID(ownerId)); - if (!cmpPlayer) - continue; - - CmpPtr cmpVisualActor(GetSimContext(), m_MarkerEntityIds[i]); - if (cmpVisualActor) - cmpVisualActor->SetVariant("civ", CStrW(cmpPlayer->GetCiv()).ToUTF8()); } m_LastMarkerCount = m_RallyPoints.size() - 1; } Index: source/simulation2/components/CCmpVisualActor.cpp =================================================================== --- source/simulation2/components/CCmpVisualActor.cpp +++ source/simulation2/components/CCmpVisualActor.cpp @@ -1,4 +1,4 @@ -/* Copyright (C) 2019 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 @@ -26,6 +26,8 @@ #include "ICmpIdentity.h" #include "ICmpUnitRenderer.h" #include "ICmpOwnership.h" +#include "ICmpPlayer.h" +#include "ICmpPlayerManager.h" #include "ICmpPosition.h" #include "ICmpTemplateManager.h" #include "ICmpTerrain.h" @@ -51,6 +53,8 @@ #include "ps/GameSetup/Config.h" #include "renderer/Scene.h" +#include + class CCmpVisualActor : public ICmpVisual { public: @@ -467,7 +471,7 @@ if (!m_Unit || !m_Unit->GetAnimation() || !m_Unit->GetID()) return; - m_Unit->GetAnimation()->SetAnimationState(m_AnimName, m_AnimOnce, m_AnimSpeed.ToFloat(), m_AnimDesync.ToFloat(), m_SoundGroup.c_str()); + m_Unit->GetAnimation()->SetAnimationState(m_AnimName, m_AnimOnce, m_AnimSpeed.ToFloat(), m_AnimDesync.ToFloat(), m_SoundGroup.c_str()); } virtual void SelectMovementAnimation(const std::string& name, fixed speed) @@ -545,7 +549,7 @@ } private: - // Replace {phenotype} with the correct value in m_ActorName + // Replace {phenotype} and {civ} with the correct value in m_ActorName void ParseActorName(std::wstring base); /// Helper function shared by component init and actor reloading @@ -568,14 +572,28 @@ void CCmpVisualActor::ParseActorName(std::wstring base) { CmpPtr cmpIdentity(GetEntityHandle()); - const std::wstring pattern = L"{phenotype}"; if (cmpIdentity) { - size_t pos = base.find(pattern); - while (pos != std::string::npos) + boost::replace_all(base, L"{phenotype}", cmpIdentity->GetPhenotype()); + boost::replace_all(base, L"{civ}", cmpIdentity->GetCiv()); + } + else + { + // Template might have no civ but might be owned by something that does. + CmpPtr cmpOwnership(GetEntityHandle()); + if (cmpOwnership) { - base.replace(pos, pattern.size(), cmpIdentity->GetPhenotype()); - pos = base.find(pattern, pos + pattern.size()); + player_id_t ownerId = cmpOwnership->GetOwner(); + if (ownerId != INVALID_PLAYER) + { + CmpPtr cmpPlayerManager(GetSystemEntity()); + if (cmpPlayerManager) + { + CmpPtr cmpPlayer(GetSimContext(), cmpPlayerManager->GetPlayerByID(ownerId)); + if (cmpPlayer) + boost::replace_all(base, L"{civ}", cmpPlayer->GetCiv()); + } + } } } Index: source/simulation2/components/ICmpIdentity.h =================================================================== --- source/simulation2/components/ICmpIdentity.h +++ source/simulation2/components/ICmpIdentity.h @@ -1,4 +1,4 @@ -/* Copyright (C) 2019 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 @@ -31,6 +31,8 @@ virtual std::wstring GetPhenotype() = 0; + virtual std::wstring GetCiv() = 0; + DECLARE_INTERFACE_TYPE(Identity) }; Index: source/simulation2/components/ICmpIdentity.cpp =================================================================== --- source/simulation2/components/ICmpIdentity.cpp +++ source/simulation2/components/ICmpIdentity.cpp @@ -1,4 +1,4 @@ -/* Copyright (C) 2019 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 @@ -40,6 +40,11 @@ { return m_Script.Call("GetPhenotype"); } + + virtual std::wstring GetCiv() + { + return m_Script.Call("GetCiv"); + } }; REGISTER_COMPONENT_SCRIPT_WRAPPER(IdentityScripted) Index: source/tools/entity/checkrefs.pl =================================================================== --- source/tools/entity/checkrefs.pl +++ source/tools/entity/checkrefs.pl @@ -138,6 +138,7 @@ if ($ent->{Entity}{VisualActor} and $ent->{Entity}{VisualActor}{Actor}) { my $phenotypes = $ent->{Entity}{Identity}{Phenotype}{' content'} || "default"; + my $civ = $ent->{Entity}{Identity}{Civ}{' content'} || "athen"; my @phenotypes = split /\s/,$phenotypes; for my $phenotype (@phenotypes) @@ -145,6 +146,7 @@ # See simulation2/components/CCmpVisualActor.cpp and Identity.js for explanation. my $actorPath = $ent->{Entity}{VisualActor}{Actor}{' content'}; $actorPath =~ s/{phenotype}/$phenotype/g; + $actorPath =~ s/{civ}/$civ/g; push @deps, [ $path, "art/actors/" . $actorPath ]; }