| | 1 | #include "system.h" |
| | 2 | #include "stratdef.h" |
| | 3 | #include "bh_types.h" |
| | 4 | #include "switchdoor.h" |
| | 5 | #include "liftdoor.h" |
| | 6 | #include "savegame.h" |
| | 7 | #include <assert.h> |
| | 8 | #include <stdlib.h> |
| | 9 | |
| | 10 | extern void UpdateMorphing(MORPHCTRL *mcptr); |
| | 11 | extern int AnythingInMyModule(MODULE* my_mod); |
| | 12 | extern SCENEMODULE MainScene; |
| | 13 | |
| | 14 | void LiftDoorBehaveInit(void* bhdata, STRATEGYBLOCK* sbptr) |
| | 15 | { |
| | 16 | MODULE * my_mod; |
| | 17 | |
| | 18 | LIFT_DOOR_BEHAV_BLOCK *doorbhv = malloc(sizeof(LIFT_DOOR_BEHAV_BLOCK)); |
| | 19 | |
| | 20 | if (NULL == doorbhv) |
| | 21 | { |
| | 22 | RemoveBehaviourStrategy(sbptr); |
| | 23 | return; |
| | 24 | } |
| | 25 | |
| | 26 | sbptr->dataptr = doorbhv; |
| | 27 | doorbhv->bhvr_type = I_BehaviourLiftDoor; |
| | 28 | |
| | 29 | LIFT_DOOR_TOOLS_TEMPLATE *doortt = (LIFT_DOOR_TOOLS_TEMPLATE*)bhdata; |
| | 30 | |
| | 31 | MORPHCTRL* morphctrl = malloc(sizeof(MORPHCTRL)); |
| | 32 | |
| | 33 | if (NULL == morphctrl) |
| | 34 | { |
| | 35 | RemoveBehaviourStrategy(sbptr); |
| | 36 | return; |
| | 37 | } |
| | 38 | |
| | 39 | MORPHHEADER* morphheader = malloc(sizeof(MORPHHEADER)); |
| | 40 | |
| | 41 | if (NULL == morphheader) |
| | 42 | { |
| | 43 | free(morphctrl); |
| | 44 | RemoveBehaviourStrategy(sbptr); |
| | 45 | return; |
| | 46 | } |
| | 47 | |
| | 48 | MORPHFRAME* morphframe = malloc(sizeof(MORPHFRAME)); |
| | 49 | |
| | 50 | if (NULL == morphframe) |
| | 51 | { |
| | 52 | free(morphctrl); |
| | 53 | free(morphheader); |
| | 54 | RemoveBehaviourStrategy(sbptr); |
| | 55 | return; |
| | 56 | } |
| | 57 | |
| | 58 | morphframe->mf_shape1 = doortt->shape_open; |
| | 59 | morphframe->mf_shape2 = doortt->shape_closed; |
| | 60 | |
| | 61 | morphheader->mph_numframes = 1; |
| | 62 | morphheader->mph_maxframes = ONE_FIXED; |
| | 63 | morphheader->mph_frames = morphframe; |
| | 64 | |
| | 65 | morphctrl->ObMorphCurrFrame = 0; |
| | 66 | morphctrl->ObMorphFlags = 0; |
| | 67 | morphctrl->ObMorphSpeed = 0; |
| | 68 | morphctrl->ObMorphHeader = morphheader; |
| | 69 | |
| | 70 | // Copy the name over |
| | 71 | COPY_NAME (sbptr->SBname, doortt->nameID); |
| | 72 | |
| | 73 | // Setup module ref |
| | 74 | { |
| | 75 | MREF mref = doortt->my_module; |
| | 76 | ConvertModuleNameToPointer (&mref, MainScene.sm_marray); |
| | 77 | my_mod = mref.mref_ptr; |
| | 78 | } |
| | 79 | |
| | 80 | assert (my_mod); |
| | 81 | |
| | 82 | my_mod->m_sbptr = sbptr; |
| | 83 | sbptr->moptr = my_mod; |
| | 84 | |
| | 85 | doorbhv->door_state = doortt->state; |
| | 86 | doorbhv->PDmctrl = morphctrl; |
| | 87 | doorbhv->door_closing_speed = doortt->door_closing_speed; |
| | 88 | doorbhv->door_opening_speed = doortt->door_opening_speed; |
| | 89 | |
| | 90 | // all lift doors have a closed starting state except the |
| | 91 | // one where the lift is - fill in other data |
| | 92 | |
| | 93 | sbptr->morphctrl = doorbhv->PDmctrl; |
| | 94 | |
| | 95 | if(doorbhv->door_state == I_door_open) |
| | 96 | { |
| | 97 | sbptr->morphctrl->ObMorphCurrFrame = 0; |
| | 98 | OpenDoor(sbptr->morphctrl, DOOR_OPENFASTSPEED); |
| | 99 | } |
| | 100 | else |
| | 101 | { |
| | 102 | assert(doorbhv->door_state == I_door_closed); |
| | 103 | sbptr->morphctrl->ObMorphCurrFrame = 1; |
| | 104 | CloseDoor(sbptr->morphctrl, DOOR_CLOSEFASTSPEED); |
| | 105 | } |
| | 106 | |
| | 107 | doorbhv->request_state = doorbhv->door_state; |
| | 108 | |
| | 109 | // copy data into relevant structures |
| | 110 | |
| | 111 | sbptr->morphctrl = doorbhv->PDmctrl; |
| | 112 | |
| | 113 | if(sbptr->moptr) |
| | 114 | sbptr->moptr->m_flags |= m_flag_open; |
| | 115 | |
| | 116 | doorbhv->SoundHandle = SOUND_NOACTIVEINDEX; |
| | 117 | } |
| | 118 | |
| | 119 | void LiftDoorBehaveFun(STRATEGYBLOCK* sbptr) |
| | 120 | { |
| | 121 | assert(sbptr); |
| | 122 | LIFT_DOOR_BEHAV_BLOCK *doorbhv = (LIFT_DOOR_BEHAV_BLOCK*)sbptr->dataptr; |
| | 123 | assert((doorbhv->bhvr_type == I_BehaviourLiftDoor)); |
| | 124 | MORPHCTRL *mctrl = doorbhv->PDmctrl; |
| | 125 | assert(mctrl); |
| | 126 | MODULE *mptr = sbptr->moptr; |
| | 127 | assert(mptr); |
| | 128 | |
| | 129 | /* update morphing.... */ |
| | 130 | UpdateMorphing(mctrl); |
| | 131 | |
| | 132 | switch(doorbhv->door_state) |
| | 133 | { |
| | 134 | case I_door_opening: |
| | 135 | { |
| | 136 | mptr->m_flags |= m_flag_open; |
| | 137 | |
| | 138 | if(mctrl->ObMorphFlags & mph_flag_finished) |
| | 139 | { |
| | 140 | if (doorbhv->SoundHandle != SOUND_NOACTIVEINDEX) |
| | 141 | { |
| | 142 | Sound_Play(SID_DOOREND,"d",&mptr->m_world); |
| | 143 | Sound_Stop(doorbhv->SoundHandle); |
| | 144 | } |
| | 145 | |
| | 146 | doorbhv->door_state = I_door_open; |
| | 147 | } |
| | 148 | } |
| | 149 | break; |
| | 150 | case I_door_closing: |
| | 151 | { |
| | 152 | if(mctrl->ObMorphFlags & mph_flag_finished) |
| | 153 | { |
| | 154 | if (doorbhv->SoundHandle != SOUND_NOACTIVEINDEX) |
| | 155 | { |
| | 156 | Sound_Play(SID_DOOREND, "d", &mptr->m_world); |
| | 157 | Sound_Stop(doorbhv->SoundHandle); |
| | 158 | } |
| | 159 | |
| | 160 | doorbhv->door_state = I_door_closed; |
| | 161 | mptr->m_flags &= ~m_flag_open; |
| | 162 | } |
| | 163 | else if(AnythingInMyModule(sbptr->moptr)) |
| | 164 | { |
| | 165 | if (doorbhv->SoundHandle == SOUND_NOACTIVEINDEX) |
| | 166 | { |
| | 167 | Sound_Play(SID_DOORSTART, "d", &mptr->m_world); |
| | 168 | Sound_Play(SID_DOORMID, "del", &mptr->m_world, &doorbhv->SoundHandle); |
| | 169 | } |
| | 170 | |
| | 171 | OpenDoor(mctrl, doorbhv->door_opening_speed); |
| | 172 | doorbhv->door_state = I_door_opening; |
| | 173 | mptr->m_flags |= m_flag_open; |
| | 174 | } |
| | 175 | } |
| | 176 | break; |
| | 177 | case I_door_open: |
| | 178 | { |
| | 179 | mptr->m_flags |= m_flag_open; |
| | 180 | |
| | 181 | if(doorbhv->request_state == I_door_closed) |
| | 182 | { |
| | 183 | if (doorbhv->SoundHandle == SOUND_NOACTIVEINDEX) |
| | 184 | { |
| | 185 | Sound_Play(SID_DOORSTART,"d",&mptr->m_world); |
| | 186 | Sound_Play(SID_DOORMID,"del",&mptr->m_world,&doorbhv->SoundHandle); |
| | 187 | } |
| | 188 | |
| | 189 | CloseDoor(mctrl, doorbhv->door_closing_speed); |
| | 190 | doorbhv->door_state = I_door_closing; |
| | 191 | } |
| | 192 | } |
| | 193 | break; |
| | 194 | case I_door_closed: |
| | 195 | { |
| | 196 | mptr->m_flags &= ~m_flag_open; |
| | 197 | |
| | 198 | if(doorbhv->request_state == I_door_open) |
| | 199 | { |
| | 200 | if (doorbhv->SoundHandle == SOUND_NOACTIVEINDEX) |
| | 201 | { |
| | 202 | Sound_Play(SID_DOORSTART,"d",&mptr->m_world); |
| | 203 | Sound_Play(SID_DOORMID,"del",&mptr->m_world,&doorbhv->SoundHandle); |
| | 204 | } |
| | 205 | |
| | 206 | OpenDoor(mctrl, doorbhv->door_opening_speed); |
| | 207 | doorbhv->door_state = I_door_opening; |
| | 208 | mptr->m_flags |= m_flag_open; |
| | 209 | } |
| | 210 | } |
| | 211 | break; |
| | 212 | default: |
| | 213 | assert(1==0); |
| | 214 | } |
| | 215 | } |
| | 216 | |
| | 217 | /*--------------------** |
| | 218 | ** Loading and Saving ** |
| | 219 | **--------------------*/ |
| | 220 | typedef struct lift_door_save_block |
| | 221 | { |
| | 222 | SAVE_BLOCK_STRATEGY_HEADER header; |
| | 223 | |
| | 224 | DOOR_STATES door_state; |
| | 225 | DOOR_STATES request_state; |
| | 226 | |
| | 227 | //from the morph control |
| | 228 | int ObMorphCurrFrame; |
| | 229 | int ObMorphFlags; |
| | 230 | int ObMorphSpeed; |
| | 231 | |
| | 232 | } LIFT_DOOR_SAVE_BLOCK; |
| | 233 | |
| | 234 | void LoadStrategy_LiftDoor(SAVE_BLOCK_STRATEGY_HEADER* header) |
| | 235 | { |
| | 236 | LIFT_DOOR_SAVE_BLOCK* block = (LIFT_DOOR_SAVE_BLOCK*) header; |
| | 237 | |
| | 238 | if(header->size != sizeof(*block)) |
| | 239 | return; |
| | 240 | |
| | 241 | //find the existing strategy block |
| | 242 | STRATEGYBLOCK* sbPtr = FindSBWithName(block->header.SBname); |
| | 243 | |
| | 244 | if(!sbPtr) |
| | 245 | return; |
| | 246 | |
| | 247 | //make sure the strategy found is of the right type |
| | 248 | if(sbPtr->type != I_BehaviourLiftDoor) |
| | 249 | return; |
| | 250 | |
| | 251 | LIFT_DOOR_BEHAV_BLOCK *doorbhv = (LIFT_DOOR_BEHAV_BLOCK*)sbPtr->dataptr; |
| | 252 | |
| | 253 | doorbhv->request_state = block->request_state; |
| | 254 | doorbhv->door_state = block->door_state; |
| | 255 | |
| | 256 | doorbhv->PDmctrl->ObMorphCurrFrame = block->ObMorphCurrFrame; |
| | 257 | doorbhv->PDmctrl->ObMorphFlags = block->ObMorphFlags; |
| | 258 | doorbhv->PDmctrl->ObMorphSpeed = block->ObMorphSpeed; |
| | 259 | |
| | 260 | Load_SoundState(&doorbhv->SoundHandle); |
| | 261 | } |
| | 262 | |
| | 263 | void SaveStrategy_LiftDoor(STRATEGYBLOCK* sbPtr) |
| | 264 | { |
| | 265 | LIFT_DOOR_SAVE_BLOCK *block; |
| | 266 | LIFT_DOOR_BEHAV_BLOCK *doorbhv = (LIFT_DOOR_BEHAV_BLOCK*)sbPtr->dataptr; |
| | 267 | |
| | 268 | GET_STRATEGY_SAVE_BLOCK(block,sbPtr); |
| | 269 | |
| | 270 | block->request_state = doorbhv->request_state; |
| | 271 | block->door_state = doorbhv->door_state; |
| | 272 | block->ObMorphCurrFrame = doorbhv->PDmctrl->ObMorphCurrFrame; |
| | 273 | block->ObMorphFlags = doorbhv->PDmctrl->ObMorphFlags; |
| | 274 | block->ObMorphSpeed = doorbhv->PDmctrl->ObMorphSpeed; |
| | 275 | |
| | 276 | Save_SoundState(&doorbhv->SoundHandle); |
| | 277 | } |