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