Overview
Comment: | Add some corrected dealing with destroyed objects and other corrections in exec.c |
---|---|
Downloads: | Tarball | ZIP archive | SQL archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA1: |
35eb3bec31032f60c509c2fdc8d421f9 |
User & Date: | user on 2020-12-06 21:50:22 |
Other Links: | manifest | tags |
Context
2020-12-08
| ||
03:53 | Add a few structures and stuff related to animation; not complete check-in: 8d8bcb34ca user: user tags: trunk | |
2020-12-06
| ||
21:50 | Add some corrected dealing with destroyed objects and other corrections in exec.c check-in: 35eb3bec31 user: user tags: trunk | |
2020-12-05
| ||
22:29 | Add a few of the things necessary to implement timers, for animation. check-in: 3ec62d29f5 user: user tags: trunk | |
Changes
Modified exec.c from [50874cfa56] to [ef4de5943d].
︙ | ︙ | |||
47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 | static const char*traceprefix; static Uint8 current_key; #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]) static Value send_message(Uint32 from,Uint32 to,Uint16 msg,Value arg1,Value arg2,Value arg3); static Uint32 broadcast(Uint32 from,int c,Uint16 msg,Value arg1,Value arg2,Value arg3,int s); const char*value_string_ptr(Value v) { switch(v.t) { case TY_STRING: return stringpool[v.u]; //TODO: Level strings | > > > > | | 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 | static const char*traceprefix; static Uint8 current_key; #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]) // For arrival/departure masks #define Xbit(a) ((a)%5-2) #define Ybit(a) (2-(a)/5) static Value send_message(Uint32 from,Uint32 to,Uint16 msg,Value arg1,Value arg2,Value arg3); static Uint32 broadcast(Uint32 from,int c,Uint16 msg,Value arg1,Value arg2,Value arg3,int s); const char*value_string_ptr(Value v) { switch(v.t) { case TY_STRING: return stringpool[v.u]; //TODO: Level strings default: fatal("Internal confusion: Trying to get string pointer for a non-string\n"); } } void pfunlink(Uint32 n) { Object*o=objects[n]; if(o->down==VOIDLINK) playfield[o->x+o->y*64-65]=o->up; else objects[o->down]->up=o->up; |
︙ | ︙ | |||
148 149 150 151 152 153 154 | if(!o) return; 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; o->down=o->up=VOIDLINK; if(firstobj==n) firstobj=o->next; if(lastobj==n) lastobj=o->prev; | | | | 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 | if(!o) return; 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; o->down=o->up=VOIDLINK; if(firstobj==n) firstobj=o->next; if(lastobj==n) lastobj=o->prev; if(o->prev!=VOIDLINK) objects[o->prev]->next=o->next; if(o->next!=VOIDLINK) objects[o->next]->prev=o->prev; free(o); objects[n]=0; generation_number_inc=1; } static Uint32 obj_above(Uint32 i) { Object*o; |
︙ | ︙ | |||
231 232 233 234 235 236 237 238 239 240 241 242 243 244 | return x.s>y.s; } static inline int v_unsigned_greater(Value x,Value y) { if(x.t!=TY_NUMBER || y.t!=TY_NUMBER) Throw("Type mismatch"); return x.u>y.u; } static void trace_stack(Uint32 obj) { Value t2=Pop(); Value t1=Pop(); Value t0=Pop(); Object*o; if(!main_options['t']) return; | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 | return x.s>y.s; } static inline int v_unsigned_greater(Value x,Value y) { if(x.t!=TY_NUMBER || y.t!=TY_NUMBER) Throw("Type mismatch"); return x.u>y.u; } static Value destroy(Uint32 from,Uint32 to,Uint32 why) { Object*o; Value v; int i,x,y,xx,yy; Uint32 n; if(n==VOIDLINK) return NVALUE(0); o=objects[to]; // Not checking if it is already destroyed, since EKS Hero Mesh doesn't check. v=send_message(from,to,MSG_DESTROY,NVALUE(0),NVALUE(0),NVALUE(why)); if(!v_bool(v)) { o->oflags|=OF_DESTROYED; if(firstobj==to) firstobj=o->next; if(lastobj==to) lastobj=o->prev; if(o->prev!=VOIDLINK) objects[o->prev]->next=o->next; if(o->next!=VOIDLINK) objects[o->next]->prev=o->prev; if(!(o->oflags&OF_VISUALONLY)) { // Not checking for stealth; that only applies to movement, not destruction xx=o->x; yy=o->y; for(i=25;i>=0;i--) { x=xx+Xbit(i); y=yy+Ybit(i); if(x<1 || x>pfwidth || y<1 || y>pfheight) continue; n=playfield[x+y*64-65]; while(n!=VOIDLINK) { o=objects[n]; if(o->departures&(1<<i)) send_message(to,n,MSG_DESTROYED,NVALUE(0),NVALUE(0),NVALUE(why)); n=o->up; } } } } return v; } static void trace_stack(Uint32 obj) { Value t2=Pop(); Value t1=Pop(); Value t0=Pop(); Object*o; if(!main_options['t']) return; |
︙ | ︙ | |||
430 431 432 433 434 435 436 437 438 439 440 441 442 443 | static Value send_message(Uint32 from,Uint32 to,Uint16 msg,Value arg1,Value arg2,Value arg3) { MessageVars saved=msgvars; Uint16 c=objects[to]->class; Uint16 p=get_message_ptr(c,msg); Uint16*code; int stackptr=vstackptr; if(p==0xFFFF) { p=get_message_ptr(0,msg); if(p==0xFFFF) return NVALUE(0); code=classes[0]->codes; } else { code=classes[c]->codes; } | > | 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 | static Value send_message(Uint32 from,Uint32 to,Uint16 msg,Value arg1,Value arg2,Value arg3) { MessageVars saved=msgvars; Uint16 c=objects[to]->class; Uint16 p=get_message_ptr(c,msg); Uint16*code; int stackptr=vstackptr; if(objects[to]->oflags&OF_DESTROYED) return NVALUE(0); if(p==0xFFFF) { p=get_message_ptr(0,msg); if(p==0xFFFF) return NVALUE(0); code=classes[0]->codes; } else { code=classes[c]->codes; } |
︙ | ︙ | |||
459 460 461 462 463 464 465 | } static Uint32 broadcast(Uint32 from,int c,Uint16 msg,Value arg1,Value arg2,Value arg3,int s) { Uint32 t=0; Uint32 n,p; Object*o; Value v; | < < < < < | | 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 | } static Uint32 broadcast(Uint32 from,int c,Uint16 msg,Value arg1,Value arg2,Value arg3,int s) { Uint32 t=0; Uint32 n,p; Object*o; Value v; if(lastobj==VOIDLINK) return; n=lastobj; while(o=objects[n]) { p=o->prev; if(!c || o->class==c) { v=send_message(from,n,msg,arg1,arg2,arg3); if(s>0) { switch(v.t) { case TY_NUMBER: t+=v.u; break; case TY_CLASS: t++; break; default: if(v.t<=TY_MAXTYPE) Throw("Invalid return type for BroadcastSum"); |
︙ | ︙ |