From ef9895de5629d0e6730a6eca86d451b92f9606a1 Mon Sep 17 00:00:00 2001 From: Ryan Ward Date: Sun, 25 Apr 2021 21:16:25 -0400 Subject: [PATCH] Fixed stack related bugs, moved loadMusic into audio namespace --- DMS/dms_state.cpp | 28 +- DMS/dms_state.h | 18 +- DMS/dms_state_interpret.cpp | 539 ++---------------------------------- DMS/dump.bin | Bin 2029 -> 2711 bytes DMS/dump.txt | 204 +++++++++++--- DMS/loadtest.dms | 2 +- DMS/sound.cpp | 8 +- DMS/test.dms | 24 +- 8 files changed, 247 insertions(+), 576 deletions(-) diff --git a/DMS/dms_state.cpp b/DMS/dms_state.cpp index 52ebff1..c50a5c6 100644 --- a/DMS/dms_state.cpp +++ b/DMS/dms_state.cpp @@ -53,6 +53,9 @@ namespace dms { c->args.push(value(key)); chunks["$INIT"]->addCmd(c); } + else { + getEnvironment(key); + } c = new cmd; } else if (val->type == bt_method) { @@ -74,22 +77,39 @@ namespace dms { stop = true; } memory* dms_state::getMem() { - return &mem_stack.top(); + return mem_stack.top(); } void dms_state::pushMem() { - memory mem = memory(); + memory* mem = new memory; if (!mem_stack.empty()) { - mem.parent = getMem(); + mem->parent = getMem(); } mem_stack.push(mem); } - void dms_state::pushMem(memory &mem) { + void dms_state::pushMem(memory* mem) { mem_stack.push(mem); } void dms_state::popMem() { 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() { // We should define the defaults for the enables pushMem(); // Main memory diff --git a/DMS/dms_state.h b/DMS/dms_state.h index 63fa78f..026126f 100644 --- a/DMS/dms_state.h +++ b/DMS/dms_state.h @@ -15,6 +15,16 @@ namespace dms { character* chara; std::string text; }; + struct statedata { + codes::op code; + cmd* c = nullptr; + bool halt = false; + size_t pos = 0; + size_t max = 0; + std::vector cmds; + size_t ln = 0; + std::string temp; + }; struct Handler; value blockInvoke(void*, dms_state*, dms_args*); struct dms_state @@ -25,8 +35,8 @@ namespace dms { Invoker invoker; std::stack call_stack; std::stack return_stack; - std::stack mem_stack; - std::vector garbage; + std::stack mem_stack; + std::stack statedata_stack; std::unordered_map chunks; std::unordered_map characters; std::unordered_map environments; @@ -73,6 +83,8 @@ namespace dms { memory* getMem(); void pushMem(); void popMem(); + void pushStateData(); + void popStateData(); bool run(); bool next(memory* mem); bool run(std::string ent,memory* mem); @@ -99,7 +111,7 @@ namespace dms { size_t n_ln = 0; std::string n_temp; // - void pushMem(memory&); + void pushMem(memory*); bool stop = false; bool init_init = false; void init(chunk* chunk, size_t &pos,size_t &max, std::vector& cmds); diff --git a/DMS/dms_state_interpret.cpp b/DMS/dms_state_interpret.cpp index bf7faf3..c77de78 100644 --- a/DMS/dms_state_interpret.cpp +++ b/DMS/dms_state_interpret.cpp @@ -17,8 +17,8 @@ namespace dms { else { if (blockExists(env)) { enviroment* e = new enviroment; - if (!run(env, &e->values)) { - return nullptr; + if (run(env, &e->values)) { + std::cout << "Ran :D" << std::endl; } environments.insert_or_assign(env, e); handler->OnEnviromentCreated(this, e); @@ -131,527 +131,20 @@ namespace dms { exitcode = 1; return false; } - codes::op code; - cmd* c = nullptr; - bool halt = false; - size_t pos=0; - size_t max = 0; - std::vector 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; - } - 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 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; - } + if (chunks[ent] == NULL) { + push_error(errors::error{ errors::non_existing_block ,utils::concat("Attempted to Jump to a non existing block [",ent,"]") }); + return false; } - + + pushStateData(); + pushMem(mem); + init(chunks[ent], n_pos, n_max, n_cmds); + bool working = true; + while (working) { + working = next(mem); + } + popMem(); + popStateData(); return true; } bool dms_state::next(memory* mem) { @@ -661,7 +154,7 @@ namespace dms { init(chunks["$INIT"], n_pos, n_max, n_cmds); n_c = n_cmds[n_pos++]; n_code = n_c->opcode; - //debug("(",pos,")> ",*c); + //debug("(",n_pos,")> ",*n_c); //wait(); switch (n_code) { diff --git a/DMS/dump.bin b/DMS/dump.bin index dac9ba1240800bd90bd88d1fcb39710e8c7a3c9c..6115cdcbbbe643be8d536ff1e743e39fe6a6867a 100644 GIT binary patch delta 885 zcmZ{jO^ee|6o%WRiD@9X5=B9eFycnaG-=w7(nZ?zYo^oGN#;9()-#!Yjo!;>nlxUd*mpUkm z(7%D=JP1Kk^Oc0qlQ>*PBrS{PF8d*vE7zSIfYOdHuwgj1&p_EROej;5(Bb$5cAR#*nesbJrGQM!ht)W;5_X< zu&=_~qQU+OZ}4|d?5^I?4-0-=e)t)oF7@d$!H?D&SnfE76A%slx|cFJq48otro4IB z>-Ex-d^+f!8_j*fao_PAK;oWfr;M!jh?A{mrD|$>)Hwio<3IsK9b3~4xfxY7pt?3> zy);KUB0Y}`M5%3CRSi)suQCytIrNIwk=1jIa?cxi)I`)|zs1i_QltFkG>Ab7V}E+c zqk!92>+DPE`LjAs|6h%+v!A7>wtlx_cJbQ;WV=tvmA?!rl(PrCgn@Mg^5&g2q!;Y5 z^pXkEqt*T~UXL94!JLnsS-Mf8rN-9MD4vrW5O=qL50E7|YfLD?P>5Afd{8bxxkU9k zVzP(oU_Pr newline Line <7> newline Line <8> newline Line <9> newline +Line <10> flag +Line <10> string loadtest.dms +Line <10> newline Line <10> newline Line <11> flag Line <11> number 0.2 @@ -37,6 +40,8 @@ Line <14> newline Line <14> newline Line <15> name music2 Line <15> equal = +Line <15> name audio +Line <15> dot dot Line <15> name loadMusic Line <15> parao ( Line <15> string test2.ogg @@ -45,6 +50,8 @@ Line <15> newline Line <15> newline Line <16> name music Line <16> equal = +Line <16> name audio +Line <16> dot . Line <16> name loadMusic Line <16> parao ( Line <16> string test.ogg @@ -59,67 +66,94 @@ Line <18> bracketc ] Line <18> newline Line <18> 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 <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 <22> name Ryan +Line <22> colon : +Line <22> string Hello how are you? 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 <24> name wait -Line <24> number 1 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 <26> name wait +Line <26> number 5 Line <26> newline Line <26> newline -Line <27> name Ryan -Line <27> colon : -Line <27> string Hello how are you? +Line <27> name setBG +Line <27> parao ( +Line <27> string background2.jpg +Line <27> parac ) Line <27> newline Line <27> newline -Line <28> name wait -Line <28> number 2 Line <28> newline Line <28> newline -Line <29> name Bob +Line <29> name Ryan 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 <30> name wait -Line <30> number 2 +Line <30> number 3 Line <30> newline Line <30> newline -Line <31> name Ryan +Line <31> name Bob 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 <32> name wait +Line <32> number 3 Line <32> newline Line <32> newline -Line <33> name a -Line <33> equal = -Line <33> number 0 +Line <33> name Ryan +Line <33> colon : +Line <33> string I am great :D Line <33> newline Line <33> newline Line <34> newline -Line <35> name while -Line <35> parao ( -Line <35> true true -Line <35> parac ) -Line <35> cbracketo { +Line <34> newline +Line <35> name a +Line <35> equal = +Line <35> number 0 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 <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> newline Line <37> newline @@ -390,3 +424,111 @@ Line <106> string path/to/file Line <106> newline Line <106> newline 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 diff --git a/DMS/loadtest.dms b/DMS/loadtest.dms index 0d86e8e..6b80838 100644 --- a/DMS/loadtest.dms +++ b/DMS/loadtest.dms @@ -11,7 +11,7 @@ g = false return d -[inv:env] +[testINV:env] slot1 = "S1" slot2 = "S2" slot3 = "S3" diff --git a/DMS/sound.cpp b/DMS/sound.cpp index cdcc6c5..5f1f670 100644 --- a/DMS/sound.cpp +++ b/DMS/sound.cpp @@ -9,8 +9,8 @@ //music.play(); namespace dms::audio { + // 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) { - // Self, since it is a custom object will be equal to whatever we declared to the c pointer! sf::Music* music = (sf::Music*)self; music->play(); return value(); @@ -73,8 +73,12 @@ namespace dms::audio { inv->registerFunction("setVolume", setVolume); inv->registerFunction("getStatus", getStatus); + auto* env = new enviroment; + env->registerFunction("loadMusic", loadMusic); 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) diff --git a/DMS/test.dms b/DMS/test.dms index 318a48e..b100053 100644 --- a/DMS/test.dms +++ b/DMS/test.dms @@ -7,34 +7,34 @@ enable savestate //loadfile "Ryan.dms" //enable leaking //enable debugging -//loadfile "loadtest.dms" +loadfile "loadtest.dms" version 0.2 using extendedDefine // this code will reside within -music2 = loadMusic("test2.ogg") -music = loadMusic("test.ogg") +music2 = audio.loadMusic("test2.ogg") +music = audio.loadMusic("test.ogg") [main] // Let's extend the base feature set - //music.play() - //music.setVolume(50) - //while(music.getStatus()!="stopped"){} + music2.play() + music2.setVolume(50) + Ryan: "Hello how are you?" + Bob: "Slot 3 = " + testINV["slot3"] + //print("Sound finished!") - wait 1 + wait 5 setBG("background2.jpg") Ryan: "Hello how are you?" - wait 2 + wait 3 Bob: "I'm good how are you?" - wait 2 + wait 3 Ryan: "I am great :D" a=0 // {} Still errors out, this needs to be fixed!!! - while(true){ - a=a+1 - } + while(music2.getStatus()!="stopped"){} // a = 0 // while (true){ // asm {