4991 lines
184 KiB
Scheme
Executable File
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
|
|
|
|
|