Skip to content

Commit

Permalink
Merge pull request #4127 from RPTools/feature/3852-map-ids-in-macro-f…
Browse files Browse the repository at this point in the history
…unctions

Add support for map IDs in macro functions
  • Loading branch information
cwisniew authored Jun 12, 2023
2 parents f94186e + 2d9dd17 commit 199f3e8
Show file tree
Hide file tree
Showing 10 changed files with 148 additions and 102 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,6 @@
import net.rptools.lib.MD5Key;
import net.rptools.maptool.client.MapTool;
import net.rptools.maptool.client.MapToolUtil;
import net.rptools.maptool.client.ui.zone.ZoneRenderer;
import net.rptools.maptool.language.I18N;
import net.rptools.maptool.model.GUID;
import net.rptools.maptool.model.Zone;
Expand Down Expand Up @@ -210,24 +209,6 @@ protected Layer getLayer(String layer) {
return Layer.TOKEN;
}

/**
* Find the map/zone for a given map name
*
* @param functionName String Name of the calling function.
* @param mapName String Name of the searched for map.
* @return ZoneRenderer The map/zone.
* @throws ParserException if the map is not found
*/
protected ZoneRenderer getNamedMap(String functionName, String mapName) throws ParserException {
for (ZoneRenderer zr : MapTool.getFrame().getZoneRenderers()) {
if (mapName.equals(zr.getZone().getName())) {
return zr;
}
}
throw new ParserException(
I18N.getText("macro.function.moveTokenMap.unknownMap", functionName, mapName));
}

/**
* Looks for a drawing on a specific map that matches a specific id and returns its pen. Throws a
* <code>ParserException</code> if the drawing is not found.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ public Object childEvaluate(
FunctionUtil.checkNumberParam(functionName, parameters, 2, 2);
String mapName = parameters.get(0).toString();
String id = parameters.get(1).toString();
Zone map = getNamedMap(functionName, mapName).getZone();
Zone map = FunctionUtil.getZoneRenderer(functionName, mapName).getZone();
GUID guid = getGUID(functionName, id);
if ("getDrawingLayer".equalsIgnoreCase(functionName)) {
return getDrawable(functionName, map, guid).getLayer().name();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ public Object childEvaluate(
checkTrusted(functionName);
String mapName = parameters.get(0).toString();
String drawing = parameters.get(1).toString();
Zone map = getNamedMap(functionName, mapName).getZone();
Zone map = FunctionUtil.getZoneRenderer(functionName, mapName).getZone();
if ("movedOverDrawing".equalsIgnoreCase(functionName)) {
FunctionUtil.checkNumberParam(functionName, parameters, 3, 3);
String jsonPath = parameters.get(2).toString();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ public Object childEvaluate(
FunctionUtil.checkNumberParam(functionName, parameters, 3, 3);
String mapName = parameters.get(0).toString();
String id = parameters.get(1).toString();
Zone map = getNamedMap(functionName, mapName).getZone();
Zone map = FunctionUtil.getZoneRenderer(functionName, mapName).getZone();
GUID guid = getGUID(functionName, id);
if ("setDrawingLayer".equalsIgnoreCase(functionName)) {
Layer layer = getLayer(parameters.get(2).toString());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -872,21 +872,35 @@ private String findTokenId(String identifier, String zoneName) {
* Finds the specified token.
*
* @param identifier the identifier of the token (name, GM name, or GUID).
* @param zoneName the name of the zone. If null, check current zone.
* @param zoneNameOrId the name or ID of the zone. If null, check current zone.
* @return the token, or null if none found.
*/
public static Token findToken(String identifier, String zoneName) {
public static Token findToken(String identifier, String zoneNameOrId) {
if (identifier == null) {
return null;
}
if (zoneName == null || zoneName.length() == 0) {
if (zoneNameOrId == null || zoneNameOrId.length() == 0) {
ZoneRenderer zr = MapTool.getFrame().getCurrentZoneRenderer();
return zr == null ? null : zr.getZone().resolveToken(identifier);
} else {
if (!GUID.isNotGUID(zoneNameOrId)) {
try {
final var zr = MapTool.getFrame().getZoneRenderer(GUID.valueOf(zoneNameOrId));
if (zr != null) {
Token token = zr.getZone().resolveToken(identifier);
if (token != null) {
return token;
}
}
} catch (InvalidGUIDException ignored) {
// Wasn't a GUID after all. Fall back to looking up by name.
}
}

List<ZoneRenderer> zrenderers = MapTool.getFrame().getZoneRenderers();
for (ZoneRenderer zr : zrenderers) {
Zone zone = zr.getZone();
if (zone.getName().equalsIgnoreCase(zoneName)) {
if (zone.getName().equalsIgnoreCase(zoneNameOrId)) {
Token token = zone.resolveToken(identifier);
if (token != null) {
return token;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
import net.rptools.maptool.model.GUID;
import net.rptools.maptool.model.Token;
import net.rptools.maptool.model.Zone;
import net.rptools.maptool.util.FunctionUtil;
import net.rptools.parser.Parser;
import net.rptools.parser.ParserException;
import net.rptools.parser.VariableResolver;
Expand Down Expand Up @@ -75,17 +76,7 @@ public Object childEvaluate(
parameters.size()));
}

ZoneRenderer zoneRenderer;
if (parameters.size() >= 1) {
String mapName = parameters.get(0).toString();
zoneRenderer = MapTool.getFrame().getZoneRenderer(mapName);
if (zoneRenderer == null) {
throw new ParserException(
I18N.getText("macro.function.moveTokenMap.unknownMap", functionName, mapName));
}
} else {
zoneRenderer = MapTool.getFrame().getCurrentZoneRenderer();
}
final var zoneRenderer = FunctionUtil.getZoneRendererFromParam(functionName, parameters, 0);

/*
* String empty = exposePCOnlyArea(optional String mapName)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@
import net.rptools.maptool.client.MapTool;
import net.rptools.maptool.client.ui.zone.ZoneRenderer;
import net.rptools.maptool.language.I18N;
import net.rptools.maptool.model.GUID;
import net.rptools.maptool.model.InvalidGUIDException;
import net.rptools.maptool.model.Zone;
import net.rptools.maptool.util.FunctionUtil;
import net.rptools.parser.Parser;
Expand All @@ -34,10 +36,14 @@ private MapFunctions() {
super(
0,
2,
"getCurrentMapID",
"getAllMapIDs",
"getMapIDs",
"getAllMapNames",
"getAllMapDisplayNames",
"getCurrentMapName",
"getMapDisplayName",
"getVisibleMapIDs",
"getVisibleMapNames",
"getVisibleMapDisplayNames",
"setCurrentMap",
Expand All @@ -58,7 +64,25 @@ public static MapFunctions getInstance() {
public Object childEvaluate(
Parser parser, VariableResolver resolver, String functionName, List<Object> parameters)
throws ParserException {
if (functionName.equalsIgnoreCase("getCurrentMapName")) {
if (functionName.equalsIgnoreCase("getCurrentMapID")) {
FunctionUtil.checkNumberParam(functionName, parameters, 0, 0);
ZoneRenderer currentZR = MapTool.getFrame().getCurrentZoneRenderer();
if (currentZR == null) {
throw new ParserException(I18N.getText("macro.function.map.none", functionName));
}
return currentZR.getZone().getId().toString();
} else if (functionName.equalsIgnoreCase("getMapIDs")) {
FunctionUtil.checkNumberParam(functionName, parameters, 1, 2);
final var mapName = parameters.get(0).toString();
final var delim = parameters.size() < 2 ? "," : parameters.get(1).toString();
final var zoneIds =
MapTool.getCampaign().getZones().stream()
.filter(zone -> mapName.equals(zone.getName()))
.map(Zone::getId)
.map(GUID::toString)
.toList();
return FunctionUtil.delimitedResult(delim, zoneIds);
} else if (functionName.equalsIgnoreCase("getCurrentMapName")) {
FunctionUtil.checkNumberParam(functionName, parameters, 0, 0);
ZoneRenderer currentZR = MapTool.getFrame().getCurrentZoneRenderer();
if (currentZR == null) {
Expand All @@ -75,10 +99,10 @@ public Object childEvaluate(
} else if (functionName.equalsIgnoreCase("setCurrentMap")) {
FunctionUtil.blockUntrustedMacro(functionName);
FunctionUtil.checkNumberParam(functionName, parameters, 1, 1);
String mapName = parameters.get(0).toString();
final var zr = FunctionUtil.getZoneRenderer(functionName, mapName);
String mapNameOrId = parameters.get(0).toString();
final var zr = FunctionUtil.getZoneRenderer(functionName, mapNameOrId);
MapTool.getFrame().setCurrentZoneRenderer(zr);
return mapName;
return mapNameOrId;

} else if ("getMapVisible".equalsIgnoreCase(functionName)) {
FunctionUtil.checkNumberParam(functionName, parameters, 0, 1);
Expand All @@ -101,9 +125,9 @@ public Object childEvaluate(
} else if ("setMapName".equalsIgnoreCase(functionName)) {
FunctionUtil.blockUntrustedMacro(functionName);
FunctionUtil.checkNumberParam(functionName, parameters, 2, 2);
String oldMapName = parameters.get(0).toString();
String mapNameOrId = parameters.get(0).toString();
String newMapName = parameters.get(1).toString();
Zone zone = FunctionUtil.getZoneRenderer(functionName, oldMapName).getZone();
Zone zone = FunctionUtil.getZoneRenderer(functionName, mapNameOrId).getZone();
zone.setName(newMapName);
MapTool.serverCommand().renameZone(zone.getId(), newMapName);
if (zone == MapTool.getFrame().getCurrentZoneRenderer().getZone()) {
Expand All @@ -114,10 +138,10 @@ public Object childEvaluate(
} else if ("setMapDisplayName".equalsIgnoreCase(functionName)) {
FunctionUtil.blockUntrustedMacro(functionName);
FunctionUtil.checkNumberParam(functionName, parameters, 2, 2);
String mapName = parameters.get(0).toString();
String mapNameOrId = parameters.get(0).toString();
String newMapDisplayName = parameters.get(1).toString();

Zone zone = FunctionUtil.getZoneRenderer(functionName, mapName).getZone();
Zone zone = FunctionUtil.getZoneRenderer(functionName, mapNameOrId).getZone();
if (newMapDisplayName.equals(zone.getDisplayName())) {
// The name is the same, so nothing to do.
return newMapDisplayName;
Expand All @@ -134,15 +158,35 @@ public Object childEvaluate(
} else if ("copyMap".equalsIgnoreCase(functionName)) {
FunctionUtil.blockUntrustedMacro(functionName);
FunctionUtil.checkNumberParam(functionName, parameters, 2, 2);
String oldName = parameters.get(0).toString();
String oldMapNameOrId = parameters.get(0).toString();
String newName = parameters.get(1).toString();
Zone oldMap = FunctionUtil.getZoneRenderer(functionName, oldName).getZone();
Zone oldMap = FunctionUtil.getZoneRenderer(functionName, oldMapNameOrId).getZone();
Zone newMap = new Zone(oldMap);
newMap.setName(newName);
MapTool.addZone(newMap, false);
MapTool.serverCommand().putZone(newMap);
return newMap.getName();

} else if ("getVisibleMapIDs".equalsIgnoreCase(functionName)
|| "getAllMapIDs".equalsIgnoreCase(functionName)) {
FunctionUtil.checkNumberParam(functionName, parameters, 0, 1);
String delim = parameters.size() > 0 ? parameters.get(0).toString() : ",";

boolean allMaps = functionName.equalsIgnoreCase("getAllMapIDs");

if (allMaps) {
FunctionUtil.blockUntrustedMacro(functionName);
}

List<String> mapIds = new LinkedList<>();
for (ZoneRenderer zr : MapTool.getFrame().getZoneRenderers()) {
if (allMaps || zr.getZone().isVisible()) {
mapIds.add(zr.getZone().getId().toString());
}
}

return FunctionUtil.delimitedResult(delim, mapIds);

} else if ("getVisibleMapNames".equalsIgnoreCase(functionName)
|| "getAllMapNames".equalsIgnoreCase(functionName)) {
FunctionUtil.checkNumberParam(functionName, parameters, 0, 1);
Expand Down Expand Up @@ -182,15 +226,34 @@ public Object childEvaluate(
return FunctionUtil.delimitedResult(delim, mapNames);

} else if ("getMapName".equalsIgnoreCase(functionName)) {
FunctionUtil.checkNumberParam(functionName, parameters, 1, 1);
String displayName = parameters.get(0).toString();
FunctionUtil.blockUntrustedMacro(functionName);
FunctionUtil.checkNumberParam(functionName, parameters, 1, 1);

for (ZoneRenderer zr : MapTool.getFrame().getZoneRenderers()) {
if (displayName.equals(zr.getZone().getDisplayName())) {
return zr.getZone().getName();
final var map = parameters.get(0).toString();

// First try treat it as a map ID.
ZoneRenderer match = null;
if (!GUID.isNotGUID(map)) {
try {
match = MapTool.getFrame().getZoneRenderer(GUID.valueOf(map));
} catch (InvalidGUIDException ignored) {
// Wasn't a GUID after all.
}
}

if (match == null) {
// Fall back to look up by display name.
for (ZoneRenderer zr : MapTool.getFrame().getZoneRenderers()) {
if (map.equals(zr.getZone().getDisplayName())) {
match = zr;
break;
}
}
}
if (match != null) {
return match.getZone().getName();
}

throw new ParserException(I18N.getText("macro.function.map.notFound", functionName));

} else if ("setMapSelectButton".equalsIgnoreCase(functionName)) {
Expand Down
Loading

0 comments on commit 199f3e8

Please sign in to comment.