Overview
Comment: | When checking for CollisionLayers during connection movement, ignore objects that are also moving at the same time. |
---|---|
Downloads: | Tarball | ZIP archive | SQL archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA1: |
d05fed08fd35bc9da53c2af6c0e8228f |
User & Date: | user on 2022-02-11 22:34:43 |
Other Links: | manifest | tags |
Context
2022-02-12
| ||
00:59 | Fix connection moving so that HIT/HITBY during the second phase are sorted and that even if one fails, it will try all of them in order that shoving etc will be all or nothing. check-in: 28294a20b2 user: user tags: trunk | |
2022-02-11
| ||
22:34 | When checking for CollisionLayers during connection movement, ignore objects that are also moving at the same time. check-in: d05fed08fd user: user tags: trunk | |
21:25 | Implement the connection movement. check-in: 7f3f255b14 user: user tags: trunk | |
Changes
Modified exec.c from [05cf8f416c] to [6af053ca03].
︙ | ︙ | |||
486 487 488 489 490 491 492 493 494 495 496 497 498 499 | i=playfield[x+y*64-65]; while(i!=VOIDLINK) { if(!(objects[i]->oflags&OF_DESTROYED) && (classes[objects[i]->class]->collisionLayers&b)) return i; i=objects[i]->up; } return VOIDLINK; } static Uint32 obj_top_at(Uint32 x,Uint32 y) { Uint32 i,r; if(x<1 || x>pfwidth || y<1 || y>pfheight) return VOIDLINK; i=playfield[x+y*64-65]; r=VOIDLINK; while(i!=VOIDLINK) { | > > > > > > > > > > > | 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 | i=playfield[x+y*64-65]; while(i!=VOIDLINK) { if(!(objects[i]->oflags&OF_DESTROYED) && (classes[objects[i]->class]->collisionLayers&b)) return i; i=objects[i]->up; } return VOIDLINK; } static int connection_collision(Uint8 b,Uint32 x,Uint32 y) { Uint32 i; if(x<1 || x>pfwidth || y<1 || y>pfheight) return 1; i=playfield[x+y*64-65]; while(i!=VOIDLINK) { if(!(objects[i]->oflags&OF_DESTROYED) && (classes[objects[i]->class]->collisionLayers&b)) return !!((OF_CONNECTION|OF_MOVING)&~objects[i]->oflags); i=objects[i]->up; } return 0; } static Uint32 obj_top_at(Uint32 x,Uint32 y) { Uint32 i,r; if(x<1 || x>pfwidth || y<1 || y>pfheight) return VOIDLINK; i=playfield[x+y*64-65]; r=VOIDLINK; while(i!=VOIDLINK) { |
︙ | ︙ | |||
994 995 996 997 998 999 1000 | if(objF==VOIDLINK) goto fail; if(hit) hit=0x800|(hit&0x10000000); oF=objects[objF]; objLF=obj_dir(obj,(dir+1)&7); objRF=obj_dir(obj,(dir-1)&7); if(height_at(oF->x,oF->y)<=o->climb) hit|=0x200000; if(no) { | | | 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 | if(objF==VOIDLINK) goto fail; if(hit) hit=0x800|(hit&0x10000000); oF=objects[objF]; objLF=obj_dir(obj,(dir+1)&7); objRF=obj_dir(obj,(dir-1)&7); if(height_at(oF->x,oF->y)<=o->climb) hit|=0x200000; if(no) { if((vol=classes[oF->class]->collisionLayers) && connection_collision(vol,oF->x,oF->y)) goto fail; hit|=0x4066; } if(dir&1) { // Diagonal movement hit|=0x80000; vol=o->volume; if(objLF!=VOIDLINK) vol+=volume_at(objects[objLF]->x,objects[objLF]->y); |
︙ | ︙ | |||
1196 1197 1198 1199 1200 1201 1202 | n=lastobj; while(n!=VOIDLINK) { if(v_bool(send_message(conn[i].obj,n,MSG_PLAYERMOVING,NVALUE(o->x+x_delta[dir]),NVALUE(o->y+y_delta[dir]),NVALUE(0)))) goto fail; n=objects[n]->prev; } } if(j=classes[o->class]->collisionLayers) { | | | 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 | n=lastobj; while(n!=VOIDLINK) { if(v_bool(send_message(conn[i].obj,n,MSG_PLAYERMOVING,NVALUE(o->x+x_delta[dir]),NVALUE(o->y+y_delta[dir]),NVALUE(0)))) goto fail; n=objects[n]->prev; } } if(j=classes[o->class]->collisionLayers) { if(connection_collision(j,o->x+x_delta[dir],o->y+y_delta[dir])) goto fail; } } // Move everything in the group conn_dir=dir; qsort(conn+first,last-first,sizeof(Connection),compare_connection); for(i=first;i<last;i++) { o=objects[n=conn[i].obj]; |
︙ | ︙ |