/* =========================================================================== ARX FATALIS GPL Source Code Copyright (C) 1999-2010 Arkane Studios SA, a ZeniMax Media company. This file is part of the Arx Fatalis GPL Source Code ('Arx Fatalis Source Code'). Arx Fatalis Source Code is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Arx Fatalis Source Code is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Arx Fatalis Source Code. If not, see . In addition, the Arx Fatalis Source Code is also subject to certain additional terms. You should have received a copy of these additional terms immediately following the terms and conditions of the GNU General Public License which accompanied the Arx Fatalis Source Code. If not, please request a copy in writing from Arkane Studios at the address below. If you have questions concerning this license or the applicable additional terms, you may contact in writing Arkane Studios, c/o ZeniMax Media Inc., Suite 120, Rockville, Maryland 20850 USA. =========================================================================== */ ////////////////////////////////////////////////////////////////////////////////////// // @@ @@@ @@@ @@ @@@@@ // // @@@ @@@@@@ @@@ @@ @@@@ @@@ @@@ // // @@@ @@@@@@@ @@@ @@@@ @@@@ @@ @@@@ // // @@@ @@ @@@@ @@@ @@@@@ @@@@@@ @@@ @@@ // // @@@@@ @@ @@@@ @@@ @@@@@ @@@@@@@ @@@ @ @@@ // // @@@@@ @@ @@@@ @@@@@@@@ @@@@ @@@ @@@@@ @@ @@@@@@@ // // @@ @@@ @@ @@@@ @@@@@@@ @@@ @@@ @@@@@@ @@ @@@@ // // @@@ @@@ @@@ @@@@ @@@@@ @@@@@@@@@ @@@@@@@ @@@ @@@@ // // @@@ @@@@ @@@@@@@ @@@@@@ @@@ @@@@ @@@ @@@ @@@ @@@@ // // @@@@@@@@ @@@@@ @@@@@@@@@@ @@@ @@@ @@@ @@@ @@@ @@@@@ // // @@@ @@@@ @@@@ @@@ @@@@@@@ @@@ @@@ @@@@ @@@ @@@@ @@@@@ // //@@@ @@@@ @@@@@ @@@ @@@@@@ @@ @@@ @@@@ @@@@@@@ @@@@@ @@@@@ // //@@@ @@@@@ @@@@@ @@@@ @@@ @@ @@ @@@@ @@@@@@@ @@@@@@@@@ // //@@@ @@@@ @@@@@@@ @@@@ @@ @@ @@@@ @@@@@ @@@@@ // //@@@ @@@@ @@@@@@@ @@@@ @@ @@ @@@@ @@@@@ @@ // //@@@ @@@ @@@ @@@@@ @@ @@@ // // @@@ @@@ @@ @@ STUDIOS // ////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////// // ARX_Menu ////////////////////////////////////////////////////////////////////////////////////// // // Description: // ARX Menu Management // // Updates: (date) (person) (update) // // Code: Cyril Meynier // // Copyright (c) 1999-2000 ARKANE Studios SA. All rights reserved ////////////////////////////////////////////////////////////////////////////////////// #include #include #include #include "ARX_Menu.h" #include "ARX_ChangeLevel.h" #include "ARX_Sound.h" #include "ARX_CParticle.h" #include "ARX_CParticles.h" #include "ARX_CParticleParams.h" #include "ARX_Loc.h" #include "ARX_Menu2.h" #include "ARX_Text.h" #include "ARX_Time.h" #include "ARX_Equipment.h" #include "DanaeSaveLoad.h" #include "eerieapp.h" #include "hermesmain.h" #include "EERIEDraw.h" #include "EERIEMath.h" #include "EERIEObject.h" #define _CRTDBG_MAP_ALLOC #include //----------------------------------------------------------------------------- extern CARXTextManager * pTextManage; extern CDirectInput * pGetInfoDirectInput; extern CMenuConfig * pMenuConfig; extern EERIE_3D ePlayerAngle; extern float Xratio, Yratio; extern long Book_Mode; extern long GAME_EDITOR; extern long START_NEW_QUEST; extern long INTRO_NOT_LOADED; extern long LASTBOOKBUTTON; extern long BOOKBUTTON; extern long OLD_FLYING_OVER; extern long FINAL_RELEASE; extern long FLYING_OVER; extern long BOOKZOOM; extern long FRAME_COUNT; extern float ARXTimeMenu; extern float ARXOldTimeMenu; extern long NEED_SPECIAL_RENDEREND; extern bool bFadeInOut; extern bool bFade; extern int iFadeAction; extern float fFadeInOut; extern char SKIN_MOD; extern char QUICK_MOD; extern float PROGRESS_BAR_TOTAL; extern float OLD_PROGRESS_BAR_COUNT; extern float PROGRESS_BAR_COUNT; extern float ARXTimeMenu; extern float ARXOldTimeMenu; extern float ARXDiffTimeMenu; extern TextureContainer * pTextureLoad; bool bQuickGenFirstClick = true; ARX_MENU_DATA ARXmenu; long ARXmenu_lastmode = -1; long REFUSE_GAME_RETURN = 0; unsigned long ARXmenu_starttick = 0; extern bool bRenderInterList; long SP_HEAD = 0; //----------------------------------------------------------------------------- bool MENU_NoActiveWindow(); void ClearGame(); void ClearGameDEVICE(); void GetTextSize(HFONT _hFont, _TCHAR * _lpszUText, int * _iWidth, int * _iHeight); //----------------------------------------------------------------------------- void ARX_Menu_Release_Text(void * a) { if (a) { free(a); a = NULL; } } //----------------------------------------------------------------------------- #define ARX_MENU_SIZE_Y 24 long save_c(0), save_p(0); SaveGame * save_l = NULL; //----------------------------------------------------------------------------- void ARX_MENU_Clicked_QUIT(); //----------------------------------------------------------------------------- void CreateSaveGameList() { char path[512] = ""; HANDLE h; sprintf(path, "%ssave%s\\save*", Project.workingdir, LOCAL_SAVENAME); if (!(save_l = (SaveGame *)malloc(sizeof(SaveGame)))) return; strcpy(save_l[0].name, "New"); memset(&save_l[0].stime, 0, sizeof(SYSTEMTIME)); save_c = 1; char tTemp[sizeof(WIN32_FIND_DATA)+2]; WIN32_FIND_DATA * fdata = (WIN32_FIND_DATA *)tTemp; if ((h = FindFirstFile(path, fdata)) != INVALID_HANDLE_VALUE) { do { if (fdata->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY && fdata->cFileName[0] != '.') { void * ptr; if (!(ptr = realloc(save_l, sizeof(SaveGame) * (save_c + 1)))) { free(save_l), save_l = NULL, save_c = 0; return; } save_l = (SaveGame *)ptr; char text[256]; strcpy(text, fdata->cFileName + 4); save_l[save_c].num = atoi(text); sprintf(text, "%ssave%s\\%s\\", Project.workingdir, LOCAL_SAVENAME, fdata->cFileName); unsigned long pouet; if (ARX_CHANGELEVEL_GetInfo(text, save_l[save_c].name, &save_l[save_c].version, &save_l[save_c].level, &pouet) != -1) { SYSTEMTIME stime; FILETIME fTime; FileTimeToLocalFileTime(&fdata->ftLastWriteTime, &fTime); FileTimeToSystemTime(&fTime, &stime); save_l[save_c].stime = stime; save_c++; } } } while (FindNextFile(h, fdata)); FindClose(h); } } //----------------------------------------------------------------------------- void FreeSaveGameList() { free(save_l), save_l = NULL, save_c = save_p = 0; } //----------------------------------------------------------------------------- void UpdateSaveGame(const long & i) { //i == 0 -> new save game //i > 0 -> erase old savegame save_l[i].name if (i <= 0) ARX_CHANGELEVEL_Save(i, save_l[0].name); else { ARX_CHANGELEVEL_Save(save_l[i].num, save_l[i].name); } } //----------------------------------------------------------------------------- void ARX_MENU_CLICKSOUND() { ARX_SOUND_PlayMenu(SND_MENU_CLICK); } //----------------------------------------------------------------------------- void LoadSaveGame(const long & i) { ARX_MENU_CLICKSOUND(); INTRO_NOT_LOADED = 1; LoadLevelScreen(); PROGRESS_BAR_TOTAL = 238; OLD_PROGRESS_BAR_COUNT = PROGRESS_BAR_COUNT = 0; PROGRESS_BAR_COUNT += 1.f; LoadLevelScreen(GDevice, save_l[i].level); DanaeClearLevel(); ARX_CHANGELEVEL_Load(save_l[i].num); REFUSE_GAME_RETURN = 0; NEED_SPECIAL_RENDEREND = 1; ARX_MENU_Clicked_QUIT(); } //----------------------------------------------------------------------------- // Menu Sounds //----------------------------------------------------------------------------- void ARX_MENU_LaunchAmb(char * _lpszAmb) { ARX_SOUND_PlayMenuAmbiance(_lpszAmb); } //----------------------------------------------------------------------------- void ARX_Menu_Resources_Create(LPDIRECT3DDEVICE7 m_pd3dDevice) { if (ARXmenu.mda) { free(ARXmenu.mda); ARXmenu.mda = NULL; } ARXmenu.mda = (MENU_DYNAMIC_DATA *)malloc(sizeof(MENU_DYNAMIC_DATA)); memset(ARXmenu.mda, 0, sizeof(MENU_DYNAMIC_DATA)); ARXmenu.mda->Background = NULL; ARXmenu.mda->pTexCredits = MakeTCFromFile("Graph\\Interface\\menus\\Menu_credits.bmp"); ARXmenu.mda->BookBackground = MakeTCFromFile("Graph\\Interface\\book\\character_sheet\\Char_creation_Bg.BMP"); ARX_Allocate_Text(ARXmenu.mda->flyover[BOOK_STRENGTH], _T("system_charsheet_strength")); ARX_Allocate_Text(ARXmenu.mda->flyover[BOOK_MIND], _T("system_charsheet_intel")); ARX_Allocate_Text(ARXmenu.mda->flyover[BOOK_DEXTERITY], _T("system_charsheet_Dex")); ARX_Allocate_Text(ARXmenu.mda->flyover[BOOK_CONSTITUTION], _T("system_charsheet_consti")); ARX_Allocate_Text(ARXmenu.mda->flyover[BOOK_STEALTH], _T("system_charsheet_stealth")); ARX_Allocate_Text(ARXmenu.mda->flyover[BOOK_MECANISM], _T("system_charsheet_mecanism")); ARX_Allocate_Text(ARXmenu.mda->flyover[BOOK_INTUITION], _T("system_charsheet_intuition")); ARX_Allocate_Text(ARXmenu.mda->flyover[BOOK_ETHERAL_LINK], _T("system_charsheet_etheral_link")); ARX_Allocate_Text(ARXmenu.mda->flyover[BOOK_OBJECT_KNOWLEDGE], _T("system_charsheet_objknoledge")); ARX_Allocate_Text(ARXmenu.mda->flyover[BOOK_CASTING], _T("system_charsheet_casting")); ARX_Allocate_Text(ARXmenu.mda->flyover[BOOK_PROJECTILE], _T("system_charsheet_projectile")); ARX_Allocate_Text(ARXmenu.mda->flyover[BOOK_CLOSE_COMBAT], _T("system_charsheet_closecombat")); ARX_Allocate_Text(ARXmenu.mda->flyover[BOOK_DEFENSE], _T("system_charsheet_defense")); ARX_Allocate_Text(ARXmenu.mda->flyover[BUTTON_QUICK_GENERATION], _T("system_charsheet_quickgenerate")); ARX_Allocate_Text(ARXmenu.mda->flyover[BUTTON_DONE], _T("system_charsheet_done")); ARX_Allocate_Text(ARXmenu.mda->flyover[BUTTON_SKIN], _T("system_charsheet_skin")); ARX_Allocate_Text(ARXmenu.mda->flyover[WND_ATTRIBUTES], _T("system_charsheet_atributes")); ARX_Allocate_Text(ARXmenu.mda->flyover[WND_SKILLS], _T("system_charsheet_skills")); ARX_Allocate_Text(ARXmenu.mda->flyover[WND_STATUS], _T("system_charsheet_status")); ARX_Allocate_Text(ARXmenu.mda->flyover[WND_LEVEL], _T("system_charsheet_level")); ARX_Allocate_Text(ARXmenu.mda->flyover[WND_XP], _T("system_charsheet_xpoints")); ARX_Allocate_Text(ARXmenu.mda->flyover[WND_HP], _T("system_charsheet_hp")); ARX_Allocate_Text(ARXmenu.mda->flyover[WND_MANA], _T("system_charsheet_mana")); ARX_Allocate_Text(ARXmenu.mda->flyover[WND_AC], _T("system_charsheet_AC")); ARX_Allocate_Text(ARXmenu.mda->flyover[WND_RESIST_MAGIC], _T("system_charsheet_res_magic")); ARX_Allocate_Text(ARXmenu.mda->flyover[WND_RESIST_POISON], _T("system_charsheet_res_poison")); ARX_Allocate_Text(ARXmenu.mda->flyover[WND_DAMAGE], _T("system_charsheet_damage")); ARX_Allocate_Text(ARXmenu.mda->str_button_quickgen, _T("system_charsheet_button_quickgen")); ARX_Allocate_Text(ARXmenu.mda->str_button_skin, _T("system_charsheet_button_skin")); ARX_Allocate_Text(ARXmenu.mda->str_button_done, _T("system_charsheet_button_done")); long siz; char szFileName[256]; sprintf(szFileName, "%sLocalisation\\ucredits_%s.txt", Project.workingdir, Project.localisationpath); ARXmenu.mda->str_cre_credits = (_TCHAR *) PAK_FileLoadMalloc(szFileName, &siz); if (ARXmenu.mda->str_cre_credits && ARXmenu.mda->str_cre_credits[(siz>>1)-1] != 0) { _TCHAR * pTxt = (_TCHAR *)malloc(siz + 2); memcpy(pTxt, ARXmenu.mda->str_cre_credits, siz); pTxt[(siz>>1)] = 0; free(ARXmenu.mda->str_cre_credits); ARXmenu.mda->str_cre_credits = pTxt; } CreateSaveGameList(); } //----------------------------------------------------------------------------- void ARX_Menu_Resources_Release(bool _bNoSound) { if (pMenuConfig) pMenuConfig->SaveAll(); if (ARXmenu.mda == NULL) return; if (ARXmenu.mda->Background != NULL) { D3DTextr_KillTexture(ARXmenu.mda->Background); ARXmenu.mda->Background = NULL; } if (ARXmenu.mda->BookBackground != NULL) { D3DTextr_KillTexture(ARXmenu.mda->BookBackground); ARXmenu.mda->BookBackground = NULL; } for (long i = 0; i < MAX_FLYOVER; i++) { if (ARXmenu.mda->flyover[i] != NULL) ARX_Menu_Release_Text(ARXmenu.mda->flyover[i]); } ARX_Menu_Release_Text(ARXmenu.mda->str_cre_credits); ARX_Menu_Release_Text(ARXmenu.mda->str_button_quickgen); ARX_Menu_Release_Text(ARXmenu.mda->str_button_skin); ARX_Menu_Release_Text(ARXmenu.mda->str_button_done); if (ARXmenu.mda) { free(ARXmenu.mda); ARXmenu.mda = NULL; } free(ARXmenu.mda); ARXmenu.mda = NULL; //Synchronize game mixers with menu mixers and switch between them if (_bNoSound) { ARX_SOUND_MixerSwitch(ARX_SOUND_MixerMenu, ARX_SOUND_MixerGame); ARX_SOUND_MixerSetVolume(ARX_SOUND_MixerGame, ARX_SOUND_MixerGetVolume(ARX_SOUND_MixerMenu)); ARX_SOUND_MixerSetVolume(ARX_SOUND_MixerGameSample, ARX_SOUND_MixerGetVolume(ARX_SOUND_MixerMenuSample)); ARX_SOUND_MixerSetVolume(ARX_SOUND_MixerGameSpeech, ARX_SOUND_MixerGetVolume(ARX_SOUND_MixerMenuSpeech)); ARX_SOUND_MixerSetVolume(ARX_SOUND_MixerGameAmbiance, ARX_SOUND_MixerGetVolume(ARX_SOUND_MixerMenuAmbiance)); } if (pTextureLoad) { D3DTextr_KillTexture(pTextureLoad); pTextureLoad = NULL; } } extern long NO_TIME_INIT; //----------------------------------------------------------------------------- void ARX_MENU_Clicked_QUIT() { if (REFUSE_GAME_RETURN) return; if (INTRO_NOT_LOADED == 2) return; ARX_Menu_Resources_Release(); ARXmenu.currentmode = AMCM_OFF; if (!NO_TIME_INIT) ARX_TIME_UnPause(); } long CAN_REPLAY_INTRO = 1; //----------------------------------------------------------------------------- void ARX_MENU_Clicked_NEWQUEST() { CAN_REPLAY_INTRO = 0; ARX_TIME_UnPause(); if (FINAL_RELEASE) { REFUSE_GAME_RETURN = 1; } ARX_PLAYER_Start_New_Quest(); Book_Mode = 0; player.skin = 0; ePlayerAngle.b = -25.f; ARX_PLAYER_Restore_Skin(); ARXmenu.currentmode = AMCM_NEWQUEST; } //----------------------------------------------------------------------------- void ARX_MENU_NEW_QUEST_Clicked_QUIT() { INTRO_NOT_LOADED = 1; START_NEW_QUEST = 1; REFUSE_GAME_RETURN = 0; NEED_SPECIAL_RENDEREND = 1; ARX_MENU_Clicked_QUIT(); } //----------------------------------------------------------------------------- void ARX_MENU_Clicked_CREDITS() { ARXmenu.currentmode = AMCM_CREDITS; ARXmenu.mda->creditstart = ARX_TIME_Get(); ARX_MENU_LaunchAmb(AMB_CREDITS); } extern long FINAL_COMMERCIAL_DEMO; void StartImageDemo(); bool ARX_IsSteam(); //----------------------------------------------------------------------------- void ARX_MENU_Clicked_QUIT_GAME() { if (GAME_EDITOR) ARX_MENU_Clicked_QUIT(); else { if (FINAL_COMMERCIAL_DEMO) { StartImageDemo(); if (ARX_IsSteam()) { ShellExecute(NULL, "open", "steam://store/1700", NULL, NULL, SW_SHOWNORMAL); } } ARX_Menu_Resources_Release(); ARXmenu.currentmode = AMCM_OFF; ARX_TIME_UnPause(); ClearGameDEVICE(); danaeApp.Cleanup3DEnvironment(); exit(0); } } //----------------------------------------------------------------------------- void ARX_MENU_Launch(LPDIRECT3DDEVICE7 m_pd3dDevice) { ARX_TIME_Pause(); //Synchronize menu mixers with game mixers and switch between them ARX_SOUND_MixerSwitch(ARX_SOUND_MixerGame, ARX_SOUND_MixerMenu); ARX_SOUND_PlayMenuAmbiance(AMB_MENU); ARX_MENU_CLICKSOUND(); ARXmenu.currentmode = AMCM_MAIN; ARX_Menu_Resources_Create(m_pd3dDevice); } //----------------------------------------------------------------------------- // ARX Menu Management Func //----------------------------------------------------------------------------- void ARX_Menu_Manage(LPDIRECT3DDEVICE7 m_pd3dDevice) { // looks for keys for each mode. switch (ARXmenu.currentmode) { case AMCM_OFF: /* Checked in Danae.cpp now ! */ return; break; case AMCM_NEWQUEST: { if (pGetInfoDirectInput->IsVirtualKeyPressedNowUnPressed(DIK_ESCAPE) && ! bFadeInOut // XS: Disabling ESC capture while fading in or out. ) { ARX_MENU_CLICKSOUND(); ARXmenu.currentmode = AMCM_MAIN; } } break; case AMCM_MAIN: if (pGetInfoDirectInput->IsVirtualKeyPressedNowUnPressed(DIK_ESCAPE)) { if ((MENU_NoActiveWindow()) && (!REFUSE_GAME_RETURN)) { ARX_TIME_UnPause(); ARX_MENU_Clicked_QUIT(); } } break; case AMCM_CREDITS: if ((pGetInfoDirectInput->IsVirtualKeyPressedNowUnPressed(DIK_ESCAPE)) || (pGetInfoDirectInput->IsVirtualKeyPressedNowUnPressed(DIK_SPACE))) { ARX_MENU_CLICKSOUND(); bFadeInOut = true; //fade out bFade = true; //active le fade iFadeAction = AMCM_MAIN; ARX_MENU_LaunchAmb(AMB_MENU); } break; default: break; } } extern long PLAYER_INTERFACE_HIDE_COUNT; extern long SPLASH_THINGS_STAGE; long NEED_INTRO_LAUNCH = 0; //----------------------------------------------------------------------------- // ARX Menu Rendering Func // returns FALSE if no menu needs to be displayed //----------------------------------------------------------------------------- BOOL ARX_Menu_Render(LPDIRECT3DDEVICE7 m_pd3dDevice) { // Auto-Launch Demo after 60 sec idle on Main Menu if ((ARXmenu.currentmode == AMCM_MAIN) && CAN_REPLAY_INTRO) { if ((ARXmenu_lastmode != AMCM_MAIN) || (pGetInfoDirectInput && (pGetInfoDirectInput->bTouch || pGetInfoDirectInput->bMouseMove))) { ARXmenu_starttick = ARX_TIME_GetUL(); //treat warning C4244 conversion from 'float' to 'unsigned long' } unsigned long tim = ARX_TIME_GetUL() - ARXmenu_starttick; //treat warning C4244 conversion from 'float' to 'unsigned long' if ((tim > 180000) && (REFUSE_GAME_RETURN)) { NEED_INTRO_LAUNCH = 1; } } else ARXmenu_starttick = ARX_TIME_GetUL(); //treat warning C4244 conversion from 'float' to 'unsigned long' ARXmenu_lastmode = ARXmenu.currentmode; if (ARXmenu.currentmode == AMCM_OFF) { return FALSE; } FRAME_COUNT = 0; bool br = Menu2_Render(); if (br) { return br; } if (ARXmenu.currentmode == AMCM_OFF) { return FALSE; } if (pGetInfoDirectInput->GetMouseButton(DXI_BUTTON0)) { EERIEMouseButton = 1; LastMouseClick = 1; } else if (pGetInfoDirectInput->GetMouseButton(DXI_BUTTON1)) { EERIEMouseButton = 2; LastMouseClick = 2; } else { EERIEMouseButton = 0; } if (!danaeApp.DANAEStartRender()) { return TRUE; } GDevice->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 0, 1.0f, 0L); long posx; posx = DANAESIZX >> 1; FLYING_OVER = 0; //------------------------------------------------------------------------- if ((ARXmenu.currentmode == AMCM_NEWQUEST) && (ARXmenu.mda)) { if (ITC.questbook == NULL) { ARX_Menu_Resources_Release(false); ARX_Menu_Resources_Create(m_pd3dDevice); ITC.playerbook = MakeTCFromFile("Graph\\Interface\\book\\character_sheet\\char_sheet_book.bmp"); ITC.ic_casting = MakeTCFromFile("Graph\\Interface\\book\\character_sheet\\buttons_carac\\icone_casting.bmp"); ITC.ic_close_combat = MakeTCFromFile("Graph\\Interface\\book\\character_sheet\\buttons_carac\\icone_close_combat.bmp"); ITC.ic_constitution = MakeTCFromFile("Graph\\Interface\\book\\character_sheet\\buttons_carac\\icone_constit.bmp"); ITC.ic_defense = MakeTCFromFile("Graph\\Interface\\book\\character_sheet\\buttons_carac\\icone_defense.bmp"); ITC.ic_dexterity = MakeTCFromFile("Graph\\Interface\\book\\character_sheet\\buttons_carac\\icone_dext.bmp"); ITC.ic_etheral_link = MakeTCFromFile("Graph\\Interface\\book\\character_sheet\\buttons_carac\\icone_etheral_link.bmp"); ITC.ic_mind = MakeTCFromFile("Graph\\Interface\\book\\character_sheet\\buttons_carac\\icone_intel.bmp"); ITC.ic_intuition = MakeTCFromFile("Graph\\Interface\\book\\character_sheet\\buttons_carac\\icone_intuition.bmp"); ITC.ic_mecanism = MakeTCFromFile("Graph\\Interface\\book\\character_sheet\\buttons_carac\\icone_mecanism.bmp"); ITC.ic_object_knowledge = MakeTCFromFile("Graph\\Interface\\book\\character_sheet\\buttons_carac\\icone_obj_knowledge.bmp"); ITC.ic_projectile = MakeTCFromFile("Graph\\Interface\\book\\character_sheet\\buttons_carac\\icone_projectile.bmp"); ITC.ic_stealth = MakeTCFromFile("Graph\\Interface\\book\\character_sheet\\buttons_carac\\icone_stealth.bmp"); ITC.ic_strength = MakeTCFromFile("Graph\\Interface\\book\\character_sheet\\buttons_carac\\icone_strenght.bmp"); ITC.questbook = MakeTCFromFile("Graph\\Interface\\book\\questbook.bmp"); ITC.pTexSpellBook = MakeTCFromFile("Graph\\Interface\\book\\SpellBook.bmp"); ITC.bookmark_char = MakeTCFromFile("Graph\\Interface\\book\\bookmark_char.bmp"); ITC.bookmark_magic = MakeTCFromFile("Graph\\Interface\\book\\bookmark_magic.bmp"); ITC.bookmark_map = MakeTCFromFile("Graph\\Interface\\book\\bookmark_map.bmp"); ITC.bookmark_quest = MakeTCFromFile("Graph\\Interface\\book\\bookmark_quest.bmp"); ITC.accessible_1 = MakeTCFromFile("Graph\\Interface\\book\\Accessible\\accessible_1.bmp"); ITC.accessible_2 = MakeTCFromFile("Graph\\Interface\\book\\Accessible\\accessible_2.bmp"); ITC.accessible_3 = MakeTCFromFile("Graph\\Interface\\book\\Accessible\\accessible_3.bmp"); ITC.accessible_4 = MakeTCFromFile("Graph\\Interface\\book\\Accessible\\accessible_4.bmp"); ITC.accessible_5 = MakeTCFromFile("Graph\\Interface\\book\\Accessible\\accessible_5.bmp"); ITC.accessible_6 = MakeTCFromFile("Graph\\Interface\\book\\Accessible\\accessible_6.bmp"); ITC.accessible_7 = MakeTCFromFile("Graph\\Interface\\book\\Accessible\\accessible_7.bmp"); ITC.accessible_8 = MakeTCFromFile("Graph\\Interface\\book\\Accessible\\accessible_8.bmp"); ITC.accessible_9 = MakeTCFromFile("Graph\\Interface\\book\\Accessible\\accessible_9.bmp"); ITC.accessible_10 = MakeTCFromFile("Graph\\Interface\\book\\Accessible\\accessible_10.bmp"); ITC.current_1 = MakeTCFromFile("Graph\\Interface\\book\\Current_Page\\Current_1.bmp"); ITC.current_2 = MakeTCFromFile("Graph\\Interface\\book\\Current_Page\\Current_2.bmp"); ITC.current_3 = MakeTCFromFile("Graph\\Interface\\book\\Current_Page\\Current_3.bmp"); ITC.current_4 = MakeTCFromFile("Graph\\Interface\\book\\Current_Page\\Current_4.bmp"); ITC.current_5 = MakeTCFromFile("Graph\\Interface\\book\\Current_Page\\Current_5.bmp"); ITC.current_6 = MakeTCFromFile("Graph\\Interface\\book\\Current_Page\\Current_6.bmp"); ITC.current_7 = MakeTCFromFile("Graph\\Interface\\book\\Current_Page\\Current_7.bmp"); ITC.current_8 = MakeTCFromFile("Graph\\Interface\\book\\Current_Page\\Current_8.bmp"); ITC.current_9 = MakeTCFromFile("Graph\\Interface\\book\\Current_Page\\Current_9.bmp"); ITC.current_10 = MakeTCFromFile("Graph\\Interface\\book\\Current_Page\\Current_10.bmp"); ITC.heropageleft = MakeTCFromFile("Graph\\Interface\\book\\character_sheet\\Hero_left_X24_Y24.BMP"); ITC.heropageright = MakeTCFromFile("Graph\\Interface\\book\\character_sheet\\Hero_right_X305_Y270.BMP"); ITC.symbol_mega = NULL; ITC.symbol_vista = NULL; ITC.symbol_aam = NULL; ITC.symbol_taar = NULL; ITC.symbol_yok = NULL; ITC.pTexCursorRedist = MakeTCFromFile("Graph\\Interface\\cursors\\add_points.bmp"); ITC.pTexCornerLeft = MakeTCFromFile("Graph\\Interface\\book\\Left_corner_original.bmp"); ITC.pTexCornerRight = MakeTCFromFile("Graph\\Interface\\book\\Right_corner_original.bmp"); ARX_Allocate_Text(ITC.lpszULevel, _T("system_charsheet_player_lvl")); ARX_Allocate_Text(ITC.lpszUXp, _T("system_charsheet_player_xp")); ANIM_Set(&player.useanim, herowaitbook); player.useanim.flags |= EA_LOOP; ARXOldTimeMenu = ARXTimeMenu = ARX_TIME_Get(); ARXDiffTimeMenu = 0; } GDevice->SetRenderState(D3DRENDERSTATE_FOGENABLE, false); SETALPHABLEND(GDevice, FALSE); if (ARXmenu.mda->BookBackground != NULL) { SETALPHABLEND(GDevice, FALSE); GDevice->SetRenderState(D3DRENDERSTATE_FOGENABLE, false); SETZWRITE(GDevice, false); GDevice->SetRenderState(D3DRENDERSTATE_ZENABLE, D3DZB_FALSE); EERIEDrawBitmap2(GDevice, 0, 0, ARX_CLEAN_WARN_CAST_FLOAT(DANAESIZX), ARX_CLEAN_WARN_CAST_FLOAT(DANAESIZY), 0.9f, ARXmenu.mda->BookBackground, D3DCOLORWHITE); } BOOKZOOM = 1; ARX_INTERFACE_ManageOpenedBook(); if (ARXmenu.mda) { long DONE = 0; if ((player.Skill_Redistribute == 0) && (player.Attribute_Redistribute == 0)) DONE = 1; float ox, oy; ox = Xratio; oy = Yratio; LASTBOOKBUTTON = BOOKBUTTON; BOOKBUTTON = EERIEMouseButton; Xratio = ox; Yratio = oy; if (ARXmenu.mda->flyover[FLYING_OVER] != NULL) //=ARXmenu.mda->flyover[FLYING_OVER]; { if (FLYING_OVER != OLD_FLYING_OVER) { float fRandom = rnd() * 2; ARX_CHECK_INT(fRandom); int t = ARX_CLEAN_WARN_CAST_INT(fRandom); pTextManage->Clear(); OLD_FLYING_OVER = FLYING_OVER; UNICODE_ARXDrawTextCenteredScroll((DANAESIZX * 0.5f), 12, (DANAECENTERX) * 0.82f, ARXmenu.mda->flyover[FLYING_OVER], RGB(232 + t, 204 + t, 143 + t), 0x00FF00FF, hFontInGame, 1000, 0.01f, 2); } } else { OLD_FLYING_OVER = -1; } float fPosX = 0; float fPosY = 313 * Yratio + (DANAESIZY - 313 * Yratio) * 0.70f; float fSizeX = 100 * Xratio; float fSizeY = 100 * Yratio; EERIE_3D ePos; COLORREF Color = 0; //--------------------------------------------------------------------- // Button QUICK GENERATION fPosX = (DANAESIZX - (513 * Xratio)) * 0.5f; if (MouseInRect(fPosX, fPosY, fPosX + fSizeX + 50, fPosY + fSizeY)) { SpecialCursor = CURSOR_INTERACTION_ON; FLYING_OVER = BUTTON_QUICK_GENERATION; if (EERIEMouseButton & 1) ; else if ((!(EERIEMouseButton & 1)) && (LastMouseClick & 1)) { QUICK_MOD++; int iSkin = player.skin; ARX_MENU_CLICKSOUND(); if (bQuickGenFirstClick) { ARX_PLAYER_MakeAverageHero(); bQuickGenFirstClick = false; } else { ARX_PLAYER_QuickGeneration(); } ARX_CHECK_CHAR(iSkin); player.skin = ARX_CLEAN_WARN_CAST_CHAR(iSkin); } else; Color = RGB(255, 255, 255); } else Color = RGB(232, 204, 143); ePos.x = fPosX; ePos.y = fPosY; FontRenderText(hFontMenu, ePos, ARXmenu.mda->str_button_quickgen, Color); //--------------------------------------------------------------------- // Button SKIN fPosX = DANAESIZX * 0.5f; if (MouseInRect(fPosX, fPosY, fPosX + fSizeX, fPosY + fSizeY)) { SpecialCursor = CURSOR_INTERACTION_ON; FLYING_OVER = BUTTON_SKIN; if ((!(EERIEMouseButton & 1)) && (LastMouseClick & 1)) { SKIN_MOD++; BOOKZOOM = 1; ARX_MENU_CLICKSOUND(); player.skin++; if (player.skin > 3) player.skin = 0; switch (player.skin) { case 0: ePlayerAngle.b = -25.f; break; case 1: ePlayerAngle.b = -10.f; break; case 2: ePlayerAngle.b = 20.f; break; case 3: ePlayerAngle.b = 35.f; break; } ARX_PLAYER_Restore_Skin(); } if (EERIEMouseButton & 1) ; else ; Color = RGB(255, 255, 255); } else Color = RGB(232, 204, 143); ePos.x = fPosX; ePos.y = fPosY; FontRenderText(hFontMenu, ePos, ARXmenu.mda->str_button_skin, Color); //--------------------------------------------------------------------- // Button DONE fPosX = DANAESIZX - (DANAESIZX - 513 * Xratio) * 0.5f - 40 * Xratio; if (MouseInRect(fPosX, fPosY, fPosX + fSizeX, fPosY + fSizeY)) { if (DONE) SpecialCursor = CURSOR_INTERACTION_ON; FLYING_OVER = BUTTON_DONE; if ((DONE) && (!(EERIEMouseButton & 1)) && (LastMouseClick & 1)) { if ((SKIN_MOD == 8) && (QUICK_MOD == 10)) { SKIN_MOD = -2; } else if (SKIN_MOD == -1) { ARX_PLAYER_MakeSpHero(); player.skin = 4; ARX_PLAYER_Restore_Skin(); SKIN_MOD = 0; SP_HEAD = 1; } else { if (SP_HEAD) { player.skin = 4; ARX_PLAYER_Restore_Skin(); SP_HEAD = 0; } ARX_MENU_CLICKSOUND(); bFadeInOut = true; //fade out bFade = true; //active le fade iFadeAction = AMCM_OFF; } } else { if (DONE) Color = RGB(255, 255, 255); else Color = RGB(192, 192, 192); } } else { if (DONE) Color = RGB(232, 204, 143); else Color = RGB(192, 192, 192); } if (SKIN_MOD < 0) Color = RGB(255, 0, 255); ePos.x = fPosX; ePos.y = fPosY; FontRenderText(hFontMenu, ePos, ARXmenu.mda->str_button_done, Color); } } //------------------------------------------------------------------------- if ((ARXmenu.currentmode == AMCM_CDNOTFOUND) && (ARXmenu.mda)) { if (ARXmenu.mda->BookBackground != NULL) { SETALPHABLEND(GDevice, FALSE); GDevice->SetRenderState(D3DRENDERSTATE_FOGENABLE, false); SETZWRITE(GDevice, false); GDevice->SetRenderState(D3DRENDERSTATE_ZENABLE, D3DZB_FALSE); EERIEDrawBitmap2(GDevice, 0, 0, ARX_CLEAN_WARN_CAST_FLOAT(DANAESIZX), ARX_CLEAN_WARN_CAST_FLOAT(DANAESIZY), 0.9f, ARXmenu.mda->BookBackground, D3DCOLORWHITE); } EERIE_3D ePos; COLORREF Color = 0; int iW; int iH; _TCHAR szText[256]; Color = RGB(232, 204, 143); PAK_UNICODE_GetPrivateProfileString(_T("system_menus_main_cdnotfound"), _T("string"), _T(""), szText, 256, NULL); iW = 0; iH = 0; GetTextSize(hFontMenu, szText, &iW, &iH); ePos.x = (DANAESIZX - iW) * 0.5f; ePos.y = DANAESIZY * 0.4f; FontRenderText(hFontMenu, ePos, szText, Color); PAK_UNICODE_GetPrivateProfileString(_T("system_yes"), _T("string"), _T(""), szText, 256, NULL); iW = 0; iH = 0; GetTextSize(hFontMenu, szText, &iW, &iH); ePos.x = (DANAESIZX * 0.5f - iW) * 0.5f; ePos.y = DANAESIZY * 0.5f; if (MouseInRect(ePos.x, ePos.y, ePos.x + iW, ePos.y + iH)) { SpecialCursor = CURSOR_INTERACTION_ON; if (EERIEMouseButton & 1) ; else if ((!(EERIEMouseButton & 1)) && (LastMouseClick & 1)) { ARX_MENU_CLICKSOUND(); } else; Color = RGB(255, 255, 255); } else Color = RGB(232, 204, 143); FontRenderText(hFontMenu, ePos, szText, Color); PAK_UNICODE_GetPrivateProfileString(_T("system_no"), _T("string"), _T(""), szText, 256, NULL); iW = 0; iH = 0; GetTextSize(hFontMenu, szText, &iW, &iH); ePos.x = DANAESIZX * 0.5f + (DANAESIZX * 0.5f - iW) * 0.5f; if (MouseInRect(ePos.x, ePos.y, ePos.x + iW, ePos.y + iH)) { SpecialCursor = CURSOR_INTERACTION_ON; if (EERIEMouseButton & 1) ; else if ((!(EERIEMouseButton & 1)) && (LastMouseClick & 1)) { ARX_MENU_CLICKSOUND(); } else; Color = RGB(255, 255, 255); } else Color = RGB(232, 204, 143); FontRenderText(hFontMenu, ePos, szText, Color); } DynLight[0].pos.x = 0.f + EERIEMouseX - (DANAESIZX >> 1); DynLight[0].pos.y = 0.f + EERIEMouseY - (DANAESIZY >> 1); danaeApp.DANAEEndRender(); if (pTextManage) { pTextManage->Update(FrameDiff); pTextManage->Render(); } danaeApp.DANAEStartRender(); if (ARXmenu.currentmode != AMCM_CREDITS) ARX_INTERFACE_RenderCursor(1); if (ARXmenu.currentmode == AMCM_NEWQUEST) { if (ProcessFadeInOut(bFadeInOut, 0.1f)) { switch (iFadeAction) { case AMCM_OFF: ARX_TIME_UnPause(); ARX_MENU_NEW_QUEST_Clicked_QUIT(); iFadeAction = -1; bFade = false; fFadeInOut = 0.f; if (pTextManage) { pTextManage->Clear(); } break; } } } danaeApp.DANAEEndRender(); return TRUE; }