#include "c_extern.h" /*══════════════════════════════════════════════════════════════════════════* *══════════════════════════════════════════════════════════════════════════*/ /*──────────────────────────────────────────────────────────────────────────*/ LONG MixMusic = 1 ; // Flag Mixer for Music extern LONG MaxVolume ; // Max Music Volume if no Mixer #define HAUTEUR_STANDARD 50 #define MENU_SPACE 6 #define COUL_TEXT_MENU 15 // trouver blanc palette jeu #define COUL_SELECT_MENU 68 #define COUL_INPUT_NAME 112 #define COUL_LETTER_INPUT 15 WORD LargeurMenu = 550 ; UWORD GameMainMenu[] = { 0, // selected 4, // nb entries 200, // y center 0, // .dia num 0, 20, // start a new game game 0, 21, // continue game 0, 23, // options 0, 22 // ret dos } ; UWORD GameQuitMenu[] = { 0, // selected 2, // nb entries 240, // y center 0, // .dia num 0, 28, // continuer jeu 0, 27 // abandonner partie } ; UWORD GameOptionMenu[] = { 0, // selected 4, // nb entries 0, // y from top. 0, // .dia num 0, 24, // annuler 0, 30, // reglages volumes 0, 46, // gestion saved game 0, 47 // advanced options } ; UWORD GameAdvancedMenu[] = { 0, // selected 5, // nb entries 0, // y from top. 0, // .dia num 0, 26, // retour 0, 4, // agressif auto/manuel 6, 31, // niveau details 7, 32, // ombres on/off 8, 33 // zoom on/off } ; UWORD GameVolumeMenu[] = { 0, // selected 7, // nb entries 0, // y from top. 0, // .dia num 0, 26, // retour prec 1, 10, // type musvol / num text 2, 11, // type sampvol 3, 12, // type cdvol 4, 13, // type linevol 5, 14, // type mastervol 0, 16 // save settings } ; UWORD SavedGameMenu[] = { 0, // selected 3, // nb entries 0, // y from top. 0, // .dia num 0, 26, // retour menu prec 0, 41, // copier une sauvegarde 0, 45 // détruire une sauvegarde } ; UWORD SavedConfirmMenu[] = { 0, // selected 2, // nb entries 240, // y center. 0, // .dia num 0, 24, // annuler 0, 48 // détruire une sauvegarde } ; UWORD GameChoiceMenu[] = { 0, // selected 7, // nb entries 0, // y from top. byte 8( 0, // .dia num 0, 0, 0, 1, 0, 2, 0, 3, 0, 4, 0, 5, 0, 6 } ; ULONG TimerSample ; // save players games #define MAX_PLAYER 50 UBYTE NumVersion = 0 ; #define NB_CAR_H 14 #define NB_CAR_V 5 #define MAX_SIZE_PLAYER_NAME 29 UBYTE GamePathname[_MAX_PATH] ; //UBYTE PlayerGameFile[_MAX_PATH] ; UBYTE PlayerName[MAX_SIZE_PLAYER_NAME+1] ; /*──────────────────────────────────────────────────────────────────────────*/ // UBYTE TabInvOrder[] = { WORD ListBetaGame[MAX_FLAGS_GAME] ; #define SIZE_INV_OBJ_X 75 #define SIZE_INV_OBJ_Y 65 WORD InvSelect = 0 ; WORD InvCoul = COUL_SELECT_MENU ; #define INV_START_X 17 #define INV_START_Y 10 /*──────────────────────────────────────────────────────────────────────────*/ #define SIZE_FOUND_OBJ 130 /*──────────────────────────────────────────────────────────────────────────*/ T_REAL_VALUE RealRot ; UBYTE *Ptr3do ; WORD TabAnim[4] ; WORD FrameAnim[4] ; extern WORD ZoneGrm ; extern WORD IndexGrm ; #define CTRL_X0 100 #define CTRL_Y0 100 #define CTRL_X1 550 #define CTRL_Y1 290 /*══════════════════════════════════════════════════════════════════════════* *══════════════════════════════════════════════════════════════════════════*/ /*──────────────────────────────────────────────────────────────────────────*/ void Init3DGame() { SetIsoProjection( 320-8-1, 240, SIZE_BRICK_XZ ) ; SetPosCamera( 0,0,0 ) ; SetAngleCamera( 0,0,0 ) ; SetLightVector( AlphaLight, BetaLight, 0 ) ; } extern UBYTE *Imagen ; /*──────────────────────────────────────────────────────────────────────────*/ void DrawFire( WORD x0, WORD y0, WORD x1, WORD y1, WORD coul ) { DoFire( y0, coul ) ; if( !Rnd(5) ) { BufSpeak[ Rnd(320*10)+20*320 ] = 255 ; } } void WaitReleaseSpace() { SaveTimer() ; while( (Fire & F_SPACE) OR (Key == K_ESC) ) ; RestoreTimer() ; } /*══════════════════════════════════════════════════════════════════════════* █▀▀▀▀ █▀▀▀█ █▄ ▄█ █▀▀▀▀ █▄ ▄█ █▀▀▀▀ ██▄ █ █ █ ██ ▀█ ██▀▀█ ██▀ █ ██▀▀ ██▀ █ ██▀▀ ██▀██ ██ █ ▀▀▀▀▀ ▀▀ ▀ ▀▀ ▀ ▀▀▀▀▀ ▀▀▀▀▀ ▀▀ ▀ ▀▀▀▀▀ ▀▀ ▀ ▀▀▀▀▀ *══════════════════════════════════════════════════════════════════════════*/ /*══════════════════════════════════════════════════════════════════════════*/ void DrawObj3D( WORD x0, WORD y0, WORD x1, WORD y1, WORD y3d , WORD betaflag , UBYTE *ptr3do ) { WORD beta ; SetIsoProjection( (x1+x0)/2, (y1+y0)/2, 0 ) ; SetClip( x0,y0, x1,y1 ) ; if( betaflag == -1 ) { beta = GetRealAngle( &RealRot ) ; if( RealRot.TimeValue == 0 ) { InitRealAngle( beta, beta-256, 50, &RealRot ) ; } } else { beta = betaflag ; } AffObjetIso( 0,y3d,0, 0,beta,0, ptr3do ) ; } /*══════════════════════════════════════════════════════════════════════════*/ void DrawCadre( WORD x0, WORD y0, WORD x1, WORD y1 ) { Line( x0 , y0 , x1, y0, 79 ) ; Line( x0 , y0 , x0, y1, 79 ) ; Line( x1 , y0+1, x1, y1, 73 ) ; Line( x0+1, y1 , x1, y1, 73 ) ; } /*══════════════════════════════════════════════════════════════════════════* █▀▀▀▀ █▀▀▀█ █▄ ▄█ █▀▀▀█ █▀▀▀█ █▀▀▀█ ▀▀█▀▀ █▀▀▀▀ █▄ ▄█ █▀▀▀▀ ██▄ █ ▀▀█▀▀ ██ ██ █ ██▀ █ ██▀▀▀ ██ █ ██▀█▀ ██ ██▀▀ ██▀ █ ██▀▀ ██▀██ ██ ▀▀▀▀▀ ▀▀▀▀▀ ▀▀ ▀ ▀▀ ▀▀▀▀▀ ▀▀ ▀ ▀▀ ▀▀▀▀▀ ▀▀ ▀ ▀▀▀▀▀ ▀▀ ▀ ▀▀ *══════════════════════════════════════════════════════════════════════════*/ /*──────────────────────────────────────────────────────────────────────────*/ void DrawComportement( WORD comportement, WORD beta, WORD copyblock ) { WORD x0, y0, x1, y1 ; UBYTE *ptranim ; WORD frameanim ; x0 = CTRL_X0+10 + comportement * 110 ; y0 = CTRL_Y0+10 ; x1 = x0+99 ; y1 = y0+119 ; ptranim = HQR_Get( HQR_Anims, TabAnim[comportement] ) ; frameanim = FrameAnim[comportement] ; if( SetInterAnimObjet( frameanim, ptranim, Ptr3do ) ) { frameanim++ ; if( frameanim == GetNbFramesAnim( ptranim ) ) { frameanim = GetBouclageAnim( ptranim ) ; } FrameAnim[comportement] = frameanim ; } if( !copyblock ) /* init */ { DrawCadre( x0-1, y0-1, x1+1, y1+1 ) ; } MemoClip() ; UnSetClip() ; if( comportement != Comportement ) { Box( x0,y0, x1,y1, 0 ) ; /* CopyBlock( x0,y0, x1,y1, Screen, x0, y0, Log ) ; ShadeBox( x0,y0, x1,y1, 3 ) ; */ } else { Box( x0,y0, x1,y1, 68 ) ; /* CopyBlock( CTRL_X0+10, CTRL_Y0+139, CTRL_X1-10, CTRL_Y0+139+40, Screen, CTRL_X0+10, CTRL_Y0+139, Log ) ; ShadeBox( CTRL_X0+10, CTRL_Y0+139, CTRL_X1-10, CTRL_Y0+139+40, 4 ) ; */ Box( CTRL_X0+10, CTRL_Y0+139, CTRL_X1-10, CTRL_Y0+139+40, 0 ) ; DrawCadre( CTRL_X0+10, CTRL_Y0+139, CTRL_X1-10, CTRL_Y0+139+40 ) ; CoulFont( 15 ) ; if( Comportement == C_AGRESSIF AND CombatAuto == TRUE ) GetMultiText( 4, String ) ; else GetMultiText( Comportement, String ) ; Font( (CTRL_X1+CTRL_X0-SizeFont( String ))/2, CTRL_Y0+140, String ) ; } DrawObj3D( x0, y0, x1, y1, -600, beta, Ptr3do ) ; /* if( comportement != Comportement ) { // ShadeBox( x0,y0, x1,y1, 5 ) ; } else { // Rect( x0+1,y0+1, x1-1,y1-1, 12 ) ; Rect( x0+2,y0+2, x1-2,y1-2, 12 ) ; } */ if( copyblock ) { CopyBlockPhys( x0,y0,x1,y1 ) ; CopyBlockPhys( CTRL_X0+10, CTRL_Y0+139, CTRL_X1-10, CTRL_Y0+139+40 ) ; } RestoreClip() ; } /*══════════════════════════════════════════════════════════════════════════*/ /*══════════════════════════════════════════════════════════════════════════*/ void DrawInfoMenu( WORD x0, WORD y0 ) { WORD x,x1 ; WORD l ; WORD lifepoint ; UnSetClip() ; DrawCadre( x0,y0, x0+450, y0+80 ) ; /*Shade*/Box( x0+1,y0+1, x0+450-1, y0+80-1, 0/*3*/ ) ; // Life Points (max 50) // AffGraph( 4, x0+9, y0+13, PtrSpriteExtra ) ; AffGraph( 0, x0+9, y0+13, HQR_Get(HQRPtrSpriteExtra, 4) ) ; lifepoint = ListObjet[NUM_PERSO].LifePoint ; x = RegleTrois32( x0+25, x0+325, 50, lifepoint ) ; Box( x0+25, y0+10, x, y0+10+15, 91 ) ; Box( x, y0+10, x0+325, y0+10+15, 0 ) ; DrawCadre( x0+25, y0+10, x0+325, y0+10+15 ) ; // Magic level (max 4) MagicPoint (max 80) if( !ListFlagGame[FLAG_CONSIGNE] AND ListFlagGame[FLAG_TUNIQUE] ) { // AffGraph( 5, x0+9, y0+36, PtrSpriteExtra ) ; AffGraph( 0, x0+9, y0+36, HQR_Get(HQRPtrSpriteExtra, 5) ) ; if( MagicLevel ) { x = RegleTrois32( x0+25, x0+325, 80, MagicPoint ) ; Box( x0+25, y0+35, x, y0+35+15, 75 ) ; for( l=0; lPtrFile3D ; Ptr3do = PtrBody[ptrobj->Body] ; TabAnim[0] = AnimRienNormal ; TabAnim[1] = AnimRienSportif ; TabAnim[2] = AnimRienAgressif ; TabAnim[3] = AnimRienDiscret ; InitRealAngle( ptrobj->Beta, ptrobj->Beta-256, 50, &RealRot ) ; CopyScreen( Log, Screen ) ; memoisland = Island ; Island = 255 ; memoflagspeak = FlagSpeak ; FlagSpeak = FALSE ; InitDial( 0 ) ; DrawMenuComportement( ptrobj->Beta ) ; oldcomp = Comportement ; SetAnimObjet( FrameAnim[Comportement], HQR_Get( HQR_Anims, TabAnim[Comportement] ), Ptr3do ) ; while( (Fire & F_CTRL) OR ((Key>=K_F1) AND (Key<=K_F4)) ) { #ifdef DEBUG_TOOLS CheckSavePcx() ; #endif MyJoy = Joy ; /* if( Comportement == C_AGRESSIF ) { if( MyJoy & J_UP ) CombatAuto = TRUE ; if( MyJoy & J_DOWN ) CombatAuto = FALSE ; } */ if( MyJoy & J_RIGHT ) Comportement++ ; if( MyJoy & J_LEFT ) Comportement-- ; Comportement &= 3 ; if( Comportement != oldcomp ) { DrawComportement( oldcomp, ptrobj->Beta, TRUE ) ; oldcomp = Comportement ; InitRealAngle( ptrobj->Beta, ptrobj->Beta-256, 50, &RealRot ) ; SetAnimObjet( FrameAnim[Comportement], HQR_Get( HQR_Anims, TabAnim[Comportement] ), Ptr3do ) ; while( Joy ) DrawComportement( Comportement, -1, TRUE ) ; } DrawComportement( Comportement, -1, TRUE ) ; } SetComportement( Comportement ) ; Init3DGame() ; Island = memoisland ; FlagSpeak = memoflagspeak ; InitDial( START_FILE_ISLAND+Island ) ; RestoreTimer() ; } /*══════════════════════════════════════════════════════════════════════════* █ ██▄ █ █ █ █▀▀▀▀ ██▄ █ ▀▀█▀▀ █▀▀▀█ █▀▀▀█ █ ▄▀ ██ ██▀██ ██ ▄▀ ██▀▀ ██▀██ ██ ██ █ ██▀█▀ ██▀ ▀▀ ▀▀ ▀ ▀▀▀ ▀▀▀▀▀ ▀▀ ▀ ▀▀ ▀▀▀▀▀ ▀▀ ▀ ▀▀ *══════════════════════════════════════════════════════════════════════════*/ /*──────────────────────────────────────────────────────────────────────────*/ /*──────────────────────────────────────────────────────────────────────────*/ void Draw3dObject( WORD x, WORD y, WORD *ptrobj, WORD beta, WORD zoom ) { SetProjection( x,y,128,200,200 ) ; SetFollowCamera( 0,0,0, 60,0,0, zoom ) ; if( !ptrobj ) { Message( "ptrobj = 0", TRUE ) ; } else { AffObjetIso( 0,0,0, 0,beta,0, ptrobj ) ; } } /*──────────────────────────────────────────────────────────────────────────*/ void DrawOneInventory( WORD flagnum ) { WORD x, y, x0, y0, x1, y1 ; WORD *ptrobj ; x = INV_START_X + 10 + SIZE_INV_OBJ_X/2 + (SIZE_INV_OBJ_X+10) * (flagnum/4) ; y = INV_START_Y + 10 + SIZE_INV_OBJ_Y/2 + (SIZE_INV_OBJ_Y+10) * (flagnum&3) ; x0 = x - SIZE_INV_OBJ_X/2 ; y0 = y - SIZE_INV_OBJ_Y/2 ; x1 = x + SIZE_INV_OBJ_X/2 ; y1 = y + SIZE_INV_OBJ_Y/2 ; if( flagnum == InvSelect ) { Box( x0, y0, x1, y1, InvCoul ) ; } else { Box( x0, y0, x1, y1, 0 ) ; // CopyBlock( x0, y0, x1, y1, Screen, x0, y0, Log ) ; // ShadeBox( x0, y0, x1, y1, 4 ) ; } if( (ListFlagGame[flagnum]) AND ((ListFlagGame[FLAG_CONSIGNE]==0) OR (flagnum==FLAG_CLOVER)) ) { ptrobj = HQR_Get( InventoryObj, flagnum ) ; if( HQR_Flag ) { PatchObjet( ptrobj ) ; } Draw3dObject( x, y, ptrobj, ListBetaGame[flagnum]+=8, 15000 ) ; if( flagnum == 15 ) // carburant { CoulFont( 15 ) ; Font( x0+3,y0+32, Itoa( Fuel ) ) ; } } DrawCadre( x0, y0, x1, y1 ) ; CopyBlockPhys( x0,y0, x1,y1 ) ; } /*──────────────────────────────────────────────────────────────────────────*/ void DrawListInventory() { WORD x, y ; WORD n = 0 ; WORD x0, y0, x1, y1 ; x0 = INV_START_X ; y0 = INV_START_Y ; x1 = x0 + (SIZE_INV_OBJ_X+10)*7 + 10 ; y1 = y0 + (SIZE_INV_OBJ_Y+10)*4 + 10 ; ShadeBox( x0,y0, x1,y1, 4 ) ; DrawCadre( x0,y0, x1,y1 ) ; /* DrawCadre( INV_START_X+ 10 - 2 + (SIZE_INV_OBJ_X+10) * 0, INV_START_Y+ 10 - 2 + (SIZE_INV_OBJ_Y+10) * 1, INV_START_X+ 1 + (SIZE_INV_OBJ_X+10) * 1, INV_START_Y+ 1 + (SIZE_INV_OBJ_Y+10) * 3 ) ; */ Rect( INV_START_X+ 10 - 2 + (SIZE_INV_OBJ_X+10) * 1, INV_START_Y+ 10 - 2 + (SIZE_INV_OBJ_Y+10) * 0, INV_START_X+ 1 + (SIZE_INV_OBJ_X+10) * 2, INV_START_Y+ 1 + (SIZE_INV_OBJ_Y+10) * 4, 75 ) ; CopyBlockPhys( x0,y0, x1,y1 ) ; for( n=0; n 0 ) ListFlagGame[FLAG_CLOVER] = TRUE ; else ListFlagGame[FLAG_CLOVER] = FALSE ; InvCoul = COUL_SELECT_MENU ; DrawListInventory() ; // draw all memoflagspeak = FlagSpeak ; FlagSpeak = FALSE ; InitDial( 2 ) ; // game divers txt dialstat = 3 ; TestCoulDial( 4 ) ; InitDialWindow() ; while( Key != K_ESC ) { #ifdef DEBUG_TOOLS CheckSavePcx() ; #endif oldselect = InvSelect ; if( !flag ) { MyJoy = Joy ; MyFire = Fire ; MyKey = Key ; if( MyJoy OR Fire ) flag = 1 ; } else { MyFire = MyJoy = MyKey = 0 ; if( !Joy AND !Fire ) flag = 0 ; } if( (MyKey == K_ESC) OR (MyFire&F_SHIFT) ) { break ; } if( MyJoy & J_DOWN ) { InvSelect++ ; if( InvSelect >= MAX_INVENTORY ) InvSelect = 0 ; DrawOneInventory( oldselect ) ; dialstat = 3 ; } if( MyJoy & J_UP ) { InvSelect-- ; if( InvSelect < 0 ) InvSelect = MAX_INVENTORY - 1 ; DrawOneInventory( oldselect ) ; dialstat = 3 ; } if( MyJoy & J_LEFT ) { InvSelect -= 4 ; if( InvSelect < 0 ) InvSelect = MAX_INVENTORY + InvSelect ; DrawOneInventory( oldselect ) ; dialstat = 3 ; } if( MyJoy & J_RIGHT ) { InvSelect += 4 ; if( InvSelect >= MAX_INVENTORY ) InvSelect = InvSelect - MAX_INVENTORY ; DrawOneInventory( oldselect ) ; dialstat = 3 ; } if( dialstat == 3 ) { SecondInitDialWindow() ; if( (ListFlagGame[InvSelect]==1) AND ((ListFlagGame[FLAG_CONSIGNE]==0) OR (InvSelect==FLAG_CLOVER)) ) { OpenDialNoWindow( InvSelect+100 ) ; dialstat = 0 ; } else { OpenDialNoWindow( 128 ) ; dialstat = 0 ; } } if( dialstat != 2 ) { dialstat = NextDialCar() ; } if( dialstat != 1 ) // en cours lecture { Vsync() ; } if( MyFire & F_SPACE ) { if( dialstat == 2 ) { SecondInitDialWindow() ; dialstat = 0 ; } else { if( (ListFlagGame[InvSelect]==1) AND ((ListFlagGame[FLAG_CONSIGNE]==0) OR (InvSelect==FLAG_CLOVER)) ) { SecondInitDialWindow() ; OpenDialNoWindow( InvSelect+100 ) ; } } } DrawOneInventory( InvSelect ) ; if( MyFire & F_RETURN ) { if( (ListFlagGame[InvSelect]==1) AND ((ListFlagGame[FLAG_CONSIGNE]==0) OR (InvSelect==FLAG_CLOVER)) ) { InventoryAction = InvSelect ; InvCoul = 91 ; // rouge DrawOneInventory( InvSelect ) ; break ; } } } CloseDial() ; AlphaLight = memoalphalight ; BetaLight = memobetalight ; Init3DGame() ; FlagSpeak = memoflagspeak ; InitDial( START_FILE_ISLAND+Island ) ; while( Key OR Fire ) ; } /*══════════════════════════════════════════════════════════════════════════* █▀▀▀▀ █▀▀▀█ █ █ ██▄ █ █▀▀▀▄ █▀▀▀█ █▀▀█ █ █▀▀▀▀ █▀▀▀▀ ▀▀█▀▀ ██▀▀ ██ █ ██ █ ██▀██ ██ █ ██ █ ██▀▀█ ▄▄ █ ██▀▀ ██ ██ ▀▀ ▀▀▀▀▀ ▀▀▀▀▀ ▀▀ ▀ ▀▀▀▀ ▀▀▀▀▀ ▀▀▀▀▀ ▀▀▀▀▀ ▀▀▀▀▀ ▀▀▀▀▀ ▀▀▀▀▀ ▀▀ *══════════════════════════════════════════════════════════════════════════*/ /*──────────────────────────────────────────────────────────────────────────*/ void DoFoundObj( WORD numobj ) { char string[256] ; WORD *ptr3do ; T_OBJET *ptrobj ; WORD xm, ym, zm, xw, yw, zw ; WORD x, y, x0, y0, x1, y1 ; ULONG timerend ; WORD dialstat ; WORD flag ; UBYTE *ptranim ; WORD numanim ; WORD frameanim ; LONG memoflagspeak ; LONG speakfromcd ; LONG memotimersystem ; ptrobj = &ListObjet[NUM_PERSO] ; // reaff scene recentree sans twinkel StartXCube = ((ListObjet[NUM_PERSO].PosObjX+DEMI_BRICK_XZ)/SIZE_BRICK_XZ) ; StartYCube = ((ListObjet[NUM_PERSO].PosObjY+SIZE_BRICK_Y)/SIZE_BRICK_Y) ; StartZCube = ((ListObjet[NUM_PERSO].PosObjZ+DEMI_BRICK_XZ)/SIZE_BRICK_XZ) ; ptrobj->Flags |= INVISIBLE ; AffScene( TRUE ) ; ptrobj->Flags &= ~INVISIBLE ; CopyScreen( Log, Screen ) ; // reaff twinksen anim trouve xw = StartXCube*SIZE_BRICK_XZ ; yw = StartYCube*SIZE_BRICK_Y ; zw = StartZCube*SIZE_BRICK_XZ ; AffObjetIso( ptrobj->PosObjX-xw, ptrobj->PosObjY-yw, ptrobj->PosObjZ-zw, 0, 128/*ptrobj->Beta*/, 0, PtrBody[ptrobj->Body] ) ; SetClip( ScreenXmin, ScreenYmin, ScreenXmax, ScreenYmax ) ; xm = ((ptrobj->PosObjX+DEMI_BRICK_XZ)/SIZE_BRICK_XZ) ; ym = ((ptrobj->PosObjY)/SIZE_BRICK_Y) ; if( (ptrobj->Col&127) != 0 ) ym++ ; zm = ((ptrobj->PosObjZ+DEMI_BRICK_XZ)/SIZE_BRICK_XZ) ; DrawOverBrick( xm, ym, zm ) ; Flip() ; ProjettePoint( ptrobj->PosObjX-xw, ptrobj->PosObjY-yw, ptrobj->PosObjZ-zw ) ; Yp -= 150 ; x0 = Xp - SIZE_FOUND_OBJ/2 ; y0 = Yp - SIZE_FOUND_OBJ/2 ; x1 = Xp + SIZE_FOUND_OBJ/2 ; y1 = Yp + SIZE_FOUND_OBJ/2 ; HQ_MixSample( 41, 0x1000, 1, 128, 128 ) ; // aff text et objet #ifdef CDROM if( IsVoiceFileOnHD( 2 ) ) { // voix sur hd touche à rien InitDial( 2 ) ; // game divers txt speakfromcd = FALSE ; } else // coupe music cd si on { StopMusicCD() ; memoflagspeak = FlagSpeak ; FlagSpeak = FALSE ; InitDial( 2 ) ; FlagSpeak = memoflagspeak ; speakfromcd = TRUE ; } #else InitDial( 2 ) ; // game divers txt #endif UnSetClip() ; OpenDial( numobj ) ; // timerend = TimerRef + 50 * 30 ; dialstat = 1 ; flag = FALSE ; TestCoulDial( 4 ) ; // coul twinsen #ifdef CDROM if( speakfromcd ) { SpeakFromCD( 2, numobj ) ; } else { Speak( numobj ) ; } #endif numanim = SearchAnim( GEN_ANIM_TROUVE, NUM_PERSO ) ; ptranim = HQR_Get( HQR_Anims, numanim ) ; #ifdef DEBUG_TOOLS if( numanim == -1 ) { Message( "num anim 'trouve' = -1 in DoFoundObj", TRUE ) ; goto argexit ; } if( !ptranim ) { Message( "ptranim = 0 in DoFoundObj", TRUE ) ; goto argexit ; } #endif frameanim = 0 ; PtrBufferAnim += StockInterAnim( PtrBufferAnim, PtrBody[ptrobj->Body] ) ; if( PtrBufferAnim > BufferAnim + 5000 - 512 ) PtrBufferAnim = BufferAnim ; ptr3do = HQR_Get( InventoryObj, numobj ) ; if( HQR_Flag ) { PatchObjet( ptr3do ) ; } NbOptPhysBox = 0 ; // clear list cls boxes while( flag == FALSE ) { UnSetClip() ; NbPhysBox = 0 ; ClsBoxes() ; ShadeBox( x0, y0, x1, y1, 4 ) ; SetClip( x0, y0, x1, y1 ) ; Draw3dObject( Xp, Yp, ptr3do, ListBetaGame[numobj]+=8, 10000 ) ; DrawCadre( x0, y0, x1, y1 ) ; AddPhysBox( x0,y0, x1,y1 ) ; UnSetClip() ; Init3DGame() ; // reaff twinkel anim trouve if( SetInterAnimObjet( frameanim, ptranim, PtrBody[ptrobj->Body] ) ) { frameanim++ ; if( frameanim == GetNbFramesAnim( ptranim ) ) { frameanim = GetBouclageAnim( ptranim ) ; } } AffObjetIso( ptrobj->PosObjX-xw, ptrobj->PosObjY-yw, ptrobj->PosObjZ-zw, 0, 128/*ptrobj->Beta*/, 0, PtrBody[ptrobj->Body] ) ; SetClip( ScreenXmin, ScreenYmin, ScreenXmax, ScreenYmax ) ; DrawOverBrick( xm, ym, zm ) ; AddPhysBox( ScreenXmin, ScreenYmin, ScreenXmax, ScreenYmax ) ; // message if( dialstat == 1 ) { UnSetClip() ; dialstat = NextDialCar() ; } if( dialstat != 1 ) // pas en cours lecture { Vsync() ; } FlipBoxes() ; if( Fire ) { if( dialstat == 0 ) { flag = TRUE ; } if( dialstat == 2 ) { dialstat = 1 ; // continue } } } #ifdef DEBUG_TOOLS argexit: #endif #ifdef CDROM if( speakfromcd ) { while( TestSpeakFromCD() AND (Key != K_ESC) ) ; } else { while( TestSpeak() AND (Key != K_ESC) ) ; } StopSpeak() ; #endif Init3DGame() ; InitDial( START_FILE_ISLAND+Island ) ; while( Key == K_ESC ) ; } /*══════════════════════════════════════════════════════════════════════════*/ /*══════════════════════════════════════════════════════════════════════════*/ void ExtInitMcga() { int i ; char num[10] ; if (Wave_Driver_Enable) while( !WavePause() ) ; InitMcgaMode() ; if( FlagPalettePcx ) Palette( PalettePcx ) ; else Palette( PtrPal ) ; WaveContinue() ; FlagMCGA = TRUE ; } void ExtInitSvga() { if (Wave_Driver_Enable) while( !WavePause() ) ; SimpleInitSvga() ; if( FlagPalettePcx ) Palette( PalettePcx ) ; else Palette( PtrPal ) ; FlagMCGA = FALSE ; WaveContinue() ; } void TestRestoreModeSVGA( LONG flag ) { if( FlagMCGA ) { ExtInitSvga() ; if( flag ) AffScene(TRUE) ; } } /*══════════════════════════════════════════════════════════════════════════*/ void CopyBlockPhysMCGA( LONG x0, LONG y0, LONG x1, LONG y1 ) { LONG x, y ; /* x = (x0+x1)/2 - 160 ; y = (y0+y1)/2 - 100 ; */ x = x0 - 160 ; y = y0 - 140 ; if( x > 640-320 ) x = 640-320 ; if( x < 0 ) x = 0 ; if( y > 480-200 ) y = 480-200 ; if( y < 0 ) y = 0 ; CopyBlockMCGA( x,y, x+319, y+199, Log, 0,0,0xA0000 ) ; } /*══════════════════════════════════════════════════════════════════════════* ██▀▀▀ █▀▀▀█ █ █ █▀▀▀▀ █ █▀▀▀█ █▀▀▀█ █▀▀▀▄ ▀▀▀▀█ ██▀▀█ ██ ▄▀ ██▀▀ ██ ██ █ ██▀▀█ ██ █ ▀▀▀▀▀ ▀▀ ▀ ▀▀▀ ▀▀▀▀▀ ▀▀▀▀▀ ▀▀▀▀▀ ▀▀▀▀▀ ▀▀ ▀ ▀▀▀▀ *══════════════════════════════════════════════════════════════════════════*/ /*──────────────────────────────────────────────────────────────────────────*/ WORD PlayerGameList( UBYTE **ptrlistname, UBYTE *listname ) { struct find_t fileinfo ; ULONG rc ; UBYTE wbyte ; UBYTE pathname[_MAX_PATH] ; WORD nb = 0 ; ULONG handle ; strcpy( pathname, PATH_RESSOURCE"*.LBA" ) ; rc = _dos_findfirst( pathname, _A_NORMAL, &fileinfo ) ; while( !rc ) { strcpy( pathname, PATH_RESSOURCE ) ; strcat( pathname, fileinfo.name ) ; handle = OpenRead( pathname ) ; if( handle ) { Read( handle, &wbyte, 1 ) ; // num version *ptrlistname++ = listname ; do { Read( handle, &wbyte, 1 ) ; *listname++ = wbyte ; } while( wbyte != 0 ) ; Close( handle ) ; nb++ ; if( nb == MAX_PLAYER ) return nb ; } rc = _dos_findnext( &fileinfo ) ; } return nb ; } /*──────────────────────────────────────────────────────────────────────────*/ WORD FindPlayerFile() { struct find_t fileinfo ; ULONG rc ; UBYTE pathname[_MAX_PATH] ; UBYTE playername[MAX_SIZE_PLAYER_NAME+1] ; UBYTE *ptr ; ULONG handle ; UBYTE wbyte ; strcpy( pathname, PATH_RESSOURCE"*.LBA" ) ; rc = _dos_findfirst( pathname, _A_NORMAL, &fileinfo ) ; while( !rc ) { strcpy( pathname, PATH_RESSOURCE ) ; strcat( pathname, fileinfo.name ) ; handle = OpenRead( pathname ) ; Read( handle, &wbyte, 1 ) ; // num version ptr = playername ; do { Read( handle, &wbyte, 1 ) ; *ptr++ = wbyte ; } while( wbyte != 0 ) ; Close( handle ) ; if( !stricmp( PlayerName, playername ) ) { strcpy( GamePathname, PATH_RESSOURCE ) ; strcat( GamePathname, fileinfo.name ) ; return TRUE ; } rc = _dos_findnext( &fileinfo ) ; } return FALSE ; } /*──────────────────────────────────────────────────────────────────────────*/ void SaveGame() { WORD handle ; WORD wword ; UBYTE wbyte ; handle = OpenWrite( GamePathname ) ; if( !handle ) { Message( "Error Writing Saved Game", TRUE ) ; return ; } NumVersion = 3 ; Write( handle, &NumVersion, 1 ) ; Write( handle, PlayerName, strlen(PlayerName)+1 ) ; // list flag game wbyte = MAX_FLAGS_GAME ; Write( handle, &wbyte, 1 ) ; // nb octets Write( handle, ListFlagGame, MAX_FLAGS_GAME ) ; // infos jeu Write( handle, &NumCube, 1 ) ; Write( handle, &Chapitre, 1 ) ; Write( handle, &Comportement, 1 ) ; Write( handle, &ListObjet[NUM_PERSO].LifePoint, 1 ) ; Write( handle, &NbGoldPieces, 2 ) ; Write( handle, &MagicLevel, 1 ) ; Write( handle, &MagicPoint, 1 ) ; Write( handle, &NbCloverBox, 1 ) ; Write( handle, &SceneStartX, 2 ) ; Write( handle, &SceneStartY, 2 ) ; Write( handle, &SceneStartZ, 2 ) ; Write( handle, &ListObjet[NUM_PERSO].Beta, 2 ) ; Write( handle, &ListObjet[NUM_PERSO].GenBody, 1 ) ; // tabholopos wbyte = MAX_HOLO_POS ; Write( handle, &wbyte, 1 ) ; Write( handle, TabHoloPos, wbyte ) ; // others Write( handle, &Fuel, 1 ) ; // used inventory wbyte = MAX_INVENTORY ; Write( handle, &wbyte, 1 ) ; // nb octets Write( handle, ListFlagInventory, MAX_INVENTORY ) ; // others Write( handle, &NbFourLeafClover, 1 ) ; Write( handle, &Weapon, 2 ) ; Close( handle ) ; } /*──────────────────────────────────────────────────────────────────────────*/ void LoadGame() { WORD handle ; WORD wword ; UBYTE wbyte ; UBYTE *ptr ; handle = OpenRead( GamePathname ) ; Read( handle, &wbyte, 1 ) ; // num version ptr = PlayerName ; do { Read( handle, &wbyte, 1 ) ; *ptr++ = wbyte ; } while( wbyte != 0 ) ; // list flag game Read( handle, &wbyte, 1 ) ; // nb octets Read( handle, ListFlagGame, wbyte ) ; NewCube = 0 ; Read( handle, &NewCube, 1 ) ; Read( handle, &Chapitre, 1 ) ; Read( handle, &Comportement, 1 ) ; SaveComportement = Comportement ; Read( handle, &ListObjet[NUM_PERSO].LifePoint, 1 ) ; Read( handle, &NbGoldPieces, 2 ) ; Read( handle, &MagicLevel, 1 ) ; Read( handle, &MagicPoint, 1 ) ; Read( handle, &NbCloverBox, 1 ) ; Read( handle, &SceneStartX, 2 ) ; Read( handle, &SceneStartY, 2 ) ; Read( handle, &SceneStartZ, 2 ) ; Read( handle, &ListObjet[NUM_PERSO].Beta, 2 ) ; SaveBeta = ListObjet[NUM_PERSO].Beta ; Read( handle, &ListObjet[NUM_PERSO].GenBody, 1 ) ; // tabholopos Read( handle, &wbyte, 1 ) ; Read( handle, TabHoloPos, wbyte ) ; // others Read( handle, &Fuel, 1 ) ; // used inventory Read( handle, &wbyte, 1 ) ; // nb octets Read( handle, ListFlagInventory, wbyte ) ; // others Read( handle, &NbFourLeafClover, 1 ) ; Read( handle, &Weapon, 2 ) ; Close( handle ) ; NumCube = -1 ; FlagChgCube = 3 ; } /*══════════════════════════════════════════════════════════════════════════* █ ██▄ █ █▀▀▀█ █ █ ▀▀█▀▀ ██▄ █ █▀▀▀█ █▄ ▄█ █▀▀▀▀ ██ ██▀██ ██▀▀▀ ██ █ ██ ██▀██ ██▀▀█ ██▀ █ ██▀▀ ▀▀ ▀▀ ▀ ▀▀ ▀▀▀▀▀ ▀▀ ▀▀▀▀▀ ▀▀ ▀ ▀▀ ▀ ▀▀ ▀ ▀▀▀▀▀ *══════════════════════════════════════════════════════════════════════════*/ /*──────────────────────────────────────────────────────────────────────────*/ /*──────────────────────────────────────────────────────────────────────────*/ void DrawOneString( WORD x, WORD y, UBYTE *playername, WORD draw ) { WORD x2, x0,y0,x1,y1 ; // UBYTE string[256] ; x0 = x - LargeurMenu/2 ; x1 = x + LargeurMenu/2 ; y0 = y - HAUTEUR_STANDARD/2 ; y1 = y + HAUTEUR_STANDARD/2 ; // fond if( draw == 0 ) { CopyBlock( x0, y0, x1, y1, Screen, x0, y0, Log ) ; ShadeBox( x0, y0, x1, y1, 4 ) ; } if( draw == 1 ) { DrawFire( x0, y0, x1, y1, COUL_INPUT_NAME&0xF0 ) ; } if( draw == 2 ) { Box( x0, y0, x1, y1, 91 ) ; } // cadre DrawCadre( x0, y0, x1, y1 ) ; // text CoulFont( COUL_TEXT_MENU ) ; // if( playername[0] != 0 ) Font( x - SizeFont( playername )/2, y-18, playername ) ; // flip CopyBlockPhys( x0,y0, x1,y1 ) ; } /*──────────────────────────────────────────────────────────────────────────*/ void DrawSingleString( WORD x, WORD y, UBYTE *string ) { WORD x2, x0,y0,x1,y1 ; WORD sf ; sf = SizeFont( string ) ; x0 = x - sf/2 ; x1 = x + sf/2 ; y0 = y - HAUTEUR_STANDARD/2 ; y1 = y + HAUTEUR_STANDARD/2 ; // cadre // DrawCadre( x0, y0, x1, y1 ) ; // text CoulFont( 0 ) ; Font( x0 + 4, y-18 + 4, string ) ; CoulFont( COUL_TEXT_MENU ) ; Font( x0, y-18, string ) ; // flip CopyBlockPhys( x0,y0, x1,y1 ) ; } /*──────────────────────────────────────────────────────────────────────────*/ UBYTE TabLetter[NB_CAR_V][NB_CAR_H] = { { ' ','A','B','C','D','E','F','G','H','I','J','K','L','M' } , { '.','N','O','P','Q','R','S','T','U','V','W','X','Y','Z' } , { '-','a','b','c','d','e','f','g','h','i','j','k','l','m' } , { '?','n','o','p','q','r','s','t','u','v','w','x','y','z' } , { '!','0','1','2','3','4','5','6','7','8','9',' ', 8 , 13 } } ; // { ' ','é','è','ç','à','ô','ê','â','î','8','9',' ',' ',' ' } , /*──────────────────────────────────────────────────────────────────────────*/ /* WORD SearchLetter( UBYTE car ) { WORD x, y ; for( y=0; y 0 ) PlayerName[len-1] = 0 ; else car = 0 ; } if( car == A_RETURN ) { if( len != 0 ) break ; else car = 0 ; } if( (car != A_SPACE) AND (car != 0) ) { car &= 255 ; // if( SearchLetter( car ) ) if( (car>32) AND (car<255) ) { if( len < MAX_SIZE_PLAYER_NAME ) { PlayerName[len] = car ; PlayerName[len+1] = 0 ; } } } //////////////// } if( car == A_RETURN ) { if( FindPlayerFile() == TRUE ) { nummess = 43 ; goto try_again ; } else retval = TRUE ; } #ifdef TRACE AsciiMode = memoasciimode ; #else AsciiMode = FALSE ; #endif CopyScreen( Screen, Log ) ; Flip() ; return retval ; } /*──────────────────────────────────────────────────────────────────────────*/ /*──────────────────────────────────────────────────────────────────────────*/ #define NB_GAME_CHOICE 6 WORD ChoosePlayerName( WORD mess ) { WORD flag = 1 ; UBYTE *listplayername ; UBYTE **ptrlist ; WORD n, nb ; WORD start = 0 ; WORD select = 0 ; WORD ys = 50 ; WORD retval = 0 ; UBYTE string[256] ; CopyScreen( Screen, Log ) ; Flip() ; listplayername = Malloc( MAX_PLAYER * (MAX_SIZE_PLAYER_NAME+1) ) ; ptrlist = (UBYTE**)Malloc( MAX_PLAYER * sizeof(UBYTE*) ) ; if( !listplayername OR !ptrlist ) { TheEnd( NOT_ENOUGH_MEM, "Choose Player Name" ) ; } nb = PlayerGameList( ptrlist, listplayername ) ; if( !nb ) return FALSE ; InitDial( 0 ) ; DrawSingleString( 320, 40, (UBYTE*)GetMultiText( mess,string ) ) ; while( Key != K_ESC ) { if( flag == 1 ) { for( n=0; n<6; n++ ) { if( n+start >= nb ) break ; if( (n+start) == select ) { ys = 50+50+60*n ; } DrawOneString( 320, 50+50+60*n, ptrlist[n+start], (n+start) == select ) ; } while( Joy OR Fire ) DrawOneString( 320, ys, ptrlist[select], 1 ) ; flag = 0 ; } DrawOneString( 320, ys, ptrlist[select], 1 ) ; if( Joy & J_DOWN ) { if( select < (nb-1) ) { DrawOneString( 320, ys, ptrlist[select], 0 ) ; select++ ; flag = 1 ; } if( select >= (start + 6) ) { if( start < (nb-1) ) { start++ ; } } } if( Joy & J_UP ) { if( select > 0 ) { DrawOneString( 320, ys, ptrlist[select], 0 ) ; select-- ; flag = 1 ; } if( select < start ) { start-- ; } } if( Fire ) { retval = 1 ; break ; } } strcpy( PlayerName, ptrlist[select] ) ; FindPlayerFile() ; Free( ptrlist ) ; Free( listplayername ) ; CopyScreen( Screen, Log ) ; Flip() ; return retval ; } /*══════════════════════════════════════════════════════════════════════════* █▄ ▄█ █▀▀▀▀ ██▄ █ █ █ ██▀ █ ██▀▀ ██▀██ ██ █ ▀▀ ▀ ▀▀▀▀▀ ▀▀ ▀ ▀▀▀▀▀ *══════════════════════════════════════════════════════════════════════════*/ /*──────────────────────────────────────────────────────────────────────────*/ void DrawOneChoice( WORD x, WORD y, WORD type, WORD num, WORD select ) { WORD x2, x0,y0,x1,y1 ; UBYTE string[256] ; ULONG volleft, volright ; x0 = x - LargeurMenu/2 ; x1 = x + LargeurMenu/2 ; y0 = y - HAUTEUR_STANDARD/2 ; y1 = y + HAUTEUR_STANDARD/2 ; // fond if( select ) { switch( type ) { case 1: // music volume x2 = RegleTrois32( x0, x1, 255, MusicVolume ) ; DrawFire( x0, y0, x2, y1, 91&0xF0 ) ; Box( x2, y0, x1, y1, COUL_SELECT_MENU ) ; break ; case 2: // sample volume x2 = RegleTrois32( x0, x1, 255, SampleVolume ) ; DrawFire( x0, y0, x2, y1, 91&0xF0 ) ; Box( x2, y0, x1, y1, COUL_SELECT_MENU ) ; break ; case 3: // CD volume x2 = RegleTrois32( x0, x1, 255, CDVolume ) ; DrawFire( x0, y0, x2, y1, 91&0xF0 ) ; Box( x2, y0, x1, y1, COUL_SELECT_MENU ) ; break ; case 4: // Line volume x2 = RegleTrois32( x0, x1, 255, LineVolume ) ; DrawFire( x0, y0, x2, y1, 91&0xF0 ) ; Box( x2, y0, x1, y1, COUL_SELECT_MENU ) ; break ; case 5: // Master volume x2 = RegleTrois32( x0, x1, 255, MasterVolume ) ; DrawFire( x0, y0, x2, y1, 91&0xF0 ) ; Box( x2, y0, x1, y1, COUL_SELECT_MENU ) ; break ; default: // Box( x0, y0, x1, y1, COUL_SELECT_MENU ) ; DrawFire( x0, y0, x1, y1, COUL_SELECT_MENU&0xF0 ) ; } if( (type >= 1) AND (type<=5) ) { // bruitons un peu la situation (violement) DoLoopMidi() ; if( (TimerRef-TimerSample) > 30 ) { TimerSample = TimerRef ; Balance( rand()&127, 128, &volleft, &volright ); HQ_MixSample( 34+((rand()&7)>0)*92, 0x1000, 1, volleft, volright ) ; // HQ_MixSample( Rnd( 50 ), 0x1000, 1, volleft, volright ) ; } } } else { CopyBlock( x0, y0, x1, y1, Screen, x0, y0, Log ) ; ShadeBox( x0, y0, x1, y1, 4 ) ; } // cadre DrawCadre( x0, y0, x1, y1 ) ; // text CoulFont( COUL_TEXT_MENU ) ; GetMultiText( num, string ) ; Font( x - SizeFont( string )/2, y-18, string ) ; // flip CopyBlockPhys( x0,y0, x1,y1 ) ; } /*──────────────────────────────────────────────────────────────────────────*/ void DrawGameMenu( UWORD *ptrmenu, WORD justone ) { WORD n, y ; WORD nb ; WORD selected, type, num ; selected = *ptrmenu++ ; nb = *ptrmenu++ ; y = *ptrmenu++ ; ptrmenu++ ; // dial num if( y == 0 ) // depuis le haut { y = HAUTEUR_STANDARD/2 + 10 ; } else // centre sur y { y -= ( HAUTEUR_STANDARD*nb + (nb-1)*MENU_SPACE ) / 2 ; } for( n=0; n 50 * 60) OR ((Key == K_C) AND (Fire & F_SHIFT)) ) #else if( (TimerRef - chrono > 50 * (60 * 3 + 53) ) OR ((Key == K_C) AND (Fire & F_SHIFT)) ) #endif { chrono = TimerRef ; return 9999 ; } } MyJoy = Joy ; if( MyJoy & J_DOWN ) { selected++ ; if( selected == nb ) selected = 0 ; flag = 1 ; } if( MyJoy & J_UP ) { selected-- ; if( selected < 0 ) selected = nb - 1 ; flag = 1 ; } switch( ptrmenu[4 + 0 + selected*2] ) // type { case 0: // text normal break ; case 1: // volume music if ( flag ) flagVol = 3 ; if( (MyJoy & J_LEFT) ) { MusicVolume -= 4 ; flagVol = 3 ; } if( (MyJoy & J_RIGHT) ) { MusicVolume += 4 ; flagVol = 3 ; } break ; case 2: // volume sample if ( flag ) flagVol = 3 ; if( (MyJoy & J_LEFT) ) { SampleVolume -= 4 ; flagVol = 3 ; } if( (MyJoy & J_RIGHT) ) { SampleVolume += 4 ; flagVol = 3 ; } break ; case 3: // volume cd if ( flag ) flagVol = 4 ; if( (MyJoy & J_LEFT) ) { CDVolume -= 4 ; flagVol = 4 ; } if( (MyJoy & J_RIGHT) ) { CDVolume += 4 ; flagVol = 4 ; } break ; case 4: // volume Line if ( flag ) flagVol = 5 ; if( (MyJoy & J_LEFT) ) { LineVolume -= 4 ; flagVol = 5 ; } if( (MyJoy & J_RIGHT) ) { LineVolume += 4 ; flagVol = 5 ; } break ; case 5: // volume master if ( flag ) flagVol = 2 ; if( (MyJoy & J_LEFT) ) { MasterVolume -= 4 ; flagVol = 2 ; } if( (MyJoy & J_RIGHT) ) { MasterVolume += 4 ; flagVol = 2 ; } break ; } if( flag == 1 ) { ptrmenu[0] = selected ; DrawGameMenu( ptrmenu, FALSE ) ; while( Joy OR Fire OR Key ) DrawGameMenu( ptrmenu, TRUE ) ; flag = 0 ; } else { // Vsync() ; if( flagVol ) { if( MusicVolume > 255 ) MusicVolume = 255 ; if( SampleVolume > 255 )SampleVolume = 255 ; if( LineVolume > 255 ) LineVolume = 255 ; if( CDVolume > 255 ) CDVolume = 255 ; if( MasterVolume > 255 )MasterVolume = 255 ; if( MusicVolume < 0 ) MusicVolume = 0 ; if( SampleVolume < 0 ) SampleVolume = 0 ; if( LineVolume < 0 ) LineVolume = 0 ; if( CDVolume < 0 ) CDVolume = 0 ; if( MasterVolume < 0 ) MasterVolume = 0 ; switch ( flagVol ) { case 3: SetVolumes(MusicVolume, SampleVolume, 0, 0, MasterVolume ) ; break; case 4: SetVolumes(0, SampleVolume, 0, CDVolume, MasterVolume ) ; break; case 5: SetVolumes(0, SampleVolume, LineVolume, 0, MasterVolume ) ; break; default: SetVolumes(MusicVolume, SampleVolume, LineVolume, CDVolume, MasterVolume ) ; } } DrawGameMenu( ptrmenu, TRUE ) ; flagVol = 0 ; flag = 0 ; } if( Fire & F_RETURN OR Fire & F_SPACE ) { return ptrmenu[4 + 1 + selected*2] ; // num mess } // if( Key == K_ESC ) break ; } return -1 ; } /*══════════════════════════════════════════════════════════════════════════*/ /*══════════════════════════════════════════════════════════════════════════*/ /*──────────────────────────────────────────────────────────────────────────*/ LONG OptionsMenu() { WORD select ; WORD flag = 0 ; CopyScreen( Log, Screen ) ; HQ_StopSample() ; #ifdef CDROM PlayCdTrack( 9 ) ; #else PlayMidiFile( 9 ) ; #endif while( !flag ) { select = DoGameMenu( GameOptionMenu ) ; switch( select ) // num mess { /* case -1: // esc flag = 1 ; break ; */ case 15: // retour au jeu case 26: // menu prec. flag = 1 ; break ; case 47: CopyScreen( Screen, Log ) ; Flip() ; AdvancedOptions() ; break ; case 30: CopyScreen( Screen, Log ) ; Flip() ; VolumeOptions() ; break ; case 46: CopyScreen( Screen, Log ) ; Flip() ; SavedGameManagement() ; break ; } } CopyScreen( Screen, Log ) ; Flip() ; return FALSE ; } /*══════════════════════════════════════════════════════════════════════════*/ /*══════════════════════════════════════════════════════════════════════════*/ /*──────────────────────────────────────────────────────────────────────────*/ void VolumeOptions() { WORD select ; WORD flag = 0 ; CopyScreen( Log, Screen ) ; #ifdef CDROM PlayAllMusic( 9 ) ; // he oui on lance les 2 #else PlayMidiFile( 9 ) ; #endif TimerSample = TimerRef ; while( !flag ) { select = DoGameMenu( GameVolumeMenu ) ; switch( select ) // num mess { /* case -1: // esc flag = 1 ; break ; */ case 26: // quitter #ifdef CDROM FadeMusicMidi( 1 ) ; #endif SetVolumes(MusicVolume, SampleVolume, LineVolume, CDVolume, MasterVolume ) ; flag = 1 ; break ; case 16: SetVolumes(MusicVolume, SampleVolume, LineVolume, CDVolume, MasterVolume ) ; WriteVolumeSettings() ; GameVolumeMenu[0] = 0 ; // selected break ; } } CopyScreen( Screen, Log ) ; Flip() ; } /*──────────────────────────────────────────────────────────────────────────*/ void SavedGameManagement() { WORD select ; WORD flag = 0 ; UBYTE memoplayername[MAX_SIZE_PLAYER_NAME] ; UBYTE memogamepath[_MAX_PATH] ; CopyScreen( Log, Screen ) ; strcpy( memoplayername, PlayerName ) ; strcpy( memogamepath, GamePathname ) ; while( !flag ) { select = DoGameMenu( SavedGameMenu ) ; switch( select ) // num mess { case 26: // quitter flag = 1 ; break ; case 41: // copier if( ChoosePlayerName( 41 ) ) { UBYTE *ptr,*ptrs ; LONG size ; UBYTE num ; UBYTE n,c ; LONG handle ; ptrs = ptr = LoadMalloc( GamePathname ) ; size = FileSize( GamePathname ) ; num = *ptr++ ; // num version n = strlen( ptr ) + 1 ; // size player name if( InputPlayerName( 44 ) ) { do { strcpy( GamePathname, PATH_RESSOURCE"S" ) ; strcat( GamePathname, Itoa( Rnd(10000) ) ) ; strcat( GamePathname, ".LBA" ) ; } while( FileSize( GamePathname ) != 0 ) ; handle = OpenWrite( GamePathname ) ; if( handle ) { Write( handle, &num, 1 ) ; Write( handle, PlayerName, strlen(PlayerName)+1 ) ; Write( handle, ptrs+n+1, size-n-1 ) ; Close( handle ) ; } } Free( ptrs ) ; } CopyScreen( Screen, Log ) ; break ; case 45: // detruire if( ChoosePlayerName( 45 ) ) { CopyScreen( Screen, Log ) ; DrawOneString( 320, 80, PlayerName, 2 ) ; SavedConfirmMenu[0] = 0 ; select = DoGameMenu( SavedConfirmMenu ) ; switch( select ) // num mess { case 48: // detruire Delete( GamePathname ) ; break ; } } SavedGameMenu[0] = 0 ; CopyScreen( Screen, Log ) ; Flip() ; // flag = 1 ; break ; } } CopyScreen( Screen, Log ) ; Flip() ; strcpy( GamePathname, memogamepath ) ; strcpy( PlayerName, memoplayername ) ; } /*──────────────────────────────────────────────────────────────────────────*/ void AdvancedOptions() { WORD select ; WORD flag = 0 ; CopyScreen( Log, Screen ) ; while( !flag ) { select = DoGameMenu( GameAdvancedMenu ) ; switch( select ) // num mess { case 26: flag = 1 ; break ; case 4: // agressif auto GameAdvancedMenu[7] = 2 ; CombatAuto = FALSE ; break ; case 2: // agressif manuel GameAdvancedMenu[7] = 4 ; CombatAuto = TRUE ; break ; case 31: // poly high GameAdvancedMenu[9] = 131 ; SetFillDetails( 1 ) ; break ; case 131: // poly medium GameAdvancedMenu[9] = 231 ; SetFillDetails( 0 ) ; break ; case 231: // poly low GameAdvancedMenu[9] = 31 ; SetFillDetails( 2 ) ; break ; case 32: // ombres full GameAdvancedMenu[11] = 132 ; Shadow = 1 ; break ; case 132: // ombres obj GameAdvancedMenu[11] = 232 ; Shadow = 0 ; break ; case 232: // pas ombres GameAdvancedMenu[11] = 32 ; Shadow = 2 ; break ; case 33: // zoom hard GameAdvancedMenu[13] = 233 ; SceZoom = 0 ; break ; case 233: // pas zoom GameAdvancedMenu[13] = 33 ; SceZoom = 1 ; break ; /* case 233: // zoom soft GameAdvancedMenu[13] = 33 ; SceZoom = 2 ; break ; */ } } CopyScreen( Screen, Log ) ; Flip() ; } /*══════════════════════════════════════════════════════════════════════════*/ /*══════════════════════════════════════════════════════════════════════════*/ /*──────────────────────────────────────────────────────────────────────────*/ LONG MainGameMenu() { WORD select ; WORD flag = 0 ; HQ_StopSample() ; /* for( flag=0; flag<50*320; flag++ ) { BufSpeak[flag] = 0 ; } flag = 0; */ CopyScreen( Log, Screen ) ; while( !flag ) { InitDial( 0 ) ;// SYS #ifdef CDROM PlayCdTrack( 9 ) ; #else PlayMidiFile( 9 ) ; #endif HQ_StopSample() ; GetMultiText( 49, PleaseWait ) ; select = DoGameMenu( GameMainMenu ) ; switch( select ) // num mess { case 9999: // menu demo MenuDemo() ; Load_HQR( PATH_RESSOURCE"ress.hqr", Screen, RESS_MENU_PCR ) ; CopyScreen( Screen, Log ) ; SetBlackPal() ; Flip() ; FadeToPal( PtrPal ) ; break ; // case -1: // esc case 22: // quitter flag = 1 ; break ; case 20: // newgame if( !InputPlayerName( 42 ) ) break ; do { strcpy( GamePathname, PATH_RESSOURCE"S" ) ; strcat( GamePathname, Itoa( Rnd(10000) ) ) ; strcat( GamePathname, ".LBA" ) ; } while( FileSize( GamePathname ) != 0 ) ; InitGame( 1, 0 ) ; Introduction() ; if( MainLoop() ) { #ifdef DEMO PlayMidiFile( 6 ) ; Credits() ; TheEnd( PROGRAM_OK, "* End of Demo version." ) ; #else Credits() ; PlayAnimFla( "The_End" ) ; Cls() ; Flip() ; Palette( PtrPal ) ; #endif } CopyScreen( Log, Screen ) ; while( Key OR Fire ) ; // provisoire break ; case 21: // load if( !ChoosePlayerName( 21 ) ) break ; InitGame( -1, 0 ) ; Introduction() ; if( MainLoop() ) { #ifdef DEMO PlayMidiFile( 6 ) ; Credits() ; TheEnd( PROGRAM_OK, "* End of Demo version." ) ; #else Credits() ; PlayAnimFla( "The_End" ) ; Cls() ; Flip() ; Palette( PtrPal ) ; #endif } CopyScreen( Log, Screen ) ; while( Key OR Fire ) ; // provisoire break ; case 23: CopyScreen( Screen, Log ) ; Flip() ; GameOptionMenu[5] = 26 ; // retour prec OptionsMenu() ; break ; } } return FALSE ; } /*══════════════════════════════════════════════════════════════════════════*/ /*══════════════════════════════════════════════════════════════════════════*/ /*──────────────────────────────────────────────────────────────────────────*/ LONG QuitMenu() { WORD select ; LONG memoflagspeak ; CopyScreen( Log, Screen ) ; HQ_StopSample() ; while( TRUE ) { memoflagspeak = FlagSpeak ; FlagSpeak = FALSE ; InitDial( 0 ) ;// SYS FlagSpeak = memoflagspeak ; select = DoGameMenu( GameQuitMenu ) ; InitDial( START_FILE_ISLAND+Island ) ;// SYS switch( select ) // num mess { case 28: // continue return FALSE ; case 27: // abandonner return TRUE ; } } } /*══════════════════════════════════════════════════════════════════════════* █▀▀▀▀ █▀▀▀█ █▄ ▄█ █▀▀▀▀ █▀▀▀▀ █ █ █▀▀▀█ █ █▀▀▀▀ █▀▀▀▀ ██ ▀█ ██▀▀█ ██▀ █ ██▀▀ ██ ██▀▀█ ██ █ ██ ██ ██▀▀ ▀▀▀▀▀ ▀▀ ▀ ▀▀ ▀ ▀▀▀▀▀ ▀▀▀▀▀ ▀▀▀▀▀ ▀▀ ▀ ▀▀▀▀▀ ▀▀ ▀▀▀▀▀ ▀▀▀▀▀ *══════════════════════════════════════════════════════════════════════════*/ /*──────────────────────────────────────────────────────────────────────────*/ /* UWORD GameChoiceMenu[] = { 0, // selected 7, // nb entries 0, // y from top. 0, // .dia num 0, 0, 0, 1, 0, 2, 0, 3, 0, 4, 0, 5, 0, 6 } ; */ /*──────────────────────────────────────────────────────────────────────────*/ void GameAskChoice( WORD nummess ) { WORD n ; CopyScreen( Log, Screen ) ; GameChoiceMenu[0] = 0 ; GameChoiceMenu[1] = GameNbChoices ; GameChoiceMenu[2] = 0 ; GameChoiceMenu[3] = START_FILE_ISLAND+Island ; for(n=0; n