Index: binaries/data/mods/public/art/actors/props/special/common/athen_waypoint_flag.xml =================================================================== --- /dev/null +++ binaries/data/mods/public/art/actors/props/special/common/athen_waypoint_flag.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + basic_trans.xml + Index: binaries/data/mods/public/art/actors/props/special/common/brit_waypoint_flag.xml =================================================================== --- /dev/null +++ binaries/data/mods/public/art/actors/props/special/common/brit_waypoint_flag.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + basic_trans.xml + Index: binaries/data/mods/public/art/actors/props/special/common/cart_waypoint_flag.xml =================================================================== --- /dev/null +++ binaries/data/mods/public/art/actors/props/special/common/cart_waypoint_flag.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + basic_trans.xml + Index: binaries/data/mods/public/art/actors/props/special/common/gaul_waypoint_flag.xml =================================================================== --- /dev/null +++ binaries/data/mods/public/art/actors/props/special/common/gaul_waypoint_flag.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + basic_trans.xml + Index: binaries/data/mods/public/art/actors/props/special/common/iber_waypoint_flag.xml =================================================================== --- /dev/null +++ binaries/data/mods/public/art/actors/props/special/common/iber_waypoint_flag.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + basic_trans.xml + Index: binaries/data/mods/public/art/actors/props/special/common/kush_waypoint_flag.xml =================================================================== --- /dev/null +++ binaries/data/mods/public/art/actors/props/special/common/kush_waypoint_flag.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + basic_trans.xml + Index: binaries/data/mods/public/art/actors/props/special/common/mace_waypoint_flag.xml =================================================================== --- /dev/null +++ binaries/data/mods/public/art/actors/props/special/common/mace_waypoint_flag.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + basic_trans.xml + Index: binaries/data/mods/public/art/actors/props/special/common/maur_waypoint_flag.xml =================================================================== --- /dev/null +++ binaries/data/mods/public/art/actors/props/special/common/maur_waypoint_flag.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + basic_trans.xml + Index: binaries/data/mods/public/art/actors/props/special/common/pers_waypoint_flag.xml =================================================================== --- /dev/null +++ binaries/data/mods/public/art/actors/props/special/common/pers_waypoint_flag.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + basic_trans.xml + Index: binaries/data/mods/public/art/actors/props/special/common/ptol_waypoint_flag.xml =================================================================== --- /dev/null +++ binaries/data/mods/public/art/actors/props/special/common/ptol_waypoint_flag.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + basic_trans.xml + Index: binaries/data/mods/public/art/actors/props/special/common/rome_waypoint_flag.xml =================================================================== --- /dev/null +++ binaries/data/mods/public/art/actors/props/special/common/rome_waypoint_flag.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + basic_trans.xml + Index: binaries/data/mods/public/art/actors/props/special/common/sele_waypoint_flag.xml =================================================================== --- /dev/null +++ binaries/data/mods/public/art/actors/props/special/common/sele_waypoint_flag.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + basic_trans.xml + Index: binaries/data/mods/public/art/actors/props/special/common/spart_waypoint_flag.xml =================================================================== --- /dev/null +++ binaries/data/mods/public/art/actors/props/special/common/spart_waypoint_flag.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + basic_trans.xml + 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/variants/others/waypoints/base.xml =================================================================== --- /dev/null +++ binaries/data/mods/public/art/variants/others/waypoints/base.xml @@ -0,0 +1,7 @@ + + + + + + props/waypoint_flag.dae + 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/{civ}_waypoint_flag.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() { @@ -213,6 +216,12 @@ void CCmpRallyPointRenderer::UpdateMarkers() { player_id_t previousOwner = m_LastOwner; + CmpPtr cmpOwnership(GetEntityHandle()); + player_id_t ownerId = 0; + + if (cmpOwnership) + ownerId = cmpOwnership->GetOwner(); + for (size_t i = 0; i < m_RallyPoints.size(); ++i) { if (i >= m_MarkerEntityIds.size()) @@ -221,11 +230,26 @@ 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()) { + // We should not rely on the Identity component, as the entity may be captured, + // and the rally point needs to reflect the current player. + if (cmpOwnership) + { + if (ownerId != INVALID_PLAYER) + { + CmpPtr cmpPlayerManager(GetSystemEntity()); + if (cmpPlayerManager) + { + CmpPtr cmpPlayer(GetSimContext(), cmpPlayerManager->GetPlayerByID(ownerId)); + if (cmpPlayer) + boost::replace_all(m_MarkerTemplate, L"{civ}", cmpPlayer->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]); @@ -250,28 +274,13 @@ } // Set rally point flag selection based on player civilization - CmpPtr cmpOwnership(GetEntityHandle()); if (!cmpOwnership) continue; - player_id_t ownerId = cmpOwnership->GetOwner(); if (ownerId == INVALID_PLAYER || (ownerId == previousOwner && m_LastMarkerCount >= i)) 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 ]; }