4b825dc642cb6eb9a060e54bf8d69288fbee4904ebd360ec63ec976c05699f3180e866b3f69e5472
 
 
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
}