Index: exec.c ================================================================== --- exec.c +++ exec.c @@ -46,10 +46,11 @@ static Value vstack[VSTACKSIZE]; static int vstackptr; static const char*traceprefix; static Uint8 current_key; static Value quiz_obj; +static Value traced_obj; #define Throw(x) (my_error=(x),longjmp(my_env,1)) #define StackReq(x,y) do{ if(vstackptr<(x)) Throw("Stack underflow"); if(vstackptr-(x)+(y)>=VSTACKSIZE) Throw("Stack overflow"); }while(0) #define Push(x) (vstack[vstackptr++]=(x)) #define Pop() (vstack[--vstackptr]) @@ -156,10 +157,14 @@ #define animfree free void objtrash(Uint32 n) { Object*o=objects[n]; if(!o) return; + if(n==traced_obj.u && o->generation==traced_obj.t && main_options['t'] && !main_options['e']) { + printf("# Object traced at (%d,%d)\n",o->x,o->y); + Throw("Object traced"); + } animfree(o->anim); if(o->down==VOIDLINK) playfield[o->x+o->y*64-65]=o->up; else objects[o->down]->up=o->up; if(o->up!=VOIDLINK) objects[o->up]->down=o->down; if(!(o->oflags&OF_DESTROYED)) { @@ -448,11 +453,11 @@ if(v.t==TY_NUMBER) { if(v.u) Throw("Cannot convert non-zero number to object"); return VOIDLINK; } else if(v.t>TY_MAXTYPE) { if(v.u>=nobjects || !objects[v.u] || objects[v.u]->generation!=v.t) { - if(main_options['t']) printf("Object %lu in generation %lu does not exist\n",(long)v.u,(long)v.t); + if(main_options['t']) printf("[Object %lu in generation %lu does not exist]\n",(long)v.u,(long)v.t); Throw("Attempt to use a nonexistent object"); } return v.u; } else { Throw("Cannot convert non-object to object"); @@ -1673,11 +1678,24 @@ return 0; } const char*init_level(void) { if(setjmp(my_env)) return my_error; - if(main_options['t']) printf("[Level %d restarted]\n",level_id); + if(main_options['t']) { + printf("[Level %d restarted]\n",level_id); + if(!traced_obj.t) { + const char*s; + optionquery[1]=Q_traceObject; + if(s=xrm_get_resource(resourcedb,optionquery,optionquery,2)) { + traced_obj.u=strtol(s,(char**)&s,10); + if(*s==':') traced_obj.t=strtol(s+1,0,10); + printf("Tracing object <%ld:%ld>\n",(long)traced_obj.u,(long)traced_obj.t); + } else { + traced_obj.t=TY_FOR; + } + } + } memcpy(globals,initglobals,sizeof(globals)); quiz_obj=NVALUE(0); gameover=0; changed=0; key_ignored=0; Index: quarks ================================================================== --- quarks +++ quarks @@ -212,6 +212,7 @@ level tracePrefix stackProtection maxObjects traceAll +traceObject Index: quarks.h ================================================================== --- quarks.h +++ quarks.h @@ -177,10 +177,11 @@ #define Q_level 178 #define Q_tracePrefix 179 #define Q_stackProtection 180 #define Q_maxObjects 181 #define Q_traceAll 182 +#define Q_traceObject 183 static const char*const global_quarks[]={ "screenWidth", "screenHeight", "margin", "palette", @@ -359,10 +360,11 @@ "level", "tracePrefix", "stackProtection", "maxObjects", "traceAll", + "traceObject", 0}; #ifdef HEROMESH_BINDINGS static const SDLKey quark_to_key[Q_undo+1-Q_backspace]={ SDLK_BACKSPACE, SDLK_TAB,