|
|
1.1 ! root 1: /* p_change.c */ ! 2: ! 3: #include "doomdef.h" ! 4: #include "p_local.h" ! 5: ! 6: /* ! 7: ============================================================================== ! 8: ! 9: SECTOR HEIGHT CHANGING ! 10: ! 11: = After modifying a sectors floor or ceiling height, call this ! 12: = routine to adjust the positions of all things that touch the ! 13: = sector. ! 14: = ! 15: = If anything doesn't fit anymore, true will be returned. ! 16: = If crunch is true, they will take damage as they are being crushed ! 17: = If Crunch is false, you should set the sector height back the way it ! 18: = was and call P_ChangeSector again to undo the changes ! 19: ============================================================================== ! 20: */ ! 21: ! 22: boolean crushchange; ! 23: boolean nofit; ! 24: ! 25: /* ! 26: ================== ! 27: = ! 28: = P_ThingHeightClip ! 29: = ! 30: = Takes a valid thing and adjusts the thing->floorz, thing->ceilingz, ! 31: = anf possibly thing->z ! 32: = ! 33: = This is called for all nearby monsters whenever a sector changes height ! 34: = ! 35: = If the thing doesn't fit, the z will be set to the lowest value and ! 36: = false will be returned ! 37: ================== ! 38: */ ! 39: ! 40: boolean P_ThingHeightClip (mobj_t *thing) ! 41: { ! 42: boolean onfloor; ! 43: ! 44: onfloor = (thing->z == thing->floorz); ! 45: ! 46: P_CheckPosition (thing, thing->x, thing->y); ! 47: /* what about stranding a monster partially off an edge? */ ! 48: ! 49: thing->floorz = tmfloorz; ! 50: thing->ceilingz = tmceilingz; ! 51: ! 52: if (onfloor) ! 53: /* walking monsters rise and fall with the floor */ ! 54: thing->z = thing->floorz; ! 55: else ! 56: { /* don't adjust a floating monster unless forced to */ ! 57: if (thing->z+thing->height > thing->ceilingz) ! 58: thing->z = thing->ceilingz - thing->height; ! 59: } ! 60: ! 61: if (thing->ceilingz - thing->floorz < thing->height) ! 62: return false; ! 63: ! 64: return true; ! 65: } ! 66: ! 67: ! 68: /* ! 69: =============== ! 70: = ! 71: = PIT_ChangeSector ! 72: = ! 73: =============== ! 74: */ ! 75: ! 76: boolean PIT_ChangeSector (mobj_t *thing) ! 77: { ! 78: mobj_t *mo; ! 79: ! 80: if (P_ThingHeightClip (thing)) ! 81: return true; /* keep checking */ ! 82: ! 83: /* crunch bodies to giblets */ ! 84: if (thing->health <= 0) ! 85: { ! 86: P_SetMobjState (thing, S_GIBS); ! 87: thing->height = 0; ! 88: thing->radius = 0; ! 89: return true; /* keep checking */ ! 90: } ! 91: ! 92: /* crunch dropped items */ ! 93: if (thing->flags & MF_DROPPED) ! 94: { ! 95: P_RemoveMobj (thing); ! 96: return true; /* keep checking */ ! 97: } ! 98: ! 99: if (! (thing->flags & MF_SHOOTABLE) ) ! 100: return true; /* assume it is bloody gibs or something */ ! 101: ! 102: nofit = true; ! 103: if (crushchange && !(gametic&3) ) ! 104: { ! 105: P_DamageMobj(thing,NULL,NULL,10); ! 106: /* spray blood in a random direction */ ! 107: mo = P_SpawnMobj (thing->x, thing->y, thing->z + thing->height/2, MT_BLOOD); ! 108: mo->momx = (P_Random() - P_Random ())<<12; ! 109: mo->momy = (P_Random() - P_Random ())<<12; ! 110: } ! 111: ! 112: return true; /* keep checking (crush other things) */ ! 113: } ! 114: ! 115: /* ! 116: =============== ! 117: = ! 118: = P_ChangeSector ! 119: = ! 120: =============== ! 121: */ ! 122: ! 123: boolean P_ChangeSector (sector_t *sector, boolean crunch) ! 124: { ! 125: int x,y; ! 126: int i; ! 127: ! 128: /* force next sound to reflood */ ! 129: for (i=0 ; i<MAXPLAYERS ; i++) ! 130: players[i].lastsoundsector = NULL; ! 131: ! 132: nofit = false; ! 133: crushchange = crunch; ! 134: ! 135: /* recheck heights for all things near the moving sector */ ! 136: ! 137: for (x=sector->blockbox[BOXLEFT] ; x<= sector->blockbox[BOXRIGHT] ; x++) ! 138: for (y=sector->blockbox[BOXBOTTOM];y<= sector->blockbox[BOXTOP] ; y++) ! 139: P_BlockThingsIterator (x, y, PIT_ChangeSector); ! 140: ! 141: ! 142: return nofit; ! 143: } ! 144: ! 145:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.