New feature: exploration assignment indicates items on the map

For more info, see http://thepit.ja-galaxy-forum.com/index.php?t=msg&goto=360244&#msg_360244


git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@8815 3b4a5df2-a311-0410-b5c6-a8a6f20db521
This commit is contained in:
Flugente
2020-06-01 20:46:45 +00:00
parent b25a4be4e7
commit f0c8db784a
25 changed files with 514 additions and 58 deletions
+2
View File
@@ -2253,6 +2253,8 @@ void LoadGameExternalOptions()
gGameExternalOptions.fAdministrationPointsPerPercent = (FLOAT)iniReader.ReadDouble( "Strategic Assignment Settings", "ADMINISTRATION_POINTS_PER_PERCENT", 20.0f, 1.0f, 1000.0f );
gGameExternalOptions.fAdministrationMaxPercent = iniReader.ReadInteger( "Strategic Assignment Settings", "ADMINISTRATION_MAX_PERCENTAGE", 15, 0, 100 );
gGameExternalOptions.fExplorationPointsModifier = (FLOAT)iniReader.ReadDouble("Strategic Assignment Settings", "EXPLORATION_POINTS_MODIFIER", 1.0f, 0.01f, 10.0f );
gGameExternalOptions.fUseXMLSquadNames = iniReader.ReadBoolean("Strategic Assignment Settings", "USE_XML_SQUADNAMES", FALSE);
+2
View File
@@ -737,6 +737,8 @@ typedef struct
FLOAT fAdministrationPointsPerPercent;
UINT16 fAdministrationMaxPercent;
FLOAT fExplorationPointsModifier;
INT32 ubTrainingSkillMin;
INT32 ubTrainingSkillMax;
INT32 ubSelfTrainingDivisor;
+2 -2
View File
@@ -55,8 +55,8 @@
#endif
CHAR8 czVersionNumber[16] = { "Build 20.05.30" }; //YY.MM.DD
CHAR8 czVersionNumber[16] = { "Build 20.06.01" }; //YY.MM.DD
CHAR16 zTrackingNumber[16] = { L"Z" };
CHAR16 zRevisionNumber[16] = { L"Revision 8811" };
CHAR16 zRevisionNumber[16] = { L"Revision 8815" };
// SAVE_GAME_VERSION is defined in header, change it there
+4 -1
View File
@@ -366,7 +366,7 @@ void PixelDraw( BOOLEAN fClip, INT32 xp, INT32 yp, INT16 sColor, UINT8 *pScreen
}
// Flugente: alter the colour of existing pixels instead of fully replacing the colour
void PixelAlterColour(BOOLEAN fClip, INT32 xp, INT32 yp, UINT8 col1, UINT8 col2, UINT8 *pScreen)
void PixelAlterColour(BOOLEAN fClip, INT32 xp, INT32 yp, INT16 sColor, UINT8 *pScreen)
{
if ( fClip && !ClipPoint( xp, yp ) )
return;
@@ -374,6 +374,9 @@ void PixelAlterColour(BOOLEAN fClip, INT32 xp, INT32 yp, UINT8 col1, UINT8 col2,
// point to the bitmap address first pixel to draw
pScreen += yp * giImageWidth + xp * 2;
INT8 col2 = sColor >> 8;
INT8 col1 = sColor & 0x00ff;
pScreen[0] |= col1;
pScreen[1] |= col2;
}
+1 -1
View File
@@ -59,7 +59,7 @@ void SetClippingRegionAndImageWidth(
void PixelDraw( BOOLEAN fClip, INT32 xp, INT32 yp, INT16 sColor, UINT8 *pScreen );
// Flugente: alter the colour of existing pixels instead of fully replacing the colour
void PixelAlterColour( BOOLEAN fClip, INT32 xp, INT32 yp, UINT8 col1, UINT8 col2, UINT8 *pScreen );
void PixelAlterColour( BOOLEAN fClip, INT32 xp, INT32 yp, INT16 sColor, UINT8 *pScreen );
void LineDraw( BOOL fClip, int XStart, int YStart, int XEnd, int YEnd, short Color, UINT8 *ScreenPtr);
void LineDraw( BOOL fClip, int XStart, int YStart, int XEnd, int YEnd, short Color, UINT8 *ScreenPtr);
+205 -1
View File
@@ -513,6 +513,9 @@ void HandleSpyAssignments();
// Flugente: handle administration assignment
void HandleAdministrationAssignments();
// Flugente: handle exploration assignements
void HandleExplorationAssignments();
// is the character between secotrs in mvt
BOOLEAN CharacterIsBetweenSectors( SOLDIERTYPE *pSoldier );
@@ -1111,6 +1114,29 @@ BOOLEAN CanCharacterAdministration( SOLDIERTYPE *pSoldier )
return TRUE;
}
BOOLEAN CanCharacterExplore( SOLDIERTYPE *pSoldier )
{
AssertNotNIL( pSoldier );
if ( !BasicCanCharacterAssignment( pSoldier, TRUE ) )
return FALSE;
if ( pSoldier->bSectorZ )
{
UNDERGROUND_SECTORINFO* pSector = FindUnderGroundSector( pSoldier->sSectorX, pSoldier->sSectorY, pSoldier->bSectorZ );
if ( !pSector || pSector->usExplorationProgress >= 250 )
return FALSE;
}
else
{
SECTORINFO* pSector = &( SectorInfo[SECTOR( pSoldier->sSectorX, pSoldier->sSectorY )] );
if ( !pSector || pSector->usExplorationProgress >= 250 )
return FALSE;
}
return TRUE;
}
BOOLEAN IsAnythingAroundForSoldierToRepair( SOLDIERTYPE * pSoldier )
{
AssertNotNIL(pSoldier);
@@ -2967,6 +2993,9 @@ void UpdateAssignments()
// handle administration assignment
HandleAdministrationAssignments();
// handle exploration
HandleExplorationAssignments();
// check to see if anyone is done healing?
UpdatePatientsWhoAreDoneHealing( );
@@ -6898,6 +6927,96 @@ void HandleAdministrationAssignments()
}
}
// Flugente: handle exploration assignments
void HandleExplorationAssignments()
{
SOLDIERTYPE *pSoldier = NULL;
UINT32 uiCnt = 0;
UINT32 firstid = gTacticalStatus.Team[gbPlayerNum].bFirstID;
UINT32 lastid = gTacticalStatus.Team[gbPlayerNum].bLastID;
for ( uiCnt = firstid, pSoldier = MercPtrs[uiCnt]; uiCnt <= lastid; ++uiCnt, ++pSoldier )
{
if ( pSoldier && pSoldier->bAssignment == EXPLORATION && !pSoldier->flags.fMercAsleep && EnoughTimeOnAssignment( pSoldier ) )
{
UINT32 pts = pSoldier->GetExplorationPoints();
bool awardpts = false;
if ( pSoldier->bSectorZ )
{
UNDERGROUND_SECTORINFO *pSector;
pSector = FindUnderGroundSector( pSoldier->sSectorX, pSoldier->sSectorY, pSoldier->bSectorZ );
if ( pSector && pSector->usExplorationProgress < 250 )
{
awardpts = true;
UINT32 oldprogress = pSector->usExplorationProgress;
UINT32 newprogress = min( 255, oldprogress + pts );
if ( newprogress > 250 )
{
pSector->usExplorationProgress = 255;
CHAR16 wSectorName[64];
GetShortSectorString( pSoldier->sSectorX, pSoldier->sSectorY, wSectorName );
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, Message[STR_ASSIGNMENT_EXPLORATION_DONE], pSoldier->GetName(), wSectorName );
AssignmentDone( pSoldier, TRUE, TRUE );
}
else
{
pSector->usExplorationProgress = (UINT8)newprogress;
}
}
else
{
AssignmentDone( pSoldier, TRUE, TRUE );
}
}
else
{
SECTORINFO* pSector = &( SectorInfo[SECTOR( pSoldier->sSectorX, pSoldier->sSectorY )] );
if ( pSector && pSector->usExplorationProgress < 250 )
{
awardpts = true;
UINT32 oldprogress = pSector->usExplorationProgress;
UINT32 newprogress = min( 255, oldprogress + pts );
if ( newprogress > 250 )
{
pSector->usExplorationProgress = 255;
CHAR16 wSectorName[64];
GetShortSectorString( pSoldier->sSectorX, pSoldier->sSectorY, wSectorName );
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, Message[STR_ASSIGNMENT_EXPLORATION_DONE], pSoldier->GetName(), wSectorName );
AssignmentDone( pSoldier, TRUE, TRUE );
}
else
{
pSector->usExplorationProgress = (UINT8)newprogress;
}
}
else
{
AssignmentDone( pSoldier, TRUE, TRUE );
}
}
if ( awardpts )
{
StatChange( pSoldier, AGILAMT, 1, FROM_TRAINING );
StatChange( pSoldier, WISDOMAMT, 1, FROM_TRAINING );
StatChange( pSoldier, EXPERAMT, 1, FROM_TRAINING );
}
}
}
}
// handle snitch spreading propaganda assignment
// totally not a copy of HandleRadioScanInSector
void HandleSpreadingPropagandaInSector( INT16 sMapX, INT16 sMapY, INT8 bZ )
@@ -10567,7 +10686,19 @@ void HandleShadingOfLinesForAssignmentMenus( void )
{
ShadeStringInBox( ghAssignmentBox, ASSIGN_MENU_ADMINISTRATION );
}
// exploration
if ( CanCharacterExplore( pSoldier ) )
{
// unshade line
UnShadeStringInBox( ghAssignmentBox, ASSIGN_MENU_EXPLORATION );
}
else
{
// shade line
ShadeStringInBox( ghAssignmentBox, ASSIGN_MENU_EXPLORATION );
}
// militia
if ( CanCharacterOnDuty( pSoldier ) )
{
@@ -14130,6 +14261,42 @@ void AssignmentMenuBtnCallback( MOUSE_REGION * pRegion, INT32 iReason )
}
break;
case ASSIGN_MENU_EXPLORATION:
if ( CanCharacterExplore( pSoldier ) )
{
// stop showing menu
fShowAssignmentMenu = FALSE;
giAssignHighLine = -1;
pSoldier->bOldAssignment = pSoldier->bAssignment;
if ( ( pSoldier->bAssignment != EXPLORATION ) )
{
SetTimeOfAssignmentChangeForMerc( pSoldier );
}
// remove from squad
if ( pSoldier->bOldAssignment == VEHICLE )
{
TakeSoldierOutOfVehicle( pSoldier );
}
RemoveCharacterFromSquads( pSoldier );
ChangeSoldiersAssignment( pSoldier, EXPLORATION );
AssignMercToAMovementGroup( pSoldier );
MakeSoldiersTacticalAnimationReflectAssignment( pSoldier );
// set dirty flag
fTeamPanelDirty = TRUE;
fMapScreenBottomDirty = TRUE;
// set assignment for group
SetAssignmentForList( (INT8)EXPLORATION, 0 );
}
break;
case( ASSIGN_MENU_CANCEL ):
fShowAssignmentMenu = FALSE;
giAssignHighLine = -1;
@@ -17083,6 +17250,30 @@ void SetSoldierAssignment( SOLDIERTYPE *pSoldier, INT8 bAssignment, INT32 iParam
AssignMercToAMovementGroup( pSoldier );
}
break;
case EXPLORATION:
if ( CanCharacterExplore( pSoldier ) )
{
pSoldier->bOldAssignment = pSoldier->bAssignment;
// remove from squad
RemoveCharacterFromSquads( pSoldier );
// remove from any vehicle
if ( pSoldier->bOldAssignment == VEHICLE )
{
TakeSoldierOutOfVehicle( pSoldier );
}
if ( pSoldier->bAssignment != bAssignment )
{
SetTimeOfAssignmentChangeForMerc( pSoldier );
}
ChangeSoldiersAssignment( pSoldier, bAssignment );
AssignMercToAMovementGroup( pSoldier );
}
break;
}
}
@@ -18234,6 +18425,10 @@ void ReEvaluateEveryonesNothingToDo( BOOLEAN aDoExtensiveCheck )
fNothingToDo = !CanCharacterAdministration( pSoldier ) || !GetNumberofAdministratableMercs( pSoldier->sSectorX, pSoldier->sSectorY );
break;
case EXPLORATION:
fNothingToDo = !CanCharacterExplore( pSoldier );
break;
case VEHICLE:
default: // squads
fNothingToDo = FALSE;
@@ -18589,6 +18784,15 @@ void SetAssignmentForList( INT8 bAssignment, INT8 bParam )
}
break;
case EXPLORATION:
if ( CanCharacterExplore( pSoldier ) )
{
pSoldier->bOldAssignment = pSoldier->bAssignment;
SetSoldierAssignment( pSoldier, bAssignment, bParam, 0, 0 );
fItWorked = TRUE;
}
break;
case( SQUAD_1 ):
case( SQUAD_2 ):
case( SQUAD_3 ):
+2
View File
@@ -98,6 +98,7 @@ enum
DRILL_MILITIA, // train existing militia (does not create new ones)
BURIAL, // merc removes corpses in this sector
ADMINISTRATION, // merc boosts the effectiveness of other mercs
EXPLORATION, // merc searches the sector for undiscovered items
NUM_ASSIGNMENTS,
};
@@ -213,6 +214,7 @@ BOOLEAN CanCharacterSpyAssignment( SOLDIERTYPE *pSoldier );
BOOLEAN CanCharacterBurial( SOLDIERTYPE *pSoldier );
BOOLEAN CanCharacterAdministration( SOLDIERTYPE *pSoldier );
BOOLEAN CanCharacterExplore( SOLDIERTYPE *pSoldier );
// can this character be assigned as a repairman?
BOOLEAN CanCharacterRepair( SOLDIERTYPE *pCharacter );
+3 -2
View File
@@ -574,7 +574,7 @@ typedef struct SECTORINFO
UINT8 ubNumAdmins_Turncoat;
UINT8 ubNumTroops_Turncoat;
UINT8 ubNumElites_Turncoat;
UINT8 bPadding_1;
UINT8 usExplorationProgress;
INT8 bPadding[ 8 ];
@@ -624,8 +624,9 @@ typedef struct UNDERGROUND_SECTORINFO
UINT8 ubNumJeeps;
UINT8 ubJeepsInBattle;
UINT8 usExplorationProgress;
INT8 bPadding[14];
INT8 bPadding[12];
//no padding left!
}UNDERGROUND_SECTORINFO;
+1
View File
@@ -134,6 +134,7 @@ enum {
ASSIGN_MENU_FORTIFY, // added by Flugente
ASSIGN_MENU_SPY, // added by Flugente
ASSIGN_MENU_ADMINISTRATION, // added by Flugente
ASSIGN_MENU_EXPLORATION, // added by Flugente
ASSIGN_MENU_FACILITY, // HEAROCK HAM 3.6: Facility List menu
ASSIGN_MENU_CANCEL,
MAX_ASSIGN_STRING_COUNT,
+10
View File
@@ -2428,6 +2428,16 @@ void HandleRenderFaceAdjustments( FACETYPE *pFace, BOOLEAN fDisplayBuffer, BOOLE
swprintf(sString, L"%d/%3.1f", sPtsAvailable, bPtsAvailable);
break;
case EXPLORATION:
sIconIndex_Assignment = 34;
fDoIcon_Assignment = TRUE;
fShowCustomText = TRUE;
sPtsAvailable = (INT16)MercPtrs[pFace->ubSoldierID]->GetExplorationPoints();
// we only show our points, not how far we are with the task, lest the player deduct how many items there are to find in the first place
swprintf( sString, L"%d", sPtsAvailable );
break;
}
// Check for being serviced...
+6 -2
View File
@@ -619,6 +619,8 @@ void DrawExplosionWarning( INT32 sGridno, INT8 sLevel, INT8 sDelay )
// make sure to check for these boundaries later on, and only draw inside them
SetClippingRegionAndImageWidth( uiDestPitchBYTES, gsVIEWPORT_START_X, gsVIEWPORT_WINDOW_START_Y, gsVIEWPORT_END_X, gsVIEWPORT_WINDOW_END_Y );
UINT16 red = Get16BPPColor( FROMRGB( 255, 0, 0 ) );
INT16 numcircles = max( 1, 4 - sDelay);
// we determine the biggest rectangle we have to reserve
@@ -658,7 +660,7 @@ void DrawExplosionWarning( INT32 sGridno, INT8 sLevel, INT8 sDelay )
if ( radius_inner <= diff && diff <= radius_outer )
{
// we alter the colour of existing pixels instead of fully replacing the colour. As a result, one can still see the map regions we draw over, which looks a lot better
PixelAlterColour( FALSE, x, y, 0x00, 0x88, pDestBuf );
PixelAlterColour( FALSE, x, y, red, pDestBuf );
sthdrawn = TRUE;
}
@@ -733,6 +735,8 @@ void DrawTraitRadius( INT32 sGridno, INT8 sLevel, INT32 sRadius, INT16 sThicknes
best_yl = min( best_yl, yl );
best_yr = max( best_yr, yr );
UINT16 blue = Get16BPPColor( FROMRGB( 0, 0, 255 ) );
for ( INT32 x = xl; x <= xr; ++x )
{
FLOAT xdiffsquared = (FLOAT)((sScreenX - x) * (sScreenX - x));
@@ -744,7 +748,7 @@ void DrawTraitRadius( INT32 sGridno, INT8 sLevel, INT32 sRadius, INT16 sThicknes
if ( radius_inner <= diff && diff <= radius_outer )
{
// we alter the colour of existing pixels instead of fully replacing the colour. As a result, one can still see the map regions we draw over, which looks a lot better
PixelAlterColour( FALSE, x, y, 0xFF, 0x00, pDestBuf );
PixelAlterColour( FALSE, x, y, blue, pDestBuf );
sthdrawn = TRUE;
}
+1
View File
@@ -205,6 +205,7 @@ enum {
BG_HACKERSKILL, // hacking skill from 0 to 100, > 0 means hacking is possible
BG_BURIAL_ASSIGNMENT, // modifies effectivity of 'BURIAL' assignment
BG_ADMINISTRATION_ASSIGNMENT, // modifies effectivity of 'ADMINISTRATION' assignment
BG_EXPLORATION_ASSIGNMENT, // modifies effectivity of 'EXPLORATION' assignment
BG_MAX,
};
+55 -1
View File
@@ -20684,7 +20684,7 @@ FLOAT SOLDIERTYPE::GetAdministrationModifier()
// Flugente: those with the <scrounging> background occasionally steal money from the locals
UINT8 SOLDIERTYPE::GetThiefStealMoneyChance()
{
if ( this->stats.bLife < OKLIFE )
if ( this->stats.bLife < OKLIFE || ( this->usSoldierFlagMask & SOLDIER_POW ) )
return 0;
UINT32 val = 1 * EffectiveAgility( this, FALSE ) + 8 * EffectiveDexterity( this, FALSE ) + 10 * EffectiveExpLevel( this, FALSE );
@@ -21001,6 +21001,60 @@ void SOLDIERTYPE::OrderAllTurnCoatToSwitchSides()
}
}
UINT32 SOLDIERTYPE::GetExplorationPoints()
{
if ( this->stats.bLife < OKLIFE || ( this->usSoldierFlagMask & SOLDIER_POW ) )
return 0;
// if not on correct assignment, no gain
if ( this->bAssignment != EXPLORATION )
return 0;
UINT32 val = 400 + 1 * EffectiveWisdom( this ) + 1 * EffectiveAgility( this, FALSE ) + 5 * EffectiveExpLevel( this, FALSE )
+ 150 * NUM_SKILL_TRAITS( this, SCOUTING_NT ) + 50 * NUM_SKILL_TRAITS( this, SURVIVAL_NT ) + (this->HasBackgroundFlag( BACKGROUND_SCROUNGING ) ? 150 : 0);
// personality/disability modifiers
FLOAT persmodifier = 1.0f;
//if ( DoesMercHaveDisability( this, HEAT_INTOLERANT ) ) persmodifier -= 0.20f;
//if ( DoesMercHaveDisability( this, NERVOUS ) ) persmodifier -= 0.20f;
if ( DoesMercHaveDisability( this, CLAUSTROPHOBIC ) ) persmodifier -= 0.03f;
//if ( DoesMercHaveDisability( this, NONSWIMMER ) ) persmodifier -= 0.20f;
//if ( DoesMercHaveDisability( this, FEAR_OF_INSECTS ) ) persmodifier -= 0.20f;
if ( DoesMercHaveDisability( this, FORGETFUL ) ) persmodifier -= 0.30f;
//if ( DoesMercHaveDisability( this, PSYCHO ) ) persmodifier -= 0.20f;
//if ( DoesMercHaveDisability( this, DEAF ) ) persmodifier -= 0.15f;
if ( DoesMercHaveDisability( this, SHORTSIGHTED ) ) persmodifier -= 0.30f;
//if ( DoesMercHaveDisability( this, HEMOPHILIAC ) ) persmodifier -= 0.20f;
if ( DoesMercHaveDisability( this, AFRAID_OF_HEIGHTS ) ) persmodifier -= 0.02f;
//if ( DoesMercHaveDisability( this, SELF_HARM ) ) persmodifier -= 0.20f;
if ( gGameOptions.fNewTraitSystem )
{
//if ( DoesMercHavePersonality( this, CHAR_TRAIT_SOCIABLE ) ) persmodifier += 0.25f;
//if ( DoesMercHavePersonality( this, CHAR_TRAIT_LONER ) ) persmodifier -= 0.05f;
//if ( DoesMercHavePersonality( this, CHAR_TRAIT_OPTIMIST ) ) persmodifier += 0.05f;
//if ( DoesMercHavePersonality( this, CHAR_TRAIT_ASSERTIVE ) ) persmodifier += 0.15f;
//if ( DoesMercHavePersonality( this, CHAR_TRAIT_INTELLECTUAL ) ) persmodifier += 0.15f;
//if ( DoesMercHavePersonality( this, CHAR_TRAIT_PRIMITIVE ) ) persmodifier -= 0.15f;
//if ( DoesMercHavePersonality( this, CHAR_TRAIT_AGGRESSIVE ) ) persmodifier -= 0.15f;
//if ( DoesMercHavePersonality( this, CHAR_TRAIT_PHLEGMATIC ) ) persmodifier -= 0.05f;
//if ( DoesMercHavePersonality( this, CHAR_TRAIT_DAUNTLESS ) ) persmodifier -= 0.13f;
//if ( DoesMercHavePersonality( this, CHAR_TRAIT_PACIFIST ) ) persmodifier -= 0.03f;
//if ( DoesMercHavePersonality( this, CHAR_TRAIT_MALICIOUS ) ) persmodifier -= 0.13f;
//if ( DoesMercHavePersonality( this, CHAR_TRAIT_SHOWOFF ) ) persmodifier -= 0.08f;
if ( DoesMercHavePersonality( this, CHAR_TRAIT_COWARD ) ) persmodifier -= 0.02f;
}
// background modifier
persmodifier += ( this->GetBackgroundValue( BG_EXPLORATION_ASSIGNMENT ) ) / 100.0f;
UINT32 totalvalue = val * persmodifier * gGameExternalOptions.fExplorationPointsModifier / 10;
ReducePointsForFatigue( this, &totalvalue );
return totalvalue;
}
INT32 CheckBleeding( SOLDIERTYPE *pSoldier )
{
INT8 bBandaged; //,savedOurTurn;
+3
View File
@@ -2038,6 +2038,9 @@ public:
void AttemptToCreateTurncoat( UINT16 usID );
BOOLEAN OrderTurnCoatToSwitchSides( UINT16 usID );
void OrderAllTurnCoatToSwitchSides();
// Flugente: exploration assignment
UINT32 GetExplorationPoints();
//////////////////////////////////////////////////////////////////////////////
}; // SOLDIERTYPE;
+6
View File
@@ -140,6 +140,7 @@ backgroundStartElementHandle(void *userData, const XML_Char *name, const XML_Cha
strcmp(name, "hackerskill" ) == 0 ||
strcmp(name, "burial_assignment" ) == 0 ||
strcmp(name, "administration_assignment" ) == 0 ||
strcmp(name, "exploration_assignment" ) == 0 ||
strcmp(name, "druguse") == 0 ||
strcmp(name, "xenophobic") == 0 ||
strcmp(name, "corruptionspread") == 0 ||
@@ -610,6 +611,11 @@ backgroundEndElementHandle(void *userData, const XML_Char *name)
pData->curElement = ELEMENT;
pData->curBackground.value[BG_ADMINISTRATION_ASSIGNMENT] = min( 1000, max( -50, (INT16)atol( pData->szCharData ) ) );
}
else if ( strcmp( name, "exploration_assignment" ) == 0 )
{
pData->curElement = ELEMENT;
pData->curBackground.value[BG_EXPLORATION_ASSIGNMENT] = min( 1000, max( -100, (INT16)atol( pData->szCharData ) ) );
}
else if(strcmp(name, "druguse") == 0)
{
pData->curElement = ELEMENT;
+153 -48
View File
@@ -39,6 +39,7 @@
#include "tile surface.h"
#include "GameSettings.h"
#include <vector>
#include "Action Items.h" // added by Flugente
#endif
#include "connect.h"
@@ -110,6 +111,7 @@ BOOLEAN GetOverheadMouseGridNoForFullSoldiersGridNo( INT32 *psGridNo );
extern BOOLEAN AnyItemsVisibleOnLevel( ITEM_POOL *pItemPool, INT8 bZLevel );
extern void HandleAnyMercInSquadHasCompatibleStuff( UINT8 ubSquad, OBJECTTYPE *pObject, BOOLEAN fReset );
extern UNDERGROUND_SECTORINFO* FindUnderGroundSector( INT16 sMapX, INT16 sMapY, UINT8 bMapZ );
//Isometric utilities (for overhead stuff only)
BOOLEAN GetOverheadMouseGridNo( INT32 *psGridNo );
@@ -1664,66 +1666,169 @@ void RenderOverheadOverlays()
UINT16 blue = Get16BPPColor(FROMRGB(0, 0, 255));
UINT16 green = Get16BPPColor(FROMRGB(0, 255, 0));
UINT16 white = Get16BPPColor(FROMRGB(255, 255, 255));
UINT16 red_dull = Get16BPPColor( FROMRGB( 142, 0, 0 ) );
UINT16 blue_dull = Get16BPPColor( FROMRGB( 0, 0, 248 ) );
UINT16 green_dull = Get16BPPColor( FROMRGB( 0, 127, 0 ) );
// Flugente: exploration assignment
bool explored = false;
if ( gbWorldSectorZ )
{
UNDERGROUND_SECTORINFO *pSector;
pSector = FindUnderGroundSector( gWorldSectorX, gWorldSectorY, gbWorldSectorZ );
if ( pSector && pSector->usExplorationProgress >= 250 )
explored = true;
}
else
{
UINT8 sector = SECTOR( gWorldSectorX, gWorldSectorY );
if ( SectorInfo[sector].usExplorationProgress >= 250 )
explored = true;
}
INT32 radiusingridnos = 5;
FLOAT thickness = 4;
// determine radius
// x-diff is 4 per unit, y-diff 2 per unit
FLOAT xdiffsquared = (FLOAT)( 16 * radiusingridnos * radiusingridnos );
FLOAT radius = sqrt( (FLOAT)( xdiffsquared + 4 * 4 * radiusingridnos * radiusingridnos ) );
FLOAT radius_inner = radius - thickness / 2;
FLOAT radius_outer = radius + thickness / 2;
for( i = 0 ; i < guiNumWorldItems; ++i )
{
pWorldItem = &gWorldItems[ i ];
if( !pWorldItem || !pWorldItem->fExists || pWorldItem->bVisible != VISIBLE && !(gTacticalStatus.uiFlags & SHOW_ALL_ITEMS) )
if( !pWorldItem || !pWorldItem->fExists )
continue;
if(!GetOverheadScreenXYFromGridNo(pWorldItem->sGridNo, &sX, &sY))//dnl ch45 041009
continue;
//adjust for position.
//sX += 2;
sY += 6;
sY -= ( GetOffsetLandHeight( pWorldItem->sGridNo ) /5);
sY += ( gsRenderHeight / 5 );
// Smaller maps
if (gsStartRestrictedX > 0)
// display item
if ( pWorldItem->bVisible == VISIBLE
|| ( gTacticalStatus.uiFlags & SHOW_ALL_ITEMS ) )
{
sX += gsStartRestrictedX;
}
// Full size maps
else
{
sX += iOffsetHorizontal;
if ( !GetOverheadScreenXYFromGridNo( pWorldItem->sGridNo, &sX, &sY ) )//dnl ch45 041009
continue;
//adjust for position.
// Smaller maps
if ( gsStartRestrictedX > 0 )
{
sX += gsStartRestrictedX;
}
// Full size maps
else
{
sX += iOffsetHorizontal;
}
INT16 offsetlandheight = GetOffsetLandHeight( pWorldItem->sGridNo ) / 5;
sY += 6 - offsetlandheight;
sY += ( gsRenderHeight / 5 );
// Smaller maps
if ( gsStartRestrictedY > 0 )
{
sY += gsStartRestrictedY;
}
// Full size maps
else
{
sY += iOffsetVertical;
}
/*sX += iOffsetHorizontal + gsStartRestrictedX;
sY += iOffsetVertical + gsStartRestrictedY;*/
if ( gfOverItemPool && gsOveritemPoolGridNo == pWorldItem->sGridNo )
{
usLineColor = red;
}
else if ( gfRadarCurrentGuyFlash )
{
usLineColor = black;
}
else switch ( pWorldItem->bVisible )
{
case HIDDEN_ITEM: usLineColor = blue; break;
case BURIED: usLineColor = red; break;
case HIDDEN_IN_OBJECT: usLineColor = blue; break;
case INVISIBLE: usLineColor = green; break;
case VISIBLE: usLineColor = white; break;
}
PixelDraw( FALSE, sX, sY, usLineColor, pDestBuf );
}
// Smaller maps
if (gsStartRestrictedY > 0)
// Flugente: exploration
// draw a circle around items the player does not yet know of if the player has been fully explored
// exclude most action items, except for explosive ones
if ( explored
&& pWorldItem->bVisible != VISIBLE
&& ( pWorldItem->object.usItem != ACTION_ITEM || pWorldItem->object[0]->data.misc.bActionValue == ACTION_ITEM_BLOW_UP ) )
{
sY += gsStartRestrictedY;
}
// Full size maps
else
{
sY += iOffsetVertical;
}
// in order not go give away the precise location of the item, have the center of the circles vary, but with the item being inside
// we can't use random numbers as the circles shouldn't move upon repeated calls, so use modulo magic
INT16 totalvariationsquared = ( 4 + pWorldItem->sGridNo * 37 ) % radiusingridnos*radiusingridnos;
INT16 variation_x = sqrt(( ( pWorldItem->sGridNo * 13 ) % 100 ) * totalvariationsquared / 100);
INT16 variation_y = sqrt( totalvariationsquared - variation_x * variation_x );
/*sX += iOffsetHorizontal + gsStartRestrictedX;
sY += iOffsetVertical + gsStartRestrictedY;*/
if ( gfOverItemPool && gsOveritemPoolGridNo == pWorldItem->sGridNo )
{
usLineColor = red;
}
else if (gfRadarCurrentGuyFlash)
{
usLineColor = black;
}
else switch (pWorldItem->bVisible)
{
case HIDDEN_ITEM: usLineColor = blue; break;
case BURIED: usLineColor = red; break;
case HIDDEN_IN_OBJECT: usLineColor = blue; break;
case INVISIBLE: usLineColor = green; break;
case VISIBLE: usLineColor = white; break;
}
if ( pWorldItem->sGridNo % 8 < 4 ) variation_x *= -1;
if ( (2 + pWorldItem->sGridNo) % 8 < 4 ) variation_y *= -1;
PixelDraw( FALSE, sX, sY, usLineColor, pDestBuf );
INT32 centergridno = pWorldItem->sGridNo + variation_y * WORLD_COLS + variation_x;
INT16 sX_Center, sY_Center;
if ( GetOverheadScreenXYFromGridNo( centergridno, &sX_Center, &sY_Center ) )
{
//adjust for position.
// Smaller maps
if ( gsStartRestrictedX > 0 )
sX_Center += gsStartRestrictedX;
// Full size maps
else
sX_Center += iOffsetHorizontal;
sY_Center += 6 - GetOffsetLandHeight( pWorldItem->sGridNo ) / 5;
sY_Center += ( gsRenderHeight / 5 );
// Smaller maps
if ( gsStartRestrictedY > 0 )
sY_Center += gsStartRestrictedY;
// Full size maps
else
sY_Center += iOffsetVertical;
// determine area of where the circle will be drawn in, take into account what part of the sector we actually see
INT32 xr = sX_Center + radius;
INT32 yr = sY_Center + radius;
for ( INT32 x = sX_Center - radius; x <= xr; ++x )
{
FLOAT xdiffsquared = (FLOAT)( ( sX_Center - x ) * ( sX_Center - x ) );
for ( INT32 y = sY_Center - radius; y <= yr; ++y )
{
FLOAT diff = sqrt( (FLOAT)( xdiffsquared + 4 * ( sY_Center - y ) * ( sY_Center - y ) ) );
if ( radius_inner <= diff && diff <= radius_outer )
{
// we alter the colour of existing pixels instead of fully replacing the colour. As a result, one can still see the map regions we draw over, which looks a lot better
switch ( pWorldItem->bVisible )
{
case HIDDEN_ITEM: PixelAlterColour( FALSE, x, y, blue_dull, pDestBuf ); break;
case BURIED: PixelAlterColour( FALSE, x, y, red_dull, pDestBuf ); break;
case HIDDEN_IN_OBJECT: PixelAlterColour( FALSE, x, y, blue_dull, pDestBuf ); break;
case INVISIBLE: PixelAlterColour( FALSE, x, y, green_dull, pDestBuf ); break;
case VISIBLE: PixelAlterColour( FALSE, x, y, white, pDestBuf ); break;
}
}
}
}
}
}
InvalidateRegion( sX, sY, (INT16)( sX + 1 ), (INT16)( sY + 1 ) );
}
+2
View File
@@ -610,6 +610,8 @@ enum
STR_ASSIGNMENT_NOTPOSSIBLE,
STR_ASSIGNMENT_NOMILITIAPRESENT,
STR_ASSIGNMENT_EXPLORATION_DONE,
TEXT_NUM_STR_MESSAGE,
};
+7
View File
@@ -2364,6 +2364,8 @@ CHAR16 Message[][STRING_LENGTH] =
L"此时无法分配任务", //L"Assignment not possible at the moment",
L"没有能够训练的民兵。", //L"No militia that can be drilled present.",
L"%s has fully explored %s.", // TODO.Translate
};
// the country and its noun in the game
@@ -2477,6 +2479,7 @@ STR16 pAssignmentStrings[] =
L"训练民兵", //L"DMilitia",
L"掩埋尸体", //L"Burial",
L"管理", //L"Admin",
L"Explore", // TODO.Translate
};
@@ -2586,6 +2589,7 @@ STR16 pPersonnelAssignmentStrings[] =
L"训练现有的民兵", //L"Drill existing militia",
L"掩埋尸体", //L"Bury corpses",
L"管理人员", //L"Administration",
L"Exploration", // TODO.Translate
};
@@ -2654,6 +2658,7 @@ STR16 pLongAssignmentStrings[] =
L"训练现有的民兵", //L"Drill existing militia",
L"掩埋尸体", //L"Bury corpses",
L"管理人员", //L"Administration",
L"Exploration", // TODO.Translate
};
@@ -2778,6 +2783,7 @@ STR16 pAssignMenuStrings[] =
L"筑防", //L"Fortify", fortify sector
L"情报", //L"Intel", covert assignments
L"管理", //L"Administer",
L"Explore", // TODO.Translate
L"设施", // the merc is using/staffing a facility //ham3.6
L"取消",
};
@@ -9106,6 +9112,7 @@ STR16 szBackgroundText_Value[]=
L" 间谍技能: %s%d ",//L" hacking skill: %s%d ",
L" %s%d%% 掩埋尸体速度 \n", //L" %s%d%% burial speed\n",
L" %s%d%% 管理效率 \n", //L" %s%d%% administration effectiveness\n",
L" %s%d%% exploration effectiveness\n", // TODO.Translate
};
STR16 szBackgroundTitleText[] =
+7
View File
@@ -2363,6 +2363,8 @@ CHAR16 Message[][STRING_LENGTH] =
L"Assignment not possible at the moment", // TODO.Translate
L"No militia that can be drilled present.",
L"%s has fully explored %s.", // TODO.Translate
};
// the country and its noun in the game
@@ -2476,6 +2478,7 @@ STR16 pAssignmentStrings[] =
L"DMilitia",
L"Burial",
L"Admin", // TODO.Translate
L"Explore", // TODO.Translate
};
@@ -2585,6 +2588,7 @@ STR16 pPersonnelAssignmentStrings[] =
L"Drill existing militia",
L"Bury corpses",
L"Administration", // TODO.Translate
L"Exploration", // TODO.Translate
};
@@ -2653,6 +2657,7 @@ STR16 pLongAssignmentStrings[] =
L"Drill existing militia",
L"Bury corpses",
L"Administration", // TODO.Translate
L"Exploration", // TODO.Translate
};
@@ -2777,6 +2782,7 @@ STR16 pAssignMenuStrings[] =
L"Fortify", // fortify sector // TODO.Translate
L"Intel", // covert assignments // TODO.Translate
L"Administer", // TODO.Translate
L"Explore", // TODO.Translate
L"Facility", // the merc is using/staffing a facility // TODO.Translate
L"Stop", // cancel this menu
};
@@ -9125,6 +9131,7 @@ STR16 szBackgroundText_Value[]=
L" hacking skill: %s%d ", // TODO.Translate
L" %s%d%% burial speed\n", // TODO.Translate
L" %s%d%% administration effectiveness\n", // TODO.Translate
L" %s%d%% exploration effectiveness\n", // TODO.Translate
};
STR16 szBackgroundTitleText[] = // TODO.Translate
+7
View File
@@ -2364,6 +2364,8 @@ CHAR16 Message[][STRING_LENGTH] =
L"Assignment not possible at the moment",
L"No militia that can be drilled present.",
L"%s has fully explored %s.",
};
// the country and its noun in the game
@@ -2477,6 +2479,7 @@ STR16 pAssignmentStrings[] =
L"DMilitia",
L"Burial",
L"Admin",
L"Explore",
};
@@ -2586,6 +2589,7 @@ STR16 pPersonnelAssignmentStrings[] =
L"Drill existing militia",
L"Bury corpses",
L"Administration",
L"Exploration",
};
@@ -2654,6 +2658,7 @@ STR16 pLongAssignmentStrings[] =
L"Drill existing militia",
L"Bury corpses",
L"Administration",
L"Exploration",
};
@@ -2778,6 +2783,7 @@ STR16 pAssignMenuStrings[] =
L"Fortify", // fortify sector
L"Intel", // covert assignments
L"Administer",
L"Explore",
L"Facility", // the merc is using/staffing a facility
L"Cancel", // cancel this menu
};
@@ -9120,6 +9126,7 @@ STR16 szBackgroundText_Value[]=
L" hacking skill: %s%d ",
L" %s%d%% burial speed\n",
L" %s%d%% administration effectiveness\n",
L" %s%d%% exploration effectiveness\n",
};
STR16 szBackgroundTitleText[] =
+7
View File
@@ -2372,6 +2372,8 @@ CHAR16 Message[][STRING_LENGTH] =
L"Assignment not possible at the moment", // TODO.Translate
L"No militia that can be drilled present.",
L"%s has fully explored %s.", // TODO.Translate
};
// the country and its noun in the game // TODO.Translate
@@ -2485,6 +2487,7 @@ STR16 pAssignmentStrings[] =
L"DMilitia",
L"Burial",
L"Admin", // TODO.Translate
L"Explore", // TODO.Translate
};
@@ -2594,6 +2597,7 @@ STR16 pPersonnelAssignmentStrings[] =
L"Drill existing militia",
L"Bury corpses",
L"Administration", // TODO.Translate
L"Exploration", // TODO.Translate
};
@@ -2662,6 +2666,7 @@ STR16 pLongAssignmentStrings[] =
L"Drill existing militia",
L"Bury corpses",
L"Administration", // TODO.Translate
L"Exploration", // TODO.Translate
};
@@ -2786,6 +2791,7 @@ STR16 pAssignMenuStrings[] =
L"Fortify", // fortify sector // TODO.Translate
L"Intel", // covert assignments // TODO.Translate
L"Administer", // TODO.Translate
L"Explore", // TODO.Translate
L"Affectat.", // the merc is using/staffing a facility
L"Annuler", // cancel this menu
};
@@ -9107,6 +9113,7 @@ STR16 szBackgroundText_Value[]=
L" hacking skill: %s%d ", // TODO.Translate
L" %s%d%% burial speed\n", // TODO.Translate
L" %s%d%% administration effectiveness\n", // TODO.Translate
L" %s%d%% exploration effectiveness\n", // TODO.Translate
};
STR16 szBackgroundTitleText[] =
+7
View File
@@ -2380,6 +2380,8 @@ CHAR16 Message[][STRING_LENGTH] =
L"Assignment not possible at the moment", // TODO.Translate
L"No militia that can be drilled present.",
L"%s hat %s vollständig erkundet.",
};
// the country and its noun in the game
@@ -2490,6 +2492,7 @@ STR16 pAssignmentStrings[] =
L"DMilitia",
L"Burial",
L"Admin", // TODO.Translate
L"Explore", // TODO.Translate
};
STR16 pMilitiaString[] =
@@ -2595,6 +2598,7 @@ STR16 pPersonnelAssignmentStrings[] =
L"Drill existing militia",
L"Bury corpses",
L"Administration", // TODO.Translate
L"Exploration", // TODO.Translate
};
// refer to above for comments
@@ -2661,6 +2665,7 @@ STR16 pLongAssignmentStrings[] =
L"Drill existing militia",
L"Bury corpses",
L"Administration", // TODO.Translate
L"Exploration", // TODO.Translate
};
// the contract options
@@ -2781,6 +2786,7 @@ STR16 pAssignMenuStrings[] =
L"Fortify", // fortify sector // TODO.Translate
L"Intel", // covert assignments // TODO.Translate
L"Administer", // TODO.Translate
L"Explore", // TODO.Translate
L"Betrieb", // the merc is using/staffing a facility
L"Abbrechen", // cancel this menu
};
@@ -8937,6 +8943,7 @@ STR16 szBackgroundText_Value[]=
L" hacking skill: %s%d ", // TODO.Translate
L" %s%d%% burial speed\n", // TODO.Translate
L" %s%d%% administration effectiveness\n", // TODO.Translate
L" %s%d%% exploration effectiveness\n", // TODO.Translate
};
STR16 szBackgroundTitleText[] = // TODO.Translate
+7
View File
@@ -2358,6 +2358,8 @@ CHAR16 Message[][STRING_LENGTH] =
L"Assignment not possible at the moment", // TODO.Translate
L"No militia that can be drilled present.",
L"%s has fully explored %s.", // TODO.Translate
};
// the country and its noun in the game
@@ -2471,6 +2473,7 @@ STR16 pAssignmentStrings[] =
L"DMilitia",
L"Burial",
L"Admin", // TODO.Translate
L"Explore", // TODO.Translate
};
@@ -2580,6 +2583,7 @@ STR16 pPersonnelAssignmentStrings[] =
L"Drill existing militia",
L"Bury corpses",
L"Administration", // TODO.Translate
L"Exploration", // TODO.Translate
};
@@ -2648,6 +2652,7 @@ STR16 pLongAssignmentStrings[] =
L"Drill existing militia",
L"Bury corpses",
L"Administration", // TODO.Translate
L"Exploration", // TODO.Translate
};
@@ -2772,6 +2777,7 @@ STR16 pAssignMenuStrings[] =
L"Fortify", // fortify sector // TODO.Translate
L"Intel", // covert assignments // TODO.Translate
L"Administer", // TODO.Translate
L"Explore", // TODO.Translate
L"Facility", // the merc is using/staffing a facility // TODO.Translate
L"Annulla", // cancel this menu
};
@@ -9116,6 +9122,7 @@ STR16 szBackgroundText_Value[]=
L" hacking skill: %s%d ", // TODO.Translate
L" %s%d%% burial speed\n", // TODO.Translate
L" %s%d%% administration effectiveness\n", // TODO.Translate
L" %s%d%% exploration effectiveness\n", // TODO.Translate
};
STR16 szBackgroundTitleText[] = // TODO.Translate
+7
View File
@@ -2370,6 +2370,8 @@ CHAR16 Message[][STRING_LENGTH] =
L"Assignment not possible at the moment", // TODO.Translate
L"No militia that can be drilled present.",
L"%s has fully explored %s.", // TODO.Translate
};
// the country and its noun in the game
@@ -2483,6 +2485,7 @@ STR16 pAssignmentStrings[] =
L"DMilitia",
L"Burial",
L"Admin", // TODO.Translate
L"Explore", // TODO.Translate
};
@@ -2592,6 +2595,7 @@ STR16 pPersonnelAssignmentStrings[] =
L"Drill existing militia",
L"Bury corpses",
L"Administration", // TODO.Translate
L"Exploration", // TODO.Translate
};
@@ -2660,6 +2664,7 @@ STR16 pLongAssignmentStrings[] =
L"Drill existing militia",
L"Bury corpses",
L"Administration", // TODO.Translate
L"Exploration", // TODO.Translate
};
@@ -2784,6 +2789,7 @@ STR16 pAssignMenuStrings[] =
L"Fortify", // fortify sector // TODO.Translate
L"Intel", // covert assignments // TODO.Translate
L"Administer", // TODO.Translate
L"Explore", // TODO.Translate
L"Facility", // the merc is using/staffing a facility // TODO.Translate
L"Anuluj", // cancel this menu
};
@@ -9129,6 +9135,7 @@ STR16 szBackgroundText_Value[]=
L" hacking skill: %s%d ", // TODO.Translate
L" %s%d%% burial speed\n", // TODO.Translate
L" %s%d%% administration effectiveness\n", // TODO.Translate
L" %s%d%% exploration effectiveness\n", // TODO.Translate
};
STR16 szBackgroundTitleText[] = // TODO.Translate
+7
View File
@@ -2364,6 +2364,8 @@ CHAR16 Message[][STRING_LENGTH] =
L"Assignment not possible at the moment", // TODO.Translate
L"No militia that can be drilled present.",
L"%s has fully explored %s.", // TODO.Translate
};
// the country and its noun in the game
@@ -2477,6 +2479,7 @@ STR16 pAssignmentStrings[] =
L"DMilitia",
L"Burial",
L"Admin", // TODO.Translate
L"Explore", // TODO.Translate
};
@@ -2586,6 +2589,7 @@ STR16 pPersonnelAssignmentStrings[] =
L"Drill existing militia",
L"Bury corpses",
L"Administration", // TODO.Translate
L"Exploration", // TODO.Translate
};
@@ -2654,6 +2658,7 @@ STR16 pLongAssignmentStrings[] =
L"Drill existing militia",
L"Bury corpses",
L"Administration", // TODO.Translate
L"Exploration", // TODO.Translate
};
@@ -2778,6 +2783,7 @@ STR16 pAssignMenuStrings[] =
L"Укреплять", // fortify sector
L"Intel", // covert assignments // TODO.Translate
L"Administer", // TODO.Translate
L"Explore", // TODO.Translate
L"Занятия", // the merc is using/staffing a facility
L"Отмена", // cancel this menu
};
@@ -9106,6 +9112,7 @@ STR16 szBackgroundText_Value[]=
L" Взлом: %s%d ",
L" %s%d%% burial speed\n", // TODO.Translate
L" %s%d%% administration effectiveness\n", // TODO.Translate
L" %s%d%% exploration effectiveness\n", // TODO.Translate
};
STR16 szBackgroundTitleText[] =