mirror of
https://github.com/1dot13/source.git
synced 2026-07-22 13:40:22 +02:00
Development Trunk: https://ja2svn.dyndns.org/source/ja2/branches/Wanne/JA2%201.13%20MP A detailed list of all the features (changes) is visible in the history log of the development trunk: INFO: The source code for the official 2011 release (4870) has been branched here: https://ja2svn.dyndns.org/source/ja2/branches/JA2_rev.4870_2011 This commit contains the following features: *** Externalized Vehicles *** o Now with this feature we can add/remove vehicles o New XML File: TableData\Vehicles.xml o Added a new function parameter to lua file Scripts\Overhead lua to set up the helicopter in method: SetUpHelicopterForPlayer() o Added example mini (Docs\Externalized Vehicles Example.zip) mod which adds 2 additional vehicles (hummer and ice-cream truck to sector A9) *** Up to 255 save slots *** - There is a "Next" and "Prev" button where you can scroll through the save slots - It is now possible to load the automatic save (SAVE_EVERY_N_HOURS) from the load screen. This is the first slot after the quickload slot - Added the 2 alternate players end turn saves (which can be enabled/disabled in option screen) to the save/load game form *** New Feature: Externalized emails from Emails.edt to XML*** o This feature can be enabled/disabled in the Source: --> See email.cpp: If "ReadXMLEmail" == FALSE, then normal way (read from Email.edt) otherwise read from XML files o 2 new XML files: TableData\Email\EmailMercAvailable.xml and EmailMercLevelUp.xml o Renamed SenderNamesList.xml to EmailSenderNamesList.xml and moved from TableData folder to TableData\Email folder o Names for mercenaries are get from the file MercProfiles.xml and different names get from the file EmailSenderNamesList.xml *** Externalized Hidden Towns (Tixa, Orta) *** o Now it is possible to add new hidden towns (locations) o See file: TableData/Map/Cities.xml o New variable in TableData/Map/Cities.xml - hiddenTown: 0 = show on strategy map, 1 = Hide on strategy map - townIcon: 1 = on, 0 = off (This is the icon you see on the strategy map) - szIconFile: The path to the sti icon file (eg: interface\prison.sti, interface\my_icon.sti) - iconPosition: The x,y position of the icon on the strategy map *** Encyclopedia and Briefing Room, reachable from the laptop *** o 2 new ja2_options.ini properties: BRIEFING_ROOM, ENCYCLOPEDIA o demonstration video: http://www.youtube.com/watch?v=7CIXdXWLrAo o Added Example usage of the Briefing Room - Extract it in your JA2 1.13 folder and use the latest development executable - The briefing room can be reached from the laptop. Enter SN5631 for the code and then click the "Exit" button - See "Info_BriefingRoom.txt" and "BriefingRoom_Mission1.png" *** Improved interrupt system (IIS) *** o This system changes the way interrupts work. See: http://www.ja-galaxy-forum.com/board/ubbthreads.php?ubb=showflat&Number=290787#Post290787 o Option system (see ja2_options.ini: IMPROVED_INTERRUPT_SYSTEM) o A few more settings for the interrupt system in ja2_options.ini o INFO: Multiplayer games always use the "old" interrupt system, not matter what the user selects in the ja2_options.ini *** Walking and sidestepping with weapon raised *** o Enable/disable the walking/sidestepping with raised weapon in ja2_options.ini: ALLOW_WALKING_WITH_WEAPON_RAISED o You can set an AP/BP modifier when walking/sidestepping with weapon raised in APBPConstants.ini: AP_MODIFIER_WEAPON_READY o The following feature apply when you walk/sidestep with weapon raised: -> limited angle of view, but you can see more farther when the weapon has a scope -> better change for interrupts if you see an enemy -> less APs and BPs when shooting, because the weapon is already raised -> It should cost more APs when walking. Maybe you can export the additional AP and BP modifier to the APBPConstants.ini *** Increase squad size to 8 (800x600) and 8 and 10 (1024x768) *** o Squad sizes (dependend on the screen resolution) can be selected in the start new game screen o In a multiplayer game, the squad size will always be 6, because it does not work with more soldiers/squad *** Added UB-1.13 source code *** o Merged the UB-1.13 source code (Revision: 4721) from svn: http://subversion.assembla.com/svn/ub-source113 o If you want to build UB-EXE or UB-MapEditor, just enable the 2 defines (JA2UB and JA2UBMAPS) in "builddefines.h" o The UB-Verion reads from "ja2_UB.ini" instead of "ja2.ini" o There are 2 new XML files - Layout\LayoutMainMenu.xml - MapAction\ActionItems.xml o There are 2 new LUA-Script files - Scripts\ExplosionControl.lua - Scripts\InterfaceDialogue.lua *** Hide enemy health text / enemy hit count *** o ja2_options.ini: HIDE_ENEMY_HEALTH_TEXT, HIDE_ENEMY_HIT_COUNT o both new settings only have effect in a singleplayer game o see: http://www.ja-galaxy-forum.com/board/ubbthreads.php?ubb=showflat&Number=128840&page=1 git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@4885 3b4a5df2-a311-0410-b5c6-a8a6f20db521
362 lines
8.9 KiB
C++
362 lines
8.9 KiB
C++
#ifdef PRECOMPILEDHEADERS
|
|
#include "Utils All.h"
|
|
#include "interface control.h"
|
|
#else
|
|
#include <windows.h>
|
|
#include <mmsystem.h>
|
|
#include <string.h>
|
|
#include "wcheck.h"
|
|
#include "stdlib.h"
|
|
#include "debug.h"
|
|
#include "Timer Control.h"
|
|
#include "overhead.h"
|
|
#include "handle items.h"
|
|
#include "worlddef.h"
|
|
#include "renderworld.h"
|
|
#include "interface control.h"
|
|
#endif
|
|
|
|
#ifndef WIN32_LEAN_AND_MEAN
|
|
#define WIN32_LEAN_AND_MEAN
|
|
#endif
|
|
|
|
#include "Soldier Control.h"
|
|
|
|
INT32 giClockTimer = -1;
|
|
INT32 giTimerDiag = 0;
|
|
|
|
UINT32 guiBaseJA2Clock = 0;
|
|
UINT32 guiBaseJA2NoPauseClock = 0;
|
|
|
|
BOOLEAN gfPauseClock = FALSE;
|
|
|
|
INT32 giTimerIntervals[ NUMTIMERS ] =
|
|
{
|
|
5, // Tactical Overhead
|
|
20, // NEXTSCROLL
|
|
200, // Start Scroll
|
|
200, // Animate tiles
|
|
1000, // FPS Counter
|
|
80, // PATH FIND COUNTER
|
|
150, // CURSOR TIMER
|
|
250, // RIGHT CLICK FOR MENU
|
|
300, // LEFT
|
|
30, // SLIDING TEXT
|
|
200, // TARGET REFINE TIMER
|
|
150, // CURSOR/AP FLASH
|
|
60, // FADE MERCS OUT
|
|
160, // PANEL SLIDE
|
|
1000, // CLOCK UPDATE DELAY
|
|
20, // PHYSICS UPDATE
|
|
100, // FADE ENEMYS
|
|
20, // STRATEGIC OVERHEAD
|
|
40,
|
|
500, // NON GUN TARGET REFINE TIMER
|
|
250, // IMPROVED CURSOR FLASH
|
|
500, // 2nd CURSOR FLASH
|
|
400, // RADARMAP BLINK AND OVERHEAD MAP BLINK SHOUDL BE THE SAME
|
|
400,
|
|
10, // Music Overhead
|
|
100, // Rubber band start delay
|
|
};
|
|
|
|
// TIMER COUNTERS
|
|
INT32 giTimerCounters[ NUMTIMERS ];
|
|
|
|
INT32 giTimerAirRaidQuote = 0;
|
|
INT32 giTimerAirRaidDiveStarted = 0;
|
|
INT32 giTimerAirRaidUpdate = 0;
|
|
INT32 giTimerCustomizable = 0;
|
|
INT32 giTimerTeamTurnUpdate = 0;
|
|
|
|
CUSTOMIZABLE_TIMER_CALLBACK gpCustomizableTimerCallback = NULL;
|
|
|
|
// Clock Callback event ID
|
|
MMRESULT gTimerID;
|
|
|
|
// GLOBALS FOR CALLBACK
|
|
UINT32 gCNT;
|
|
SOLDIERTYPE *gPSOLDIER;
|
|
|
|
// GLobal for displaying time diff ( DIAG )
|
|
UINT32 guiClockDiff = 0;
|
|
UINT32 guiClockStart = 0;
|
|
|
|
|
|
extern UINT32 guiCompressionStringBaseTime;
|
|
extern INT32 giFlashHighlightedItemBaseTime;
|
|
extern INT32 giCompatibleItemBaseTime;
|
|
extern INT32 giAnimateRouteBaseTime;
|
|
extern INT32 giPotHeliPathBaseTime;
|
|
extern INT32 giClickHeliIconBaseTime;
|
|
extern INT32 giExitToTactBaseTime;
|
|
extern UINT32 guiSectorLocatorBaseTime;
|
|
extern INT32 giCommonGlowBaseTime;
|
|
extern INT32 giFlashAssignBaseTime;
|
|
extern INT32 giFlashContractBaseTime;
|
|
extern UINT32 guiFlashCursorBaseTime;
|
|
extern INT32 giPotCharPathBaseTime;
|
|
|
|
|
|
UINT32 InitializeJA2TimerCallback( UINT32 uiDelay, LPTIMECALLBACK TimerProc, UINT32 uiUser );
|
|
|
|
// CALLBACKS
|
|
void CALLBACK FlashItem( UINT uiID, UINT uiMsg, DWORD uiUser, DWORD uiDw1, DWORD uiDw2 );
|
|
|
|
|
|
void CALLBACK TimeProc( UINT uID, UINT uMsg, DWORD dwUser, DWORD dw1, DWORD dw2 )
|
|
{
|
|
static BOOLEAN fInFunction = FALSE;
|
|
//SOLDIERTYPE *pSoldier;
|
|
|
|
if ( !fInFunction )
|
|
{
|
|
fInFunction = TRUE;
|
|
|
|
guiBaseJA2NoPauseClock += BASETIMESLICE;
|
|
|
|
|
|
if ( !gfPauseClock )
|
|
{
|
|
guiBaseJA2Clock += BASETIMESLICE;
|
|
|
|
for ( gCNT = 0; gCNT < NUMTIMERS; gCNT++ )
|
|
{
|
|
UPDATECOUNTER( gCNT );
|
|
}
|
|
|
|
// Update some specialized countdown timers...
|
|
UPDATETIMECOUNTER( giTimerAirRaidQuote );
|
|
UPDATETIMECOUNTER( giTimerAirRaidDiveStarted );
|
|
UPDATETIMECOUNTER( giTimerAirRaidUpdate );
|
|
UPDATETIMECOUNTER( giTimerTeamTurnUpdate );
|
|
|
|
if ( gpCustomizableTimerCallback )
|
|
{
|
|
UPDATETIMECOUNTER( giTimerCustomizable );
|
|
}
|
|
|
|
#ifndef BOUNDS_CHECKER
|
|
|
|
// If mapscreen...
|
|
if( guiTacticalInterfaceFlags & INTERFACE_MAPSCREEN )
|
|
{
|
|
// IN Mapscreen, loop through player's team.....
|
|
for ( gCNT = gTacticalStatus.Team[ gbPlayerNum ].bFirstID; gCNT <= gTacticalStatus.Team[ gbPlayerNum ].bLastID; gCNT++ )
|
|
{
|
|
gPSOLDIER = MercPtrs[ gCNT ];
|
|
UPDATETIMECOUNTER( gPSOLDIER->timeCounters.PortraitFlashCounter );
|
|
UPDATETIMECOUNTER( gPSOLDIER->timeCounters.PanelAnimateCounter );
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// Set update flags for soldiers
|
|
////////////////////////////
|
|
for ( gCNT = 0; gCNT < guiNumMercSlots; gCNT++ )
|
|
{
|
|
gPSOLDIER = MercSlots[ gCNT ];
|
|
|
|
if ( gPSOLDIER != NULL )
|
|
{
|
|
UPDATETIMECOUNTER( gPSOLDIER->timeCounters.UpdateCounter );
|
|
UPDATETIMECOUNTER( gPSOLDIER->timeCounters.DamageCounter );
|
|
UPDATETIMECOUNTER( gPSOLDIER->timeCounters.ReloadCounter );
|
|
UPDATETIMECOUNTER( gPSOLDIER->timeCounters.FlashSelCounter );
|
|
UPDATETIMECOUNTER( gPSOLDIER->timeCounters.BlinkSelCounter );
|
|
UPDATETIMECOUNTER( gPSOLDIER->timeCounters.PortraitFlashCounter );
|
|
UPDATETIMECOUNTER( gPSOLDIER->timeCounters.AICounter );
|
|
UPDATETIMECOUNTER( gPSOLDIER->timeCounters.FadeCounter );
|
|
UPDATETIMECOUNTER( gPSOLDIER->timeCounters.NextTileCounter );
|
|
UPDATETIMECOUNTER( gPSOLDIER->timeCounters.PanelAnimateCounter );
|
|
#ifdef JA2UB
|
|
UPDATETIMECOUNTER( gPSOLDIER->GetupFromJA25StartCounter );
|
|
#endif
|
|
}
|
|
}
|
|
}
|
|
#endif
|
|
}
|
|
|
|
|
|
fInFunction = FALSE;
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
BOOLEAN InitializeJA2Clock(void)
|
|
{
|
|
|
|
#ifdef CALLBACKTIMER
|
|
|
|
|
|
MMRESULT mmResult;
|
|
TIMECAPS tc;
|
|
INT32 cnt;
|
|
|
|
// Init timer delays
|
|
for ( cnt = 0; cnt < NUMTIMERS; cnt++ )
|
|
{
|
|
giTimerCounters[ cnt ] = giTimerIntervals[ cnt ];
|
|
}
|
|
|
|
|
|
// First get timer resolutions
|
|
mmResult = timeGetDevCaps( &tc, sizeof( tc ) );
|
|
|
|
if ( mmResult != TIMERR_NOERROR )
|
|
{
|
|
DebugMsg( TOPIC_JA2, DBG_LEVEL_3, "Could not get timer properties");
|
|
}
|
|
|
|
// Set timer at lowest resolution. Could use middle of lowest/highest, we'll see how this performs first
|
|
gTimerID = timeSetEvent( BASETIMESLICE, BASETIMESLICE, TimeProc, (DWORD)0, TIME_PERIODIC );
|
|
|
|
if ( !gTimerID )
|
|
{
|
|
DebugMsg( TOPIC_JA2, DBG_LEVEL_3, "Could not create timer callback");
|
|
}
|
|
|
|
#endif
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
void ShutdownJA2Clock(void)
|
|
{
|
|
// Make sure we kill the timer
|
|
#ifdef CALLBACKTIMER
|
|
|
|
timeKillEvent( gTimerID );
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
UINT32 InitializeJA2TimerCallback( UINT32 uiDelay, LPTIMECALLBACK TimerProc, UINT32 uiUser )
|
|
{
|
|
MMRESULT mmResult;
|
|
TIMECAPS tc;
|
|
MMRESULT TimerID;
|
|
|
|
|
|
// First get timer resolutions
|
|
mmResult = timeGetDevCaps( &tc, sizeof( tc ) );
|
|
|
|
if ( mmResult != TIMERR_NOERROR )
|
|
{
|
|
DebugMsg( TOPIC_JA2, DBG_LEVEL_3, "Could not get timer properties");
|
|
}
|
|
|
|
// Set timer at lowest resolution. Could use middle of lowest/highest, we'll see how this performs first
|
|
TimerID = timeSetEvent( (UINT)uiDelay, (UINT)uiDelay, TimerProc, (DWORD)uiUser, TIME_PERIODIC );
|
|
|
|
if ( !TimerID )
|
|
{
|
|
DebugMsg( TOPIC_JA2, DBG_LEVEL_3, "Could not create timer callback");
|
|
}
|
|
|
|
return ( (UINT32)TimerID );
|
|
}
|
|
|
|
|
|
void RemoveJA2TimerCallback( UINT32 uiTimer )
|
|
{
|
|
timeKillEvent( uiTimer );
|
|
}
|
|
|
|
|
|
UINT32 InitializeJA2TimerID( UINT32 uiDelay, UINT32 uiCallbackID, UINT32 uiUser )
|
|
{
|
|
switch( uiCallbackID )
|
|
{
|
|
case ITEM_LOCATOR_CALLBACK:
|
|
|
|
return( InitializeJA2TimerCallback( uiDelay, FlashItem, uiUser ) );
|
|
break;
|
|
|
|
}
|
|
|
|
// invalid callback id
|
|
Assert( FALSE );
|
|
return( 0 );
|
|
}
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////////////////
|
|
// TIMER CALLBACK S
|
|
//////////////////////////////////////////////////////////////////////////////////////////////
|
|
void CALLBACK FlashItem( UINT uiID, UINT uiMsg, DWORD uiUser, DWORD uiDw1, DWORD uiDw2 )
|
|
{
|
|
|
|
}
|
|
|
|
|
|
void PauseTime( BOOLEAN fPaused )
|
|
{
|
|
gfPauseClock = fPaused;
|
|
}
|
|
|
|
void SetCustomizableTimerCallbackAndDelay( INT32 iDelay, CUSTOMIZABLE_TIMER_CALLBACK pCallback, BOOLEAN fReplace )
|
|
{
|
|
if ( gpCustomizableTimerCallback )
|
|
{
|
|
if ( !fReplace )
|
|
{
|
|
// replace callback but call the current callback first
|
|
gpCustomizableTimerCallback();
|
|
}
|
|
}
|
|
|
|
RESETTIMECOUNTER( giTimerCustomizable, iDelay );
|
|
gpCustomizableTimerCallback = pCallback;
|
|
}
|
|
|
|
void CheckCustomizableTimer( void )
|
|
{
|
|
if ( gpCustomizableTimerCallback )
|
|
{
|
|
if ( TIMECOUNTERDONE( giTimerCustomizable, 0 ) )
|
|
{
|
|
// set the callback to a temp variable so we can reset the global variable
|
|
// before calling the callback, so that if the callback sets up another
|
|
// instance of the timer, we don't reset it afterwards
|
|
CUSTOMIZABLE_TIMER_CALLBACK pTempCallback;
|
|
|
|
pTempCallback = gpCustomizableTimerCallback;
|
|
gpCustomizableTimerCallback = NULL;
|
|
pTempCallback();
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void ResetJA2ClockGlobalTimers( void )
|
|
{
|
|
UINT32 uiCurrentTime = GetJA2Clock();
|
|
|
|
|
|
guiCompressionStringBaseTime = uiCurrentTime;
|
|
giFlashHighlightedItemBaseTime = uiCurrentTime;
|
|
giCompatibleItemBaseTime = uiCurrentTime;
|
|
giAnimateRouteBaseTime = uiCurrentTime;
|
|
giPotHeliPathBaseTime = uiCurrentTime;
|
|
giClickHeliIconBaseTime = uiCurrentTime;
|
|
giExitToTactBaseTime = uiCurrentTime;
|
|
guiSectorLocatorBaseTime = uiCurrentTime;
|
|
|
|
giCommonGlowBaseTime = uiCurrentTime;
|
|
giFlashAssignBaseTime = uiCurrentTime;
|
|
giFlashContractBaseTime = uiCurrentTime;
|
|
guiFlashCursorBaseTime = uiCurrentTime;
|
|
giPotCharPathBaseTime = uiCurrentTime;
|
|
}
|
|
|
|
void SetTileAnimCounter( INT32 iTime )
|
|
{
|
|
giTimerIntervals[ ANIMATETILES ] = iTime;
|
|
}
|