Add a lint check to ensure no actor names are conflicting with script names

Only scripted maps will have the need to use named actors, so we can
assume that there will be a Lua script used in maps with such actors.
This commit is contained in:
abcdefg30
2023-12-12 18:54:30 +01:00
committed by Gustas
parent adf6a81862
commit da507b2eed

View File

@@ -11,6 +11,7 @@
using System;
using System.Linq;
using OpenRA.Scripting;
namespace OpenRA.Mods.Common.Lint
{
@@ -18,10 +19,16 @@ namespace OpenRA.Mods.Common.Lint
{
public void Run(Action<string> emitError, Action<string> emitWarning, ModData modData, Map map)
{
var actorTypes = map.ActorDefinitions.Select(a => a.Value.Value);
foreach (var actor in actorTypes)
if (!map.Rules.Actors.Keys.Contains(actor.ToLowerInvariant()))
emitError($"Actor `{actor}` is not defined by any rule.");
var scriptBindings = Game.ModData.ObjectCreator.GetTypesImplementing<ScriptGlobal>().Select(t => Utility.GetCustomAttributes<ScriptGlobalAttribute>(t, true)[0].Name).ToHashSet();
foreach (var actor in map.ActorDefinitions)
{
var name = actor.Value.Value;
if (!map.Rules.Actors.ContainsKey(name.ToLowerInvariant()))
emitError($"Actor `{name}` is not defined by any rule.");
if (scriptBindings.Contains(actor.Key))
emitError($"Named actor `{actor.Key}` conflicts with a script global of the same name. Consider renaming the actor.");
}
}
}
}