Skip to content

Commit

Permalink
working version
Browse files Browse the repository at this point in the history
  • Loading branch information
dasba authored and dasba committed Oct 1, 2022
1 parent cbe9f1b commit ffb4f5d
Show file tree
Hide file tree
Showing 15 changed files with 282 additions and 239 deletions.
12 changes: 9 additions & 3 deletions src/main/java/extralogic/ExtraLogicMod.java
Original file line number Diff line number Diff line change
@@ -1,30 +1,36 @@
package extralogic;

import arc.Events;
import arc.util.Log;
import extralogic.content.ExtraLogicBlocks;
import extralogic.content.ExtraLogicContent;
import extralogic.content.ExtraLogicUI;
import extralogic.logic.ExtraLogicIO;
import extralogic.logic.statements.ExtraLStatements;
import mindustry.game.EventType;
import mindustry.mod.Mod;

public class ExtraLogicMod extends Mod {

public ExtraLogicMod() {
Log.info("Initializing ExtraLogic!");
// // listen for game load event

Events.on(EventType.WorldLoadEvent.class, e->{
ExtraLogicIO.regenerateStatements();
});
}

@Override
public void loadContent() {
Log.info("Loading ExtraLogic content!");
ExtraLogicBlocks.load();
ExtraLStatements.load();
ExtraLogicIO.regenerateStatements();
}

@Override
public void init() {
ExtraLogicContent.ui = new ExtraLogicUI();
ExtraLogicContent.logicVars.init();
}

}
269 changes: 137 additions & 132 deletions src/main/java/extralogic/logic/ExtraGlobalVars.java
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
package extralogic.logic;

import static mindustry.Vars.*;

import java.io.DataInputStream;
import java.io.IOException;
import java.util.Iterator;

import arc.Core;
import arc.files.Fi;
Expand All @@ -17,6 +18,7 @@
import mindustry.ctype.Content;
import mindustry.ctype.ContentType;
import mindustry.ctype.UnlockableContent;
import mindustry.game.Team;
import mindustry.logic.GlobalVars;
import mindustry.logic.LAccess;
import mindustry.logic.LExecutor.Var;
Expand All @@ -32,183 +34,186 @@
*/
public class ExtraGlobalVars {

public ExtraVar get(int id) {
return this.vars.items[id];
}
public static final int ctrlProcessor = 1, ctrlPlayer = 2, ctrlCommand = 3;

public int get(String name) {
return this.namesToIds.get(name, -1);
}
public static final ContentType[] lookableContent = {
ContentType.block, ContentType.unit, ContentType.item, ContentType.liquid
};

public void init() {
/** Global random state. */
public static final Rand rand = new Rand();

Iterator<?> var14 = Vars.content.items().iterator();
// non-constants that depend on state
private static int varTime, varTick, varSecond, varMinute, varWave, varWaveTime;

while (var14.hasNext()) {
Item item = (Item) var14.next();
this.put("@" + item.name, item);
}
private ObjectIntMap<String> namesToIds = new ObjectIntMap<>();

var14 = Vars.content.liquids().iterator();
private Seq<ExtraVar> vars = new Seq<>(ExtraVar.class);

private UnlockableContent[][] logicIdToContent;

private int[][] contentIdToLogicId;

while (var14.hasNext()) {
Liquid liquid = (Liquid) var14.next();
this.put("@" + liquid.name, liquid);
public void init() {
put("the end", null);
// add default constants
put("false", 0);
put("true", 1);
put("null", null);

// time
varTime = put("@time", 0);
varTick = put("@tick", 0);
varSecond = put("@second", 0);
varMinute = put("@minute", 0);
varWave = put("@waveNumber", 0);
varWaveTime = put("@waveTime", 0);

// special enums

put("@ctrlProcessor", ctrlProcessor);
put("@ctrlPlayer", ctrlPlayer);
put("@ctrlCommand", ctrlCommand);

// store base content

for (Team team : Team.baseTeams) {
put("@" + team.name, team);
}

var14 = Vars.content.blocks().iterator();
for (Item item : Vars.content.items()) {
put("@" + item.name, item);
}

while (var14.hasNext()) {
Block block = (Block) var14.next();
if (Vars.content.item(block.name) == null) {
this.put("@" + block.name, block);
for (Liquid liquid : Vars.content.liquids()) {
put("@" + liquid.name, liquid);
}

for (Block block : Vars.content.blocks()) {
// only register blocks that have no item equivalent (this skips sand)
if (content.item(block.name) == null) {
put("@" + block.name, block);
}
}

this.put("@solid", Blocks.stoneWall);
var14 = Vars.content.units().iterator();
// used as a special value for any environmental solid block
put("@solid", Blocks.stoneWall);

while (var14.hasNext()) {
UnitType type = (UnitType) var14.next();
this.put("@" + type.name, type);
for (UnitType type : Vars.content.units()) {
put("@" + type.name, type);
}

LAccess[] var17 = LAccess.all;
int var2 = var17.length;

for (int var3 = 0; var3 < var2; ++var3) {
LAccess sensor = var17[var3];
this.put("@" + sensor.name(), sensor);
// store sensor constants
for (LAccess sensor : LAccess.all) {
put("@" + sensor.name(), sensor);
}

this.logicIdToContent = new UnlockableContent[ContentType.all.length][];
this.contentIdToLogicId = new int[ContentType.all.length][];
logicIdToContent = new UnlockableContent[ContentType.all.length][];
contentIdToLogicId = new int[ContentType.all.length][];

Fi ids = Core.files.internal("logicids.dat");
if (ids.exists()) {
try {
DataInputStream in = new DataInputStream(ids.readByteStream());

try {
ContentType[] var23 = lookableContent;
int var24 = var23.length;

for (int var5 = 0; var5 < var24; ++var5) {
ContentType ctype = var23[var5];
short amount = in.readShort();
this.logicIdToContent[ctype.ordinal()] = new UnlockableContent[amount];
this.contentIdToLogicId[ctype.ordinal()] = new int[Vars.content.getBy(ctype).size];
this.put("@" + ctype.name() + "Count", amount);

for (int i = 0; i < amount; ++i) {
String name = in.readUTF();
UnlockableContent fetched = (UnlockableContent) Vars.content.getByName(ctype, name);
if (fetched != null) {
this.logicIdToContent[ctype.ordinal()][i] = fetched;
this.contentIdToLogicId[ctype.ordinal()][fetched.id] = i;
}
// read logic ID mapping data (generated in ImagePacker)
try (DataInputStream in = new DataInputStream(ids.readByteStream())) {
for (ContentType ctype : lookableContent) {
short amount = in.readShort();
logicIdToContent[ctype.ordinal()] = new UnlockableContent[amount];
contentIdToLogicId[ctype.ordinal()] = new int[Vars.content.getBy(ctype).size];

// store count constants
put("@" + ctype.name() + "Count", amount);

for (int i = 0; i < amount; i++) {
String name = in.readUTF();
UnlockableContent fetched = Vars.content.getByName(ctype, name);

if (fetched != null) {
logicIdToContent[ctype.ordinal()][i] = fetched;
contentIdToLogicId[ctype.ordinal()][fetched.id] = i;
}
}
} catch (Throwable var12) {
try {
in.close();
} catch (Throwable var11) {
var12.addSuppressed(var11);
}

throw var12;
}

in.close();
} catch (IOException var13) {
Log.err("Error reading logic ID mapping", var13);
} catch (IOException e) {
// don't crash?
Log.err("Error reading logic ID mapping", e);
}
}
}

/** Updates global time and other state variables. */
public void update() {
// set up time; note that @time is now only updated once every invocation and
// directly based off of @tick.
// having time be based off of user system time was a very bad idea.
vars.items[varTime].handle.numval = state.tick / 60.0 * 1000.0;
vars.items[varTick].handle.numval = state.tick;

// shorthands for seconds/minutes spent in save
vars.items[varSecond].handle.numval = state.tick / 60f;
vars.items[varMinute].handle.numval = state.tick / 60f / 60f;

// wave state
vars.items[varWave].handle.numval = state.wave;
vars.items[varWaveTime].handle.numval = state.wavetime / 60f;
}

@Nullable
public Content lookupContent(ContentType type, int id) {
UnlockableContent[] arr = this.logicIdToContent[type.ordinal()];
/**
* @return a piece of content based on its logic ID. This is not equivalent to
* content ID.
*/
public @Nullable Content lookupContent(ContentType type, int id) {
var arr = logicIdToContent[type.ordinal()];
return arr != null && id >= 0 && id < arr.length ? arr[id] : null;
}

/** @return the integer logic ID of content, or -1 if invalid. */
public int lookupLogicId(UnlockableContent content) {
int[] arr = this.contentIdToLogicId[content.getContentType().ordinal()];
var arr = contentIdToLogicId[content.getContentType().ordinal()];
return arr != null && content.id >= 0 && content.id < arr.length ? arr[content.id] : -1;
}

/**
* @return a constant ID > 0 if there is a constant with this name, otherwise
* -1.
*/
public int get(String name) {
return namesToIds.get(name, -1);
}

/**
* @return a constant variable by ID. ID is not bound checked and must be
* positive.
*/
public ExtraVar get(int id) {
return vars.items[id];
}

/** Sets a global variable by an ID returned from put(). */
public void set(int id, double value) {
get(id).handle.numval = value;
}

/** Adds a constant value by name. */
public int put(String name, Object value) {
int existingIdx = this.namesToIds.get(name, -1);
if (existingIdx != -1) {
Log.debug("Failed to add global logic variable '@', as it already exists.", new Object[] {
name
});
int existingIdx = namesToIds.get(name, -1);
if (existingIdx != -1) { // don't overwrite existing vars (see #6910)
Log.debug("Failed to add global logic variable '@', as it already exists.", name);
return existingIdx;
}

Var var = new Var(name);
var.constant = true;
if (value instanceof Number) {
Number num = (Number) value;
if (value instanceof Number num) {
var.numval = num.doubleValue();
} else {
var.isobj = true;
var.objval = value;
}

int index = this.vars.size;
this.namesToIds.put(name, index);
this.vars.add(new ExtraVar(var));
int index = vars.size;
namesToIds.put(name, index);
vars.add(new ExtraVar(var));
return index;
}

public void set(int id, double value) {
this.get(id).handle.numval = value;
}

public void update() {
this.vars.items[varTime].handle.numval = Vars.state.tick / 60.0D * 1000.0D;
this.vars.items[varTick].handle.numval = Vars.state.tick;
this.vars.items[varSecond].handle.numval = Vars.state.tick / 60.0D;
this.vars.items[varMinute].handle.numval = Vars.state.tick / 60.0D / 60.0D;
this.vars.items[varWave].handle.numval = Vars.state.wave;
this.vars.items[varWaveTime].handle.numval = Vars.state.wavetime / 60.0F;
}

private ObjectIntMap<String> namesToIds = new ObjectIntMap<>();

private Seq<ExtraVar> vars = new Seq<>(ExtraVar.class);

private UnlockableContent[][] logicIdToContent;

private int[][] contentIdToLogicId;

public static final int ctrlProcessor = 1;

public static final int ctrlPlayer = 2;

public static final int ctrlCommand = 3;

public static final ContentType[] lookableContent;

public static final Rand rand;

private static int varTime;

private static int varTick;

private static int varSecond;

private static int varMinute;

private static int varWave;

private static int varWaveTime;

static {
lookableContent = new ContentType[] {
ContentType.block, ContentType.unit, ContentType.item, ContentType.liquid
};
rand = new Rand();
}

}
Loading

0 comments on commit ffb4f5d

Please sign in to comment.