Original Source for 1.13 Mod High Resolution version from 12/06/05

git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@21 3b4a5df2-a311-0410-b5c6-a8a6f20db521
This commit is contained in:
lalien
2006-04-19 11:32:51 +00:00
commit e54aeb96aa
790 changed files with 741287 additions and 0 deletions
+227
View File
@@ -0,0 +1,227 @@
#ifdef PRECOMPILEDHEADERS
#include "Tactical All.h"
#else
#include <stdio.h>
#include <string.h>
#include "wcheck.h"
#include "stdlib.h"
#include "debug.h"
#include "soldier control.h"
#include "weapons.h"
#include "cursor control.h"
#include "cursors.h"
#include "soldier find.h"
#include "isometric utils.h"
#include "renderworld.h"
#include "render dirty.h"
#include "interface.h"
#include "spread burst.h"
#endif
BURST_LOCATIONS gsBurstLocations[ MAX_BURST_LOCATIONS ];
INT8 gbNumBurstLocations = 0;
extern BOOLEAN gfBeginBurstSpreadTracking;
void ResetBurstLocations( )
{
gbNumBurstLocations = 0;
}
void AccumulateBurstLocation( INT16 sGridNo )
{
INT32 cnt;
if ( gbNumBurstLocations < MAX_BURST_LOCATIONS )
{
// Check if it already exists!
for ( cnt = 0; cnt < gbNumBurstLocations; cnt++ )
{
if ( gsBurstLocations[ cnt ].sGridNo == sGridNo )
{
return;
}
}
gsBurstLocations[ gbNumBurstLocations ].sGridNo = sGridNo;
// Get cell X, Y from mouse...
GetMouseWorldCoords( &( gsBurstLocations[ gbNumBurstLocations ].sX ), &( gsBurstLocations[ gbNumBurstLocations ].sY ) );
gbNumBurstLocations++;
}
}
void PickBurstLocations( SOLDIERTYPE *pSoldier )
{
UINT8 ubShotsPerBurst;
FLOAT dAccululator = 0;
FLOAT dStep = 0;
INT32 cnt;
UINT8 ubLocationNum;
// OK, using the # of locations, spread them evenly between our current weapon shots per burst value
// Get shots per burst
//DIGICRAB: Burst UnCap
//if we fire more than MAX_BURST_SPREAD_TARGETS bullets, make sure there's no buffer overflow
if(pSoldier->bDoAutofire)
{
INT16 sAPCosts;
pSoldier->bDoAutofire = 1;
do
{
pSoldier->bDoAutofire++;
sAPCosts = CalcTotalAPsToAttack( pSoldier, gsBurstLocations[0].sGridNo, TRUE, 0);
}
while(EnoughPoints( pSoldier, sAPCosts, 0, FALSE ) && pSoldier->inv[ pSoldier->ubAttackingHand ].ubGunShotsLeft >= pSoldier->bDoAutofire && gbNumBurstLocations >= pSoldier->bDoAutofire);
pSoldier->bDoAutofire--;
ubShotsPerBurst = __min(pSoldier->bDoAutofire,MAX_BURST_SPREAD_TARGETS);
}
else
{
if ( pSoldier->bWeaponMode == WM_ATTACHED_GL_BURST )
ubShotsPerBurst = __min(Weapon[GetAttachedGrenadeLauncher(&pSoldier->inv[HANDPOS])].ubShotsPerBurst,MAX_BURST_SPREAD_TARGETS);
else
ubShotsPerBurst = __min(GetShotsPerBurst(&pSoldier->inv[ HANDPOS ]),MAX_BURST_SPREAD_TARGETS);
}
// Use # gridnos accululated and # burst shots to determine accululator
dStep = gbNumBurstLocations / (FLOAT)ubShotsPerBurst;
//Loop through our shots!
for ( cnt = 0; cnt < ubShotsPerBurst; cnt++ )
{
// Get index into list
ubLocationNum = (UINT8)( dAccululator );
// Add to merc location
pSoldier->sSpreadLocations[ cnt ] = gsBurstLocations[ ubLocationNum ].sGridNo;
DebugMsg(TOPIC_JA2,DBG_LEVEL_3,String("PickBurstLocations: loc#%d = %d", cnt, pSoldier->sSpreadLocations[ cnt ]));
// Acculuate index value
dAccululator += dStep;
}
// OK, they have been added
}
void AIPickBurstLocations( SOLDIERTYPE *pSoldier, INT8 bTargets, SOLDIERTYPE *pTargets[5] )
{
UINT8 ubShotsPerBurst;
FLOAT dAccululator = 0;
FLOAT dStep = 0;
INT32 cnt;
UINT8 ubLocationNum;
// OK, using the # of locations, spread them evenly between our current weapon shots per burst value
// Get shots per burst
//DIGICRAB: Burst UnCap
//if we fire more than MAX_BURST_SPREAD_TARGETS bullets, make sure there's no buffer overflow
if(pSoldier->bDoAutofire)
ubShotsPerBurst = __min(pSoldier->bDoAutofire,MAX_BURST_SPREAD_TARGETS);
else
ubShotsPerBurst = __min(GetShotsPerBurst (&pSoldier->inv[ HANDPOS ]),MAX_BURST_SPREAD_TARGETS);
if ( ubShotsPerBurst <= 0 )
ubShotsPerBurst = 1;
// Use # gridnos accululated and # burst shots to determine accululator
//dStep = gbNumBurstLocations / (FLOAT)ubShotsPerBurst;
// CJC: tweak!
dStep = bTargets / (FLOAT)ubShotsPerBurst;
//Loop through our shots!
for ( cnt = 0; cnt < ubShotsPerBurst; cnt++ )
{
// Get index into list
ubLocationNum = (UINT8)( dAccululator );
// Add to merc location
pSoldier->sSpreadLocations[ cnt ] = pTargets[ubLocationNum]->sGridNo;
// Acculuate index value
dAccululator += dStep;
}
// OK, they have been added
}
extern HVOBJECT GetCursorFileVideoObject( UINT32 uiCursorFile );
void RenderAccumulatedBurstLocations( )
{
INT32 cnt;
INT16 sGridNo;
HVOBJECT hVObject;
if ( !gfBeginBurstSpreadTracking )
{
return;
}
if ( gbNumBurstLocations == 0 )
{
return;
}
// Loop through each location...
GetVideoObject( &hVObject, guiBURSTACCUM );
// If on screen, render
// Check if it already exists!
for ( cnt = 0; cnt < gbNumBurstLocations; cnt++ )
{
sGridNo = gsBurstLocations[ cnt ].sGridNo;
if ( GridNoOnScreen( sGridNo ) )
{
FLOAT dOffsetX, dOffsetY;
FLOAT dTempX_S, dTempY_S;
INT16 sXPos, sYPos;
INT32 iBack;
dOffsetX = (FLOAT)( gsBurstLocations[ cnt ].sX - gsRenderCenterX );
dOffsetY = (FLOAT)( gsBurstLocations[ cnt ].sY - gsRenderCenterY );
// Calculate guy's position
FloatFromCellToScreenCoordinates( dOffsetX, dOffsetY, &dTempX_S, &dTempY_S );
sXPos = ( ( gsVIEWPORT_END_X - gsVIEWPORT_START_X ) /2 ) + (INT16)dTempX_S;
sYPos = ( ( gsVIEWPORT_END_Y - gsVIEWPORT_START_Y ) /2 ) + (INT16)dTempY_S - gpWorldLevelData[ sGridNo ].sHeight;
// Adjust for offset position on screen
sXPos -= gsRenderWorldOffsetX;
sYPos -= gsRenderWorldOffsetY;
// Adjust for render height
sYPos += gsRenderHeight;
//sScreenY -= gpWorldLevelData[ sGridNo ].sHeight;
// Center circle!
//sXPos -= 10;
//sYPos -= 10;
iBack = RegisterBackgroundRect( BGND_FLAG_SINGLE, NULL, sXPos, sYPos, (INT16)(sXPos +40 ), (INT16)(sYPos + 40 ) );
if ( iBack != -1 )
{
SetBackgroundRectFilled( iBack );
}
BltVideoObject( FRAME_BUFFER, hVObject, 1, sXPos, sYPos, VO_BLT_SRCTRANSPARENCY, NULL );
}
}
}