Fixed stack related bugs, moved loadMusic into audio namespace

This commit is contained in:
Ryan Ward 2021-04-25 21:16:25 -04:00
parent cc395b425e
commit ef9895de56
8 changed files with 247 additions and 576 deletions

View File

@ -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

View File

@ -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);

View File

@ -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!"});
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;
}
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)
{

Binary file not shown.

View File

@ -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

View File

@ -11,7 +11,7 @@
g = false
return d
[inv:env]
[testINV:env]
slot1 = "S1"
slot2 = "S2"
slot3 = "S3"

View File

@ -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)

View File

@ -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 {