#include "c_extern.h" UBYTE *PtrPrg ; // WORD OffsetLife ; WORD TypeAnswer ; WORD TextLig = 0 ; extern WORD IndexGrm ; extern WORD ZoneGrm ; #define RET_BYTE 0 #define RET_WORD 1 #define RET_STRING 2 #ifdef CDROM extern LONG FlagDisplayText ; #endif /*══════════════════════════════════════════════════════════════════════════* █▀▀▀▄ █▀▀▀█ █ █ █▀▀▀▀ █▀▀▀▀ ██ █ ██ █ ██ ██ ██▀▀ ██▀▀ ▀▀▀▀ ▀▀▀▀▀ ▀▀▀▀▀ ▀▀▀▀▀ ▀▀ ▀▀ ▀▀▀▀▀ *══════════════════════════════════════════════════════════════════════════*/ /*──────────────────────────────────────────────────────────────────────────*/ void DoFuncLife( T_OBJET *ptrobj ) { WORD num ; WORD angle ; LONG distance ; TypeAnswer = RET_BYTE ; switch( *PtrPrg++ ) /* func */ { case LF_COL: if( ptrobj->LifePoint <= 0 ) { Value = -1 ; } else { Value = ptrobj->ObjCol ; } break ; case LF_CHAPTER: Value = Chapitre ; break ; case LF_LIFE_POINT: Value = ptrobj->LifePoint ; break ; case LF_HIT_BY: Value = ptrobj->HitBy ; break ; case LF_ACTION: Value = ActionNormal ; break ; case LF_LIFE_POINT_OBJ: Value = ListObjet[*PtrPrg++].LifePoint ; break ; case LF_COL_OBJ: // Value = ListObjet[*PtrPrg++].ObjCol ; num = *PtrPrg++ ; if( ListObjet[num].LifePoint <= 0 ) { Value = -1 ; } else { Value = ListObjet[num].ObjCol ; } break ; case LF_DISTANCE: num = (WORD)*PtrPrg++ ; TypeAnswer = RET_WORD ; if( ListObjet[num].WorkFlags & OBJ_DEAD ) { Value = 32000 ; break ; } if( abs(ListObjet[num].PosObjY-ptrobj->PosObjY) < 1500 ) { distance = Distance2D( ptrobj->PosObjX, ptrobj->PosObjZ, ListObjet[num].PosObjX, ListObjet[num].PosObjZ ) ; if( distance > 32000 ) Value = 32000 ; else Value = distance ; } else { Value = 32000 ; } break ; case LF_DISTANCE_3D: num = (WORD)*PtrPrg++ ; TypeAnswer = RET_WORD ; if( ListObjet[num].WorkFlags & OBJ_DEAD ) { Value = 32000 ; break ; } distance = Distance3D( ptrobj->PosObjX, ptrobj->PosObjY, ptrobj->PosObjZ, ListObjet[num].PosObjX, ListObjet[num].PosObjY, ListObjet[num].PosObjZ ) ; if( distance > 32000 ) Value = 32000 ; else Value = distance ; break ; case LF_CONE_VIEW: num = (WORD)*PtrPrg++ ; TypeAnswer = RET_WORD ; if( ListObjet[num].WorkFlags & OBJ_DEAD ) { Value = 32000 ; break ; } if( abs(ListObjet[num].PosObjY-ptrobj->PosObjY) < 1500 ) { angle = GetAngle( ptrobj->PosObjX, ptrobj->PosObjZ, ListObjet[num].PosObjX, ListObjet[num].PosObjZ ) ; if( Distance > 32000 ) Distance = 32000 ; } else { Distance = 32000 ; } if( num == NUM_PERSO ) { if( Comportement == C_DISCRET ) { if( (((ptrobj->Beta + 1024 + 128) - (angle + 1024))&1023) <= 256 ) { Value = Distance ; } else { Value = 32000 ; } } else Value = Distance ; } else { if( (((ptrobj->Beta + 1024 + 128) - (angle + 1024))&1023) <= 256 ) { Value = Distance ; } else { Value = 32000 ; } } break ; case LF_ZONE: Value = ptrobj->ZoneSce ; break ; case LF_NB_GOLD_PIECES: Value = NbGoldPieces ; TypeAnswer = RET_WORD ; break ; case LF_NB_LITTLE_KEYS: Value = NbLittleKeys ; break ; case LF_COMPORTEMENT_HERO: Value = Comportement ; break ; case LF_MAGIC_LEVEL: Value = MagicLevel ; break ; case LF_MAGIC_POINT: Value = MagicPoint ; break ; case LF_CHOICE: Value = GameChoice ; TypeAnswer = RET_WORD ; break ; case LF_FUEL: Value = Fuel ; break ; case LF_L_TRACK: Value = ptrobj->LabelTrack ; break ; case LF_ZONE_OBJ: Value = ListObjet[ *PtrPrg++ ].ZoneSce ; break ; case LF_FLAG_CUBE: Value = ListFlagCube[ *PtrPrg++ ] ; break ; case LF_FLAG_GAME: num = *PtrPrg++ ; if( (ListFlagGame[FLAG_CONSIGNE] == 0) OR (num >= MAX_INVENTORY) ) { // si pas consigne ou pas inventaire Value = ListFlagGame[ num ] ; } else // si flag consigne { if( num == FLAG_CONSIGNE ) { Value = ListFlagGame[ num ] ; } else // ne possede aucun objet { Value = 0 ; } } break ; case LF_USE_INVENTORY: num = *PtrPrg++ ; // flag game if( num >= MAX_INVENTORY ) // a bon ? { Value = FALSE ; } if( ListFlagGame[FLAG_CONSIGNE] ) { Value = 0 ; } else // si pas flag consigne { if( InventoryAction == num ) { // action émise depuis l'inventaire à cette boucle Value = TRUE ; } else { if( (ListFlagInventory[ num ] == 1) AND (ListFlagGame[num] == 1) ) { Value = TRUE ; } else { Value = FALSE ; } } if( Value == TRUE ) { // init incdisp symbol utilisation InitIncrustDisp( INCRUST_OBJ, num, 0, 0, 0, 0, 3 ) ; } } break ; case LF_L_TRACK_OBJ: Value = ListObjet[ *PtrPrg++ ].LabelTrack ; break ; case LF_BODY: Value = ptrobj->GenBody ; break ; case LF_BODY_OBJ: Value = ListObjet[*PtrPrg++].GenBody ; break ; case LF_ANIM: Value = ptrobj->GenAnim ; break ; case LF_ANIM_OBJ: Value = ListObjet[*PtrPrg++].GenAnim ; break ; case LF_CARRY_BY: Value = ptrobj->CarryBy ; break ; case LF_CDROM: #ifdef CDROM //Message( "CDROM TRUE" ) ; Value = 1 ; #else //Message( "CDROM FALSE" ) ; Value = 0 ; #endif break ; } } /*──────────────────────────────────────────────────────────────────────────*/ WORD DoTest() { UBYTE test ; WORD valueword ; BYTE valuebyte ; UBYTE *ptrstring ; test = *PtrPrg++ ; switch( TypeAnswer ) { case RET_BYTE: valuebyte = *PtrPrg++ ; switch( test ) { case LT_EQUAL: return (Value == valuebyte) ; case LT_SUP: return (Value > valuebyte) ; case LT_LESS: return (Value < valuebyte) ; case LT_SUP_EQUAL: return (Value >= valuebyte) ; case LT_LESS_EQUAL: return (Value <= valuebyte) ; case LT_DIFFERENT: return (Value != valuebyte) ; } case RET_WORD: valueword = *(WORD*)PtrPrg ; PtrPrg += 2 ; switch( test ) { case LT_EQUAL: return (Value == valueword) ; case LT_SUP: return (Value > valueword) ; case LT_LESS: return (Value < valueword) ; case LT_SUP_EQUAL: return (Value >= valueword) ; case LT_LESS_EQUAL: return (Value <= valueword) ; case LT_DIFFERENT: return (Value != valueword) ; } case RET_STRING: valueword = stricmp( String, PtrPrg ) ; PtrPrg += strlen( PtrPrg ) + 1 ; switch( test ) { case LT_EQUAL: return (valueword == 0 ) ; case LT_SUP: case LT_LESS: case LT_SUP_EQUAL: case LT_LESS_EQUAL: return FALSE ; case LT_DIFFERENT: return (valueword != 0 ) ; } } return FALSE ; } /*──────────────────────────────────────────────────────────────────────────*/ void DoLife( WORD numobj ) { WORD flag = 0 ; UBYTE macro ; T_OBJET *ptrobj ; LONG obj ; LONG num ; UBYTE index ; UBYTE *ptrmacro ; LONG memoflagdisplaytext ; LONG var ; UBYTE string[256] ; LONG dx, n ; ptrobj = &ListObjet[numobj] ; PtrPrg = ptrobj->PtrLife + ptrobj->OffsetLife ; while( flag != -1 ) { ptrmacro = PtrPrg ; switch( *PtrPrg++ ) { case LM_END: case LM_END_LIFE: ptrobj->OffsetLife = -1 ; flag = -1 ; break ; case LM_RETURN: case LM_END_COMPORTEMENT: flag = -1 ; break ; case LM_LABEL: case LM_COMPORTEMENT: #ifdef LBA_EDITOR if ( numobj == ObjSelected )/* TOOLS */ { ComportementDebug = *PtrPrg ; } #endif PtrPrg++ ; break ; case LM_FALLABLE: num = *PtrPrg++ * OBJ_FALLABLE ; ptrobj->Flags &= ~OBJ_FALLABLE ; ptrobj->Flags |= num ; break ; case LM_COMPORTEMENT_HERO: InitAnim( GEN_ANIM_RIEN, ANIM_REPEAT, NO_ANIM, NUM_PERSO ) ; SetComportement( *PtrPrg++ ) ; break ; case LM_SET_MAGIC_LEVEL: // si sce permet objets magique ordre quelconque transforme SET en INC MagicLevel = *PtrPrg++ ; // remplie magie a fond MagicPoint = MagicLevel * 20 ; break ; case LM_SUB_MAGIC_POINT: MagicPoint -= *PtrPrg++ ; if( MagicPoint < 0 ) MagicPoint = 0 ; break ; case LM_CAM_FOLLOW: num = *PtrPrg++ ; if( num != NumObjFollow ) { NumObjFollow = num ; StartXCube = ((ListObjet[NumObjFollow].PosObjX+DEMI_BRICK_XZ)/SIZE_BRICK_XZ) ; StartYCube = ((ListObjet[NumObjFollow].PosObjY+SIZE_BRICK_Y)/SIZE_BRICK_Y) ; StartZCube = ((ListObjet[NumObjFollow].PosObjZ+DEMI_BRICK_XZ)/SIZE_BRICK_XZ) ; FirstTime = TRUE ; } break ; case LM_INIT_PINGOUIN: num = *PtrPrg++ ; NumPingouin = num ; ListObjet[num].WorkFlags |= OBJ_DEAD ; ListObjet[num].Body = -1 ; ListObjet[num].ZoneSce = -1 ; break ; case LM_KILL_OBJ: num = *PtrPrg++ ; CheckCarrier( num ) ; ListObjet[num].WorkFlags |= OBJ_DEAD ; ListObjet[num].Body = -1 ; ListObjet[num].ZoneSce = -1 ; ListObjet[num].LifePoint = 0 ; break ; case LM_SUICIDE: CheckCarrier( numobj ) ; ptrobj->WorkFlags |= OBJ_DEAD ; ptrobj->Body = -1 ; ptrobj->ZoneSce = -1 ; ptrobj->LifePoint = 0 ; break ; case LM_SET_DIR: ptrobj->Move = *PtrPrg++ ; if( ptrobj->Move == MOVE_FOLLOW ) { ptrobj->Info3 = *PtrPrg++ ; } break ; case LM_SET_DIR_OBJ: obj = *PtrPrg++ ; num = ListObjet[obj].Move = *PtrPrg++ ; if( num == MOVE_FOLLOW ) { ListObjet[obj].Info3 = *PtrPrg++ ; } break ; case LM_SET_LIFE: case LM_SET_COMPORTEMENT: ptrobj->OffsetLife = *(WORD*)PtrPrg ; PtrPrg += 2 ; break ; case LM_SET_LIFE_OBJ: case LM_SET_COMPORTEMENT_OBJ: num = *PtrPrg++ ; ListObjet[num].OffsetLife = *(WORD*)PtrPrg ; PtrPrg += 2 ; break ; case LM_SET_LIFE_POINT_OBJ: num = *PtrPrg++ ; ListObjet[num].LifePoint = *PtrPrg++ ; break ; case LM_SUB_LIFE_POINT_OBJ: num = *PtrPrg++ ; ListObjet[num].LifePoint -= *PtrPrg++ ; if( ListObjet[num].LifePoint < 0 ) ListObjet[num].LifePoint = 0 ; break ; case LM_HIT_OBJ: num = *PtrPrg++ ; HitObj( numobj, num, *PtrPrg++, ListObjet[num].Beta ) ; break ; case LM_SET_TRACK: ptrobj->OffsetTrack = *(WORD*)PtrPrg ; PtrPrg += 2 ; break ; case LM_SET_TRACK_OBJ: num = *PtrPrg++ ; ListObjet[num].OffsetTrack = *(WORD*)PtrPrg ; PtrPrg += 2 ; break ; case LM_STOP_L_TRACK: ptrobj->MemoLabelTrack = ptrobj->OffsetLabelTrack ; ptrobj->OffsetTrack = -1 ; break ; case LM_RESTORE_L_TRACK: ptrobj->OffsetTrack = ptrobj->MemoLabelTrack ; break ; case LM_IF: DoFuncLife( ptrobj ) ; if( !DoTest() ) { PtrPrg = ptrobj->PtrLife + *(WORD*)PtrPrg ; } else { PtrPrg += 2 ; } break ; case LM_OR_IF: DoFuncLife( ptrobj ) ; if( DoTest() ) { PtrPrg = ptrobj->PtrLife + *(WORD*)PtrPrg ; } else { PtrPrg += 2 ; } break ; case LM_SWIF: DoFuncLife( ptrobj ) ; if( !DoTest() ) { PtrPrg = ptrobj->PtrLife + *(WORD*)PtrPrg ; } else { *ptrmacro = LM_SNIF ; PtrPrg += 2 ; } break ; case LM_SNIF: /* swif inversé tjrs jump jusqu'a cond inverse */ DoFuncLife( ptrobj ) ; if( !DoTest() ) { *ptrmacro = LM_SWIF ; } PtrPrg = ptrobj->PtrLife + *(WORD*)PtrPrg ; break ; case LM_ONEIF: DoFuncLife( ptrobj ) ; if( !DoTest() ) { PtrPrg = ptrobj->PtrLife + *(WORD*)PtrPrg ; } else { PtrPrg += 2 ; *ptrmacro = LM_NEVERIF ; } break ; case LM_NEVERIF: DoFuncLife( ptrobj ) ; DoTest() ; PtrPrg = ptrobj->PtrLife + *(WORD*)PtrPrg ; break ; case LM_OFFSET: /* jmp à offset */ PtrPrg = ptrobj->PtrLife + *(WORD*)PtrPrg ; break ; case LM_ELSE: PtrPrg = ptrobj->PtrLife + *(WORD*)PtrPrg ; break ; case LM_BODY: InitBody( *PtrPrg++, numobj ) ; break ; case LM_BODY_OBJ: num = *PtrPrg++ ; InitBody( *PtrPrg++, num ) ; break ; case LM_ANIM_OBJ: num = *PtrPrg++ ; InitAnim( *PtrPrg++, ANIM_REPEAT,0, num ) ; break ; case LM_ANIM: InitAnim( *PtrPrg++, ANIM_REPEAT,0,numobj ) ; break ; case LM_ANIM_SET: ptrobj->GenAnim = NO_ANIM ; ptrobj->Anim = -1 ; InitAnim( *PtrPrg++, ANIM_REPEAT,0,numobj ) ; break ; case LM_MESSAGE_OBJ: SaveTimer() ; TestRestoreModeSVGA( TRUE ) ; num = *PtrPrg++ ; if( Bulle ) DrawBulle( num ) ; TestCoulDial( ListObjet[num].CoulObj ) ; #ifdef CDROM NumObjSpeak = num ; #endif Dial( *(WORD*)PtrPrg ) ; PtrPrg += 2 ; RestoreTimer() ; AffScene(TRUE) ; WaitReleaseSpace() ; break ; case LM_MESSAGE: SaveTimer() ; TestRestoreModeSVGA( TRUE ) ; if( Bulle ) DrawBulle( numobj ) ; TestCoulDial( ptrobj->CoulObj ) ; #ifdef CDROM NumObjSpeak = numobj ; #endif Dial( *(WORD*)PtrPrg ) ; PtrPrg += 2 ; RestoreTimer() ; AffScene(TRUE) ; WaitReleaseSpace() ; break ; case LM_SAY_MESSAGE_OBJ: obj = *PtrPrg++ ; num = *(WORD*)PtrPrg ; InitIncrustDisp( INCRUST_TEXT, num, 0, 0, obj, 1, 2 ) ; PtrPrg += 2 ; #ifdef CDROM SaveTimer() ; Speak( num ) ; RestoreTimer() ; #endif break ; case LM_SAY_MESSAGE: num = *(WORD*)PtrPrg ; InitIncrustDisp( INCRUST_TEXT, num, 0, 0, numobj, 1, 2 ) ; PtrPrg += 2 ; #ifdef CDROM SaveTimer() ; Speak( num ) ; RestoreTimer() ; #endif break ; case LM_SET_FLAG_CUBE: num = *PtrPrg++ ; ListFlagCube[num] = *PtrPrg++ ; break ; case LM_SET_FLAG_GAME: num = *PtrPrg++ ; ListFlagGame[num] = *PtrPrg++ ; //Text( 0,100, "%Fset ListFlagGame %d = %d",num,ListFlagGame[num] ) ; break ; case LM_SET_USED_INVENTORY: num = *PtrPrg++ ; if( num < 24 ) ListFlagInventory[num] = TRUE ; break ; case LM_GIVE_GOLD_PIECES: num = NbGoldPieces ; NbGoldPieces -= *(WORD*)PtrPrg ; if( NbGoldPieces < 0 ) { NbGoldPieces = 0 ; } PtrPrg += 2 ; // sample cling cling // HQ_MixSample( 83, 0x1000, 2, 128, 128 ) ; // aff piece InitIncrustDisp( INCRUST_SPRITE, 3, 10, 15, 0, 0, 3 ) ; // aff cmpt si pas { // attention MAGOUILLE // ne marche que parcequ'il y n'y a // qu'UN seul incrust_cmpt dans le jeu T_INCRUST_DISP *ptrdisp ; ptrdisp = ListIncrustDisp ; var = 0 ; for( n=0; nNum == -1 ) continue ; if( ptrdisp->Type==INCRUST_CMPT ) { ptrdisp->Num = BoundRegleTrois( ptrdisp->Info, ptrdisp->Num, 50*2, ptrdisp->TimerEnd-TimerRef-50 ) ; ptrdisp->Info = NbGoldPieces ; ptrdisp->TimerEnd = TimerRef + 50 * 3 ; var = 1 ; break ; } } if( !var ) // yen avait pas { InitIncrustDisp( INCRUST_CMPT, num, 30, 20, NbGoldPieces, 0, 3 ) ; } } break ; case LM_USE_ONE_LITTLE_KEY: NbLittleKeys-- ; if( NbLittleKeys < 0 ) NbLittleKeys = 0 ; // affiche little key InitIncrustDisp( INCRUST_SPRITE, 6, 0, 0, NUM_PERSO, 1, 1 ) ; break ; case LM_INC_CHAPTER: Chapitre++ ; break ; case LM_FOUND_OBJECT: SaveTimer() ; TestRestoreModeSVGA( TRUE ) ; DoFoundObj( *PtrPrg++ ) ; RestoreTimer() ; AffScene( TRUE ) ; break ; case LM_SET_DOOR_LEFT: ptrobj->Beta = 768 ; ptrobj->PosObjX = ptrobj->AnimStepX - *(WORD*)PtrPrg ; ptrobj->WorkFlags &= ~AUTO_STOP_DOOR ; ptrobj->SRot = 0 ; PtrPrg += 2 ; break ; case LM_SET_DOOR_RIGHT: ptrobj->Beta = 256 ; ptrobj->PosObjX = ptrobj->AnimStepX + *(WORD*)PtrPrg ; ptrobj->WorkFlags &= ~AUTO_STOP_DOOR ; ptrobj->SRot = 0 ; PtrPrg += 2 ; break ; case LM_SET_DOOR_UP: ptrobj->Beta = 512 ; ptrobj->PosObjZ = ptrobj->AnimStepZ - *(WORD*)PtrPrg ; ptrobj->WorkFlags &= ~AUTO_STOP_DOOR ; ptrobj->SRot = 0 ; PtrPrg += 2 ; break ; case LM_SET_DOOR_DOWN: ptrobj->Beta = 0 ; ptrobj->PosObjZ = ptrobj->AnimStepZ + *(WORD*)PtrPrg ; ptrobj->WorkFlags &= ~AUTO_STOP_DOOR ; ptrobj->SRot = 0 ; PtrPrg += 2 ; break ; case LM_GIVE_BONUS: if( ptrobj->OptionFlags & EXTRA_MASK ) { GiveExtraBonus( ptrobj ) ; } if( *PtrPrg++ ) { // ne donne plus rien ???? ptrobj->OptionFlags |= EXTRA_GIVE_NOTHING ; } break ; case LM_CHANGE_CUBE: NewCube = *PtrPrg++ ; FlagChgCube = 2 ; break ; case LM_PLAY_MIDI: PlayMusic( *PtrPrg++ ) ; break ; case LM_ADD_FUEL: Fuel += *PtrPrg++ ; if( Fuel > 100 ) Fuel = 100 ; break ; case LM_SUB_FUEL: Fuel -= *PtrPrg++ ; if( Fuel < 0 ) Fuel = 0 ; break ; case LM_SET_HOLO_POS: SetHoloPos( *PtrPrg++ ) ; if( ListFlagGame[FLAG_HOLOMAP] ) { InitIncrustDisp( INCRUST_OBJ, 0, // holomap 0, 0, 0, 0, 3 ) ; } break ; case LM_CLR_HOLO_POS: ClrHoloPos( *PtrPrg++ ) ; break ; case LM_SET_GRM: // ne marche que si pas autre grm IncrustGrm( (IndexGrm = *PtrPrg++) ) ; break ; case LM_INC_CLOVER_BOX: if( NbCloverBox < MAX_CLOVER_BOX ) { NbCloverBox++ ; } break ; case LM_OBJ_COL: if( *PtrPrg++ ) ptrobj->Flags |= CHECK_OBJ_COL ; else ptrobj->Flags &= ~CHECK_OBJ_COL ; break ; case LM_INVISIBLE: if( *PtrPrg++ ) ptrobj->Flags |= INVISIBLE ; else ptrobj->Flags &= ~INVISIBLE ; break ; case LM_BRICK_COL: num = *PtrPrg++ ; ptrobj->Flags &= ~(CHECK_BRICK_COL+COL_BASSE) ; if( num == 1 ) { ptrobj->Flags &= ~(CHECK_BRICK_COL+COL_BASSE) ; ptrobj->Flags |= CHECK_BRICK_COL ; } if( num == 2 ) { ptrobj->Flags |= CHECK_BRICK_COL+COL_BASSE ; } break ; case LM_ZOOM: if( *PtrPrg++ ) { if( (!FlagMCGA) AND (SceZoom!=0) ) { FadeToBlack( PtrPal ) ; ExtInitMcga() ; SetBlackPal() ; FlagFade = TRUE ; } } else { if( FlagMCGA ) { FadeToBlack( PtrPal ) ; ExtInitSvga() ; SetBlackPal() ; FlagFade = TRUE ; FirstTime = TRUE ; } } break ; case LM_POS_POINT: Value = *PtrPrg++ ; // index point X0 = ListBrickTrack[Value].X ; Y0 = ListBrickTrack[Value].Y ; Z0 = ListBrickTrack[Value].Z ; ptrobj->PosObjX = X0 ; ptrobj->PosObjY = Y0 ; ptrobj->PosObjZ = Z0 ; break ; case LM_PLAY_FLA: SaveTimer() ; if( FlagPalettePcx ) FadeToBlack( PalettePcx ) ; else FadeToBlack( PtrPal ) ; HQ_StopSample() ; PlayAnimFla( PtrPrg ) ; PtrPrg += strlen( PtrPrg ) + 1 ; RestoreTimer() ; FlagFade = TRUE ; FirstTime = TRUE ; break ; case LM_ADD_CHOICE: GameListChoice[GameNbChoices] = *(WORD*)PtrPrg ; PtrPrg += 2 ; GameNbChoices++ ; break ; case LM_ASK_CHOICE: #ifndef DEMO SaveTimer() ; TestRestoreModeSVGA( TRUE ) ; if( Bulle ) DrawBulle( numobj ) ; TestCoulDial( ptrobj->CoulObj ) ; GameAskChoice( *(WORD*)PtrPrg ) ; GameNbChoices = 0 ; PtrPrg += 2 ; // FlagFade = TRUE ; RestoreTimer() ; AffScene(TRUE) ; WaitReleaseSpace() ; #endif break ; case LM_ASK_CHOICE_OBJ: #ifndef DEMO SaveTimer() ; num = *PtrPrg++ ; TestRestoreModeSVGA( TRUE ) ; if( Bulle ) DrawBulle( num ) ; TestCoulDial( ListObjet[num].CoulObj ) ; GameAskChoice( *(WORD*)PtrPrg ) ; GameNbChoices = 0 ; PtrPrg += 2 ; // FlagFade = TRUE ; RestoreTimer() ; AffScene(TRUE) ; WaitReleaseSpace() ; #endif break ; case LM_BIG_MESSAGE: SaveTimer() ; TestRestoreModeSVGA( TRUE ) ; BigWinDial() ; if( Bulle ) DrawBulle( numobj ) ; TestCoulDial( ptrobj->CoulObj ) ; #ifdef CDROM NumObjSpeak = numobj ; #endif Dial( *(WORD*)PtrPrg ) ; PtrPrg += 2 ; NormalWinDial() ; AffScene(TRUE) ; RestoreTimer() ; WaitReleaseSpace() ; break ; case LM_FULL_POINT: ListObjet[NUM_PERSO].LifePoint = 50 ; MagicPoint = MagicLevel * 20 ; break ; case LM_BETA: ptrobj->Beta = *(WORD*)PtrPrg ; ClearRealAngle( ptrobj ) ; PtrPrg += 2 ; break ; case LM_GRM_OFF: if( IndexGrm != -1 ) { IndexGrm = ZoneGrm = -1 ; CopyMapToCube() ; AffScene( TRUE ) ; } break ; case LM_FADE_PAL_RED: SaveTimer() ; FadeToRed( PtrPal ) ; FlagPalettePcx = FALSE ; RestoreTimer() ; break ; case LM_FADE_ALARM_RED: SaveTimer() ; Load_HQR( PATH_RESSOURCE"ress.hqr", PalettePcx, RESS_PAL_ALARM ) ; FadeToRed( PalettePcx ) ; FlagPalettePcx = TRUE ; RestoreTimer() ; break ; case LM_FADE_ALARM_PAL: SaveTimer() ; Load_HQR( PATH_RESSOURCE"ress.hqr", PalettePcx, RESS_PAL_ALARM ) ; FadePalToPal( PalettePcx, PtrPal ) ; FlagPalettePcx = FALSE ; RestoreTimer() ; break ; case LM_FADE_RED_PAL: SaveTimer() ; FadeRedToPal( PtrPal ) ; FlagPalettePcx = FALSE ; RestoreTimer() ; break ; case LM_FADE_RED_ALARM: SaveTimer() ; Load_HQR( PATH_RESSOURCE"ress.hqr", PalettePcx, RESS_PAL_ALARM ) ; FadeRedToPal( PalettePcx ) ; FlagPalettePcx = TRUE ; RestoreTimer() ; break ; case LM_FADE_PAL_ALARM: SaveTimer() ; Load_HQR( PATH_RESSOURCE"ress.hqr", PalettePcx, RESS_PAL_ALARM ) ; FadePalToPal( PtrPal, PalettePcx ) ; FlagPalettePcx = TRUE ; RestoreTimer() ; break ; case LM_EXPLODE_OBJ: num = *PtrPrg++ ; ExtraExplo( ListObjet[num].PosObjX + Rnd( 512 ) - 256 , ListObjet[num].PosObjY + Rnd( 256 ) - 128 , ListObjet[num].PosObjZ + Rnd( 512 ) - 256 ) ; break; case LM_BULLE_ON: Bulle = TRUE ; break ; case LM_BULLE_OFF: Bulle = FALSE ; break ; case LM_SET_DARK_PAL: SaveTimer() ; Load_HQR( PATH_RESSOURCE"ress.hqr", PalettePcx, RESS_PAL_MUSEE ) ; if( !FlagFade ) Palette( PalettePcx ) ; FlagPalettePcx = TRUE ; RestoreTimer() ; break ; case LM_SET_NORMAL_PAL: FlagPalettePcx = FALSE ; if( !FlagFade ) Palette( PtrPal ) ; break ; case LM_MESSAGE_SENDELL: #ifndef DEMO SaveTimer() ; TestRestoreModeSVGA( TRUE ) ; FadeToBlack( PtrPal ) ; Load_HQR( PATH_RESSOURCE"ress.hqr", Screen, RESS_SENDELL_PCR ) ; CopyScreen( Screen, Log ) ; Load_HQR( PATH_RESSOURCE"ress.hqr", PalettePcx, RESS_SENDELL_PAL ) ; Flip() ; FadeToPal( PalettePcx ) ; BigWinDial() ; TestCoulDial( 15 ) ; #ifdef CDROM memoflagdisplaytext = FlagDisplayText ; FlagDisplayText = TRUE ; #endif FlagMessageShade = FALSE ; Dial( 6 ) ; FlagMessageShade = TRUE ; NormalWinDial() ; FadeToBlack( PalettePcx ) ; Cls() ; Flip(); Palette( PtrPal ) ; #ifdef CDROM FlagDisplayText = memoflagdisplaytext ; #endif while( (Fire & F_SPACE) OR (Key == K_ESC) ) ; RestoreTimer() ; #endif break ; case LM_HOLOMAP_TRAJ: NumHolomapTraj = *PtrPrg++ ; // signal pour chg cube break ; case LM_GAME_OVER: ListObjet[NUM_PERSO].LifePoint = 0 ; ListObjet[NUM_PERSO].WorkFlags |= ANIM_END ; NbFourLeafClover = 0 ; flag = -1 ; break ; case LM_THE_END: #ifndef DEMO // Save Partie retour scene de fin (inrejouable ?) NbFourLeafClover = 0 ; ListObjet[NUM_PERSO].LifePoint = 50 ; MagicPoint = 80 ; Comportement = SaveComportement ; ListObjet[NUM_PERSO].Beta = SaveBeta ; NumCube = 113 ; SceneStartX = -1 ; SaveGame() ; FlagTheEnd = 1 ; // credits flag = -1 ; #endif break ; case LM_BRUTAL_EXIT: FlagTheEnd = 0 ; flag = -1 ; break ; case LM_MIDI_OFF: StopMusicMidi() ; break ; case LM_PLAY_CD_TRACK: #ifdef CDROM PlayCdTrack( *PtrPrg++ ) ; #else PtrPrg++ ; #endif break ; case LM_PROJ_ISO: SetIsoProjection( 320-8-1, 240, SIZE_BRICK_XZ ) ; SetPosCamera( 0,0,0 ) ; SetAngleCamera( 0,0,0 ) ; SetLightVector( AlphaLight, BetaLight, 0 ) ; break ; case LM_PROJ_3D: Cls() ; CopyScreen( Log, Screen ) ; Flip() ; FlagAffGrille = FALSE ; SetProjection( 320, 240, 128,1024,1024 ) ; SetFollowCamera( 0,1500,0, 25,-128,0, 13000 ) ; SetLightVector( 896, 950, 0 ) ; InitDial( 1 ) ; break ; case LM_TEXT: if( TextLig < 440 ) { num = *(WORD*)PtrPrg ; if( !Version_US ) { if( num == 0 ) num = 16 ; } GetMultiText( num, string ) ; PtrPrg += 2 ; dx = SizeFont( string ) ; CoulFont( 15 ) ; Font( 0, TextLig, string ) ; if( dx > 639 ) dx = 639 ; CopyBlockPhys( 0, TextLig, dx, TextLig+40 ) ; TextLig += 40 ; } break ; case LM_CLEAR_TEXT: TextLig = 0 ; Box( 0,0, 639, 40*6, 0 ) ; CopyBlockPhys( 0,0, 639, 40*6 ) ; break ; } } }