Commands are now content

This commit is contained in:
Anuken
2023-09-23 17:10:19 -04:00
parent cafec1386c
commit 276245bf3c
7 changed files with 107 additions and 66 deletions

View File

@@ -227,7 +227,7 @@ public class EntityIO{
if(BaseProcessor.isPrimitive(type)){ if(BaseProcessor.isPrimitive(type)){
s(type.equals("boolean") ? "bool" : type.charAt(0) + "", field); s(type.equals("boolean") ? "bool" : type.charAt(0) + "", field);
}else if(instanceOf(type, "mindustry.ctype.Content")){ }else if(instanceOf(type, "mindustry.ctype.Content") && !type.equals("mindustry.ai.UnitStance") && !type.equals("mindustry.ai.UnitCommand")){
if(write){ if(write){
s("s", field + ".id"); s("s", field + ".id");
}else{ }else{

View File

@@ -6,54 +6,19 @@ import arc.scene.style.*;
import arc.struct.*; import arc.struct.*;
import arc.util.*; import arc.util.*;
import mindustry.ai.types.*; import mindustry.ai.types.*;
import mindustry.ctype.*;
import mindustry.entities.units.*; import mindustry.entities.units.*;
import mindustry.gen.*; import mindustry.gen.*;
import mindustry.input.*; import mindustry.input.*;
/** Defines a pattern of behavior that an RTS-controlled unit should follow. Shows up in the command UI. */ /** Defines a pattern of behavior that an RTS-controlled unit should follow. Shows up in the command UI. */
public class UnitCommand{ public class UnitCommand extends MappableContent{
/** List of all commands by ID. */ /** @deprecated now a content type, use the methods in Vars.content instead */
@Deprecated
public static final Seq<UnitCommand> all = new Seq<>(); public static final Seq<UnitCommand> all = new Seq<>();
public static final UnitCommand public static UnitCommand moveCommand, repairCommand, rebuildCommand, assistCommand, mineCommand, boostCommand, loadUnitsCommand, loadBlocksCommand, unloadPayloadCommand;
moveCommand = new UnitCommand("move", "right", Binding.unit_command_move, null){{
drawTarget = true;
resetTarget = false;
}},
repairCommand = new UnitCommand("repair", "modeSurvival", Binding.unit_command_repair, u -> new RepairAI()),
rebuildCommand = new UnitCommand("rebuild", "hammer", Binding.unit_command_rebuild, u -> new BuilderAI()),
assistCommand = new UnitCommand("assist", "players", Binding.unit_command_assist, u -> {
var ai = new BuilderAI();
ai.onlyAssist = true;
return ai;
}),
mineCommand = new UnitCommand("mine", "production", Binding.unit_command_mine, u -> new MinerAI()),
boostCommand = new UnitCommand("boost", "up", Binding.unit_command_boost, u -> new BoostAI()){{
switchToMove = false;
drawTarget = true;
resetTarget = false;
}},
loadUnitsCommand = new UnitCommand("loadUnits", "download", Binding.unit_command_load_units, null){{
switchToMove = false;
drawTarget = true;
resetTarget = false;
}},
loadBlocksCommand = new UnitCommand("loadBlocks", "down", Binding.unit_command_load_blocks, null){{
switchToMove = false;
drawTarget = true;
resetTarget = false;
}},
unloadPayloadCommand = new UnitCommand("unloadPayload", "upload", Binding.unit_command_unload_payload, null){{
switchToMove = false;
drawTarget = true;
resetTarget = false;
}};
/** Unique ID number. */
public final int id;
/** Named used for tooltip/description. */
public final String name;
/** Name of UI icon (from Icon class). */ /** Name of UI icon (from Icon class). */
public final String icon; public final String icon;
/** Controller that this unit will use when this command is used. Return null for "default" behavior. */ /** Controller that this unit will use when this command is used. Return null for "default" behavior. */
@@ -68,11 +33,11 @@ public class UnitCommand{
public @Nullable Binding keybind = null; public @Nullable Binding keybind = null;
public UnitCommand(String name, String icon, Func<Unit, AIController> controller){ public UnitCommand(String name, String icon, Func<Unit, AIController> controller){
this.name = name; super(name);
this.icon = icon; this.icon = icon;
this.controller = controller == null ? u -> null : controller; this.controller = controller == null ? u -> null : controller;
id = all.size;
all.add(this); all.add(this);
} }
@@ -93,8 +58,49 @@ public class UnitCommand{
return (char) Iconc.codes.get(icon, Iconc.cancel); return (char) Iconc.codes.get(icon, Iconc.cancel);
} }
@Override
public ContentType getContentType(){
return ContentType.unitCommand;
}
@Override @Override
public String toString(){ public String toString(){
return "UnitCommand:" + name; return "UnitCommand:" + name;
} }
public static void loadAll(){
moveCommand = new UnitCommand("move", "right", Binding.unit_command_move, null){{
drawTarget = true;
resetTarget = false;
}};
repairCommand = new UnitCommand("repair", "modeSurvival", Binding.unit_command_repair, u -> new RepairAI());
rebuildCommand = new UnitCommand("rebuild", "hammer", Binding.unit_command_rebuild, u -> new BuilderAI());
assistCommand = new UnitCommand("assist", "players", Binding.unit_command_assist, u -> {
var ai = new BuilderAI();
ai.onlyAssist = true;
return ai;
});
mineCommand = new UnitCommand("mine", "production", Binding.unit_command_mine, u -> new MinerAI());
boostCommand = new UnitCommand("boost", "up", Binding.unit_command_boost, u -> new BoostAI()){{
switchToMove = false;
drawTarget = true;
resetTarget = false;
}};
loadUnitsCommand = new UnitCommand("loadUnits", "download", Binding.unit_command_load_units, null){{
switchToMove = false;
drawTarget = true;
resetTarget = false;
}};
loadBlocksCommand = new UnitCommand("loadBlocks", "down", Binding.unit_command_load_blocks, null){{
switchToMove = false;
drawTarget = true;
resetTarget = false;
}};
unloadPayloadCommand = new UnitCommand("unloadPayload", "upload", Binding.unit_command_unload_payload, null){{
switchToMove = false;
drawTarget = true;
resetTarget = false;
}};
}
} }

View File

@@ -4,37 +4,27 @@ import arc.*;
import arc.scene.style.*; import arc.scene.style.*;
import arc.struct.*; import arc.struct.*;
import arc.util.*; import arc.util.*;
import mindustry.ctype.*;
import mindustry.gen.*; import mindustry.gen.*;
import mindustry.input.*; import mindustry.input.*;
public class UnitStance{ public class UnitStance extends MappableContent{
/** List of all stances by ID. */ /** @deprecated now a content type, use the methods in Vars.content instead */
@Deprecated
public static final Seq<UnitStance> all = new Seq<>(); public static final Seq<UnitStance> all = new Seq<>();
public static final UnitStance public static UnitStance stop, shoot, holdFire, pursueTarget, patrol, ram;
stop = new UnitStance("stop", "cancel", Binding.cancel_orders), //not a real stance, cannot be selected, just cancels ordewrs
shoot = new UnitStance("shoot", "commandAttack", Binding.unit_stance_shoot),
holdFire = new UnitStance("holdfire", "none", Binding.unit_stance_hold_fire),
pursueTarget = new UnitStance("pursuetarget", "right", Binding.unit_stance_pursue_target),
patrol = new UnitStance("patrol", "refresh", Binding.unit_stance_patrol),
ram = new UnitStance("ram", "rightOpen", Binding.unit_stance_ram);
/** Unique ID number. */
public final int id;
/** Named used for tooltip/description. */
public final String name;
/** Name of UI icon (from Icon class). */ /** Name of UI icon (from Icon class). */
public final String icon; public final String icon;
/** Key to press for this stance. */ /** Key to press for this stance. */
public @Nullable Binding keybind = null; public @Nullable Binding keybind = null;
public UnitStance(String name, String icon, Binding keybind){ public UnitStance(String name, String icon, Binding keybind){
this.name = name; super(name);
this.icon = icon; this.icon = icon;
this.keybind = keybind; this.keybind = keybind;
id = all.size;
all.add(this); all.add(this);
} }
@@ -50,8 +40,22 @@ public class UnitStance{
return (char) Iconc.codes.get(icon, Iconc.cancel); return (char) Iconc.codes.get(icon, Iconc.cancel);
} }
@Override
public ContentType getContentType(){
return ContentType.unitStance;
}
@Override @Override
public String toString(){ public String toString(){
return "UnitStance:" + name; return "UnitStance:" + name;
} }
public static void loadAll(){
stop = new UnitStance("stop", "cancel", Binding.cancel_orders);
shoot = new UnitStance("shoot", "commandAttack", Binding.unit_stance_shoot);
holdFire = new UnitStance("holdfire", "none", Binding.unit_stance_hold_fire);
pursueTarget = new UnitStance("pursuetarget", "right", Binding.unit_stance_pursue_target);
patrol = new UnitStance("patrol", "refresh", Binding.unit_stance_patrol);
ram = new UnitStance("ram", "rightOpen", Binding.unit_stance_ram);
}
} }

View File

@@ -6,6 +6,7 @@ import arc.func.*;
import arc.graphics.*; import arc.graphics.*;
import arc.struct.*; import arc.struct.*;
import arc.util.*; import arc.util.*;
import mindustry.ai.*;
import mindustry.content.*; import mindustry.content.*;
import mindustry.ctype.*; import mindustry.ctype.*;
import mindustry.entities.bullet.*; import mindustry.entities.bullet.*;
@@ -40,6 +41,8 @@ public class ContentLoader{
/** Creates all base types. */ /** Creates all base types. */
public void createBaseContent(){ public void createBaseContent(){
UnitCommand.loadAll();
UnitStance.loadAll();
TeamEntries.load(); TeamEntries.load();
Items.load(); Items.load();
StatusEffects.load(); StatusEffects.load();
@@ -310,4 +313,28 @@ public class ContentLoader{
public Planet planet(String name){ public Planet planet(String name){
return getByName(ContentType.planet, name); return getByName(ContentType.planet, name);
} }
public Seq<UnitStance> unitStances(){
return getBy(ContentType.unitStance);
}
public UnitStance unitStance(int id){
return getByID(ContentType.unitStance, id);
}
public UnitStance unitStance(String name){
return getByName(ContentType.unitStance, name);
}
public Seq<UnitCommand> unitCommands(){
return getBy(ContentType.unitCommand);
}
public UnitCommand unitCommand(int id){
return getByID(ContentType.unitCommand, id);
}
public UnitCommand unitCommand(String name){
return getByName(ContentType.unitCommand, name);
}
} }

View File

@@ -1,6 +1,7 @@
package mindustry.ctype; package mindustry.ctype;
import arc.util.*; import arc.util.*;
import mindustry.ai.*;
import mindustry.entities.bullet.*; import mindustry.entities.bullet.*;
import mindustry.type.*; import mindustry.type.*;
import mindustry.world.*; import mindustry.world.*;
@@ -22,7 +23,9 @@ public enum ContentType{
error(null), error(null),
planet(Planet.class), planet(Planet.class),
ammo_UNUSED(null), ammo_UNUSED(null),
team(TeamEntry.class); team(TeamEntry.class),
unitCommand(UnitCommand.class),
unitStance(UnitStance.class);
public static final ContentType[] all = values(); public static final ContentType[] all = values();

View File

@@ -203,7 +203,7 @@ public class TypeIO{
for(int i = 0; i < objlen; i++) objs[i] = readObjectBoxed(read, box); for(int i = 0; i < objlen; i++) objs[i] = readObjectBoxed(read, box);
yield objs; yield objs;
} }
case 23 -> UnitCommand.all.get(read.us()); case 23 -> content.unitCommand(read.us());
default -> throw new IllegalArgumentException("Unknown object type: " + type); default -> throw new IllegalArgumentException("Unknown object type: " + type);
}; };
} }
@@ -311,7 +311,7 @@ public class TypeIO{
public static @Nullable UnitCommand readCommand(Reads read){ public static @Nullable UnitCommand readCommand(Reads read){
int val = read.ub(); int val = read.ub();
return val == 255 || val >= UnitCommand.all.size ? null : UnitCommand.all.get(val); return val == 255 ? null : content.unitCommand(val);
} }
public static void writeStance(Writes write, @Nullable UnitStance stance){ public static void writeStance(Writes write, @Nullable UnitStance stance){
@@ -321,7 +321,7 @@ public class TypeIO{
public static UnitStance readStance(Reads read){ public static UnitStance readStance(Reads read){
int val = read.ub(); int val = read.ub();
//never returns null //never returns null
return val == 255 || val >= UnitStance.all.size ? UnitStance.shoot : UnitStance.all.get(val); return val == 255 || val >= content.unitStances().size ? UnitStance.shoot : content.unitStance(val);
} }
public static void writeEntity(Writes write, Entityc entity){ public static void writeEntity(Writes write, Entityc entity){
@@ -576,7 +576,8 @@ public class TypeIO{
if(type == 6 || type == 7 || type == 8){ if(type == 6 || type == 7 || type == 8){
byte id = read.b(); byte id = read.b();
ai.command = id < 0 ? null : UnitCommand.all.get(id); ai.command = id < 0 ? null : content.unitCommand(id);
if(ai.command == null) ai.command = UnitCommand.moveCommand;
} }
//command queue only in type 7 //command queue only in type 7

View File

@@ -112,7 +112,7 @@ public class ContentParser{
}); });
put(UnitCommand.class, (type, data) -> { put(UnitCommand.class, (type, data) -> {
if(data.isString()){ if(data.isString()){
var cmd = UnitCommand.all.find(u -> u.name.equals(data.asString())); var cmd = content.unitCommand(data.asString());
if(cmd != null){ if(cmd != null){
return cmd; return cmd;
}else{ }else{
@@ -124,7 +124,7 @@ public class ContentParser{
}); });
put(UnitStance.class, (type, data) -> { put(UnitStance.class, (type, data) -> {
if(data.isString()){ if(data.isString()){
var cmd = UnitStance.all.find(u -> u.name.equals(data.asString())); var cmd = content.unitStance(data.asString());
if(cmd != null){ if(cmd != null){
return cmd; return cmd;
}else{ }else{