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));
|
||||
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
|
||||
|
||||
@ -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<cmd*> 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<std::string> call_stack;
|
||||
std::stack<value> return_stack;
|
||||
std::stack<memory> mem_stack;
|
||||
std::vector<value*> garbage;
|
||||
std::stack<memory*> mem_stack;
|
||||
std::stack<statedata> statedata_stack;
|
||||
std::unordered_map<std::string, chunk*> chunks;
|
||||
std::unordered_map<std::string, character*> characters;
|
||||
std::unordered_map<std::string, enviroment*> 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<cmd*>& cmds);
|
||||
|
||||
@ -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<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!"});
|
||||
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;
|
||||
}
|
||||
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;
|
||||
}
|
||||
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)
|
||||
{
|
||||
|
||||
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 <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
|
||||
|
||||
@ -11,7 +11,7 @@
|
||||
g = false
|
||||
return d
|
||||
|
||||
[inv:env]
|
||||
[testINV:env]
|
||||
slot1 = "S1"
|
||||
slot2 = "S2"
|
||||
slot3 = "S3"
|
||||
|
||||
@ -9,8 +9,8 @@
|
||||
//music.play();
|
||||
|
||||
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!
|
||||
value play(void* self, dms_state* state, dms_args* args) {
|
||||
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)
|
||||
|
||||
24
DMS/test.dms
24
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 {
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user