00001 00025 #include <stdio.h> 00026 #include <stdlib.h> 00027 #include <string.h> 00028 00029 #include "scene.h" 00030 #include "actor.h" 00031 #include "grid.h" 00032 #include "main.h" 00033 #include "lbaengine.h" 00034 #include "dialogues.h" 00035 #include "resources.h" 00036 #include "music.h" 00037 00038 unsigned char* currentScene; 00039 00040 00041 void set_actor_staticflags(int actorIdx, unsigned short int staticFlags) 00042 { 00043 if(staticFlags & 0x1) 00044 { 00045 sceneActors[actorIdx].staticFlags.bComputeCollisionWithObj = 1; 00046 } 00047 if(staticFlags & 0x2) 00048 { 00049 sceneActors[actorIdx].staticFlags.bComputeCollisionWithBricks = 1; 00050 } 00051 if(staticFlags & 0x4) 00052 { 00053 sceneActors[actorIdx].staticFlags.bIsZonable = 1; 00054 } 00055 if(staticFlags & 0x8) 00056 { 00057 sceneActors[actorIdx].staticFlags.bUsesClipping = 1; 00058 } 00059 if(staticFlags & 0x10) 00060 { 00061 sceneActors[actorIdx].staticFlags.bCanBePushed = 1; 00062 } 00063 if(staticFlags & 0x20) 00064 { 00065 sceneActors[actorIdx].staticFlags.bComputeLowCollision = 1; 00066 } 00067 if(staticFlags & 0x40) 00068 { 00069 sceneActors[actorIdx].staticFlags.bCanDrown = 1; 00070 } 00071 if(staticFlags & 0x80) 00072 { 00073 sceneActors[actorIdx].staticFlags.bUnk80 = 1; 00074 } 00075 00076 if(staticFlags & 0x100) 00077 { 00078 sceneActors[actorIdx].staticFlags.bUnk0100 = 1; 00079 } 00080 if(staticFlags & 0x200) 00081 { 00082 sceneActors[actorIdx].staticFlags.bIsHidden = 1; 00083 } 00084 if(staticFlags & 0x400) 00085 { 00086 sceneActors[actorIdx].staticFlags.bIsSpriteActor = 1; 00087 } 00088 if(staticFlags & 0x800) 00089 { 00090 sceneActors[actorIdx].staticFlags.bCanFall = 1; 00091 } 00092 if(staticFlags & 0x1000) 00093 { 00094 sceneActors[actorIdx].staticFlags.bDoesntCastShadow = 1; 00095 } 00096 if(staticFlags & 0x2000) 00097 { 00098 //sceneActors[actorIdx].staticFlags.bIsBackgrounded = 1; 00099 } 00100 if(staticFlags & 0x4000) 00101 { 00102 sceneActors[actorIdx].staticFlags.bIsCarrierActor = 1; 00103 } 00104 if(staticFlags & 0x8000) 00105 { 00106 sceneActors[actorIdx].staticFlags.bUseMiniZv = 1; 00107 } 00108 } 00109 00110 void load_scene() 00111 { 00112 int i; 00113 int scriptSize=0; 00114 unsigned char* localScene = currentScene; 00115 00116 // load scene ambience properties 00117 currentTextBank = *(localScene++); 00118 currentGameOverScene = *(localScene++); 00119 localScene+=4; 00120 00121 alphaLight = *((unsigned short int*)localScene); localScene+=2; 00122 betaLight = *((unsigned short int*)localScene); localScene+=2; 00123 00124 sampleAmbience.info0 = *((unsigned short int*)localScene); localScene+=2; 00125 sampleRepeat.info0 = *((unsigned short int*)localScene); localScene+=2; 00126 sampleRound.info0 = *((unsigned short int*)localScene); localScene+=2; 00127 00128 sampleAmbience.info1 = *((unsigned short int*)localScene); localScene+=2; 00129 sampleRepeat.info1 = *((unsigned short int*)localScene); localScene+=2; 00130 sampleRound.info1 = *((unsigned short int*)localScene); localScene+=2; 00131 00132 sampleAmbience.info2 = *((unsigned short int*)localScene); localScene+=2; 00133 sampleRepeat.info2 = *((unsigned short int*)localScene); localScene+=2; 00134 sampleRound.info2 = *((unsigned short int*)localScene); localScene+=2; 00135 00136 sampleAmbience.info3 = *((unsigned short int*)localScene); localScene+=2; 00137 sampleRepeat.info3 = *((unsigned short int*)localScene); localScene+=2; 00138 sampleRound.info3 = *((unsigned short int*)localScene); localScene+=2; 00139 00140 sampleMinDelay = *((unsigned short int*)localScene); localScene+=2; 00141 sampleMinDelayRnd = *((unsigned short int*)localScene); localScene+=2; 00142 00143 sceneMusic = *(localScene++); 00144 00145 // load hero properties 00146 sceneHeroX = *((unsigned short int*)localScene); localScene+=2; 00147 sceneHeroY = *((unsigned short int*)localScene); localScene+=2; 00148 sceneHeroZ = *((unsigned short int*)localScene); localScene+=2; 00149 00150 scriptSize = *((unsigned short int*)localScene); localScene+=2; 00151 sceneHero->moveScript = localScene; 00152 localScene+=scriptSize; 00153 00154 scriptSize = *((unsigned short int*)localScene); localScene+=2; 00155 sceneHero->lifeScript = localScene; 00156 localScene+=scriptSize; 00157 00158 sceneNumActors = *((unsigned short int*)localScene); localScene+=2; 00159 00160 for(i=1; i < sceneNumActors; i++) 00161 { 00162 unsigned short int staticFlags = *((unsigned short int*)localScene); localScene+=2; 00163 set_actor_staticflags(i, staticFlags); 00164 00165 sceneActors[i].entity = *((unsigned short int*)localScene); localScene+=2; 00166 sceneActors[i].body = *(localScene++); 00167 sceneActors[i].anim = *(localScene++); 00168 sceneActors[i].sprite = *((unsigned short int*)localScene); localScene+=2; 00169 sceneActors[i].X = *((unsigned short int*)localScene); localScene+=2; 00170 sceneActors[i].Y = *((unsigned short int*)localScene); localScene+=2; 00171 sceneActors[i].Z = *((unsigned short int*)localScene); localScene+=2; 00172 sceneActors[i].strengthOfHit = *(localScene++); 00173 sceneActors[i].bonusParameter = *((unsigned short int*)localScene); localScene+=2; 00174 sceneActors[i].bonusParameter &= 0xFE; 00175 sceneActors[i].angle = *((unsigned short int*)localScene); localScene+=2; 00176 sceneActors[i].speed = *((unsigned short int*)localScene); localScene+=2; 00177 sceneActors[i].comportement = *((unsigned short int*)localScene); localScene+=2; 00178 sceneActors[i].info0 = *((unsigned short int*)localScene); localScene+=2; 00179 sceneActors[i].info1 = *((unsigned short int*)localScene); localScene+=2; 00180 sceneActors[i].info2 = *((unsigned short int*)localScene); localScene+=2; 00181 sceneActors[i].info3 = *((unsigned short int*)localScene); localScene+=2; 00182 sceneActors[i].followedActor = sceneActors[i].info3; 00183 sceneActors[i].bonusAmount = *(localScene++); 00184 sceneActors[i].talkColor = *(localScene++); 00185 sceneActors[i].armor = *(localScene++); 00186 sceneActors[i].life = *(localScene++); 00187 00188 scriptSize = *((unsigned short int*)localScene); localScene+=2; 00189 sceneActors[i].moveScript = localScene; 00190 localScene+=scriptSize; 00191 00192 scriptSize = *((unsigned short int*)localScene); localScene+=2; 00193 sceneActors[i].lifeScript = localScene; 00194 localScene+=scriptSize; 00195 } 00196 00197 sceneNumZones = *((unsigned short int*)localScene); localScene+=2; 00198 00199 for(i=0; i < sceneNumZones; i++) 00200 { 00201 sceneZones[i].bottomLeft.X = *((unsigned short int*)localScene); localScene+=2; 00202 sceneZones[i].bottomLeft.Y = *((unsigned short int*)localScene); localScene+=2; 00203 sceneZones[i].bottomLeft.Z = *((unsigned short int*)localScene); localScene+=2; 00204 00205 sceneZones[i].topRight.X = *((unsigned short int*)localScene); localScene+=2; 00206 sceneZones[i].topRight.Y = *((unsigned short int*)localScene); localScene+=2; 00207 sceneZones[i].topRight.Z = *((unsigned short int*)localScene); localScene+=2; 00208 00209 sceneZones[i].type = *((unsigned short int*)localScene); localScene+=2; 00210 00211 sceneZones[i].info0 = *((unsigned short int*)localScene); localScene+=2; 00212 sceneZones[i].info1 = *((unsigned short int*)localScene); localScene+=2; 00213 sceneZones[i].info2 = *((unsigned short int*)localScene); localScene+=2; 00214 sceneZones[i].info3 = *((unsigned short int*)localScene); localScene+=2; 00215 00216 sceneZones[i].snap = *((unsigned short int*)localScene); localScene+=2; 00217 } 00218 00219 sceneNumTracks = *((unsigned short int*)localScene); localScene+=2; 00220 00221 for(i=0; i < sceneNumTracks; i++) 00222 { 00223 sceneTracks[i].X = *((unsigned short int*)localScene); localScene+=2; 00224 sceneTracks[i].Y = *((unsigned short int*)localScene); localScene+=2; 00225 sceneTracks[i].Z = *((unsigned short int*)localScene); localScene+=2; 00226 } 00227 } 00228 00229 00230 int init_scene(int index) 00231 { 00232 int sceneSize; 00233 00234 // load scene from file 00235 sceneSize = hqr_entry_size(HQR_SCENE_FILE,index); 00236 if(currentScene) 00237 free(currentScene); 00238 currentScene = (unsigned char*)malloc(sceneSize); 00239 if(!currentScene) 00240 { 00241 printf("\nSCENE WARNING: unable to allocate scene memory!!\n"); 00242 return -1; 00243 } 00244 hqr_get_entry(currentScene, HQR_SCENE_FILE, index); 00245 00246 load_scene(); 00247 00248 return 1; 00249 } 00250 00251 void change_scene() 00252 { 00253 int previousSceneIdx, a; 00254 // change twinsen house destroyed hard-coded 00255 if (needChangeScene == 4 && gameFlags[30] != 0) 00256 needChangeScene = 118; 00257 00258 // local backup previous scene 00259 previousSceneIdx = currentSceneIdx; 00260 00261 currentSceneIdx = needChangeScene; 00262 00263 //TODO: stop_samples 00264 //TODO: clear_scene 00265 //TODO: load_twinsen_costumes 00266 //TODO: reset twinsen variables 00267 00268 init_scene(needChangeScene); 00269 00270 //TODO: treat holomap trajectories 00271 00272 if (needChangeScene == 116 || needChangeScene == 117) 00273 currentTextBank = 10; 00274 00275 init_dialogue_bank(currentTextBank+3); 00276 00277 init_grid(needChangeScene); 00278 00279 // TODO: set Hero position 00280 00281 sceneHero->X = sceneHeroX; 00282 sceneHero->Y = sceneHeroY; 00283 sceneHero->Z = sceneHeroZ; 00284 00285 newCameraX = sceneHero->X >> 9; 00286 newCameraY = sceneHero->Y >> 8; 00287 newCameraZ = sceneHero->X >> 9; 00288 00289 // TODO: set light vector 00290 // TODO: backup previous scene vars and save game 00291 // TODO: reset Hero vars 00292 00293 // TODO: load scene actors 00294 for (a = 1; a < sceneNumActors; a++) 00295 { 00296 init_actor(a); 00297 } 00298 00299 // TODO: reset current scene global variables 00300 00301 newCameraX = sceneActors[currentlyFollowedActor].X >> 9; 00302 newCameraY = sceneActors[currentlyFollowedActor].Y >> 8; 00303 newCameraZ = sceneActors[currentlyFollowedActor].Z >> 9; 00304 00305 // TODO: play midi music (scene music) 00306 play_midi_music(sceneMusic,-1); 00307 00308 // TODO: all the other change scene definitions 00309 }
1.5.5