|
@@ -8,6 +8,11 @@
|
|
|
#include <stdint.h>
|
|
#include <stdint.h>
|
|
|
using namespace std;
|
|
using namespace std;
|
|
|
|
|
|
|
|
|
|
+enum {
|
|
|
|
|
+ CYCLE_TIMEOUT = 100000,
|
|
|
|
|
+ FIELDS_XY = 20,
|
|
|
|
|
+};
|
|
|
|
|
+
|
|
|
struct Position {
|
|
struct Position {
|
|
|
size_t x = 0;
|
|
size_t x = 0;
|
|
|
size_t y = 0;
|
|
size_t y = 0;
|
|
@@ -96,30 +101,50 @@ enum Params : uint16_t {
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
enum Variables {
|
|
enum Variables {
|
|
|
- LocalVar_0 = 0,
|
|
|
|
|
- LocalVar_20 = 19,
|
|
|
|
|
- PubVar,
|
|
|
|
|
- TeamVar,
|
|
|
|
|
- LocalActiveVar,
|
|
|
|
|
- RemoteActiveVar,
|
|
|
|
|
|
|
+ Local_0,
|
|
|
|
|
+ Local_1,
|
|
|
|
|
+ Local_2,
|
|
|
|
|
+ Local_3,
|
|
|
|
|
+ Local_4,
|
|
|
|
|
+ Local_5,
|
|
|
|
|
+ Local_6,
|
|
|
|
|
+ Local_7,
|
|
|
|
|
+ Local_8,
|
|
|
|
|
+ Local_9,
|
|
|
|
|
+ Local_10,
|
|
|
|
|
+ Local_11,
|
|
|
|
|
+ Local_12,
|
|
|
|
|
+ Local_13,
|
|
|
|
|
+ Local_14,
|
|
|
|
|
+ Local_15,
|
|
|
|
|
+ Local_16,
|
|
|
|
|
+ Local_17,
|
|
|
|
|
+ Local_18,
|
|
|
|
|
+ Local_19,
|
|
|
|
|
+ LocalActive,
|
|
|
LocalBanks,
|
|
LocalBanks,
|
|
|
- RemoteBanks,
|
|
|
|
|
LocalInstrSet,
|
|
LocalInstrSet,
|
|
|
- RemoteInstrSet,
|
|
|
|
|
LocalMobile,
|
|
LocalMobile,
|
|
|
- RemoteMobile,
|
|
|
|
|
LocalAge,
|
|
LocalAge,
|
|
|
- RemoteAge,
|
|
|
|
|
- Own,
|
|
|
|
|
- Others,
|
|
|
|
|
- Fields,
|
|
|
|
|
- LocalGeneration,
|
|
|
|
|
- TeamId,
|
|
|
|
|
- InstrPos,
|
|
|
|
|
- Time,
|
|
|
|
|
- Timeout,
|
|
|
|
|
LocalTasks,
|
|
LocalTasks,
|
|
|
|
|
+ LocalGeneration,
|
|
|
|
|
+ LocalId,
|
|
|
|
|
+
|
|
|
|
|
+ RemoteActive,
|
|
|
|
|
+ RemoteBanks,
|
|
|
|
|
+ RemoteInstrSet,
|
|
|
|
|
+ RemoteMobile,
|
|
|
|
|
+ RemoteAge,
|
|
|
RemoteTasks,
|
|
RemoteTasks,
|
|
|
|
|
+ RemoteGeneration,
|
|
|
|
|
+
|
|
|
|
|
+ GlobalPub,
|
|
|
|
|
+ GlobalTeam,
|
|
|
|
|
+ GlobalOwn,
|
|
|
|
|
+ GlobalOthers,
|
|
|
|
|
+ GlobalFields,
|
|
|
|
|
+ GlobalTime,
|
|
|
|
|
+ GlobalTimeout,
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
enum Error {
|
|
enum Error {
|
|
@@ -170,6 +195,11 @@ struct Task {
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
struct Program {
|
|
struct Program {
|
|
|
|
|
+ int active = 0;
|
|
|
|
|
+ int instructionSet = 0;
|
|
|
|
|
+ int mobile = 0;
|
|
|
|
|
+ int creationCycle = 0;
|
|
|
|
|
+ int generation = 0;
|
|
|
Error error = NoError;
|
|
Error error = NoError;
|
|
|
QColor color;
|
|
QColor color;
|
|
|
Position position;
|
|
Position position;
|
|
@@ -193,11 +223,9 @@ struct Field {
|
|
|
struct Simulator {
|
|
struct Simulator {
|
|
|
size_t cycle = 0;
|
|
size_t cycle = 0;
|
|
|
vector<Program> programs;
|
|
vector<Program> programs;
|
|
|
- size_t size = 0;
|
|
|
|
|
|
|
|
|
|
Simulator() {
|
|
Simulator() {
|
|
|
- size = 20;
|
|
|
|
|
- programs.reserve(size * size);
|
|
|
|
|
|
|
+ programs.reserve(FIELDS_XY * FIELDS_XY);
|
|
|
|
|
|
|
|
// std::srand(std::time(0));
|
|
// std::srand(std::time(0));
|
|
|
std::srand(0);
|
|
std::srand(0);
|
|
@@ -205,10 +233,10 @@ struct Simulator {
|
|
|
|
|
|
|
|
Position calcPosition(Position position, Direction direction, int32_t distance) {
|
|
Position calcPosition(Position position, Direction direction, int32_t distance) {
|
|
|
switch(direction) {
|
|
switch(direction) {
|
|
|
- case Right: return Position{(position.x + distance) % size, position.y};
|
|
|
|
|
- case Down: return Position{position.x, (position.y + distance) % size};
|
|
|
|
|
- case Left: return Position{(position.x - distance) % size, position.y};
|
|
|
|
|
- case Up: return Position{position.x, (position.y - distance) % size};
|
|
|
|
|
|
|
+ case Right: return Position{(position.x + distance) % FIELDS_XY, position.y};
|
|
|
|
|
+ case Down: return Position{position.x, (position.y + distance) % FIELDS_XY};
|
|
|
|
|
+ case Left: return Position{(position.x - distance) % FIELDS_XY, position.y};
|
|
|
|
|
+ case Up: return Position{position.x, (position.y - distance) % FIELDS_XY};
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -286,12 +314,119 @@ struct Simulator {
|
|
|
int32_t* c = &c_safe;
|
|
int32_t* c = &c_safe;
|
|
|
|
|
|
|
|
auto decode = [&](int*& v) {
|
|
auto decode = [&](int*& v) {
|
|
|
- if(*v >= VAR_0 && *v <= VAR_20) {
|
|
|
|
|
- v = &program.vars[*v];
|
|
|
|
|
- return;
|
|
|
|
|
- }
|
|
|
|
|
switch(*v) {
|
|
switch(*v) {
|
|
|
- case 21: break;
|
|
|
|
|
|
|
+ case Local_0: v = &program.vars[0]; break;
|
|
|
|
|
+ case Local_1: v = &program.vars[1]; break;
|
|
|
|
|
+ case Local_2: v = &program.vars[2]; break;
|
|
|
|
|
+ case Local_3: v = &program.vars[3]; break;
|
|
|
|
|
+ case Local_4: v = &program.vars[4]; break;
|
|
|
|
|
+ case Local_5: v = &program.vars[5]; break;
|
|
|
|
|
+ case Local_6: v = &program.vars[6]; break;
|
|
|
|
|
+ case Local_7: v = &program.vars[7]; break;
|
|
|
|
|
+ case Local_8: v = &program.vars[8]; break;
|
|
|
|
|
+ case Local_9: v = &program.vars[9]; break;
|
|
|
|
|
+ case Local_10: v = &program.vars[10]; break;
|
|
|
|
|
+ case Local_11: v = &program.vars[11]; break;
|
|
|
|
|
+ case Local_12: v = &program.vars[12]; break;
|
|
|
|
|
+ case Local_13: v = &program.vars[13]; break;
|
|
|
|
|
+ case Local_14: v = &program.vars[14]; break;
|
|
|
|
|
+ case Local_15: v = &program.vars[15]; break;
|
|
|
|
|
+ case Local_16: v = &program.vars[16]; break;
|
|
|
|
|
+ case Local_17: v = &program.vars[17]; break;
|
|
|
|
|
+ case Local_18: v = &program.vars[18]; break;
|
|
|
|
|
+ case Local_19: v = &program.vars[19]; break;
|
|
|
|
|
+ case LocalActive:
|
|
|
|
|
+ v = &program.active;
|
|
|
|
|
+ break;
|
|
|
|
|
+ case LocalBanks:
|
|
|
|
|
+ *v = program.banks.size();
|
|
|
|
|
+ break;
|
|
|
|
|
+ case LocalInstrSet:
|
|
|
|
|
+ *v = program.instructionSet;
|
|
|
|
|
+ break;
|
|
|
|
|
+ case LocalMobile:
|
|
|
|
|
+ *v = program.mobile;
|
|
|
|
|
+ break;
|
|
|
|
|
+ case LocalAge:
|
|
|
|
|
+ *v = cycle - program.creationCycle;
|
|
|
|
|
+ break;
|
|
|
|
|
+ case LocalTasks:
|
|
|
|
|
+ *v = program.tasks.size();
|
|
|
|
|
+ break;
|
|
|
|
|
+ case LocalGeneration:
|
|
|
|
|
+ *v = program.generation;
|
|
|
|
|
+ break;
|
|
|
|
|
+ case LocalId:
|
|
|
|
|
+ // @todo
|
|
|
|
|
+ break;
|
|
|
|
|
+ case RemoteActive: {
|
|
|
|
|
+ auto remotePosition = calcPosition(program.position, task.direction, 1);
|
|
|
|
|
+ auto remoteProgram = findProgram(remotePosition);
|
|
|
|
|
+ if(remoteProgram) {
|
|
|
|
|
+ v = &remoteProgram->active;
|
|
|
|
|
+ }
|
|
|
|
|
+ else {
|
|
|
|
|
+ *v = 0;
|
|
|
|
|
+ }
|
|
|
|
|
+ break;
|
|
|
|
|
+ }
|
|
|
|
|
+ case RemoteBanks: {
|
|
|
|
|
+ auto remotePosition = calcPosition(program.position, task.direction, 1);
|
|
|
|
|
+ auto remoteProgram = findProgram(remotePosition);
|
|
|
|
|
+ *v = remoteProgram ? remoteProgram->banks.size() : 0;
|
|
|
|
|
+ break;
|
|
|
|
|
+ }
|
|
|
|
|
+ case RemoteInstrSet: {
|
|
|
|
|
+ auto remotePosition = calcPosition(program.position, task.direction, 1);
|
|
|
|
|
+ auto remoteProgram = findProgram(remotePosition);
|
|
|
|
|
+ *v = remoteProgram ? remoteProgram->instructionSet : 0;
|
|
|
|
|
+ break;
|
|
|
|
|
+ }
|
|
|
|
|
+ case RemoteMobile: {
|
|
|
|
|
+ auto remotePosition = calcPosition(program.position, task.direction, 1);
|
|
|
|
|
+ auto remoteProgram = findProgram(remotePosition);
|
|
|
|
|
+ *v = remoteProgram ? remoteProgram->mobile: 0;
|
|
|
|
|
+ break;
|
|
|
|
|
+ }
|
|
|
|
|
+ case RemoteAge: {
|
|
|
|
|
+ auto remotePosition = calcPosition(program.position, task.direction, 1);
|
|
|
|
|
+ auto remoteProgram = findProgram(remotePosition);
|
|
|
|
|
+ *v = remoteProgram ? (cycle - remoteProgram->creationCycle) : 0;
|
|
|
|
|
+ break;
|
|
|
|
|
+ }
|
|
|
|
|
+ case RemoteTasks: {
|
|
|
|
|
+ auto remotePosition = calcPosition(program.position, task.direction, 1);
|
|
|
|
|
+ auto remoteProgram = findProgram(remotePosition);
|
|
|
|
|
+ *v = remoteProgram ? remoteProgram->tasks.size() : 0;
|
|
|
|
|
+ break;
|
|
|
|
|
+ }
|
|
|
|
|
+ case RemoteGeneration: {
|
|
|
|
|
+ auto remotePosition = calcPosition(program.position, task.direction, 1);
|
|
|
|
|
+ auto remoteProgram = findProgram(remotePosition);
|
|
|
|
|
+ *v = remoteProgram ? remoteProgram->generation : 0;
|
|
|
|
|
+ break;
|
|
|
|
|
+ }
|
|
|
|
|
+ case GlobalPub:
|
|
|
|
|
+ // @todo
|
|
|
|
|
+ break;
|
|
|
|
|
+ case GlobalTeam:
|
|
|
|
|
+ // @todo
|
|
|
|
|
+ break;
|
|
|
|
|
+ case GlobalOwn:
|
|
|
|
|
+ // @todo
|
|
|
|
|
+ break;
|
|
|
|
|
+ case GlobalOthers:
|
|
|
|
|
+ // @todo
|
|
|
|
|
+ break;
|
|
|
|
|
+ case GlobalFields:
|
|
|
|
|
+ *v = FIELDS_XY * FIELDS_XY;
|
|
|
|
|
+ break;
|
|
|
|
|
+ case GlobalTime:
|
|
|
|
|
+ *v = cycle;
|
|
|
|
|
+ break;
|
|
|
|
|
+ case GlobalTimeout:
|
|
|
|
|
+ *v = CYCLE_TIMEOUT;
|
|
|
|
|
+ break;
|
|
|
}
|
|
}
|
|
|
};
|
|
};
|
|
|
|
|
|