Files
gtav-src/script/dev_ng/singleplayer/include/public/finance_control_public.sch
T
2025-09-29 00:52:08 +02:00

4991 lines
184 KiB
Scheme
Executable File

USING "rage_builtins.sch"
USING "globals.sch"
USING "commands_stats.sch"
USING "stats_enums.sch"
USING "shared_debug_text.sch"
USING "finance_modifiers_public.sch"
USING "completionpercentage_public.sch"
USING "script_clock.sch"
USING "commands_socialclub.sch"
USING "commands_stats.sch"
USING "flow_help_public.sch"
USING "achievement_public.sch"
USING "net_system_activity_feed.sch"
CONST_INT BAWSAQ_ONLINE_SYNC_TIMER 120000 //Every 2 minutes. The frequency at which we attempt to read online stock values for BAWSAQ.
CONST_INT STOCK_MARKET_LOG_UPDATE_MINS 480 //In-game minutes between each log update. 480 mins = 8 hours = 3 updates per day.
CONST_INT STOCK_MARKET_TICK_UPDATES_PER_LOG 16 //The number of simulation tick updates in between each log update.
CONST_INT STOCK_MARKET_LOG_UPDATES_PER_DAY 3 //The number of log tick updates each in-game day.
// *****************************************************************************************
// *****************************************************************************************
// *****************************************************************************************
//
// MISSION NAME : finance_control_public.sch
// AUTHOR : Ak
// DESCRIPTION : Interfaces allowing transactions involving the player's account/s
// and the stock market
//
// *****************************************************************************************
// *****************************************************************************************
// *****************************************************************************************
/// PURPOSE:
/// Helper function for reading stock totals from player portfolio
/// PARAMS:
/// iChar - char id
/// entry - portfolio index
/// RETURNS:
/// Amount of shares owned by character.
FUNC INT GET_OWNED_TOTAL_FROM_PORTFOLIO(INT iChar, INT entry)
IF entry < 0 OR entry > MAX_BAWSAQ_PORTFOLIO_ENTRIES_PER_TRADER-1
RETURN 0
ENDIF
SWITCH iChar
CASE 0 RETURN g_savedGlobals.sFinanceData.MIKE_SHARES_OWNED[entry] BREAK
CASE 1 RETURN g_savedGlobals.sFinanceData.FRANKLIN_SHARES_OWNED[entry] BREAK
CASE 2 RETURN g_savedGlobals.sFinanceData.TREVOR_SHARES_OWNED[entry] BREAK
ENDSWITCH
// Invalid char.
RETURN 0
ENDFUNC
/// PURPOSE:
/// Searches for the total owned in the specific company by the player
/// PARAMS:
/// iChar -
/// companyIndex -
FUNC INT GET_OWNED_TOTAL_FROM_PORTFOLIO_BY_COMPANY(INT iChar, INT companyIndex)
INT i
REPEAT MAX_BAWSAQ_PORTFOLIO_ENTRIES_PER_TRADER i
SWITCH iChar
//Michael.
CASE 0
IF g_savedGlobals.sFinanceData.MIKE_SHARES_COMPANY_INDEX[i] = companyIndex
IF g_savedGlobals.sFinanceData.MIKE_SHARES_OWNED[i] > 0
RETURN g_savedGlobals.sFinanceData.MIKE_SHARES_OWNED[i]
ENDIF
ENDIF
BREAK
//Franklin.
CASE 1
IF g_savedGlobals.sFinanceData.FRANKLIN_SHARES_COMPANY_INDEX[i] = companyIndex
IF g_savedGlobals.sFinanceData.FRANKLIN_SHARES_OWNED[i] > 0
RETURN g_savedGlobals.sFinanceData.FRANKLIN_SHARES_OWNED[i]
ENDIF
ENDIF
BREAK
//Trevor.
CASE 2
IF g_savedGlobals.sFinanceData.TREVOR_SHARES_COMPANY_INDEX[i] = companyIndex
IF g_savedGlobals.sFinanceData.TREVOR_SHARES_OWNED[i] > 0
RETURN g_savedGlobals.sFinanceData.TREVOR_SHARES_OWNED[i]
ENDIF
ENDIF
BREAK
ENDSWITCH
ENDREPEAT
RETURN 0
ENDFUNC
/// PURPOSE:
/// Updates the owned totals for a specific player character.
/// This is so that the social club can track current owned values.
PROC UPDATE_SOCIAL_CLUB_BAWSAQ_PORTFOLIO_STATS_FOR_CHARACTER(INT paramCharIndex)
CDEBUG1LN(DEBUG_BAWSAQ, "Updating character ", paramCharIndex, "'s owned stats for social club.")
INT i
REPEAT BS_CO_TOTAL_LISTINGS i
IF g_BS_Listings[i].bOnlineStock
INT si = g_BS_Listings[i].StatIndex
IF si > -1
INT iStocksOwned = GET_OWNED_TOTAL_FROM_PORTFOLIO_BY_COMPANY(paramCharIndex, i)
IF g_BS_Listings[i].fCurrentPrice <= 0
iStocksOwned = 0 // Currently pretend that the stocks owned is 0, because the current price is a bad value
CDEBUG1LN(DEBUG_BAWSAQ, "Invalid current price for index: ", i, " Currently pretend that the stocks owned is 0, because the current price is a bad value")
ENDIF
CDEBUG1LN(DEBUG_BAWSAQ, "Setting stocks owned to ", iStocksOwned, " for SC stat with hash ", g_BS_OIndexData[si].OnlineCharOwned[paramCharIndex], ".")
STAT_SET_INT(g_BS_OIndexData[si].OnlineCharOwned[paramCharIndex], iStocksOwned)
ENDIF
ENDIF
ENDREPEAT
ENDPROC
/// PURPOSE:
/// Updates the owned totals for all player characters.
/// This is so that the social club can track current owned values.
PROC UPDATE_SOCIAL_CLUB_BAWSAQ_PORTFOLIO_STATS()
CDEBUG1LN(DEBUG_BAWSAQ, "Updating portfolio owned stats for all characters.")
UPDATE_SOCIAL_CLUB_BAWSAQ_PORTFOLIO_STATS_FOR_CHARACTER(0)
UPDATE_SOCIAL_CLUB_BAWSAQ_PORTFOLIO_STATS_FOR_CHARACTER(1)
UPDATE_SOCIAL_CLUB_BAWSAQ_PORTFOLIO_STATS_FOR_CHARACTER(2)
ENDPROC
/// PURPOSE:
/// Gets company index for the given player portfolio index
/// PARAMS:
/// iChar -
/// entry -
/// RETURNS:
///
FUNC BAWSAQ_COMPANIES GET_COMPANY_INDEX_FROM_PORTFOLIO(INT iChar, INT entry)
IF entry < 0 OR entry > MAX_BAWSAQ_PORTFOLIO_ENTRIES_PER_TRADER-1
RETURN BS_CO_SHT
ENDIF
SWITCH iChar
CASE 0
RETURN INT_TO_ENUM(BAWSAQ_COMPANIES, g_savedGlobals.sFinanceData.MIKE_SHARES_COMPANY_INDEX[entry])
CASE 1
RETURN INT_TO_ENUM(BAWSAQ_COMPANIES,g_savedGlobals.sFinanceData.FRANKLIN_SHARES_COMPANY_INDEX[entry])
CASE 2
RETURN INT_TO_ENUM(BAWSAQ_COMPANIES,g_savedGlobals.sFinanceData.TREVOR_SHARES_COMPANY_INDEX[entry])
ENDSWITCH
// Invalid char.
RETURN BS_CO_SHT
ENDFUNC
/// PURPOSE:
/// Sets company index for the given player at the given portfolio index.
PROC SET_COMPANY_INDEX_FROM_PORTFOLIO(INT iChar, INT entry, BAWSAQ_COMPANIES bsco)
//MAX_BAWSAQ_PORTFOLIO_ENTRIES_PER_TRADER
IF entry < 0 OR entry > MAX_BAWSAQ_PORTFOLIO_ENTRIES_PER_TRADER-1
EXIT
ENDIF
SWITCH iChar
CASE 0
g_savedGlobals.sFinanceData.MIKE_SHARES_COMPANY_INDEX[entry] = ENUM_TO_INT(bsco)
BREAK
CASE 1
g_savedGlobals.sFinanceData.FRANKLIN_SHARES_COMPANY_INDEX[entry] = ENUM_TO_INT(bsco)
BREAK
CASE 2
g_savedGlobals.sFinanceData.TREVOR_SHARES_COMPANY_INDEX[entry] = ENUM_TO_INT(bsco)
BREAK
ENDSWITCH
//invalid char
EXIT
ENDPROC
/// PURPOSE:
/// REturns how much of the given stock the player owns
/// PARAMS:
/// coindex - the company to look for
/// RETURNS:
/// the amount of stock owned of that company by the player
FUNC INT GET_PLAYER_AMOUNT_OF_STOCK_OWNED( BAWSAQ_COMPANIES coindex, BAWSAQ_TRADERS trader)
INT i = 0
CPRINTLN(DEBUG_STOCKS, "GET_PLAYER_AMOUNT_OF_STOCK_OWNED: company - ", coindex, " trader - ", trader, ".")
REPEAT MAX_BAWSAQ_PORTFOLIO_ENTRIES_PER_TRADER i
IF GET_COMPANY_INDEX_FROM_PORTFOLIO(ENUM_TO_INT(trader),i) = coindex
IF GET_OWNED_TOTAL_FROM_PORTFOLIO(ENUM_TO_INT(trader),i) > 0
RETURN GET_OWNED_TOTAL_FROM_PORTFOLIO(ENUM_TO_INT(trader),i)
ENDIF
ENDIF
ENDREPEAT
RETURN 0
ENDFUNC
/// PURPOSE:
/// Sets the invested value for the given share in the player's portfolio
/// PARAMS:
/// iChar -
/// entry -
/// val -
/// increment -
PROC SET_INVESTED_TOTAL_FROM_PORTFOLIO(INT iChar,INT entry, FLOAT val, BOOL increment = FALSE)
//MAX_BAWSAQ_PORTFOLIO_ENTRIES_PER_TRADER
IF entry < 0 OR entry > MAX_BAWSAQ_PORTFOLIO_ENTRIES_PER_TRADER-1
EXIT
ENDIF
IF increment
SWITCH iChar
CASE 0
g_savedGlobals.sFinanceData.MIKE_SHARES_INVESTED[entry] += val
IF g_savedGlobals.sFinanceData.MIKE_SHARES_INVESTED[entry] < 0
g_savedGlobals.sFinanceData.MIKE_SHARES_INVESTED[entry] = 0
ENDIF
BREAK
CASE 1
g_savedGlobals.sFinanceData.FRANKLIN_SHARES_INVESTED[entry] += val
IF g_savedGlobals.sFinanceData.FRANKLIN_SHARES_INVESTED[entry] < 0
g_savedGlobals.sFinanceData.FRANKLIN_SHARES_INVESTED[entry] = 0
ENDIF
BREAK
CASE 2
g_savedGlobals.sFinanceData.TREVOR_SHARES_INVESTED[entry] += val
IF g_savedGlobals.sFinanceData.TREVOR_SHARES_INVESTED[entry] < 0
g_savedGlobals.sFinanceData.TREVOR_SHARES_INVESTED[entry] = 0
ENDIF
BREAK
ENDSWITCH
ELSE
SWITCH iChar
CASE 0
g_savedGlobals.sFinanceData.MIKE_SHARES_INVESTED[entry] = val
IF g_savedGlobals.sFinanceData.MIKE_SHARES_INVESTED[entry] < 0
g_savedGlobals.sFinanceData.MIKE_SHARES_INVESTED[entry] = 0
ENDIF
BREAK
CASE 1
g_savedGlobals.sFinanceData.FRANKLIN_SHARES_INVESTED[entry] = val
IF g_savedGlobals.sFinanceData.FRANKLIN_SHARES_INVESTED[entry] < 0
g_savedGlobals.sFinanceData.FRANKLIN_SHARES_INVESTED[entry] = 0
ENDIF
BREAK
CASE 2
g_savedGlobals.sFinanceData.TREVOR_SHARES_INVESTED[entry] = val
IF g_savedGlobals.sFinanceData.TREVOR_SHARES_INVESTED[entry] < 0
g_savedGlobals.sFinanceData.TREVOR_SHARES_INVESTED[entry] = 0
ENDIF
BREAK
ENDSWITCH
ENDIF
//invalid char
EXIT
ENDPROC
/// PURPOSE:
/// Sets the owned value for the given portfolio entry
/// PARAMS:
/// iChar -
/// entry -
/// ownedval -
/// increment -
PROC SET_OWNED_TOTAL_FROM_PORTFOLIO(INT iChar,INT entry, INT ownedval, BOOL increment = false)
//MAX_BAWSAQ_PORTFOLIO_ENTRIES_PER_TRADER
IF entry < 0 OR entry > MAX_BAWSAQ_PORTFOLIO_ENTRIES_PER_TRADER-1
EXIT
ENDIF
BAWSAQ_COMPANIES stock_name
SWITCH iChar
CASE 0
//g_savedGlobals.sFinanceData.MIKE_SHARES_OWNED[entry] += ownedval
stock_name = INT_TO_ENUM( BAWSAQ_COMPANIES, g_savedGlobals.sFinanceData.MIKE_SHARES_COMPANY_INDEX[entry])
BREAK
CASE 1
//g_savedGlobals.sFinanceData.FRANKLIN_SHARES_OWNED[entry] += ownedval
stock_name = INT_TO_ENUM( BAWSAQ_COMPANIES,g_savedGlobals.sFinanceData.FRANKLIN_SHARES_COMPANY_INDEX[entry])
BREAK
CASE 2
//g_savedGlobals.sFinanceData.TREVOR_SHARES_OWNED[entry] += ownedval
stock_name = INT_TO_ENUM( BAWSAQ_COMPANIES,g_savedGlobals.sFinanceData.TREVOR_SHARES_COMPANY_INDEX[entry])
BREAK
ENDSWITCH
IF g_BS_Listings[stock_name].fCurrentPrice <= 0
CPRINTLN(DEBUG_STOCKS, "Bailed changing owned total for char ", iChar, "'s portfolio index ", entry, " due to stock having invalid current price.")
EXIT
ENDIF
INT nVal = 0
IF increment
SWITCH iChar
CASE 0
g_savedGlobals.sFinanceData.MIKE_SHARES_OWNED[entry] += ownedval
nVal = g_savedGlobals.sFinanceData.MIKE_SHARES_OWNED[entry]
BREAK
CASE 1
g_savedGlobals.sFinanceData.FRANKLIN_SHARES_OWNED[entry] += ownedval
nVal = g_savedGlobals.sFinanceData.FRANKLIN_SHARES_OWNED[entry]
BREAK
CASE 2
g_savedGlobals.sFinanceData.TREVOR_SHARES_OWNED[entry] += ownedval
nVal = g_savedGlobals.sFinanceData.TREVOR_SHARES_OWNED[entry]
BREAK
ENDSWITCH
ELSE
SWITCH iChar
CASE 0
g_savedGlobals.sFinanceData.MIKE_SHARES_OWNED[entry] = ownedval
nVal = g_savedGlobals.sFinanceData.MIKE_SHARES_OWNED[entry]
BREAK
CASE 1
g_savedGlobals.sFinanceData.FRANKLIN_SHARES_OWNED[entry] = ownedval
nVal = g_savedGlobals.sFinanceData.FRANKLIN_SHARES_OWNED[entry]
BREAK
CASE 2
g_savedGlobals.sFinanceData.TREVOR_SHARES_OWNED[entry] = ownedval
nVal = g_savedGlobals.sFinanceData.TREVOR_SHARES_OWNED[entry]
BREAK
ENDSWITCH
ENDIF
//fix for 1612899
IF g_BS_Listings[stock_name].bOnlineStock
INT si = g_BS_Listings[stock_name].StatIndex
IF si > -1
STAT_SET_INT(g_BS_OIndexData[si].OnlineCharOwned[iChar] , nVal)
ENDIF
ENDIF
//invalid char
EXIT
ENDPROC
/// PURPOSE:
/// Snapshots the bank and stock system state to a buffer
/// Used on repeat play and checkpoints
/// PARAMS:
/// bCheckpoint - checkpoint or from start
PROC COPY_BANK_TRANSLOGS_CLF(BOOL bCheckpoint = true)
CPRINTLN(DEBUG_STOCKS, "Snapshotting stock and bank state to be used for repeat play and checkpoint restoration...")
INT i = 0
INT j = 0
REPEAT MAX_BANK_ACCOUNTS i
REPEAT MAX_BANK_ACCOUNT_LOG_ENTRIES j
g_savedGlobalsClifford.sFinanceData.PLAYER_ACCOUNT_LOGS[i].LogEntries[j].eTypeCheckpoint = g_savedGlobalsClifford.sFinanceData.PLAYER_ACCOUNT_LOGS[i].LogEntries[j].eType
g_savedGlobalsClifford.sFinanceData.PLAYER_ACCOUNT_LOGS[i].LogEntries[j].eBaacSourceCheckpoint = g_savedGlobalsClifford.sFinanceData.PLAYER_ACCOUNT_LOGS[i].LogEntries[j].eBaacSource
g_savedGlobalsClifford.sFinanceData.PLAYER_ACCOUNT_LOGS[i].LogEntries[j].iDegreeCheckpoint = g_savedGlobalsClifford.sFinanceData.PLAYER_ACCOUNT_LOGS[i].LogEntries[j].iDegree
ENDREPEAT
ENDREPEAT
REPEAT MAX_BAWSAQ_PORTFOLIO_ENTRIES_PER_TRADER i
g_sPortfolioSnapshot.MIKE_SHARES_COMPANY_INDEX[i][0] = g_savedGlobalsClifford.sFinanceData.MIKE_SHARES_COMPANY_INDEX[i]
g_sPortfolioSnapshot.MIKE_SHARES_INVESTED[i][0] = g_savedGlobalsClifford.sFinanceData.MIKE_SHARES_INVESTED[i]
g_sPortfolioSnapshot.MIKE_SHARES_OWNED[i][0] = g_savedGlobalsClifford.sFinanceData.MIKE_SHARES_OWNED[i]
g_sPortfolioSnapshot.FRANKLIN_SHARES_COMPANY_INDEX[i][0] = g_savedGlobalsClifford.sFinanceData.FRANKLIN_SHARES_COMPANY_INDEX[i]
g_sPortfolioSnapshot.FRANKLIN_SHARES_INVESTED[i][0] = g_savedGlobalsClifford.sFinanceData.FRANKLIN_SHARES_INVESTED[i]
g_sPortfolioSnapshot.FRANKLIN_SHARES_OWNED[i][0] = g_savedGlobalsClifford.sFinanceData.FRANKLIN_SHARES_OWNED[i]
g_sPortfolioSnapshot.TREVOR_SHARES_COMPANY_INDEX[i][0] = g_savedGlobalsClifford.sFinanceData.TREVOR_SHARES_COMPANY_INDEX[i]
g_sPortfolioSnapshot.TREVOR_SHARES_INVESTED[i][0] = g_savedGlobalsClifford.sFinanceData.TREVOR_SHARES_INVESTED[i]
g_sPortfolioSnapshot.TREVOR_SHARES_OWNED[i][0] = g_savedGlobalsClifford.sFinanceData.TREVOR_SHARES_OWNED[i]
IF NOT bCheckpoint
g_sPortfolioSnapshot.MIKE_SHARES_COMPANY_INDEX[i][1] = g_savedGlobalsClifford.sFinanceData.MIKE_SHARES_COMPANY_INDEX[i]
g_sPortfolioSnapshot.MIKE_SHARES_INVESTED[i][1] = g_savedGlobalsClifford.sFinanceData.MIKE_SHARES_INVESTED[i]
g_sPortfolioSnapshot.MIKE_SHARES_OWNED[i][1] = g_savedGlobalsClifford.sFinanceData.MIKE_SHARES_OWNED[i]
g_sPortfolioSnapshot.FRANKLIN_SHARES_COMPANY_INDEX[i][1] = g_savedGlobalsClifford.sFinanceData.FRANKLIN_SHARES_COMPANY_INDEX[i]
g_sPortfolioSnapshot.FRANKLIN_SHARES_INVESTED[i][1] = g_savedGlobalsClifford.sFinanceData.FRANKLIN_SHARES_INVESTED[i]
g_sPortfolioSnapshot.FRANKLIN_SHARES_OWNED[i][1] = g_savedGlobalsClifford.sFinanceData.FRANKLIN_SHARES_OWNED[i]
g_sPortfolioSnapshot.TREVOR_SHARES_COMPANY_INDEX[i][1] = g_savedGlobalsClifford.sFinanceData.TREVOR_SHARES_COMPANY_INDEX[i]
g_sPortfolioSnapshot.TREVOR_SHARES_INVESTED[i][1] = g_savedGlobalsClifford.sFinanceData.TREVOR_SHARES_INVESTED[i]
g_sPortfolioSnapshot.TREVOR_SHARES_OWNED[i][1] = g_savedGlobalsClifford.sFinanceData.TREVOR_SHARES_OWNED[i]
ENDIF
ENDREPEAT
CPRINTLN(DEBUG_STOCKS, "...Snapshotting finished.")
ENDPROC
/// PURPOSE:
/// Snapshots the bank and stock system state to a buffer
/// Used on repeat play and checkpoints
/// PARAMS:
/// bCheckpoint - checkpoint or from start
PROC COPY_BANK_TRANSLOGS_NRM(BOOL bCheckpoint = true)
CPRINTLN(DEBUG_STOCKS, "Snapshotting stock and bank state to be used for repeat play and checkpoint restoration...")
INT i = 0
INT j = 0
REPEAT MAX_BANK_ACCOUNTS i
REPEAT MAX_BANK_ACCOUNT_LOG_ENTRIES j
g_savedGlobalsnorman.sFinanceData.PLAYER_ACCOUNT_LOGS[i].LogEntries[j].eTypeCheckpoint = g_savedGlobalsnorman.sFinanceData.PLAYER_ACCOUNT_LOGS[i].LogEntries[j].eType
g_savedGlobalsnorman.sFinanceData.PLAYER_ACCOUNT_LOGS[i].LogEntries[j].eBaacSourceCheckpoint = g_savedGlobalsnorman.sFinanceData.PLAYER_ACCOUNT_LOGS[i].LogEntries[j].eBaacSource
g_savedGlobalsnorman.sFinanceData.PLAYER_ACCOUNT_LOGS[i].LogEntries[j].iDegreeCheckpoint = g_savedGlobalsnorman.sFinanceData.PLAYER_ACCOUNT_LOGS[i].LogEntries[j].iDegree
ENDREPEAT
ENDREPEAT
REPEAT MAX_BAWSAQ_PORTFOLIO_ENTRIES_PER_TRADER i
g_sPortfolioSnapshot.MIKE_SHARES_COMPANY_INDEX[i][0] = g_savedGlobalsnorman.sFinanceData.MIKE_SHARES_COMPANY_INDEX[i]
g_sPortfolioSnapshot.MIKE_SHARES_INVESTED[i][0] = g_savedGlobalsnorman.sFinanceData.MIKE_SHARES_INVESTED[i]
g_sPortfolioSnapshot.MIKE_SHARES_OWNED[i][0] = g_savedGlobalsnorman.sFinanceData.MIKE_SHARES_OWNED[i]
g_sPortfolioSnapshot.FRANKLIN_SHARES_COMPANY_INDEX[i][0] = g_savedGlobalsnorman.sFinanceData.FRANKLIN_SHARES_COMPANY_INDEX[i]
g_sPortfolioSnapshot.FRANKLIN_SHARES_INVESTED[i][0] = g_savedGlobalsnorman.sFinanceData.FRANKLIN_SHARES_INVESTED[i]
g_sPortfolioSnapshot.FRANKLIN_SHARES_OWNED[i][0] = g_savedGlobalsnorman.sFinanceData.FRANKLIN_SHARES_OWNED[i]
g_sPortfolioSnapshot.TREVOR_SHARES_COMPANY_INDEX[i][0] = g_savedGlobalsnorman.sFinanceData.TREVOR_SHARES_COMPANY_INDEX[i]
g_sPortfolioSnapshot.TREVOR_SHARES_INVESTED[i][0] = g_savedGlobalsnorman.sFinanceData.TREVOR_SHARES_INVESTED[i]
g_sPortfolioSnapshot.TREVOR_SHARES_OWNED[i][0] = g_savedGlobalsnorman.sFinanceData.TREVOR_SHARES_OWNED[i]
IF NOT bCheckpoint
g_sPortfolioSnapshot.MIKE_SHARES_COMPANY_INDEX[i][1] = g_savedGlobalsnorman.sFinanceData.MIKE_SHARES_COMPANY_INDEX[i]
g_sPortfolioSnapshot.MIKE_SHARES_INVESTED[i][1] = g_savedGlobalsnorman.sFinanceData.MIKE_SHARES_INVESTED[i]
g_sPortfolioSnapshot.MIKE_SHARES_OWNED[i][1] = g_savedGlobalsnorman.sFinanceData.MIKE_SHARES_OWNED[i]
g_sPortfolioSnapshot.FRANKLIN_SHARES_COMPANY_INDEX[i][1] = g_savedGlobalsnorman.sFinanceData.FRANKLIN_SHARES_COMPANY_INDEX[i]
g_sPortfolioSnapshot.FRANKLIN_SHARES_INVESTED[i][1] = g_savedGlobalsnorman.sFinanceData.FRANKLIN_SHARES_INVESTED[i]
g_sPortfolioSnapshot.FRANKLIN_SHARES_OWNED[i][1] = g_savedGlobalsnorman.sFinanceData.FRANKLIN_SHARES_OWNED[i]
g_sPortfolioSnapshot.TREVOR_SHARES_COMPANY_INDEX[i][1] = g_savedGlobalsnorman.sFinanceData.TREVOR_SHARES_COMPANY_INDEX[i]
g_sPortfolioSnapshot.TREVOR_SHARES_INVESTED[i][1] = g_savedGlobalsnorman.sFinanceData.TREVOR_SHARES_INVESTED[i]
g_sPortfolioSnapshot.TREVOR_SHARES_OWNED[i][1] = g_savedGlobalsnorman.sFinanceData.TREVOR_SHARES_OWNED[i]
ENDIF
ENDREPEAT
CPRINTLN(DEBUG_STOCKS, "...Snapshotting finished.")
ENDPROC
/// PURPOSE:
/// Snapshots the bank and stock system state to a buffer
/// Used on repeat play and checkpoints
/// PARAMS:
/// bCheckpoint - checkpoint or from start
PROC COPY_BANK_TRANSLOGS(BOOL bCheckpoint = true)
#if USE_CLF_DLC
if g_bLoadedClifford
COPY_BANK_TRANSLOGS_CLF()
exit
endif
#endif
#if USE_NRM_DLC
if g_bLoadedNorman
COPY_BANK_TRANSLOGS_NRM()
EXIT
ENDIF
#ENDIF
CPRINTLN(DEBUG_STOCKS, "Snapshotting stock and bank state to be used for repeat play and checkpoint restoration...")
INT i = 0
INT j = 0
REPEAT MAX_BANK_ACCOUNTS i
REPEAT MAX_BANK_ACCOUNT_LOG_ENTRIES j
g_savedGlobals.sFinanceData.PLAYER_ACCOUNT_LOGS[i].LogEntries[j].eTypeCheckpoint = g_savedGlobals.sFinanceData.PLAYER_ACCOUNT_LOGS[i].LogEntries[j].eType
g_savedGlobals.sFinanceData.PLAYER_ACCOUNT_LOGS[i].LogEntries[j].eBaacSourceCheckpoint = g_savedGlobals.sFinanceData.PLAYER_ACCOUNT_LOGS[i].LogEntries[j].eBaacSource
g_savedGlobals.sFinanceData.PLAYER_ACCOUNT_LOGS[i].LogEntries[j].iDegreeCheckpoint = g_savedGlobals.sFinanceData.PLAYER_ACCOUNT_LOGS[i].LogEntries[j].iDegree
ENDREPEAT
ENDREPEAT
REPEAT MAX_BAWSAQ_PORTFOLIO_ENTRIES_PER_TRADER i
g_sPortfolioSnapshot.MIKE_SHARES_COMPANY_INDEX[i][0] = g_savedGlobals.sFinanceData.MIKE_SHARES_COMPANY_INDEX[i]
g_sPortfolioSnapshot.MIKE_SHARES_INVESTED[i][0] = g_savedGlobals.sFinanceData.MIKE_SHARES_INVESTED[i]
g_sPortfolioSnapshot.MIKE_SHARES_OWNED[i][0] = g_savedGlobals.sFinanceData.MIKE_SHARES_OWNED[i]
g_sPortfolioSnapshot.FRANKLIN_SHARES_COMPANY_INDEX[i][0] = g_savedGlobals.sFinanceData.FRANKLIN_SHARES_COMPANY_INDEX[i]
g_sPortfolioSnapshot.FRANKLIN_SHARES_INVESTED[i][0] = g_savedGlobals.sFinanceData.FRANKLIN_SHARES_INVESTED[i]
g_sPortfolioSnapshot.FRANKLIN_SHARES_OWNED[i][0] = g_savedGlobals.sFinanceData.FRANKLIN_SHARES_OWNED[i]
g_sPortfolioSnapshot.TREVOR_SHARES_COMPANY_INDEX[i][0] = g_savedGlobals.sFinanceData.TREVOR_SHARES_COMPANY_INDEX[i]
g_sPortfolioSnapshot.TREVOR_SHARES_INVESTED[i][0] = g_savedGlobals.sFinanceData.TREVOR_SHARES_INVESTED[i]
g_sPortfolioSnapshot.TREVOR_SHARES_OWNED[i][0] = g_savedGlobals.sFinanceData.TREVOR_SHARES_OWNED[i]
IF NOT bCheckpoint
g_sPortfolioSnapshot.MIKE_SHARES_COMPANY_INDEX[i][1] = g_savedGlobals.sFinanceData.MIKE_SHARES_COMPANY_INDEX[i]
g_sPortfolioSnapshot.MIKE_SHARES_INVESTED[i][1] = g_savedGlobals.sFinanceData.MIKE_SHARES_INVESTED[i]
g_sPortfolioSnapshot.MIKE_SHARES_OWNED[i][1] = g_savedGlobals.sFinanceData.MIKE_SHARES_OWNED[i]
g_sPortfolioSnapshot.FRANKLIN_SHARES_COMPANY_INDEX[i][1] = g_savedGlobals.sFinanceData.FRANKLIN_SHARES_COMPANY_INDEX[i]
g_sPortfolioSnapshot.FRANKLIN_SHARES_INVESTED[i][1] = g_savedGlobals.sFinanceData.FRANKLIN_SHARES_INVESTED[i]
g_sPortfolioSnapshot.FRANKLIN_SHARES_OWNED[i][1] = g_savedGlobals.sFinanceData.FRANKLIN_SHARES_OWNED[i]
g_sPortfolioSnapshot.TREVOR_SHARES_COMPANY_INDEX[i][1] = g_savedGlobals.sFinanceData.TREVOR_SHARES_COMPANY_INDEX[i]
g_sPortfolioSnapshot.TREVOR_SHARES_INVESTED[i][1] = g_savedGlobals.sFinanceData.TREVOR_SHARES_INVESTED[i]
g_sPortfolioSnapshot.TREVOR_SHARES_OWNED[i][1] = g_savedGlobals.sFinanceData.TREVOR_SHARES_OWNED[i]
ENDIF
ENDREPEAT
CPRINTLN(DEBUG_STOCKS, "...Snapshotting finished.")
ENDPROC
/// PURPOSE:
/// Restores the bank and stock system state from a buffer.
/// Used on repeat play and checkpoints
PROC PASTE_BANK_TRANSLOGS_CLF(BOOL bCheckpoint = TRUE)
CPRINTLN(DEBUG_STOCKS, "Restoring stock and bank state snapshot after repeat play or checkpoint load...")
INT i, j
REPEAT MAX_BANK_ACCOUNTS i
REPEAT MAX_BANK_ACCOUNT_LOG_ENTRIES j
g_savedGlobalsClifford.sFinanceData.PLAYER_ACCOUNT_LOGS[i].LogEntries[j].eType = g_savedGlobalsClifford.sFinanceData.PLAYER_ACCOUNT_LOGS[i].LogEntries[j].eTypeCheckpoint
g_savedGlobalsClifford.sFinanceData.PLAYER_ACCOUNT_LOGS[i].LogEntries[j].eBaacSource = g_savedGlobalsClifford.sFinanceData.PLAYER_ACCOUNT_LOGS[i].LogEntries[j].eBaacSourceCheckpoint
g_savedGlobalsClifford.sFinanceData.PLAYER_ACCOUNT_LOGS[i].LogEntries[j].iDegree = g_savedGlobalsClifford.sFinanceData.PLAYER_ACCOUNT_LOGS[i].LogEntries[j].iDegreeCheckpoint
ENDREPEAT
ENDREPEAT
REPEAT MAX_BAWSAQ_PORTFOLIO_ENTRIES_PER_TRADER i
IF bCheckpoint
g_savedGlobalsClifford.sFinanceData.MIKE_SHARES_COMPANY_INDEX[i] = g_sPortfolioSnapshot.MIKE_SHARES_COMPANY_INDEX[i][0]
g_savedGlobalsClifford.sFinanceData.MIKE_SHARES_INVESTED[i] = g_sPortfolioSnapshot.MIKE_SHARES_INVESTED[i][0]
g_savedGlobalsClifford.sFinanceData.MIKE_SHARES_OWNED[i] = g_sPortfolioSnapshot.MIKE_SHARES_OWNED[i][0]
g_savedGlobalsClifford.sFinanceData.FRANKLIN_SHARES_COMPANY_INDEX[i] = g_sPortfolioSnapshot.FRANKLIN_SHARES_COMPANY_INDEX[i][0]
g_savedGlobalsClifford.sFinanceData.FRANKLIN_SHARES_INVESTED[i] = g_sPortfolioSnapshot.FRANKLIN_SHARES_INVESTED[i][0]
g_savedGlobalsClifford.sFinanceData.FRANKLIN_SHARES_OWNED[i] = g_sPortfolioSnapshot.FRANKLIN_SHARES_OWNED[i][0]
g_savedGlobalsClifford.sFinanceData.TREVOR_SHARES_COMPANY_INDEX[i] = g_sPortfolioSnapshot.TREVOR_SHARES_COMPANY_INDEX[i][0]
g_savedGlobalsClifford.sFinanceData.TREVOR_SHARES_INVESTED[i] = g_sPortfolioSnapshot.TREVOR_SHARES_INVESTED[i][0]
g_savedGlobalsClifford.sFinanceData.TREVOR_SHARES_OWNED[i] = g_sPortfolioSnapshot.TREVOR_SHARES_OWNED[i][0]
ELSE
g_savedGlobalsClifford.sFinanceData.MIKE_SHARES_COMPANY_INDEX[i] = g_sPortfolioSnapshot.MIKE_SHARES_COMPANY_INDEX[i][1]
g_savedGlobalsClifford.sFinanceData.MIKE_SHARES_INVESTED[i] = g_sPortfolioSnapshot.MIKE_SHARES_INVESTED[i][1]
g_savedGlobalsClifford.sFinanceData.MIKE_SHARES_OWNED[i] = g_sPortfolioSnapshot.MIKE_SHARES_OWNED[i][1]
g_savedGlobalsClifford.sFinanceData.FRANKLIN_SHARES_COMPANY_INDEX[i] = g_sPortfolioSnapshot.FRANKLIN_SHARES_COMPANY_INDEX[i][1]
g_savedGlobalsClifford.sFinanceData.FRANKLIN_SHARES_INVESTED[i] = g_sPortfolioSnapshot.FRANKLIN_SHARES_INVESTED[i][1]
g_savedGlobalsClifford.sFinanceData.FRANKLIN_SHARES_OWNED[i] = g_sPortfolioSnapshot.FRANKLIN_SHARES_OWNED[i][1]
g_savedGlobalsClifford.sFinanceData.TREVOR_SHARES_COMPANY_INDEX[i] = g_sPortfolioSnapshot.TREVOR_SHARES_COMPANY_INDEX[i][1]
g_savedGlobalsClifford.sFinanceData.TREVOR_SHARES_INVESTED[i] = g_sPortfolioSnapshot.TREVOR_SHARES_INVESTED[i][1]
g_savedGlobalsClifford.sFinanceData.TREVOR_SHARES_OWNED[i] = g_sPortfolioSnapshot.TREVOR_SHARES_OWNED[i][1]
ENDIF
ENDREPEAT
CPRINTLN(DEBUG_STOCKS, "...Restoring of stock and bank state snapshot finished.")
ENDPROC
/// PURPOSE:
/// Restores the bank and stock system state from a buffer.
/// Used on repeat play and checkpoints
PROC PASTE_BANK_TRANSLOGS_NRM(BOOL bCheckpoint = TRUE)
CPRINTLN(DEBUG_STOCKS, "Restoring stock and bank state snapshot after repeat play or checkpoint load...")
INT i, j
REPEAT MAX_BANK_ACCOUNTS i
REPEAT MAX_BANK_ACCOUNT_LOG_ENTRIES j
g_savedGlobalsnorman.sFinanceData.PLAYER_ACCOUNT_LOGS[i].LogEntries[j].eType = g_savedGlobalsnorman.sFinanceData.PLAYER_ACCOUNT_LOGS[i].LogEntries[j].eTypeCheckpoint
g_savedGlobalsnorman.sFinanceData.PLAYER_ACCOUNT_LOGS[i].LogEntries[j].eBaacSource = g_savedGlobalsnorman.sFinanceData.PLAYER_ACCOUNT_LOGS[i].LogEntries[j].eBaacSourceCheckpoint
g_savedGlobalsnorman.sFinanceData.PLAYER_ACCOUNT_LOGS[i].LogEntries[j].iDegree = g_savedGlobalsnorman.sFinanceData.PLAYER_ACCOUNT_LOGS[i].LogEntries[j].iDegreeCheckpoint
ENDREPEAT
ENDREPEAT
REPEAT MAX_BAWSAQ_PORTFOLIO_ENTRIES_PER_TRADER i
IF bCheckpoint
g_savedGlobalsnorman.sFinanceData.MIKE_SHARES_COMPANY_INDEX[i] = g_sPortfolioSnapshot.MIKE_SHARES_COMPANY_INDEX[i][0]
g_savedGlobalsnorman.sFinanceData.MIKE_SHARES_INVESTED[i] = g_sPortfolioSnapshot.MIKE_SHARES_INVESTED[i][0]
g_savedGlobalsnorman.sFinanceData.MIKE_SHARES_OWNED[i] = g_sPortfolioSnapshot.MIKE_SHARES_OWNED[i][0]
g_savedGlobalsnorman.sFinanceData.FRANKLIN_SHARES_COMPANY_INDEX[i] = g_sPortfolioSnapshot.FRANKLIN_SHARES_COMPANY_INDEX[i][0]
g_savedGlobalsnorman.sFinanceData.FRANKLIN_SHARES_INVESTED[i] = g_sPortfolioSnapshot.FRANKLIN_SHARES_INVESTED[i][0]
g_savedGlobalsnorman.sFinanceData.FRANKLIN_SHARES_OWNED[i] = g_sPortfolioSnapshot.FRANKLIN_SHARES_OWNED[i][0]
g_savedGlobalsnorman.sFinanceData.TREVOR_SHARES_COMPANY_INDEX[i] = g_sPortfolioSnapshot.TREVOR_SHARES_COMPANY_INDEX[i][0]
g_savedGlobalsnorman.sFinanceData.TREVOR_SHARES_INVESTED[i] = g_sPortfolioSnapshot.TREVOR_SHARES_INVESTED[i][0]
g_savedGlobalsnorman.sFinanceData.TREVOR_SHARES_OWNED[i] = g_sPortfolioSnapshot.TREVOR_SHARES_OWNED[i][0]
ELSE
g_savedGlobalsnorman.sFinanceData.MIKE_SHARES_COMPANY_INDEX[i] = g_sPortfolioSnapshot.MIKE_SHARES_COMPANY_INDEX[i][1]
g_savedGlobalsnorman.sFinanceData.MIKE_SHARES_INVESTED[i] = g_sPortfolioSnapshot.MIKE_SHARES_INVESTED[i][1]
g_savedGlobalsnorman.sFinanceData.MIKE_SHARES_OWNED[i] = g_sPortfolioSnapshot.MIKE_SHARES_OWNED[i][1]
g_savedGlobalsnorman.sFinanceData.FRANKLIN_SHARES_COMPANY_INDEX[i] = g_sPortfolioSnapshot.FRANKLIN_SHARES_COMPANY_INDEX[i][1]
g_savedGlobalsnorman.sFinanceData.FRANKLIN_SHARES_INVESTED[i] = g_sPortfolioSnapshot.FRANKLIN_SHARES_INVESTED[i][1]
g_savedGlobalsnorman.sFinanceData.FRANKLIN_SHARES_OWNED[i] = g_sPortfolioSnapshot.FRANKLIN_SHARES_OWNED[i][1]
g_savedGlobalsnorman.sFinanceData.TREVOR_SHARES_COMPANY_INDEX[i] = g_sPortfolioSnapshot.TREVOR_SHARES_COMPANY_INDEX[i][1]
g_savedGlobalsnorman.sFinanceData.TREVOR_SHARES_INVESTED[i] = g_sPortfolioSnapshot.TREVOR_SHARES_INVESTED[i][1]
g_savedGlobalsnorman.sFinanceData.TREVOR_SHARES_OWNED[i] = g_sPortfolioSnapshot.TREVOR_SHARES_OWNED[i][1]
ENDIF
ENDREPEAT
CPRINTLN(DEBUG_STOCKS, "...Restoring of stock and bank state snapshot finished.")
ENDPROC
/// PURPOSE:
/// Restores the bank and stock system state from a buffer.
/// Used on repeat play and checkpoints
PROC PASTE_BANK_TRANSLOGS(BOOL bCheckpoint = TRUE)
#IF USE_CLF_DLC
IF g_bLoadedClifford
PASTE_BANK_TRANSLOGS_CLF()
EXIT
ENDIF
#ENDIF
#IF USE_NRM_DLC
IF g_bLoadedNorman
PASTE_BANK_TRANSLOGS_NRM()
EXIT
ENDIF
#ENDIF
CPRINTLN(DEBUG_STOCKS, "Restoring stock and bank state snapshot after repeat play or checkpoint load...")
INT i, j
REPEAT MAX_BANK_ACCOUNTS i
REPEAT MAX_BANK_ACCOUNT_LOG_ENTRIES j
g_savedGlobals.sFinanceData.PLAYER_ACCOUNT_LOGS[i].LogEntries[j].eType = g_savedGlobals.sFinanceData.PLAYER_ACCOUNT_LOGS[i].LogEntries[j].eTypeCheckpoint
g_savedGlobals.sFinanceData.PLAYER_ACCOUNT_LOGS[i].LogEntries[j].eBaacSource = g_savedGlobals.sFinanceData.PLAYER_ACCOUNT_LOGS[i].LogEntries[j].eBaacSourceCheckpoint
g_savedGlobals.sFinanceData.PLAYER_ACCOUNT_LOGS[i].LogEntries[j].iDegree = g_savedGlobals.sFinanceData.PLAYER_ACCOUNT_LOGS[i].LogEntries[j].iDegreeCheckpoint
ENDREPEAT
ENDREPEAT
REPEAT MAX_BAWSAQ_PORTFOLIO_ENTRIES_PER_TRADER i
IF bCheckpoint
g_savedGlobals.sFinanceData.MIKE_SHARES_COMPANY_INDEX[i] = g_sPortfolioSnapshot.MIKE_SHARES_COMPANY_INDEX[i][0]
g_savedGlobals.sFinanceData.MIKE_SHARES_INVESTED[i] = g_sPortfolioSnapshot.MIKE_SHARES_INVESTED[i][0]
g_savedGlobals.sFinanceData.MIKE_SHARES_OWNED[i] = g_sPortfolioSnapshot.MIKE_SHARES_OWNED[i][0]
g_savedGlobals.sFinanceData.FRANKLIN_SHARES_COMPANY_INDEX[i] = g_sPortfolioSnapshot.FRANKLIN_SHARES_COMPANY_INDEX[i][0]
g_savedGlobals.sFinanceData.FRANKLIN_SHARES_INVESTED[i] = g_sPortfolioSnapshot.FRANKLIN_SHARES_INVESTED[i][0]
g_savedGlobals.sFinanceData.FRANKLIN_SHARES_OWNED[i] = g_sPortfolioSnapshot.FRANKLIN_SHARES_OWNED[i][0]
g_savedGlobals.sFinanceData.TREVOR_SHARES_COMPANY_INDEX[i] = g_sPortfolioSnapshot.TREVOR_SHARES_COMPANY_INDEX[i][0]
g_savedGlobals.sFinanceData.TREVOR_SHARES_INVESTED[i] = g_sPortfolioSnapshot.TREVOR_SHARES_INVESTED[i][0]
g_savedGlobals.sFinanceData.TREVOR_SHARES_OWNED[i] = g_sPortfolioSnapshot.TREVOR_SHARES_OWNED[i][0]
ELSE
g_savedGlobals.sFinanceData.MIKE_SHARES_COMPANY_INDEX[i] = g_sPortfolioSnapshot.MIKE_SHARES_COMPANY_INDEX[i][1]
g_savedGlobals.sFinanceData.MIKE_SHARES_INVESTED[i] = g_sPortfolioSnapshot.MIKE_SHARES_INVESTED[i][1]
g_savedGlobals.sFinanceData.MIKE_SHARES_OWNED[i] = g_sPortfolioSnapshot.MIKE_SHARES_OWNED[i][1]
g_savedGlobals.sFinanceData.FRANKLIN_SHARES_COMPANY_INDEX[i] = g_sPortfolioSnapshot.FRANKLIN_SHARES_COMPANY_INDEX[i][1]
g_savedGlobals.sFinanceData.FRANKLIN_SHARES_INVESTED[i] = g_sPortfolioSnapshot.FRANKLIN_SHARES_INVESTED[i][1]
g_savedGlobals.sFinanceData.FRANKLIN_SHARES_OWNED[i] = g_sPortfolioSnapshot.FRANKLIN_SHARES_OWNED[i][1]
g_savedGlobals.sFinanceData.TREVOR_SHARES_COMPANY_INDEX[i] = g_sPortfolioSnapshot.TREVOR_SHARES_COMPANY_INDEX[i][1]
g_savedGlobals.sFinanceData.TREVOR_SHARES_INVESTED[i] = g_sPortfolioSnapshot.TREVOR_SHARES_INVESTED[i][1]
g_savedGlobals.sFinanceData.TREVOR_SHARES_OWNED[i] = g_sPortfolioSnapshot.TREVOR_SHARES_OWNED[i][1]
ENDIF
ENDREPEAT
CPRINTLN(DEBUG_STOCKS, "...Restoring of stock and bank state snapshot finished.")
ENDPROC
/// PURPOSE:
/// This exists because circular includes
/// PARAMS:
/// paramMissionID -
FUNC BOOL LOCAL_GET_MISSION_COMPLETE_STATE(SP_MISSIONS paramMissionID)
#if USE_CLF_DLC
RETURN g_savedGlobalsClifford.sFlow.missionSavedData[paramMissionID].completed
#endif
#if USE_NRM_DLC
RETURN g_savedGlobalsnorman.sFlow.missionSavedData[paramMissionID].completed
#endif
#if not USE_CLF_DLC
#if not USE_NRM_DLC
RETURN g_savedGlobals.sFlow.missionSavedData[paramMissionID].completed
#endif
#endif
ENDFUNC
// Market filter flags.
CONST_INT MFFILTER_POSITIVE 0
CONST_INT MFFILTER_RESET_POST_EXILE3 1 //full effect then raise to half after exile three
CONST_INT MFFILTER_TIMESCALE_WEEKS 2 //if not weeks then in days
CONST_INT MFFILTER_DURATION_1 3
CONST_INT MFFILTER_DURATION_2 4
CONST_INT MFFILTER_DURATION_4 5
CONST_INT MFFILTER_RAMP_UP 6
CONST_INT MFFILTER_RAMP_UP_ENDSLOW 7
CONST_INT MFFILTER_RAMP_UP_PROPORTION_HALF 8
CONST_INT MFFILTER_RAMP_UP_PROPORTION_QUARTER 9
CONST_INT MFFILTER_RAMP_UP_PROPORTION_EIGHTH 10
CONST_INT MFFILTER_RAMP_DOWN 11
CONST_INT MFFILTER_RAMP_DOWN_STARTSLOW 12
CONST_INT MFFILTER_RAMP_DOWN_PROPORTION_HALF 13
CONST_INT MFFILTER_RAMP_DOWN_PROPORTION_QUARTER 14
CONST_INT MFFILTER_RAMP_DOWN_PROPORTION_EIGHTH 15
CONST_INT MFFILTER_SCALE_50_PERC 16
CONST_INT MFFILTER_SCALE_25_PERC 17
CONST_INT MFFILTER_SCALE_10_PERC 18
CONST_INT MFFILTER_SCALE_33_PERC 19
CONST_INT MFFILTER_DURATION_8 20
/// PURPOSE:
/// Takes and duration and flag bitset, returns a scaling value.
FUNC FLOAT GET_BS_FILTER_FROM_DURATION_FLAGS(INT iDurationRemaining, INT iFlags)
FLOAT actionScale = 0.0
IF iDurationRemaining < 1
RETURN 1.0 // No effect.
ENDIF
BOOL bPositive = IS_BIT_SET(iFlags,MFFILTER_POSITIVE)
// INT iSec,iMINs,iHour,iDay,iMonths,iYears
// 2 min -> 1 hour
// Minutes to hours, div 2
FLOAT fGameDurationLeft = TO_FLOAT(iDurationRemaining) //(iDurationRemaining*10)/2
//Used to be units, now means days
INT iTotalUnits = 0
IF IS_BIT_SET(iFlags,MFFILTER_DURATION_1)
iTotalUnits += 1
ENDIF
IF IS_BIT_SET(iFlags,MFFILTER_DURATION_2)
iTotalUnits += 2
ENDIF
IF IS_BIT_SET(iFlags,MFFILTER_DURATION_4)
iTotalUnits += 4
ENDIF
IF IS_BIT_SET(iFlags,MFFILTER_DURATION_8)
iTotalUnits += 8
ENDIF
//Used to be 8640000 (1000*60*60*24), was changed to units
FLOAT fGameDurationTotal = TO_FLOAT(STOCK_MARKET_LOG_UPDATES_PER_DAY * iTotalUnits)
IF IS_BIT_SET(iFlags,MFFILTER_TIMESCALE_WEEKS)
fGameDurationTotal *= 7
ENDIF
IF IS_BIT_SET(iFlags,MFFILTER_RESET_POST_EXILE3)
//IF g_savedGlobals.sFlow.controls.flagIDs[FLOWFLAG_MICHAEL_TREVOR_EXILE_FINISHED]
// RETURN 1.0 //effect over
//ENDIF
#if not USE_CLF_DLC
#if not USE_NRM_DLC
IF LOCAL_GET_MISSION_COMPLETE_STATE(SP_MISSION_FAMILY_5)
RETURN 1.0 //No effect
ENDIF
#ENDIF
#ENDIF
ELSE
IF fGameDurationTotal < 1
RETURN 1.0 // No effect.
ENDIF
ENDIF
FLOAT processDelta = 1.0 - (fGameDurationLeft/fGameDurationTotal) // Flipped because duration remaining is counting down.
CDEBUG1LN(debug_stocks,"Filter duration Left/Total: ",fGameDurationLeft,"/",fGameDurationTotal," Delta: ",processDelta)
IF IS_BIT_SET(iFlags,MFFILTER_SCALE_50_PERC)
actionScale -= 0.50
ENDIF
IF IS_BIT_SET(iFlags,MFFILTER_SCALE_25_PERC)
actionScale -= 0.25
ENDIF
IF IS_BIT_SET(iFlags,MFFILTER_SCALE_10_PERC)
actionScale -= 0.10
ENDIF
IF IS_BIT_SET(iFlags,MFFILTER_SCALE_33_PERC)
actionScale -= 0.33
ENDIF
IF bPositive
actionScale = -actionScale
ENDIF
IF NOT IS_BIT_SET(iFlags,MFFILTER_RESET_POST_EXILE3)
// Check if it's in it's ramp up period and modify the actionscale.
IF IS_BIT_SET(iFlags,MFFILTER_RAMP_UP)
FLOAT upprop = 0.0
IF IS_BIT_SET(iFlags,MFFILTER_RAMP_UP_PROPORTION_HALF)
upprop += 0.50
ENDIF
IF IS_BIT_SET(iFlags,MFFILTER_RAMP_UP_PROPORTION_QUARTER)
upprop += 0.25
ENDIF
IF IS_BIT_SET(iFlags,MFFILTER_RAMP_UP_PROPORTION_EIGHTH)
upprop += 0.125
ENDIF
IF processDelta < upprop
FLOAT upprog = processDelta/upprop
IF IS_BIT_SET(iFlags,MFFILTER_RAMP_UP_ENDSLOW)
upprog = 1.0 - upprog
upprog *= upprog
upprog = 1.0 - upprog
ENDIF
actionScale *= upprog
ENDIF
ENDIF
// Check if it's in it's ramp down period and modify the actionscale.
IF IS_BIT_SET(iFlags,MFFILTER_RAMP_DOWN)
FLOAT downprop = 0.0
IF IS_BIT_SET(iFlags,MFFILTER_RAMP_DOWN_PROPORTION_HALF)
downprop += 0.50
ENDIF
IF IS_BIT_SET(iFlags,MFFILTER_RAMP_DOWN_PROPORTION_QUARTER)
downprop += 0.25
ENDIF
IF IS_BIT_SET(iFlags,MFFILTER_RAMP_DOWN_PROPORTION_EIGHTH)
downprop += 0.125
ENDIF
FLOAT fromend = 1.0 - downprop
// Modify.
IF processDelta > fromend
FLOAT downprog = (processDelta-fromend)/downprop
IF IS_BIT_SET(iFlags,MFFILTER_RAMP_DOWN_STARTSLOW)
downprog *= downprog
ENDIF
actionScale *= (1.0 - downprog)
ENDIF
ENDIF
ENDIF
actionScale = 1.0 + actionScale
RETURN actionScale
ENDFUNC
/// PURPOSE:
/// Obtains current price filter scaling value for the given company.
FUNC FLOAT GET_BS_PRICE_FILTER(BAWSAQ_COMPANIES b)
#if USE_CLF_DLC
b = b
RETURN 1.0
#ENDIF
#if USE_NRM_DLC
b = b
RETURN 1.0
#ENDIF
#if not USE_CLF_DLC
#if not USE_NRM_DLC
FLOAT FilterScale = 1.0
// Apply flow modifiers to filter. These are permenant effects based on progress
// of Merryweather.
SWITCH b
CASE BS_CO_LFI
IF g_savedGlobals.sFlow.controls.flagIDs[FLOWFLAG_MICHAEL_TREVOR_EXILE_FINISHED]
FilterScale = 0.5
ENDIF
BREAK
CASE BS_CO_MER // Merryweather.
// Kill Mike. Huge boost!
IF LOCAL_GET_MISSION_COMPLETE_STATE(SP_MISSION_FINALE_B)
FilterScale *= 3.0
ELSE
// Port of LS Heists 2A and 2B.
IF LOCAL_GET_MISSION_COMPLETE_STATE(SP_HEIST_DOCKS_2A)
OR LOCAL_GET_MISSION_COMPLETE_STATE(SP_HEIST_DOCKS_2B)
FilterScale *= 0.95
ENDIF
// Exile 1.
IF LOCAL_GET_MISSION_COMPLETE_STATE(SP_MISSION_EXILE_1)
FilterScale *= 0.98
ENDIF
// Exile 3.
IF LOCAL_GET_MISSION_COMPLETE_STATE(SP_MISSION_EXILE_3)
FilterScale *= 0.98
ENDIF
// Mike 3.
IF LOCAL_GET_MISSION_COMPLETE_STATE(SP_MISSION_MICHAEL_3)
FilterScale *= 0.98
ENDIF
// Kill trevor // minor drop.
IF LOCAL_GET_MISSION_COMPLETE_STATE(SP_MISSION_FINALE_A)
FilterScale *= 0.98
ENDIF
// Save both.
IF LOCAL_GET_MISSION_COMPLETE_STATE(SP_MISSION_FINALE_C2)
FilterScale *= 0.50
ENDIF
ENDIF
BREAK
CASE BS_CO_RIM
IF LOCAL_GET_MISSION_COMPLETE_STATE(SP_MISSION_MICHAEL_4)
FilterScale *= 0.50
ENDIF
IF LOCAL_GET_MISSION_COMPLETE_STATE(SP_MISSION_CARSTEAL_3)
FilterScale *= 0.95
ENDIF
BREAK
CASE BS_CO_GRU
IF LOCAL_GET_MISSION_COMPLETE_STATE(SP_HEIST_RURAL_2)
IF NOT LOCAL_GET_MISSION_COMPLETE_STATE(SP_MISSION_MICHAEL_2)
FilterScale *= 0.90
ENDIF
ENDIF
IF LOCAL_GET_MISSION_COMPLETE_STATE(SP_MISSION_FBI_4)
IF NOT LOCAL_GET_MISSION_COMPLETE_STATE(SP_MISSION_FINALE_CREDITS)
FilterScale *= 0.90
ENDIF
ENDIF
IF LOCAL_GET_MISSION_COMPLETE_STATE(SP_HEIST_FINALE_2A)
IF NOT LOCAL_GET_MISSION_COMPLETE_STATE(SP_MISSION_FINALE_CREDITS)
FilterScale *= 0.90
ENDIF
ENDIF
BREAK
CASE BS_CO_VAG
IF LOCAL_GET_MISSION_COMPLETE_STATE(SP_HEIST_JEWELRY_2)
IF NOT LOCAL_GET_MISSION_COMPLETE_STATE(SP_MISSION_EXILE_1)
FilterScale *= 0.70
ENDIF
ENDIF
BREAK
CASE BS_CO_AUG
IF LOCAL_GET_MISSION_COMPLETE_STATE(SP_MISSION_FINALE_CREDITS)
FilterScale *= 2.0
ENDIF
BREAK
CASE BS_CO_CLK
IF LOCAL_GET_MISSION_COMPLETE_STATE(SP_HEIST_RURAL_2)
IF NOT LOCAL_GET_MISSION_COMPLETE_STATE(SP_MISSION_FINALE_CREDITS)
FilterScale *= 0.6
ENDIF
ENDIF
BREAK
CASE BS_CO_FUS
IF LOCAL_GET_MISSION_COMPLETE_STATE(SP_MISSION_SOLOMON_3)
IF NOT LOCAL_GET_MISSION_COMPLETE_STATE(SP_MISSION_MICHAEL_4)
FilterScale *= 0.5
ENDIF
ENDIF
BREAK
ENDSWITCH
IF g_savedGlobals.sFinanceData.iFiltersRegistered < 1
RETURN FilterScale
ENDIF
INT iReg = -1
INT i = 0
REPEAT MAX_SP_FINANCE_FILTERS i
IF g_savedGlobals.sFinanceData.FilteredBind[i] = b
iReg = i
ENDIF
ENDREPEAT
IF iReg > -1
FilterScale = GET_BS_FILTER_FROM_DURATION_FLAGS(g_savedGlobals.sFinanceData.iFilterDurationRemaining[iReg],g_savedGlobals.sFinanceData.iFilterFlags[iReg])
CDEBUG3LN(DEBUG_STOCKS, "GET_BS_FILTER_FROM_DURATION_FLAGS returned ", FilterScale, " for index ", b)
ENDIF
IF FilterScale > 1.0
FLOAT rem = FilterScale - 1.0
//rem*=GET_PRICE_RISE_SCALER_FOR_ASSET(b)
INT bi = ENUM_TO_INT(b)
INT ito1 = GET_OWNED_TOTAL_FROM_PORTFOLIO(0,bi)
INT ito2 = GET_OWNED_TOTAL_FROM_PORTFOLIO(1,bi)
INT ito3 = GET_OWNED_TOTAL_FROM_PORTFOLIO(2,bi)
IF (ito1+ito2+ito3) > 0
INT cashsum = g_BankAccounts[0].iBalance + g_BankAccounts[1].iBalance + g_BankAccounts[2].iBalance
REPEAT MAX_BAWSAQ_PORTFOLIO_ENTRIES_PER_TRADER i
IF g_savedGlobals.sFinanceData.MIKE_SHARES_OWNED[i] > 0
cashsum += floor(g_savedGlobals.sFinanceData.MIKE_SHARES_INVESTED[i])
ENDIF
IF g_savedGlobals.sFinanceData.FRANKLIN_SHARES_OWNED[i] > 0
cashsum += floor(g_savedGlobals.sFinanceData.FRANKLIN_SHARES_INVESTED[i])
ENDIF
IF g_savedGlobals.sFinanceData.TREVOR_SHARES_OWNED[i] > 0
cashsum += floor(g_savedGlobals.sFinanceData.TREVOR_SHARES_INVESTED[i])
ENDIF
ENDREPEAT
INT minEffect = 700000000// 700 000 000
INT maxEffect = 1000000000//1 000 000 000
IF cashsum > maxEffect
rem = 0.0
ELSE
IF cashsum < minEffect
rem = 1.0
ELSE
FLOAT degree = TO_FLOAT(cashsum - minEffect)
FLOAT range = TO_FLOAT(maxEffect- minEffect)
rem *= (1.0-(degree/range))
ENDIF
ENDIF
ENDIF
FilterScale = 1.0 + rem
ENDIF
#IF IS_DEBUG_BUILD
IF FilterScale != 1.0
CPRINTLN(DEBUG_STOCKS, "GET_BS_PRICE_FILTER: Company ", b, " stock multiplied by ", FilterScale)
ENDIF
#ENDIF
RETURN FilterScale
#ENDIF
#ENDIF
ENDFUNC
/// PURPOSE:
/// Gets the current simulated price for a stock. This is for internal use and isn't what
/// the player should ever see.
/// PARAMS:
/// index -
/// RETURNS:
///
FUNC FLOAT GET_STOCK_PRICE(INT index)
//see if this price is in the finance price transform list
BAWSAQ_COMPANIES b = INT_TO_ENUM(BAWSAQ_COMPANIES, index)
FLOAT retprice = (g_BS_Listings[index].fCurrentPrice * GET_BS_PRICE_FILTER(b))
// Strip off everything after two decimal places
RETURN TO_FLOAT(FLOOR(retprice*100))/100.0
ENDFUNC
/// PURPOSE:
/// Gets the current stock price as it appears in the log
/// RETURNS:
/// The stock price as it appears at the previous carret index (as the carret was incremented just after update)
FUNC FLOAT GET_CURRENT_STOCK_PRICE(INT iCompany)
FLOAT fStockPrice
//Get online data if an online stock
IF g_BS_Listings[iCompany].bOnlineStock
fStockPrice = GET_STOCK_PRICE(iCompany)
ELSE
//Get last logged value if an offline stock
INT iLastLoggedPrice = g_BS_Listings[iCompany].iLogIndexCaret - 1
IF iLastLoggedPrice < 0
iLastLoggedPrice = MAX_STOCK_PRICE_LOG_ENTRIES - 1
ENDIF
fStockPrice = g_BS_Listings[iCompany].LoggedPrices[iLastLoggedPrice]
ENDIF
CDEBUG2LN(DEBUG_STOCKS, "Current stock price for company ", iCompany, " is $", fStockPrice, ".")
RETURN fStockPrice
ENDFUNC
/// PURPOSE:
/// Gets amount of funds invested in the given portfolio index.
FUNC FLOAT GET_INVESTED_TOTAL_FROM_PORTFOLIO(INT iChar, INT entry)
//MAX_BAWSAQ_PORTFOLIO_ENTRIES_PER_TRADER
IF entry < 0 OR entry > MAX_BAWSAQ_PORTFOLIO_ENTRIES_PER_TRADER-1
RETURN 0.0
ENDIF
FLOAT fCurrentPrice = GET_STOCK_PRICE(ENUM_TO_INT(GET_COMPANY_INDEX_FROM_PORTFOLIO(iChar, entry)))
IF fCurrentPrice > 0
SWITCH iChar
CASE 0
RETURN g_savedGlobals.sFinanceData.MIKE_SHARES_INVESTED[entry]
CASE 1
RETURN g_savedGlobals.sFinanceData.FRANKLIN_SHARES_INVESTED[entry]
CASE 2
RETURN g_savedGlobals.sFinanceData.TREVOR_SHARES_INVESTED[entry]
ENDSWITCH
ENDIF
//invalid char
RETURN 0.0
ENDFUNC
/// PURPOSE:
/// Gets the total value of the given player character's portfolio
/// PARAMS:
/// trader -
/// RETURNS:
///
FUNC FLOAT GET_CURRENT_PLAYER_PORTFOLIO_INVESTED(BAWSAQ_TRADERS trader)
FLOAT sum = 0
INT i = 0
REPEAT MAX_BAWSAQ_PORTFOLIO_ENTRIES_PER_TRADER i
//g_BS_Portfolios[trader][iGET_COMPANY_INDEX_FROM_PORTFOLIO(,)
IF GET_OWNED_TOTAL_FROM_PORTFOLIO(ENUM_TO_INT(trader),i) > 0
sum += GET_INVESTED_TOTAL_FROM_PORTFOLIO(ENUM_TO_INT(trader),i)
ENDIF
ENDREPEAT
CPRINTLN(DEBUG_STOCKS, "GET_CURRENT_PLAYER_PORTFOLIO_INVESTED: ", sum)
RETURN sum
ENDFUNC
/// PURPOSE:
/// Gets the total value of the player char porfolio.
FUNC FLOAT GET_CURRENT_PLAYER_PORTFOLIO_VALUE(BAWSAQ_TRADERS trader)
FLOAT sum = 0
INT i
REPEAT MAX_BAWSAQ_PORTFOLIO_ENTRIES_PER_TRADER i
//g_BS_Portfolios[trader][iGET_COMPANY_INDEX_FROM_PORTFOLIO(,)
IF GET_OWNED_TOTAL_FROM_PORTFOLIO(ENUM_TO_INT(trader),i) > 0
sum += GET_STOCK_PRICE(ENUM_TO_INT(GET_COMPANY_INDEX_FROM_PORTFOLIO(ENUM_TO_INT(trader),i)))*GET_OWNED_TOTAL_FROM_PORTFOLIO(ENUM_TO_INT(trader),i)
ENDIF
ENDREPEAT
CPRINTLN(DEBUG_STOCKS, "GET_CURRENT_PLAYER_PORTFOLIO_VALUE: ", sum)
RETURN sum
ENDFUNC
/// PURPOSE:
/// Gets the total value of the player based on the last logged values of stocks.
FUNC FLOAT GET_LOGGED_PLAYER_PORTFOLIO_VALUE(BAWSAQ_TRADERS trader)
CDEBUG1LN(DEBUG_STOCKS, "Starting to calculate portfolio total for trader ", ENUM_TO_INT(trader), "...")
FLOAT fPortfolioTotal = 0
INT i
REPEAT MAX_BAWSAQ_PORTFOLIO_ENTRIES_PER_TRADER i
INT iOwnedTotal = GET_OWNED_TOTAL_FROM_PORTFOLIO(ENUM_TO_INT(trader),i)
IF iOwnedTotal > 0
CDEBUG1LN(DEBUG_STOCKS, "Current total is $", fPortfolioTotal, ".")
INT iStock = ENUM_TO_INT(GET_COMPANY_INDEX_FROM_PORTFOLIO(ENUM_TO_INT(trader),i))
FLOAT fCurrentStockPrice = GET_CURRENT_STOCK_PRICE(iStock)
IF fCurrentStockPrice > 0
FLOAT fOwnedValue = fCurrentStockPrice * TO_FLOAT(iOwnedTotal)
CDEBUG1LN(DEBUG_STOCKS, "Found ", iOwnedTotal, " owned in stock ", iStock, " worth $", GET_CURRENT_STOCK_PRICE(iStock), " each for a total of $", fOwnedValue, ".")
fPortfolioTotal += fOwnedValue
ELSE
CDEBUG1LN(DEBUG_STOCKS, "Excluded stock ", iStock, " due to invalid current price of ", fCurrentStockPrice, ".")
ENDIF
ENDIF
ENDREPEAT
CPRINTLN(DEBUG_STOCKS, "GET_LOGGED_PLAYER_PORTFOLIO_VALUE: ", fPortfolioTotal)
RETURN fPortfolioTotal
ENDFUNC
/// PURPOSE:
/// Obtains a scaling value used on rising price updates that is effected by the player's total
/// owned assets.
/// This is applied to price rises to attenuate them to zero on LCN for owned stock for players
/// who have total assets approaching 1000 million.
FUNC FLOAT GET_PRICE_RISE_SCALER_FOR_ASSET(BAWSAQ_COMPANIES company)
IF g_BS_Listings[company].bOnlineStock
RETURN 1.0//not filtered
ENDIF
INT ito1 = GET_OWNED_TOTAL_FROM_PORTFOLIO(0,ENUM_TO_INT(company))
INT ito2 = GET_OWNED_TOTAL_FROM_PORTFOLIO(1,ENUM_TO_INT(company))
INT ito3 = GET_OWNED_TOTAL_FROM_PORTFOLIO(2,ENUM_TO_INT(company))
IF (ito1+ito2+ito3) < 1
RETURN 1.0 //not filtering price rises for unowned assets
ENDIF
INT maxEffect = 1000000000//1 000 000 000
INT cashsum = g_BankAccounts[0].iBalance + g_BankAccounts[1].iBalance + g_BankAccounts[2].iBalance
IF g_BankAccounts[0].iBalance > maxEffect
RETURN 0.0
ENDIF
IF g_BankAccounts[1].iBalance > maxEffect
RETURN 0.0
ENDIF
IF g_BankAccounts[2].iBalance > maxEffect
RETURN 0.0
ENDIF
FLOAT val = 0.0
INT i
REPEAT MAX_BAWSAQ_PORTFOLIO_ENTRIES_PER_TRADER i
INT t = GET_OWNED_TOTAL_FROM_PORTFOLIO(0,i)
IF t > 0
val += GET_STOCK_PRICE(ENUM_TO_INT(GET_COMPANY_INDEX_FROM_PORTFOLIO(0,i)))*t
ENDIF
IF GET_OWNED_TOTAL_FROM_PORTFOLIO(1,i) > 0
val += GET_STOCK_PRICE(ENUM_TO_INT(GET_COMPANY_INDEX_FROM_PORTFOLIO(1,i)))*t
ENDIF
IF GET_OWNED_TOTAL_FROM_PORTFOLIO(2,i) > 0
val += GET_STOCK_PRICE(ENUM_TO_INT(GET_COMPANY_INDEX_FROM_PORTFOLIO(2,i)))*t
ENDIF
ENDREPEAT
INT sum = FLOOR(val)+cashsum
//2 147 483 647
// finally check if the price needs to be filtered
INT minEffect = 700000000// 700 000 000
IF sum > maxEffect
CPRINTLN(DEBUG_STOCKS, "GET_PRICE_RISE_SCALER_FOR_ASSET: asset ", company, " scaler 0 earlybail" )
RETURN 0.0
ENDIF
IF sum < minEffect
CPRINTLN(DEBUG_STOCKS, "GET_PRICE_RISE_SCALER_FOR_ASSET: asset ", company, " scaler 1 earlybail" )
RETURN 1.0
ENDIF
FLOAT degree = TO_FLOAT(sum - minEffect)
FLOAT range = TO_FLOAT(maxEffect- minEffect)
IF !(range > 0.0)
CPRINTLN(DEBUG_STOCKS, "GET_PRICE_RISE_SCALER_FOR_ASSET: asset ", company, " scaler ", 1.0-(degree/range) )
RETURN 1.0
ENDIF
CPRINTLN(DEBUG_STOCKS, "GET_PRICE_RISE_SCALER_FOR_ASSET: asset ", company, " scaler ",1.0-(degree/range) )
RETURN 1.0-(degree/range)
ENDFUNC
/// PURPOSE:
/// Increment stock system stats that relate to money spent on mods.
/// PARAMS:
/// amount -
PROC STOCK_MARKET_VEHICLE_MOD_MONEY_SPENT(INT amount)
BAWSAQ_INCREMENT_MODIFIER( BSMF_SM_GAMONSP, amount ) // money on all else but mods
BAWSAQ_INCREMENT_MODIFIER( BSMF_SM_VECMOD_FOR_AUG , amount )
BAWSAQ_INCREMENT_MODIFIER( BSMF_SM_VECMOD_FOR_LSC , amount )
ENDPROC
/// PURPOSE:
/// Log this price update for all LCN stocks.
PROC LCN_INTERNAL_SNAPSHOT_LISTING_TO_LOG(BAWSAQ_COMPANIES company, BOOL bSkipFilters = FALSE)
IF g_BS_Listings[company].bOnlineStock
EXIT //online stocks read thier logs from history functions.
ENDIF
CDEBUG3LN(DEBUG_LCN, "Writing log for LCN company ", ENUM_TO_INT(company), ". ", PICK_STRING(bSkipFilters, "Skipping filters.", "Not skipping filters."))
FLOAT currentprice = g_BS_Listings[company].fCurrentPrice
IF !bSkipFilters
currentprice = GET_STOCK_PRICE(ENUM_TO_INT(company))
ENDIF
IF currentprice = 0
SCRIPT_ASSERT("LCN_INTERNAL_SNAPSHOT_LISTING_TO_LOG: Current price is zero. Bug *Default Levels*.")
EXIT
ENDIF
g_BS_Listings[company].LoggedPrices[g_BS_Listings[company].iLogIndexCaret] = currentprice
IF currentprice > g_BS_Listings[company].fLoggedHighValue
g_BS_Listings[company].fLoggedHighValue = currentprice
ENDIF
IF currentprice < g_BS_Listings[company].fLoggedLowValue
g_BS_Listings[company].fLoggedLowValue = currentprice
ENDIF
g_BS_Listings[company].iLogIndexCaret += 1
IF g_BS_Listings[company].iLogIndexCaret >= MAX_STOCK_PRICE_LOG_ENTRIES
g_BS_Listings[company].iLogIndexCaret = 0
ENDIF
FLOAT ave = 0.0
INT i
REPEAT MAX_STOCK_PRICE_LOG_ENTRIES i
ave += g_BS_Listings[company].LoggedPrices[i]
ENDREPEAT
ave /= TO_FLOAT(MAX_STOCK_PRICE_LOG_ENTRIES)
g_BS_Listings[company].fLoggedPriceChangeFromWeeklyAverage = currentprice - ave
g_BS_Listings[company].fLoggedPriceChangeInPercent = (g_BS_Listings[company].fLoggedPriceChangeFromWeeklyAverage/ave)*100.0
ENDPROC
/// PURPOSE:
/// Attempt to read all the current prices out of profile stats if we can.
PROC REQUEST_BAWSAQ_STOCK_PRICE_VALUES()
INT iGameTime = GET_GAME_TIMER()
CPRINTLN(DEBUG_BAWSAQ, "Requstiong BAWSAQ stock price sync. Time last synced = ", g_iBrowserStockTimeLastSynch, " GameTime = ", iGameTime)
IF iGameTime > (g_iBrowserStockTimeLastSynch + BAWSAQ_ONLINE_SYNC_TIMER)
OR g_iBrowserStockTimeLastSynch = -1
CPRINTLN(DEBUG_BAWSAQ, "...enough time has passed attempting to request sync from server.")
IF NOT NETWORK_IS_SIGNED_ONLINE()
CDEBUG1LN(DEBUG_BAWSAQ, "Sync failed: Game is not online.")
g_bInvalidOnlinePricesRead = TRUE
EXIT
ENDIF
IF NOT NETWORK_HAS_VALID_ROS_CREDENTIALS()
CDEBUG1LN(DEBUG_BAWSAQ, "Sync failed: The network does not have valid ROS credentials.")
g_bInvalidOnlinePricesRead = TRUE
EXIT
ENDIF
IF NOT g_bBrowserStockPriceSynchInProgress
CDEBUG2LN(DEBUG_BAWSAQ, "Sync not in progress.")
IF STAT_COMMUNITY_START_SYNCH()
g_iBrowserStockTimeLastSynch = iGameTime //cooldown on stock market triggered reads
g_bBrowserStockPriceSynchInProgress = TRUE
CDEBUG2LN(DEBUG_BAWSAQ, "Sync started sucessfully. Scheduling.")
ENDIF
ENDIF
#IF IS_DEBUG_BUILD
ELSE
#ENDIF
CPRINTLN(DEBUG_BAWSAQ, "...not enough time has passed. Skipping sync.")
ENDIF
ENDPROC
/// PURPOSE:
/// Read the community stats that represent the prices for online stocks
/// place the prices in the buffers, report prices of 0 or lower as invalid.
/// RETURNS:
/// Number of invalid prices read
FUNC INT BAWSAQ_COPY_ONLINE_PRICES_OUT_OF_STATS()
CPRINTLN(DEBUG_BAWSAQ, "Starting to read community stats...")
IF (NOT NETWORK_IS_SIGNED_ONLINE())
OR (NOT NETWORK_HAS_VALID_ROS_CREDENTIALS())
CPRINTLN(DEBUG_STOCKS, "BAWSAQ_COPY_ONLINE_PRICES_OUT_OF_STATS called while not signed in.")
RETURN 1
ENDIF
INT i = 0
INT iInvalidPrices = 0
REPEAT BS_CO_TOTAL_LISTINGS i
IF g_BS_Listings[i].bOnlineStock
IF g_BS_Listings[i].StatIndex > -1
STATSENUM e = g_BS_OIndexData[g_BS_Listings[i].StatIndex].OnlinePriceStat
CDEBUG1LN(DEBUG_BAWSAQ,"Stock ",i," ",g_BS_Listings[i].sLongName)
STAT_GET_FLOAT(e, g_BS_Listings[i].fCurrentPrice)
CDEBUG1LN(DEBUG_BAWSAQ,"Current price: ",g_BS_Listings[i].fCurrentPrice)
IF (g_BS_Listings[i].fCurrentPrice > 0)
FLOAT ave = 0.0
STAT_COMMUNITY_GET_HISTORY(e, 0, g_BS_Listings[i].fLoggedPriceChangeFromWeeklyAverage)
CDEBUG1LN(DEBUG_BAWSAQ,"Logged price change: ",g_BS_Listings[i].fLoggedPriceChangeFromWeeklyAverage)
g_BS_Listings[i].fLoggedHighValue = g_BS_Listings[i].fCurrentPrice
g_BS_Listings[i].fLoggedLowValue = g_BS_Listings[i].fCurrentPrice
ave += g_BS_Listings[i].fLoggedPriceChangeFromWeeklyAverage
//g_BS_Listings[i].fLastPriceChange = g_BS_Listings[i].fCurrentPrice - g_BS_Listings[i].fLastPriceChange
//g_BS_Listings[i].fLastPriceChangeInPercent = (g_BS_Listings[i].fLastPriceChange/g_BS_Listings[i].fCurrentPrice)*100.0
INT j
REPEAT 4 j
FLOAT f = 0
STAT_COMMUNITY_GET_HISTORY(e, j+1, f)
CDEBUG1LN(DEBUG_BAWSAQ,"History price #",j,": ",f)
IF f > g_BS_Listings[i].fLoggedHighValue
g_BS_Listings[i].fLoggedHighValue = f
ENDIF
IF f < g_BS_Listings[i].fLoggedLowValue
g_BS_Listings[i].fLoggedLowValue = f
ENDIF
ave += f
ENDREPEAT
ave /= 5.0
CDEBUG1LN(DEBUG_BAWSAQ,"Avg is ",ave)
FLOAT trueprice = GET_STOCK_PRICE(i)
CDEBUG1LN(DEBUG_BAWSAQ,"True price: ",trueprice)
IF trueprice > g_BS_Listings[i].fLoggedHighValue
g_BS_Listings[i].fLoggedHighValue = trueprice
ENDIF
IF trueprice < g_BS_Listings[i].fLoggedLowValue
g_BS_Listings[i].fLoggedLowValue = trueprice
ENDIF
CDEBUG1LN(DEBUG_BAWSAQ,"Logged min/max: ",g_BS_Listings[i].fLoggedLowValue,"/",g_BS_Listings[i].fLoggedHighValue)
g_BS_Listings[i].fLoggedPriceChangeFromWeeklyAverage = trueprice - ave
//% change is calculated based on average, not current price (avoids <-100% changes)
g_BS_Listings[i].fLoggedPriceChangeInPercent = (g_BS_Listings[i].fLoggedPriceChangeFromWeeklyAverage/ave) * 100.0
CDEBUG1LN(DEBUG_BAWSAQ,"Avg change and %: ",g_BS_Listings[i].fLoggedPriceChangeFromWeeklyAverage,"/",g_BS_Listings[i].fLoggedPriceChangeInPercent,"%")
CDEBUG1LN(DEBUG_BAWSAQ,"")
ELSE
++iInvalidPrices
ENDIF
ENDIF
ENDIF
ENDREPEAT
CPRINTLN(DEBUG_BAWSAQ, "...Community stats finished reading. ", iInvalidPrices, " invalid stats found.")
RETURN iInvalidPrices
ENDFUNC
/// PURPOSE:
/// waits for a STAT_COMMUNITY_SYNCH_IS_PENDING to finish then update the prices
PROC BAWSAQ_PROCESS_STOCK_PRICE_SYNCH()
IF NOT NETWORK_IS_SIGNED_ONLINE()
IF g_bBrowserStockPriceSynchInProgress
CPRINTLN(DEBUG_BAWSAQ, "The game isn't online. BAWSAQ sync could not complete. Checking again in ", BAWSAQ_ONLINE_SYNC_TIMER, "ms.")
g_bBrowserStockPriceSynchInProgress = FALSE
g_iBrowserStockTimeLastSynch = GET_GAME_TIMER()
g_bInvalidOnlinePricesRead = TRUE
ENDIF
EXIT
ENDIF
IF g_bBrowserStockPriceSynchInProgress
CDEBUG3LN(DEBUG_BAWSAQ, "Stat sync is processing...")
IF NOT STAT_COMMUNITY_SYNCH_IS_PENDING()
INT iInvalidPrices = BAWSAQ_COPY_ONLINE_PRICES_OUT_OF_STATS()
g_bBrowserStockPriceSynchInProgress = FALSE
IF iInvalidPrices < 5
CPRINTLN(DEBUG_BAWSAQ, "Stat sync was successful with no invalid values found.")
g_bInvalidOnlinePricesRead = FALSE
ELSE
CPRINTLN(DEBUG_BAWSAQ, "Stat sync returned invalid values.")
//g_bInvalidOnlinePricesRead = TRUE
ENDIF
#IF IS_DEBUG_BUILD
ELSE
CDEBUG3LN(DEBUG_BAWSAQ, "Stat sync is pending. Waiting on server.")
#ENDIF
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// checks if the savegame has the given lifeinvader coupon
/// PARAMS:
/// c -
/// RETURNS:
///
FUNC BOOL DOES_SAVE_HAVE_COUPON_CLF(COUPON_TYPE c)
#IF USE_TU_CHANGES
IF NOT NETWORK_IS_GAME_IN_PROGRESS()
RETURN IS_BIT_SET(g_savedGlobalsClifford.sFinanceData.iSaveCoupons,ENUM_TO_INT(c))
ELSE
RETURN IS_BIT_SET(g_savedMPGlobalsNew.g_savedMPGlobals[GET_SAVE_GAME_ARRAY_SLOT()].MpSavedGeneral.iSaveCoupons,ENUM_TO_INT(c))
ENDIF
#ENDIF // USE_TU_CHANGES
#IF NOT USE_TU_CHANGES
RETURN IS_BIT_SET(g_savedGlobalsClifford.sFinanceData.iSaveCoupons,ENUM_TO_INT(c))
#ENDIF // NOT USE_TU_CHANGES
ENDFUNC
FUNC BOOL DOES_SAVE_HAVE_COUPON_NRM(COUPON_TYPE c)
#IF USE_TU_CHANGES
IF NOT NETWORK_IS_GAME_IN_PROGRESS()
RETURN IS_BIT_SET(g_savedGlobalsnorman.sFinanceData.iSaveCoupons,ENUM_TO_INT(c))
ELSE
RETURN IS_BIT_SET(g_savedMPGlobalsNew.g_savedMPGlobals[GET_SAVE_GAME_ARRAY_SLOT()].MpSavedGeneral.iSaveCoupons,ENUM_TO_INT(c))
ENDIF
#ENDIF // USE_TU_CHANGES
#IF NOT USE_TU_CHANGES
RETURN IS_BIT_SET(g_savedGlobalsnorman.sFinanceData.iSaveCoupons,ENUM_TO_INT(c))
#ENDIF // NOT USE_TU_CHANGES
ENDFUNC
#IF FEATURE_GEN9_EXCLUSIVE
FUNC BOOL IS_THIS_HSW_MOD_COUPON(COUPON_TYPE c)
SWITCH c
CASE COUPON_HSW_MOD1
CASE COUPON_HSW_MOD2
CASE COUPON_HSW_MOD3
CASE COUPON_HSW_MOD4
CASE COUPON_HSW_MOD5
CASE COUPON_HSW_MOD6
CASE COUPON_HSW_MOD7
CASE COUPON_HSW_MOD8
CASE COUPON_HSW_MOD9
CASE COUPON_HSW_MOD10
CASE COUPON_HSW_MOD11
CASE COUPON_HSW_MOD12
CASE COUPON_HSW_MOD13
CASE COUPON_HSW_MOD14
CASE COUPON_HSW_MOD15
CASE COUPON_HSW_MOD16
CASE COUPON_HSW_MOD17
CASE COUPON_HSW_MOD18
CASE COUPON_HSW_MOD19
CASE COUPON_HSW_MOD20
RETURN TRUE
BREAK
ENDSWITCH
RETURN FALSE
ENDFUNC
FUNC MP_INT_STATS GET_HSW_MOD_DISCOUNT_STAT(COUPON_TYPE c)
SWITCH c
CASE COUPON_HSW_MOD1
RETURN MP_STAT_DISCOUNT_HSW_MOD1
CASE COUPON_HSW_MOD2
RETURN MP_STAT_DISCOUNT_HSW_MOD2
CASE COUPON_HSW_MOD3
RETURN MP_STAT_DISCOUNT_HSW_MOD3
CASE COUPON_HSW_MOD4
RETURN MP_STAT_DISCOUNT_HSW_MOD4
CASE COUPON_HSW_MOD5
RETURN MP_STAT_DISCOUNT_HSW_MOD5
CASE COUPON_HSW_MOD6
RETURN MP_STAT_DISCOUNT_HSW_MOD6
CASE COUPON_HSW_MOD7
RETURN MP_STAT_DISCOUNT_HSW_MOD7
CASE COUPON_HSW_MOD8
RETURN MP_STAT_DISCOUNT_HSW_MOD8
CASE COUPON_HSW_MOD9
RETURN MP_STAT_DISCOUNT_HSW_MOD9
CASE COUPON_HSW_MOD10
RETURN MP_STAT_DISCOUNT_HSW_MOD10
CASE COUPON_HSW_MOD11
RETURN MP_STAT_DISCOUNT_HSW_MOD11
CASE COUPON_HSW_MOD12
RETURN MP_STAT_DISCOUNT_HSW_MOD12
CASE COUPON_HSW_MOD13
RETURN MP_STAT_DISCOUNT_HSW_MOD13
CASE COUPON_HSW_MOD14
RETURN MP_STAT_DISCOUNT_HSW_MOD14
CASE COUPON_HSW_MOD15
RETURN MP_STAT_DISCOUNT_HSW_MOD15
CASE COUPON_HSW_MOD16
RETURN MP_STAT_DISCOUNT_HSW_MOD16
CASE COUPON_HSW_MOD17
RETURN MP_STAT_DISCOUNT_HSW_MOD17
CASE COUPON_HSW_MOD18
RETURN MP_STAT_DISCOUNT_HSW_MOD18
CASE COUPON_HSW_MOD19
RETURN MP_STAT_DISCOUNT_HSW_MOD19
CASE COUPON_HSW_MOD20
RETURN MP_STAT_DISCOUNT_HSW_MOD20
BREAK
ENDSWITCH
RETURN MP_STAT_DISCOUNT_HSW_MOD1
ENDFUNC
FUNC BOOL IS_THIS_HSW_UPGRADE_COUPON(COUPON_TYPE c)
SWITCH c
CASE COUPON_HSW_UPGRADE
RETURN TRUE
BREAK
ENDSWITCH
RETURN FALSE
ENDFUNC
FUNC MPPLY_INT_STATS GET_HSW_UPGRADE_DISCOUNT_STAT(COUPON_TYPE c)
SWITCH c
CASE COUPON_HSW_UPGRADE
RETURN MPPLY_DISCOUNT_HSW_UPGRADE
ENDSWITCH
RETURN MPPLY_DISCOUNT_HSW_UPGRADE
ENDFUNC
#ENDIF
FUNC BOOL DOES_SAVE_HAVE_COUPON(COUPON_TYPE c)
#if USE_CLF_DLC
return DOES_SAVE_HAVE_COUPON_CLF(c)
#endif
#if USE_NRM_DLC
return DOES_SAVE_HAVE_COUPON_NRM(c)
#endif
IF (c = COUPON_CAR_XMAS2017)
RETURN GET_PACKED_STAT_BOOL(PACKED_MP_STAT_PLAYER_HAS_COUPON_CAR_XMAS2017)
ENDIF
IF (c = COUPON_CAR_XMAS2018)
RETURN GET_PACKED_STAT_BOOL(PACKED_MP_STAT_PLAYER_HAS_COUPON_CAR_XMAS2018)
ENDIF
IF (c = COUPON_HELI_XMAS2018)
RETURN GET_PACKED_STAT_BOOL(PACKED_MP_STAT_PLAYER_HAS_COUPON_HELI_XMAS2018)
ENDIF
IF (c = COUPON_CAR2_XMAS2018)
RETURN GET_PACKED_STAT_BOOL(PACKED_MP_STAT_PLAYER_HAS_COUPON_CAR2_XMAS2018)
ENDIF
IF (c = COUPON_CASINO_PLANE_SITE)
INT iCurrentPosixTime = GET_CLOUD_TIME_AS_INT()
INT iCouponPosixTime = GET_MP_INT_CHARACTER_STAT(MP_STAT_DISCOUNT_PLANE_SITE)
IF iCouponPosixTime = 0
OR iCurrentPosixTime >= iCouponPosixTime
RETURN FALSE
ENDIF
RETURN TRUE
ENDIF
IF (c = COUPON_CASINO_BOAT_SITE)
INT iCurrentPosixTime = GET_CLOUD_TIME_AS_INT()
INT iCouponPosixTime = GET_MP_INT_CHARACTER_STAT(MP_STAT_DISCOUNT_BOAT_SITE)
IF iCouponPosixTime = 0
OR iCurrentPosixTime >= iCouponPosixTime
RETURN FALSE
ENDIF
RETURN TRUE
ENDIF
IF (c = COUPON_CASINO_CAR_SITE)
INT iCurrentPosixTime = GET_CLOUD_TIME_AS_INT()
INT iCouponPosixTime = GET_MP_INT_CHARACTER_STAT(MP_STAT_DISCOUNT_CAR_SITE)
IF iCouponPosixTime = 0
OR iCurrentPosixTime >= iCouponPosixTime
RETURN FALSE
ENDIF
RETURN TRUE
ENDIF
IF (c = COUPON_CASINO_CAR_SITE2)
INT iCurrentPosixTime = GET_CLOUD_TIME_AS_INT()
INT iCouponPosixTime = GET_MP_INT_CHARACTER_STAT(MP_STAT_DISCOUNT_CAR_SITE2)
IF iCouponPosixTime = 0
OR iCurrentPosixTime >= iCouponPosixTime
RETURN FALSE
ENDIF
RETURN TRUE
ENDIF
IF (c = COUPON_CASINO_MIL_SITE)
INT iCurrentPosixTime = GET_CLOUD_TIME_AS_INT()
INT iCouponPosixTime = GET_MP_INT_CHARACTER_STAT(MP_STAT_DISCOUNT_MIL_SITE)
IF iCouponPosixTime = 0
OR iCurrentPosixTime >= iCouponPosixTime
RETURN FALSE
ENDIF
RETURN TRUE
ENDIF
IF (c = COUPON_CASINO_BIKE_SITE)
INT iCurrentPosixTime = GET_CLOUD_TIME_AS_INT()
INT iCouponPosixTime = GET_MP_INT_CHARACTER_STAT(MP_STAT_DISCOUNT_BIKE_SITE)
IF iCouponPosixTime = 0
OR iCurrentPosixTime >= iCouponPosixTime
RETURN FALSE
ENDIF
RETURN TRUE
ENDIF
#IF FEATURE_GEN9_EXCLUSIVE
IF IS_THIS_HSW_MOD_COUPON(c)
INT iCurrentPosixTime = GET_CLOUD_TIME_AS_INT()
INT iCouponPosixTime = GET_MP_INT_CHARACTER_STAT(GET_HSW_MOD_DISCOUNT_STAT(c))
IF iCouponPosixTime = 0
OR iCurrentPosixTime >= iCouponPosixTime
RETURN FALSE
ENDIF
RETURN TRUE
ENDIF
IF IS_THIS_HSW_UPGRADE_COUPON(c)
INT iCouponPosixTime = GET_MP_INT_PLAYER_STAT(GET_HSW_UPGRADE_DISCOUNT_STAT(c))
IF iCouponPosixTime <= 0
RETURN FALSE
ENDIF
RETURN TRUE
ENDIF
IF (c = COUPON_CAR_GEN9_MIGRATION)
RETURN GET_PACKED_STAT_BOOL(PACKED_MP_STAT_PLAYER_HAS_COUPON_CAR_GEN9_MIGRATION)
ENDIF
#ENDIF
#IF USE_TU_CHANGES
IF NOT NETWORK_IS_GAME_IN_PROGRESS()
RETURN IS_BIT_SET(g_savedGlobals.sFinanceData.iSaveCoupons,ENUM_TO_INT(c))
ELSE
RETURN IS_BIT_SET(g_savedMPGlobalsNew.g_savedMPGlobals[GET_SAVE_GAME_ARRAY_SLOT()].MpSavedGeneral.iSaveCoupons,ENUM_TO_INT(c))
ENDIF
#ENDIF // USE_TU_CHANGES
#IF NOT USE_TU_CHANGES
RETURN IS_BIT_SET(g_savedGlobals.sFinanceData.iSaveCoupons,ENUM_TO_INT(c))
#ENDIF // NOT USE_TU_CHANGES
ENDFUNC
/// PURPOSE:
/// Gets the display name for the given coupons
/// PARAMS:
/// c -
/// RETURNS:
///
FUNC STRING GET_COUPON_STRING(COUPON_TYPE c)
//this doesn't work
//STRING coupons[MAX_COUPONS] = {"COUP_HAIRC","COUP_TATTOO","COUP_WARSTOCK",
//"COUP_MOSPORT","COUP_ELITAS","COUP_MEDSPENS","COUP_SPRUNK","COUP_RESPRAY" }
//RETURN coupons[c]
SWITCH c
CASE COUPON_HAIRCUT
RETURN "COUP_HAIRC"
CASE COUPON_TATOO
RETURN "COUP_TATTOO"
CASE COUPON_MIL_SITE
RETURN "COUP_WARSTOCK"
CASE COUPON_CAR_SITE
RETURN "COUP_MOSPORT"
CASE COUPON_PLANE_SITE
RETURN "COUP_ELITAS"
CASE COUPON_MEDICAL
RETURN "COUP_MEDSPENS"
CASE COUPON_SPRUNK
RETURN "COUP_SPRUNK"
CASE COUPON_SPRAY
RETURN "COUP_RESPRAY"
CASE COUPON_CAR_XMAS2017
RETURN "COUP_XMAS2017"
CASE COUPON_CAR_XMAS2018
RETURN "COUP_CAR_XMAS2018"
CASE COUPON_HELI_XMAS2018
RETURN "COUP_HELI_XMAS2018"
CASE COUPON_CAR2_XMAS2018
RETURN "COUP_CAR2_XMAS2018"
CASE COUPON_CASINO_PLANE_SITE
RETURN "COUP_CAS_ELITAS"
CASE COUPON_CASINO_BOAT_SITE
RETURN "COUP_CAS_DOCKTEASE"
CASE COUPON_CASINO_CAR_SITE
RETURN "COUP_CAS_MOSPORT"
CASE COUPON_CASINO_CAR_SITE2
RETURN "COUP_CAS_SSASA"
CASE COUPON_CASINO_MIL_SITE
RETURN "COUP_CAS_WARSTOCK"
CASE COUPON_CASINO_BIKE_SITE
RETURN "COUP_CAS_PANDM"
BREAK
#IF FEATURE_GEN9_EXCLUSIVE
CASE COUPON_CAR_GEN9_MIGRATION
RETURN "COUPON_CAR_GEN9_MIGRATION"
BREAK
#ENDIF
DEFAULT
#IF FEATURE_GEN9_EXCLUSIVE
IF IS_THIS_HSW_MOD_COUPON(c)
RETURN "HSW_COUP"
ENDIF
IF IS_THIS_HSW_UPGRADE_COUPON(c)
RETURN "HSWU_COUP"
ENDIF
#ENDIF
BREAK
ENDSWITCH
RETURN ""
ENDFUNC
/// PURPOSE:
/// Redeems the coupon of this type
/// PARAMS:
/// c -
PROC REDEEM_COUPON_CLF(COUPON_TYPE c)
//mark the coupon as redeemed and pop the feed message
//Andrew,
//Steven T has added the lifeinvader contact in CL 1354085
//+[CELL_E_276]
//+Lifeinvader
//
//And I've just preocessed the latest contact pic updates and submitted. Should all bein the next build.
#IF USE_TU_CHANGES
BOOL bClearedBit = FALSE
IF NOT NETWORK_IS_GAME_IN_PROGRESS()
IF IS_BIT_SET(g_savedGlobalsClifford.sFinanceData.iSaveCoupons,ENUM_TO_INT(c))
bClearedBit = TRUE
CLEAR_BIT(g_savedGlobalsClifford.sFinanceData.iSaveCoupons,ENUM_TO_INT(c))
ENDIF
ELSE
IF IS_BIT_SET(g_savedMPGlobalsNew.g_savedMPGlobals[GET_SAVE_GAME_ARRAY_SLOT()].MpSavedGeneral.iSaveCoupons,ENUM_TO_INT(c))
bClearedBit = TRUE
CLEAR_BIT(g_savedGlobalsClifford.sFinanceData.iSaveCoupons,ENUM_TO_INT(c))
CLEAR_BIT(g_savedMPGlobalsNew.g_savedMPGlobals[GET_SAVE_GAME_ARRAY_SLOT()].MpSavedGeneral.iSaveCoupons,ENUM_TO_INT(c))
ENDIF
ENDIF
IF bClearedBit
//CHAR_LIFEINVADER
PRINTLN("<OBTAIN_COUPON> Redeemed coupon notification for ",c)
TEXT_LABEL_63 ll = "CHAR_LIFEINVADER"
BEGIN_TEXT_COMMAND_THEFEED_POST("COUP_RED")
ADD_TEXT_COMPONENT_SUBSTRING_TEXT_LABEL(GET_COUPON_STRING(c))
END_TEXT_COMMAND_THEFEED_POST_MESSAGETEXT(ll,ll,TRUE,TEXT_ICON_BLANK, "")
ENDIF
#ENDIF // USE_TU_CHANGES
#IF NOT USE_TU_CHANGES
IF IS_BIT_SET(g_savedGlobalsClifford.sFinanceData.iSaveCoupons,ENUM_TO_INT(c))
//CHAR_LIFEINVADER
TEXT_LABEL_63 ll = "CHAR_LIFEINVADER"
BEGIN_TEXT_COMMAND_THEFEED_POST("COUP_RED")
ADD_TEXT_COMPONENT_SUBSTRING_TEXT_LABEL(GET_COUPON_STRING(c))
END_TEXT_COMMAND_THEFEED_POST_MESSAGETEXT(ll,ll,TRUE,TEXT_ICON_BLANK, "")
CLEAR_BIT(g_savedGlobalsClifford.sFinanceData.iSaveCoupons,ENUM_TO_INT(c))
ENDIF
#ENDIF // NOT USE_TU_CHANGES
ENDPROC
/// PURPOSE:
/// Redeems the coupon of this type
/// PARAMS:
/// c -
PROC REDEEM_COUPON_NRM(COUPON_TYPE c)
//mark the coupon as redeemed and pop the feed message
//Andrew,
//Steven T has added the lifeinvader contact in CL 1354085
//+[CELL_E_276]
//+Lifeinvader
//
//And I've just preocessed the latest contact pic updates and submitted. Should all bein the next build.
#IF USE_TU_CHANGES
BOOL bClearedBit = FALSE
IF NOT NETWORK_IS_GAME_IN_PROGRESS()
IF IS_BIT_SET(g_savedGlobalsnorman.sFinanceData.iSaveCoupons,ENUM_TO_INT(c))
bClearedBit = TRUE
CLEAR_BIT(g_savedGlobalsnorman.sFinanceData.iSaveCoupons,ENUM_TO_INT(c))
ENDIF
ELSE
IF IS_BIT_SET(g_savedMPGlobalsNew.g_savedMPGlobals[GET_SAVE_GAME_ARRAY_SLOT()].MpSavedGeneral.iSaveCoupons,ENUM_TO_INT(c))
bClearedBit = TRUE
CLEAR_BIT(g_savedGlobalsnorman.sFinanceData.iSaveCoupons,ENUM_TO_INT(c))
CLEAR_BIT(g_savedMPGlobalsNew.g_savedMPGlobals[GET_SAVE_GAME_ARRAY_SLOT()].MpSavedGeneral.iSaveCoupons,ENUM_TO_INT(c))
ENDIF
ENDIF
IF bClearedBit
//CHAR_LIFEINVADER
PRINTLN("<OBTAIN_COUPON> Redeemed coupon notification for ",c)
TEXT_LABEL_63 ll = "CHAR_LIFEINVADER"
BEGIN_TEXT_COMMAND_THEFEED_POST("COUP_RED")
ADD_TEXT_COMPONENT_SUBSTRING_TEXT_LABEL(GET_COUPON_STRING(c))
END_TEXT_COMMAND_THEFEED_POST_MESSAGETEXT(ll,ll,TRUE,TEXT_ICON_BLANK, "")
ENDIF
#ENDIF // USE_TU_CHANGES
#IF NOT USE_TU_CHANGES
IF IS_BIT_SET(g_savedGlobalsnorman.sFinanceData.iSaveCoupons,ENUM_TO_INT(c))
//CHAR_LIFEINVADER
TEXT_LABEL_63 ll = "CHAR_LIFEINVADER"
BEGIN_TEXT_COMMAND_THEFEED_POST("COUP_RED")
ADD_TEXT_COMPONENT_SUBSTRING_TEXT_LABEL(GET_COUPON_STRING(c))
END_TEXT_COMMAND_THEFEED_POST_MESSAGETEXT(ll,ll,TRUE,TEXT_ICON_BLANK, "")
CLEAR_BIT(g_savedGlobalsnorman.sFinanceData.iSaveCoupons,ENUM_TO_INT(c))
ENDIF
#ENDIF // NOT USE_TU_CHANGES
ENDPROC
/// PURPOSE:
/// Redeems the coupon of this type
/// PARAMS:
/// c -
PROC REDEEM_COUPON(COUPON_TYPE c)
//mark the coupon as redeemed and pop the feed message
//Andrew,
//Steven T has added the lifeinvader contact in CL 1354085
//+[CELL_E_276]
//+Lifeinvader
//
//And I've just preocessed the latest contact pic updates and submitted. Should all bein the next build.
#if USE_CLF_DLC
REDEEM_COUPON_CLF(c)
exit
#endif
#if USE_NRM_DLC
REDEEM_COUPON_NRM(c)
exit
#endif
IF (c = COUPON_CAR_XMAS2017)
SET_PACKED_STAT_BOOL(PACKED_MP_STAT_PLAYER_HAS_COUPON_CAR_XMAS2017, FALSE)
EXIT
ENDIF
IF (c = COUPON_CAR_XMAS2018)
SET_PACKED_STAT_BOOL(PACKED_MP_STAT_PLAYER_HAS_COUPON_CAR_XMAS2018, FALSE)
EXIT
ENDIF
IF (c = COUPON_HELI_XMAS2018)
SET_PACKED_STAT_BOOL(PACKED_MP_STAT_PLAYER_HAS_COUPON_HELI_XMAS2018, FALSE)
EXIT
ENDIF
IF (c = COUPON_CAR2_XMAS2018)
SET_PACKED_STAT_BOOL(PACKED_MP_STAT_PLAYER_HAS_COUPON_CAR2_XMAS2018, FALSE)
EXIT
ENDIF
IF (c = COUPON_CASINO_PLANE_SITE)
SET_MP_INT_CHARACTER_STAT(MP_STAT_DISCOUNT_PLANE_SITE, 0)
EXIT
ENDIF
IF (c = COUPON_CASINO_BOAT_SITE)
SET_MP_INT_CHARACTER_STAT(MP_STAT_DISCOUNT_BOAT_SITE, 0)
EXIT
ENDIF
IF (c = COUPON_CASINO_CAR_SITE)
SET_MP_INT_CHARACTER_STAT(MP_STAT_DISCOUNT_CAR_SITE, 0)
EXIT
ENDIF
IF (c = COUPON_CASINO_CAR_SITE2)
SET_MP_INT_CHARACTER_STAT(MP_STAT_DISCOUNT_CAR_SITE2, 0)
EXIT
ENDIF
IF (c = COUPON_CASINO_MIL_SITE)
SET_MP_INT_CHARACTER_STAT(MP_STAT_DISCOUNT_MIL_SITE, 0)
EXIT
ENDIF
IF (c = COUPON_CASINO_BIKE_SITE)
SET_MP_INT_CHARACTER_STAT(MP_STAT_DISCOUNT_BIKE_SITE, 0)
EXIT
ENDIF
#IF FEATURE_GEN9_EXCLUSIVE
IF IS_THIS_HSW_MOD_COUPON(c)
SET_MP_INT_CHARACTER_STAT(GET_HSW_MOD_DISCOUNT_STAT(c), 0)
EXIT
ENDIF
IF IS_THIS_HSW_UPGRADE_COUPON(c)
INT iCurrentNumCoupon = GET_MP_INT_PLAYER_STAT(GET_HSW_UPGRADE_DISCOUNT_STAT(c))
SET_MP_INT_PLAYER_STAT(GET_HSW_UPGRADE_DISCOUNT_STAT(c), iCurrentNumCoupon - 1)
EXIT
ENDIF
IF (c = COUPON_CAR_GEN9_MIGRATION)
SET_PACKED_STAT_BOOL(PACKED_MP_STAT_PLAYER_HAS_COUPON_CAR_GEN9_MIGRATION, FALSE)
PRINTLN("[REDEEM_COUPON] COUPON_CAR_GEN9_MIGRATION")
EXIT
ENDIF
#ENDIF
#IF USE_TU_CHANGES
BOOL bClearedBit = FALSE
IF NOT NETWORK_IS_GAME_IN_PROGRESS()
IF IS_BIT_SET(g_savedGlobals.sFinanceData.iSaveCoupons,ENUM_TO_INT(c))
bClearedBit = TRUE
CLEAR_BIT(g_savedGlobals.sFinanceData.iSaveCoupons,ENUM_TO_INT(c))
ENDIF
ELSE
IF IS_BIT_SET(g_savedGlobals.sFinanceData.iSaveCoupons,ENUM_TO_INT(c))
OR IS_BIT_SET(g_savedMPGlobalsNew.g_savedMPGlobals[GET_SAVE_GAME_ARRAY_SLOT()].MpSavedGeneral.iSaveCoupons,ENUM_TO_INT(c))
bClearedBit = TRUE
CLEAR_BIT(g_savedGlobals.sFinanceData.iSaveCoupons,ENUM_TO_INT(c))
CLEAR_BIT(g_savedMPGlobalsNew.g_savedMPGlobals[GET_SAVE_GAME_ARRAY_SLOT()].MpSavedGeneral.iSaveCoupons,ENUM_TO_INT(c))
ENDIF
ENDIF
IF bClearedBit
//CHAR_LIFEINVADER
PRINTLN("<REDEEM_COUPON> Redeemed coupon notification for \"", GET_COUPON_STRING(c), "\"")
TEXT_LABEL_63 ll = "CHAR_LIFEINVADER"
BEGIN_TEXT_COMMAND_THEFEED_POST("COUP_RED")
ADD_TEXT_COMPONENT_SUBSTRING_TEXT_LABEL(GET_COUPON_STRING(c))
END_TEXT_COMMAND_THEFEED_POST_MESSAGETEXT(ll,ll,TRUE,TEXT_ICON_BLANK, "")
ENDIF
#ENDIF // USE_TU_CHANGES
#IF NOT USE_TU_CHANGES
IF IS_BIT_SET(g_savedGlobals.sFinanceData.iSaveCoupons,ENUM_TO_INT(c))
//CHAR_LIFEINVADER
TEXT_LABEL_63 ll = "CHAR_LIFEINVADER"
BEGIN_TEXT_COMMAND_THEFEED_POST("COUP_RED")
ADD_TEXT_COMPONENT_SUBSTRING_TEXT_LABEL(GET_COUPON_STRING(c))
END_TEXT_COMMAND_THEFEED_POST_MESSAGETEXT(ll,ll,TRUE,TEXT_ICON_BLANK, "")
CLEAR_BIT(g_savedGlobals.sFinanceData.iSaveCoupons,ENUM_TO_INT(c))
ENDIF
#ENDIF // NOT USE_TU_CHANGES
ENDPROC
/// PURPOSE:
/// Awards the given coupon to the save game.
/// PARAMS:
/// c -
PROC OBTAIN_COUPON_CLF(COUPON_TYPE c)
BOOL bSetBit = FALSE
IF NOT NETWORK_IS_GAME_IN_PROGRESS()
IF NOT IS_BIT_SET(g_savedGlobalsClifford.sFinanceData.iSaveCoupons,ENUM_TO_INT(c))
bSetBit = TRUE
SET_BIT(g_savedGlobalsClifford.sFinanceData.iSaveCoupons,ENUM_TO_INT(c))
ENDIF
ELSE
IF NOT IS_BIT_SET(g_savedMPGlobalsNew.g_savedMPGlobals[GET_SAVE_GAME_ARRAY_SLOT()].MpSavedGeneral.iSaveCoupons,ENUM_TO_INT(c))
bSetBit = TRUE
SET_BIT(g_savedGlobalsClifford.sFinanceData.iSaveCoupons,ENUM_TO_INT(c))
SET_BIT(g_savedMPGlobalsNew.g_savedMPGlobals[GET_SAVE_GAME_ARRAY_SLOT()].MpSavedGeneral.iSaveCoupons,ENUM_TO_INT(c))
ENDIF
ENDIF
IF bSetBit
//CHAR_LIFEINVADER
PRINTLN("<OBTAIN_COUPON> Displaying coupon notification for ",c)
TEXT_LABEL_63 ll = "CHAR_LIFEINVADER"
BEGIN_TEXT_COMMAND_THEFEED_POST("COUP_STR")
ADD_TEXT_COMPONENT_SUBSTRING_TEXT_LABEL(GET_COUPON_STRING(c))
END_TEXT_COMMAND_THEFEED_POST_MESSAGETEXT(ll,ll,TRUE,TEXT_ICON_BLANK, "")
ENDIF
ENDPROC
/// PURPOSE:
/// Awards the given coupon to the save game.
/// PARAMS:
/// c -
PROC OBTAIN_COUPON_NRM(COUPON_TYPE c)
BOOL bSetBit = FALSE
IF NOT NETWORK_IS_GAME_IN_PROGRESS()
IF NOT IS_BIT_SET(g_savedGlobalsnorman.sFinanceData.iSaveCoupons,ENUM_TO_INT(c))
bSetBit = TRUE
SET_BIT(g_savedGlobalsnorman.sFinanceData.iSaveCoupons,ENUM_TO_INT(c))
ENDIF
ELSE
IF NOT IS_BIT_SET(g_savedMPGlobalsNew.g_savedMPGlobals[GET_SAVE_GAME_ARRAY_SLOT()].MpSavedGeneral.iSaveCoupons,ENUM_TO_INT(c))
bSetBit = TRUE
SET_BIT(g_savedGlobalsnorman.sFinanceData.iSaveCoupons,ENUM_TO_INT(c))
SET_BIT(g_savedMPGlobalsNew.g_savedMPGlobals[GET_SAVE_GAME_ARRAY_SLOT()].MpSavedGeneral.iSaveCoupons,ENUM_TO_INT(c))
ENDIF
ENDIF
IF bSetBit
//CHAR_LIFEINVADER
PRINTLN("<OBTAIN_COUPON> Displaying coupon notification for ",c)
TEXT_LABEL_63 ll = "CHAR_LIFEINVADER"
BEGIN_TEXT_COMMAND_THEFEED_POST("COUP_STR")
ADD_TEXT_COMPONENT_SUBSTRING_TEXT_LABEL(GET_COUPON_STRING(c))
END_TEXT_COMMAND_THEFEED_POST_MESSAGETEXT(ll,ll,TRUE,TEXT_ICON_BLANK, "")
ENDIF
ENDPROC
#IF FEATURE_GEN9_EXCLUSIVE
PROC PRINT_HSW_UPGRADE_COUPON_TICKER()
THEFEED_SHOW()
BEGIN_TEXT_COMMAND_THEFEED_POST("PIM_DV_HSW")
END_TEXT_COMMAND_THEFEED_POST_UNLOCK_TU("CAS_LW_RDISC", ENUM_TO_INT(ICON_TYPE_DISCOUNT), "PIM_DV_HSW", TRUE)
ENDPROC
PROC PRINT_HSW_MOD_COUPON_TICKER()
THEFEED_SHOW()
BEGIN_TEXT_COMMAND_THEFEED_POST("PIM_DV_HSM")
END_TEXT_COMMAND_THEFEED_POST_UNLOCK_TU("CAS_LW_RDISC", ENUM_TO_INT(ICON_TYPE_DISCOUNT), "PIM_DV_HSM", TRUE)
ENDPROC
#ENDIF
/// PURPOSE:
/// Awards the given coupon to the save game.
/// PARAMS:
/// c -
PROC OBTAIN_COUPON(COUPON_TYPE c)
#if use_CLF_dlc
OBTAIN_COUPON_CLF(c)
exit
#endif
#if USE_NRM_DLC
OBTAIN_COUPON_NRM(c)
exit
#endif
IF (c = COUPON_CAR_XMAS2017)
SET_PACKED_STAT_BOOL(PACKED_MP_STAT_PLAYER_HAS_COUPON_CAR_XMAS2017, TRUE)
EXIT
ENDIF
IF (c = COUPON_CAR_XMAS2018)
SET_PACKED_STAT_BOOL(PACKED_MP_STAT_PLAYER_HAS_COUPON_CAR_XMAS2018, TRUE)
EXIT
ENDIF
IF (c = COUPON_HELI_XMAS2018)
SET_PACKED_STAT_BOOL(PACKED_MP_STAT_PLAYER_HAS_COUPON_HELI_XMAS2018, TRUE)
EXIT
ENDIF
IF (c = COUPON_CAR2_XMAS2018)
SET_PACKED_STAT_BOOL(PACKED_MP_STAT_PLAYER_HAS_COUPON_CAR2_XMAS2018, TRUE)
EXIT
ENDIF
CONST_INT ciCOUPON_CASINO_LIFETIME_POSIX (48*60) // 48 minutes
IF (c = COUPON_CASINO_PLANE_SITE)
INT iCurrentPosixTime = GET_CLOUD_TIME_AS_INT()
SET_MP_INT_CHARACTER_STAT(MP_STAT_DISCOUNT_PLANE_SITE, iCurrentPosixTime+ciCOUPON_CASINO_LIFETIME_POSIX)
EXIT
ENDIF
IF (c = COUPON_CASINO_BOAT_SITE)
INT iCurrentPosixTime = GET_CLOUD_TIME_AS_INT()
SET_MP_INT_CHARACTER_STAT(MP_STAT_DISCOUNT_BOAT_SITE, iCurrentPosixTime+ciCOUPON_CASINO_LIFETIME_POSIX)
EXIT
ENDIF
IF (c = COUPON_CASINO_CAR_SITE)
INT iCurrentPosixTime = GET_CLOUD_TIME_AS_INT()
SET_MP_INT_CHARACTER_STAT(MP_STAT_DISCOUNT_CAR_SITE, iCurrentPosixTime+ciCOUPON_CASINO_LIFETIME_POSIX)
EXIT
ENDIF
IF (c = COUPON_CASINO_CAR_SITE2)
INT iCurrentPosixTime = GET_CLOUD_TIME_AS_INT()
SET_MP_INT_CHARACTER_STAT(MP_STAT_DISCOUNT_CAR_SITE2, iCurrentPosixTime+ciCOUPON_CASINO_LIFETIME_POSIX)
EXIT
ENDIF
IF (c = COUPON_CASINO_MIL_SITE)
INT iCurrentPosixTime = GET_CLOUD_TIME_AS_INT()
SET_MP_INT_CHARACTER_STAT(MP_STAT_DISCOUNT_MIL_SITE, iCurrentPosixTime+ciCOUPON_CASINO_LIFETIME_POSIX)
EXIT
ENDIF
IF (c = COUPON_CASINO_BIKE_SITE)
INT iCurrentPosixTime = GET_CLOUD_TIME_AS_INT()
SET_MP_INT_CHARACTER_STAT(MP_STAT_DISCOUNT_BIKE_SITE, iCurrentPosixTime+ciCOUPON_CASINO_LIFETIME_POSIX)
EXIT
ENDIF
#IF FEATURE_GEN9_EXCLUSIVE
IF IS_THIS_HSW_MOD_COUPON(c)
INT iCurrentPosixTime = GET_CLOUD_TIME_AS_INT()
SET_MP_INT_CHARACTER_STAT(GET_HSW_MOD_DISCOUNT_STAT(c), iCurrentPosixTime + g_sMPTunables.iHSW_MOD_COUPON_LIFETIME_POSIX)
PRINT_HSW_MOD_COUPON_TICKER()
EXIT
ENDIF
IF IS_THIS_HSW_UPGRADE_COUPON(c)
INT iCurrentNumCoupon = GET_MP_INT_PLAYER_STAT(GET_HSW_UPGRADE_DISCOUNT_STAT(c))
IF iCurrentNumCoupon < g_sMPTunables.iHSW_UPGRADE_COUPON_LIMIT
SET_MP_INT_PLAYER_STAT(GET_HSW_UPGRADE_DISCOUNT_STAT(c), iCurrentNumCoupon + 1)
PRINT_HSW_UPGRADE_COUPON_TICKER()
ELSE
PRINTLN("[OBTAIN_COUPON] Player already has max number of HSW upgrade coupon")
ENDIF
EXIT
ENDIF
IF (c = COUPON_CAR_GEN9_MIGRATION)
SET_PACKED_STAT_BOOL(PACKED_MP_STAT_PLAYER_HAS_COUPON_CAR_GEN9_MIGRATION, TRUE)
PRINTLN("[OBTAIN_COUPON] COUPON_CAR_GEN9_MIGRATION")
EXIT
ENDIF
#ENDIF
BOOL bSetBit = FALSE
IF NOT NETWORK_IS_GAME_IN_PROGRESS()
IF NOT IS_BIT_SET(g_savedGlobals.sFinanceData.iSaveCoupons,ENUM_TO_INT(c))
bSetBit = TRUE
SET_BIT(g_savedGlobals.sFinanceData.iSaveCoupons,ENUM_TO_INT(c))
ENDIF
ELSE
IF NOT IS_BIT_SET(g_savedGlobals.sFinanceData.iSaveCoupons,ENUM_TO_INT(c))
OR NOT IS_BIT_SET(g_savedMPGlobalsNew.g_savedMPGlobals[GET_SAVE_GAME_ARRAY_SLOT()].MpSavedGeneral.iSaveCoupons,ENUM_TO_INT(c))
bSetBit = TRUE
SET_BIT(g_savedGlobals.sFinanceData.iSaveCoupons,ENUM_TO_INT(c))
SET_BIT(g_savedMPGlobalsNew.g_savedMPGlobals[GET_SAVE_GAME_ARRAY_SLOT()].MpSavedGeneral.iSaveCoupons,ENUM_TO_INT(c))
ENDIF
ENDIF
IF bSetBit
//CHAR_LIFEINVADER
PRINTLN("<OBTAIN_COUPON> Displaying coupon notification for \"", GET_COUPON_STRING(c), "\"")
TEXT_LABEL_63 ll = "CHAR_LIFEINVADER"
BEGIN_TEXT_COMMAND_THEFEED_POST("COUP_STR")
ADD_TEXT_COMPONENT_SUBSTRING_TEXT_LABEL(GET_COUPON_STRING(c))
END_TEXT_COMMAND_THEFEED_POST_MESSAGETEXT(ll,ll,TRUE,TEXT_ICON_BLANK, "")
ENDIF
ENDPROC
#IF FEATURE_GEN9_EXCLUSIVE
FUNC BOOL DOES_SAVE_HAVE_ANY_HSW_MOD_COUPON()
COUPON_TYPE couponToCheck
INT iStart = ENUM_TO_INT(COUPON_HSW_MOD1)
INT iEnd = iStart + (g_sMPTunables.iHSW_MOD_COUPON_LIMIT - 1)
INT i
FOR i = iStart TO iEnd
couponToCheck = INT_TO_ENUM(COUPON_TYPE, i)
IF DOES_SAVE_HAVE_COUPON(couponToCheck)
RETURN TRUE
ENDIF
ENDFOR
RETURN FALSE
ENDFUNC
FUNC INT GET_NUM_AVAILABLE_HSW_MOD_COUPON()
COUPON_TYPE couponToCheck
INT iStart = ENUM_TO_INT(COUPON_HSW_MOD1)
INT iEnd = iStart + (g_sMPTunables.iHSW_MOD_COUPON_LIMIT - 1)
INT i, iNumCoupon
FOR i = iStart TO iEnd
couponToCheck = INT_TO_ENUM(COUPON_TYPE, i)
IF DOES_SAVE_HAVE_COUPON(couponToCheck)
iNumCoupon++
ENDIF
ENDFOR
RETURN iNumCoupon
ENDFUNC
DEBUGONLY FUNC STRING GET_DEBUG_HSW_MOD_COUPON_NAME(COUPON_TYPE couponToCheck)
SWITCH couponToCheck
CASE COUPON_HSW_MOD1 RETURN "COUPON_HSW_MOD1"
CASE COUPON_HSW_MOD2 RETURN "COUPON_HSW_MOD2"
CASE COUPON_HSW_MOD3 RETURN "COUPON_HSW_MOD3"
CASE COUPON_HSW_MOD4 RETURN "COUPON_HSW_MOD4"
CASE COUPON_HSW_MOD5 RETURN "COUPON_HSW_MOD5"
CASE COUPON_HSW_MOD6 RETURN "COUPON_HSW_MOD6"
CASE COUPON_HSW_MOD7 RETURN "COUPON_HSW_MOD7"
CASE COUPON_HSW_MOD8 RETURN "COUPON_HSW_MOD8"
CASE COUPON_HSW_MOD9 RETURN "COUPON_HSW_MOD9"
CASE COUPON_HSW_MOD10 RETURN "COUPON_HSW_MOD10"
CASE COUPON_HSW_MOD11 RETURN "COUPON_HSW_MOD11"
CASE COUPON_HSW_MOD12 RETURN "COUPON_HSW_MOD12"
CASE COUPON_HSW_MOD13 RETURN "COUPON_HSW_MOD13"
CASE COUPON_HSW_MOD14 RETURN "COUPON_HSW_MOD14"
CASE COUPON_HSW_MOD15 RETURN "COUPON_HSW_MOD15"
CASE COUPON_HSW_MOD16 RETURN "COUPON_HSW_MOD16"
CASE COUPON_HSW_MOD17 RETURN "COUPON_HSW_MOD17"
CASE COUPON_HSW_MOD18 RETURN "COUPON_HSW_MOD18"
CASE COUPON_HSW_MOD19 RETURN "COUPON_HSW_MOD19"
CASE COUPON_HSW_MOD20 RETURN "COUPON_HSW_MOD20"
ENDSWITCH
RETURN "INVALID COUPON_TYPE"
ENDFUNC
PROC OBTAIN_HSW_MOD_COUPON()
COUPON_TYPE couponToCheck
INT iStart = ENUM_TO_INT(COUPON_HSW_MOD1)
INT iEnd = iStart + (g_sMPTunables.iHSW_MOD_COUPON_LIMIT - 1)
INT i
FOR i = iStart TO iEnd
couponToCheck = INT_TO_ENUM(COUPON_TYPE, i)
IF NOT DOES_SAVE_HAVE_COUPON(couponToCheck)
OBTAIN_COUPON(couponToCheck)
PRINTLN("[OBTAIN_HSW_MOD_COUPON] ", GET_DEBUG_HSW_MOD_COUPON_NAME(couponToCheck))
BREAKLOOP
ENDIF
PRINTLN("[OBTAIN_HSW_MOD_COUPON] No free coupon available")
ENDFOR
ENDPROC
FUNC COUPON_TYPE GET_NEXT_AVAILABLE_HSW_MOD_COUPON()
COUPON_TYPE nextCoupon
INT couponToCheck[MAX_NUM_HSW_MOD_COUPON]
INT iStart = ENUM_TO_INT(COUPON_HSW_MOD1)
INT iEnd = iStart + (g_sMPTunables.iHSW_MOD_COUPON_LIMIT - 1)
INT i, iArrayIndex
// Add them all to array
FOR i = iStart TO iEnd
IF DOES_SAVE_HAVE_COUPON(INT_TO_ENUM(COUPON_TYPE, i))
couponToCheck[iArrayIndex] = GET_MP_INT_CHARACTER_STAT(GET_HSW_MOD_DISCOUNT_STAT(INT_TO_ENUM(COUPON_TYPE, i)))
ENDIF
iArrayIndex++
ENDFOR
// Find which is going to be exipre soon
INT min = HIGHEST_INT
i = 0
iArrayIndex = 0
FOR i = 0 TO g_sMPTunables.iHSW_MOD_COUPON_LIMIT - 1
IF couponToCheck[i] <= min
AND couponToCheck[i] > 0
min = couponToCheck[i]
iArrayIndex = i
PRINTLN("[REDEEM_HSW_MOD_COUPON] min: ", min, " iArrayIndex: ", iArrayIndex, " i: ", i)
ENDIF
ENDFOR
INT iCouponToRedeem = ENUM_TO_INT(COUPON_HSW_MOD1) + iArrayIndex
nextCoupon = INT_TO_ENUM(COUPON_TYPE, iCouponToRedeem)
RETURN nextCoupon
ENDFUNC
PROC REDEEM_HSW_MOD_COUPON()
COUPON_TYPE nextCoupon = GET_NEXT_AVAILABLE_HSW_MOD_COUPON()
PRINTLN("[REDEEM_HSW_MOD_COUPON] ", GET_DEBUG_HSW_MOD_COUPON_NAME(nextCoupon))
REDEEM_COUPON(nextCoupon)
ENDPROC
FUNC INT GET_NUM_AVAILABLE_HSW_UPGRADE_COUPON()
RETURN GET_MP_INT_PLAYER_STAT(GET_HSW_UPGRADE_DISCOUNT_STAT(COUPON_HSW_UPGRADE))
ENDFUNC
FUNC BOOL DOES_SAVE_HAVE_ANY_HSW_UPGRADE_COUPON()
RETURN GET_NUM_AVAILABLE_HSW_UPGRADE_COUPON() > 0
ENDFUNC
#ENDIF
//// PURPOSE:
/// Checks the SC inbox for coupons
PROC UPDATE_COUPONS()
INT mess = SC_INBOX_GET_TOTAL_NUM_MESSAGES()
IF mess > 0
INT i = 0
REPEAT mess i
TEXT_LABEL_63 type = SC_INBOX_MESSAGE_GET_RAW_TYPE_AT_INDEX(i)
IF GET_HASH_KEY(type) = HASH("coupon")
IF NOT SC_INBOX_GET_MESSAGE_IS_READ_AT_INDEX(i)
INT iCouponIndex = 0
IF SC_INBOX_MESSAGE_GET_DATA_INT(i,"i",iCouponIndex)
COUPON_TYPE ct = INT_TO_ENUM(COUPON_TYPE,iCouponIndex)
if !g_bLoadedClifford
IF NOT DOES_SAVE_HAVE_COUPON(ct)
AND NOT SC_INBOX_GET_MESSAGE_IS_READ_AT_INDEX(i)
OBTAIN_COUPON(ct)
ENDIF
else
IF NOT DOES_SAVE_HAVE_COUPON_CLF(ct)
AND NOT SC_INBOX_GET_MESSAGE_IS_READ_AT_INDEX(i)
OBTAIN_COUPON_CLF(ct)
ENDIF
endif
ENDIF
SC_INBOX_SET_MESSAGE_AS_READ_AT_INDEX(i)
ENDIF
ENDIF
ENDREPEAT
ENDIF
ENDPROC
/*
Vom Feuer (VOM)
Shrewsbury (SHR)
Hawk & Little (HAL)
//depot/gta5/art/Models/Props/Weapons/ZZZ_WeaponDocs/GTA_Weapon_Clearance_Condensed.xlsx
*/
ENUM BAWSAQ_INTERNAL_WEAPON_COMPANY
WEPCO_VOM_FEUER,//US
WEPCO_SHREWSBURY,//Slavshit
WEPCO_HAWK_AND_LITTLE,//Swiss
WEPCO_NONE
ENDENUM
/// PURPOSE:
/// Takes a weapon type returns the company it's assigned to
/// PARAMS:
/// mn -
/// RETURNS:
///
FUNC BAWSAQ_INTERNAL_WEAPON_COMPANY WEAPON_MODEL_PARSE(WEAPON_TYPE mn)
SWITCH mn//if these enums change feel free to comment out any of this list and send an email about it to whoever cares
CASE WEAPONTYPE_STICKYBOMB
CASE WEAPONTYPE_STUNGUN
CASE WEAPONTYPE_GRENADELAUNCHER
CASE WEAPONTYPE_HEAVYSNIPER
CASE WEAPONTYPE_CARBINERIFLE
CASE WEAPONTYPE_DLC_SPECIALCARBINE
CASE WEAPONTYPE_SMG
CASE WEAPONTYPE_ASSAULTSHOTGUN
CASE WEAPONTYPE_APPISTOL
RETURN WEPCO_VOM_FEUER
BREAK
CASE WEAPONTYPE_SMOKEGRENADE
CASE WEAPONTYPE_REMOTESNIPER
CASE WEAPONTYPE_RPG
CASE WEAPONTYPE_MG
CASE WEAPONTYPE_ADVANCEDRIFLE
CASE WEAPONTYPE_MICROSMG
CASE WEAPONTYPE_SAWNOFFSHOTGUN
CASE WEAPONTYPE_PISTOL
RETURN WEPCO_SHREWSBURY
BREAK
CASE WEAPONTYPE_GRENADE
CASE WEAPONTYPE_MINIGUN
CASE WEAPONTYPE_SNIPERRIFLE
CASE WEAPONTYPE_COMBATMG
CASE WEAPONTYPE_ASSAULTRIFLE
CASE WEAPONTYPE_PUMPSHOTGUN
CASE WEAPONTYPE_COMBATPISTOL
RETURN WEPCO_HAWK_AND_LITTLE
BREAK
DEFAULT
PRINTSTRING("WEAPON_MODEL_PARSE unknown weapon: ")
PRINTINT(ENUM_TO_INT(mn))
PRINTNL()
RETURN WEPCO_NONE
BREAK
ENDSWITCH
RETURN WEPCO_NONE
ENDFUNC
PROC INFORM_STOCK_SYS_WEAPON_BOUGHT(WEAPON_TYPE mn)
SWITCH WEAPON_MODEL_PARSE(mn)
//BSMF_SM_WEPBUY_FOR_SHR,// WeaponTypeBought : used by Shewsbury
//BSMF_SM_WEPBUY_FOR_HAL,// WeaponTypeBought : used by HawkAndLittle
CASE WEPCO_SHREWSBURY
BAWSAQ_INCREMENT_MODIFIER(BSMF_SM_WEPBUY_FOR_SHR)
BREAK
CASE WEPCO_HAWK_AND_LITTLE
BAWSAQ_INCREMENT_MODIFIER(BSMF_SM_WEPBUY_FOR_HAL)
BREAK
ENDSWITCH
ENDPROC
// *****************************************************************************************
// ********************************Account management functions*****************************
/// PURPOSE:
/// Called by DO_BANK_ACCOUNT_ACTION to update the stats
PROC BANK_FORCE_UPDATE_LINKED_ACCOUNT_STATS(enumBankAccountName acc)
CDEBUG1LN(DEBUG_FINANCE, "Pushing script account value to stats...")
INT passingStruct
// printDebugString("Updating bank stats for account")
// PRINTNL()
passingStruct = g_BankAccounts[acc].iBalance
SWITCH acc
CASE BANK_ACCOUNT_MICHAEL
CDEBUG1LN(DEBUG_FINANCE, "Setting SP0_TOTAL_CASH to $", passingStruct, ".")
STAT_SET_INT(SP0_TOTAL_CASH, passingStruct)
BREAK
CASE BANK_ACCOUNT_FRANKLIN
CDEBUG1LN(DEBUG_FINANCE, "Setting SP1_TOTAL_CASH to $", passingStruct, ".")
STAT_SET_INT(SP1_TOTAL_CASH, passingStruct)
BREAK
CASE BANK_ACCOUNT_TREVOR
CDEBUG1LN(DEBUG_FINANCE, "Setting SP2_TOTAL_CASH to $", passingStruct, ".")
STAT_SET_INT(SP2_TOTAL_CASH, passingStruct)
BREAK
ENDSWITCH
ENDPROC
/// PURPOSE:
/// Checks for direct modification of the bank account stats, and makes the system match if needed
PROC BANK_CHECK_FOR_CODE_DEPOSITS()
INT receivingStruct
CDEBUG1LN(DEBUG_FINANCE, "Checking to see if script bank balances match stats...")
IF NETWORK_IS_SIGNED_IN()
STAT_GET_INT(SP0_TOTAL_CASH, receivingStruct)
IF NOT (g_BankAccounts[BANK_ACCOUNT_MICHAEL].iBalance = receivingStruct)
CDEBUG1LN(DEBUG_FINANCE, "Updating BANK_ACCOUNT_MICHAEL to match stat SP0_TOTAL_CASH. Script: $", g_BankAccounts[BANK_ACCOUNT_MICHAEL].iBalance, " Stat: $", receivingStruct, ".")
g_BankAccounts[BANK_ACCOUNT_MICHAEL].iBalance = receivingStruct
ENDIF
STAT_GET_INT(SP1_TOTAL_CASH, receivingStruct)
IF NOT (g_BankAccounts[BANK_ACCOUNT_FRANKLIN].iBalance = receivingStruct)
CDEBUG1LN(DEBUG_FINANCE, "Updating BANK_ACCOUNT_FRANKLIN to match stat SP1_TOTAL_CASH. Script: $", g_BankAccounts[BANK_ACCOUNT_FRANKLIN].iBalance, " Stat: $", receivingStruct, ".")
g_BankAccounts[BANK_ACCOUNT_FRANKLIN].iBalance = receivingStruct
ENDIF
STAT_GET_INT(SP2_TOTAL_CASH, receivingStruct)
IF NOT (g_BankAccounts[BANK_ACCOUNT_TREVOR].iBalance = receivingStruct)
CDEBUG1LN(DEBUG_FINANCE, "Updating BANK_ACCOUNT_TREVOR to match stat SP2_TOTAL_CASH. Script: $", g_BankAccounts[BANK_ACCOUNT_TREVOR].iBalance, " Stat: $", receivingStruct, ".")
g_BankAccounts[BANK_ACCOUNT_TREVOR].iBalance = receivingStruct
ENDIF
#IF IS_DEBUG_BUILD
ELSE
CDEBUG1LN(DEBUG_FINANCE, "The player was not signed in to a profile. Could not retrieve stat values.")
#ENDIF
ENDIF
ENDPROC
PROC QUICK_INCREMENT_INT_STAT(STATSENUM e, INT amount)
INT istat
STAT_GET_INT(e,istat)
istat += amount
STAT_SET_INT(e,istat)
ENDPROC
/// PURPOSE:
/// Gets the bank action scource string for the given enumerator
/// PARAMS:
/// baacin - The account action source to get the name of
/// RETURNS:
///
FUNC STRING GET_BAAC_STRING_TAG(BANK_ACCOUNT_ACTION_SOURCE_BAAC baacin)
SWITCH baacin
// Mission character.
CASE BAAC_SIMEON RETURN "ACCNA_SIM" BREAK
CASE BAAC_LESTER RETURN "ACCNA_LES" BREAK
CASE BAAC_AMANDA RETURN "ACCNA_AMA" BREAK
CASE BAAC_JIMMY RETURN "ACCNA_JIM" BREAK
CASE BAAC_TRACEY RETURN "ACCNA_TRA" BREAK
CASE BAAC_OSCAR RETURN "ACCNA_OSC" BREAK
CASE BAAC_ABIGAIL RETURN "ACCNA_ABI" BREAK
CASE BAAC_RE_BURIAL RETURN "ACCNA_BUR" BREAK
CASE BAAC_MICHAEL RETURN "ACCNA_MIKE" BREAK
CASE BAAC_SHRINK RETURN "ACCNA_DRFR" BREAK
CASE BAAC_STRIP_CLUB RETURN "ACCNA_STRP" BREAK
CASE BAAC_MRSPOKE RETURN "ACCNA_MRSPOKE" BREAK
CASE BAAC_LOS_SANTOS_GOLF_CLUB RETURN "ACCNA_GOL_CLU" BREAK
// Company
CASE BAAC_CLUCKING_BELL RETURN "ACCNA_CBELL" BREAK
CASE BAAC_WHIZZ_PHONE RETURN "ACCNA_WHIZZ" BREAK
CASE BAAC_MADAM_CHONGS RETURN "ACCNA_MCHON" BREAK
CASE BAAC_DS_CLOTHING RETURN "ACCNA_DSACH" BREAK
CASE BAAC_LOS_SANTOS_HOSPITAL RETURN "ACCNA_LSANH" BREAK
CASE BAAC_CRAPKIA RETURN "ACCNA_CRAPKI" BREAK
CASE BAAC_VINE_CLEAN RETURN "ACCNA_VCLEAN" BREAK
CASE BAAC_CANDYSUXX RETURN "ACCNA_CSUX" BREAK
CASE BAAC_VINEWOOD_BEAUTY RETURN "ACCNA_VBEU" BREAK
CASE BAAC_AMMUNATION RETURN "ACCNA_ANAT" BREAK
// Bars
CASE BAAC_BAHAMAMAMAS RETURN "ACCNA_BAHAMA" BREAK
CASE BAAC_BAY_BAR RETURN "ACCNA_BAR_BY" BREAK
CASE BAAC_BIKER_BAR RETURN "ACCNA_BAR_BI" BREAK
CASE BAAC_HIMEN_BAR RETURN "ACCNA_BAR_HI" BREAK
CASE BAAC_MOJITOS_BAR RETURN "ACCNA_BAR_MO" BREAK
CASE BAAC_SHENANIGANS_BAR RETURN "ACCNA_BAR_SH" BREAK
CASE BAAC_SINGLETONS_BAR RETURN "ACCNA_BAR_SI" BREAK
// Services
CASE BAAC_TAXI RETURN "ACCNA_TAXI" BREAK
CASE BAAC_DRUG_TRAFFICKING RETURN "ACCNA_DTRAF" BREAK
CASE BAAC_CAR_REPO RETURN "ACCNA_REPO" BREAK
CASE BAAC_HUNTING RETURN "ACCNA_HUNT" BREAK
CASE BAAC_SHOOTING_RANGE RETURN "ACCNA_RANGE" BREAK
CASE BAAC_RACES RETURN "ACCNA_RACES" BREAK
// Other/misc.
CASE BAAC_EPSILON_SITE_DONATION RETURN "ACCNA_EPS_ST" BREAK
CASE BAAC_EPSILON_ROBES_DONATION RETURN "ACCNA_EPS_RB" BREAK
// Stock brokerage.
CASE BAAC_BROKERAGE_PAYMENT RETURN "ACCNA_BROKERA" BREAK
// Vehicle websites
CASE BAAC_MOTORSPORT_SITE RETURN "ACCNA_CARSITE" BREAK
CASE BAAC_ARMY_SITE RETURN "ACCNA_ARMYSITE" BREAK
CASE BAAC_PLANE_SITE RETURN "ACCNA_PLANESITE" BREAK
CASE BAAC_BOAT_SITE RETURN "ACCNA_BOATSITE" BREAK
CASE BAAC_BIKE_SITE RETURN "ACCNA_BIKESITE" BREAK
CASE BAAC_SUPERAUTO_SITE RETURN "ACCNA_AUTOSITE" BREAK
CASE BAAC_LOWRIDER_SITE RETURN "ACCNA_LOSSSITE" BREAK
CASE BAAC_ARENA_SITE RETURN "ACCNA_ARENASITE" BREAK
// Misc
CASE BAAC_CASH_DEPOSIT RETURN "ACCNA_CASHDEP" BREAK
CASE BAAC_BAIL_BONDS RETURN "ACCNA_BAILBONDS" BREAK
CASE BAAC_HEIST_OFFSHORE_ACCOUNT RETURN "ACCNA_HOFFSHORE" BREAK
CASE BAAC_SNACKS RETURN "ACCNA_SNACK" BREAK
// Barbers & Hairdressers
CASE BAAC_HAIRDO_SHOP_01_BH RETURN "S_H_01" BREAK
CASE BAAC_HAIRDO_SHOP_02_SC RETURN "S_H_02" BREAK
CASE BAAC_HAIRDO_SHOP_03_V RETURN "S_H_03" BREAK
CASE BAAC_HAIRDO_SHOP_04_SS RETURN "S_H_04" BREAK
CASE BAAC_HAIRDO_SHOP_05_MP RETURN "S_H_05" BREAK
CASE BAAC_HAIRDO_SHOP_06_HW RETURN "S_H_06" BREAK
CASE BAAC_HAIRDO_SHOP_07_PB RETURN "S_H_07" BREAK
// Clothes shops
CASE BAAC_CLOTHES_SHOP_L_01_SC RETURN "S_CL_01" BREAK
CASE BAAC_CLOTHES_SHOP_L_02_GS RETURN "S_CL_02" BREAK
CASE BAAC_CLOTHES_SHOP_L_03_DT RETURN "S_CL_03" BREAK
CASE BAAC_CLOTHES_SHOP_L_04_CS RETURN "S_CL_04" BREAK
CASE BAAC_CLOTHES_SHOP_L_05_GSD RETURN "S_CL_05" BREAK
CASE BAAC_CLOTHES_SHOP_L_06_VC RETURN "S_CL_06" BREAK
CASE BAAC_CLOTHES_SHOP_L_07_PB RETURN "S_CL_07" BREAK
CASE BAAC_CLOTHES_SHOP_M_01_SM RETURN "S_CM_01" BREAK
CASE BAAC_CLOTHES_SHOP_M_03_H RETURN "S_CM_03" BREAK
CASE BAAC_CLOTHES_SHOP_M_04_HW RETURN "S_CM_04" BREAK
CASE BAAC_CLOTHES_SHOP_M_05_GOH RETURN "S_CM_05" BREAK
CASE BAAC_CLOTHES_SHOP_H_01_BH RETURN "S_CH_01" BREAK
CASE BAAC_CLOTHES_SHOP_H_02_B RETURN "S_CH_02" BREAK
CASE BAAC_CLOTHES_SHOP_H_03_MW RETURN "S_CH_03" BREAK
CASE BAAC_CLOTHES_SHOP_A_01_VB RETURN "S_CA_01" BREAK
// Tattoo parlour
CASE BAAC_TATTOO_PARLOUR_01_HW RETURN "S_T_01" BREAK
CASE BAAC_TATTOO_PARLOUR_02_SS RETURN "S_T_02" BREAK
CASE BAAC_TATTOO_PARLOUR_03_PB RETURN "S_T_03" BREAK
CASE BAAC_TATTOO_PARLOUR_04_VC RETURN "S_T_04" BREAK
CASE BAAC_TATTOO_PARLOUR_05_ELS RETURN "S_T_05" BREAK
CASE BAAC_TATTOO_PARLOUR_06_GOH RETURN "S_T_06" BREAK
// AmmuNation
CASE BAAC_GUN_SHOP_01_DT RETURN "S_G_01" BREAK
CASE BAAC_GUN_SHOP_02_SS RETURN "S_G_02" BREAK
CASE BAAC_GUN_SHOP_03_HW RETURN "S_G_03" BREAK
CASE BAAC_GUN_SHOP_04_ELS RETURN "S_G_04" BREAK
CASE BAAC_GUN_SHOP_05_PB RETURN "S_G_05" BREAK
CASE BAAC_GUN_SHOP_06_LS RETURN "S_G_06" BREAK
CASE BAAC_GUN_SHOP_07_MW RETURN "S_G_07" BREAK
CASE BAAC_GUN_SHOP_08_CS RETURN "S_G_08" BREAK
CASE BAAC_GUN_SHOP_09_GOH RETURN "S_G_09" BREAK
CASE BAAC_GUN_SHOP_10_VWH RETURN "S_G_10" BREAK
CASE BAAC_GUN_SHOP_11_ID1 RETURN "S_G_11" BREAK
// Car mod
CASE BAAC_CARMOD_SHOP_01_AP RETURN "S_MO_01" BREAK
CASE BAAC_CARMOD_SHOP_05_ID2 RETURN "S_MO_05" BREAK
CASE BAAC_CARMOD_SHOP_06_BT1 RETURN "S_MO_06" BREAK
CASE BAAC_CARMOD_SHOP_07_CS1 RETURN "S_MO_07" BREAK
CASE BAAC_CARMOD_SHOP_08_CS6 RETURN "S_MO_08" BREAK
CASE BAAC_CARMOD_SHOP_SUPERMOD RETURN "S_MO_09" BREAK
// Properties
CASE BAAC_PROP_TOWING RETURN "ACCNA_TOWING" BREAK // Towing Impound (Franklin)
CASE BAAC_PROP_TAXI RETURN "ACCNA_TAXI_LOT" BREAK // Taxi Lot (all)
CASE BAAC_PROP_ARMS RETURN "ACCNA_ARMS" BREAK // Arms Trafficking (Trevor)
CASE BAAC_PROP_SONAR RETURN "ACCNA_SONAR" BREAK // Sonar Collections (All)
CASE BAAC_PROP_CARMOD RETURN "ACCNA_CARMOD" BREAK // Car Mod Shop (Franklin)
CASE BAAC_PROP_VCINEMA RETURN "ACCNA_VCINEMA" BREAK // Vinewood Cinema (Michael)
CASE BAAC_PROP_DCINEMA RETURN "ACCNA_DCINEMA" BREAK // Downtown Cinema (Michael)
CASE BAAC_PROP_MCINEMA RETURN "ACCNA_MCINEMA" BREAK // Morningwood Cinema (Michael)
CASE BAAC_PROP_GOLF RETURN "ACCNA_GOLF" BREAK // Golf club (All)
CASE BAAC_PROP_CSCRAP RETURN "ACCNA_CSCRAP" BREAK // Car Scrap Yard (Franklin)
CASE BAAC_PROP_SMOKE RETURN "ACCNA_SMOKE" BREAK // Smoke on the Water Weed Shop (Franklin)
CASE BAAC_PROP_BAR_TEQUILA RETURN "ACCNA_TEQUILA" BREAK // Tequi-la-la Bar (All)
CASE BAAC_PROP_BAR_PITCHERS RETURN "ACCNA_PITCHERS" BREAK // Pitchers (All)
CASE BAAC_PROP_BAR_HEN RETURN "ACCNA_HEN" BREAK // The Hen House (all)
CASE BAAC_PROP_BAR_HOOKIES RETURN "ACCNA_HOOKIES" BREAK // Hookies Bar (all)
CASE BAAC_PROP_MARINA RETURN "ACCNA_MARINA" BREAK
CASE BAAC_PROP_HANGAR RETURN "ACCNA_HANGAR" BREAK
CASE BAAC_PROP_HELIPAD RETURN "ACCNA_HELIPAD" BREAK
CASE BAAC_PROP_GARAGE RETURN "ACCNA_GARAGE" BREAK
// Police Stations
CASE BAAC_POLICE_STATION_VB RETURN "ACCNA_PD_VB" BREAK // Vespucci Beach
CASE BAAC_POLICE_STATION_SC RETURN "ACCNA_PD_SC" BREAK // South Central
CASE BAAC_POLICE_STATION_DT RETURN "ACCNA_PD_DT" BREAK // Downtown
CASE BAAC_POLICE_STATION_RH RETURN "ACCNA_PD_RH" BREAK // Rockford Hills
CASE BAAC_POLICE_STATION_SS RETURN "ACCNA_PD_SS" BREAK // Sandy Shores
CASE BAAC_POLICE_STATION_PB RETURN "ACCNA_PD_PB" BREAK // Paleto Bay
CASE BAAC_POLICE_STATION_HW RETURN "ACCNA_PD_HW" BREAK // Vinewood (#1289759)
//Hospitals
CASE BAAC_HOSPITAL_RH RETURN "ACCNA_H_RH" BREAK // Rockford Hills
CASE BAAC_HOSPITAL_SC RETURN "ACCNA_H_SC" BREAK // South Central
CASE BAAC_HOSPITAL_DT RETURN "ACCNA_H_DT" BREAK // Downtown
CASE BAAC_HOSPITAL_SS RETURN "ACCNA_H_SS" BREAK // Sandy Shores
CASE BAAC_HOSPITAL_PB RETURN "ACCNA_H_PB" BREAK // Paleto Bay
// Websites
CASE BAAC_CONSITE RETURN "ACCNA_CONSIT" BREAK
CASE BAAC_REALITY_MILL RETURN "ACCNA_TRMSITE" BREAK
// MP
CASE BAAC_DYNASTY_PROPERTY RETURN "ACCNA_DYNPROP" BREAK
// Debug non-logged transaction.
#IF IS_DEBUG_BUILD
CASE BAAC_DEFAULT_DEBUG RETURN "DEBUG_DONOTLOG" BREAK
CASE BAAC_UNLOGGED_SMALL_ACTION RETURN "THISSHOULDNOTBELOGGED" BREAK
#ENDIF
ENDSWITCH
CPRINTLN(DEBUG_FINANCE, "Unset BAAC_ string index ", baacin, ".")
SCRIPT_ASSERT("Unset BAAC_ enum string, see log for index.")
RETURN ""
ENDFUNC
/// PURPOSE:
/// Carries out an account action.
/// PARAMS:
/// accountname - The account to act upon
/// actiontype - The action to take
/// actionsource - The character/buisiness making the transaction, used for logging
/// actiondegree - The degree of change of this action
/// bForceAction - Allows the action to go through despite safety checks failing.
/// For example debiting an account without enough money.
FUNC BOOL DO_BANK_ACCOUNT_ACTION(enumBankAccountName accountname, BANK_ACCOUNT_ACTION_TYPE actiontype, BANK_ACCOUNT_ACTION_SOURCE_BAAC actionsource, INT actiondegree, BOOL bForceAction = FALSE)
#IF IS_DEBUG_BUILD
BOOL bCrediting = TRUE
IF actiontype = BAA_DEBIT
bCrediting = FALSE
ENDIF
CPRINTLN(DEBUG_FINANCE, "Attempting bank account action... AccountID '", ENUM_TO_INT(accountname),"' ", PICK_STRING(bCrediting, "credited", "debited"), " by $", actiondegree, ".")
#ENDIF
// First check current code state to prevent bad things happening on load with this command in the flow.
BANK_CHECK_FOR_CODE_DEPOSITS()
#IF IS_DEBUG_BUILD
IF ((!g_bLoadedClifford and !g_bLoadedNorman and GET_HASH_OF_THIS_SCRIPT_NAME() != HASH("debug"))
OR (g_bLoadedClifford and GET_HASH_OF_THIS_SCRIPT_NAME() != HASH("debugCLF"))
OR (g_bLoadedNorman and GET_HASH_OF_THIS_SCRIPT_NAME() != HASH("debugNRM")))
IF actionsource = BAAC_DEFAULT_DEBUG
SCRIPT_ASSERT("Do not use BAAC_DEFAULT_DEBUG, please add a transcation entry or use BAAC_UNLOGGED_SMALL_ACTION if you do not want your transaction to appear in the log.")
ELSE
IF actionsource != BAAC_UNLOGGED_SMALL_ACTION
IF NOT DOES_TEXT_LABEL_EXIST(GET_BAAC_STRING_TAG(actionsource))
SCRIPT_ASSERT("Bank account action source enum with a missing string called from this script OR the text files are out of date. Please add an entry for this enum to GET_BAAC_STRING_TAG")
ENDIF
ENDIF
ENDIF
ENDIF
#ENDIF
IF actiondegree < 1 //I'm tired of the assert, it is dumb anyway
CDEBUG1LN(DEBUG_FINANCE, "Action failed as we are not operating on a positive value.")
RETURN FALSE
ENDIF
FLOAT fDiscount = 1.0
COUPON_TYPE ct
SWITCH actiontype
CASE BAA_DEBIT
SWITCH accountname
CASE BANK_ACCOUNT_MICHAEL
BAWSAQ_INCREMENT_MODIFIER(BSMF_SM_MONSP_FOR_BOL)
QUICK_INCREMENT_INT_STAT(SP0_MONEY_TOTAL_SPENT, actiondegree)
BREAK
CASE BANK_ACCOUNT_FRANKLIN
QUICK_INCREMENT_INT_STAT(SP1_MONEY_TOTAL_SPENT, actiondegree)
BREAK
CASE BANK_ACCOUNT_TREVOR
QUICK_INCREMENT_INT_STAT(SP2_MONEY_TOTAL_SPENT, actiondegree)
BREAK
ENDSWITCH
CHECK_THATS_A_LOT_OF_CHEDDAR_ACHIEVEMENT()
SWITCH actionsource
CASE BAAC_HOSPITAL_DT
CASE BAAC_HOSPITAL_PB
CASE BAAC_HOSPITAL_RH
CASE BAAC_HOSPITAL_SC
CASE BAAC_HOSPITAL_SS
IF DOES_SAVE_HAVE_COUPON(COUPON_MEDICAL)
fDiscount = 0.9
ct=COUPON_MEDICAL
ENDIF
BREAK
CASE BAAC_TATTOO_PARLOUR_01_HW // Tattoo - Vinewood
CASE BAAC_TATTOO_PARLOUR_02_SS // Tattoo - Sandy Shores
CASE BAAC_TATTOO_PARLOUR_03_PB // Tattoo - Paleto Bay
CASE BAAC_TATTOO_PARLOUR_04_VC // Tattoo - Vespucci Canals
CASE BAAC_TATTOO_PARLOUR_05_ELS // Tattoo - East Los Santos
CASE BAAC_TATTOO_PARLOUR_06_GOH // Tattoo - Great Ocean Highway
SWITCH accountname
CASE BANK_ACCOUNT_MICHAEL
QUICK_INCREMENT_INT_STAT(SP0_MONEY_SPENT_ON_TATTOOS, actiondegree)
BREAK
CASE BANK_ACCOUNT_FRANKLIN
QUICK_INCREMENT_INT_STAT(SP1_MONEY_SPENT_ON_TATTOOS, actiondegree)
BREAK
CASE BANK_ACCOUNT_TREVOR
QUICK_INCREMENT_INT_STAT(SP2_MONEY_SPENT_ON_TATTOOS, actiondegree)
BREAK
ENDSWITCH
IF DOES_SAVE_HAVE_COUPON(COUPON_TATOO)
fDiscount = 0.0
ct=COUPON_TATOO
ENDIF
BREAK
CASE BAAC_TAXI
SWITCH accountname
CASE BANK_ACCOUNT_MICHAEL
QUICK_INCREMENT_INT_STAT(SP0_MONEY_SPENT_ON_TAXIS,actiondegree)
CPRINTLN(DEBUG_FINANCE, "Incrementing SP0_MONEY_SPENT_ON_TAXIS stat for by ", actiondegree )
BREAK
CASE BANK_ACCOUNT_FRANKLIN
QUICK_INCREMENT_INT_STAT(SP1_MONEY_SPENT_ON_TAXIS,actiondegree)
CPRINTLN(DEBUG_FINANCE, "Incrementing SP1_MONEY_SPENT_ON_TAXIS stat for by ", actiondegree )
BREAK
CASE BANK_ACCOUNT_TREVOR
QUICK_INCREMENT_INT_STAT(SP2_MONEY_SPENT_ON_TAXIS,actiondegree)
CPRINTLN(DEBUG_FINANCE, "Incrementing SP2_MONEY_SPENT_ON_TAXIS stat for by ", actiondegree )
BREAK
ENDSWITCH
BREAK
CASE BAAC_STRIP_CLUB
SWITCH accountname
CASE BANK_ACCOUNT_MICHAEL
QUICK_INCREMENT_INT_STAT(SP0_MONEY_SPENT_IN_STRIP_CLUBS, actiondegree)
CPRINTLN(DEBUG_FINANCE, "Incrementing finance stat for mike by ", actiondegree )
BREAK
CASE BANK_ACCOUNT_FRANKLIN
QUICK_INCREMENT_INT_STAT(SP1_MONEY_SPENT_IN_STRIP_CLUBS, actiondegree)
CPRINTLN(DEBUG_FINANCE, "Incrementing finance stat for franklin by ", actiondegree )
BREAK
CASE BANK_ACCOUNT_TREVOR
QUICK_INCREMENT_INT_STAT(SP2_MONEY_SPENT_IN_STRIP_CLUBS, actiondegree)
CPRINTLN(DEBUG_FINANCE, "Incrementing finance stat for trevor by ", actiondegree )
BREAK
ENDSWITCH
BREAK
CASE BAAC_PROP_TOWING//Towing Impound (Franklin)
CASE BAAC_PROP_TAXI//Taxi Lot (all)
CASE BAAC_PROP_ARMS//Arms Trafficking (Trevor)
CASE BAAC_PROP_SONAR//Sonar Collections (All)
CASE BAAC_PROP_VCINEMA// Vinewood Cinema (Michael)
CASE BAAC_PROP_DCINEMA// Downtown Cinema (Michael)
CASE BAAC_PROP_MCINEMA// Morningwood Cinema (Michael)
CASE BAAC_PROP_GOLF// Golf club (All)
CASE BAAC_PROP_CSCRAP// Car Scrap Yard (Franklin)
CASE BAAC_PROP_SMOKE// Smoke on the Water Weed Shop (Franklin)
CASE BAAC_PROP_BAR_TEQUILA// Tequi-la-la Bar (All)
CASE BAAC_PROP_BAR_PITCHERS// Pitchers (All)
CASE BAAC_PROP_BAR_HEN// The Hen House (all)
CASE BAAC_PROP_BAR_HOOKIES// Hookies Bar (all)
SWITCH accountname
CASE BANK_ACCOUNT_MICHAEL
QUICK_INCREMENT_INT_STAT(SP0_MONEY_SPENT_PROPERTY, actiondegree)
BREAK
CASE BANK_ACCOUNT_FRANKLIN
QUICK_INCREMENT_INT_STAT(SP1_MONEY_SPENT_PROPERTY, actiondegree)
BREAK
CASE BANK_ACCOUNT_TREVOR
QUICK_INCREMENT_INT_STAT(SP2_MONEY_SPENT_PROPERTY, actiondegree)
BREAK
ENDSWITCH
BREAK
DEFAULT
SWITCH(GET_HASH_OF_THIS_SCRIPT_NAME())
CASE HASH("clothes_shop_sp")
SWITCH accountname
CASE BANK_ACCOUNT_MICHAEL
CPRINTLN(DEBUG_FINANCE, "Incrementing SPENT_IN_CLOTHES stat for Mike by $", actiondegree ,".")
QUICK_INCREMENT_INT_STAT(SP0_MONEY_SPENT_IN_CLOTHES, actiondegree)
BREAK
CASE BANK_ACCOUNT_FRANKLIN
CPRINTLN(DEBUG_FINANCE, "Incrementing SPENT_IN_CLOTHES stat for Franklin by $", actiondegree ,".")
QUICK_INCREMENT_INT_STAT(SP1_MONEY_SPENT_IN_CLOTHES,actiondegree)
BREAK
CASE BANK_ACCOUNT_TREVOR
CPRINTLN(DEBUG_FINANCE, "Incrementing SPENT_IN_CLOTHES stat for Trevor by $", actiondegree ,".")
QUICK_INCREMENT_INT_STAT(SP2_MONEY_SPENT_IN_CLOTHES,actiondegree)
BREAK
ENDSWITCH
BREAK
CASE HASH("hairdo_shop_sp")
SWITCH accountname
CASE BANK_ACCOUNT_MICHAEL
CPRINTLN(DEBUG_FINANCE, "Incrementing SPENT_ON_HAIRDOS stat for Mike by $", actiondegree ,".")
QUICK_INCREMENT_INT_STAT(SP0_MONEY_SPENT_ON_HAIRDOS, actiondegree)
BREAK
CASE BANK_ACCOUNT_FRANKLIN
CPRINTLN(DEBUG_FINANCE, "Incrementing SPENT_ON_HAIRDOS stat for Franklin by $", actiondegree ,".")
QUICK_INCREMENT_INT_STAT(SP1_MONEY_SPENT_ON_HAIRDOS, actiondegree)
BREAK
CASE BANK_ACCOUNT_TREVOR
CPRINTLN(DEBUG_FINANCE, "Incrementing SPENT_ON_HAIRDOS stat for Trevor by $", actiondegree ,".")
QUICK_INCREMENT_INT_STAT(SP2_MONEY_SPENT_ON_HAIRDOS, actiondegree)
BREAK
ENDSWITCH
IF DOES_SAVE_HAVE_COUPON(COUPON_HAIRCUT)
fDiscount = 0.0
ct=COUPON_HAIRCUT
ENDIF
BREAK
CASE HASH("gunclub_shop")
SWITCH accountname
CASE BANK_ACCOUNT_MICHAEL
CPRINTLN(DEBUG_FINANCE, "Incrementing SPENT_IN_BUYING_GUNS stat for Mike by $", actiondegree ,".")
QUICK_INCREMENT_INT_STAT(SP0_MONEY_SPENT_IN_BUYING_GUNS, actiondegree)
BREAK
CASE BANK_ACCOUNT_FRANKLIN
CPRINTLN(DEBUG_FINANCE, "Incrementing SPENT_IN_BUYING_GUNS stat for Franklin by $", actiondegree ,".")
QUICK_INCREMENT_INT_STAT(SP1_MONEY_SPENT_IN_BUYING_GUNS, actiondegree)
BREAK
CASE BANK_ACCOUNT_TREVOR
CPRINTLN(DEBUG_FINANCE, "Incrementing SPENT_IN_BUYING_GUNS stat for Trevor by $", actiondegree ,".")
QUICK_INCREMENT_INT_STAT(SP2_MONEY_SPENT_IN_BUYING_GUNS, actiondegree)
BREAK
ENDSWITCH
BREAK
CASE HASH("carmod_shop")
SWITCH accountname
CASE BANK_ACCOUNT_MICHAEL
CPRINTLN(DEBUG_FINANCE, "Incrementing SPENT_CAR_MODS stat for Mike by $", actiondegree ,".")
QUICK_INCREMENT_INT_STAT(SP0_MONEY_SPENT_CAR_MODS, actiondegree)
BREAK
CASE BANK_ACCOUNT_FRANKLIN
CPRINTLN(DEBUG_FINANCE, "Incrementing SPENT_CAR_MODS stat for Franklin by $", actiondegree ,".")
QUICK_INCREMENT_INT_STAT(SP1_MONEY_SPENT_CAR_MODS, actiondegree)
BREAK
CASE BANK_ACCOUNT_TREVOR
CPRINTLN(DEBUG_FINANCE, "Incrementing SPENT_CAR_MODS stat for Trevor by $", actiondegree ,".")
QUICK_INCREMENT_INT_STAT(SP2_MONEY_SPENT_CAR_MODS, actiondegree)
BREAK
ENDSWITCH
STOCK_MARKET_VEHICLE_MOD_MONEY_SPENT(actiondegree)
BREAK
ENDSWITCH
BREAK
ENDSWITCH
BREAK
CASE BAA_CREDIT
SWITCH accountname
CASE BANK_ACCOUNT_MICHAEL
BAWSAQ_INCREMENT_MODIFIER(BSMF_SM_MONUP_FOR_BOL, actiondegree)
BREAK
CASE BANK_ACCOUNT_FRANKLIN
BAWSAQ_INCREMENT_MODIFIER(BSMF_SM_MONUP_FOR_MAZ, actiondegree)
BREAK
CASE BANK_ACCOUNT_TREVOR
BAWSAQ_INCREMENT_MODIFIER(BSMF_SM_MONUP_FOR_FLC, actiondegree)
BREAK
ENDSWITCH
BAWSAQ_INCREMENT_MODIFIER(BSMF_SM_MONUP_FOR_SHK, actiondegree)
BREAK
ENDSWITCH
INT i = ENUM_TO_INT(accountname)
actiondegree = FLOOR(fDiscount*TO_FLOAT(actiondegree))
CDEBUG1LN(DEBUG_FINANCE, "Applying discounts to action degree. Discount multiplier was ", fDiscount, "x. New action degree is $", actiondegree, ".")
//TODO overflow check
//carry out the action
INT prebalance = 0
INT actionpostdegree = actiondegree
IF fDiscount = 0.0
REDEEM_COUPON(ct)
RETURN TRUE
ELIF fDiscount != 1.0
REDEEM_COUPON(ct)
ENDIF
INT sum = (g_BankAccounts[i].iBalance + actiondegree)
SWITCH actiontype
CASE BAA_CREDIT
CPRINTLN(DEBUG_FINANCE, "Undertaking bank account action... AccountID '", i,"' credited by $", actiondegree, ".")
IF g_BankAccounts[i].iBalance >= 0
AND actiondegree > 0
IF sum <= 0
g_BankAccounts[i].iBalance = 2147483647
CDEBUG1LN(DEBUG_FINANCE, "Credit action has overrun the max int size. Setting bank balance to max int value.")
SCRIPT_ASSERT("Account action too extreme, setting to cap.")
ELSE
g_BankAccounts[i].iBalance += actiondegree
ENDIF
ENDIF
SWITCH accountname
CASE BANK_ACCOUNT_MICHAEL
QUICK_INCREMENT_INT_STAT(SP0_TOTAL_CASH_EARNED,actiondegree)
BREAK
CASE BANK_ACCOUNT_FRANKLIN
QUICK_INCREMENT_INT_STAT(SP1_TOTAL_CASH_EARNED,actiondegree)
BREAK
CASE BANK_ACCOUNT_TREVOR
QUICK_INCREMENT_INT_STAT(SP2_TOTAL_CASH_EARNED,actiondegree)
BREAK
ENDSWITCH
BREAK
CASE BAA_DEBIT
CPRINTLN(DEBUG_FINANCE, "Undertaking bank account action... AccountID '", i, "' debited by $", actiondegree, ".")
IF NOT bForceAction
IF (g_BankAccounts[i].iBalance - actiondegree) < 0
CDEBUG1LN(DEBUG_FINANCE, "Debit action would leave bank balance negative and has not been forced. Action failed.")
RETURN FALSE
ENDIF
ENDIF
prebalance = g_BankAccounts[i].iBalance
g_BankAccounts[i].iBalance -= actiondegree
IF bForceAction
//set new actionpostdegree total if it hit zero from it's old total
actionpostdegree = prebalance
ENDIF
BREAK
ENDSWITCH
//log the action
IF actionsource = BAAC_UNLOGGED_SMALL_ACTION
//unlocked action, check its below the threshold
IF actionpostdegree > 20
CPRINTLN(DEBUG_FINANCE, "!!BAAC_UNLOGGED_SMALL_ACTION!! + greater than threshold value, logged action should be used instead!!")
ENDIF
ELSE
#if USE_CLF_DLC
g_savedGlobalsClifford.sFinanceData.PLAYER_ACCOUNT_LOGS[i].LogEntries[g_savedGlobalsClifford.sFinanceData.PLAYER_ACCOUNT_LOGS[i].iLogIndexPoint].eType = actiontype
g_savedGlobalsClifford.sFinanceData.PLAYER_ACCOUNT_LOGS[i].LogEntries[g_savedGlobalsClifford.sFinanceData.PLAYER_ACCOUNT_LOGS[i].iLogIndexPoint].eBaacSource = actionsource
g_savedGlobalsClifford.sFinanceData.PLAYER_ACCOUNT_LOGS[i].LogEntries[g_savedGlobalsClifford.sFinanceData.PLAYER_ACCOUNT_LOGS[i].iLogIndexPoint].iDegree = actiondegree
g_savedGlobalsClifford.sFinanceData.PLAYER_ACCOUNT_LOGS[i].iLogActions++
g_savedGlobalsClifford.sFinanceData.PLAYER_ACCOUNT_LOGS[i].iLogIndexPoint++
IF g_savedGlobalsClifford.sFinanceData.PLAYER_ACCOUNT_LOGS[i].iLogIndexPoint > (MAX_BANK_ACCOUNT_LOG_ENTRIES-1)
g_savedGlobalsClifford.sFinanceData.PLAYER_ACCOUNT_LOGS[i].iLogIndexPoint = 0
ENDIF
#endif
#if USE_NRM_DLC
g_savedGlobalsnorman.sFinanceData.PLAYER_ACCOUNT_LOGS[i].LogEntries[g_savedGlobalsnorman.sFinanceData.PLAYER_ACCOUNT_LOGS[i].iLogIndexPoint].eType = actiontype
g_savedGlobalsnorman.sFinanceData.PLAYER_ACCOUNT_LOGS[i].LogEntries[g_savedGlobalsnorman.sFinanceData.PLAYER_ACCOUNT_LOGS[i].iLogIndexPoint].eBaacSource = actionsource
g_savedGlobalsnorman.sFinanceData.PLAYER_ACCOUNT_LOGS[i].LogEntries[g_savedGlobalsnorman.sFinanceData.PLAYER_ACCOUNT_LOGS[i].iLogIndexPoint].iDegree = actiondegree
g_savedGlobalsnorman.sFinanceData.PLAYER_ACCOUNT_LOGS[i].iLogActions++
g_savedGlobalsnorman.sFinanceData.PLAYER_ACCOUNT_LOGS[i].iLogIndexPoint++
IF g_savedGlobalsnorman.sFinanceData.PLAYER_ACCOUNT_LOGS[i].iLogIndexPoint > (MAX_BANK_ACCOUNT_LOG_ENTRIES-1)
g_savedGlobalsnorman.sFinanceData.PLAYER_ACCOUNT_LOGS[i].iLogIndexPoint = 0
ENDIF
#endif
#if not USE_CLF_DLC
#if not USE_NRM_DLC
g_savedGlobals.sFinanceData.PLAYER_ACCOUNT_LOGS[i].LogEntries[g_savedGlobals.sFinanceData.PLAYER_ACCOUNT_LOGS[i].iLogIndexPoint].eType = actiontype
g_savedGlobals.sFinanceData.PLAYER_ACCOUNT_LOGS[i].LogEntries[g_savedGlobals.sFinanceData.PLAYER_ACCOUNT_LOGS[i].iLogIndexPoint].eBaacSource = actionsource
g_savedGlobals.sFinanceData.PLAYER_ACCOUNT_LOGS[i].LogEntries[g_savedGlobals.sFinanceData.PLAYER_ACCOUNT_LOGS[i].iLogIndexPoint].iDegree = actiondegree
g_savedGlobals.sFinanceData.PLAYER_ACCOUNT_LOGS[i].iLogActions++
g_savedGlobals.sFinanceData.PLAYER_ACCOUNT_LOGS[i].iLogIndexPoint++
IF g_savedGlobals.sFinanceData.PLAYER_ACCOUNT_LOGS[i].iLogIndexPoint > (MAX_BANK_ACCOUNT_LOG_ENTRIES-1)
g_savedGlobals.sFinanceData.PLAYER_ACCOUNT_LOGS[i].iLogIndexPoint = 0
ENDIF
#endif
#endif
ENDIF
BANK_FORCE_UPDATE_LINKED_ACCOUNT_STATS(accountname)
IF g_OnMissionState = MISSION_TYPE_OFF_MISSION
CPRINTLN(DEBUG_FINANCE, "Off mission finance action. Lodging system state")
#if USE_CLF_DLC
COPY_BANK_TRANSLOGS_CLF(FALSE)
#endif
#if USE_NRM_DLC
COPY_BANK_TRANSLOGS_NRM(FALSE)
#endif
#if not USE_CLF_DLC
#if not USE_NRM_DLC
COPY_BANK_TRANSLOGS(FALSE)
#endif
#endif
ENDIF
RETURN TRUE
ENDFUNC
PROC DO_POLICE_FINANCE_PENALTY(enumCharacterList charSheetID, INT iCash,POLICE_STATION_NAME_ENUM place)
IF (GLOBAL_CHARACTER_SHEET_GET_BANK_ACCOUNT(charSheetID) = MAX_ACCOUNTS)
//stupid value, fail
SCRIPT_ASSERT("charSheetID that has account set to MAX_ACCOUNTS passed to DO_POLICE_FINANCE_PENALTY, fail")
EXIT
ENDIF
IF (GLOBAL_CHARACTER_SHEET_GET_BANK_ACCOUNT(charSheetID) = NO_ACCOUNT)
//no account fail and assert
SCRIPT_ASSERT("charSheetID that has account set to NO_ACCOUNT passed to DO_POLICE_FINANCE_PENALTY, fail")
EXIT
ENDIF
//
enumBankAccountName account = GLOBAL_CHARACTER_SHEET_GET_BANK_ACCOUNT(charSheetID)
SWITCH account
CASE BANK_ACCOUNT_MICHAEL
QUICK_INCREMENT_INT_STAT(SP0_MONEY_SPENT_IN_COP_BRIBES,iCash)
BREAK
CASE BANK_ACCOUNT_FRANKLIN
QUICK_INCREMENT_INT_STAT(SP1_MONEY_SPENT_IN_COP_BRIBES,iCash)
BREAK
CASE BANK_ACCOUNT_TREVOR
QUICK_INCREMENT_INT_STAT(SP2_MONEY_SPENT_IN_COP_BRIBES,iCash)
BREAK
ENDSWITCH
SWITCH place
CASE POLICE_STATION_VB // Vespucci Beach
DO_BANK_ACCOUNT_ACTION(account,BAA_DEBIT,BAAC_POLICE_STATION_VB,iCash,TRUE)
BREAK
CASE POLICE_STATION_SC // South Central
DO_BANK_ACCOUNT_ACTION(account,BAA_DEBIT,BAAC_POLICE_STATION_SC,iCash,TRUE)
BREAK
CASE POLICE_STATION_DT // Downtown
DO_BANK_ACCOUNT_ACTION(account,BAA_DEBIT,BAAC_POLICE_STATION_DT,iCash,TRUE)
BREAK
CASE POLICE_STATION_RH // Rockford Hills
DO_BANK_ACCOUNT_ACTION(account,BAA_DEBIT,BAAC_POLICE_STATION_RH,iCash,TRUE)
BREAK
CASE POLICE_STATION_SS // Sandy Shores
DO_BANK_ACCOUNT_ACTION(account,BAA_DEBIT,BAAC_POLICE_STATION_SS,iCash,TRUE)
BREAK
CASE POLICE_STATION_PB // Paleto Bay
DO_BANK_ACCOUNT_ACTION(account,BAA_DEBIT,BAAC_POLICE_STATION_PB,iCash,TRUE)
BREAK
CASE POLICE_STATION_HW // Paleto Bay
DO_BANK_ACCOUNT_ACTION(account,BAA_DEBIT,BAAC_POLICE_STATION_HW,iCash,TRUE)
BREAK
DEFAULT
SCRIPT_ASSERT("DO_POLICE_FINANCE_PENALTY passed an unknown location")
EXIT
ENDSWITCH
ENDPROC
PROC DO_HOSPITAL_FINANCE_PENALTY(enumCharacterList charSheetID, INT iCash,HOSPITAL_NAME_ENUM place)
PRINTLN("<RESPAWN> DO_HOSPITAL_FINANCE_PENALTY called with cash value ", iCash)
IF (GLOBAL_CHARACTER_SHEET_GET_BANK_ACCOUNT(charSheetID) = MAX_ACCOUNTS)
SCRIPT_ASSERT("charSheetID that has account set to MAX_ACCOUNTS passed to DO_HOSPITAL_FINANCE_PENALTY, fail")
EXIT
ENDIF
IF (GLOBAL_CHARACTER_SHEET_GET_BANK_ACCOUNT(charSheetID) = NO_ACCOUNT)
SCRIPT_ASSERT("charSheetID that has account set to NO_ACCOUNT passed to DO_HOSPITAL_FINANCE_PENALTY, fail")
EXIT
ENDIF
enumBankAccountName account = GLOBAL_CHARACTER_SHEET_GET_BANK_ACCOUNT(charSheetID)
SWITCH account
CASE BANK_ACCOUNT_MICHAEL
QUICK_INCREMENT_INT_STAT(SP0_MONEY_SPENT_ON_HEALTHCARE,iCash)
BREAK
CASE BANK_ACCOUNT_FRANKLIN
QUICK_INCREMENT_INT_STAT(SP1_MONEY_SPENT_ON_HEALTHCARE,iCash)
BREAK
CASE BANK_ACCOUNT_TREVOR
QUICK_INCREMENT_INT_STAT(SP2_MONEY_SPENT_ON_HEALTHCARE,iCash)
BREAK
ENDSWITCH
SWITCH place
CASE HOSPITAL_RH // Rockford Hills
DO_BANK_ACCOUNT_ACTION(account,BAA_DEBIT,BAAC_HOSPITAL_RH,iCash,TRUE)
BREAK
CASE HOSPITAL_SC // South Central
DO_BANK_ACCOUNT_ACTION(account,BAA_DEBIT,BAAC_HOSPITAL_SC,iCash,TRUE)
BREAK
CASE HOSPITAL_DT // Downtown
DO_BANK_ACCOUNT_ACTION(account,BAA_DEBIT,BAAC_HOSPITAL_DT,iCash,TRUE)
BREAK
CASE HOSPITAL_SS // Sandy Shores
DO_BANK_ACCOUNT_ACTION(account,BAA_DEBIT,BAAC_HOSPITAL_SS,iCash,TRUE)
BREAK
CASE HOSPITAL_PB // Paleto Bay
DO_BANK_ACCOUNT_ACTION(account,BAA_DEBIT,BAAC_HOSPITAL_PB,iCash,TRUE)
BREAK
DEFAULT
SCRIPT_ASSERT("DO_HOSPITAL_FINANCE_PENALTY passed an unknown location")
EXIT
BREAK
ENDSWITCH
ENDPROC
/// PURPOSE:
/// Used by snapshot system to undo bank actions in repeat play and replay controller systems
/// PARAMS:
/// iAccount - which bank account we are altering
PROC UNDO_LAST_BANK_ACCOUNT_ACTION(INT iAccount)
CPRINTLN(DEBUG_FINANCE, "Undoing last bank action for account ", iAccount, ".")
// Update the log index point
g_savedGlobals.sFinanceData.PLAYER_ACCOUNT_LOGS[iAccount].iLogIndexPoint--
IF g_savedGlobals.sFinanceData.PLAYER_ACCOUNT_LOGS[iAccount].iLogIndexPoint < 0
g_savedGlobals.sFinanceData.PLAYER_ACCOUNT_LOGS[iAccount].iLogIndexPoint = MAX_BANK_ACCOUNT_LOG_ENTRIES-1
ENDIF
CPRINTLN(DEBUG_REPLAY, "Undo bank action number ", g_savedGlobals.sFinanceData.PLAYER_ACCOUNT_LOGS[iAccount].iLogIndexPoint, "for account ", iAccount)
// undo the action
BANK_ACCOUNT_ACTION_TYPE actiontype = g_savedGlobals.sFinanceData.PLAYER_ACCOUNT_LOGS[iAccount].LogEntries[g_savedGlobals.sFinanceData.PLAYER_ACCOUNT_LOGS[iAccount].iLogIndexPoint].eType
INT actiondegree = g_savedGlobals.sFinanceData.PLAYER_ACCOUNT_LOGS[iAccount].LogEntries[g_savedGlobals.sFinanceData.PLAYER_ACCOUNT_LOGS[iAccount].iLogIndexPoint].iDegree
SWITCH actiontype
CASE BAA_CREDIT
CPRINTLN(DEBUG_REPLAY, "Undo credit action, removing cash: ", actiondegree)
g_BankAccounts[iAccount].iBalance -= actiondegree
BREAK
CASE BAA_DEBIT
CPRINTLN(DEBUG_REPLAY, "Undo debit action, adding cash: ", actiondegree)
g_BankAccounts[iAccount].iBalance += actiondegree
BREAK
ENDSWITCH
// reset the log for this action
g_savedGlobals.sFinanceData.PLAYER_ACCOUNT_LOGS[iAccount].LogEntries[g_savedGlobals.sFinanceData.PLAYER_ACCOUNT_LOGS[iAccount].iLogIndexPoint].iDegree = 0
g_savedGlobals.sFinanceData.PLAYER_ACCOUNT_LOGS[iAccount].LogEntries[g_savedGlobals.sFinanceData.PLAYER_ACCOUNT_LOGS[iAccount].iLogIndexPoint].eBaacSource = BAAC_DEFAULT_DEBUG
g_savedGlobals.sFinanceData.PLAYER_ACCOUNT_LOGS[iAccount].iLogActions--
// update stats
BANK_FORCE_UPDATE_LINKED_ACCOUNT_STATS(INT_TO_ENUM(enumBankAccountName, iAccount))
ENDPROC
/// PURPOSE:
/// Used to reset player accounts to the values needed for the new game
PROC BANK_INITIALISE_STARTING_BALANCES(BOOL force = FALSE)
CPRINTLN(DEBUG_FINANCE, "Initialising starting balances for player characters.")
// Ensure script and stats are in sync.
BANK_CHECK_FOR_CODE_DEPOSITS()
#IF USE_CLF_DLC
IF (NOT g_savedGlobalsClifford.sFinanceData.bFirstTimeBankInit)
AND LOCAL_GET_MISSION_COMPLETE_STATE(SP_MISSION_CLF_TRAIN) //prevent the initial launch obliterating the log set
CPRINTLN(DEBUG_FINANCE, "First time bank init detected for CLF playthrough. Setting up fresh bank states.")
g_BankAccounts[BANK_ACCOUNT_MICHAEL].iBalance = 4000
g_savedGlobalsClifford.sFinanceData.PLAYER_ACCOUNT_LOGS[BANK_ACCOUNT_MICHAEL].iLogActions = 0
g_savedGlobalsClifford.sFinanceData.PLAYER_ACCOUNT_LOGS[BANK_ACCOUNT_MICHAEL].iLogIndexPoint = 0
g_BankAccounts[BANK_ACCOUNT_FRANKLIN].iBalance = 4000
g_savedGlobalsClifford.sFinanceData.PLAYER_ACCOUNT_LOGS[BANK_ACCOUNT_FRANKLIN].iLogActions = 0
g_savedGlobalsClifford.sFinanceData.PLAYER_ACCOUNT_LOGS[BANK_ACCOUNT_FRANKLIN].iLogIndexPoint = 0
g_BankAccounts[BANK_ACCOUNT_TREVOR].iBalance = 4000
g_savedGlobalsClifford.sFinanceData.PLAYER_ACCOUNT_LOGS[BANK_ACCOUNT_TREVOR].iLogActions = 0
g_savedGlobalsClifford.sFinanceData.PLAYER_ACCOUNT_LOGS[BANK_ACCOUNT_TREVOR].iLogIndexPoint = 0
// So the following transactions will go through.
BANK_FORCE_UPDATE_LINKED_ACCOUNT_STATS(BANK_ACCOUNT_TREVOR)
BANK_FORCE_UPDATE_LINKED_ACCOUNT_STATS(BANK_ACCOUNT_MICHAEL)
BANK_FORCE_UPDATE_LINKED_ACCOUNT_STATS(BANK_ACCOUNT_FRANKLIN)
// TODO Need new bank history for the DLC pack.
// //trev
// DO_BANK_ACCOUNT_ACTION(BANK_ACCOUNT_TREVOR,BAA_CREDIT,BAAC_OSCAR, 22300)
// DO_BANK_ACCOUNT_ACTION(BANK_ACCOUNT_TREVOR,BAA_DEBIT,BAAC_AMMUNATION, 678)
// DO_BANK_ACCOUNT_ACTION(BANK_ACCOUNT_TREVOR,BAA_CREDIT,BAAC_OSCAR, 45200)
// DO_BANK_ACCOUNT_ACTION(BANK_ACCOUNT_TREVOR,BAA_DEBIT,BAAC_MADAM_CHONGS, 200)
// DO_BANK_ACCOUNT_ACTION(BANK_ACCOUNT_TREVOR,BAA_DEBIT,BAAC_CLUCKING_BELL, 12)
// DO_BANK_ACCOUNT_ACTION(BANK_ACCOUNT_TREVOR,BAA_DEBIT,BAAC_CLUCKING_BELL, 14)
// DO_BANK_ACCOUNT_ACTION(BANK_ACCOUNT_TREVOR,BAA_DEBIT,BAAC_LOS_SANTOS_HOSPITAL, 280)
// DO_BANK_ACCOUNT_ACTION(BANK_ACCOUNT_TREVOR,BAA_CREDIT,BAAC_OSCAR, 30200)
// DO_BANK_ACCOUNT_ACTION(BANK_ACCOUNT_TREVOR,BAA_DEBIT,BAAC_AMMUNATION, 185)
//
// //franklin
// DO_BANK_ACCOUNT_ACTION(BANK_ACCOUNT_FRANKLIN,BAA_DEBIT,BAAC_WHIZZ_PHONE ,45)
// DO_BANK_ACCOUNT_ACTION(BANK_ACCOUNT_FRANKLIN,BAA_DEBIT,BAAC_VINE_CLEAN ,400)
// DO_BANK_ACCOUNT_ACTION(BANK_ACCOUNT_FRANKLIN,BAA_DEBIT,BAAC_CANDYSUXX ,19)
// DO_BANK_ACCOUNT_ACTION(BANK_ACCOUNT_FRANKLIN,BAA_DEBIT,BAAC_DS_CLOTHING ,149)
// DO_BANK_ACCOUNT_ACTION(BANK_ACCOUNT_FRANKLIN,BAA_DEBIT,BAAC_CLUCKING_BELL ,19)
//
// //mike
// DO_BANK_ACCOUNT_ACTION(BANK_ACCOUNT_MICHAEL,BAA_DEBIT,BAAC_CLUCKING_BELL ,19)
// DO_BANK_ACCOUNT_ACTION(BANK_ACCOUNT_MICHAEL,BAA_DEBIT,BAAC_DS_CLOTHING ,2313)
// DO_BANK_ACCOUNT_ACTION(BANK_ACCOUNT_MICHAEL,BAA_DEBIT,BAAC_WHIZZ_PHONE ,20)
// DO_BANK_ACCOUNT_ACTION(BANK_ACCOUNT_MICHAEL,BAA_DEBIT,BAAC_CRAPKIA ,5633)
// DO_BANK_ACCOUNT_ACTION(BANK_ACCOUNT_MICHAEL,BAA_DEBIT,BAAC_VINEWOOD_BEAUTY ,700)
// Zero out the stat. #1412074
STAT_SET_INT(SP0_MONEY_TOTAL_SPENT, 0)
STAT_SET_INT(SP1_MONEY_TOTAL_SPENT, 0)
STAT_SET_INT(SP2_MONEY_TOTAL_SPENT, 0)
// Set the initial totals. (PLACEHOLDER)
g_BankAccounts[BANK_ACCOUNT_TREVOR].iBalance = 1000000
g_BankAccounts[BANK_ACCOUNT_MICHAEL].iBalance = 1000000
g_BankAccounts[BANK_ACCOUNT_FRANKLIN].iBalance = 1000000
g_savedGlobalsClifford.sFinanceData.bFirstTimeBankInit = TRUE
ENDIF
#ENDIF
#IF USE_NRM_DLC
IF (NOT g_savedGlobalsnorman.sFinanceData.bFirstTimeBankInit)
AND LOCAL_GET_MISSION_COMPLETE_STATE(SP_MISSION_NRM_SUR_START) //prevent the initial launch obliterating the log set
g_BankAccounts[BANK_ACCOUNT_MICHAEL].iBalance = 1000000
g_savedGlobalsnorman.sFinanceData.PLAYER_ACCOUNT_LOGS[BANK_ACCOUNT_MICHAEL].iLogActions = 0
//g_BankAccounts[BANK_ACCOUNT_MICHAEL].iLogActionsSinceLastCheck = 0
g_savedGlobalsnorman.sFinanceData.PLAYER_ACCOUNT_LOGS[BANK_ACCOUNT_MICHAEL].iLogIndexPoint = 0
g_BankAccounts[BANK_ACCOUNT_FRANKLIN].iBalance = 1000000
g_savedGlobalsnorman.sFinanceData.PLAYER_ACCOUNT_LOGS[BANK_ACCOUNT_FRANKLIN].iLogActions = 0
//g_BankAccounts[BANK_ACCOUNT_FRANKLIN].iLogActionsSinceLastCheck = 0
g_savedGlobalsnorman.sFinanceData.PLAYER_ACCOUNT_LOGS[BANK_ACCOUNT_FRANKLIN].iLogIndexPoint = 0
g_BankAccounts[BANK_ACCOUNT_TREVOR].iBalance = 1000000
g_savedGlobalsnorman.sFinanceData.PLAYER_ACCOUNT_LOGS[BANK_ACCOUNT_TREVOR].iLogActions = 0
//g_BankAccounts[BANK_ACCOUNT_TREVOR].iLogActionsSinceLastCheck = 0
g_savedGlobalsnorman.sFinanceData.PLAYER_ACCOUNT_LOGS[BANK_ACCOUNT_TREVOR].iLogIndexPoint = 0
// So the following transactions will go through.
BANK_FORCE_UPDATE_LINKED_ACCOUNT_STATS(BANK_ACCOUNT_TREVOR)
BANK_FORCE_UPDATE_LINKED_ACCOUNT_STATS(BANK_ACCOUNT_MICHAEL)
BANK_FORCE_UPDATE_LINKED_ACCOUNT_STATS(BANK_ACCOUNT_FRANKLIN)
// TODO Need new bank history for the DLC pack.
// //trev
// DO_BANK_ACCOUNT_ACTION(BANK_ACCOUNT_TREVOR,BAA_CREDIT,BAAC_OSCAR, 22300)
// DO_BANK_ACCOUNT_ACTION(BANK_ACCOUNT_TREVOR,BAA_DEBIT,BAAC_AMMUNATION, 678)
// DO_BANK_ACCOUNT_ACTION(BANK_ACCOUNT_TREVOR,BAA_CREDIT,BAAC_OSCAR, 45200)
// DO_BANK_ACCOUNT_ACTION(BANK_ACCOUNT_TREVOR,BAA_DEBIT,BAAC_MADAM_CHONGS, 200)
// DO_BANK_ACCOUNT_ACTION(BANK_ACCOUNT_TREVOR,BAA_DEBIT,BAAC_CLUCKING_BELL, 12)
// DO_BANK_ACCOUNT_ACTION(BANK_ACCOUNT_TREVOR,BAA_DEBIT,BAAC_CLUCKING_BELL, 14)
// DO_BANK_ACCOUNT_ACTION(BANK_ACCOUNT_TREVOR,BAA_DEBIT,BAAC_LOS_SANTOS_HOSPITAL, 280)
// DO_BANK_ACCOUNT_ACTION(BANK_ACCOUNT_TREVOR,BAA_CREDIT,BAAC_OSCAR, 30200)
// DO_BANK_ACCOUNT_ACTION(BANK_ACCOUNT_TREVOR,BAA_DEBIT,BAAC_AMMUNATION, 185)
//
// //franklin
// DO_BANK_ACCOUNT_ACTION(BANK_ACCOUNT_FRANKLIN,BAA_DEBIT,BAAC_WHIZZ_PHONE ,45)
// DO_BANK_ACCOUNT_ACTION(BANK_ACCOUNT_FRANKLIN,BAA_DEBIT,BAAC_VINE_CLEAN ,400)
// DO_BANK_ACCOUNT_ACTION(BANK_ACCOUNT_FRANKLIN,BAA_DEBIT,BAAC_CANDYSUXX ,19)
// DO_BANK_ACCOUNT_ACTION(BANK_ACCOUNT_FRANKLIN,BAA_DEBIT,BAAC_DS_CLOTHING ,149)
// DO_BANK_ACCOUNT_ACTION(BANK_ACCOUNT_FRANKLIN,BAA_DEBIT,BAAC_CLUCKING_BELL ,19)
//
// //mike
// DO_BANK_ACCOUNT_ACTION(BANK_ACCOUNT_MICHAEL,BAA_DEBIT,BAAC_CLUCKING_BELL ,19)
// DO_BANK_ACCOUNT_ACTION(BANK_ACCOUNT_MICHAEL,BAA_DEBIT,BAAC_DS_CLOTHING ,2313)
// DO_BANK_ACCOUNT_ACTION(BANK_ACCOUNT_MICHAEL,BAA_DEBIT,BAAC_WHIZZ_PHONE ,20)
// DO_BANK_ACCOUNT_ACTION(BANK_ACCOUNT_MICHAEL,BAA_DEBIT,BAAC_CRAPKIA ,5633)
// DO_BANK_ACCOUNT_ACTION(BANK_ACCOUNT_MICHAEL,BAA_DEBIT,BAAC_VINEWOOD_BEAUTY ,700)
// Zero out the stat. #1412074
STAT_SET_INT(SP0_MONEY_TOTAL_SPENT,0)
STAT_SET_INT(SP1_MONEY_TOTAL_SPENT,0)
STAT_SET_INT(SP2_MONEY_TOTAL_SPENT,0)
// Set the initial totals. (PLACEHOLDER)
g_BankAccounts[BANK_ACCOUNT_TREVOR].iBalance = 1000000
g_BankAccounts[BANK_ACCOUNT_MICHAEL].iBalance = 1000000
g_BankAccounts[BANK_ACCOUNT_FRANKLIN].iBalance = 1000000
g_savedGlobalsnorman.sFinanceData.bFirstTimeBankInit = TRUE
ENDIF
#ENDIF
#IF NOT USE_CLF_DLC
#if not USE_NRM_DLC
IF (NOT g_savedGlobals.sFinanceData.bFirstTimeBankInit)
AND LOCAL_GET_MISSION_COMPLETE_STATE(SP_MISSION_PROLOGUE) //prevent the initial launch obliterating the log set
CPRINTLN(DEBUG_FINANCE, "First time bank init detected for GTAV playthrough. Setting up fresh bank states.")
g_BankAccounts[BANK_ACCOUNT_MICHAEL].iBalance = 4000
g_savedGlobals.sFinanceData.PLAYER_ACCOUNT_LOGS[BANK_ACCOUNT_MICHAEL].iLogActions = 0
g_savedGlobals.sFinanceData.PLAYER_ACCOUNT_LOGS[BANK_ACCOUNT_MICHAEL].iLogIndexPoint = 0
g_BankAccounts[BANK_ACCOUNT_FRANKLIN].iBalance = 4000
g_savedGlobals.sFinanceData.PLAYER_ACCOUNT_LOGS[BANK_ACCOUNT_FRANKLIN].iLogActions = 0
g_savedGlobals.sFinanceData.PLAYER_ACCOUNT_LOGS[BANK_ACCOUNT_FRANKLIN].iLogIndexPoint = 0
g_BankAccounts[BANK_ACCOUNT_TREVOR].iBalance = 4000
g_savedGlobals.sFinanceData.PLAYER_ACCOUNT_LOGS[BANK_ACCOUNT_TREVOR].iLogActions = 0
g_savedGlobals.sFinanceData.PLAYER_ACCOUNT_LOGS[BANK_ACCOUNT_TREVOR].iLogIndexPoint = 0
// So the following transactions will go through.
BANK_FORCE_UPDATE_LINKED_ACCOUNT_STATS(BANK_ACCOUNT_TREVOR)
BANK_FORCE_UPDATE_LINKED_ACCOUNT_STATS(BANK_ACCOUNT_MICHAEL)
BANK_FORCE_UPDATE_LINKED_ACCOUNT_STATS(BANK_ACCOUNT_FRANKLIN)
//trev
DO_BANK_ACCOUNT_ACTION(BANK_ACCOUNT_TREVOR,BAA_CREDIT,BAAC_OSCAR, 22300)
DO_BANK_ACCOUNT_ACTION(BANK_ACCOUNT_TREVOR,BAA_DEBIT,BAAC_AMMUNATION, 678)
DO_BANK_ACCOUNT_ACTION(BANK_ACCOUNT_TREVOR,BAA_CREDIT,BAAC_OSCAR, 45200)
DO_BANK_ACCOUNT_ACTION(BANK_ACCOUNT_TREVOR,BAA_DEBIT,BAAC_MADAM_CHONGS, 200)
DO_BANK_ACCOUNT_ACTION(BANK_ACCOUNT_TREVOR,BAA_DEBIT,BAAC_CLUCKING_BELL, 12)
DO_BANK_ACCOUNT_ACTION(BANK_ACCOUNT_TREVOR,BAA_DEBIT,BAAC_CLUCKING_BELL, 14)
DO_BANK_ACCOUNT_ACTION(BANK_ACCOUNT_TREVOR,BAA_DEBIT,BAAC_LOS_SANTOS_HOSPITAL, 280)
DO_BANK_ACCOUNT_ACTION(BANK_ACCOUNT_TREVOR,BAA_CREDIT,BAAC_OSCAR, 30200)
DO_BANK_ACCOUNT_ACTION(BANK_ACCOUNT_TREVOR,BAA_DEBIT,BAAC_AMMUNATION, 185)
/*
can we have some payments in from Excelsior Motoring,
and Premium Deluxe Motor Sports
Outgoings - Weekend MBA Course - $500
New Boiler from Plumbing company (get from Stu Petri) $4,000
Car tuning from company that you go to in Fam 1
Downpayment on car - 3,000, burger shot
cluckin bell
Astro Theatres - $40,
Bahama Mama's West - $500
*/
//franklin
DO_BANK_ACCOUNT_ACTION(BANK_ACCOUNT_FRANKLIN,BAA_DEBIT,BAAC_WHIZZ_PHONE ,45)
DO_BANK_ACCOUNT_ACTION(BANK_ACCOUNT_FRANKLIN,BAA_DEBIT,BAAC_VINE_CLEAN ,400)
DO_BANK_ACCOUNT_ACTION(BANK_ACCOUNT_FRANKLIN,BAA_DEBIT,BAAC_CANDYSUXX ,19)
DO_BANK_ACCOUNT_ACTION(BANK_ACCOUNT_FRANKLIN,BAA_DEBIT,BAAC_DS_CLOTHING ,149)
DO_BANK_ACCOUNT_ACTION(BANK_ACCOUNT_FRANKLIN,BAA_DEBIT,BAAC_CLUCKING_BELL ,19)
//mike
DO_BANK_ACCOUNT_ACTION(BANK_ACCOUNT_MICHAEL,BAA_DEBIT,BAAC_CLUCKING_BELL ,19)
DO_BANK_ACCOUNT_ACTION(BANK_ACCOUNT_MICHAEL,BAA_DEBIT,BAAC_DS_CLOTHING ,2313)
DO_BANK_ACCOUNT_ACTION(BANK_ACCOUNT_MICHAEL,BAA_DEBIT,BAAC_WHIZZ_PHONE ,20)
DO_BANK_ACCOUNT_ACTION(BANK_ACCOUNT_MICHAEL,BAA_DEBIT,BAAC_CRAPKIA ,5633)
DO_BANK_ACCOUNT_ACTION(BANK_ACCOUNT_MICHAEL,BAA_DEBIT,BAAC_VINEWOOD_BEAUTY ,700)
// Zero out the stat. #1412074
STAT_SET_INT(SP0_MONEY_TOTAL_SPENT,0)
STAT_SET_INT(SP1_MONEY_TOTAL_SPENT,0)
STAT_SET_INT(SP2_MONEY_TOTAL_SPENT,0)
/*
//intialisation companies,
BAAC_CLUCKING_BELL,
BAAC_WHIZZ_PHONE,
BAAC_MADAM_CHONGS,
BAAC_DS_CLOTHING,
BAAC_LOS_SANTOS_HOSPITAL,
BAAC_CRAPKIA,
BAAC_VINE_CLEAN,
BAAC_CANDYSUXX,
BAAC_VINEWOOD_BEAUTY,
BAAC_AMMUNATION,
*/
// Set the initial totals.
g_BankAccounts[BANK_ACCOUNT_TREVOR].iBalance = 10666
g_BankAccounts[BANK_ACCOUNT_MICHAEL].iBalance = 3085
g_BankAccounts[BANK_ACCOUNT_FRANKLIN].iBalance = 1178
g_savedGlobals.sFinanceData.bFirstTimeBankInit = TRUE
ENDIF
#ENDIF
#ENDIF
// Forced when doing a gameflow reset.
IF force
CPRINTLN(DEBUG_FINANCE, "Forcing bank balances to starting defaults for a gameflow reset.")
g_BankAccounts[BANK_ACCOUNT_TREVOR].iBalance = 108654
g_BankAccounts[BANK_ACCOUNT_MICHAEL].iBalance = 7860
g_BankAccounts[BANK_ACCOUNT_FRANKLIN].iBalance = 78
ENDIF
BANK_FORCE_UPDATE_LINKED_ACCOUNT_STATS(BANK_ACCOUNT_TREVOR)
BANK_FORCE_UPDATE_LINKED_ACCOUNT_STATS(BANK_ACCOUNT_MICHAEL)
BANK_FORCE_UPDATE_LINKED_ACCOUNT_STATS(BANK_ACCOUNT_FRANKLIN)
ENDPROC
/// PURPOSE:
/// Returns the current balance of the given account.
FUNC INT GET_ACCOUNT_BALANCE(enumBankAccountName accountname)
CDEBUG3LN(DEBUG_FINANCE, "Get account balance for account ", ENUM_TO_INT(accountname), ". Found $", g_BankAccounts[ENUM_TO_INT(accountname)].iBalance, ".")
RETURN g_BankAccounts[ENUM_TO_INT(accountname)].iBalance
ENDFUNC
/// PURPOSE:
/// Gets the account action source for a given shop name.
FUNC BANK_ACCOUNT_ACTION_SOURCE_BAAC GET_BAAC_FROM_SHOP_ENUM(SHOP_NAME_ENUM e)
INT base = ENUM_TO_INT(e) - ENUM_TO_INT(HAIRDO_SHOP_01_BH)
INT ish = ENUM_TO_INT(BAAC_HAIRDO_SHOP_01_BH)
RETURN INT_TO_ENUM(BANK_ACCOUNT_ACTION_SOURCE_BAAC,base+ish)
ENDFUNC
/// PURPOSE:
/// Adds credit to the account of a given charsheet. Clifford DLC specific.
PROC CREDIT_BANK_ACCOUNT_CLF(enumCharacterList charSheetID, BANK_ACCOUNT_ACTION_SOURCE_BAAC description, INT amount, BOOL bReward = FALSE, BOOL bRCReward = FALSE)
IF (g_savedGlobalsClifford.sCharSheetData.g_CharacterSheet[charSheetID].bank_account = MAX_ACCOUNTS)
SCRIPT_ASSERT("charSheetID that has account set to MAX_ACCOUNTS passed to CREDIT_BANK_ACCOUNT, fail")
EXIT
ENDIF
IF (g_savedGlobalsClifford.sCharSheetData.g_CharacterSheet[charSheetID].bank_account = NO_ACCOUNT)
SCRIPT_ASSERT("charSheetID that has account set to NO_ACCOUNT passed to CREDIT_BANK_ACCOUNT, fail")
EXIT
ENDIF
DO_BANK_ACCOUNT_ACTION(g_savedGlobalsClifford.sCharSheetData.g_CharacterSheet[charSheetID].bank_account, BAA_CREDIT, description, amount)
IF bReward
INT istat = 0
STATSENUM target
IF bRCReward
SWITCH charSheetID
CASE CHAR_MICHAEL
target = SP0_MONEY_MADE_FROM_RANDOM_PEDS
BREAK
CASE CHAR_FRANKLIN
target = SP1_MONEY_MADE_FROM_RANDOM_PEDS
BREAK
CASE CHAR_TREVOR
target = SP2_MONEY_MADE_FROM_RANDOM_PEDS
BREAK
DEFAULT
EXIT
ENDSWITCH
ELSE
SWITCH charSheetID
CASE CHAR_MICHAEL
target = SP0_MONEY_MADE_FROM_MISSIONS
BREAK
CASE CHAR_FRANKLIN
target = SP1_MONEY_MADE_FROM_MISSIONS
BREAK
CASE CHAR_TREVOR
target = SP2_MONEY_MADE_FROM_MISSIONS
BREAK
DEFAULT
EXIT
ENDSWITCH
ENDIF
STAT_GET_INT(target,istat)
istat += amount
STAT_SET_INT(target,istat)
ENDIF
ENDPROC
/// PURPOSE:
/// Adds credit to the account of a given charsheet. Norman DLC specific.
PROC CREDIT_BANK_ACCOUNT_NRM(enumCharacterList charSheetID, BANK_ACCOUNT_ACTION_SOURCE_BAAC description, INT amount, BOOL bReward = FALSE, BOOL bRCReward = FALSE)
IF (g_savedGlobalsnorman.sCharSheetData.g_CharacterSheet[charSheetID].bank_account = MAX_ACCOUNTS)
SCRIPT_ASSERT("charSheetID that has account set to MAX_ACCOUNTS passed to CREDIT_BANK_ACCOUNT, fail")
EXIT
ENDIF
IF (g_savedGlobalsnorman.sCharSheetData.g_CharacterSheet[charSheetID].bank_account = NO_ACCOUNT)
SCRIPT_ASSERT("charSheetID that has account set to NO_ACCOUNT passed to CREDIT_BANK_ACCOUNT, fail")
EXIT
ENDIF
DO_BANK_ACCOUNT_ACTION(g_savedGlobalsnorman.sCharSheetData.g_CharacterSheet[charSheetID].bank_account, BAA_CREDIT, description, amount)
IF bReward
INT istat = 0
STATSENUM target
IF bRCReward
SWITCH charSheetID
CASE CHAR_MICHAEL
target = SP0_MONEY_MADE_FROM_RANDOM_PEDS
BREAK
CASE CHAR_FRANKLIN
target = SP1_MONEY_MADE_FROM_RANDOM_PEDS
BREAK
CASE CHAR_TREVOR
target = SP2_MONEY_MADE_FROM_RANDOM_PEDS
BREAK
DEFAULT
EXIT
ENDSWITCH
ELSE
SWITCH charSheetID
CASE CHAR_MICHAEL
target = SP0_MONEY_MADE_FROM_MISSIONS
BREAK
CASE CHAR_FRANKLIN
target = SP1_MONEY_MADE_FROM_MISSIONS
BREAK
CASE CHAR_TREVOR
target = SP2_MONEY_MADE_FROM_MISSIONS
BREAK
DEFAULT
EXIT
ENDSWITCH
ENDIF
STAT_GET_INT(target,istat)
istat += amount
STAT_SET_INT(target,istat)
ENDIF
ENDPROC
/// PURPOSE:
/// Adds credit to the account of a given charsheet.
PROC CREDIT_BANK_ACCOUNT(enumCharacterList charSheetID, BANK_ACCOUNT_ACTION_SOURCE_BAAC description, INT amount, BOOL bReward = FALSE, BOOL bRCReward = FALSE)
CPRINTLN(DEBUG_FINANCE, "Crediting bank account. Owner:", ENUM_TO_INT(charSheetID), " Source:", GET_BAAC_STRING_TAG(description), " Amount:$", amount, ".")
#IF USE_CLF_DLC
IF g_bLoadedClifford
CREDIT_BANK_ACCOUNT_CLF(charSheetID, description, amount, bReward, bRCReward)
EXIT
ENDIF
#ENDIF
#IF USE_NRM_DLC
IF g_bLoadedNorman
CREDIT_BANK_ACCOUNT_NRM(charSheetID, description, amount, bReward, bRCReward)
EXIT
ENDIF
#ENDIF
//DO_BANK_ACCOUNT_ACTION(GET_ACCOUNT_NAME_FROM_CHARSHEET(charSheetID),BAA_CREDIT,description,amount)
IF (GLOBAL_CHARACTER_SHEET_GET_BANK_ACCOUNT(charSheetID) = MAX_ACCOUNTS)
//stupid value, fail
SCRIPT_ASSERT("charSheetID that has account set to MAX_ACCOUNTS passed to CREDIT_BANK_ACCOUNT, fail")
EXIT
ENDIF
IF (GLOBAL_CHARACTER_SHEET_GET_BANK_ACCOUNT(charSheetID) = NO_ACCOUNT)
//no account fail and assert
SCRIPT_ASSERT("charSheetID that has account set to NO_ACCOUNT passed to CREDIT_BANK_ACCOUNT, fail")
EXIT
ENDIF
DO_BANK_ACCOUNT_ACTION(GLOBAL_CHARACTER_SHEET_GET_BANK_ACCOUNT(charSheetID), BAA_CREDIT,description,amount)
IF bReward
INT istat = 0
STATSENUM target
IF bRCReward
SWITCH charSheetID
CASE CHAR_MICHAEL
target = SP0_MONEY_MADE_FROM_RANDOM_PEDS
BREAK
CASE CHAR_FRANKLIN
target = SP1_MONEY_MADE_FROM_RANDOM_PEDS
BREAK
CASE CHAR_TREVOR
target = SP2_MONEY_MADE_FROM_RANDOM_PEDS
BREAK
DEFAULT
EXIT
ENDSWITCH
ELSE
SWITCH charSheetID
CASE CHAR_MICHAEL
target = SP0_MONEY_MADE_FROM_MISSIONS
BREAK
CASE CHAR_FRANKLIN
target = SP1_MONEY_MADE_FROM_MISSIONS
BREAK
CASE CHAR_TREVOR
target = SP2_MONEY_MADE_FROM_MISSIONS
BREAK
DEFAULT
EXIT
ENDSWITCH
ENDIF
STAT_GET_INT(target,istat)
istat += amount
STAT_SET_INT(target,istat)
ENDIF
ENDPROC
/// PURPOSE:
/// Debits the account of a given charsheet. Clifford DLC specific.
FUNC BOOL DEBIT_BANK_ACCOUNT_CLF(enumCharacterList charSheetID, BANK_ACCOUNT_ACTION_SOURCE_BAAC description, INT amount)
IF (g_savedGlobalsClifford.sCharSheetData.g_CharacterSheet[charSheetID].bank_account = MAX_ACCOUNTS)
SCRIPT_ASSERT("charSheetID that has account set to MAX_ACCOUNTS passed to CREDIT_BANK_ACCOUNT, fail.")
RETURN FALSE
ENDIF
IF (g_savedGlobalsClifford.sCharSheetData.g_CharacterSheet[charSheetID].bank_account = NO_ACCOUNT)
SCRIPT_ASSERT("charSheetID that has account set to NO_ACCOUNT passed to CREDIT_BANK_ACCOUNT, fail.")
RETURN FALSE
ENDIF
RETURN DO_BANK_ACCOUNT_ACTION(g_savedGlobalsClifford.sCharSheetData.g_CharacterSheet[charSheetID].bank_account, BAA_DEBIT, description, amount)
ENDFUNC
/// PURPOSE:
/// Debits the account of a given charsheet. Norman DLC specific.
FUNC BOOL DEBIT_BANK_ACCOUNT_NRM(enumCharacterList charSheetID, BANK_ACCOUNT_ACTION_SOURCE_BAAC description, INT amount)
IF (g_savedGlobalsnorman.sCharSheetData.g_CharacterSheet[charSheetID].bank_account = MAX_ACCOUNTS)
SCRIPT_ASSERT("charSheetID that has account set to MAX_ACCOUNTS passed to CREDIT_BANK_ACCOUNT, fail.")
RETURN FALSE
ENDIF
IF (g_savedGlobalsnorman.sCharSheetData.g_CharacterSheet[charSheetID].bank_account = NO_ACCOUNT)
SCRIPT_ASSERT("charSheetID that has account set to NO_ACCOUNT passed to CREDIT_BANK_ACCOUNT, fail.")
RETURN FALSE
ENDIF
RETURN DO_BANK_ACCOUNT_ACTION(g_savedGlobalsnorman.sCharSheetData.g_CharacterSheet[charSheetID].bank_account, BAA_DEBIT, description, amount)
ENDFUNC
/// PURPOSE:
/// Debits the account of a given charsheet.
FUNC BOOL DEBIT_BANK_ACCOUNT(enumCharacterList charSheetID, BANK_ACCOUNT_ACTION_SOURCE_BAAC description, INT amount)
CPRINTLN(DEBUG_FINANCE, "Debiting bank account. Owner:", ENUM_TO_INT(charSheetID), " Source:", GET_BAAC_STRING_TAG(description), " Amount:$", amount, ".")
#IF USE_CLF_DLC
IF g_bLoadedClifford
RETURN DEBIT_BANK_ACCOUNT_CLF(charSheetID, description, amount)
ENDIF
#ENDIF
#IF USE_NRM_DLC
IF g_bLoadedNorman
RETURN DEBIT_BANK_ACCOUNT_NRM(charSheetID, description, amount)
ENDIF
#ENDIF
IF (GLOBAL_CHARACTER_SHEET_GET_BANK_ACCOUNT(charSheetID) = MAX_ACCOUNTS)
SCRIPT_ASSERT("charSheetID that has account set to MAX_ACCOUNTS passed to CREDIT_BANK_ACCOUNT, fail.")
RETURN FALSE
ENDIF
IF (GLOBAL_CHARACTER_SHEET_GET_BANK_ACCOUNT(charSheetID) = NO_ACCOUNT)
SCRIPT_ASSERT("charSheetID that has account set to NO_ACCOUNT passed to CREDIT_BANK_ACCOUNT, fail.")
RETURN FALSE
ENDIF
RETURN DO_BANK_ACCOUNT_ACTION(GLOBAL_CHARACTER_SHEET_GET_BANK_ACCOUNT(charSheetID), BAA_DEBIT, description, amount)
ENDFUNC
/// PURPOSE:
/// Gets the cash total a given character sheet has in their account, if they have one.
FUNC INT GET_TOTAL_CASH(enumCharacterList charSheetID)
CDEBUG1LN(DEBUG_FINANCE, "Looking up total player cash for character ", ENUM_TO_INT(charSheetID), "...")
#IF IS_DEBUG_BUILD
IF g_bInMultiplayer
SCRIPT_ASSERT("GET_TOTAL_CASH was called in MP. This command is SP only.")
RETURN 0
ENDIF
#ENDIF
INT receivingStruct
SWITCH charSheetID
CASE CHAR_MICHAEL
STAT_GET_INT(SP0_TOTAL_CASH, receivingStruct)
CDEBUG1LN(DEBUG_FINANCE, "Mike has $", receivingStruct, ".")
RETURN receivingStruct
CASE CHAR_FRANKLIN
STAT_GET_INT(SP1_TOTAL_CASH, receivingStruct)
CDEBUG1LN(DEBUG_FINANCE, "Franklin has $", receivingStruct, ".")
RETURN receivingStruct
CASE CHAR_TREVOR
STAT_GET_INT(SP2_TOTAL_CASH, receivingStruct)
CDEBUG1LN(DEBUG_FINANCE, "Trevor has $", receivingStruct, ".")
RETURN receivingStruct
ENDSWITCH
SCRIPT_ASSERT("GET_TOTAL_CASH: Enum doesn't have an account.")
RETURN 0
ENDFUNC
/// PURPOSE:
/// Compares the cash total in the specified char sheet's bank account (if it has one) with compareValue.
FUNC BOOL IS_TOTAL_CASH_GREATER(enumCharacterList charSheetID, INT compareValue)
IF GET_TOTAL_CASH(charSheetID) > compareValue
RETURN TRUE
ELSE
RETURN FALSE
ENDIF
ENDFUNC
// *****************************************************************************************
// *****************************************************************************************
// *****************************************************************************************
// *****************************************************************************************
// *****************************************************************************************
// *****************************************************************************************
// *****************************************************************************************
// *****************************************************************************************
// *****************************************************************************************
PROC ACTIVATE_FINANCE_FILTER(BAWSAQ_COMPANIES bsco,INT iFlags, BOOL bSupressHelp = FALSE)
//Search for filters applying to this CO
INT iReg = -1
INT i = 0
INT iFreeReg = -1
REPEAT MAX_SP_FINANCE_FILTERS i
IF g_savedGlobals.sFinanceData.iFilterDurationRemaining[i] > 0
IF g_savedGlobals.sFinanceData.FilteredBind[i] = bsco
iReg = i
ENDIF
ELSE
iFreeReg = i
ENDIF
ENDREPEAT
IF (iReg != -1) OR (iFreeReg = -1)
CPRINTLN(DEBUG_STOCKS, "ACTIVATE_FINANCE_FILTER: cannot register, no space or already registered")
EXIT
ENDIF
INT iDuration = 0
IF IS_BIT_SET(iFlags,MFFILTER_DURATION_1)
iDuration += 1
ENDIF
IF IS_BIT_SET(iFlags,MFFILTER_DURATION_2)
iDuration += 2
ENDIF
IF IS_BIT_SET(iFlags,MFFILTER_DURATION_4)
iDuration += 4
ENDIF
IF IS_BIT_SET(iFlags,MFFILTER_DURATION_8)
iDuration += 8
ENDIF
IF iDuration = 0 AND (NOT IS_BIT_SET(iFlags,MFFILTER_RESET_POST_EXILE3))
CPRINTLN(DEBUG_STOCKS, "ACTIVATE_FINANCE_FILTER: Duration of 0 is invalid")
EXIT
ENDIF
//CHANGED no longer represents time but number of days
//iDuration *= ((1000*60)*60)*24//convert to days in MS
iDuration *= STOCK_MARKET_LOG_UPDATES_PER_DAY //3 log updates per day
IF IS_BIT_SET(iFlags,MFFILTER_TIMESCALE_WEEKS)
iDuration *= 7
ENDIF
++g_savedGlobals.sFinanceData.iFiltersRegistered
g_savedGlobals.sFinanceData.iFilterFlags[iFreeReg] = iFlags
g_savedGlobals.sFinanceData.FilteredBind[iFreeReg] = bsco
g_savedGlobals.sFinanceData.iFilterDurationRemaining[iFreeReg] = iDuration
CDEBUG1LN(debug_stocks,"Activated filter for ",ENUM_TO_INT(bsco)," with duration", iDuration)
//Attempt to display a flow help message if the "Affect Stock" help hasn't been seen before.
IF NOT bSupressHelp
#IF NOT USE_CLF_DLC
#IF NOT USE_NRM_DLC
IF NOT HAS_ONE_TIME_HELP_DISPLAYED(FHM_AFFECT_STOCKS)
#IF IS_DEBUG_BUILD
//Don't queue help while debug launching.
IF NOT g_flowUnsaved.bUpdatingGameflow
#ENDIF
CPRINTLN(DEBUG_STOCKS, "ACTIVATE_FINANCE_FILTER: Attempting to display flow help message about affecting stock prices.")
ADD_HELP_TO_FLOW_QUEUE("AM_H_STOCKS", FHP_MEDIUM, 0, 40000, DEFAULT_HELP_TEXT_TIME, 7, CID_BLANK, CID_AFFECT_STOCKS_HELP_DISPLAYED)
#IF IS_DEBUG_BUILD
ENDIF
#ENDIF
ENDIF
#ENDIF
#ENDIF
ENDIF
LCN_INTERNAL_SNAPSHOT_LISTING_TO_LOG(bsco)
CPRINTLN(DEBUG_STOCKS, "ACTIVATE_FINANCE_FILTER: Registered effect ", bsco, " for duration ", iDuration )
ENDPROC
#IF IS_DEBUG_BUILD
PROC DEBUG_BS_DURATION_PRICE_TEST()
FLOAT price = 50.0
INT iflags = 0
INT iDurationCountdown = ((1000*60)*60)*24//one day in hours
INT iDurationCountStep = 1000*60 // minute intervals
SET_BIT(iflags,MFFILTER_DURATION_1)
SET_BIT(iflags,MFFILTER_SCALE_50_PERC)
CDEBUG1LN(DEBUG_STOCKS, "Test 1 constant effect, base ", price , " duration 1, 50 perc")
WHILE iDurationCountdown > -1
FLOAT mod = GET_BS_FILTER_FROM_DURATION_FLAGS(iDurationCountdown,iflags)
CDEBUG1LN(DEBUG_STOCKS, "Time: ", iDurationCountdown , " price: ", price*mod)
iDurationCountdown -= iDurationCountStep
//WAIT(0)
ENDWHILE
SET_BIT(iflags,MFFILTER_RAMP_DOWN)
SET_BIT(iflags,MFFILTER_RAMP_UP)
SET_BIT(iflags,MFFILTER_RAMP_DOWN_PROPORTION_QUARTER)
SET_BIT(iflags,MFFILTER_RAMP_UP_PROPORTION_QUARTER)
iDurationCountdown = ((1000*60)*60)*24//one day in hours
iDurationCountStep = 1000*60 // minute intervals
CDEBUG1LN(DEBUG_STOCKS, "Test 2 ramp up and down, base ", price , " duration 1, 50 perc")
WHILE iDurationCountdown > -1
FLOAT mod = GET_BS_FILTER_FROM_DURATION_FLAGS(iDurationCountdown,iflags)
CDEBUG1LN(DEBUG_STOCKS, "Time: ", iDurationCountdown , " price: ", price*mod)
iDurationCountdown -= iDurationCountStep
//WAIT(0)
ENDWHILE
SET_BIT(iflags,MFFILTER_RAMP_UP_ENDSLOW)
SET_BIT(iflags,MFFILTER_RAMP_DOWN_STARTSLOW)
iDurationCountdown = ((1000*60)*60)*24//one day in hours
iDurationCountStep = 1000*60 // minute intervals
CDEBUG1LN(DEBUG_STOCKS, "Test 3 ramp up and down, start and end slow, base ", price , " duration 1, 50 perc")
WHILE iDurationCountdown > -1
FLOAT mod = GET_BS_FILTER_FROM_DURATION_FLAGS(iDurationCountdown,iflags)
CDEBUG1LN(DEBUG_STOCKS, "Time: ", iDurationCountdown , " price: ", price*mod)
iDurationCountdown -= iDurationCountStep
//WAIT(0)
ENDWHILE
ENDPROC
FUNC STRING DEBUG_GET_STRING_FROM_SPEND_CATEGORIES(SPEND_CATEGORIES eSpend)
SWITCH eSpend
CASE MONEY_SPENT_CONTACT_SERVICE RETURN "CONTACT_SERVICE" BREAK
CASE MONEY_SPENT_PROPERTY_UTIL RETURN "PROPERTY_UTIL" BREAK
CASE MONEY_SPENT_JOB_ACTIVITY RETURN "JOB_ACTIVITY" BREAK
CASE MONEY_SPENT_BETTING RETURN "BETTING" BREAK
CASE MONEY_SPENT_STYLE_ENT RETURN "STYLE_ENT" BREAK
CASE MONEY_SPENT_HEALTHCARE RETURN "HEALTHCARE" BREAK
CASE MONEY_SPENT_FROM_DEBUG RETURN "FROM_DEBUG" BREAK
CASE MONEY_SPENT_DROPPED_STOLEN RETURN "DROPPED_STOLEN" BREAK
CASE MONEY_SPENT_VEH_MAINTENANCE RETURN "VEH_MAINTENANCE" BREAK
CASE MONEY_SPENT_HOLDUPS RETURN "HOLDUPS" BREAK
CASE MONEY_SPENT_PASSIVEMODE RETURN "PASSIVEMODE" BREAK
CASE MONEY_SPENT_BANKINTEREST RETURN "BANKINTEREST" BREAK
CASE MONEY_SPENT_WEAPON_ARMOR RETURN "WEAPON_ARMOR" BREAK
CASE MONEY_SPENT_ROCKSTAR_AWARD RETURN "ROCKSTAR_AWARD" BREAK
CASE MONEY_SPENT_NOCOPS RETURN "NOCOPS" BREAK
#IF IS_NEXTGEN_BUILD
CASE MONEY_SPEND_DEDUCT RETURN "DEDUCT" BREAK
#ENDIF
DEFAULT
IF eSpend = INT_TO_ENUM(SPEND_CATEGORIES, ENUM_TO_INT(MONEY_EARN_REFUND))
RETURN "E:MONEY_EARN_REFUND"
ENDIF
BREAK
ENDSWITCH
RETURN ""
ENDFUNC
FUNC STRING DEBUG_GET_STRING_FROM_EARN_CATEGORIES(EARN_CATEGORIES eEarn)
SWITCH eEarn
CASE MONEY_EARN_JOBS RETURN "JOBS" BREAK
CASE MONEY_EARN_SELLING_VEH RETURN "SELLING_VEH" BREAK
CASE MONEY_EARN_BETTING RETURN "BETTING" BREAK
CASE MONEY_EARN_GOOD_SPORT RETURN "GOOD_SPORT" BREAK
CASE MONEY_EARN_PICKED_UP RETURN "PICKED_UP" BREAK
CASE MONEY_EARN_SHARED RETURN "SHARED" BREAK
CASE MONEY_EARN_JOBSHARED RETURN "JOBSHARED" BREAK
CASE MONEY_EARN_ROCKSTAR_AWARD RETURN "ROCKSTAR_AWARD" BREAK
CASE MONEY_EARN_REFUND RETURN "REFUND" BREAK
CASE MONEY_EARN_BANK_INT RETURN "BANK_INT" BREAK
CASE MONEY_EARN_BANK_INTEREST RETURN "BANK_INTEREST" BREAK
CASE MONEY_EARN_FROM_JOB_BONUS RETURN "FROM_JOB_BONUS" BREAK
CASE MONEY_EARN_FROM_HEIST_JOB RETURN "FROM_HEIST_JOB" BREAK
DEFAULT
IF eEarn = INT_TO_ENUM(EARN_CATEGORIES, ENUM_TO_INT(MONEY_SPENT_PROPERTY_UTIL))
RETURN "S:PROPERTY_UTIL"
ELIF eEarn = INT_TO_ENUM(EARN_CATEGORIES, ENUM_TO_INT(MONEY_SPENT_STYLE_ENT))
RETURN "S:STYLE_ENT"
ELIF eEarn = INT_TO_ENUM(EARN_CATEGORIES, ENUM_TO_INT(MONEY_SPENT_CONTACT_SERVICE))
RETURN "S:STYLE_ENT"
ELIF eEarn = INT_TO_ENUM(EARN_CATEGORIES, ENUM_TO_INT(MONEY_SPENT_HEALTHCARE))
RETURN "S:HEALTHCARE"
ELIF eEarn = INT_TO_ENUM(EARN_CATEGORIES, ENUM_TO_INT(MONEY_SPENT_VEH_MAINTENANCE))
RETURN "S:VEH_MAINTENANCE"
ELIF eEarn = INT_TO_ENUM(EARN_CATEGORIES, ENUM_TO_INT(MONEY_SPENT_JOB_ACTIVITY))
RETURN "S:JOB_ACTIVITY"
ENDIF
BREAK
ENDSWITCH
RETURN ""
ENDFUNC
#ENDIF
PROC DECREMENT_STOCK_FILTERS_DURATIONS()
CPRINTLN(DEBUG_STOCKS, "Updating active stock filters...")
IF g_savedGlobals.sFinanceData.iFiltersRegistered < 1
CPRINTLN(DEBUG_STOCKS, "No filters are registered. Exiting.")
EXIT
ENDIF
INT i
REPEAT MAX_SP_FINANCE_FILTERS i
IF NOT IS_BIT_SET(g_savedGlobals.sFinanceData.iFilterFlags[i], MFFILTER_RESET_POST_EXILE3)
IF g_savedGlobals.sFinanceData.iFilterDurationRemaining[i] > 0
//Filter update duration is measured in log updates
g_savedGlobals.sFinanceData.iFilterDurationRemaining[i] -= 1
CPRINTLN(DEBUG_STOCKS, "Filter index ",i," duration remaining ", g_savedGlobals.sFinanceData.iFilterDurationRemaining[i])
IF g_savedGlobals.sFinanceData.iFilterDurationRemaining[i] < 1
g_savedGlobals.sFinanceData.iFilterDurationRemaining[i] = 0
--g_savedGlobals.sFinanceData.iFiltersRegistered
CDEBUG1LN(DEBUG_STOCKS, "Filter index ", i, " expired. Unregistered filter.")
ENDIF
ENDIF
ENDIF
ENDREPEAT
CPRINTLN(DEBUG_STOCKS, "...Filter updates finished.")
ENDPROC
FUNC INT GET_FREE_OR_OWNED_BAWSAQ_PORTFOLIO_INDEX(BAWSAQ_TRADERS save_to, BAWSAQ_COMPANIES stock_name)
INT foundindex = -1
BOOL foundBoughtAlready = FALSE
INT i
REPEAT MAX_BAWSAQ_PORTFOLIO_ENTRIES_PER_TRADER i
IF (GET_OWNED_TOTAL_FROM_PORTFOLIO(ENUM_TO_INT(save_to),i) = 0) AND (NOT foundBoughtAlready)
foundindex = i
ENDIF
IF GET_COMPANY_INDEX_FROM_PORTFOLIO(ENUM_TO_INT(save_to),i) = stock_name AND (GET_OWNED_TOTAL_FROM_PORTFOLIO(ENUM_TO_INT(save_to),i) > 0)
foundBoughtAlready = TRUE
foundindex = i
ENDIF
ENDREPEAT
RETURN foundindex
ENDFUNC
PROC AWARD_LCN_SHARES(BAWSAQ_TRADERS save_to, BAWSAQ_COMPANIES stock_name, INT value)
INT foundIndex = GET_FREE_OR_OWNED_BAWSAQ_PORTFOLIO_INDEX(save_to,stock_name)
IF foundIndex = -1
CPRINTLN(DEBUG_STOCKS, "AWARD_LCN_SHARES: Cannot award shares no space")
EXIT
ENDIF
FLOAT fprice = GET_STOCK_PRICE(ENUM_TO_INT(stock_name))
IF g_BS_Listings[stock_name].bOnlineStock
CASSERTLN(DEBUG_STOCKS, "AWARD_LCN_SHARES called on an online listing ", ENUM_TO_INT(stock_name), ". This command should only be used with LCN stocks.")
EXIT
ENDIF
INT totalgift = CEIL(TO_FLOAT(value)/fprice)
SET_COMPANY_INDEX_FROM_PORTFOLIO(ENUM_TO_INT(save_to),foundindex,stock_name)
SET_OWNED_TOTAL_FROM_PORTFOLIO(ENUM_TO_INT(save_to),foundindex,totalgift,TRUE)
ENDPROC
/// PARAMS:
/// buy_with - The account name to use funds from
/// save_to - The portfolio the bought stocks will be added to
/// stock_name - the type of stock to buy
/// number_of_shares - the amount of shares of given stock to buy
PROC BUY_STOCKS(enumBankAccountName buy_with, BAWSAQ_TRADERS save_to, BAWSAQ_COMPANIES stock_name, INT number_of_shares, FLOAT share_price)
CPRINTLN(DEBUG_STOCKS, "Attemping to buy online stocks. Trader:", save_to, " Company:", stock_name, " NumberOfShares:", number_of_shares, " SharePrice:", share_price)
// Find free stock portfolio index, or find already owned index.
INT foundindex = GET_FREE_OR_OWNED_BAWSAQ_PORTFOLIO_INDEX(save_to, stock_name)
IF foundindex = -1
CPRINTLN(DEBUG_STOCKS, "Failed: There were no free portfolio indexes in this character's saved globals.")
g_bBSWebsiteNoSpaceTrigger = TRUE
EXIT
ENDIF
g_bBSWebsiteNoSpaceTrigger = FALSE
CDEBUG1LN(DEBUG_STOCKS, "Found portfolio index ", foundindex, " to save the stock data in.")
// Check if we need to set up a fresh portfolio for these stocks.
IF GET_OWNED_TOTAL_FROM_PORTFOLIO(ENUM_TO_INT(save_to), foundindex) = 0
CDEBUG1LN(DEBUG_STOCKS, "The player doesn't own any stocks for this company. Cleaning out the portfolio index for new company.")
SET_INVESTED_TOTAL_FROM_PORTFOLIO(ENUM_TO_INT(save_to), foundindex, 0.0)
ENDIF
// Safeguard against players spending more than they have.
INT bat = CEIL(share_price)
BOOL bForceBankAction = FALSE
IF bat > g_BankAccounts[buy_with].iBalance
CDEBUG1LN(DEBUG_STOCKS, "Purchase price is above the player's bank balance. Simply using max bank balance of $", g_BankAccounts[buy_with].iBalance, " instead.")
bat = g_BankAccounts[buy_with].iBalance
bForceBankAction = TRUE
ENDIF
IF NOT DO_BANK_ACCOUNT_ACTION(buy_with, BAA_DEBIT,BAAC_BROKERAGE_PAYMENT, bat, bForceBankAction)
SCRIPT_ASSERT("BUY_STOCKS: Action failed because DO_BANK_ACCOUNT_ACTION failed.")
EXIT
ENDIF
CDEBUG1LN(DEBUG_STOCKS, "Bank transaction completed.")
SET_OWNED_TOTAL_FROM_PORTFOLIO(ENUM_TO_INT(save_to), foundindex, number_of_shares, TRUE)
SET_INVESTED_TOTAL_FROM_PORTFOLIO(ENUM_TO_INT(save_to), foundindex, share_price, TRUE)
SET_COMPANY_INDEX_FROM_PORTFOLIO(ENUM_TO_INT(save_to), foundindex, stock_name)
g_savedGlobals.sFinanceData.iProfitLoss -= CEIL(share_price)
CDEBUG1LN(DEBUG_STOCKS, "Profit tracking for PURE_ALPHA_ACHIEVEMENT is now ", g_savedGlobals.sFinanceData.iProfitLoss, ".")
//If the player invests more than $1 million dollars at once push
//a message to the PS4 feed.
IF share_price > 1000000
REQUEST_SYSTEM_ACTIVITY_TYPE_STOCKMARKET_INVESTED()
ENDIF
//Can't have this run and trigger a save on mission due to 1589060.
REGISTER_SCRIPT_IN_COMPLETION_PERCENTAGE_TOTAL(CP_STOCKS)
IF number_of_shares < 1
EXIT
ENDIF
IF g_BS_Listings[stock_name].bOnlineStock
INT si = g_BS_Listings[stock_name].StatIndex
IF si > -1
STAT_SET_INT(g_BS_OIndexData[si].OnlineCharOwned[save_to],
GET_OWNED_TOTAL_FROM_PORTFOLIO(ENUM_TO_INT(save_to),foundindex))
ENDIF
ENDIF
//Check for big investments to inform friends about.
IF share_price > 1000000.0
CDEBUG1LN(DEBUG_STOCKS, "Presence event triggered for purchase over $1000000.")
PRESENCE_EVENT_UPDATESTAT_INT (SP0_CROUCHED_AND_SHOT, 10)
ENDIF
//If we've changed a BAWSAQ stock, update social club with the amount of stocks the character owns.
IF g_BS_Listings[stock_name].bOnlineStock
CDEBUG1LN(DEBUG_STOCKS, "Stock is a BAWSAQ stock. Updating social club stats.")
UPDATE_SOCIAL_CLUB_BAWSAQ_PORTFOLIO_STATS_FOR_CHARACTER(ENUM_TO_INT(save_to))
ENDIF
IF g_OnMissionState = MISSION_TYPE_OFF_MISSION
CDEBUG1LN(DEBUG_STOCKS, "We're off-mission. Logging latest bank actions.")
COPY_BANK_TRANSLOGS()
ENDIF
CPRINTLN(DEBUG_STOCKS, "Stock purchase complete.")
ENDPROC
/// PURPOSE:
///
/// PARAMS:
/// profits_to - the account name to place the proceeds in
/// sell_from - the portfolio to sell the given stock from
/// stock_name - the type of stock to sell
/// number_of_shares - the amount of shares to sell
PROC SELL_STOCKS(enumBankAccountName profits_to, BAWSAQ_TRADERS sell_from, BAWSAQ_COMPANIES stock_name, INT number_of_shares, FLOAT share_price)
CPRINTLN(DEBUG_STOCKS, "Attemping to sell online stocks. Trader: ", sell_from, " Company:", stock_name, " NumberOfShares:", number_of_shares, " SharePrice:", share_price)
// Does the portfolio selected have any of the needed stocks?
INT foundindex = -1
INT i = 0
REPEAT MAX_BAWSAQ_PORTFOLIO_ENTRIES_PER_TRADER i
IF GET_COMPANY_INDEX_FROM_PORTFOLIO(ENUM_TO_INT(sell_from), i) = stock_name
IF GET_OWNED_TOTAL_FROM_PORTFOLIO(ENUM_TO_INT(sell_from), i) > 0
foundindex = i
ENDIF
ENDIF
ENDREPEAT
IF foundindex = -1
CPRINTLN(DEBUG_STOCKS, "Failed: The character doesn't own any of the stock they are trying to sell.")
SCRIPT_ASSERT("Player is trying to sell a stock they don't own any of. Bug *Default Levels*.")
EXIT
ENDIF
INT iOwned = GET_OWNED_TOTAL_FROM_PORTFOLIO(ENUM_TO_INT(sell_from),foundindex)
CDEBUG1LN(DEBUG_STOCKS, "The player owns ", iOwned, " of the stock.")
FLOAT fInvestment = GET_INVESTED_TOTAL_FROM_PORTFOLIO(ENUM_TO_INT(sell_from), foundindex)
CDEBUG1LN(DEBUG_STOCKS, "The invested value of these stocks is ", fInvestment, ".")
//Does we have too little of this stock to make the sale?
IF GET_OWNED_TOTAL_FROM_PORTFOLIO(ENUM_TO_INT(sell_from),foundindex) < number_of_shares
CPRINTLN(DEBUG_STOCKS, "Failed: The character doesn't own enough of the stock they are trying to sell.")
SCRIPT_ASSERT("Script trying to sell more shares than the portfolio actually has!")
EXIT
ENDIF
// Perform the sale.
IF NOT DO_BANK_ACCOUNT_ACTION(profits_to, BAA_CREDIT,BAAC_BROKERAGE_PAYMENT, FLOOR(share_price))
SCRIPT_ASSERT("SELL_STOCKS: Action failed because DO_BANK_ACCOUNT_ACTION failed.")
EXIT
ENDIF
CDEBUG1LN(DEBUG_STOCKS, "Bank transaction completed.")
FLOAT winloss = share_price - ((GET_INVESTED_TOTAL_FROM_PORTFOLIO(ENUM_TO_INT(sell_from), foundindex)/GET_OWNED_TOTAL_FROM_PORTFOLIO(ENUM_TO_INT(sell_from),foundindex)) * number_of_shares)
CDEBUG1LN(DEBUG_STOCKS, "The character's profits from this sale over their initial investment is ", winloss, ".")
//If the player has lost more than $50000 in this trade push a message to
//the PS4 activity feed.
IF winloss <= -50000
REQUEST_SYSTEM_ACTIVITY_TYPE_STOCKMARKET_LOSS()
ENDIF
//Fix the money invested total if there are any shares left, or clear it if there are none left.
SET_INVESTED_TOTAL_FROM_PORTFOLIO(ENUM_TO_INT(sell_from), foundindex, -share_price ,TRUE)
SET_OWNED_TOTAL_FROM_PORTFOLIO(ENUM_TO_INT(sell_from), foundindex, -number_of_shares, TRUE)
g_savedGlobals.sFinanceData.iProfitLoss += FLOOR(share_price)
CDEBUG1LN(DEBUG_STOCKS, "Profit tracking for PURE_ALPHA_ACHIEVEMENT is now ", g_savedGlobals.sFinanceData.iProfitLoss, ".")
// If the acheivement hasn't already been met check if the latest change will trigger it.
IF !CHECK_TRADING_PURE_ALPHA_ACHIEVEMENT()
FLOAT rat = TO_FLOAT(number_of_shares)/TO_FLOAT(iOwned) //selling x proportion of owned ratio
FLOAT fAdjustedInvestment = fInvestment*rat
IF share_price > fAdjustedInvestment
CHECK_TRADING_PURE_ALPHA_ACHIEVEMENT(TRUE)
ENDIF
ENDIF
//Increment the volume for BAWSAQ online tracking.
IF g_BS_Listings[stock_name].bOnlineStock
INT si = g_BS_Listings[stock_name].StatIndex
IF si > -1
CDEBUG1LN(DEBUG_BAWSAQ, "Stock is a BAWSAQ stock. Updating stat for server to track.")
STAT_SET_INT(g_BS_OIndexData[si].OnlineCharOwned[sell_from], GET_OWNED_TOTAL_FROM_PORTFOLIO(ENUM_TO_INT(sell_from), foundindex))
ENDIF
ENDIF
//Check if the profit or loss was large enough to tell the player's friends about.
IF winloss > 100000
CDEBUG1LN(DEBUG_STOCKS, "The player has made an investment profit of over $100000. Triggering friend broadcast.")
PRESENCE_EVENT_UPDATESTAT_INT(SP0_CROUCHED_AND_SHOT, 20)
ELIF winloss < 0
IF winloss < -100000
CDEBUG1LN(DEBUG_STOCKS, "The player has made an investment loss of over $100000. Triggering friend broadcast.")
PRESENCE_EVENT_UPDATESTAT_INT (SP0_CROUCHED_AND_SHOT, 30)
ENDIF
ENDIF
//If we've changed a BAWSAQ stock, update social club with the amount of stocks the character owns.
IF g_BS_Listings[stock_name].bOnlineStock
CDEBUG1LN(DEBUG_BAWSAQ, "Stock is a BAWSAQ stock. Updating social club stats.")
UPDATE_SOCIAL_CLUB_BAWSAQ_PORTFOLIO_STATS_FOR_CHARACTER(ENUM_TO_INT(sell_from))
ENDIF
CPRINTLN(DEBUG_STOCKS, "Stock sale complete.")
ENDPROC
PROC SELL_ALL_STOCKS(enumBankAccountName profits_to, BAWSAQ_TRADERS sell_from)
CPRINTLN(DEBUG_STOCKS, "Attemping to sell all online stocks. Trader: ", sell_from, ".")
#IF IS_DEBUG_BUILD
IF g_iStockSellAllQuote > 0
CPRINTLN(DEBUG_STOCKS, "Price for sale quoted at $", g_iStockSellAllQuote, ".")
ENDIF
#ENDIF
INT iOwned = 0
INT iTypes = 0
FLOAT fRawVal = 0
FLOAT fSumProf = 0
FLOAT fIncOnly = 0
FLOAT fFallOnly = 0
BOOL bAProfitWasMade = FALSE
INT i
REPEAT MAX_BAWSAQ_PORTFOLIO_ENTRIES_PER_TRADER i
IF GET_OWNED_TOTAL_FROM_PORTFOLIO(ENUM_TO_INT(sell_from),i) > 0
FLOAT price = GET_CURRENT_STOCK_PRICE(ENUM_TO_INT(GET_COMPANY_INDEX_FROM_PORTFOLIO(ENUM_TO_INT(sell_from),i)))
IF price > 0
INT iOwnedForCompany = GET_OWNED_TOTAL_FROM_PORTFOLIO(ENUM_TO_INT(sell_from), i)
iOwned += iOwnedForCompany
++iTypes
FLOAT thisraw = GET_OWNED_TOTAL_FROM_PORTFOLIO(ENUM_TO_INT(sell_from),i) * price
FLOAT inve = GET_INVESTED_TOTAL_FROM_PORTFOLIO(ENUM_TO_INT(sell_from),i)
#IF IS_DEBUG_BUILD
IF iOwnedForCompany > 0
CDEBUG1LN(DEBUG_STOCKS, "Found ", iOwned, " stocks for company ", i, " worth ", thisraw, " owned by this character.")
ENDIF
#ENDIF
fRawVal+= thisraw
FLOAT proval = thisraw - inve
IF( proval > 0)
fIncOnly += proval
ELSE
fFallOnly += (-(proval))
ENDIF
fSumProf += proval
IF !bAProfitWasMade AND proval > 0
bAProfitWasMade = TRUE
ENDIF
ELSE
CDEBUG1LN(DEBUG_STOCKS, "Excluded selling stock at portfolio index ", i, " due to invalid current price of $", price, ".")
ENDIF
ENDIF
ENDREPEAT
CDEBUG1LN(DEBUG_STOCKS, "Found a total of ", iOwned, " stocks worth ", fRawVal, " for this character.")
IF iOwned = 0
CPRINTLN(DEBUG_STOCKS, "Failed: Cannot sell everything when the player owns nothing.")
SCRIPT_ASSERT("SELL_ALL_STOCKS: Cannot sell everything when the player owns nothing.")
EXIT
ENDIF
// Work out the wealth raise value before we do the transaction and clear up the owned totals
FLOAT fCurrfunds = TO_FLOAT(GET_ACCOUNT_BALANCE(profits_to))
FLOAT fNewFunds = fRawVal + fCurrfunds
IF fCurrfunds < 1.0
fCurrfunds = 1.0
ENDIF
g_fLastStockSellAll_NewWealthPerc = (fNewFunds/fCurrfunds)*100.0
g_savedGlobals.sFinanceData.iProfitLoss += FLOOR(fRawVal)
CDEBUG1LN(DEBUG_STOCKS, "Profit tracking for PURE_ALPHA_ACHIEVEMENT is now ", g_savedGlobals.sFinanceData.iProfitLoss, ".")
IF !CHECK_TRADING_PURE_ALPHA_ACHIEVEMENT()
IF bAProfitWasMade
CHECK_TRADING_PURE_ALPHA_ACHIEVEMENT(true)
ENDIF
ENDIF
IF g_iStockSellAllQuote = 0
CDEBUG1LN(DEBUG_STOCKS, "No quote set, using calculated value.")
g_iStockSellAllQuote = FLOOR(fRawVal)
ENDIF
IF g_iStockSellAllQuote = 0
CPRINTLN(DEBUG_STOCKS, "Failed: Cannot sell everything when its worth nothing. This shouldn't happen.")
SCRIPT_ASSERT("SELL_ALL_STOCKS: Cannot sell everything when its worth nothing.")
EXIT
ENDIF
// Now do the transaction and zero out the owned stocks.
IF NOT DO_BANK_ACCOUNT_ACTION(profits_to,BAA_CREDIT,BAAC_BROKERAGE_PAYMENT,g_iStockSellAllQuote)
SCRIPT_ASSERT("SELL_ALL_STOCKS: Action failed because DO_BANK_ACCOUNT_ACTION failed.")
EXIT
ENDIF
CDEBUG1LN(DEBUG_STOCKS, "Bank transaction completed.")
g_iStockSellAllQuote = 0
i = 0
REPEAT MAX_BAWSAQ_PORTFOLIO_ENTRIES_PER_TRADER i
SET_OWNED_TOTAL_FROM_PORTFOLIO(ENUM_TO_INT(sell_from),i,0)
ENDREPEAT
// Made it this far then success, log values and bail.
g_iLastStockSellAll_Totshares = iOwned
g_iLastStockSellAll_Cotot = iTypes
g_fLastStockSellAll_Valover = fIncOnly
g_fLastStockSellAll_Valunder = fFallOnly
g_fLastStockSellAll_Totval = fRawVal
g_fLastStockSellAll_Profval = fSumProf
CDEBUG1LN(DEBUG_STOCKS, "Sale values logged.")
//We've sold a variety of stocks. Some might be BAWSAQ so update Social Club with owned stock values.
CDEBUG1LN(DEBUG_BAWSAQ, "Updating social club stats in case we just sold BAWSAQ stocks.")
UPDATE_SOCIAL_CLUB_BAWSAQ_PORTFOLIO_STATS_FOR_CHARACTER(ENUM_TO_INT(sell_from))
CPRINTLN(DEBUG_STOCKS, "All stocks sold sucessfully.")
ENDPROC
PROC FORCE_STOCK_LOG_UPDATE(INT iNumberOfUpdates = 1)
CPRINTLN(DEBUG_STOCKS, "Script ", GET_THIS_SCRIPT_NAME(), " has requested an instant log update from the stock controller.")
g_iForceStockLogUpdate = iNumberOfUpdates
ENDPROC
/// PURPOSE:
/// Find the highest value a stock has held in its logged history.
FUNC FLOAT GET_HIGH_VALUE_FOR_COMPANY(BAWSAQ_COMPANIES target)
FLOAT ret = 0
INT i
REPEAT MAX_STOCK_PRICE_LOG_ENTRIES i
IF g_BS_Listings[target].LoggedPrices[i] > 0.0
IF ret < g_BS_Listings[target].LoggedPrices[i]
ret = g_BS_Listings[target].LoggedPrices[i]
ENDIF
ENDIF
ENDREPEAT
RETURN ret
ENDFUNC
/// PURPOSE:
/// Find the lowest value a stock has held in its logged history.
FUNC FLOAT GET_LOW_VALUE_FOR_COMPANY(BAWSAQ_COMPANIES target)
FLOAT ret = 3.402823E+38 //Max float.
INT i
REPEAT MAX_STOCK_PRICE_LOG_ENTRIES i
IF g_BS_Listings[target].LoggedPrices[i] > 0.0
IF ret > g_BS_Listings[target].LoggedPrices[i]
ret = g_BS_Listings[target].LoggedPrices[i]
ENDIF
ENDIF
ENDREPEAT
RETURN ret
ENDFUNC
///////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////
/// this stuff should probably be moved to a private header
PROC PUSH_PRICE_TRIGGER(BAWSAQ_COMPANIES forCompany,
STRING header, STRING content,
eSTOCK_MARKET_NEWS_STORY_PRICE_TRIGGER_TYPE type,
eSTOCK_STORY_CATEGORY category = eSS_main)
IF g_iPRICE_CARET = PRICE_TRIGGER_STACK_TOTAL
SCRIPT_ASSERT("PUSH_PRICE_TRIGGER: no space left to add price triggers")
EXIT
ENDIF
g_BS_PriceTriggers[g_iPRICE_CARET].t = type
g_BS_PriceTriggers[g_iPRICE_CARET].s.eCat = category
g_BS_PriceTriggers[g_iPRICE_CARET].s.tHeader = header
g_BS_PriceTriggers[g_iPRICE_CARET].s.tSummary = content
g_BS_PriceTriggers[g_iPRICE_CARET].s.storyID = g_iSTORY_ID_CARET
g_BS_PriceTriggers[g_iPRICE_CARET].c = forCompany
++g_iPRICE_CARET
++g_iSTORY_ID_CARET
ENDPROC
PROC PUSH_MODIFIER_TRIGGER(BSMF_TYPES forModifier,
STRING header, STRING content,
eSTOCK_MARKET_NEWS_STORY_MODIFIER_TRIGGER_TYPE type,
eSTOCK_STORY_CATEGORY category = eSS_main)
IF g_iMODIFIER_CARET = g_iMODIFIER_CARET
SCRIPT_ASSERT("PUSH_MODIFIER_TRIGGER: no space left to add price triggers")
EXIT
ENDIF
g_BS_ModifierTrigger[g_iMODIFIER_CARET].t = type
g_BS_ModifierTrigger[g_iMODIFIER_CARET].s.eCat = category
g_BS_ModifierTrigger[g_iMODIFIER_CARET].s.tHeader = header
g_BS_ModifierTrigger[g_iMODIFIER_CARET].s.tSummary = content
g_BS_ModifierTrigger[g_iMODIFIER_CARET].s.storyID = g_iSTORY_ID_CARET
g_BS_ModifierTrigger[g_iMODIFIER_CARET].m = forModifier
++g_iMODIFIER_CARET
++g_iSTORY_ID_CARET
ENDPROC
FUNC BOOL STACKIFY_STORY(STOCK_MARKET_NEWS_STORY &sto, INT force_category = -1)
#IF IS_DEBUG_BUILD
IF g_bForceBawsaqNews
CPRINTLN(DEBUG_STOCKS, "Ignore trying to stackify story ID ", sto.storyID, ".")
RETURN FALSE
ENDIF
#ENDIF
CDEBUG1LN(DEBUG_STOCKS, "Trying to stackify story ID ", sto.storyID, ".")
// Find a slot with lower freshness and plop in the story.
eSTOCK_STORY_CATEGORY c = sto.eCat
IF force_category != -1
c = INT_TO_ENUM(eSTOCK_STORY_CATEGORY,force_category)
ENDIF
INT i = 0
REPEAT BAWSAQ_STORIES_PER_CATEGORY i
IF g_BS_NewsStack[c][i].storyID = sto.storyID
CDEBUG1LN(DEBUG_STOCKS, "Failed. The story was already on the stack.")
sto.freshness += 0.05 //each time a story is triggered it gets less fresh
RETURN FALSE//this story is already on the stack, don't add
ENDIF
ENDREPEAT
i = 0
FLOAT f = 0.0
INT lowestindex = -1
REPEAT BAWSAQ_STORIES_PER_CATEGORY i
IF g_BS_NewsStack[c][i].freshness > f
lowestindex = i
f = g_BS_NewsStack[c][i].freshness
ENDIF
ENDREPEAT
IF lowestindex = -1
RETURN FALSE
ENDIF
//This is fresher than this story, add and exit.
IF sto.freshness <= g_BS_NewsStack[c][lowestindex].freshness
sto.freshness += 1.0 // Each time a story is triggered it gets less fresh.
g_BS_NewsStack[c][lowestindex].freshness = sto.freshness
g_BS_NewsStack[c][lowestindex].tHeader = sto.tHeader
g_BS_NewsStack[c][lowestindex].tSummary = sto.tSummary
g_BS_NewsStack[c][lowestindex].storyID = sto.storyID
g_BS_NewsStack[c][lowestindex].eCat = sto.eCat
CDEBUG1LN(DEBUG_STOCKS, "Placed story \"", sto.tHeader, "\" in news stack at ", c ," - ", lowestindex )
RETURN TRUE
ENDIF
CDEBUG1LN(DEBUG_STOCKS, "Failed. Every story was fresher than this story! There were no valid slots on the stack.")
RETURN FALSE
ENDFUNC
//Move these init funcs to finance private
PROC INITIALISE_MARKET_NEWS_STORIES()
g_iPRICE_CARET = 0
g_iSTORY_ID_CARET = 0
CDEBUG1LN(DEBUG_STOCKS, "Clearing all news strings to the default.")
INT i, j
REPEAT eSS_Max_Categories i
REPEAT BAWSAQ_STORIES_PER_CATEGORY j
g_BS_NewsStack[i][j].tHeader = "BSNEWS_DEFAULT"
g_BS_NewsStack[i][j].tSummary = "BSNEWS_DEFAULT"
ENDREPEAT
ENDREPEAT
//Set initial story strings.
//PRICE_STORY_SUSTAINED_RISE: Sustained price increase over 10 ticks with end price greater than 50%+ of starting.
//PRICE_STORY_SUSTAINED_FALL: Sustained price fall over 10 ticks with end price lower than 50%- of starting.
//PRICE_STORY_RAPID_FLUCTUATION: At least 5 price reversals in the last 10 ticks combined with at least a 20% price change on average, with finishing price within 20%+/- of start.
CDEBUG1LN(DEBUG_STOCKS, "Setting initial story strings for all offline stocks.")
// eCola// Offline
PUSH_PRICE_TRIGGER(BS_CO_ECL,"ECL_P_SR_H","ECL_P_SR_C",PRICE_STORY_SUSTAINED_RISE)
PUSH_PRICE_TRIGGER(BS_CO_ECL,"ECL_P_SF_H","ECL_P_SF_C",PRICE_STORY_SUSTAINED_FALL)
PUSH_PRICE_TRIGGER(BS_CO_ECL,"ECL_P_RF_H","ECL_P_RF_C",PRICE_STORY_RAPID_FLUCTUATION)
// BurgerShot// Offline
PUSH_PRICE_TRIGGER(BS_CO_BGR,"BGR_P_SR_H","BGR_P_SR_C",PRICE_STORY_SUSTAINED_RISE)
PUSH_PRICE_TRIGGER(BS_CO_BGR,"BGR_P_SF_H","BGR_P_SF_C",PRICE_STORY_SUSTAINED_FALL)
//PUSH_PRICE_TRIGGER(BS_CO_BGR,"BGR_P_RF_H","BGR_P_RF_C",PRICE_STORY_RAPID_FLUCTUATION)
// CluckingBell// Offline
PUSH_PRICE_TRIGGER(BS_CO_CLK,"CLK_P_SR_H","CLK_P_SR_C",PRICE_STORY_SUSTAINED_RISE)
PUSH_PRICE_TRIGGER(BS_CO_CLK,"CLK_P_SF_H","CLK_P_SF_C",PRICE_STORY_SUSTAINED_FALL)
PUSH_PRICE_TRIGGER(BS_CO_CLK,"CLK_P_RF_H","CLK_P_RF_C",PRICE_STORY_RAPID_FLUCTUATION)
// BeanMachine// Offline
PUSH_PRICE_TRIGGER(BS_CO_BEN,"BEN_P_SR_H","BEN_P_SR_C",PRICE_STORY_SUSTAINED_RISE)
PUSH_PRICE_TRIGGER(BS_CO_BEN,"BEN_P_SF_H","BEN_P_SF_C",PRICE_STORY_SUSTAINED_FALL)
PUSH_PRICE_TRIGGER(BS_CO_BEN,"BEN_P_RF_H","BEN_P_RF_C",PRICE_STORY_RAPID_FLUCTUATION)
// Fleeca// Offline
PUSH_PRICE_TRIGGER(BS_CO_FLC,"FLC_P_SR_H","FLC_P_SR_C",PRICE_STORY_SUSTAINED_RISE)
PUSH_PRICE_TRIGGER(BS_CO_FLC,"FLC_P_SF_H","FLC_P_SF_C",PRICE_STORY_SUSTAINED_FALL)
PUSH_PRICE_TRIGGER(BS_CO_FLC,"FLC_P_RF_H","FLC_P_RF_C",PRICE_STORY_RAPID_FLUCTUATION)
// Prolaps// Offline
PUSH_PRICE_TRIGGER(BS_CO_PRO,"PRO_P_SR_H","PRO_P_SR_C",PRICE_STORY_SUSTAINED_RISE)
PUSH_PRICE_TRIGGER(BS_CO_PRO,"PRO_P_SF_H","PRO_P_SF_C",PRICE_STORY_SUSTAINED_FALL)
PUSH_PRICE_TRIGGER(BS_CO_PRO,"PRO_P_RF_H","PRO_P_RF_C",PRICE_STORY_RAPID_FLUCTUATION)
// VanillaUnicorn// Offline
PUSH_PRICE_TRIGGER(BS_CO_UNI,"UNI_P_SR_H","UNI_P_SR_C",PRICE_STORY_SUSTAINED_RISE)
PUSH_PRICE_TRIGGER(BS_CO_UNI,"UNI_P_SF_H","UNI_P_SF_C",PRICE_STORY_SUSTAINED_FALL)
PUSH_PRICE_TRIGGER(BS_CO_UNI,"UNI_P_RF_H","UNI_P_RF_C",PRICE_STORY_RAPID_FLUCTUATION)
// Krapea// Offline
PUSH_PRICE_TRIGGER(BS_CO_KRP,"KRP_P_SR_H","KRP_P_SR_C",PRICE_STORY_SUSTAINED_RISE)
PUSH_PRICE_TRIGGER(BS_CO_KRP,"KRP_P_SF_H","KRP_P_SF_C",PRICE_STORY_SUSTAINED_FALL)
PUSH_PRICE_TRIGGER(BS_CO_KRP,"KRP_P_RF_H","KRP_P_RF_C",PRICE_STORY_RAPID_FLUCTUATION)
// FlyUS// Offline
PUSH_PRICE_TRIGGER(BS_CO_FUS,"FUS_P_SR_H","FUS_P_SR_C",PRICE_STORY_SUSTAINED_RISE)
PUSH_PRICE_TRIGGER(BS_CO_FUS,"FUS_P_SF_H","FUS_P_SF_C",PRICE_STORY_SUSTAINED_FALL)
PUSH_PRICE_TRIGGER(BS_CO_FUS,"FUS_P_RF_H","FUS_P_RF_C",PRICE_STORY_RAPID_FLUCTUATION)
// GoPostal// Offline
PUSH_PRICE_TRIGGER(BS_CO_GOP,"GOP_P_SR_H","GOP_P_SR_C",PRICE_STORY_SUSTAINED_RISE)
PUSH_PRICE_TRIGGER(BS_CO_GOP,"GOP_P_SF_H","GOP_P_SF_C",PRICE_STORY_SUSTAINED_FALL)
PUSH_PRICE_TRIGGER(BS_CO_GOP,"GOP_P_RF_H","GOP_P_RF_C",PRICE_STORY_RAPID_FLUCTUATION)
// Banner// Offline
PUSH_PRICE_TRIGGER(BS_CO_BAN,"BAN_P_SR_H","BAN_P_SR_C",PRICE_STORY_SUSTAINED_RISE)
PUSH_PRICE_TRIGGER(BS_CO_BAN,"BAN_P_SF_H","BAN_P_SF_C",PRICE_STORY_SUSTAINED_FALL)
PUSH_PRICE_TRIGGER(BS_CO_BAN,"BAN_P_RF_H","BAN_P_RF_C",PRICE_STORY_RAPID_FLUCTUATION)
// MaxRena// Offline
PUSH_PRICE_TRIGGER(BS_CO_MAX,"MAX_P_SR_H","MAX_P_SR_C",PRICE_STORY_SUSTAINED_RISE)
PUSH_PRICE_TRIGGER(BS_CO_MAX,"MAX_P_SF_H","MAX_P_SF_C",PRICE_STORY_SUSTAINED_FALL)
PUSH_PRICE_TRIGGER(BS_CO_MAX,"MAX_P_RF_H","MAX_P_RF_C",PRICE_STORY_RAPID_FLUCTUATION)
// GastroBans// Offline
PUSH_PRICE_TRIGGER(BS_CO_GAS,"GAS_P_SR_H","GAS_P_SR_C",PRICE_STORY_SUSTAINED_RISE)
PUSH_PRICE_TRIGGER(BS_CO_GAS,"GAS_P_SF_H","GAS_P_SF_C",PRICE_STORY_SUSTAINED_FALL)
PUSH_PRICE_TRIGGER(BS_CO_GAS,"GAS_P_RF_H","GAS_P_RF_C",PRICE_STORY_RAPID_FLUCTUATION)
// GruppeSechs// Offline
PUSH_PRICE_TRIGGER(BS_CO_GRU,"GRU_P_SR_H","GRU_P_SR_C",PRICE_STORY_SUSTAINED_RISE)
PUSH_PRICE_TRIGGER(BS_CO_GRU,"GRU_P_SF_H","GRU_P_SF_C",PRICE_STORY_SUSTAINED_FALL)
PUSH_PRICE_TRIGGER(BS_CO_GRU,"GRU_P_RF_H","GRU_P_RF_C",PRICE_STORY_RAPID_FLUCTUATION)
// Pump&Run// Offline
PUSH_PRICE_TRIGGER(BS_CO_PMP,"PMP_P_SR_H","PMP_P_SR_C",PRICE_STORY_SUSTAINED_RISE)
PUSH_PRICE_TRIGGER(BS_CO_PMP,"PMP_P_SF_H","PMP_P_SF_C",PRICE_STORY_SUSTAINED_FALL)
PUSH_PRICE_TRIGGER(BS_CO_PMP,"PMP_P_RF_H","PMP_P_RF_C",PRICE_STORY_RAPID_FLUCTUATION)
CDEBUG3LN(DEBUG_STOCKS, "g_iPRICE_CARET = ", g_iPRICE_CARET, ".")
// Finally randomly populate the initial news list.
CDEBUG1LN(DEBUG_STOCKS, "Populating the initial news list with random stories.")
INT r = GET_RANDOM_INT_IN_RANGE(0,(g_iPRICE_CARET-1))
REPEAT eSS_Max_Categories i
REPEAT BAWSAQ_STORIES_PER_CATEGORY j
g_BS_NewsStack[i][j].freshness = 5000
WHILE NOT STACKIFY_STORY(g_BS_PriceTriggers[r].s, i)
r = GET_RANDOM_INT_IN_RANGE(0,(g_iPRICE_CARET-1))
CDEBUG3LN(DEBUG_STOCKS, "New random news story failed to stack.")
WAIT(2000)
ENDWHILE
g_BS_PriceTriggers[r].s.freshness = 0.0
r = GET_RANDOM_INT_IN_RANGE(0,(g_iPRICE_CARET-1))
CDEBUG3LN(DEBUG_STOCKS, "New random news story sucessfully stacked.")
ENDREPEAT
ENDREPEAT
ENDPROC
PROC INIT_GIFT_COUPONS()
IF NOT NETWORK_IS_GAME_IN_PROGRESS()
EXIT
ENDIF
#IF FEATURE_GEN9_EXCLUSIVE
INT iNumHSWUpgradeGift = GET_MP_INT_CHARACTER_STAT(MP_STAT_DISCOUNT_HSW_UPG_GIFT_NEW)
IF iNumHSWUpgradeGift > 0
INT iNumCurrentHSWUpgradeCoupon = GET_NUM_AVAILABLE_HSW_UPGRADE_COUPON()
iNumCurrentHSWUpgradeCoupon += iNumHSWUpgradeGift
IF iNumCurrentHSWUpgradeCoupon <= g_sMPTunables.iHSW_UPGRADE_COUPON_LIMIT
SET_MP_INT_PLAYER_STAT(MPPLY_DISCOUNT_HSW_UPGRADE, iNumCurrentHSWUpgradeCoupon)
ELSE
PRINTLN("INIT_GIFT_COUPONS Don't give HSW voucher as we hit the limit: ", iNumCurrentHSWUpgradeCoupon)
ENDIF
SET_MP_INT_CHARACTER_STAT(MP_STAT_DISCOUNT_HSW_UPG_GIFT_NEW, 0)
PRINTLN("INIT_GIFT_COUPONS MPPLY_DISCOUNT_HSW_UPGRADE: ", iNumCurrentHSWUpgradeCoupon)
ENDIF
#ENDIF
ENDPROC
FUNC BOOL HAS_PRICE_STORY_TRIGGER_FIRED(INT triggerindex)
//TODO integer check here
BAWSAQ_COMPANIES co = g_BS_PriceTriggers[triggerindex].c
FLOAT current = g_BS_Listings[co].fCurrentPrice
//g_BS_Listings[g_BS_PriceTriggers[i].c].iLogIndexCaret
//MAX_STOCK_PRICE_LOG_ENTRIES
//g_BS_Listings[g_BS_PriceTriggers[i].c].LoggedPrices
INT frontindex = g_BS_Listings[co].iLogIndexCaret
WHILE frontindex > (MAX_STOCK_PRICE_LOG_ENTRIES-1)
frontindex = frontindex - MAX_STOCK_PRICE_LOG_ENTRIES
ENDWHILE
INT backindex = (frontindex - 10)
WHILE backindex < 0
backindex = MAX_STOCK_PRICE_LOG_ENTRIES + backindex
ENDWHILE
FLOAT from = g_BS_Listings[co].LoggedPrices[backindex]
//make sure current price in log matches current
g_BS_Listings[co].LoggedPrices[g_BS_Listings[co].iLogIndexCaret] = GET_STOCK_PRICE(ENUM_TO_INT(co))
INT switchbacks = 0
INT rises = 0
INT falls = 0
//look over the range from backindex to frontindex and count the spikes
INT f = backindex + 1
IF f = MAX_STOCK_PRICE_LOG_ENTRIES
f = 0
ENDIF
INT i = 0
INT l = f
INT c = 0
INT n = 0
FLOAT risingaverage
//look over the range from backindex to frontindex and find the average increase
FLOAT fallingaverage
//look over the range from backindex to frontindex and find the average decrease
// l -> c -> n
REPEAT 8 i
c = l+1
IF c = MAX_STOCK_PRICE_LOG_ENTRIES
c = 0
ENDIF
n = c+1
IF n = MAX_STOCK_PRICE_LOG_ENTRIES
n = 0
ENDIF
IF g_BS_Listings[co].LoggedPrices[l] < g_BS_Listings[co].LoggedPrices[c]
++rises
risingaverage += g_BS_Listings[co].LoggedPrices[c] - g_BS_Listings[co].LoggedPrices[l]
ELSE
++falls
fallingaverage += g_BS_Listings[co].LoggedPrices[l] - g_BS_Listings[co].LoggedPrices[c]
ENDIF
//switchback check
IF (g_BS_Listings[co].LoggedPrices[l] < g_BS_Listings[co].LoggedPrices[c])
AND (g_BS_Listings[co].LoggedPrices[n] < g_BS_Listings[co].LoggedPrices[c])
//peak
++switchbacks
ENDIF
IF (g_BS_Listings[co].LoggedPrices[l] > g_BS_Listings[co].LoggedPrices[c])
AND (g_BS_Listings[co].LoggedPrices[n] > g_BS_Listings[co].LoggedPrices[c])
//gutter
++switchbacks
ENDIF
++l
IF l = MAX_STOCK_PRICE_LOG_ENTRIES
l = 0
ENDIF
ENDREPEAT
IF rises < 0
risingaverage = risingaverage/rises
ENDIF
IF falls > 0
fallingaverage = fallingaverage/falls
ENDIF
FLOAT diffdeg = current - from
IF diffdeg < 0
diffdeg *= -1
ENDIF
//FLOAT avtdiff = risingaverage - fallingaverage
SWITCH g_BS_PriceTriggers[triggerindex].t
CASE PRICE_STORY_SUSTAINED_RISE
//for the last 9 logs what percentage is an increase?
//if increase percentage is over X% of the last 9 ticks
IF rises < 6
RETURN FALSE
ENDIF
//and the average movement of those increases is greater than 4% of the price from 10 ticks ago
IF risingaverage < (from*0.04)
RETURN FALSE
ENDIF
CDEBUG1LN(DEBUG_STOCKS, "PRICE_STORY_SUSTAINED_RISE story trigger fired.")
CDEBUG2LN(DEBUG_STOCKS, "(", from, " - > ", current, ")")
CDEBUG2LN(DEBUG_STOCKS, "Diff:", diffdeg, " Switches:", switchbacks , " Rises:", rises , " Falls:", falls , " Rising avt:", risingaverage ," Falling avt:", fallingaverage)
RETURN TRUE
BREAK
CASE PRICE_STORY_SUSTAINED_FALL
IF falls < 6
RETURN FALSE
ENDIF
IF fallingaverage < (from*0.04)
RETURN FALSE
ENDIF
CDEBUG1LN(DEBUG_STOCKS, "PRICE_STORY_SUSTAINED_FALL story trigger fired.")
CDEBUG2LN(DEBUG_STOCKS, "(", from, " - > ", current, ")")
CDEBUG2LN(DEBUG_STOCKS, "Diff:", diffdeg, " Switches:", switchbacks , " Rises:", rises , " Falls:", falls , " Rising avt:", risingaverage ," Falling avt:", fallingaverage)
RETURN TRUE
BREAK
CASE PRICE_STORY_RAPID_FLUCTUATION
//for the last 10 ticks is the number of turnbacks > 4
//is the price at the end of this window within x% of it's starting price?
IF switchbacks < 7
RETURN FALSE
ENDIF
IF diffdeg > (from*0.01)
RETURN FALSE
ENDIF
CDEBUG1LN(DEBUG_STOCKS, "PRICE_STORY_RAPID_FLUCTUATION story trigger fired.")
CDEBUG2LN(DEBUG_STOCKS, "(", from, " - > ", current, ")")
CDEBUG2LN(DEBUG_STOCKS, "Diff:", diffdeg, " Switches:", switchbacks , " Rises:", rises , " Falls:", falls , " Rising avt:", risingaverage ," Falling avt:", fallingaverage)
RETURN TRUE
BREAK
ENDSWITCH
RETURN FALSE
ENDFUNC
ENUM BAWSAQ_INTERNAL_CAR_COMPANIES
BSICC_HVY,
BSICC_MAI,
BSICC_BRU,
BSICC_VAP,
BSICC_BFA,
BSICC_HJK,
BSICC_SHT,
BSICC_UMA,
BSICC_NONE
ENDENUM
FUNC BAWSAQ_INTERNAL_CAR_COMPANIES GET_MAKE_OF_VEHICLE(MODEL_NAMES mn)
SWITCH mn
//SM_VAPID_DESTROYED
CASE BENSON
CASE BOBCATXL
CASE BULLET
CASE DOMINATOR
CASE MINIVAN
CASE PEYOTE
CASE RADI
CASE SADLER
CASE SADLER2
CASE SANDKING
CASE SANDKING2
CASE SPEEDO
CASE SPEEDO2
CASE STANIER
RETURN BSICC_VAP
BREAK
//SM_BRUTE_DESTROYED
CASE BOXVILLE
CASE CAMPER
CASE PONY
CASE PONY2
CASE STOCKADE
CASE STOCKADE3
CASE TIPTRUCK
RETURN BSICC_BRU
BREAK
//SM_SCHYSTER_DESTROYED
CASE FUSILADE
RETURN BSICC_SHT
BREAK
//SM_MAIBATSU_DESTROYED
CASE MULE
CASE MULE2
CASE PENUMBRA
CASE SANCHEZ
CASE SANCHEZ2
RETURN BSICC_MAI
BREAK
//SM_BFA_DESTROYED
CASE BFINJECTION
CASE DUNE
CASE SURFER
CASE SURFER2
RETURN BSICC_BFA
BREAK
//SM_HVY_DESTROYED
CASE BARRACKS2
CASE BIFF
CASE BULLDOZER
CASE CUTTER
CASE DUMP
CASE FORKLIFT
CASE MIXER
CASE MIXER2
RETURN BSICC_HVY
BREAK
//SM_UBERMACHT_DESTROYED
CASE ORACLE
CASE ORACLE2
CASE SENTINEL
CASE SENTINEL2
CASE ZION
CASE ZION2
RETURN BSICC_UMA
BREAK
ENDSWITCH
RETURN BSICC_NONE
ENDFUNC
FUNC BOOL IS_PLAYER_USING_ATM()
RETURN g_bInATM
ENDFUNC