Fixed stack related bugs, moved loadMusic into audio namespace
This commit is contained in:
parent
cc395b425e
commit
ef9895de56
@ -53,6 +53,9 @@ namespace dms {
|
|||||||
c->args.push(value(key));
|
c->args.push(value(key));
|
||||||
chunks["$INIT"]->addCmd(c);
|
chunks["$INIT"]->addCmd(c);
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
|
getEnvironment(key);
|
||||||
|
}
|
||||||
c = new cmd;
|
c = new cmd;
|
||||||
}
|
}
|
||||||
else if (val->type == bt_method) {
|
else if (val->type == bt_method) {
|
||||||
@ -74,22 +77,39 @@ namespace dms {
|
|||||||
stop = true;
|
stop = true;
|
||||||
}
|
}
|
||||||
memory* dms_state::getMem() {
|
memory* dms_state::getMem() {
|
||||||
return &mem_stack.top();
|
return mem_stack.top();
|
||||||
}
|
}
|
||||||
void dms_state::pushMem() {
|
void dms_state::pushMem() {
|
||||||
memory mem = memory();
|
memory* mem = new memory;
|
||||||
if (!mem_stack.empty()) {
|
if (!mem_stack.empty()) {
|
||||||
|
|
||||||
mem.parent = getMem();
|
mem->parent = getMem();
|
||||||
}
|
}
|
||||||
mem_stack.push(mem);
|
mem_stack.push(mem);
|
||||||
}
|
}
|
||||||
void dms_state::pushMem(memory &mem) {
|
void dms_state::pushMem(memory* mem) {
|
||||||
mem_stack.push(mem);
|
mem_stack.push(mem);
|
||||||
}
|
}
|
||||||
void dms_state::popMem() {
|
void dms_state::popMem() {
|
||||||
mem_stack.pop();
|
mem_stack.pop();
|
||||||
}
|
}
|
||||||
|
void dms_state::pushStateData()
|
||||||
|
{
|
||||||
|
statedata_stack.push({ n_code,n_c,n_halt,n_pos,n_max,n_cmds,n_ln,n_temp });
|
||||||
|
}
|
||||||
|
void dms_state::popStateData()
|
||||||
|
{
|
||||||
|
statedata temp = statedata_stack.top();
|
||||||
|
statedata_stack.pop();
|
||||||
|
n_code = temp.code;
|
||||||
|
n_c = temp.c;
|
||||||
|
n_halt = temp.halt;
|
||||||
|
n_pos = temp.pos;
|
||||||
|
n_max = temp.max;
|
||||||
|
n_cmds = temp.cmds;
|
||||||
|
n_ln = temp.ln;
|
||||||
|
n_temp = temp.temp;
|
||||||
|
}
|
||||||
dms_state::dms_state() {
|
dms_state::dms_state() {
|
||||||
// We should define the defaults for the enables
|
// We should define the defaults for the enables
|
||||||
pushMem(); // Main memory
|
pushMem(); // Main memory
|
||||||
|
|||||||
@ -15,6 +15,16 @@ namespace dms {
|
|||||||
character* chara;
|
character* chara;
|
||||||
std::string text;
|
std::string text;
|
||||||
};
|
};
|
||||||
|
struct statedata {
|
||||||
|
codes::op code;
|
||||||
|
cmd* c = nullptr;
|
||||||
|
bool halt = false;
|
||||||
|
size_t pos = 0;
|
||||||
|
size_t max = 0;
|
||||||
|
std::vector<cmd*> cmds;
|
||||||
|
size_t ln = 0;
|
||||||
|
std::string temp;
|
||||||
|
};
|
||||||
struct Handler;
|
struct Handler;
|
||||||
value blockInvoke(void*, dms_state*, dms_args*);
|
value blockInvoke(void*, dms_state*, dms_args*);
|
||||||
struct dms_state
|
struct dms_state
|
||||||
@ -25,8 +35,8 @@ namespace dms {
|
|||||||
Invoker invoker;
|
Invoker invoker;
|
||||||
std::stack<std::string> call_stack;
|
std::stack<std::string> call_stack;
|
||||||
std::stack<value> return_stack;
|
std::stack<value> return_stack;
|
||||||
std::stack<memory> mem_stack;
|
std::stack<memory*> mem_stack;
|
||||||
std::vector<value*> garbage;
|
std::stack<statedata> statedata_stack;
|
||||||
std::unordered_map<std::string, chunk*> chunks;
|
std::unordered_map<std::string, chunk*> chunks;
|
||||||
std::unordered_map<std::string, character*> characters;
|
std::unordered_map<std::string, character*> characters;
|
||||||
std::unordered_map<std::string, enviroment*> environments;
|
std::unordered_map<std::string, enviroment*> environments;
|
||||||
@ -73,6 +83,8 @@ namespace dms {
|
|||||||
memory* getMem();
|
memory* getMem();
|
||||||
void pushMem();
|
void pushMem();
|
||||||
void popMem();
|
void popMem();
|
||||||
|
void pushStateData();
|
||||||
|
void popStateData();
|
||||||
bool run();
|
bool run();
|
||||||
bool next(memory* mem);
|
bool next(memory* mem);
|
||||||
bool run(std::string ent,memory* mem);
|
bool run(std::string ent,memory* mem);
|
||||||
@ -99,7 +111,7 @@ namespace dms {
|
|||||||
size_t n_ln = 0;
|
size_t n_ln = 0;
|
||||||
std::string n_temp;
|
std::string n_temp;
|
||||||
//
|
//
|
||||||
void pushMem(memory&);
|
void pushMem(memory*);
|
||||||
bool stop = false;
|
bool stop = false;
|
||||||
bool init_init = false;
|
bool init_init = false;
|
||||||
void init(chunk* chunk, size_t &pos,size_t &max, std::vector<cmd*>& cmds);
|
void init(chunk* chunk, size_t &pos,size_t &max, std::vector<cmd*>& cmds);
|
||||||
|
|||||||
@ -17,8 +17,8 @@ namespace dms {
|
|||||||
else {
|
else {
|
||||||
if (blockExists(env)) {
|
if (blockExists(env)) {
|
||||||
enviroment* e = new enviroment;
|
enviroment* e = new enviroment;
|
||||||
if (!run(env, &e->values)) {
|
if (run(env, &e->values)) {
|
||||||
return nullptr;
|
std::cout << "Ran :D" << std::endl;
|
||||||
}
|
}
|
||||||
environments.insert_or_assign(env, e);
|
environments.insert_or_assign(env, e);
|
||||||
handler->OnEnviromentCreated(this, e);
|
handler->OnEnviromentCreated(this, e);
|
||||||
@ -131,527 +131,20 @@ namespace dms {
|
|||||||
exitcode = 1;
|
exitcode = 1;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
codes::op code;
|
if (chunks[ent] == NULL) {
|
||||||
cmd* c = nullptr;
|
push_error(errors::error{ errors::non_existing_block ,utils::concat("Attempted to Jump to a non existing block [",ent,"]") });
|
||||||
bool halt = false;
|
|
||||||
size_t pos=0;
|
|
||||||
size_t max = 0;
|
|
||||||
std::vector<cmd*> cmds;
|
|
||||||
init(chunks[ent],pos,max,cmds);
|
|
||||||
|
|
||||||
//TODO: parse the cmds and do stuff
|
|
||||||
// If this is running in a thread then stop will force this loop to stop
|
|
||||||
size_t ln = 0;
|
|
||||||
std::string temp;
|
|
||||||
while (!stop || !halt) {
|
|
||||||
c = cmds[pos++];
|
|
||||||
code = c->opcode;
|
|
||||||
//debug("(",pos,")> ",*c);
|
|
||||||
//wait();
|
|
||||||
switch (code)
|
|
||||||
{
|
|
||||||
// Handle flags here
|
|
||||||
case ENTR:
|
|
||||||
// When reading code from a file the flags are compiled and we need to load them
|
|
||||||
entry = c->args.args[0].getPrintable();
|
|
||||||
break;
|
|
||||||
case ENAB:
|
|
||||||
enable(c->args.args[0].getPrintable());
|
|
||||||
break;
|
|
||||||
case DISA:
|
|
||||||
disable(c->args.args[0].getPrintable());
|
|
||||||
break;
|
|
||||||
case codes::FILE:
|
|
||||||
cur_file = c->args.args[0].getPrintable();
|
|
||||||
case LOAD:
|
|
||||||
// Nothing needs to be done here
|
|
||||||
break;
|
|
||||||
case VERN:
|
|
||||||
Sversion = c->args.args[0].n;
|
|
||||||
// Version X.xx
|
|
||||||
// X: Will not guarantee compatibality. Code breaking changes should be expected especially on lower versions
|
|
||||||
// xx: Will not break compatibality. They may add features as it goes up the ranks, but those changes do not break older code. If they do they will increase the X part and not the xx part
|
|
||||||
if (Sversion > Iversion) {
|
|
||||||
push_error(errors::error{errors::incompatible_version ,"This script was made for a later version of this interperter!"});
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
else if ((int)Iversion > (int)(Sversion)) {
|
|
||||||
push_warning(errors::error{ errors::incompatible_version ,"This script was made for an older version of this interperter, some features might not work!" });
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case USIN:
|
|
||||||
// How we add modules into the code. This is the code that actually loads that data!
|
|
||||||
break;
|
|
||||||
// Flags handled
|
|
||||||
case EXIT:
|
|
||||||
if (c->args.args.size()) {
|
|
||||||
exitcode = (int)c->args.args[0].n;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
break;
|
|
||||||
case KNOT:
|
|
||||||
{
|
|
||||||
value cmp = c->args.args[0];
|
|
||||||
if (cmp.resolve(this).type == datatypes::boolean || cmp.resolve(this).isNil()) {
|
|
||||||
if (!cmp.resolve(this).b || cmp.resolve(this).isNil()) {
|
|
||||||
if(!assign(cmp, value(true))) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
if(!assign(cmp, value(false))) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
if(!assign(cmp, value(false))) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case IFFF:
|
|
||||||
{
|
|
||||||
value cmp = c->args.args[0].resolve(this);
|
|
||||||
value gt = c->args.args[1].resolve(this);
|
|
||||||
if (cmp.type == datatypes::boolean || cmp.isNil()) {
|
|
||||||
if (!cmp.b || cmp.isNil()) {
|
|
||||||
pos = seek(gt.getPrintable(), cmds, LABL, pos);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case GOTO:
|
|
||||||
{
|
|
||||||
value labl = c->args.args[0];
|
|
||||||
if (isEnabled("forwardlabels")) {
|
|
||||||
size_t nnpos = seek(labl.resolve(this).getPrintable(), cmds, LABL, pos); // Seek from next pos (pos++) to end of cmds
|
|
||||||
if (!nnpos) {
|
|
||||||
// This could be a method, it could, but it isn't. We jump to searching from the beginning of the block
|
|
||||||
goto seek_from_0;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
pos = nnpos;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
seek_from_0:
|
|
||||||
size_t nnpos = seek(labl.resolve(this).getPrintable(),cmds, LABL, 0);
|
|
||||||
if (!nnpos) {
|
|
||||||
push_error(errors::error{ errors::choice_unknown ,utils::concat("Unknown label '",labl.resolve(this).getPrintable(),"'!") });
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
pos = nnpos;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case RETN:
|
|
||||||
{
|
|
||||||
value ret = c->args.args[0].resolve(this);
|
|
||||||
//c->args.args[0]->nuke(); // Lets clean this up
|
|
||||||
return_stack.push(ret);
|
|
||||||
return true; // We did it, let's return this
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case OFUN:
|
|
||||||
{
|
|
||||||
if (c->args.args[0].resolve(this).type == datatypes::custom) {
|
|
||||||
auto cust = c->args.args[0].resolve(this);
|
|
||||||
auto fname = c->args.args[1].getString();
|
|
||||||
auto assn = c->args.args[2];
|
|
||||||
dms_args args;
|
|
||||||
|
|
||||||
for (int i = 3; i < c->args.args.size(); i++) {
|
|
||||||
args.push(c->args.args[i]);
|
|
||||||
}
|
|
||||||
if (inv_map.count(cust.ctype)) {
|
|
||||||
Invoker* inv = inv_map[cust.ctype];
|
|
||||||
auto ret = inv->Invoke(fname, cust.c, this, &args);
|
|
||||||
if (assn.type != datatypes::nil) {
|
|
||||||
if (!assign(assn, ret)) {
|
|
||||||
return error(ret.getString());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
error("Custom object not assoiated with any functions!");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
std::string obj = c->args.args[0].getPrintable();
|
|
||||||
if (obj == "nil") {
|
|
||||||
obj = c->args.args[0].getPrintable();
|
|
||||||
}
|
|
||||||
std::string funcname = c->args.args[1].getPrintable();
|
|
||||||
value assn = c->args.args[2];
|
|
||||||
dms_args args;
|
|
||||||
|
|
||||||
for (int i = 3; i < c->args.args.size(); i++) {
|
|
||||||
args.push(c->args.args[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
value ret;
|
|
||||||
if (characterExists(obj)) {
|
|
||||||
ret = getCharacter(obj)->Invoke(funcname, this, &args);
|
|
||||||
}
|
|
||||||
else if (environmentExists(obj)) {
|
|
||||||
ret = getEnvironment(obj)->Invoke(funcname, this, &args);
|
|
||||||
}
|
|
||||||
if (ret.type == datatypes::error)
|
|
||||||
return error(ret.getString());
|
|
||||||
if (assn.type != datatypes::nil) {
|
|
||||||
if (!assign(assn, ret)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case FUNC:
|
|
||||||
{
|
|
||||||
std::string funcname = c->args.args[0].getPrintable();
|
|
||||||
value assn = c->args.args[1];
|
|
||||||
dms_args args;
|
|
||||||
value ret;
|
|
||||||
for (int i = 2; i < c->args.args.size(); i++) {
|
|
||||||
args.push(c->args.args[i]);
|
|
||||||
}
|
|
||||||
// If we have a block made function we don't invoke like normal
|
|
||||||
if (functionExists(funcname)) {
|
|
||||||
call_stack.push(funcname);
|
|
||||||
ret = invoker.Invoke("$BlockInvoke$", this, &args);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
ret = invoker.Invoke(funcname, this, &args);
|
|
||||||
}
|
|
||||||
if (ret.type == datatypes::error)
|
|
||||||
return false;
|
|
||||||
if (assn.type != datatypes::nil) {
|
|
||||||
if(!assign(assn, ret)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case ASID:
|
|
||||||
{
|
|
||||||
value env = c->args.args[1];
|
|
||||||
value indx = c->args.args[2].resolve(this);
|
|
||||||
value assn = c->args.args[3].resolve(this);
|
|
||||||
if (env.type == datatypes::block && blockExists(env.getString())) { // If this is a block let's handle this
|
|
||||||
enviroment* e = nullptr;
|
|
||||||
if (environments.count(env.getString())) {
|
|
||||||
e = environments[env.getString()];
|
|
||||||
}
|
|
||||||
else if (characters.count(env.getString())) {
|
|
||||||
e = characters[env.getString()];
|
|
||||||
}
|
|
||||||
e->values[indx.getString()] = assn;
|
|
||||||
}
|
|
||||||
else if (env.type == datatypes::env) {
|
|
||||||
if (indx.type == datatypes::number) {
|
|
||||||
env.e->pushValue(assn);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
push_error(errors::error{ errors::invalid_type ,concat("Expected a number value got ",datatype[indx.type]) });
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (env.type == datatypes::custom) {
|
|
||||||
//env.c->NewIndex(indx, assn);
|
|
||||||
//if(!assign( assn, env->c->Index(indx));
|
|
||||||
// Call the method within the custom data
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case ADD:
|
|
||||||
{
|
|
||||||
value assn = c->args.args[0];
|
|
||||||
value o1 = c->args.args[1];
|
|
||||||
value o2 = c->args.args[2];
|
|
||||||
value ret = o1.resolve(this)+o2.resolve(this);
|
|
||||||
if(!assign(assn, ret)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case SUB:
|
|
||||||
{
|
|
||||||
value assn = c->args.args[0];
|
|
||||||
value o1 = c->args.args[1];
|
|
||||||
value o2 = c->args.args[2];
|
|
||||||
value ret = o1.resolve(this) - o2.resolve(this);
|
|
||||||
if(!assign(assn, ret)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case MUL:
|
|
||||||
{
|
|
||||||
value assn = c->args.args[0];
|
|
||||||
value o1 = c->args.args[1];
|
|
||||||
value o2 = c->args.args[2];
|
|
||||||
value ret = o1.resolve(this) * o2.resolve(this);
|
|
||||||
if(!assign(assn, ret)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case DIV:
|
|
||||||
{
|
|
||||||
value assn = c->args.args[0];
|
|
||||||
value o1 = c->args.args[1];
|
|
||||||
value o2 = c->args.args[2];
|
|
||||||
value ret = o1.resolve(this) / o2.resolve(this);
|
|
||||||
if(!assign(assn, ret)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case POW:
|
|
||||||
{
|
|
||||||
value assn = c->args.args[0];
|
|
||||||
value o1 = c->args.args[1];
|
|
||||||
value o2 = c->args.args[2];
|
|
||||||
value ret = pow(o1.resolve(this).n, o2.resolve(this).n);
|
|
||||||
if(!assign(assn, ret)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case MOD:
|
|
||||||
{
|
|
||||||
value assn = c->args.args[0];
|
|
||||||
value o1 = c->args.args[1];
|
|
||||||
value o2 = c->args.args[2];
|
|
||||||
value ret = std::fmod(o1.resolve(this).n,o2.resolve(this).n);
|
|
||||||
if(!assign(assn, ret)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case INDX:
|
|
||||||
{
|
|
||||||
value assn = c->args.args[0];
|
|
||||||
value env = c->args.args[1];
|
|
||||||
value indx = c->args.args[2].resolve(this);
|
|
||||||
if (env.type == datatypes::block && blockExists(env.getString())) { // If this is a block let's handle this
|
|
||||||
enviroment* e = nullptr;
|
|
||||||
if (environments.count(env.getString())) {
|
|
||||||
e = environments[env.getString()];
|
|
||||||
}
|
|
||||||
else if (characters.count(env.getString())) {
|
|
||||||
e = characters[env.getString()];
|
|
||||||
}
|
|
||||||
if(!assign( assn, e->values[indx.getPrintable()])) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (env.type == datatypes::env) {
|
|
||||||
if (indx.type == datatypes::number) {
|
|
||||||
if(!assign( assn, env.e->getValue(indx))) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
push_error(errors::error{ errors::invalid_type ,concat("Expected a number value got ",datatype[indx.type]) });
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (env.type == datatypes::custom) {
|
|
||||||
//if(!assign( assn, env.c->Index(indx))) {
|
|
||||||
// return false;
|
|
||||||
//}
|
|
||||||
// Call the method within the custom data
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case LIST:
|
|
||||||
//We need to create an enviroment value then set that
|
|
||||||
{
|
|
||||||
dms_list* env = new dms_list;
|
|
||||||
// Inject the size of the list
|
|
||||||
env->hpart["$size"] = c->args.args[1];
|
|
||||||
value val = new value;
|
|
||||||
val.set(env);
|
|
||||||
if(!assign(c->args.args[0], val)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case INST:
|
|
||||||
{
|
|
||||||
value list = (*mem)[c->args.args[0].getPrintable()];
|
|
||||||
list.e->pushValue(c->args.args[1]);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case COMP:
|
|
||||||
{
|
|
||||||
comp cmp = (comp)c->args.args[0].i;
|
|
||||||
value assn = c->args.args[1];
|
|
||||||
value left = c->args.args[2].resolve(this);
|
|
||||||
value right = c->args.args[3].resolve(this);
|
|
||||||
switch (cmp) {
|
|
||||||
case comp::eq: {
|
|
||||||
if(!assign(assn, left == right)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case comp::gt: {
|
|
||||||
if (left.isNil() || right.isNil()) {push_error(errors::error{ errors::unknown ,"Attempt to compare a nil value!" });return false;}
|
|
||||||
if(!assign(assn, left > right)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case comp::gteq: {
|
|
||||||
if (left.isNil() || right.isNil()) { push_error(errors::error{ errors::unknown ,"Attempt to compare a nil value!" }); return false; }
|
|
||||||
if(!assign(assn, left >= right)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case comp::lt: {
|
|
||||||
if (left.isNil() || right.isNil()) { push_error(errors::error{ errors::unknown ,"Attempt to compare a nil value!" }); return false; }
|
|
||||||
if(!assign(assn, left < right)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case comp::lteq: {
|
|
||||||
if (left.isNil() || right.isNil()) { push_error(errors::error{ errors::unknown ,"Attempt to compare a nil value!" }); return false; }
|
|
||||||
if(!assign(assn, left <= right)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case comp::nteq: {
|
|
||||||
if(!assign(assn, left != right)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case HALT:
|
|
||||||
//wait();
|
|
||||||
//sleep(700);
|
|
||||||
std::cout << std::endl;
|
|
||||||
break;
|
|
||||||
case WAIT:
|
|
||||||
sleep((int)(c->args.args[0].n*1000));
|
|
||||||
break;
|
|
||||||
case DSPD:
|
|
||||||
if (speaker == nullptr) {
|
|
||||||
push_error(errors::error{ errors::unknown ,utils::concat("A call to set speaker speed, but a speaker has not been defined!") });
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
speaker->spd = c->args.args[0].n;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case SSPK:
|
|
||||||
//Because we are using void* we must cast our pointers
|
|
||||||
if (characterExists(c->args.args[0].getString())){
|
|
||||||
speaker = getCharacter(c->args.args[0].getString());
|
|
||||||
if (!handler->handleSpeaker(this, speaker))
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
push_error(errors::error{ errors::disp_unknown,concat("Unknown character '",c->args.args[0].getString(),"'!")});
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case APND:
|
|
||||||
OnAppendText.fire(message{
|
|
||||||
speaker,
|
|
||||||
c->args.args[0].resolve(this).getPrintable()
|
|
||||||
});
|
|
||||||
//if (!handler->handleMessageAppend(this, c->args.args[0].resolve(this).getPrintable()))
|
|
||||||
// return false;
|
|
||||||
break;
|
|
||||||
case CHAR:
|
|
||||||
{
|
|
||||||
std::string cha = c->args.args[0].getString();
|
|
||||||
getCharacter(cha);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case DISP:
|
|
||||||
{
|
|
||||||
OnText.fire(message{
|
|
||||||
speaker,
|
|
||||||
c->args.args[0].resolve(this).getPrintable()
|
|
||||||
});
|
|
||||||
/*if (!handler->handleMessageDisplay(this, c->args.args[0].resolve(this).getPrintable()))
|
|
||||||
return false;*/
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case ASGN:
|
|
||||||
if(!assign(c->args.args[0], c->args.args[1])) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case LINE:
|
|
||||||
cur_line = (size_t)c->args.args[0].i;
|
|
||||||
break;
|
|
||||||
case NOOP:
|
|
||||||
break;
|
|
||||||
case CHOI:
|
|
||||||
//Because we are using void* we must cast our pointers
|
|
||||||
{
|
|
||||||
std::vector<std::string> args;
|
|
||||||
std::string prompt = c->args.args[0].getString();
|
|
||||||
std::string fn = c->args.args[1].getString();
|
|
||||||
for (size_t i = 2; i < c->args.args.size(); i++)
|
|
||||||
args.push_back(c->args.args[i].resolve(this).getString());
|
|
||||||
size_t npos = handler->handleChoice(this, prompt, args);
|
|
||||||
size_t nnpos = seek(concat("CHOI_", fn, "_", npos),cmds,LABL,pos);
|
|
||||||
if (!nnpos) {
|
|
||||||
push_error(errors::error{ errors::choice_unknown ,utils::concat("Unknown choice!") });
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
pos = nnpos;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case JUMP:
|
|
||||||
// Value assert resolves the data so a variable must eventually equal a string
|
|
||||||
if (utils::valueassert(c->args, this, datatypes::string)) {
|
|
||||||
std::string block = c->args.args[0].resolve(this).getString();
|
|
||||||
if (chunks[block] == NULL) {
|
|
||||||
push_error(errors::error{ errors::non_existing_block ,utils::concat("Attempted to Jump to a non existing block [",block,"]") });
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
else if (chunks[block]->type != bt_block) {
|
|
||||||
push_error(errors::error{ errors::non_existing_block ,utils::concat("Attempted to Jump to a non standard block [",block,"] type: ",getBlockType(chunks[block]->type))});
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
init(chunks[block], pos, max, cmds);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
//utils::print(c->args.args[0].type);
|
|
||||||
datatypes set = c->args.args[0].resolve(this).type;
|
|
||||||
//utils::print("> ",set);
|
|
||||||
push_error(errors::error{ errors::invalid_arguments, utils::concat("String expected got ",datatype[set]), true, ln });
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (pos == max) {
|
|
||||||
// How did we get here? The end of a block?
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
pushStateData();
|
||||||
|
pushMem(mem);
|
||||||
|
init(chunks[ent], n_pos, n_max, n_cmds);
|
||||||
|
bool working = true;
|
||||||
|
while (working) {
|
||||||
|
working = next(mem);
|
||||||
|
}
|
||||||
|
popMem();
|
||||||
|
popStateData();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
bool dms_state::next(memory* mem) {
|
bool dms_state::next(memory* mem) {
|
||||||
@ -661,7 +154,7 @@ namespace dms {
|
|||||||
init(chunks["$INIT"], n_pos, n_max, n_cmds);
|
init(chunks["$INIT"], n_pos, n_max, n_cmds);
|
||||||
n_c = n_cmds[n_pos++];
|
n_c = n_cmds[n_pos++];
|
||||||
n_code = n_c->opcode;
|
n_code = n_c->opcode;
|
||||||
//debug("(",pos,")> ",*c);
|
//debug("(",n_pos,")> ",*n_c);
|
||||||
//wait();
|
//wait();
|
||||||
switch (n_code)
|
switch (n_code)
|
||||||
{
|
{
|
||||||
|
|||||||
BIN
DMS/dump.bin
BIN
DMS/dump.bin
Binary file not shown.
204
DMS/dump.txt
204
DMS/dump.txt
@ -23,6 +23,9 @@ Line <6> newline
|
|||||||
Line <7> newline
|
Line <7> newline
|
||||||
Line <8> newline
|
Line <8> newline
|
||||||
Line <9> newline
|
Line <9> newline
|
||||||
|
Line <10> flag
|
||||||
|
Line <10> string loadtest.dms
|
||||||
|
Line <10> newline
|
||||||
Line <10> newline
|
Line <10> newline
|
||||||
Line <11> flag
|
Line <11> flag
|
||||||
Line <11> number 0.2
|
Line <11> number 0.2
|
||||||
@ -37,6 +40,8 @@ Line <14> newline
|
|||||||
Line <14> newline
|
Line <14> newline
|
||||||
Line <15> name music2
|
Line <15> name music2
|
||||||
Line <15> equal =
|
Line <15> equal =
|
||||||
|
Line <15> name audio
|
||||||
|
Line <15> dot dot
|
||||||
Line <15> name loadMusic
|
Line <15> name loadMusic
|
||||||
Line <15> parao (
|
Line <15> parao (
|
||||||
Line <15> string test2.ogg
|
Line <15> string test2.ogg
|
||||||
@ -45,6 +50,8 @@ Line <15> newline
|
|||||||
Line <15> newline
|
Line <15> newline
|
||||||
Line <16> name music
|
Line <16> name music
|
||||||
Line <16> equal =
|
Line <16> equal =
|
||||||
|
Line <16> name audio
|
||||||
|
Line <16> dot .
|
||||||
Line <16> name loadMusic
|
Line <16> name loadMusic
|
||||||
Line <16> parao (
|
Line <16> parao (
|
||||||
Line <16> string test.ogg
|
Line <16> string test.ogg
|
||||||
@ -59,67 +66,94 @@ Line <18> bracketc ]
|
|||||||
Line <18> newline
|
Line <18> newline
|
||||||
Line <18> newline
|
Line <18> newline
|
||||||
Line <19> newline
|
Line <19> newline
|
||||||
|
Line <20> name music2
|
||||||
|
Line <20> dot dot
|
||||||
|
Line <20> name play
|
||||||
|
Line <20> parao (
|
||||||
|
Line <20> parac )
|
||||||
Line <20> newline
|
Line <20> newline
|
||||||
|
Line <20> newline
|
||||||
|
Line <21> name music2
|
||||||
|
Line <21> dot dot
|
||||||
|
Line <21> name setVolume
|
||||||
|
Line <21> parao (
|
||||||
|
Line <21> number 50
|
||||||
|
Line <21> parac )
|
||||||
Line <21> newline
|
Line <21> newline
|
||||||
|
Line <21> newline
|
||||||
|
Line <22> name Ryan
|
||||||
|
Line <22> colon :
|
||||||
|
Line <22> string Hello how are you?
|
||||||
Line <22> newline
|
Line <22> newline
|
||||||
|
Line <22> newline
|
||||||
|
Line <23> name Bob
|
||||||
|
Line <23> colon :
|
||||||
|
Line <23> string Slot 3 =
|
||||||
|
Line <23> plus +
|
||||||
|
Line <23> name testINV
|
||||||
|
Line <23> bracketo [
|
||||||
|
Line <23> string slot3
|
||||||
|
Line <23> bracketc ]
|
||||||
|
Line <23> newline
|
||||||
Line <23> newline
|
Line <23> newline
|
||||||
Line <24> name wait
|
|
||||||
Line <24> number 1
|
|
||||||
Line <24> newline
|
Line <24> newline
|
||||||
Line <24> newline
|
Line <24> newline
|
||||||
Line <25> name setBG
|
|
||||||
Line <25> parao (
|
|
||||||
Line <25> string background2.jpg
|
|
||||||
Line <25> parac )
|
|
||||||
Line <25> newline
|
|
||||||
Line <25> newline
|
Line <25> newline
|
||||||
|
Line <26> name wait
|
||||||
|
Line <26> number 5
|
||||||
Line <26> newline
|
Line <26> newline
|
||||||
Line <26> newline
|
Line <26> newline
|
||||||
Line <27> name Ryan
|
Line <27> name setBG
|
||||||
Line <27> colon :
|
Line <27> parao (
|
||||||
Line <27> string Hello how are you?
|
Line <27> string background2.jpg
|
||||||
|
Line <27> parac )
|
||||||
Line <27> newline
|
Line <27> newline
|
||||||
Line <27> newline
|
Line <27> newline
|
||||||
Line <28> name wait
|
|
||||||
Line <28> number 2
|
|
||||||
Line <28> newline
|
Line <28> newline
|
||||||
Line <28> newline
|
Line <28> newline
|
||||||
Line <29> name Bob
|
Line <29> name Ryan
|
||||||
Line <29> colon :
|
Line <29> colon :
|
||||||
Line <29> string I'm good how are you?
|
Line <29> string Hello how are you?
|
||||||
Line <29> newline
|
Line <29> newline
|
||||||
Line <29> newline
|
Line <29> newline
|
||||||
Line <30> name wait
|
Line <30> name wait
|
||||||
Line <30> number 2
|
Line <30> number 3
|
||||||
Line <30> newline
|
Line <30> newline
|
||||||
Line <30> newline
|
Line <30> newline
|
||||||
Line <31> name Ryan
|
Line <31> name Bob
|
||||||
Line <31> colon :
|
Line <31> colon :
|
||||||
Line <31> string I am great :D
|
Line <31> string I'm good how are you?
|
||||||
Line <31> newline
|
Line <31> newline
|
||||||
Line <31> newline
|
Line <31> newline
|
||||||
|
Line <32> name wait
|
||||||
|
Line <32> number 3
|
||||||
Line <32> newline
|
Line <32> newline
|
||||||
Line <32> newline
|
Line <32> newline
|
||||||
Line <33> name a
|
Line <33> name Ryan
|
||||||
Line <33> equal =
|
Line <33> colon :
|
||||||
Line <33> number 0
|
Line <33> string I am great :D
|
||||||
Line <33> newline
|
Line <33> newline
|
||||||
Line <33> newline
|
Line <33> newline
|
||||||
Line <34> newline
|
Line <34> newline
|
||||||
Line <35> name while
|
Line <34> newline
|
||||||
Line <35> parao (
|
Line <35> name a
|
||||||
Line <35> true true
|
Line <35> equal =
|
||||||
Line <35> parac )
|
Line <35> number 0
|
||||||
Line <35> cbracketo {
|
|
||||||
Line <35> newline
|
Line <35> newline
|
||||||
Line <35> newline
|
Line <35> newline
|
||||||
Line <36> name a
|
|
||||||
Line <36> equal =
|
|
||||||
Line <36> name a
|
|
||||||
Line <36> plus +
|
|
||||||
Line <36> number 1
|
|
||||||
Line <36> newline
|
|
||||||
Line <36> newline
|
Line <36> newline
|
||||||
|
Line <37> name while
|
||||||
|
Line <37> parao (
|
||||||
|
Line <37> name music2
|
||||||
|
Line <37> dot dot
|
||||||
|
Line <37> name getStatus
|
||||||
|
Line <37> parao (
|
||||||
|
Line <37> parac )
|
||||||
|
Line <37> not !
|
||||||
|
Line <37> equal =
|
||||||
|
Line <37> string stopped
|
||||||
|
Line <37> parac )
|
||||||
|
Line <37> cbracketo {
|
||||||
Line <37> cbracketc }
|
Line <37> cbracketc }
|
||||||
Line <37> newline
|
Line <37> newline
|
||||||
Line <37> newline
|
Line <37> newline
|
||||||
@ -390,3 +424,111 @@ Line <106> string path/to/file
|
|||||||
Line <106> newline
|
Line <106> newline
|
||||||
Line <106> newline
|
Line <106> newline
|
||||||
Line <106> eof
|
Line <106> eof
|
||||||
|
Line <1> newline
|
||||||
|
Line <1> newline
|
||||||
|
Line <1> bracketo [
|
||||||
|
Line <1> name default
|
||||||
|
Line <1> colon :
|
||||||
|
Line <1> name char
|
||||||
|
Line <1> bracketc ]
|
||||||
|
Line <1> newline
|
||||||
|
Line <1> newline
|
||||||
|
Line <2> newline
|
||||||
|
Line <3> name money
|
||||||
|
Line <3> equal =
|
||||||
|
Line <3> number 0
|
||||||
|
Line <3> newline
|
||||||
|
Line <3> newline
|
||||||
|
Line <4> name test
|
||||||
|
Line <4> equal =
|
||||||
|
Line <4> nil nil
|
||||||
|
Line <4> newline
|
||||||
|
Line <4> newline
|
||||||
|
Line <5> newline
|
||||||
|
Line <5> newline
|
||||||
|
Line <6> bracketo [
|
||||||
|
Line <6> name step
|
||||||
|
Line <6> colon :
|
||||||
|
Line <6> name function
|
||||||
|
Line <6> parao (
|
||||||
|
Line <6> name a
|
||||||
|
Line <6> seperator ,
|
||||||
|
Line <6> name b
|
||||||
|
Line <6> seperator ,
|
||||||
|
Line <6> name c
|
||||||
|
Line <6> parac )
|
||||||
|
Line <6> bracketc ]
|
||||||
|
Line <6> newline
|
||||||
|
Line <6> newline
|
||||||
|
Line <7> string Testing...
|
||||||
|
Line <7> newline
|
||||||
|
Line <8> newline
|
||||||
|
Line <9> name e
|
||||||
|
Line <9> equal =
|
||||||
|
Line <9> string somestring
|
||||||
|
Line <9> newline
|
||||||
|
Line <9> newline
|
||||||
|
Line <10> name e
|
||||||
|
Line <10> equal =
|
||||||
|
Line <10> nil nil
|
||||||
|
Line <10> newline
|
||||||
|
Line <10> newline
|
||||||
|
Line <11> name g
|
||||||
|
Line <11> equal =
|
||||||
|
Line <11> false false
|
||||||
|
Line <11> newline
|
||||||
|
Line <11> newline
|
||||||
|
Line <12> ret
|
||||||
|
Line <12> name d
|
||||||
|
Line <12> newline
|
||||||
|
Line <12> newline
|
||||||
|
Line <13> newline
|
||||||
|
Line <13> newline
|
||||||
|
Line <14> bracketo [
|
||||||
|
Line <14> name testINV
|
||||||
|
Line <14> colon :
|
||||||
|
Line <14> name env
|
||||||
|
Line <14> bracketc ]
|
||||||
|
Line <14> newline
|
||||||
|
Line <14> newline
|
||||||
|
Line <15> name slot1
|
||||||
|
Line <15> equal =
|
||||||
|
Line <15> string S1
|
||||||
|
Line <15> newline
|
||||||
|
Line <15> newline
|
||||||
|
Line <16> name slot2
|
||||||
|
Line <16> equal =
|
||||||
|
Line <16> string S2
|
||||||
|
Line <16> newline
|
||||||
|
Line <16> newline
|
||||||
|
Line <17> name slot3
|
||||||
|
Line <17> equal =
|
||||||
|
Line <17> string S3
|
||||||
|
Line <17> newline
|
||||||
|
Line <17> newline
|
||||||
|
Line <18> name slot4
|
||||||
|
Line <18> equal =
|
||||||
|
Line <18> string S4
|
||||||
|
Line <18> newline
|
||||||
|
Line <18> newline
|
||||||
|
Line <19> name slot5
|
||||||
|
Line <19> equal =
|
||||||
|
Line <19> string S5
|
||||||
|
Line <19> newline
|
||||||
|
Line <19> newline
|
||||||
|
Line <20> name slot6
|
||||||
|
Line <20> equal =
|
||||||
|
Line <20> string S6
|
||||||
|
Line <20> newline
|
||||||
|
Line <20> newline
|
||||||
|
Line <21> name slot7
|
||||||
|
Line <21> equal =
|
||||||
|
Line <21> string S7
|
||||||
|
Line <21> newline
|
||||||
|
Line <21> newline
|
||||||
|
Line <22> name slot8
|
||||||
|
Line <22> equal =
|
||||||
|
Line <22> string S8
|
||||||
|
Line <22> newline
|
||||||
|
Line <22> newline
|
||||||
|
Line <22> eof
|
||||||
|
|||||||
@ -11,7 +11,7 @@
|
|||||||
g = false
|
g = false
|
||||||
return d
|
return d
|
||||||
|
|
||||||
[inv:env]
|
[testINV:env]
|
||||||
slot1 = "S1"
|
slot1 = "S1"
|
||||||
slot2 = "S2"
|
slot2 = "S2"
|
||||||
slot3 = "S3"
|
slot3 = "S3"
|
||||||
|
|||||||
@ -9,8 +9,8 @@
|
|||||||
//music.play();
|
//music.play();
|
||||||
|
|
||||||
namespace dms::audio {
|
namespace dms::audio {
|
||||||
value play(void* self, dms_state* state, dms_args* args) {
|
|
||||||
// Self, since it is a custom object will be equal to whatever we declared to the c pointer!
|
// Self, since it is a custom object will be equal to whatever we declared to the c pointer!
|
||||||
|
value play(void* self, dms_state* state, dms_args* args) {
|
||||||
sf::Music* music = (sf::Music*)self;
|
sf::Music* music = (sf::Music*)self;
|
||||||
music->play();
|
music->play();
|
||||||
return value();
|
return value();
|
||||||
@ -73,8 +73,12 @@ namespace dms::audio {
|
|||||||
inv->registerFunction("setVolume", setVolume);
|
inv->registerFunction("setVolume", setVolume);
|
||||||
inv->registerFunction("getStatus", getStatus);
|
inv->registerFunction("getStatus", getStatus);
|
||||||
|
|
||||||
|
auto* env = new enviroment;
|
||||||
|
env->registerFunction("loadMusic", loadMusic);
|
||||||
state->assoiateType("audiostream",inv);
|
state->assoiateType("audiostream",inv);
|
||||||
state->invoker.registerFunction("loadMusic", loadMusic);
|
state->injectEnv("audio",env);
|
||||||
|
|
||||||
|
//state->invoker.registerFunction("loadMusic", loadMusic);
|
||||||
}
|
}
|
||||||
|
|
||||||
value loadMusic(void* self, dms_state* state, dms_args* args)
|
value loadMusic(void* self, dms_state* state, dms_args* args)
|
||||||
|
|||||||
24
DMS/test.dms
24
DMS/test.dms
@ -7,34 +7,34 @@ enable savestate
|
|||||||
//loadfile "Ryan.dms"
|
//loadfile "Ryan.dms"
|
||||||
//enable leaking
|
//enable leaking
|
||||||
//enable debugging
|
//enable debugging
|
||||||
//loadfile "loadtest.dms"
|
loadfile "loadtest.dms"
|
||||||
version 0.2
|
version 0.2
|
||||||
using extendedDefine
|
using extendedDefine
|
||||||
// this code will reside within
|
// this code will reside within
|
||||||
|
|
||||||
music2 = loadMusic("test2.ogg")
|
music2 = audio.loadMusic("test2.ogg")
|
||||||
music = loadMusic("test.ogg")
|
music = audio.loadMusic("test.ogg")
|
||||||
|
|
||||||
[main]
|
[main]
|
||||||
// Let's extend the base feature set
|
// Let's extend the base feature set
|
||||||
//music.play()
|
music2.play()
|
||||||
//music.setVolume(50)
|
music2.setVolume(50)
|
||||||
//while(music.getStatus()!="stopped"){}
|
Ryan: "Hello how are you?"
|
||||||
|
Bob: "Slot 3 = " + testINV["slot3"]
|
||||||
|
|
||||||
//print("Sound finished!")
|
//print("Sound finished!")
|
||||||
wait 1
|
wait 5
|
||||||
setBG("background2.jpg")
|
setBG("background2.jpg")
|
||||||
|
|
||||||
Ryan: "Hello how are you?"
|
Ryan: "Hello how are you?"
|
||||||
wait 2
|
wait 3
|
||||||
Bob: "I'm good how are you?"
|
Bob: "I'm good how are you?"
|
||||||
wait 2
|
wait 3
|
||||||
Ryan: "I am great :D"
|
Ryan: "I am great :D"
|
||||||
|
|
||||||
a=0
|
a=0
|
||||||
// {} Still errors out, this needs to be fixed!!!
|
// {} Still errors out, this needs to be fixed!!!
|
||||||
while(true){
|
while(music2.getStatus()!="stopped"){}
|
||||||
a=a+1
|
|
||||||
}
|
|
||||||
// a = 0
|
// a = 0
|
||||||
// while (true){
|
// while (true){
|
||||||
// asm {
|
// asm {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user