New feature: factories allows facilities to create items

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

Requires GameDir >= r2534

git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@8804 3b4a5df2-a311-0410-b5c6-a8a6f20db521
This commit is contained in:
Flugente
2020-05-17 20:52:27 +00:00
parent 4dc40912e4
commit ea1892c788
31 changed files with 1446 additions and 12 deletions
+3
View File
@@ -1864,6 +1864,9 @@ void LoadGameExternalOptions()
// HEADROCK HAM 3.6: Controls how important the character's stats are, in insuring he/she gets better results (or smaller damage) from using facilities. The higher this is, the more dangerous all facilities are.
gGameExternalOptions.ubFacilityDangerRate = iniReader.ReadInteger("Strategic Gameplay Settings","FACILITY_DANGER_RATE", 50, 0, 100);
// Flugente: factories
gGameExternalOptions.fFactories = iniReader.ReadBoolean("Strategic Gameplay Settings", "FACTORIES", FALSE );
// 2Points: Use new repair algorithm (Items are priorized based on type and damage to item, starting from equipped weapons, going to armor, then inventory)
gGameExternalOptions.fAdditionalRepairMode = iniReader.ReadBoolean("Strategic Gameplay Settings", "ADDITIONAL_REPAIR_MODE", FALSE);
+3
View File
@@ -1507,6 +1507,9 @@ typedef struct
// Flugente: externalised squad names
BOOLEAN fUseXMLSquadNames;
// Flugente: factories
BOOLEAN fFactories;
//dnl ch68 090913 Reinforcements Setttings
UINT16 sMinDelayEnemyReinforcements;
UINT16 sRndDelayEnemyReinforcements;
+2 -2
View File
@@ -55,8 +55,8 @@
#endif
CHAR8 czVersionNumber[16] = { "Build 20.04.27" }; //YY.MM.DD
CHAR8 czVersionNumber[16] = { "Build 20.05.17" }; //YY.MM.DD
CHAR16 zTrackingNumber[16] = { L"Z" };
CHAR16 zRevisionNumber[16] = { L"Revision 8794" };
CHAR16 zRevisionNumber[16] = { L"Revision 8804" };
// SAVE_GAME_VERSION is defined in header, change it there
+576
View File
@@ -0,0 +1,576 @@
/**
* @file
* @author Flugente (bears-pit.com)
*/
#ifdef PRECOMPILEDHEADERS
#include "Laptop All.h"
#else
#include "laptop.h"
#include "insurance.h"
#include "WCheck.h"
#include "Utilities.h"
#include "WordWrap.h"
#include "Line.h"
#include "Text.h"
#include "FacilityProduction.h"
#include "Map Screen Interface.h"
#include "Quests.h"
#include "finances.h"
#include "Strategic Town Loyalty.h"
#include "strategic.h"
#include "BaseTable.h"
#endif
/*#define MERCOMP_FONT_COLOR 2
#define CAMPHIS_FONT_BIG FONT14ARIAL
#define CAMPHIS_FONT_MED FONT12ARIAL
#define CAMPHIS_FONT_SMALL FONT10ARIAL*/
#define MERCOMP_FONT_SHADOW FONT_MCOLOR_WHITE
/*#define CAMPAIGN_HISTORY_LINK_START_X LAPTOP_SCREEN_UL_X
#define CAMPAIGN_HISTORY_LINK_START_Y LAPTOP_SCREEN_WEB_UL_Y + 5
#define CAMPAIGN_HISTORY_LINK_TEXT_WIDTH 107
#define CAMPAIGN_HISTORY_LINK_STEP_Y 14
#define BACKGROUND_WIDTH 125
#define CAMPAIGN_HISTORY_BACKGROUND_HEIGHT 100
#define CAMPAIGN_HISTORY_BIG_TITLE_X 115 + LAPTOP_SCREEN_UL_X
#define CAMPAIGN_HISTORY_BIG_TITLE_Y 10 + LAPTOP_SCREEN_WEB_UL_Y*/
#define NUM_LINKS 0
#define MCA_START_CONTENT_Y (LAPTOP_SCREEN_WEB_UL_Y + NUM_LINKS * 17)
//extern UINT32 guiInsuranceBackGround;
//extern UINT32 guiInsuranceBigRedLineImage;
//extern UINT32 guiMercCompareBulletImage;
//extern UINT32 guiMercCompareLogoImage;
//link to the various pages
//MOUSE_REGION gLinkRegion_Production[NUM_LINKS];
UINT32 gCHECKBOXLib = 0;
/*void SelectLinkRegionCallBack_Production( MOUSE_REGION * pRegion, INT32 iReason )
{
if ( iReason & MSYS_CALLBACK_REASON_INIT )
{
}
else if ( iReason & MSYS_CALLBACK_REASON_LBUTTON_UP )
{
UINT32 uiLink = MSYS_GetRegionUserData( pRegion, 0 );
if ( uiLink == 0 )
guiCurrentLaptopMode = LAPTOP_MODE_PMC_MAIN;
else if ( uiLink == 1 )
guiCurrentLaptopMode = LAPTOP_MODE_PMC_CONTRACT_MILITIA;
else if ( uiLink == 2 )
guiCurrentLaptopMode = LAPTOP_MODE_BROKEN_LINK;
}
else if ( iReason & MSYS_CALLBACK_REASON_RBUTTON_UP )
{
}
}*/
void InitDefaults_Production()
{
VOBJECT_DESC VObjectDesc;
/*// load the Insurance bullet graphic and add it
VObjectDesc.fCreateFlags = VOBJECT_CREATE_FROMFILE;
FilenameForBPP( "LAPTOP\\bullet.sti", VObjectDesc.ImageFile );
CHECKV( AddVideoObject( &VObjectDesc, &guiMercCompareBulletImage ) );*/
/*// load the Flower Account Box graphic and add it
VObjectDesc.fCreateFlags = VOBJECT_CREATE_FROMFILE;
FilenameForBPP( "LAPTOP\\BackGroundTile.sti", VObjectDesc.ImageFile );
CHECKV( AddVideoObject( &VObjectDesc, &guiInsuranceBackGround ) );*/
/*// load the red bar on the side of the page and add it
VObjectDesc.fCreateFlags = VOBJECT_CREATE_FROMFILE;
FilenameForBPP( "LAPTOP\\LargeBar.sti", VObjectDesc.ImageFile );
CHECKV( AddVideoObject( &VObjectDesc, &guiInsuranceBigRedLineImage ) );*/
/*VObjectDesc.fCreateFlags = VOBJECT_CREATE_FROMFILE;
FilenameForBPP( "LAPTOP\\PressLogos.sti", VObjectDesc.ImageFile );
CHECKV( AddVideoObject( &VObjectDesc, &guiMercCompareLogoImage ) );*/
VObjectDesc.fCreateFlags = VOBJECT_CREATE_FROMFILE;
FilenameForBPP( "Interface\\OptionsCheckBoxes.sti", VObjectDesc.ImageFile );
CHECKV( AddVideoObject( &VObjectDesc, &gCHECKBOXLib ) );
/*UINT16 usPosX = CAMPAIGN_HISTORY_LINK_START_X;
UINT16 usPosY = CAMPAIGN_HISTORY_LINK_START_Y;
for ( int i = 0; i<NUM_LINKS; ++i )
{
MSYS_DefineRegion( &gLinkRegion_Production[i], usPosX, usPosY, (UINT16)( usPosX + CAMPAIGN_HISTORY_LINK_TEXT_WIDTH ), usPosY + CAMPAIGN_HISTORY_LINK_STEP_Y, MSYS_PRIORITY_HIGH,
CURSOR_WWW, MSYS_NO_CALLBACK, SelectLinkRegionCallBack_Production );
MSYS_AddRegion( &gLinkRegion_Production[i] );
MSYS_SetRegionUserData( &gLinkRegion_Production[i], 0, i );
usPosY += CAMPAIGN_HISTORY_LINK_STEP_Y;
}*/
}
void DisplayDefaults_Production()
{
SetFontShadow( MERCOMP_FONT_SHADOW );
// we don't have any links atm, so end here
/*WebPageTileBackground( 4, 4, BACKGROUND_WIDTH, CAMPAIGN_HISTORY_BACKGROUND_HEIGHT, guiInsuranceBackGround );
CHAR16 sText[800];
UINT16 usPosX = CAMPAIGN_HISTORY_LINK_START_X;
UINT16 usPosY = CAMPAIGN_HISTORY_LINK_START_Y;
//Display the title slogan
swprintf( sText, L"bla" );
DrawTextToScreen( sText, CAMPAIGN_HISTORY_BIG_TITLE_X, CAMPAIGN_HISTORY_BIG_TITLE_Y, LAPTOP_SCREEN_LR_X - LAPTOP_SCREEN_UL_X, CAMPHIS_FONT_BIG, MERCOMP_FONT_COLOR, FONT_MCOLOR_BLACK, FALSE, 0 );
usPosX = CAMPAIGN_HISTORY_LINK_START_X;
usPosY = CAMPAIGN_HISTORY_LINK_START_Y;
for ( int i = 0; i<NUM_LINKS; ++i )
{
swprintf( sText, L"TODO link" );
DisplayWrappedString( usPosX, usPosY, CAMPAIGN_HISTORY_LINK_TEXT_WIDTH, 2, CAMPHIS_FONT_MED, MERCOMP_FONT_COLOR, sText, FONT_MCOLOR_BLACK, FALSE, 0 );
usPosY += CAMPAIGN_HISTORY_LINK_STEP_Y;
//Display the red bar under the link at the bottom. and the text
DisplaySmallColouredLineWithShadow( usPosX, usPosY - 2, LAPTOP_SCREEN_UL_X + CAMPAIGN_HISTORY_LINK_TEXT_WIDTH, usPosY - 2, FROMRGB( 240, 240, 20 ) );
}
// closing line that separates header from individual page
DisplaySmallColouredLineWithShadow( usPosX, usPosY - 2, LAPTOP_SCREEN_LR_X, usPosY - 2, FROMRGB( 240, 240, 20 ) );
usPosX = LAPTOP_SCREEN_LR_X - 110;
usPosY = CAMPAIGN_HISTORY_LINK_START_Y;
HVOBJECT hPixHandle;
GetVideoObject( &hPixHandle, guiMercCompareLogoImage );
BltVideoObject( FRAME_BUFFER, hPixHandle, 3, usPosX, usPosY, VO_BLT_SRCTRANSPARENCY, NULL );
SetFontShadow( DEFAULT_SHADOW );*/
}
void RemoveDefaults_Production()
{
//DeleteVideoObjectFromIndex( guiInsuranceBackGround );
//DeleteVideoObjectFromIndex( guiInsuranceBigRedLineImage );
//DeleteVideoObjectFromIndex( guiMercCompareBulletImage );
//DeleteVideoObjectFromIndex( guiMercCompareLogoImage );
DeleteVideoObjectFromIndex( gCHECKBOXLib );
//for ( int i = 0; i<NUM_LINKS; ++i )
//MSYS_RemoveRegion( &gLinkRegion_Production[i] );
}
////////////////////////// MAIN PAGE ////////////////////////////////
struct PRODUCTIONLINE_DATA
{
UINT16 sector;
int facilitytype;
int productionline;
PRODUCTION_LINE xmldata;
bool active;
bool old_state;
bool can_turnon;
};
std::vector<PRODUCTIONLINE_DATA> gProductionVector;
extern INT32 GetFactoryLeftoverProgress( INT16 sSectorX, INT16 sSectorY, INT8 bSectorZ, UINT16 usFacilityType, UINT16 usProductionNumber );
extern void SetFacilityProductionState( INT16 sSectorX, INT16 sSectorY, INT8 bSectorZ, UINT16 usFacilityType, UINT16 usProductionNumber, BOOLEAN aOn );
void FilterProductionData()
{
gProductionVector.clear();
for ( UINT16 sector = 0; sector < 256; ++sector )
{
if ( !StrategicMap[SECTOR_INFO_TO_STRATEGIC_INDEX( sector )].fEnemyControlled )
{
UINT8 ubTownID = GetTownIdForSector( SECTORX( sector ), SECTORY( sector ) );
for ( UINT16 cnt = 0; cnt < NUM_FACILITY_TYPES; ++cnt )
{
// Is this facility here?
if ( gFacilityLocations[sector][cnt].fFacilityHere )
{
UINT16 productioncnt = 0;
for ( std::vector<PRODUCTION_LINE>::iterator prodit = gFacilityTypes[cnt].ProductionData.begin(), proditend = gFacilityTypes[cnt].ProductionData.end(); prodit != proditend;
++prodit, ++productioncnt )
{
PRODUCTIONLINE_DATA data;
data.sector = sector;
data.facilitytype = cnt;
data.productionline = productioncnt;
data.xmldata = ( *prodit );
INT32 progress = GetFactoryLeftoverProgress( SECTORX( sector ), SECTORY( sector ), 0, cnt, productioncnt );
// despite what is set, several other things can turn a factory off, like loyalty or lua-defined quest checks
if ( progress < -10
|| (ubTownID != BLANK_SECTOR
&& gTownLoyalty[ubTownID].ubRating < prodit->usOptional_LoyaltyRequired ) )
{
data.active = false;
data.can_turnon = false;
}
else
{
data.active = ( progress > -1 );
data.can_turnon = true;
}
data.old_state = data.active;
gProductionVector.push_back( data );
}
}
}
}
}
}
void WriteAlteredProductionData()
{
for ( std::vector<PRODUCTIONLINE_DATA>::iterator it = gProductionVector.begin(), itend = gProductionVector.end(); it != itend; ++it )
{
if ( (*it).active != ( *it ).old_state )
{
SetFacilityProductionState( SECTORX( ( *it ).sector ), SECTORY( ( *it ).sector ), 0, ( *it ).facilitytype, ( *it ).productionline, ( *it ).active );
}
}
}
BOOLEAN gfFacilityProductionRedraw = FALSE;
BOOLEAN EnterFacilityProduction()
{
InitDefaults_Production();
FilterProductionData();
gTestPanel3.Create( LAPTOP_SCREEN_UL_X, MCA_START_CONTENT_Y, LAPTOP_SCREEN_LR_X, LAPTOP_SCREEN_WEB_LR_Y );
gTestPanel3.SetColorLine( Get16BPPColor( FROMRGB( 128, 128, 128 ) ) );
gTestPanel3.SetColorLineShadow( Get16BPPColor( FROMRGB( 255, 255, 255 ) ) );
gTestPanel3.SetColorMarked( Get16BPPColor( FROMRGB( 230, 230, 230 ) ) );
TestTableTemplate<4>::getInstance().Create( LAPTOP_SCREEN_UL_X + 4, MCA_START_CONTENT_Y + 4, LAPTOP_SCREEN_LR_X - 4, LAPTOP_SCREEN_WEB_LR_Y - 4 );
TestTableTemplate<4>::getInstance().SetColorSeparator( Get16BPPColor( FROMRGB( 30, 30, 30 ) ) );
gTestPanel3.RegisterMemberThingy( &TestTableTemplate<4>::getInstance() );
TestTableTemplate<4>::getInstance().SetMouseRegionActive( TRUE );
RenderFacilityProduction();
return( TRUE );
}
void ExitFacilityProduction()
{
gTestPanel3.Destroy();
WriteAlteredProductionData();
RemoveDefaults_Production();
}
void HandleFacilityProduction()
{
if ( gfFacilityProductionRedraw )
{
TestTableTemplate<4>::getInstance().Create( TestTableTemplate<4>::getInstance().GetX(), TestTableTemplate<4>::getInstance().GetY(),
TestTableTemplate<4>::getInstance().GetX() + TestTableTemplate<4>::getInstance().GetWidth(),
TestTableTemplate<4>::getInstance().GetY() + TestTableTemplate<4>::getInstance().GetHeight() );
RenderFacilityProduction();
gfFacilityProductionRedraw = FALSE;
}
}
void RenderFacilityProduction()
{
DisplayDefaults_Production();
SetFontShadow( MERCOMP_FONT_SHADOW );
gTestPanel3.Display();
SetFontShadow( DEFAULT_SHADOW );
MarkButtonsDirty();
RenderWWWProgramTitleBar();
InvalidateRegion( LAPTOP_SCREEN_UL_X, LAPTOP_SCREEN_WEB_UL_Y, LAPTOP_SCREEN_LR_X, LAPTOP_SCREEN_WEB_LR_Y );
}
static CHAR16 gProductionHelpText[100];
STR16 Sectornamegetter_Production( UINT32 aNum )
{
swprintf( gProductionHelpText, L"NAME NOT FOUND" );
if ( aNum < gProductionVector.size() )
{
GetShortSectorString( SECTORX( gProductionVector[aNum].sector ), SECTORY( gProductionVector[aNum].sector ), gProductionHelpText );
}
return gProductionHelpText;
}
STR16 Product_Production( UINT32 aNum )
{
swprintf( gProductionHelpText, L"NOTHING" );
if ( aNum < gProductionVector.size() )
{
if ( wcslen( gProductionVector[aNum].xmldata.szProductionName ) > 0 )
swprintf( gProductionHelpText, L"%s", gProductionVector[aNum].xmldata.szProductionName );
else if ( gProductionVector[aNum].xmldata.usItemToCreate != NOTHING )
swprintf( gProductionHelpText, L"%s", Item[gProductionVector[aNum].xmldata.usItemToCreate].szItemName );
}
return gProductionHelpText;
}
STR16 PreProduct_Production( UINT32 aNum )
{
swprintf( gProductionHelpText, L"--" );
if ( aNum < gProductionVector.size() )
{
bool first = true;
for ( std::vector<PRODUCTION_LINE_PREPRODUCT>::iterator it = gProductionVector[aNum].xmldata.usOptional_PreProducts.begin(), itend = gProductionVector[aNum].xmldata.usOptional_PreProducts.end(); it != itend; ++it )
{
if ( it->requiredforonecreation > 1 )
{
if ( first )
{
swprintf( gProductionHelpText, L"%s (%d)", Item[it->item].szItemName, it->requiredforonecreation );
first = false;
}
else
{
swprintf( gProductionHelpText, L"%s, %s (%d)", gProductionHelpText, Item[it->item].szItemName, it->requiredforonecreation );
}
}
else
{
if ( first )
{
swprintf( gProductionHelpText, L"%s", Item[it->item].szItemName );
first = false;
}
else
{
swprintf( gProductionHelpText, L"%s, %s", gProductionHelpText, Item[it->item].szItemName );
}
}
}
}
return gProductionHelpText;
}
UINT8 ColourGetter_Production( UINT32 aNum )
{
if ( aNum < gProductionVector.size() )
{
UINT8 ubTownID = GetTownIdForSector( SECTORX( gProductionVector[aNum].sector ), SECTORY( gProductionVector[aNum].sector ) );
if ( ubTownID != BLANK_SECTOR
&& gTownLoyalty[ubTownID].ubRating < gProductionVector[aNum].xmldata.usOptional_LoyaltyRequired )
{
return 164;
}
}
return 2;
}
STR16 Loyalty_Production( UINT32 aNum )
{
swprintf( gProductionHelpText, L"--" );
if ( aNum < gProductionVector.size() && gProductionVector[aNum].xmldata.usOptional_LoyaltyRequired > 0 )
{
swprintf( gProductionHelpText, L"%d+", gProductionVector[aNum].xmldata.usOptional_LoyaltyRequired );
}
return gProductionHelpText;
}
STR16 Costgetter_Production( UINT32 aNum )
{
swprintf( gProductionHelpText, L"--" );
if ( aNum < gProductionVector.size() && gProductionVector[aNum].xmldata.sHourlyCost )
{
swprintf( gProductionHelpText, L"%d$", gProductionVector[aNum].xmldata.sHourlyCost );
}
return gProductionHelpText;
}
STR16 Minutesgetter_Production( UINT32 aNum )
{
swprintf( gProductionHelpText, L"--:--" );
if ( aNum < gProductionVector.size() )
{
swprintf( gProductionHelpText, L"%02d:%02d", gProductionVector[aNum].xmldata.sMinutesRequired / 60, gProductionVector[aNum].xmldata.sMinutesRequired % 60 );
}
return gProductionHelpText;
}
BOOLEAN Activegetter_Production( UINT32 aNum )
{
if ( aNum < gProductionVector.size() )
{
return gProductionVector[aNum].active;
}
return FALSE;
}
void CheckboxImagegetter_Production( UINT32 aNum, UINT32& arImageLib, UINT16& arImage )
{
arImageLib = gCHECKBOXLib;
arImage = 0;
if ( aNum < gProductionVector.size() )
{
if ( !gProductionVector[aNum].can_turnon )
arImage = 4;
else if ( gProductionVector[aNum].active )
arImage = 2;
}
}
void Factory_ProgressBar( UINT32 aId, UINT16& arCol1, UINT16& arVal1, UINT16& arCol2, UINT16& arVal2, UINT16& arCol3, UINT16& arVal3, UINT16& arCol4, UINT16& arVal4 )
{
if ( aId < gProductionVector.size() )
{
INT32 productiontime = GetFactoryLeftoverProgress( SECTORX( gProductionVector[aId].sector ), SECTORY( gProductionVector[aId].sector ), 0, gProductionVector[aId].facilitytype, gProductionVector[aId].productionline );
// use stat bar colours, because why not
arCol1 = Get16BPPColor( FROMRGB( gGameExternalOptions.ubStatProgressBarsRed, gGameExternalOptions.ubStatProgressBarsGreen, gGameExternalOptions.ubStatProgressBarsBlue ) );
if ( productiontime > -1 && gProductionVector[aId].xmldata.sMinutesRequired > 0 )
arVal1 = min( 100, 100 * productiontime / gProductionVector[aId].xmldata.sMinutesRequired );
else
arVal1 = 0;
}
}
void callbacktoggle( INT32 usId )
{
if ( usId < gProductionVector.size() && gProductionVector[usId].can_turnon )
{
gProductionVector[usId].active = !gProductionVector[usId].active;
TestTableTemplate<4>::getInstance().SetRefresh();
}
}
template<> void TestTableTemplate<4>::SetRefresh() { gfFacilityProductionRedraw = TRUE; }
template<> void TestTableTemplate<4>::Init( UINT16 sX, UINT16 sY, UINT16 sX_End, UINT16 sY_End )
{
ClearColumnDataProvider();
// on/off toggle
{
ColumnDataProvider col( L"" );
col.SetRequiredHeigth( 12 );
col.SetRequiredLength( 24 );
col.SetMethodImage( CheckboxImagegetter_Production );
col.SetNumberOfEntries( gProductionVector.size() );
col.SetCallBackType( ColumnDataProvider::CDP_TOGGLE );
AddColumnDataProvider( col );
}
// sector
{
ColumnDataProvider col( pUpdateMapInfoText[15] );
col.SetMethodString( Sectornamegetter_Production );
col.SetNumberOfEntries( gProductionVector.size() );
col.SetCallBackType( ColumnDataProvider::CDP_MILITIA_LIST );
AddColumnDataProvider( col );
}
// name
{
ColumnDataProvider col( szFactoryText[4] );
col.SetMethodString( Product_Production );
col.SetNumberOfEntries( gProductionVector.size() );
col.SetCallBackType( ColumnDataProvider::CDP_MILITIA_LIST );
AddColumnDataProvider( col );
}
// required items to use up
{
ColumnDataProvider col( szFactoryText[5] );
col.SetMethodString( PreProduct_Production );
col.SetNumberOfEntries( gProductionVector.size() );
col.SetCallBackType( ColumnDataProvider::CDP_MILITIA_LIST );
AddColumnDataProvider( col );
}
// loyalty
{
ColumnDataProvider col( pwTownInfoStrings[5] );
col.SetMethodString( Loyalty_Production );
col.SetMethodTextColour( ColourGetter_Production );
col.SetNumberOfEntries( gProductionVector.size() );
col.SetCallBackType( ColumnDataProvider::CDP_MILITIA_LIST );
AddColumnDataProvider( col );
}
// cost
{
ColumnDataProvider col( L"$/h" );
col.SetMethodString( Costgetter_Production );
col.SetNumberOfEntries( gProductionVector.size() );
col.SetCallBackType( ColumnDataProvider::CDP_MILITIA_LIST );
AddColumnDataProvider( col );
}
// current progress
{
ColumnDataProvider col( L"" );
col.SetMethodStatusBar( Factory_ProgressBar );
col.SetNumberOfEntries( gProductionVector.size() );
col.SetCallBackType( ColumnDataProvider::CDP_MILITIA_LIST );
AddColumnDataProvider( col );
}
// time required
{
ColumnDataProvider col( szFactoryText[6] );
col.SetMethodString( Minutesgetter_Production );
col.SetNumberOfEntries( gProductionVector.size() );
col.SetCallBackType( ColumnDataProvider::CDP_MILITIA_LIST );
AddColumnDataProvider( col );
}
TestTable::Init( sX, sY, sX_End, sY_End );
}
////////////////////////// MAIN PAGE ////////////////////////////////
+16
View File
@@ -0,0 +1,16 @@
#pragma once
#ifndef __FACILITY_PRODUCTION_WEBSITE_H
#define __FACILITY_PRODUCTION_WEBSITE_H
/**
* @file
* @author Flugente (bears-pit.com)
*/
// main page (explains what this is all about)
BOOLEAN EnterFacilityProduction();
void ExitFacilityProduction();
void HandleFacilityProduction();
void RenderFacilityProduction();
#endif //__FACILITY_PRODUCTION_WEBSITE_H
+8
View File
@@ -462,6 +462,10 @@
RelativePath=".\Encyclopedia_new.h"
>
</File>
<File
RelativePath=".\FacilityProduction.h"
>
</File>
<File
RelativePath=".\files.h"
>
@@ -824,6 +828,10 @@
RelativePath=".\Encyclopedia_new.cpp"
>
</File>
<File
RelativePath=".\FacilityProduction.cpp"
>
</File>
<File
RelativePath=".\files.cpp"
>
+8
View File
@@ -462,6 +462,10 @@
RelativePath=".\Encyclopedia_new.h"
>
</File>
<File
RelativePath=".\FacilityProduction.h"
>
</File>
<File
RelativePath="files.h"
>
@@ -822,6 +826,10 @@
RelativePath=".\Encyclopedia_new.cpp"
>
</File>
<File
RelativePath=".\FacilityProduction.cpp"
>
</File>
<File
RelativePath="files.cpp"
>
+2
View File
@@ -54,6 +54,7 @@
<ClInclude Include="email.h" />
<ClInclude Include="Encyclopedia_Data_new.h" />
<ClInclude Include="Encyclopedia_new.h" />
<ClInclude Include="FacilityProduction.h" />
<ClInclude Include="files.h" />
<ClInclude Include="finances.h" />
<ClInclude Include="florist Cards.h" />
@@ -145,6 +146,7 @@
<ClCompile Include="email.cpp" />
<ClCompile Include="Encyclopedia_Data_new.cpp" />
<ClCompile Include="Encyclopedia_new.cpp" />
<ClCompile Include="FacilityProduction.cpp" />
<ClCompile Include="files.cpp" />
<ClCompile Include="finances.cpp" />
<ClCompile Include="florist Cards.cpp" />
+6
View File
@@ -257,6 +257,9 @@
</ClInclude>
<ClInclude Include="Encyclopedia_Data_new.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="FacilityProduction.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="BriefingRoom_Data.h">
<Filter>Header Files</Filter>
@@ -548,6 +551,9 @@
<ClCompile Include="Encyclopedia_Data_new.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="FacilityProduction.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="BriefingRoom_Data.cpp">
<Filter>Source Files</Filter>
</ClCompile>
+2
View File
@@ -54,6 +54,7 @@
<ClInclude Include="email.h" />
<ClInclude Include="Encyclopedia_Data_new.h" />
<ClInclude Include="Encyclopedia_new.h" />
<ClInclude Include="FacilityProduction.h" />
<ClInclude Include="files.h" />
<ClInclude Include="finances.h" />
<ClInclude Include="florist Cards.h" />
@@ -145,6 +146,7 @@
<ClCompile Include="email.cpp" />
<ClCompile Include="Encyclopedia_Data_new.cpp" />
<ClCompile Include="Encyclopedia_new.cpp" />
<ClCompile Include="FacilityProduction.cpp" />
<ClCompile Include="files.cpp" />
<ClCompile Include="finances.cpp" />
<ClCompile Include="florist Cards.cpp" />
+6
View File
@@ -237,6 +237,9 @@
<ClInclude Include="Encyclopedia_Data_new.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="FacilityProduction.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="BriefingRoom_Data.h">
<Filter>Header Files</Filter>
</ClInclude>
@@ -523,6 +526,9 @@
</ClCompile>
<ClCompile Include="Encyclopedia_Data_new.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="FacilityProduction.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="BriefingRoom_Data.cpp">
<Filter>Source Files</Filter>
+2
View File
@@ -54,6 +54,7 @@
<ClInclude Include="email.h" />
<ClInclude Include="Encyclopedia_Data_new.h" />
<ClInclude Include="Encyclopedia_new.h" />
<ClInclude Include="FacilityProduction.h" />
<ClInclude Include="files.h" />
<ClInclude Include="finances.h" />
<ClInclude Include="florist Cards.h" />
@@ -145,6 +146,7 @@
<ClCompile Include="email.cpp" />
<ClCompile Include="Encyclopedia_Data_new.cpp" />
<ClCompile Include="Encyclopedia_new.cpp" />
<ClCompile Include="FacilityProduction.cpp" />
<ClCompile Include="files.cpp" />
<ClCompile Include="finances.cpp" />
<ClCompile Include="florist Cards.cpp" />
+2
View File
@@ -74,6 +74,7 @@
<ClInclude Include="email.h" />
<ClInclude Include="Encyclopedia_Data_new.h" />
<ClInclude Include="Encyclopedia_new.h" />
<ClInclude Include="FacilityProduction.h" />
<ClInclude Include="files.h" />
<ClInclude Include="finances.h" />
<ClInclude Include="florist Cards.h" />
@@ -165,6 +166,7 @@
<ClCompile Include="email.cpp" />
<ClCompile Include="Encyclopedia_Data_new.cpp" />
<ClCompile Include="Encyclopedia_new.cpp" />
<ClCompile Include="FacilityProduction.cpp" />
<ClCompile Include="files.cpp" />
<ClCompile Include="finances.cpp" />
<ClCompile Include="florist Cards.cpp" />
+44
View File
@@ -92,6 +92,7 @@
#include "PMC.h" // added by Flugente
#include "MilitiaWebsite.h" // added by Flugente
#include "Intelmarket.h" // added by Flugente
#include "FacilityProduction.h" // added by Flugente
#endif
#include "connect.h"
@@ -1075,6 +1076,11 @@ INT32 EnterLaptop()
if ( !gGameExternalOptions.fIntelResource )
RemoveBookmark( INTELMARKET_BOOKMARK );
if ( gGameExternalOptions.fFactories )
SetBookMark( PRODUCTION_BOOKMARK );
else
RemoveBookmark( PRODUCTION_BOOKMARK );
}
LoadLoadPending( );
@@ -1521,6 +1527,10 @@ void RenderLaptop()
case LAPTOP_MODE_INTELMARKET_ABOUT:
RenderIntelmarket_About();
break;
case LAPTOP_MODE_FACILITY_PRODUCTION:
RenderFacilityProduction();
break;
}
if( guiCurrentLaptopMode >= LAPTOP_MODE_WWW )
@@ -1997,6 +2007,10 @@ void EnterNewLaptopMode()
case LAPTOP_MODE_INTELMARKET_ABOUT:
EnterIntelmarket_About();
break;
case LAPTOP_MODE_FACILITY_PRODUCTION:
EnterFacilityProduction();
break;
}
// first time using webbrowser in this laptop session
@@ -2288,6 +2302,10 @@ void HandleLapTopHandles()
case LAPTOP_MODE_INTELMARKET_ABOUT:
HandleIntelmarket_About();
break;
case LAPTOP_MODE_FACILITY_PRODUCTION:
HandleFacilityProduction();
break;
}
}
@@ -2886,6 +2904,10 @@ UINT32 ExitLaptopMode(UINT32 uiMode)
case LAPTOP_MODE_INTELMARKET_ABOUT:
ExitIntelmarket_About();
break;
case LAPTOP_MODE_FACILITY_PRODUCTION:
ExitFacilityProduction();
break;
}
if( ( uiMode != LAPTOP_MODE_NONE )&&( uiMode < LAPTOP_MODE_WWW ) )
@@ -4551,6 +4573,27 @@ void GoToWebPage(INT32 iPageId )
}
}
break;
case PRODUCTION_BOOKMARK:
{
guiCurrentWWWMode = LAPTOP_MODE_FACILITY_PRODUCTION;
guiCurrentLaptopMode = LAPTOP_MODE_FACILITY_PRODUCTION;
// do we have to have a World Wide Wait
if ( LaptopSaveInfo.fVisitedBookmarkAlready[PRODUCTION_BOOKMARK] == FALSE )
{
// reset flag and set load pending flag
LaptopSaveInfo.fVisitedBookmarkAlready[PRODUCTION_BOOKMARK] = TRUE;
fLoadPendingFlag = TRUE;
}
else
{
// fast reload
fLoadPendingFlag = TRUE;
fFastLoadFlag = TRUE;
}
}
break;
}
#ifdef JA2UB
@@ -6346,6 +6389,7 @@ void HandleKeyBoardShortCutsForLapTop( UINT16 usEvent, UINT32 usParam, UINT16 us
SetBookMark( PMC_BOOKMARK );
SetBookMark( MILITIAROSTER_BOOKMARK );
SetBookMark( INTELMARKET_BOOKMARK );
SetBookMark( PRODUCTION_BOOKMARK );
}
}
+4
View File
@@ -169,6 +169,9 @@ enum
LAPTOP_MODE_INTELMARKET_BUYINFO,
LAPTOP_MODE_INTELMARKET_SELLINFO,
LAPTOP_MODE_INTELMARKET_ABOUT,
// Flugente: facility production
LAPTOP_MODE_FACILITY_PRODUCTION,
LAPTOP_MODE_BOBBYR_SHIPMENTS,
@@ -251,6 +254,7 @@ enum{
PMC_BOOKMARK, // added by Flugente
MILITIAROSTER_BOOKMARK, // added by Flugente
INTELMARKET_BOOKMARK, // added by Flugente
PRODUCTION_BOOKMARK, // added by Flugente
TEXT_NUM_LAPTOP_BOOKMARKS
};
+30
View File
@@ -283,6 +283,34 @@ typedef struct FACILITYASSIGNMENTTYPE
} FACILITYASSIGNMENTTYPE;
// struct needed during production and laptop display
typedef struct PRODUCTION_LINE_PREPRODUCT
{
UINT16 item;
UINT32 requiredforonecreation;
} PRODUCTION_LINE_PREPRODUCT;
// -------- added by Flugente: various flags for factories --------
#define REQUIRES_STAFFING 0x00000001 //1 // the factory can only be activated if the facility is staffed
typedef struct PRODUCTION_LINE
{
// determines which items can be produced here with what requirement
CHAR16 szProductionName[30];
CHAR16 szAdditionalRequirementTips[80];
UINT16 usItemToCreate; // item that shall be created
INT32 sMinutesRequired; // time required to create one item
INT32 sGridNo_Creation; // the location where the item is dropped at
UINT32 usProductionFlags; // flagmask for various properties
INT32 sHourlyCost; // cost for every hour of work (NOT per item). Negative values mean we gain money.
UINT8 usOptional_LoyaltyRequired; // loyalty in the sector must be at least this value. Only applicable in town sectors.
// this vector contains all the items we need to create what we want in what quantity
std::vector<PRODUCTION_LINE_PREPRODUCT> usOptional_PreProducts;
} PRODUCTION_LINE;
// Flugente: facilitytype properties
#define FACILITYTYPE_PMCENTRYPOINT 0x00000001 // militia hired from the PMC can only enter Arulco in sectors with facilites with this property
@@ -302,6 +330,8 @@ typedef struct FACILITYTYPE
FACILITYASSIGNMENTTYPE AssignmentData[ NUM_FACILITY_ASSIGNMENTS ]; // Data about possible assignments that can be done here
std::vector<PRODUCTION_LINE> ProductionData;
} FACILITYTYPE;
// HEADROCK HAM 3.5: Maximum number of different facility types
+334
View File
@@ -24,6 +24,8 @@
#include "Interface.h" // added by Flugente
#include "SkillCheck.h" // added by Flugente
#include "Isometric Utils.h" // added by Flugente for NOWHERE
#include "strategic.h" // added by Flugente
#include "message.h" // added by Flugente for ScreenMsg(...)
#endif
#include "Luaglobal.h"
@@ -48,6 +50,7 @@ void HourlyLarryUpdate();
void HourlySmokerUpdate();
void HourlyDisabilityUpdate();
void HourlyStealUpdate(); // Flugente: certain characters might steal equipment (backgrounds)
void HourlyFactoryUpdate(); // Flugente: update factories
void HourlySnitchUpdate(); // anv: decreasing cooldown after exposition
extern SECTOR_EXT_DATA SectorExternalData[256][4];
@@ -133,6 +136,8 @@ CHAR16 zString[128];
HourlyGatheringInformation();
HourlyFactoryUpdate();
#ifdef JA2UB
// no UB
#else
@@ -820,6 +825,335 @@ void HourlyStealUpdate()
}
}
BOOLEAN RemoveItemInSector( INT16 sSectorX, INT16 sSectorY, INT8 bSectorZ, UINT16 usItem, UINT32 usNumToRemove )
{
// open sector inv
UINT32 uiTotalNumberOfRealItems = 0;
std::vector<WORLDITEM> pWorldItem;//dnl ch75 271013
BOOLEAN fReturn = FALSE;
if ( ( gWorldSectorX == sSectorX ) && ( gWorldSectorY == sSectorY ) && ( gbWorldSectorZ == bSectorZ ) )
{
uiTotalNumberOfRealItems = guiNumWorldItems;
pWorldItem = gWorldItems;
}
else
{
// not loaded, load
// get total number, visable and invisible
fReturn = GetNumberOfWorldItemsFromTempItemFile( sSectorX, sSectorY, bSectorZ, &( uiTotalNumberOfRealItems ), FALSE );
Assert( fReturn );
if ( uiTotalNumberOfRealItems > 0 )
{
// allocate space for the list
pWorldItem.resize( uiTotalNumberOfRealItems );//dnl ch75 271013
// now load into mem
LoadWorldItemsFromTempItemFile( sSectorX, sSectorY, bSectorZ, pWorldItem );
}
}
if ( !uiTotalNumberOfRealItems )
return FALSE;
BOOLEAN removedsth = FALSE;
OBJECTTYPE* pObj = NULL;
for ( UINT32 uiCount = 0; uiCount < uiTotalNumberOfRealItems && usNumToRemove > 0; ++uiCount ) // ... for all items in the world ...
{
if ( pWorldItem[uiCount].fExists
&& pWorldItem[uiCount].usFlags & WORLD_ITEM_REACHABLE
&& pWorldItem[uiCount].bVisible == VISIBLE )
{
OBJECTTYPE* pObj = &( pWorldItem[uiCount].object ); // ... get pointer for this item ...
if ( pObj != NULL && pObj->exists() ) // ... if pointer is not obviously useless ...
{
if ( pObj->usItem == usItem )
{
if ( usNumToRemove < pObj->ubNumberOfObjects )
{
pObj->RemoveObjectsFromStack( usNumToRemove );
usNumToRemove = 0;
}
else
{
usNumToRemove -= pObj->ubNumberOfObjects;
pObj->RemoveObjectsFromStack( pObj->ubNumberOfObjects );
}
removedsth = TRUE;
}
}
}
}
if ( removedsth )
{
// save the changed inventory
// open sector inv
if ( ( gWorldSectorX == sSectorX ) && ( gWorldSectorY == sSectorY ) && ( gbWorldSectorZ == bSectorZ ) )
{
guiNumWorldItems = uiTotalNumberOfRealItems;
gWorldItems = pWorldItem;
}
else
{
//Save the Items to the the file
SaveWorldItemsToTempItemFile( sSectorX, sSectorY, bSectorZ, uiTotalNumberOfRealItems, pWorldItem );
}
return TRUE;
}
return FALSE;
}
UINT32 CountAccessibleItemsInSector( INT16 sSectorX, INT16 sSectorY, INT8 bSectorZ, UINT16 usItem )
{
UINT32 numfound = 0;
// open sector inv
UINT32 uiTotalNumberOfRealItems = 0;
std::vector<WORLDITEM> pWorldItem;//dnl ch75 271013
BOOLEAN fReturn = FALSE;
if ( ( gWorldSectorX == sSectorX ) && ( gWorldSectorY == sSectorY ) && ( gbWorldSectorZ == bSectorZ ) )
{
uiTotalNumberOfRealItems = guiNumWorldItems;
pWorldItem = gWorldItems;
}
else
{
// not loaded, load
// get total number, visable and invisible
fReturn = GetNumberOfWorldItemsFromTempItemFile( sSectorX, sSectorY, bSectorZ, &( uiTotalNumberOfRealItems ), FALSE );
Assert( fReturn );
if ( uiTotalNumberOfRealItems > 0 )
{
// allocate space for the list
pWorldItem.resize( uiTotalNumberOfRealItems );//dnl ch75 271013
// now load into mem
LoadWorldItemsFromTempItemFile( sSectorX, sSectorY, bSectorZ, pWorldItem );
}
}
OBJECTTYPE* pObj = NULL;
for ( UINT32 uiCount = 0; uiCount < uiTotalNumberOfRealItems; ++uiCount ) // ... for all items in the world ...
{
if ( pWorldItem[uiCount].fExists
&& pWorldItem[uiCount].usFlags & WORLD_ITEM_REACHABLE
&& pWorldItem[uiCount].bVisible == VISIBLE )
{
OBJECTTYPE* pObj = &( pWorldItem[uiCount].object ); // ... get pointer for this item ...
if ( pObj != NULL && pObj->exists() && pObj->usItem == usItem )
{
numfound += pObj->ubNumberOfObjects;
}
}
}
return numfound;
}
extern void SetFactoryLeftoverProgress( INT16 sSectorX, INT16 sSectorY, INT8 bSectorZ, UINT16 usFacilityType, UINT16 usProductionNumber, INT32 sProgressLeft );
extern INT32 GetFactoryLeftoverProgress( INT16 sSectorX, INT16 sSectorY, INT8 bSectorZ, UINT16 usFacilityType, UINT16 usProductionNumber );
BOOLEAN GetFacilityProductionState( INT16 sSectorX, INT16 sSectorY, INT8 bSectorZ, UINT16 usFacilityType, UINT16 usProductionNumber )
{
return GetFactoryLeftoverProgress( sSectorX, sSectorY, bSectorZ, usFacilityType, usProductionNumber ) > -1;
}
void SetFacilityProductionState( INT16 sSectorX, INT16 sSectorY, INT8 bSectorZ, UINT16 usFacilityType, UINT16 usProductionNumber, BOOLEAN aOn )
{
return SetFactoryLeftoverProgress( sSectorX, sSectorY, bSectorZ, usFacilityType, usProductionNumber, aOn ? 0 : -1 );
}
void HourlyFactoryUpdate()
{
if ( !gGameExternalOptions.fFactories )
return;
// how much money do we currently have?
INT32 balance = GetCurrentBalance();
INT32 moneyspentonproduction = 0;
for ( UINT16 sector = 0; sector < 256; ++sector )
{
if ( !StrategicMap[SECTOR_INFO_TO_STRATEGIC_INDEX( sector )].fEnemyControlled )
{
UINT8 ubTownID = GetTownIdForSector( SECTORX( sector ), SECTORY( sector ) );
CHAR16 wSectorName[64];
GetSectorIDString( SECTORX( sector ), SECTORY( sector ), 0, wSectorName, FALSE );
for ( UINT16 cnt = 0; cnt < NUM_FACILITY_TYPES; ++cnt )
{
// Is this facility here?
if ( gFacilityLocations[sector][cnt].fFacilityHere )
{
UINT16 productioncnt = 0;
for ( std::vector<PRODUCTION_LINE>::iterator prodit = gFacilityTypes[cnt].ProductionData.begin(), proditend = gFacilityTypes[cnt].ProductionData.end(); prodit != proditend; ++prodit, ++productioncnt )
{
// get production progress from the previous hour
INT32 productiontime = GetFactoryLeftoverProgress( SECTORX( sector ), SECTORY( sector ), 0, cnt, productioncnt );
// negative value means factory is not active
if ( productiontime < 0 )
continue;
CHAR16 productionname[64];
swprintf( productionname, L"%s", wcslen((*prodit ).szProductionName ) > 0 ? ( *prodit ).szProductionName : ( *prodit ).usItemToCreate != NOTHING ? Item[( *prodit ).usItemToCreate].szItemName : L"--" );
// check for sufficient loyalty
if ( ubTownID != BLANK_SECTOR
&& gTownLoyalty[ubTownID].ubRating < ( *prodit ).usOptional_LoyaltyRequired )
{
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szFactoryText[0], wSectorName, productionname );
SetFacilityProductionState( SECTORX( sector ), SECTORY( sector ), 0, cnt, productioncnt, FALSE );
continue;
}
// check for funds
if ( moneyspentonproduction + ( *prodit ).sHourlyCost > balance )
{
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szFactoryText[1], wSectorName, productionname );
SetFacilityProductionState( SECTORX( sector ), SECTORY( sector ), 0, cnt, productioncnt, FALSE );
continue;
}
// check whether facility is staffed if required
if ( ( *prodit ).usProductionFlags & REQUIRES_STAFFING )
{
bool isstaffed = false;
bool isstaffed_andawake = false;
SOLDIERTYPE *pSoldier = NULL;
UINT32 uiCnt = 0;
for ( uiCnt = 0, pSoldier = MercPtrs[uiCnt]; uiCnt <= gTacticalStatus.Team[gbPlayerNum].bLastID; ++uiCnt, ++pSoldier )
{
if ( pSoldier->bActive && ( pSoldier->sSectorX == SECTORX( sector ) ) && ( pSoldier->sSectorY == SECTORY( sector ) ) && ( pSoldier->bSectorZ == 0 ) )
{
if ( pSoldier->sFacilityTypeOperated == cnt )
{
isstaffed = true;
// check whether the staffing merc is asleep or has spent enough time on this
if ( !pSoldier->flags.fMercAsleep && EnoughTimeOnAssignment( pSoldier ) )
{
isstaffed_andawake = true;
break;
}
}
}
}
// if not staffed at all, shut down
if ( !isstaffed )
{
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szFactoryText[2], wSectorName, productionname );
SetFacilityProductionState( SECTORX( sector ), SECTORY( sector ), 0, cnt, productioncnt, FALSE );
continue;
}
// if staffed but the staffing mercs are not active, skip this cycle
else if ( !isstaffed_andawake )
{
continue;
}
}
// add one hour of progress
productiontime += 60;
// it's possible we might require several preproducts. Get an overview of all that is needed
// struct needed during production and laptop display
typedef struct FACTORY_PREPRODUCT_AVAILABLE
{
PRODUCTION_LINE_PREPRODUCT xml;
UINT32 available;
} FACTORY_PREPRODUCT_AVAILABLE;
std::vector<FACTORY_PREPRODUCT_AVAILABLE> productionstoragedata;
for ( std::vector<PRODUCTION_LINE_PREPRODUCT>::iterator useitemit = ( *prodit ).usOptional_PreProducts.begin(), useitemitend = ( *prodit ).usOptional_PreProducts.end(); useitemit != useitemitend; ++useitemit )
{
FACTORY_PREPRODUCT_AVAILABLE data;
data.xml = ( *useitemit );
data.available = CountAccessibleItemsInSector( SECTORX( sector ), SECTORY( sector ), 0, data.xml.item );
productionstoragedata.push_back( data );
}
UINT32 itemstocreate = 0;
bool insufficientitems = false;
while ( productiontime >= ( *prodit ).sMinutesRequired )
{
// check whether all items required are available
for ( std::vector<FACTORY_PREPRODUCT_AVAILABLE>::iterator tmpit = productionstoragedata.begin(), tmpitend = productionstoragedata.end(); tmpit != tmpitend; ++tmpit )
{
if ( ( itemstocreate + 1 ) * ( *tmpit ).xml.requiredforonecreation > ( *tmpit ).available )
{
insufficientitems = true;
break;
}
}
if ( insufficientitems )
break;
++itemstocreate;
productiontime -= ( *prodit ).sMinutesRequired;
}
if ( itemstocreate )
{
// remove required preproducts
for ( std::vector<FACTORY_PREPRODUCT_AVAILABLE>::iterator tmpit = productionstoragedata.begin(), tmpitend = productionstoragedata.end(); tmpit != tmpitend; ++tmpit )
{
RemoveItemInSector( SECTORX( sector ), SECTORY( sector ), 0, ( *tmpit ).xml.item, ( *tmpit ).xml.requiredforonecreation * itemstocreate );
}
// create produced items and place them
if ( CreateItems( ( *prodit ).usItemToCreate, 100, itemstocreate, &gTempObject ) )
{
if ( ( gWorldSectorX == SECTORX( sector ) ) && ( gWorldSectorY == SECTORY( sector ) ) && ( gbWorldSectorZ == 0 ) )
{
AddItemToPool( ( *prodit ).sGridNo_Creation, &gTempObject, 1, 0, ( WOLRD_ITEM_FIND_SWEETSPOT_FROM_GRIDNO | WORLD_ITEM_REACHABLE ), 0 );
}
else
{
AddItemsToUnLoadedSector( SECTORX( sector ), SECTORY( sector ), 0,
( *prodit ).sGridNo_Creation, 1, &gTempObject, 0, ( WOLRD_ITEM_FIND_SWEETSPOT_FROM_GRIDNO | WORLD_ITEM_REACHABLE ), 0, 1, FALSE );
}
}
}
// if we can no longer produce anything because we don't have the items, shut off
if ( insufficientitems )
{
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szFactoryText[3], wSectorName, productionname );
SetFacilityProductionState( SECTORX( sector ), SECTORY( sector ), 0, cnt, productioncnt, FALSE );
}
// otherwise set new partial progress
else
{
SetFactoryLeftoverProgress( SECTORX( sector ), SECTORY( sector ), 0, cnt, productioncnt, productiontime );
}
moneyspentonproduction += ( *prodit ).sHourlyCost;
}
}
}
}
}
// substract money spent
AddTransactionToPlayersBook ( FACILITY_OPERATIONS, NO_PROFILE, GetWorldTotalMin(), -moneyspentonproduction );
}
#ifdef JA2UB
// no JA25 UB
#else
+35
View File
@@ -13408,6 +13408,41 @@ void LuaGetIntelAndQuestMapData( INT32 aLevel )
LuaFunction( _LS.L, "GetIntelAndQuestMapData" ).Param<int>( aLevel ).Call( 1 );
}
void SetFactoryLeftoverProgress( INT16 sSectorX, INT16 sSectorY, INT8 bSectorZ, UINT16 usFacilityType, UINT16 usProductionNumber, INT32 sProgressLeft )
{
const char* filename = "scripts\\strategicmap.lua";
LuaScopeState _LS( true );
IniFunction( _LS.L(), TRUE );
IniGlobalGameSetting( _LS.L() );
SGP_THROW_IFFALSE( _LS.L.EvalFile( filename ), _BS( "Cannot open file: " ) << filename << _BS::cget );
LuaFunction( _LS.L, "SetFactoryLeftoverProgress" ).Param<int>( sSectorX ).Param<int>( sSectorY ).Param<int>( bSectorZ ).Param<int>( usFacilityType ).Param<int>( usProductionNumber ).Param<int>( sProgressLeft ).Call( 6 );
}
INT32 GetFactoryLeftoverProgress( INT16 sSectorX, INT16 sSectorY, INT8 bSectorZ, UINT16 usFacilityType, UINT16 usProductionNumber )
{
const char* filename = "scripts\\strategicmap.lua";
LuaScopeState _LS( true );
IniFunction( _LS.L(), TRUE );
IniGlobalGameSetting( _LS.L() );
SGP_THROW_IFFALSE( _LS.L.EvalFile( filename ), _BS( "Cannot open file: " ) << filename << _BS::cget );
LuaFunction( _LS.L, "GetFactoryLeftoverProgress" ).Param<int>( sSectorX ).Param<int>( sSectorY ).Param<int>( bSectorZ ).Param<int>( usFacilityType ).Param<int>( usProductionNumber ).Call( 5 );
if ( lua_gettop( _LS.L() ) >= 0 )
{
return lua_tointeger( _LS.L(), 1 );
}
return 0;
}
extern void AddIntelAndQuestMapDataForSector( INT16 sSectorX, INT16 sSectorY, UINT8 ausMapColour, int asSymbol, STR16 aText, STR16 aText_Short );
static int l_SetIntelAndQuestMapDataForSector( lua_State *L )
+2
View File
@@ -100,4 +100,6 @@ void LuaGetPhotoData( UINT8 aType );
void LuaSetPhotoState( INT16 asIndex, UINT8 aState );
void LuaVerifyPhotoState( INT16 asIndex );
void LuaGetIntelAndQuestMapData( INT32 aLevel );
void SetFactoryLeftoverProgress( INT16 sSectorX, INT16 sSectorY, INT8 bSectorZ, UINT16 usFacilityType, UINT16 usProductionNumber, INT32 sProgressLeft );
INT32 GetFactoryLeftoverProgress( INT16 sSectorX, INT16 sSectorY, INT8 bSectorZ, UINT16 usFacilityType, UINT16 usProductionNumber );
#endif
+54 -1
View File
@@ -8344,6 +8344,8 @@ void AddIntelAndQuestMapDataForSector( INT16 sSectorX, INT16 sSectorY, UINT8 aus
}
}
extern BOOLEAN GetFacilityProductionState( INT16 sSectorX, INT16 sSectorY, INT8 bSectorZ, UINT16 usFacilityType, UINT16 usProductionNumber );
void DetermineMapIntelData( INT32 asSectorZ )
{
// clear data
@@ -8412,6 +8414,58 @@ void DetermineMapIntelData( INT32 asSectorZ )
}
}
}
// Flugente: factories
if ( gGameExternalOptions.fFactories )
{
for ( UINT16 sector = 0; sector < 256; ++sector )
{
BOOLEAN productionfound = FALSE;
BOOLEAN activeproductionfound = FALSE;
BOOLEAN inactiveproductionfound = FALSE;
BOOLEAN productionunderenemycontrol = FALSE;
for ( UINT16 cnt = 0; cnt < NUM_FACILITY_TYPES; ++cnt )
{
// Is this facility here?
if ( gFacilityLocations[sector][cnt].fFacilityHere )
{
if ( gFacilityLocations[sector][cnt].ubHidden == 0 ||
( gFacilityLocations[sector][cnt].ubHidden == 1 && SectorInfo[sector].fSurfaceWasEverPlayerControlled ) )
{
if ( StrategicMap[SECTOR_INFO_TO_STRATEGIC_INDEX( sector )].fEnemyControlled )
{
// if it's an enemy controlled sector, just check whether there are production lines at all
if ( !gFacilityTypes[cnt].ProductionData.empty() )
{
productionfound = TRUE;
productionunderenemycontrol = TRUE;
}
}
else
{
UINT16 productioncnt = 0;
for ( std::vector<PRODUCTION_LINE>::iterator prodit = gFacilityTypes[cnt].ProductionData.begin(), proditend = gFacilityTypes[cnt].ProductionData.end(); prodit != proditend;
++prodit, ++productioncnt )
{
if ( GetFacilityProductionState( SECTORX( sector ), SECTORY( sector ), 0, cnt, productioncnt ) )
activeproductionfound = TRUE;
else
inactiveproductionfound = TRUE;
productionfound = TRUE;
}
}
}
}
}
if ( productionfound )
{
AddIntelAndQuestMapDataForSector( SECTORX( sector ), SECTORY( sector ), -1, productionunderenemycontrol ? 22 : activeproductionfound ? inactiveproductionfound ? 19 : 20 : 21, L"", L"" );
}
}
}
}
// add lua data
@@ -8421,7 +8475,6 @@ void DetermineMapIntelData( INT32 asSectorZ )
void ShowIntelOnMap()
{
INT16 usXPos, usYPos;
CHAR16 sString[256];
INT32 MapItemsFont;
if ( iResolution <= _800x600 )
+23 -6
View File
@@ -39,6 +39,8 @@
extern BOOLEAN fMapScreenBottomDirty;
extern CPostalService gPostalService;
// Flugente: external sector data
extern SECTOR_EXT_DATA SectorExternalData[256][4];
void AddFacilitiesToBox( INT16 sMapX, INT16 sMapY, UINT32 *uiHandle, BOOLEAN fCityInfoBox )
{
@@ -46,15 +48,15 @@ void AddFacilitiesToBox( INT16 sMapX, INT16 sMapY, UINT32 *uiHandle, BOOLEAN fCi
// HEADROCK HAM 3.5: Facilities are now read from XMLs, including their names.
UINT32 cnt = 0;
UINT32 uiNumFacilities = 0;
BOOLEAN fHeaderAdded = FALSE;
CHAR16 szFacilityString[30];
CHAR16 szTmpString[80];
Assert(sMapX > 0 && sMapY > 0 && sMapX < 17 && sMapY < 17);
for ( cnt = 0; cnt < NUM_FACILITY_TYPES; cnt++ )
for ( UINT16 cnt = 0; cnt < NUM_FACILITY_TYPES; ++cnt )
{
if (fCityInfoBox && uiNumFacilities == 0 && !fHeaderAdded )
{
@@ -66,6 +68,7 @@ void AddFacilitiesToBox( INT16 sMapX, INT16 sMapY, UINT32 *uiHandle, BOOLEAN fCi
fHeaderAdded = TRUE;
}
}
// Facility type exists at this location?
if (gFacilityLocations[SECTOR(sMapX,sMapY)][cnt].fFacilityHere)
{
@@ -85,7 +88,24 @@ void AddFacilitiesToBox( INT16 sMapX, INT16 sMapY, UINT32 *uiHandle, BOOLEAN fCi
}
AddSecondColumnMonoString( uiHandle, gFacilityTypes[cnt].szFacilityName );
uiNumFacilities++;
++uiNumFacilities;
// Flugente: factories
if ( gGameExternalOptions.fFactories )
{
for ( std::vector<PRODUCTION_LINE>::iterator prodit = gFacilityTypes[cnt].ProductionData.begin(), proditend = gFacilityTypes[cnt].ProductionData.end(); prodit != proditend; ++prodit )
{
if ( wcslen( ( *prodit ).szAdditionalRequirementTips ) > 0 )
{
// Add empty line on the left size to make room for text on the right.
AddMonoString( uiHandle, L"" );
swprintf( szTmpString, L"%s", ( *prodit ).szAdditionalRequirementTips );
AddSecondColumnMonoString( uiHandle, szTmpString );
++uiNumFacilities;
}
}
}
}
}
}
@@ -178,9 +198,6 @@ void AddFacilitiesToBox( INT16 sMapX, INT16 sMapY, UINT32 *uiHandle, BOOLEAN fCi
return;
}
// Flugente: external sector data
extern SECTOR_EXT_DATA SectorExternalData[256][4];
// ALL changes of control to player must be funneled through here!
BOOLEAN SetThisSectorAsPlayerControlled( INT16 sMapX, INT16 sMapY, INT8 bMapZ, BOOLEAN fContested )
{
+154 -3
View File
@@ -37,6 +37,8 @@ typedef enum
FACILITYTYPE_CONDITIONS_ELEMENT,
FACILITYTYPE_RISK,
FACILITYTYPE_RISK_ELEMENT,
FACILITYTYPE_PRODUCTION,
FACILITYTYPE_PRODUCTION_ELEMENT,
} FACILITYTYPE_PARSE_STAGE;
@@ -48,8 +50,10 @@ struct
FACILITYTYPE curFacilityTypeData;
FACILITYASSIGNMENTTYPE curAssignmentData;
PRODUCTION_LINE curProductionData;
INT16 curAssignmentType;
INT16 curRisk;
INT16 curProduction;
UINT32 maxArraySize;
UINT32 curIndex;
UINT32 currentDepth;
@@ -125,15 +129,29 @@ void InitAssignmentDataArray( facilitytypeParseData *pData )
pData->curAssignmentData.ubMinimumWisdom = 0;
// Set RISK data
for (UINT16 cnt = 0; cnt < NUM_RISKS; cnt++)
for (UINT16 cnt = 0; cnt < NUM_RISKS; ++cnt)
{
pData->curAssignmentData.Risk[cnt].usChance = 0;
pData->curAssignmentData.Risk[cnt].bBaseEffect = 0;
pData->curAssignmentData.Risk[cnt].ubRange = 0;
}
}
void InitProductionDataArray( facilitytypeParseData *pData )
{
// Set assignment data from memory
swprintf( pData->curProductionData.szProductionName, L"" );
swprintf( pData->curProductionData.szAdditionalRequirementTips, L"" );
pData->curProductionData.usItemToCreate = NOTHING;
pData->curProductionData.sMinutesRequired = 60;
pData->curProductionData.sGridNo_Creation = -1;
pData->curProductionData.usProductionFlags = 0;
pData->curProductionData.sHourlyCost = 0;
pData->curProductionData.usOptional_LoyaltyRequired = 0;
pData->curProductionData.usOptional_PreProducts.clear();
}
static void XMLCALL
facilitytypeStartElementHandle(void *userData, const XML_Char *name, const XML_Char **atts)
@@ -164,6 +182,8 @@ facilitytypeStartElementHandle(void *userData, const XML_Char *name, const XML_C
pData->maxReadDepth++; //we are not skipping this element
pData->curProduction = -1;
//pData->curIndex++;
}
@@ -197,6 +217,35 @@ facilitytypeStartElementHandle(void *userData, const XML_Char *name, const XML_C
pData->maxReadDepth++;
}
// Encountered Production entry
else if ( pData->curElement == FACILITYTYPE_TYPE &&
strcmp( name, "PRODUCTIONLINE" ) == 0 )
{
// Set value to -1, denoting that we have not yet read which production is being described.
pData->curProduction++;
// Reset the array
InitProductionDataArray ( pData );
pData->curElement = FACILITYTYPE_PRODUCTION;
pData->maxReadDepth++;
}
// Encountered production data
else if ( pData->curElement == FACILITYTYPE_PRODUCTION &&
( strcmp( name, "szProductionName" ) == 0 ||
strcmp( name, "szAdditionalRequirementTips" ) == 0 ||
strcmp( name, "usItemToCreate" ) == 0 ||
strcmp( name, "sMinutesRequired" ) == 0 ||
strcmp( name, "sGridNo_Creation" ) == 0 ||
strcmp( name, "requires_staff" ) == 0 ||
strcmp( name, "sHourlyCost" ) == 0 ||
strcmp( name, "usOptional_LoyaltyRequired" ) == 0 ||
strcmp( name, "usOptional_ItemUsedUp" ) == 0 ) )
{
pData->curElement = FACILITYTYPE_PRODUCTION_ELEMENT;
pData->maxReadDepth++;
}
// Encountered assignment data
else if(pData->curElement == FACILITYTYPE_ASSIGNMENT &&
@@ -354,7 +403,6 @@ facilitytypeStartElementHandle(void *userData, const XML_Char *name, const XML_C
pData->maxReadDepth++;
}
else if(pData->curElement == FACILITYTYPE_RISK &&
(strcmp(name, "ubChance") == 0 ||
strcmp(name, "bBaseEffect") == 0 ||
@@ -364,6 +412,20 @@ facilitytypeStartElementHandle(void *userData, const XML_Char *name, const XML_C
pData->maxReadDepth++;
}
else if ( pData->curElement == FACILITYTYPE_PRODUCTION &&
( strcmp( name, "szProductionName" ) == 0 ||
strcmp( name, "szAdditionalRequirementTips" ) == 0 ||
strcmp( name, "usItemToCreate" ) == 0 ||
strcmp( name, "sMinutesRequired" ) == 0 ||
strcmp( name, "sGridNo_Creation" ) == 0 ||
strcmp( name, "requires_staff" ) == 0 ||
strcmp( name, "sHourlyCost" ) == 0 ||
strcmp( name, "usOptional_LoyaltyRequired" ) == 0 ||
strcmp( name, "usOptional_ItemUsedUp" ) == 0 ) )
{
pData->curElement = FACILITYTYPE_PRODUCTION_ELEMENT;
pData->maxReadDepth++;
}
pData->szCharData[0] = '\0';
}
@@ -477,6 +539,9 @@ facilitytypeEndElementHandle(void *userData, const XML_Char *name)
gFacilityTypes[pData->curIndex].AssignmentData[cnt].Risk[cntB].ubRange = pData->curFacilityTypeData.AssignmentData[cnt].Risk[cntB].ubRange;
}
}
// Set production-specific data
gFacilityTypes[pData->curIndex].ProductionData = pData->curFacilityTypeData.ProductionData;
}
else
{
@@ -625,6 +690,23 @@ facilitytypeEndElementHandle(void *userData, const XML_Char *name)
}
}
else if ( strcmp( name, "PRODUCTIONLINE" ) == 0 )
{
pData->curElement = FACILITYTYPE_TYPE;
// Make sure an production is selected for data dump
if ( pData->curProduction == -1 )
{
CHAR16 sErrorString[256];
swprintf( sErrorString, L"FacilityTypes.XML Error: Production data for facility type %d is missing a <ubAssignmentType> tag", pData->curIndex );
SGP_THROW( sErrorString );
}
else
{
// Set data from memory
pData->curFacilityTypeData.ProductionData.push_back( pData->curProductionData );
}
}
////////////////////////////////////////////////
// Specific Assignment Data
@@ -1107,7 +1189,76 @@ facilitytypeEndElementHandle(void *userData, const XML_Char *name)
pData->curElement = FACILITYTYPE_RISK;
pData->curAssignmentData.Risk[pData->curRisk].ubRange = (UINT8) atol(pData->szCharData);
}
else if ( strcmp( name, "szProductionName" ) == 0 )
{
pData->curElement = FACILITYTYPE_PRODUCTION;
MultiByteToWideChar( CP_UTF8, 0, pData->szCharData, -1, pData->curProductionData.szProductionName, sizeof( pData->curProductionData.szProductionName ) / sizeof( pData->curProductionData.szProductionName[0] ) );
pData->curProductionData.szProductionName[sizeof( pData->curProductionData.szProductionName ) / sizeof( pData->curProductionData.szProductionName[0] ) - 1] = '\0';
}
else if ( strcmp( name, "szAdditionalRequirementTips" ) == 0 )
{
pData->curElement = FACILITYTYPE_PRODUCTION;
MultiByteToWideChar( CP_UTF8, 0, pData->szCharData, -1, pData->curProductionData.szAdditionalRequirementTips, sizeof( pData->curProductionData.szAdditionalRequirementTips ) / sizeof( pData->curProductionData.szAdditionalRequirementTips[0] ) );
pData->curProductionData.szAdditionalRequirementTips[sizeof( pData->curProductionData.szAdditionalRequirementTips ) / sizeof( pData->curProductionData.szAdditionalRequirementTips[0] ) - 1] = '\0';
}
else if ( strcmp( name, "usItemToCreate" ) == 0 )
{
pData->curElement = FACILITYTYPE_PRODUCTION;
pData->curProductionData.usItemToCreate = (UINT16)atol( pData->szCharData );
}
else if ( strcmp( name, "sMinutesRequired" ) == 0 )
{
pData->curElement = FACILITYTYPE_PRODUCTION;
pData->curProductionData.sMinutesRequired = max(1, (INT32)atol( pData->szCharData ) );
}
else if ( strcmp( name, "sGridNo_Creation" ) == 0 )
{
pData->curElement = FACILITYTYPE_PRODUCTION;
pData->curProductionData.sGridNo_Creation = (INT32)atol( pData->szCharData );
}
else if ( strcmp( name, "requires_staff" ) == 0 )
{
pData->curElement = FACILITYTYPE_PRODUCTION;
if ( (UINT32)atol( pData->szCharData ) )
pData->curProductionData.usProductionFlags |= REQUIRES_STAFFING;
}
else if ( strcmp( name, "sHourlyCost" ) == 0 )
{
pData->curElement = FACILITYTYPE_PRODUCTION;
pData->curProductionData.sHourlyCost = (INT32)atol( pData->szCharData );
}
else if ( strcmp( name, "usOptional_LoyaltyRequired" ) == 0 )
{
pData->curElement = FACILITYTYPE_PRODUCTION;
pData->curProductionData.usOptional_LoyaltyRequired = (UINT8)atol( pData->szCharData );
}
else if ( strcmp( name, "usOptional_ItemUsedUp" ) == 0 )
{
pData->curElement = FACILITYTYPE_PRODUCTION;
UINT16 requireditem = (UINT16)atol( pData->szCharData );
bool found = false;
for ( std::vector<PRODUCTION_LINE_PREPRODUCT>::size_type i = 0; i < pData->curProductionData.usOptional_PreProducts.size(); ++i )
{
if ( pData->curProductionData.usOptional_PreProducts[i].item == requireditem )
{
pData->curProductionData.usOptional_PreProducts[i].requiredforonecreation++;
found = true;
break;
}
}
if ( !found )
{
PRODUCTION_LINE_PREPRODUCT data;
data.item = requireditem;
data.requiredforonecreation = 1;
pData->curProductionData.usOptional_PreProducts.push_back( data );
}
}
pData->maxReadDepth--;
}
+2
View File
@@ -3091,6 +3091,8 @@ extern STR16 szChatTextEnemy[];
extern STR16 szMilitiaText[];
extern STR16 szFactoryText[];
#define TACTICAL_INVENTORY_DIALOG_NUM 16
#define TACTICAL_COVER_DIALOG_NUM 16
+16
View File
@@ -4237,6 +4237,7 @@ STR16 pMapPopUpInventoryText[] =
L"存货",
L"离开",
L"修理", //L"Repair",
L"Factories", // TODO.Translate
};
// town strings
@@ -5065,6 +5066,7 @@ STR16 pBookMarkStrings[] =
L"安保公司", //L"Kerberus",
L"民兵总览",//L"Militia Overview",
L"R.I.S",
L"Factories", // TODO.Translate
};
STR16 pBookmarkTitle[] =
@@ -5191,6 +5193,7 @@ STR16 pWebPagesTitles[] =
L"Recon情报服务 - 情报需求", //L"Recon Intelligence Services - Information Requests",
L"Recon情报服务 - 情报验证", //L"Recon Intelligence Services - Information Verification",
L"Recon情报服务 - 关于我们", //L"Recon Intelligence Services - About us",
L"Factory Overview", // TODO.Translate
L"Bobby Ray - 最近的运货",
L"百科全书",
L"百科全书 - 数据",
@@ -6995,6 +6998,7 @@ STR16 gzLaptopHelpText[] =
L"Kerberus - 安保公司",//L"Kerberus - Experience In Security",
L"民兵总览",//L"Militia Overview",
L"Recon情报服务", //L"Recon Intelligence Services",
L"Controlled factories", // TODO.Translate
};
@@ -11581,6 +11585,18 @@ STR16 szMilitiaText[] =
L"取消", //L"Cancel",
};
STR16 szFactoryText[] = // TODO.Translate
{
L"%s: Production of %s switched off as loyalty is too low.",
L"%s: Production of %s switched off due to insufficient funds.",
L"%s: Production of %s switched off as it requires a merc to staff the facility.",
L"%s: Production of %s switched off due to required items missing.",
L"Item to build",
L"Preproducts", // 5
L"h/item",
};
// WANNE: Some Chinese specific strings that needs to be in unicode!
STR16 ChineseSpecString1 = L"%"; //defined in _ChineseText.cpp as this file is already unicode
STR16 ChineseSpecString2 = L"*%3d%%%"; //defined in _ChineseText.cpp as this file is already unicode
+16
View File
@@ -4239,6 +4239,7 @@ STR16 pMapPopUpInventoryText[] =
L"Inventaris",
L"OK",
L"Repair", // TODO.Translate
L"Factories", // TODO.Translate
};
// town strings
@@ -5072,6 +5073,7 @@ STR16 pBookMarkStrings[] =
L"Kerberus",
L"Militia Overview", // TODO.Translate
L"R.I.S.",
L"Factories", // TODO.Translate
};
STR16 pBookmarkTitle[] =
@@ -5198,6 +5200,7 @@ STR16 pWebPagesTitles[] =
L"Recon Intelligence Services - Information Requests", // TODO.Translate
L"Recon Intelligence Services - Information Verification",
L"Recon Intelligence Services - About us",
L"Factory Overview", // TODO.Translate
L"Bobby Ray's - Recent Shipments",
L"Encyclopedia",
L"Encyclopedia - Data",
@@ -7011,6 +7014,7 @@ STR16 gzLaptopHelpText[] =
L"Kerberus - Excellence In Security",
L"Militia Overview", // TODO.Translate
L"Recon Intelligence Services", // TODO.Translate
L"Controlled factories", // TODO.Translate
};
@@ -11597,4 +11601,16 @@ STR16 szMilitiaText[] =
L"Cancel",
};
STR16 szFactoryText[] = // TODO.Translate
{
L"%s: Production of %s switched off as loyalty is too low.",
L"%s: Production of %s switched off due to insufficient funds.",
L"%s: Production of %s switched off as it requires a merc to staff the facility.",
L"%s: Production of %s switched off due to required items missing.",
L"Item to build",
L"Preproducts", // 5
L"h/item",
};
#endif //DUTCH
+16
View File
@@ -4237,6 +4237,7 @@ STR16 pMapPopUpInventoryText[] =
L"Inventory",
L"Exit",
L"Repair",
L"Factories",
};
// town strings
@@ -5065,6 +5066,7 @@ STR16 pBookMarkStrings[] =
L"Kerberus",
L"Militia Overview",
L"R.I.S.",
L"Factories",
};
STR16 pBookmarkTitle[] =
@@ -5191,6 +5193,7 @@ STR16 pWebPagesTitles[] =
L"Recon Intelligence Services - Information Requests",
L"Recon Intelligence Services - Information Verification",
L"Recon Intelligence Services - About us",
L"Factory Overview",
L"Bobby Ray's - Recent Shipments",
L"Encyclopedia",
L"Encyclopedia - Data",
@@ -6995,6 +6998,7 @@ STR16 gzLaptopHelpText[] =
L"Kerberus - Experience In Security",
L"Militia Overview",
L"Recon Intelligence Services",
L"Controlled factories",
};
@@ -11581,4 +11585,16 @@ STR16 szMilitiaText[] =
L"Cancel",
};
STR16 szFactoryText[] =
{
L"%s: Production of %s switched off as loyalty is too low.",
L"%s: Production of %s switched off due to insufficient funds.",
L"%s: Production of %s switched off as it requires a merc to staff the facility.",
L"%s: Production of %s switched off due to required items missing.",
L"Item to build",
L"Preproducts", // 5
L"h/item",
};
#endif //ENGLISH
+16
View File
@@ -4243,6 +4243,7 @@ STR16 pMapPopUpInventoryText[] =
L"Inventaire",
L"Quitter",
L"Repair", // TODO.Translate
L"Factories", // TODO.Translate
};
// town strings
@@ -5077,6 +5078,7 @@ STR16 pBookMarkStrings[] =
L"Kerberus",
L"Militia Overview", // TODO.Translate
L"R.I.S.",
L"Factories", // TODO.Translate
};
STR16 pBookmarkTitle[] =
@@ -5203,6 +5205,7 @@ STR16 pWebPagesTitles[] =
L"Recon Intelligence Services - Information Requests", // TODO.Translate
L"Recon Intelligence Services - Information Verification",
L"Recon Intelligence Services - About us",
L"Factory Overview", // TODO.Translate
L"Bobby Ray : Dernières commandes",
L"Encyclopédie",
L"Encyclopédie : Données",
@@ -7008,6 +7011,7 @@ STR16 gzLaptopHelpText[] =
L"Kerberus - Experience In Security",
L"Militia Overview", // TODO.Translate
L"Recon Intelligence Services", // TODO.Translate
L"Controlled factories", // TODO.Translate
};
@@ -11579,4 +11583,16 @@ STR16 szMilitiaText[] =
L"Cancel",
};
STR16 szFactoryText[] = // TODO.Translate
{
L"%s: Production of %s switched off as loyalty is too low.",
L"%s: Production of %s switched off due to insufficient funds.",
L"%s: Production of %s switched off as it requires a merc to staff the facility.",
L"%s: Production of %s switched off due to required items missing.",
L"Item to build",
L"Preproducts", // 5
L"h/item",
};
#endif //FRENCH
+16
View File
@@ -4238,6 +4238,7 @@ STR16 pMapPopUpInventoryText[] =
L"Inventar",
L"Exit",
L"Repair", // TODO.Translate
L"Factories", // TODO.Translate
};
// town strings
@@ -5021,6 +5022,7 @@ STR16 pBookMarkStrings[] =
L"Kerberus",
L"Militia Overview", // TODO.Translate
L"R.I.S.",
L"Factories", // TODO.Translate
};
STR16 pBookmarkTitle[] =
@@ -5139,6 +5141,7 @@ STR16 pWebPagesTitles[] =
L"Recon Intelligence Services - Information Requests", // TODO.Translate
L"Recon Intelligence Services - Information Verification",
L"Recon Intelligence Services - About us",
L"Fabriken - Übersicht",
L"Bobby Rays - Letzte Lieferungen",
L"Enzyklopädie",
L"Enzyklopädie - Daten",
@@ -6841,6 +6844,7 @@ STR16 gzLaptopHelpText[] =
L"Kerberus - Experience In Security",
L"Militia Overview", // TODO.Translate
L"Recon Intelligence Services", // TODO.Translate
L"Controlled factories", // TODO.Translate
};
STR16 gzHelpScreenText[] =
@@ -11409,4 +11413,16 @@ STR16 szMilitiaText[] =
L"Cancel",
};
STR16 szFactoryText[] = // TODO.Translate
{
L"%s: Production of %s switched off as loyalty is too low.",
L"%s: Production of %s switched off due to insufficient funds.",
L"%s: Production of %s switched off as it requires a merc to staff the facility.",
L"%s: Production of %s switched off due to required items missing.",
L"Item to build",
L"Preproducts", // 5
L"h/item",
};
#endif //GERMAN
+16
View File
@@ -4233,6 +4233,7 @@ STR16 pMapPopUpInventoryText[] =
L"Inventario",
L"Uscita",
L"Repair", // TODO.Translate
L"Factories", // TODO.Translate
};
// town strings
@@ -5059,6 +5060,7 @@ STR16 pBookMarkStrings[] =
L"Kerberus",
L"Militia Overview", // TODO.Translate
L"R.I.S.",
L"Factories", // TODO.Translate
};
STR16 pBookmarkTitle[] =
@@ -5185,6 +5187,7 @@ STR16 pWebPagesTitles[] =
L"Recon Intelligence Services - Information Requests", // TODO.Translate
L"Recon Intelligence Services - Information Verification",
L"Recon Intelligence Services - About us",
L"Factory Overview", // TODO.Translate
L"Bobby Ray's - Recent Shipments",
L"Encyclopedia",
L"Encyclopedia - Data",
@@ -6995,6 +6998,7 @@ STR16 gzLaptopHelpText[] =
L"Kerberus - Experience In Security",
L"Militia Overview", // TODO.Translate
L"Recon Intelligence Services", // TODO.Translate
L"Controlled factories", // TODO.Translate
};
@@ -11588,4 +11592,16 @@ STR16 szMilitiaText[] =
L"Cancel",
};
STR16 szFactoryText[] = // TODO.Translate
{
L"%s: Production of %s switched off as loyalty is too low.",
L"%s: Production of %s switched off due to insufficient funds.",
L"%s: Production of %s switched off as it requires a merc to staff the facility.",
L"%s: Production of %s switched off due to required items missing.",
L"Item to build",
L"Preproducts", // 5
L"h/item",
};
#endif //ITALIAN
+16
View File
@@ -4244,6 +4244,7 @@ STR16 pMapPopUpInventoryText[] =
L"Inwentarz",
L"Zamknij",
L"Repair", // TODO.Translate
L"Factories", // TODO.Translate
};
// town strings
@@ -5074,6 +5075,7 @@ STR16 pBookMarkStrings[] =
L"Kerberus",
L"Militia Overview", // TODO.Translate
L"R.I.S.",
L"Factories", // TODO.Translate
};
STR16 pBookmarkTitle[] =
@@ -5200,6 +5202,7 @@ STR16 pWebPagesTitles[] =
L"Recon Intelligence Services - Information Requests", // TODO.Translate
L"Recon Intelligence Services - Information Verification",
L"Recon Intelligence Services - About us",
L"Factory Overview", // TODO.Translate
L"Bobby Ray's - Ostatnie dostawy",
L"Encyclopedia",
L"Encyclopedia - Dane",
@@ -7009,6 +7012,7 @@ STR16 gzLaptopHelpText[] =
L"Kerberus - Experience In Security",
L"Militia Overview", // TODO.Translate
L"Recon Intelligence Services", // TODO.Translate
L"Controlled factories", // TODO.Translate
};
@@ -11601,4 +11605,16 @@ STR16 szMilitiaText[] =
L"Cancel",
};
STR16 szFactoryText[] = // TODO.Translate
{
L"%s: Production of %s switched off as loyalty is too low.",
L"%s: Production of %s switched off due to insufficient funds.",
L"%s: Production of %s switched off as it requires a merc to staff the facility.",
L"%s: Production of %s switched off due to required items missing.",
L"Item to build",
L"Preproducts", // 5
L"h/item",
};
#endif //POLISH
+16
View File
@@ -4237,6 +4237,7 @@ STR16 pMapPopUpInventoryText[] =
L"Инвентарь",
L"Выйти",
L"Ремонт",
L"Factories", // TODO.Translate
};
// town strings
@@ -5065,6 +5066,7 @@ STR16 pBookMarkStrings[] =
L"Цербер",
L"Ополчение",
L"R.I.S.",
L"Factories", // TODO.Translate
};
STR16 pBookmarkTitle[] =
@@ -5191,6 +5193,7 @@ STR16 pWebPagesTitles[] =
L"Recon Intelligence Services - Information Requests", // TODO.Translate
L"Recon Intelligence Services - Information Verification",
L"Recon Intelligence Services - About us",
L"Factory Overview", // TODO.Translate
L"Бобби Рэй - последние поступления",
L"Энциклопедия",
L"Энциклопедия - данные",
@@ -6995,6 +6998,7 @@ STR16 gzLaptopHelpText[] =
L"Цербер - Опыт в безопасности",
L"Ополчение",
L"Recon Intelligence Services", // TODO.Translate
L"Controlled factories", // TODO.Translate
};
@@ -11581,4 +11585,16 @@ STR16 szMilitiaText[] =
L"Cancel",
};
STR16 szFactoryText[] = // TODO.Translate
{
L"%s: Production of %s switched off as loyalty is too low.",
L"%s: Production of %s switched off due to insufficient funds.",
L"%s: Production of %s switched off as it requires a merc to staff the facility.",
L"%s: Production of %s switched off due to required items missing.",
L"Item to build",
L"Preproducts", // 5
L"h/item",
};
#endif //RUSSIAN