kits: the pre-match kit screen is futSelectTeam, found without Frosty
The Frostbite .cas chunks holding APT ActionScript are greppable, so screens can
be identified and their whole symbol table recovered without driving the GUI.
Control: KitAssignmentPopup (a string from an already-exported BIG) hits 43 times
across the 52 cas files, so a miss would have been meaningful.
FUT_GET_MATCH_KITS_DP hits 10 times. The binding screen is
external.ion_fut.screens.futSelectTeam
(fifa_installpackage_01/cas_01.cas @ 0x3707ecd7), which no exported BIG contained
after 33 attempts at guessing names.
It binds FUT_GET_MATCH_KITS_DP, KitSelectDP and TeamSetupDP, and carries exactly
the vocabulary the native side implies:
panels/locks mcKitHome mcKitAway mcLockHome mcLockAway m_arrKitPanels
sides HOME_SIDE AWAY_SIDE NEUTRAL_SIDE SIDE_HOME SIDE_AWAY
DP fields KITS_AVAILABLE KIT_ HOME_KIT_ID AWAY_KIT_ID
flow InitializeKitConfig GetKitArrayForFUT InitializeKitsFromArray
EnterKitSelect IsKitSelectCreated ExitKitSelect SaveKitsForMatch
lock CheckIsKitLocked RemoveKitLocks SetKitReady SetKitUnReady
uniform SetUniform ION_Uniform GetNonConflictingUniformID
CheckIsKitLocked is the lock predicate the native side does not own — recall
sub_180033430 only ever writes LOCKED = 0, so the "kit is currently locked" dialog
is raised here.
Adds find_apt_in_cas.py (control-guarded) and the recovered 934-symbol table.
This commit is contained in:
@@ -0,0 +1,934 @@
|
|||||||
|
k|J|
|
||||||
|
tz^WU
|
||||||
|
Gb\X[
|
||||||
|
,j|L
|
||||||
|
cXXXX
|
||||||
|
gzW[rp
|
||||||
|
)l``b`
|
||||||
|
c^^^^
|
||||||
|
zrbnz
|
||||||
|
r--)
|
||||||
|
&jzzx
|
||||||
|
Jl```
|
||||||
|
c^^^\
|
||||||
|
----
|
||||||
|
k|X\^_
|
||||||
|
c\Xxx
|
||||||
|
K|bjk
|
||||||
|
cxxxx
|
||||||
|
---%
|
||||||
|
{xx|
|
||||||
|
cxxxz
|
||||||
|
Frxz
|
||||||
|
{VVVW
|
||||||
|
cpxz~
|
||||||
|
gr*:
|
||||||
|
sTVUU
|
||||||
|
cxz^W
|
||||||
|
[5555
|
||||||
|
px~M
|
||||||
|
cUUU5
|
||||||
|
cUU-
|
||||||
|
gz((+
|
||||||
|
&rX`
|
||||||
|
&kVX
|
||||||
|
cUUUx
|
||||||
|
&r^\
|
||||||
|
%%%%
|
||||||
|
&kUW
|
||||||
|
f[UUW
|
||||||
|
gcE[
|
||||||
|
$gcE[
|
||||||
|
cUU%
|
||||||
|
UUWT
|
||||||
|
xxxx
|
||||||
|
FsUU^
|
||||||
|
$ecF[
|
||||||
|
icD[
|
||||||
|
T\Rb
|
||||||
|
sUW|
|
||||||
|
UUU\
|
||||||
|
VUUU
|
||||||
|
BIGF
|
||||||
|
L286
|
||||||
|
Apt Data:1:7:8
|
||||||
|
game/globalComponents/globalComponents
|
||||||
|
game.globalComponents.ImageLoader
|
||||||
|
game/components/SelectTeam
|
||||||
|
game.components.SelectTeam
|
||||||
|
Coins
|
||||||
|
TournamentData
|
||||||
|
BackingFUT
|
||||||
|
VersusFUT
|
||||||
|
external.ion_fut.screens.futSelectTeam
|
||||||
|
__Packages.external.ion_fut.screens.futSelectTeam
|
||||||
|
__Packages.ion.manager.HelpProperties
|
||||||
|
EACondBold
|
||||||
|
10.000
|
||||||
|
Screen
|
||||||
|
RtIL
|
||||||
|
RYgO
|
||||||
|
7uOO
|
||||||
|
XsOY
|
||||||
|
2sOY
|
||||||
|
<@OY
|
||||||
|
BG&Y
|
||||||
|
3NuIL
|
||||||
|
7NuI
|
||||||
|
3NuI
|
||||||
|
3NstY
|
||||||
|
7uOY
|
||||||
|
&v>Y
|
||||||
|
&v>t
|
||||||
|
3NYN
|
||||||
|
7NYN
|
||||||
|
tOYZ
|
||||||
|
BG&v
|
||||||
|
NZGO
|
||||||
|
NZGOZu
|
||||||
|
uOZu
|
||||||
|
mcCup
|
||||||
|
txtPrizeHeading
|
||||||
|
txtCoins
|
||||||
|
mcCoin
|
||||||
|
mcBacking
|
||||||
|
txtVs
|
||||||
|
mcTournamentInfo
|
||||||
|
mcSelectTeam
|
||||||
|
mcVersusFUT
|
||||||
|
publishObject
|
||||||
|
dpID
|
||||||
|
nHomeKitID
|
||||||
|
nAwayKitID
|
||||||
|
keyCode
|
||||||
|
controllerId
|
||||||
|
nSide
|
||||||
|
arrKitIDs
|
||||||
|
teamId
|
||||||
|
kitToResolve
|
||||||
|
side
|
||||||
|
isUser
|
||||||
|
arrKits
|
||||||
|
objProperties
|
||||||
|
Void
|
||||||
|
nXPos
|
||||||
|
DDS |
|
||||||
|
NVTT
|
||||||
|
DXT5
|
||||||
|
8VTTT
|
||||||
|
UUVT
|
||||||
|
TTTU
|
||||||
|
0TUVT
|
||||||
|
TTUW
|
||||||
|
$$r
|
||||||
|
%UUU
|
||||||
|
WUUU
|
||||||
|
UUUSP
|
||||||
|
UUUM
|
||||||
|
UUUNK
|
||||||
|
72Ib
|
||||||
|
*72Ib
|
||||||
|
U;8I
|
||||||
|
WWWW?>I
|
||||||
|
UIFI
|
||||||
|
WWWWLKI
|
||||||
|
WWWVQNI
|
||||||
|
VVYVI
|
||||||
|
`]IB
|
||||||
|
daIB
|
||||||
|
heIB
|
||||||
|
VlhI
|
||||||
|
vtI"I
|
||||||
|
UU%!I
|
||||||
|
*;8I
|
||||||
|
U?>I
|
||||||
|
ULKI
|
||||||
|
Apt1
|
||||||
|
_global
|
||||||
|
external
|
||||||
|
Object
|
||||||
|
ion_fut
|
||||||
|
screens
|
||||||
|
futSelectTeam
|
||||||
|
futSelectTeam::futSelectTeam()
|
||||||
|
OnExitScreen
|
||||||
|
cafe
|
||||||
|
utility
|
||||||
|
Delegate
|
||||||
|
Create
|
||||||
|
game
|
||||||
|
globalClasses
|
||||||
|
ScreenManager
|
||||||
|
SetOnExitScreenCallback
|
||||||
|
m_nFlowState
|
||||||
|
EA_ZONE
|
||||||
|
gScreenFlowManager
|
||||||
|
getFlowState
|
||||||
|
ION_Platform
|
||||||
|
IsFinal
|
||||||
|
CardNotification
|
||||||
|
eState
|
||||||
|
FUT_OFFLINE_DRAFT
|
||||||
|
FUT_OFFLINE_TOURNAMENT
|
||||||
|
FUT_OFFLINE_SEASON
|
||||||
|
m_bAllowSelectAnyTeam
|
||||||
|
FUT/ALLOW_ANY_CPU_TEAM
|
||||||
|
ION_Customization
|
||||||
|
GetAardvarkIntValue
|
||||||
|
mcPanelHome
|
||||||
|
mcPanelAway
|
||||||
|
mcReadyHome
|
||||||
|
mcReadyAway
|
||||||
|
mcKitHome
|
||||||
|
mcKitAway
|
||||||
|
mcLockHome
|
||||||
|
mcLockAway
|
||||||
|
InitComponents
|
||||||
|
InitializeScreen
|
||||||
|
Initialize
|
||||||
|
screen
|
||||||
|
BaseScreen
|
||||||
|
prototype
|
||||||
|
futSelectTeam::InitializeScreen()
|
||||||
|
_visible
|
||||||
|
HOME_SIDE
|
||||||
|
GameServices
|
||||||
|
eTeamSide
|
||||||
|
SIDE_HOME
|
||||||
|
AWAY_SIDE
|
||||||
|
SIDE_AWAY
|
||||||
|
NEUTRAL_SIDE
|
||||||
|
SIDE_NEUTRAL
|
||||||
|
m_arrPanelData
|
||||||
|
Array
|
||||||
|
m_arrKitPanelData
|
||||||
|
futSelectTeam::InitComponents()
|
||||||
|
InitializeKitConfig
|
||||||
|
InitializeTeamConfig
|
||||||
|
SetTeamAndKitConfigs
|
||||||
|
UIFDataProviderList
|
||||||
|
FUT_USER_CLUB_DATA_DP
|
||||||
|
UIFUtility
|
||||||
|
RegisterDataProvider
|
||||||
|
FUT_OPPONENT_CLUBS_LIST_DP
|
||||||
|
FUT_OPPONENTS_SQUADS_LIST_DP
|
||||||
|
FUT_OPPONENT_SQUAD_LINEUP_DP
|
||||||
|
FUT_USER_SQUAD_LINEUP_DP
|
||||||
|
FUT_CREATE_MATCH_DP
|
||||||
|
FUT_GET_MATCH_KITS_DP
|
||||||
|
SetupReadyTexts
|
||||||
|
initSideInfo
|
||||||
|
SetPanels
|
||||||
|
m_arrPanels
|
||||||
|
m_arrKitPanels
|
||||||
|
KitSelectDP
|
||||||
|
TeamSetupDP
|
||||||
|
AnimateIn
|
||||||
|
AnimateInComplete
|
||||||
|
BeginAnimateIn
|
||||||
|
futSelectTeam::AnimateInComplete()
|
||||||
|
m_bHasAnimatedIn
|
||||||
|
checkForDisconnect
|
||||||
|
gScreenNotAborted
|
||||||
|
LocalEventHandler
|
||||||
|
InputManager
|
||||||
|
AddLocalEventHandler
|
||||||
|
SetHandlerId
|
||||||
|
refreshCurrentConnectionStatus
|
||||||
|
HelpManager
|
||||||
|
Update
|
||||||
|
futSelectTeam::OnExitScreen()
|
||||||
|
AnimationManager
|
||||||
|
ClearAnimations
|
||||||
|
UnregisterDataProvider
|
||||||
|
INJURY_POPUP_ID
|
||||||
|
PopupManager
|
||||||
|
DeletePopup
|
||||||
|
TOTW_BELOW_MIN_POPUP_ID
|
||||||
|
USER_BELOW_MIN_POPUP_ID
|
||||||
|
OPP_BELOW_MIN_POPUP_ID
|
||||||
|
OPP_HAS_NO_VALID_SQUADS_ID
|
||||||
|
Shutdown
|
||||||
|
ClearSavedOpponentData
|
||||||
|
SQUAD_ID
|
||||||
|
UUID_UPPER
|
||||||
|
UUID_LOWER
|
||||||
|
UIFActionList
|
||||||
|
ACTION_SAVE_OPPONENT_DATA
|
||||||
|
SendActionObj
|
||||||
|
Publish
|
||||||
|
futSelectTeam::Publish()
|
||||||
|
header
|
||||||
|
USER_CLUB_DATA
|
||||||
|
SetUserClubData
|
||||||
|
initVersusFUTComponents
|
||||||
|
OPPONENT_CLUBS
|
||||||
|
m_arrOpponentClubs
|
||||||
|
data
|
||||||
|
MATCH_CREATED
|
||||||
|
FUT_PAFC_GAME
|
||||||
|
GetCurrentCountryIndex
|
||||||
|
SQUADS
|
||||||
|
GetCurrentLeagueIndex
|
||||||
|
ACTION_ADVANCE
|
||||||
|
SendAction
|
||||||
|
eSoundEvent
|
||||||
|
PRIMARY_SELECT
|
||||||
|
playSound
|
||||||
|
m_bShouldWaitForPublish
|
||||||
|
OPP_SQUADS_LIST
|
||||||
|
SetOpponentSquadListData
|
||||||
|
SQUAD_LINEUP_LOADED
|
||||||
|
IS_USER
|
||||||
|
SetSquadLineup
|
||||||
|
KITS_AVAILABLE
|
||||||
|
LENGTH
|
||||||
|
KIT_
|
||||||
|
push
|
||||||
|
futSelectTeam::InitializeKitConfig()
|
||||||
|
SetupTeamsInfo
|
||||||
|
GetHomeTeamId
|
||||||
|
ACTION_MATCHDAY_HOME_TEAM_CHANGE
|
||||||
|
GetAwayTeamId
|
||||||
|
ACTION_MATCHDAY_AWAY_TEAM_CHANGE
|
||||||
|
ACTION_MATCHDAY_ADVANCE_KIT_SETUP
|
||||||
|
SetReadyStatus
|
||||||
|
FadeOut
|
||||||
|
GetKitArrayForFUT
|
||||||
|
HOME_KIT_ID
|
||||||
|
AWAY_KIT_ID
|
||||||
|
ION_Uniform
|
||||||
|
IsKitSelectCreated
|
||||||
|
EnterKitSelect
|
||||||
|
IsAlternatingMode
|
||||||
|
GetUnhighlightedSide
|
||||||
|
SetKitUnReady
|
||||||
|
InitializeKitsFromArray
|
||||||
|
Unhighlight
|
||||||
|
SetDisabled
|
||||||
|
SetHighlightedSide
|
||||||
|
GetHighlightedSide
|
||||||
|
Highlight
|
||||||
|
futSelectTeam::InitializeTeamConfig()
|
||||||
|
LEAGUE_ID
|
||||||
|
components
|
||||||
|
TeamSetupControl
|
||||||
|
TEAM_TOGGLE
|
||||||
|
GetUserSideForFUT
|
||||||
|
m_isInFUT
|
||||||
|
InitData
|
||||||
|
GetToggleValue
|
||||||
|
UpdateTeamInfo
|
||||||
|
m_bOpponentTeamInvalid
|
||||||
|
m_OppHasSquads
|
||||||
|
SetChemistryValue
|
||||||
|
ResetTeamInfo
|
||||||
|
FadeIn
|
||||||
|
SetupMouseSupport
|
||||||
|
SetWomenTeamsOnlyFilter
|
||||||
|
SetMenTeamsOnlyFilter
|
||||||
|
DeactivateReady
|
||||||
|
futSelectTeam::SetupTeamsInfo()
|
||||||
|
USER_TEAM_ID
|
||||||
|
ION_GameSetup
|
||||||
|
GetTeam
|
||||||
|
SetHomeTeamId
|
||||||
|
SetAwayTeamId
|
||||||
|
setCustomSelectionArray
|
||||||
|
Team
|
||||||
|
eAttribute
|
||||||
|
ION_Team
|
||||||
|
GetAttributes
|
||||||
|
futSelectTeam::LocalEventHandler()
|
||||||
|
WARNING: Preventing the user to move until a Publish occurs.
|
||||||
|
IsInTransition
|
||||||
|
Stop spamming buttons, the team select screen is in a transition.
|
||||||
|
GetUserControllerSide
|
||||||
|
GetScreenState
|
||||||
|
DataProviders
|
||||||
|
STATE_TEAM
|
||||||
|
InputCodes
|
||||||
|
LEFT
|
||||||
|
RIGHT
|
||||||
|
GetReadyStatus
|
||||||
|
DOWN
|
||||||
|
BACK
|
||||||
|
ADVANCE
|
||||||
|
OPTION_TOP
|
||||||
|
OPTION_LEFT
|
||||||
|
IsSwitchSidesActive
|
||||||
|
STATE_KIT
|
||||||
|
SetUniform
|
||||||
|
ExitKitSelect
|
||||||
|
RemoveKitLocks
|
||||||
|
ACTION_BACKOUT
|
||||||
|
CANCEL
|
||||||
|
SetKit
|
||||||
|
SaveKitsForMatch
|
||||||
|
FUT_TOTW_GAME
|
||||||
|
SetGoingToKickoffHub
|
||||||
|
SetHomeKitId
|
||||||
|
SetAwayKitId
|
||||||
|
GetHomeKitId
|
||||||
|
GetAwayKitId
|
||||||
|
ACTION_CREATE_MATCH
|
||||||
|
SetReady
|
||||||
|
SetKitReady
|
||||||
|
FUT_OPP_HAS_NO_VALID_SQUADS
|
||||||
|
PopupData
|
||||||
|
Okay_abbr2
|
||||||
|
AddButton
|
||||||
|
ShowPopup
|
||||||
|
ValidateFullLineUp
|
||||||
|
m_sInjuryOrSuspendedWarning
|
||||||
|
m_bConceptPlayersInSquad
|
||||||
|
FUT_DB_Players_Not_Playable
|
||||||
|
FUT_TOTW_BELOW_MIN_PLAYERS
|
||||||
|
FUT_BELOW_MIN_PLAYERS
|
||||||
|
FUT_OPP_BELOW_MIN_PLAYERS
|
||||||
|
COUNTRY_TOGGLE
|
||||||
|
LEAGUE_TOGGLE
|
||||||
|
ACTION_GET_USER_SQUAD_LINEUP
|
||||||
|
ACTION_GET_OPPONENT_SQUAD_LINEUP
|
||||||
|
GoToViewSquad
|
||||||
|
PlatformManager
|
||||||
|
IsMicrosoft
|
||||||
|
USER_NAME
|
||||||
|
length
|
||||||
|
gEaso
|
||||||
|
showGamercard
|
||||||
|
getHelpContext
|
||||||
|
futSelectTeam::getHelpContext()
|
||||||
|
STATE_INVALID
|
||||||
|
FUT_VIEW_SQUAD_HOME
|
||||||
|
ltxt
|
||||||
|
manager
|
||||||
|
HelpItem
|
||||||
|
CreateHelpItem
|
||||||
|
FUT_VIEW_SQUAD_AWAY
|
||||||
|
ViewGamerCard
|
||||||
|
CreateHelpTickerItem
|
||||||
|
futSelectTeam::InitializeKitsFromArray()
|
||||||
|
GetAllAttributes
|
||||||
|
TYPE_UPPER
|
||||||
|
ITEM_NAME
|
||||||
|
ITEM_ID
|
||||||
|
ASSET_ID
|
||||||
|
StyleManager
|
||||||
|
FONT_TILE_HS
|
||||||
|
SetTitleTextFormat
|
||||||
|
SetToggleOffset
|
||||||
|
globalComponents
|
||||||
|
BasePanel
|
||||||
|
STYLE_FIFTEEN
|
||||||
|
SetBasePanelStyle
|
||||||
|
KIT_SCALE
|
||||||
|
kits
|
||||||
|
ToggleWithImage
|
||||||
|
STYLE_TOGGLE
|
||||||
|
SetStrokeVisibility
|
||||||
|
CheckIsKitLocked
|
||||||
|
futSelectTeam::GetKitArrayForFUT()
|
||||||
|
GetNonConflictingUniformID
|
||||||
|
eSortType
|
||||||
|
SORT_ASCENDING
|
||||||
|
Uniform
|
||||||
|
eSortColumn
|
||||||
|
SORT_NONE
|
||||||
|
eFilter
|
||||||
|
FILTER_UNFILTERED
|
||||||
|
GetIDs
|
||||||
|
LOCKED
|
||||||
|
NAME
|
||||||
|
shift
|
||||||
|
futSelectTeam::initVersusFUTComponents()
|
||||||
|
text
|
||||||
|
Versus_abbr
|
||||||
|
_height
|
||||||
|
FUT_Tournament
|
||||||
|
GetOfflineActiveTournamentId
|
||||||
|
GetOfflineTournamentInfo
|
||||||
|
TROPHY_ID
|
||||||
|
trophy
|
||||||
|
getArtAssetPath
|
||||||
|
SCALE_ASPECT_CENTER
|
||||||
|
setScaling
|
||||||
|
setSize
|
||||||
|
setImage
|
||||||
|
FUT_UC_TOURNAMENT_BONUS
|
||||||
|
PRIZE_FINAL
|
||||||
|
ION_Localization
|
||||||
|
LocalizeInteger
|
||||||
|
_width
|
||||||
|
textWidth
|
||||||
|
FUT_COINS_OFFSET
|
||||||
|
futSelectTeam::GoToViewSquad()
|
||||||
|
isUserTeam
|
||||||
|
CLUB_NAME
|
||||||
|
BADGE_TEAM_ID
|
||||||
|
SQUAD_NAME
|
||||||
|
RATING
|
||||||
|
SQUAD_RATING
|
||||||
|
CHEMISTRY
|
||||||
|
SQUAD_CHEMISTRY
|
||||||
|
SHOW_CHEM_LINE
|
||||||
|
SCREEN
|
||||||
|
VIEW_SQUADS
|
||||||
|
setContextDataObject
|
||||||
|
loadOverlayScreen
|
||||||
|
futSelectTeam::SetUserClubData()
|
||||||
|
m_arrUserClubs
|
||||||
|
PUBLIC
|
||||||
|
CLUB_ABBR
|
||||||
|
EST_DATE
|
||||||
|
ACTIVE_SQUAD_ID
|
||||||
|
SIDE_NAME
|
||||||
|
Away_Side
|
||||||
|
Home_Side
|
||||||
|
futSelectTeam::SetOpponentSquadListData()
|
||||||
|
split
|
||||||
|
FUT_NO_VALID_SQUADS
|
||||||
|
futSelectTeam::SetSquadLineup()
|
||||||
|
SetTeam
|
||||||
|
futSelectTeam::GetCurrentCountryIndex()
|
||||||
|
futSelectTeam::GetCurrentLeagueIndex()
|
||||||
|
futSelectTeam::GetUserSideForFUT()
|
||||||
|
bIsDemo
|
||||||
|
GetLockRules
|
||||||
|
SIDE_LOCK
|
||||||
|
futSelectTeam::ValidateFullLineUp()
|
||||||
|
FUT_SquadManagement
|
||||||
|
GetOpponentSquadLineup
|
||||||
|
GetSquadLineup
|
||||||
|
FUT_NUM_PLAYERS_IN_SQUAD
|
||||||
|
CARD_ID
|
||||||
|
ION_Card
|
||||||
|
GetPlayerCardInfo
|
||||||
|
IS_DREAM_PLAYER
|
||||||
|
FUT_NUM_PLAYERS_IN_SQUAD_EXTENDED
|
||||||
|
gFutHelpers
|
||||||
|
GetInjuryOrSuspendedSquadWarning
|
||||||
|
futSelectTeam::SaveKitsForMatch()
|
||||||
|
SIDE
|
||||||
|
NUM_KITS
|
||||||
|
ACTION_SAVE_MATCH_KIT
|
||||||
|
FUT_TOURNAMENT_CUP_SCALE
|
||||||
|
INJURY_OR_SUSPENDED_POPUP
|
||||||
|
TOTW_NUM_PLAYERS_BELOW_MIN_POPUP
|
||||||
|
USER_NUM_PLAYERS_BELOW_MIN_POPUP
|
||||||
|
OPP_NUM_PLAYERS_BELOW_MIN_POPUP
|
||||||
|
OPP_HAS_NO_VALID_SQUADS
|
||||||
|
SCALE_NONE
|
||||||
|
SCALE_ASPECT
|
||||||
|
SCALE_ABSOLUTE
|
||||||
|
ASSetPropFlags
|
||||||
|
HelpProperties
|
||||||
|
mXPos
|
||||||
|
GetXPos
|
||||||
|
SetXPos
|
||||||
|
registerClass
|
||||||
|
hj\W
|
||||||
|
hj/U
|
||||||
|
UUUV
|
||||||
|
'Z`XV
|
||||||
|
j`XVW
|
||||||
|
b$9^
|
||||||
|
UW^}
|
||||||
|
hb>x
|
||||||
|
DA__\X
|
||||||
|
UWW^
|
||||||
|
HbCA
|
||||||
|
hjCA/
|
||||||
|
+{dA
|
||||||
|
b#9X7*
|
||||||
|
I^^|x
|
||||||
|
(Z``pP
|
||||||
|
Zxp`
|
||||||
|
\j~X
|
||||||
|
&j\xp
|
||||||
|
jXXXX
|
||||||
|
Fn%Vb=
|
||||||
|
xxxp
|
||||||
|
xh``
|
||||||
|
WWWW
|
||||||
|
r\XXX
|
||||||
|
xxz_
|
||||||
|
{XPpr
|
||||||
|
Hb__^\
|
||||||
|
`x|x
|
||||||
|
``xX
|
||||||
|
]{jp
|
||||||
|
xxhh
|
||||||
|
X\\\
|
||||||
|
U\T_
|
||||||
|
`pz~
|
||||||
|
_^^^
|
||||||
|
cq,6
|
||||||
|
-/+*+
|
||||||
|
jjjj
|
||||||
|
jJJj
|
||||||
|
_^Xp
|
||||||
|
WV\p
|
||||||
|
TTWU
|
||||||
|
```h
|
||||||
|
pWUU
|
||||||
|
\UUU
|
||||||
|
$I">
|
||||||
|
x^UU
|
||||||
|
/UUU
|
||||||
|
$IR`m
|
||||||
|
$IL#
|
||||||
|
cAxW
|
||||||
|
dI/U
|
||||||
|
&b%W
|
||||||
|
|UWV\
|
||||||
|
j_uyQ
|
||||||
|
|UUVT
|
||||||
|
|WT\\
|
||||||
|
j`ppp
|
||||||
|
|\\\\
|
||||||
|
bpppp
|
||||||
|
)---
|
||||||
|
||x||
|
||||||
|
bzzzz
|
||||||
|
s"#)5
|
||||||
|
K{&R
|
||||||
|
D(tFR```
|
||||||
|
j5555
|
||||||
|
){zxh`
|
||||||
|
hlUU_`
|
||||||
|
$Ithd
|
||||||
|
Ithd
|
||||||
|
hlUWVT
|
||||||
|
s(ljj
|
||||||
|
HR{O
|
||||||
|
IBww
|
||||||
|
@Bbb
|
||||||
|
Hl\\Xx
|
||||||
|
zzhh
|
||||||
|
@`pP
|
||||||
|
Htxxxx
|
||||||
|
hlHd
|
||||||
|
Ht%%%5
|
||||||
|
ZZ\\
|
||||||
|
H|xxxx
|
||||||
|
Hthd
|
||||||
|
xxxX
|
||||||
|
TV_]
|
||||||
|
H|hd
|
||||||
|
Xxx`
|
||||||
|
_\|p
|
||||||
|
pppP
|
||||||
|
H|xxxz
|
||||||
|
i|%%%5
|
||||||
|
pX\T
|
||||||
|
H|xzzz
|
||||||
|
(dHt
|
||||||
|
H|`xz_
|
||||||
|
UU^p
|
||||||
|
$G|(t
|
||||||
|
G|(t
|
||||||
|
(tG\
|
||||||
|
VTTT
|
||||||
|
kUUU5
|
||||||
|
(pXxx
|
||||||
|
XXXX
|
||||||
|
KOKK
|
||||||
|
'cUU^
|
||||||
|
hs'c
|
||||||
|
$Gk(c
|
||||||
|
Gk(c
|
||||||
|
~ZZX
|
||||||
|
GkUWx
|
||||||
|
GkUUU\
|
||||||
|
'Gk(c
|
||||||
|
p``H
|
||||||
|
zUU~
|
||||||
|
X`pxZ
|
||||||
|
sUWx
|
||||||
|
c```
|
||||||
|
@@@@
|
||||||
|
WVT\
|
||||||
|
Vw~U
|
||||||
|
_^_j
|
||||||
|
\XPp
|
||||||
|
^|~^
|
||||||
|
c``pX\
|
||||||
|
````
|
||||||
|
UUUU
|
||||||
|
\\\\
|
||||||
|
????
|
||||||
|
p~UU
|
||||||
|
Ib'b
|
||||||
|
X\WU
|
||||||
|
A*++
|
||||||
|
UUUX
|
||||||
|
VWUU
|
||||||
|
z^VW
|
||||||
|
W^x
|
||||||
|
\\\\j
|
||||||
|
TWVV
|
||||||
|
\^xx
|
||||||
|
W^~
|
||||||
|
VWVt
|
||||||
|
cI^xxp
|
||||||
|
k$)WWVT
|
||||||
|
)W_VT
|
||||||
|
$1VTVT
|
||||||
|
(\\\\
|
||||||
|
\\\\"
|
||||||
|
$1\\XX
|
||||||
|
pr`z
|
||||||
|
AXPp`
|
||||||
|
yU^r^
|
||||||
|
$I2,r
|
||||||
|
PZrC
|
||||||
|
U{Bz
|
||||||
|
{||Z
|
||||||
|
kkki
|
||||||
|
c`p^
|
||||||
|
cx6l
|
||||||
|
\\\\]
|
||||||
|
dIb`@@
|
||||||
|
pvv]
|
||||||
|
'z@@
|
||||||
|
XVUU
|
||||||
|
e9`p
|
||||||
|
UVVV
|
||||||
|
(.-5
|
||||||
|
JJJJ
|
||||||
|
cQxxx
|
||||||
|
(%-)+
|
||||||
|
VVVV
|
||||||
|
#9ZZxx
|
||||||
|
i-)-
|
||||||
|
1U_|
|
||||||
|
#9=*
|
||||||
|
VVTT
|
||||||
|
T\\X
|
||||||
|
X^__
|
||||||
|
5-)+
|
||||||
|
$I"'r
|
||||||
|
rrbJ
|
||||||
|
8)-%5
|
||||||
|
ZZZZ
|
||||||
|
jjjk
|
||||||
|
1^UUU
|
||||||
|
g1G)^
|
||||||
|
!XX\V
|
||||||
|
BIGF0
|
||||||
|
Apt Data:1:5:8
|
||||||
|
U555
|
||||||
|
Urpp
|
||||||
|
~B'j
|
||||||
|
5555
|
||||||
|
m*((
|
||||||
|
;RRRR
|
||||||
|
m***
|
||||||
|
:RRRR
|
||||||
|
`15555
|
||||||
|
sZPPP
|
||||||
|
`95555
|
||||||
|
Apppp
|
||||||
|
95555
|
||||||
|
{PPPR
|
||||||
|
RRRR
|
||||||
|
rrp_
|
||||||
|
&j2'
|
||||||
|
pppp
|
||||||
|
Ns%!U
|
||||||
|
%)%%%%
|
||||||
|
f)%!
|
||||||
|
` 6dC.kE!
|
||||||
|
Z%)70
|
||||||
|
1E!W
|
||||||
|
1E!U
|
||||||
|
f1E!
|
||||||
|
F1Xp*
|
||||||
|
9f)U
|
||||||
|
xUU\
|
||||||
|
JV~No
|
||||||
|
(n{$!
|
||||||
|
iJPPpp
|
||||||
|
<W\^
|
||||||
|
AqUW
|
||||||
|
{Cq_
|
||||||
|
U]P\
|
||||||
|
Pppp
|
||||||
|
TTTT
|
||||||
|
PPPp
|
||||||
|
,(;k
|
||||||
|
z^\x
|
||||||
|
\^VT
|
||||||
|
???/
|
||||||
|
btTVV
|
||||||
|
M{-/75
|
||||||
|
x~_^
|
||||||
|
TUWW
|
||||||
|
%555
|
||||||
|
(^xp`
|
||||||
|
UUWV
|
||||||
|
jR\T\\
|
||||||
|
1xp``
|
||||||
|
b\\\X
|
||||||
|
b557/
|
||||||
|
jZ'5
|
||||||
|
WWWh
|
||||||
|
^XPZ
|
||||||
|
zxxxx
|
||||||
|
1UWVT
|
||||||
|
h4Vb%
|
||||||
|
\^U?
|
||||||
|
\\\X
|
||||||
|
I*.$
|
||||||
|
Hb'A
|
||||||
|
9UU\
|
||||||
|
i--+
|
||||||
|
Wka@
|
||||||
|
P|WWW
|
||||||
|
UW^x
|
||||||
|
@PW^
|
||||||
|
czXX
|
||||||
|
++-5
|
||||||
|
`x@p
|
||||||
|
brp`
|
||||||
|
U%%%
|
||||||
|
\VUW
|
||||||
|
XPXX
|
||||||
|
WTTV
|
||||||
|
PPXX
|
||||||
|
zc9~^z
|
||||||
|
I"1-+
|
||||||
|
!*+*
|
||||||
|
TTVT
|
||||||
|
----Y
|
||||||
|
73 &
|
||||||
|
Av|z
|
||||||
|
`^UJ
|
||||||
|
xx~p
|
||||||
|
&jB1_
|
||||||
|
Y444$
|
||||||
|
xWU0
|
||||||
|
$_nO
|
||||||
|
G1BBBB
|
||||||
|
xxx^
|
||||||
|
xxz~
|
||||||
|
---=
|
||||||
|
***J
|
||||||
|
O"'@
|
||||||
|
7 '>
|
||||||
|
U`X\Y
|
||||||
|
h035^
|
||||||
|
Lw!f
|
||||||
|
&T@a
|
||||||
|
]8RR
|
||||||
|
[OAq
|
||||||
|
D/Oz%F
|
||||||
|
+1.^-
|
||||||
|
_,_Y
|
||||||
|
..^O
|
||||||
|
CG|!@
|
||||||
|
;}>|
|
||||||
|
nHT*
|
||||||
|
a8Nj
|
||||||
|
?'Un70
|
||||||
|
^[zM2Bj @
|
||||||
|
6nd[N
|
||||||
|
Z)MBc
|
||||||
|
wY=A
|
||||||
|
8p(a
|
||||||
|
:m"D
|
||||||
|
[dbt
|
||||||
|
E'0S
|
||||||
|
nT+bJuZ
|
||||||
|
V-:t
|
||||||
|
v)(n
|
||||||
|
(*s?p
|
||||||
|
cc?r
|
||||||
|
B%{r
|
||||||
|
-4Yi
|
||||||
|
sci,Iy
|
||||||
|
|3;=
|
||||||
|
<KB6
|
||||||
|
cCFVJ
|
||||||
|
J|jg
|
||||||
|
4VvVV6
|
||||||
|
p$$e&
|
||||||
|
4%1{
|
||||||
|
~%ew==_.
|
||||||
|
EFGFFED
|
||||||
|
[FFB}9
|
||||||
|
$"dOz%^-
|
||||||
|
mw77
|
||||||
|
ct3r
|
||||||
|
ecGB
|
||||||
|
*\JV
|
||||||
|
c&WV
|
||||||
|
w6GMq
|
||||||
|
13aB
|
||||||
|
$X~_
|
||||||
|
mMx%
|
||||||
|
;11sZR
|
||||||
|
'&'n
|
||||||
|
q&##>o
|
||||||
|
+:Z/Y
|
||||||
|
]:AY
|
||||||
|
$(+~
|
||||||
|
,^:(,
|
||||||
|
kp>C
|
||||||
|
luqYql
|
||||||
|
wf_q
|
||||||
|
XYX\
|
||||||
|
@p77
|
||||||
|
--X&q
|
||||||
|
{ cf
|
||||||
|
waF,
|
||||||
|
znrn;
|
||||||
|
VRwCE
|
||||||
|
5=#&
|
||||||
|
/J"}
|
||||||
|
_A4Z
|
||||||
|
gnB7%
|
||||||
|
q`Y
|
||||||
|
Q|!+
|
||||||
|
[MMA
|
||||||
|
**rV
|
||||||
|
)~U(w*,)m
|
||||||
|
Z*SVd
|
||||||
|
$#&qi
|
||||||
|
qmUW=
|
||||||
|
F"MN
|
||||||
|
HaA%e%
|
||||||
|
(T!]5(\
|
||||||
|
IK#k
|
||||||
|
v wQ
|
||||||
|
C(\M
|
||||||
|
];%P
|
||||||
|
7f&=kJ
|
||||||
|
%(oRtK
|
||||||
|
gRr?
|
||||||
|
+rq_
|
||||||
|
/==7
|
||||||
|
,IUk
|
||||||
|
D?t(zC,
|
||||||
|
\}oe
|
||||||
|
'^YY
|
||||||
|
nwzu
|
||||||
|
jdf,
|
||||||
|
i5hFc
|
||||||
|
z@xOrFp
|
||||||
|
aqgv
|
||||||
|
y^oT+
|
||||||
|
dZ13
|
||||||
|
d{g~
|
||||||
|
ttzi
|
||||||
|
p,@B
|
||||||
|
upqH
|
||||||
|
1{pl0
|
||||||
|
J4)~
|
||||||
|
&W<;@
|
||||||
|
p77Es
|
||||||
|
:aPw
|
||||||
|
`>(^&
|
||||||
|
lnW|
|
||||||
|
~+w8
|
||||||
Executable
+86
@@ -0,0 +1,86 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
"""Find an APT/ActionScript symbol inside the FIFA 17 Frostbite .cas archives.
|
||||||
|
|
||||||
|
Frosty is a GUI-only tool and its Legacy Explorer is the documented way to reach
|
||||||
|
these assets, but the chunks holding APT ActionScript are stored plainly enough to
|
||||||
|
grep — so a screen can be identified, and its whole symbol table recovered,
|
||||||
|
without driving the GUI at all.
|
||||||
|
|
||||||
|
ALWAYS passes a control first: `KitAssignmentPopup` is a string from an
|
||||||
|
already-exported BIG, so if it misses, the archives are packed differently than
|
||||||
|
assumed and no negative from this tool may be quoted.
|
||||||
|
|
||||||
|
python3 find_apt_in_cas.py FUT_GET_MATCH_KITS_DP
|
||||||
|
python3 find_apt_in_cas.py --dump 0x3707ecd7 fifa_installpackage_01/cas_01.cas
|
||||||
|
"""
|
||||||
|
import argparse
|
||||||
|
import glob
|
||||||
|
import os
|
||||||
|
import re
|
||||||
|
import sys
|
||||||
|
|
||||||
|
ROOT = "/mnt/games/FIFA 17"
|
||||||
|
CONTROL = b"KitAssignmentPopup"
|
||||||
|
|
||||||
|
|
||||||
|
def cas_files():
|
||||||
|
return sorted(glob.glob(os.path.join(ROOT, "**", "*.cas"), recursive=True))
|
||||||
|
|
||||||
|
|
||||||
|
def find(needle: bytes):
|
||||||
|
control_total = 0
|
||||||
|
hits = []
|
||||||
|
for p in cas_files():
|
||||||
|
d = open(p, "rb").read()
|
||||||
|
control_total += d.count(CONTROL)
|
||||||
|
start = 0
|
||||||
|
while True:
|
||||||
|
i = d.find(needle, start)
|
||||||
|
if i < 0:
|
||||||
|
break
|
||||||
|
hits.append((p, i))
|
||||||
|
start = i + 1
|
||||||
|
return control_total, hits
|
||||||
|
|
||||||
|
|
||||||
|
def dump(path, off, span=90000):
|
||||||
|
with open(path, "rb") as f:
|
||||||
|
f.seek(max(0, off - span // 2))
|
||||||
|
d = f.read(span)
|
||||||
|
seen = []
|
||||||
|
for m in re.finditer(rb"[ -~]{4,}", d):
|
||||||
|
t = m.group().decode("latin1")
|
||||||
|
if t not in seen:
|
||||||
|
seen.append(t)
|
||||||
|
return seen
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
ap = argparse.ArgumentParser()
|
||||||
|
ap.add_argument("needle", nargs="?")
|
||||||
|
ap.add_argument("--dump", metavar="OFFSET")
|
||||||
|
ap.add_argument("--file")
|
||||||
|
args = ap.parse_args()
|
||||||
|
|
||||||
|
if args.dump:
|
||||||
|
path = args.file if os.path.isabs(args.file or "") else os.path.join(
|
||||||
|
ROOT, "Data/Win32/superbundlelayout", args.file or "")
|
||||||
|
for s in dump(path, int(args.dump, 0)):
|
||||||
|
print(s)
|
||||||
|
return 0
|
||||||
|
|
||||||
|
if not args.needle:
|
||||||
|
ap.error("needle required")
|
||||||
|
ctl, hits = find(args.needle.encode())
|
||||||
|
print(f"control {CONTROL.decode()}: {ctl} hit(s)")
|
||||||
|
if ctl == 0:
|
||||||
|
print("CONTROL FAILED — archives not greppable this way; no negative is valid.")
|
||||||
|
return 1
|
||||||
|
print(f"{args.needle}: {len(hits)} hit(s)")
|
||||||
|
for p, i in hits[:20]:
|
||||||
|
print(f" {os.path.relpath(p, ROOT)} @ {i:#x}")
|
||||||
|
return 0
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
sys.exit(main())
|
||||||
Reference in New Issue
Block a user