2022-10-02 05:13:41 +00:00
#!/usr/bin/env python3
import os
import io
import sys
import argparse
2022-10-07 04:39:17 +00:00
from shutil import which
2022-10-02 05:13:41 +00:00
from tools import ninja_syntax
parser = argparse . ArgumentParser ( )
parser . add_argument ( ' --version ' , dest = ' version ' ,
default = ' 0 ' , help = ' version to build (0, 1, kor) ' )
2022-10-07 08:39:43 +00:00
parser . add_argument ( ' --map ' , dest = ' map ' , action = ' store_true ' ,
help = ' generate map file ' )
parser . add_argument ( ' --no-check ' , dest = ' check ' , action = ' store_false ' ,
help = ' don \' t check hash of resulting dol ' )
parser . add_argument ( ' --static-libs ' , dest = ' static_libs ' , action = ' store_true ' ,
help = ' build and use static libs ' )
2022-10-07 04:39:17 +00:00
parser . add_argument ( ' --devkitppc ' , dest = ' devkitppc ' , help = ' path to devkitPPC ' )
if os . name != " nt " and not " _NT- " in os . uname ( ) . sysname :
parser . add_argument ( ' --wine ' , dest = ' wine ' , help = ' path to wine (or wibo) ' )
2022-10-02 05:13:41 +00:00
args = parser . parse_args ( )
LIBS = [
{
" lib " : " TRK_MINNOW_DOLPHIN " ,
" mwcc_version " : " 1.2.5 " ,
" cflags " : " $cflags_base " ,
2022-10-09 23:48:42 +00:00
" objects " : [
[ " MetroTRK/mslsupp " , True ] ,
] ,
2022-10-02 05:13:41 +00:00
} ,
{
2022-10-05 01:31:43 +00:00
" lib " : " MetroidPrimeCW " ,
2022-10-02 05:13:41 +00:00
" cflags " : " $cflags_retro " ,
" mwcc_version " : " 1.3.2 " ,
" objects " : [
" MetroidPrime/main " ,
" MetroidPrime/IRenderer " ,
" MetroidPrime/Cameras/CCameraManager " ,
" MetroidPrime/CControlMapper " ,
" MetroidPrime/Cameras/CFirstPersonCamera " ,
2022-10-14 04:50:56 +00:00
[ " MetroidPrime/CObjectList " , True ] ,
2022-10-02 05:13:41 +00:00
" MetroidPrime/Player/CPlayer " ,
2022-10-09 23:48:42 +00:00
[ " MetroidPrime/CAxisAngle " , True ] ,
2022-10-02 05:13:41 +00:00
" MetroidPrime/CEulerAngles " ,
2022-10-09 23:48:42 +00:00
[ " MetroidPrime/CArchMsgParmUserInput " , True ] ,
2022-10-02 05:13:41 +00:00
" MetroidPrime/CFrontEndUI " ,
" MetroidPrime/CInputGenerator " ,
" MetroidPrime/CMainFlow " ,
" MetroidPrime/CMFGame " ,
" MetroidPrime/CCredits " ,
" MetroidPrime/CSplashScreen " ,
" MetroidPrime/CInstruction " ,
" MetroidPrime/CAnimData " ,
" MetroidPrime/Factories/CCharacterFactory " ,
" MetroidPrime/Factories/CAssetFactory " ,
" MetroidPrime/Tweaks/CTweakPlayer " ,
" MetroidPrime/Tweaks/CTweaks " ,
" MetroidPrime/Tweaks/CTweakGame " ,
" MetroidPrime/CGameProjectile " ,
" MetroidPrime/Player/CPlayerGun " ,
" MetroidPrime/CStateManager " ,
2022-10-09 23:48:42 +00:00
[ " MetroidPrime/CEntity " , True ] ,
[ " MetroidPrime/CArchMsgParmInt32 " , True ] ,
[ " MetroidPrime/CArchMsgParmInt32Int32VoidPtr " , True ] ,
[ " MetroidPrime/CArchMsgParmNull " , True ] ,
[ " MetroidPrime/CArchMsgParmReal32 " , True ] ,
2022-10-14 07:45:18 +00:00
[ " MetroidPrime/Decode " , False ] ,
2022-10-02 05:13:41 +00:00
" MetroidPrime/CIOWinManager " ,
2022-10-09 23:48:42 +00:00
[ " MetroidPrime/CIOWin " , True ] ,
2022-10-02 05:13:41 +00:00
" MetroidPrime/CActor " ,
" MetroidPrime/CWorld " ,
2022-10-14 10:01:20 +00:00
[ " MetroidPrime/Tweaks/CTweakParticle " , True ] ,
2022-10-02 05:13:41 +00:00
" MetroidPrime/Clamp_int " ,
2022-10-09 23:48:42 +00:00
[ " MetroidPrime/CArchMsgParmControllerStatus " , True ] ,
2022-10-02 05:13:41 +00:00
" MetroidPrime/CExplosion " ,
" MetroidPrime/CEffect " ,
" MetroidPrime/Cameras/CGameCamera " ,
" MetroidPrime/CGameArea " ,
" MetroidPrime/HUD/CSamusHud " ,
" MetroidPrime/CAnimationDatabaseGame " ,
" MetroidPrime/CTransitionDatabaseGame " ,
" MetroidPrime/Tweaks/CTweakPlayerControl " ,
" MetroidPrime/Tweaks/CTweakPlayerGun " ,
" MetroidPrime/CPauseScreen " ,
" MetroidPrime/Tweaks/CTweakGui " ,
" MetroidPrime/ScriptObjects/CScriptActor " ,
" MetroidPrime/ScriptObjects/CScriptTrigger " ,
" MetroidPrime/ScriptObjects/CScriptWaypoint " ,
" MetroidPrime/Enemies/CPatterned " ,
" MetroidPrime/ScriptObjects/CScriptDoor " ,
" MetroidPrime/Enemies/CStateMachine " ,
" MetroidPrime/CMapArea " ,
" MetroidPrime/Cameras/CBallCamera " ,
" MetroidPrime/ScriptObjects/CScriptEffect " ,
" MetroidPrime/Weapons/CBomb " ,
" MetroidPrime/Tweaks/CTweakBall " ,
" MetroidPrime/Player/CPlayerState " ,
" MetroidPrime/ScriptObjects/CScriptTimer " ,
" MetroidPrime/Cameras/CCinematicCamera " ,
" MetroidPrime/CAutoMapper " ,
" MetroidPrime/ScriptObjects/CScriptCounter " ,
" MetroidPrime/CMapWorld " ,
" MetroidPrime/Enemies/CAi " ,
" MetroidPrime/Enemies/PatternedCastTo " ,
2022-10-09 23:48:42 +00:00
[ " MetroidPrime/TCastTo " , True ] ,
2022-10-02 05:13:41 +00:00
" MetroidPrime/ScriptObjects/CScriptSound " ,
" MetroidPrime/ScriptObjects/CScriptPlatform " ,
2022-10-09 23:48:42 +00:00
[ " MetroidPrime/UserNames " , True ] ,
2022-10-02 05:13:41 +00:00
" MetroidPrime/ScriptObjects/CScriptGenerator " ,
" MetroidPrime/ScriptObjects/CScriptCameraWaypoint " ,
" MetroidPrime/CGameLight " ,
" MetroidPrime/Tweaks/CTweakTargeting " ,
" MetroidPrime/Tweaks/CTweakAutoMapper " ,
" MetroidPrime/CParticleGenInfoGeneric " ,
" MetroidPrime/CParticleGenInfo " ,
" MetroidPrime/CParticleDatabase " ,
" MetroidPrime/Tweaks/CTweakGunRes " ,
" MetroidPrime/CTargetReticles " ,
" MetroidPrime/CWeaponMgr " ,
2022-10-09 23:48:42 +00:00
[ " MetroidPrime/ScriptObjects/CScriptPickup " , True ] ,
2022-10-02 05:13:41 +00:00
" MetroidPrime/CDamageInfo " ,
2022-10-09 23:48:42 +00:00
[ " MetroidPrime/CMemoryDrawEnum " , True ] ,
2022-10-02 05:13:41 +00:00
" MetroidPrime/ScriptObjects/CScriptDock " ,
" MetroidPrime/ScriptObjects/CScriptCameraHint " ,
" MetroidPrime/ScriptLoader " ,
" MetroidPrime/CSamusDoll " ,
" MetroidPrime/Factories/CStateMachineFactory " ,
" MetroidPrime/Weapons/CPlasmaBeam " ,
" MetroidPrime/Weapons/CPowerBeam " ,
" MetroidPrime/Weapons/CWaveBeam " ,
" MetroidPrime/Weapons/CIceBeam " ,
" MetroidPrime/CScriptMailbox " ,
" MetroidPrime/ScriptObjects/CScriptRelay " ,
" MetroidPrime/ScriptObjects/CScriptSpawnPoint " ,
" MetroidPrime/ScriptObjects/CScriptRandomRelay " ,
" MetroidPrime/Enemies/CBeetle " ,
2022-10-09 23:48:42 +00:00
[ " MetroidPrime/HUD/CHUDMemoParms " , True ] ,
2022-10-02 05:13:41 +00:00
" MetroidPrime/ScriptObjects/CScriptHUDMemo " ,
" MetroidPrime/CMappableObject " ,
" MetroidPrime/Player/CPlayerCameraBob " ,
" MetroidPrime/ScriptObjects/CScriptCameraFilterKeyframe " ,
" MetroidPrime/ScriptObjects/CScriptCameraBlurKeyframe " ,
" MetroidPrime/Cameras/CCameraFilter " ,
" MetroidPrime/Player/CMorphBall " ,
" MetroidPrime/ScriptObjects/CScriptDamageableTrigger " ,
" MetroidPrime/ScriptObjects/CScriptDebris " ,
" MetroidPrime/ScriptObjects/CScriptCameraShaker " ,
" MetroidPrime/ScriptObjects/CScriptActorKeyframe " ,
" MetroidPrime/CConsoleOutputWindow " ,
" MetroidPrime/ScriptObjects/CScriptWater " ,
" MetroidPrime/Weapons/CWeapon " ,
" MetroidPrime/CDamageVulnerability " ,
" MetroidPrime/CActorLights " ,
2022-10-14 15:12:16 +00:00
[ " MetroidPrime/Enemies/CPatternedInfo " , True ] ,
2022-10-02 05:13:41 +00:00
" MetroidPrime/CSimpleShadow " ,
" MetroidPrime/CActorParameters " ,
" MetroidPrime/CInGameGuiManager " ,
" MetroidPrime/Enemies/CWarWasp " ,
" MetroidPrime/CWorldShadow " ,
2022-10-13 23:34:22 +00:00
[ " MetroidPrime/CAudioStateWin " , True ] ,
2022-10-02 05:13:41 +00:00
" MetroidPrime/Player/CPlayerVisor " ,
" MetroidPrime/CModelData " ,
" MetroidPrime/CDecalManager " ,
" MetroidPrime/ScriptObjects/CScriptSpiderBallWaypoint " ,
" MetroidPrime/Enemies/CBloodFlower " ,
2022-10-10 02:27:35 +00:00
[ " MetroidPrime/TGameTypes " , True ] ,
2022-10-02 05:13:41 +00:00
" MetroidPrime/CPhysicsActor " ,
2022-10-09 23:48:42 +00:00
[ " MetroidPrime/CPhysicsState " , True ] ,
2022-10-02 05:13:41 +00:00
" MetroidPrime/CRipple " ,
" MetroidPrime/CFluidUVMotion " ,
" MetroidPrime/CRippleManager " ,
" MetroidPrime/Player/CGrappleArm " ,
" MetroidPrime/Enemies/CSpacePirate " ,
" MetroidPrime/ScriptObjects/CScriptCoverPoint " ,
" MetroidPrime/Cameras/CPathCamera " ,
" MetroidPrime/CFluidPlane " ,
" MetroidPrime/CFluidPlaneManager " ,
" MetroidPrime/ScriptObjects/CScriptGrapplePoint " ,
" MetroidPrime/ScriptObjects/CHUDBillboardEffect " ,
" MetroidPrime/Enemies/CFlickerBat " ,
" MetroidPrime/BodyState/CBodyStateCmdMgr " ,
" MetroidPrime/BodyState/CBodyStateInfo " ,
" MetroidPrime/BodyState/CBSAttack " ,
" MetroidPrime/BodyState/CBSDie " ,
" MetroidPrime/BodyState/CBSFall " ,
" MetroidPrime/BodyState/CBSGetup " ,
" MetroidPrime/BodyState/CBSKnockBack " ,
" MetroidPrime/BodyState/CBSLieOnGround " ,
" MetroidPrime/BodyState/CBSLocomotion " ,
" MetroidPrime/BodyState/CBSStep " ,
" MetroidPrime/BodyState/CBSTurn " ,
" MetroidPrime/BodyState/CBodyController " ,
" MetroidPrime/BodyState/CBSLoopAttack " ,
" MetroidPrime/Weapons/CTargetableProjectile " ,
" MetroidPrime/BodyState/CBSLoopReaction " ,
" MetroidPrime/CSteeringBehaviors " ,
" MetroidPrime/BodyState/CBSGroundHit " ,
" MetroidPrime/Enemies/CChozoGhost " ,
" MetroidPrime/Enemies/CFireFlea " ,
" MetroidPrime/BodyState/CBSSlide " ,
" MetroidPrime/BodyState/CBSHurled " ,
" MetroidPrime/BodyState/CBSJump " ,
" MetroidPrime/BodyState/CBSGenerate " ,
" MetroidPrime/Enemies/CPuddleSpore " ,
" MetroidPrime/BodyState/CBSTaunt " ,
" MetroidPrime/CSortedLists " ,
2022-10-09 23:48:42 +00:00
[ " MetroidPrime/ScriptObjects/CScriptDebugCameraWaypoint " , True ] ,
2022-10-02 05:13:41 +00:00
" MetroidPrime/ScriptObjects/CScriptSpiderBallAttractionSurface " ,
" MetroidPrime/BodyState/CBSScripted " ,
" MetroidPrime/Enemies/CPuddleToadGamma " ,
" MetroidPrime/ScriptObjects/CScriptDistanceFog " ,
" MetroidPrime/BodyState/CBSProjectileAttack " ,
" MetroidPrime/Weapons/CPowerBomb " ,
" MetroidPrime/Enemies/CMetaree " ,
" MetroidPrime/ScriptObjects/CScriptDockAreaChange " ,
" MetroidPrime/ScriptObjects/CScriptSpecialFunction " ,
" MetroidPrime/ScriptObjects/CScriptActorRotate " ,
" MetroidPrime/Player/CFidget " ,
" MetroidPrime/Enemies/CSpankWeed " ,
" MetroidPrime/Enemies/CParasite " ,
" MetroidPrime/Player/CSamusFaceReflection " ,
" MetroidPrime/ScriptObjects/CScriptPlayerHint " ,
" MetroidPrime/Enemies/CRipper " ,
" MetroidPrime/Cameras/CCameraShakeData " ,
" MetroidPrime/ScriptObjects/CScriptPickupGenerator " ,
" MetroidPrime/ScriptObjects/CScriptPointOfInterest " ,
" MetroidPrime/Enemies/CDrone " ,
" MetroidPrime/CMapWorldInfo " ,
" MetroidPrime/Factories/CScannableObjectInfo " ,
" MetroidPrime/Enemies/CMetroid " ,
" MetroidPrime/Player/CScanDisplay " ,
" MetroidPrime/ScriptObjects/CScriptSteam " ,
" MetroidPrime/ScriptObjects/CScriptRipple " ,
" MetroidPrime/CBoneTracking " ,
" MetroidPrime/Player/CFaceplateDecoration " ,
" MetroidPrime/BodyState/CBSCover " ,
" MetroidPrime/ScriptObjects/CScriptBallTrigger " ,
" MetroidPrime/Weapons/CPlasmaProjectile " ,
" MetroidPrime/Player/CPlayerOrbit " ,
" MetroidPrime/CGameCollision " ,
2022-10-13 22:47:30 +00:00
[ " MetroidPrime/CBallFilter " , True ] ,
2022-10-02 05:13:41 +00:00
" MetroidPrime/CAABoxFilter " ,
" MetroidPrime/CGroundMovement " ,
" MetroidPrime/Enemies/CNewIntroBoss " ,
" MetroidPrime/Weapons/CPhazonBeam " ,
" MetroidPrime/ScriptObjects/CScriptTargetingPoint " ,
" MetroidPrime/BodyState/CBSWallHang " ,
" MetroidPrime/ScriptObjects/CScriptEMPulse " ,
" MetroidPrime/HUD/CHudDecoInterface " ,
" MetroidPrime/Weapons/CFlameThrower " ,
" MetroidPrime/Weapons/CBeamProjectile " ,
" MetroidPrime/CFluidPlaneCPU " ,
" MetroidPrime/CFluidPlaneDoor " ,
" MetroidPrime/ScriptObjects/CScriptRoomAcoustics " ,
" MetroidPrime/Enemies/CIceSheegoth " ,
" MetroidPrime/CCollisionActorManager " ,
" MetroidPrime/CCollisionActor " ,
" MetroidPrime/ScriptObjects/CScriptPlayerActor " ,
" MetroidPrime/Tweaks/CTweakPlayerRes " ,
" MetroidPrime/Enemies/CBurstFire " ,
" MetroidPrime/Enemies/CFlaahgra " ,
" MetroidPrime/Player/CPlayerEnergyDrain " ,
" MetroidPrime/CFlameWarp " ,
" MetroidPrime/Weapons/CIceImpact " ,
2022-10-14 05:58:49 +00:00
[ " MetroidPrime/GameObjectLists " , True ] ,
2022-10-02 05:13:41 +00:00
" MetroidPrime/Weapons/CAuxWeapon " ,
" MetroidPrime/Weapons/CGunWeapon " ,
" MetroidPrime/ScriptObjects/CScriptAreaAttributes " ,
" MetroidPrime/Weapons/CWaveBuster " ,
" MetroidPrime/Player/CStaticInterference " ,
" MetroidPrime/Enemies/CMetroidBeta " ,
" MetroidPrime/PathFinding/CPathFindSearch " ,
" MetroidPrime/PathFinding/CPathFindRegion " ,
" MetroidPrime/PathFinding/CPathFindArea " ,
" MetroidPrime/Weapons/GunController/CGunController " ,
" MetroidPrime/Weapons/GunController/CGSFreeLook " ,
" MetroidPrime/Weapons/GunController/CGSComboFire " ,
" MetroidPrime/HUD/CHudBallInterface " ,
" MetroidPrime/Tweaks/CTweakGuiColors " ,
" MetroidPrime/ScriptObjects/CFishCloud " ,
2022-10-13 22:37:09 +00:00
[ " MetroidPrime/CHealthInfo " , True ] ,
2022-10-02 05:13:41 +00:00
" MetroidPrime/Player/CGameState " ,
" MetroidPrime/ScriptObjects/CScriptVisorFlare " ,
" MetroidPrime/ScriptObjects/CScriptWorldTeleporter " ,
" MetroidPrime/ScriptObjects/CScriptVisorGoo " ,
" MetroidPrime/Enemies/CJellyZap " ,
" MetroidPrime/ScriptObjects/CScriptControllerAction " ,
" MetroidPrime/Weapons/GunController/CGunMotion " ,
2022-10-09 23:48:42 +00:00
[ " MetroidPrime/ScriptObjects/CScriptSwitch " , True ] ,
2022-10-14 08:46:50 +00:00
[ " MetroidPrime/BodyState/CABSIdle " , True ] ,
2022-10-02 05:13:41 +00:00
" MetroidPrime/BodyState/CABSFlinch " ,
" MetroidPrime/BodyState/CABSAim " ,
" MetroidPrime/ScriptObjects/CScriptPlayerStateChange " ,
" MetroidPrime/Enemies/CThardus " ,
" MetroidPrime/CActorParticles " ,
" MetroidPrime/Enemies/CWallCrawlerSwarm " ,
" MetroidPrime/ScriptObjects/CScriptAiJumpPoint " ,
" MetroidPrime/CMessageScreen " ,
" MetroidPrime/Enemies/CFlaahgraTentacle " ,
" MetroidPrime/Weapons/GunController/CGSFidget " ,
" MetroidPrime/BodyState/CABSReaction " ,
" MetroidPrime/Weapons/CIceProjectile " ,
" MetroidPrime/Enemies/CFlyingPirate " ,
" MetroidPrime/ScriptObjects/CScriptColorModulate " ,
" MetroidPrime/CMapUniverse " ,
" MetroidPrime/Enemies/CThardusRockProjectile " ,
" MetroidPrime/CInventoryScreen " ,
" MetroidPrime/CVisorFlare " ,
" MetroidPrime/Enemies/CFlaahgraPlants " ,
" MetroidPrime/CWorldTransManager " ,
" MetroidPrime/ScriptObjects/CScriptMidi " ,
" MetroidPrime/ScriptObjects/CScriptStreamedAudio " ,
" MetroidPrime/CRagDoll " ,
" MetroidPrime/Player/CGameOptions " ,
" MetroidPrime/ScriptObjects/CRepulsor " ,
" MetroidPrime/CEnvFxManager " ,
" MetroidPrime/Weapons/CEnergyProjectile " ,
" MetroidPrime/ScriptObjects/CScriptGunTurret " ,
" MetroidPrime/Weapons/CProjectileInfo " ,
" MetroidPrime/CInGameTweakManager " ,
" MetroidPrime/Enemies/CBabygoth " ,
" MetroidPrime/Enemies/CEyeBall " ,
" MetroidPrime/CIkChain " ,
" MetroidPrime/ScriptObjects/CScriptCameraPitchVolume " ,
" MetroidPrime/RumbleFxTable " ,
" MetroidPrime/Enemies/CElitePirate " ,
" MetroidPrime/CRumbleManager " ,
" MetroidPrime/Enemies/CBouncyGrenade " ,
" MetroidPrime/Enemies/CGrenadeLauncher " ,
" MetroidPrime/Weapons/CShockWave " ,
" MetroidPrime/Enemies/CRipperControlledPlatform " ,
" MetroidPrime/Enemies/CKnockBackController " ,
" MetroidPrime/Player/CWorldLayerState " ,
" MetroidPrime/Enemies/CMagdolite " ,
" MetroidPrime/Enemies/CTeamAiMgr " ,
" MetroidPrime/Enemies/CSnakeWeedSwarm " ,
" MetroidPrime/Cameras/CBallCameraFailsafeState " ,
" MetroidPrime/Enemies/CActorContraption " ,
" MetroidPrime/ScriptObjects/CScriptSpindleCamera " ,
2022-10-15 16:24:27 +00:00
[ " MetroidPrime/ScriptObjects/CScriptMemoryRelay " , True ] ,
2022-10-02 05:13:41 +00:00
" MetroidPrime/CPauseScreenFrame " ,
" MetroidPrime/Enemies/CAtomicAlpha " ,
" MetroidPrime/CLogBookScreen " ,
" MetroidPrime/CGBASupport " ,
" MetroidPrime/Player/CSaveWorld " ,
" MetroidPrime/ScriptObjects/CScriptCameraHintTrigger " ,
" MetroidPrime/Enemies/CAmbientAI " ,
" MetroidPrime/CMemoryCardDriver " ,
" MetroidPrime/CSaveGameScreen " ,
" MetroidPrime/Enemies/CAtomicBeta " ,
" MetroidPrime/Weapons/CElectricBeamProjectile " ,
" MetroidPrime/Enemies/CRidley " ,
" MetroidPrime/Enemies/CPuffer " ,
" MetroidPrime/ScriptObjects/CFire " ,
" MetroidPrime/CPauseScreenBlur " ,
" MetroidPrime/Enemies/CTryclops " ,
" MetroidPrime/Weapons/CNewFlameThrower " ,
" MetroidPrime/Cameras/CInterpolationCamera " ,
" MetroidPrime/Enemies/CSeedling " ,
" MetroidPrime/Player/CGameHintInfo " ,
" MetroidPrime/Enemies/CWallWalker " ,
" MetroidPrime/CErrorOutputWindow " ,
" MetroidPrime/CRainSplashGenerator " ,
" MetroidPrime/Factories/CSaveWorldFactory " ,
" MetroidPrime/CFluidPlaneRender " ,
" MetroidPrime/Enemies/CBurrower " ,
" MetroidPrime/Enemies/CMetroidPrimeExo " ,
" MetroidPrime/ScriptObjects/CScriptBeam " ,
" MetroidPrime/Enemies/CMetroidPrimeEssence " ,
" MetroidPrime/Enemies/CMetroidPrimeRelay " ,
" MetroidPrime/Player/CPlayerDynamics " ,
" MetroidPrime/ScriptObjects/CScriptMazeNode " ,
" MetroidPrime/Weapons/WeaponTypes " ,
" MetroidPrime/Enemies/COmegaPirate " ,
" MetroidPrime/Enemies/CPhazonPool " ,
" MetroidPrime/CNESEmulator " ,
" MetroidPrime/Enemies/CPhazonHealingNodule " ,
" MetroidPrime/Player/CMorphBallShadow " ,
" MetroidPrime/Player/CPlayerInputFilter " ,
" MetroidPrime/CSlideShow " ,
" MetroidPrime/Tweaks/CTweakSlideShow " ,
" MetroidPrime/CArtifactDoll " ,
" MetroidPrime/CProjectedShadow " ,
" MetroidPrime/CPreFrontEnd " ,
" MetroidPrime/CGameCubeDoll " ,
" MetroidPrime/ScriptObjects/CScriptProjectedShadow " ,
" MetroidPrime/ScriptObjects/CEnergyBall " ,
" MetroidPrime/Enemies/CMetroidPrimeProjectile " ,
" MetroidPrime/Enemies/SPositionHistory " ,
] ,
} ,
{
" lib " : " WorldFormatCW " ,
" mwcc_version " : " 1.3.2 " ,
" cflags " : " $cflags_retro " ,
" objects " : [
" WorldFormat/CAreaOctTree_Tests " ,
2022-10-09 23:48:42 +00:00
[ " WorldFormat/CCollisionSurface " , True ] ,
2022-10-02 05:13:41 +00:00
" WorldFormat/CMetroidModelInstance " ,
" WorldFormat/CAreaBspTree " ,
" WorldFormat/CAreaOctTree " ,
" WorldFormat/CMetroidAreaCollider " ,
" WorldFormat/CWorldLight " ,
" WorldFormat/COBBTree " ,
" WorldFormat/CCollidableOBBTree " ,
" WorldFormat/CCollidableOBBTreeGroup " ,
2022-10-13 16:00:49 +00:00
" WorldFormat/CPVSAreaSet " ,
2022-10-02 05:13:41 +00:00
" WorldFormat/CAreaRenderOctTree " ,
] ,
} ,
{
" lib " : " WeaponsCW " ,
" mwcc_version " : " 1.3.2 " ,
" cflags " : " $cflags_retro " ,
" objects " : [
" Weapons/CProjectileWeapon " ,
" Weapons/CProjectileWeaponDataFactory " ,
" Weapons/CCollisionResponseData " ,
2022-10-09 23:48:42 +00:00
[ " Weapons/IWeaponRenderer " , True ] ,
2022-10-02 05:13:41 +00:00
" Weapons/CDecalDataFactory " ,
" Weapons/CDecal " ,
" Weapons/CWeaponDescription " ,
" Weapons/CDecalDescription " ,
] ,
} ,
{
" lib " : " MetaRenderCW " ,
" mwcc_version " : " 1.3.2 " ,
" cflags " : " $cflags_retro " ,
" objects " : [ " MetaRender/CCubeRenderer " ] ,
} ,
{
" lib " : " GuiSysCW " ,
" mwcc_version " : " 1.3.2 " ,
" cflags " : " $cflags_retro " ,
" objects " : [
" GuiSys/CAuiMain " ,
" GuiSys/CAuiMeter " ,
" GuiSys/CGuiGroup " ,
" GuiSys/CGuiHeadWidget " ,
" GuiSys/CGuiLight " ,
" GuiSys/CGuiModel " ,
" GuiSys/CGuiObject " ,
" GuiSys/CGuiPane " ,
" GuiSys/CGuiSliderGroup " ,
" GuiSys/CGuiSys " ,
" GuiSys/CGuiTableGroup " ,
" GuiSys/CGuiTextPane " ,
" GuiSys/CGuiTextSupport " ,
" GuiSys/CGuiWidget " ,
" GuiSys/CGuiWidgetIdDB " ,
" GuiSys/CGuiWidgetDrawParms " ,
" GuiSys/CAuiEnergyBarT01 " ,
" GuiSys/CAuiImagePane " ,
" GuiSys/CRepeatState " ,
] ,
} ,
{
" lib " : " CollisionCW " ,
" mwcc_version " : " 1.3.2 " ,
" cflags " : " $cflags_retro " ,
" objects " : [
" Collision/CCollidableAABox " ,
" Collision/CCollidableCollisionSurface " ,
2022-10-09 23:48:42 +00:00
[ " Collision/CCollisionInfo " , True ] ,
2022-10-02 05:13:41 +00:00
" Collision/InternalColliders " ,
" Collision/CCollisionPrimitive " ,
2022-10-09 23:48:42 +00:00
[ " Collision/CMaterialList " , True ] ,
2022-10-02 05:13:41 +00:00
" Collision/CollisionUtil " ,
" Collision/CCollidableSphere " ,
2022-10-09 23:48:42 +00:00
[ " Collision/CMaterialFilter " , True ] ,
2022-10-02 05:13:41 +00:00
" Collision/COBBox " ,
2022-10-09 23:48:42 +00:00
[ " Collision/CMRay " , True ] ,
2022-10-02 05:13:41 +00:00
] ,
} ,
{
" lib " : " Kyoto_CW1 " ,
" mwcc_version " : " 1.3.2 " ,
" cflags " : " $cflags_retro " ,
" objects " : [
" Kyoto/Basics/CBasics " ,
2022-10-09 23:48:42 +00:00
[ " Kyoto/Basics/CStopwatch " , True ] ,
2022-10-02 05:13:41 +00:00
" Kyoto/Basics/CBasicsDolphin " ,
2022-10-14 15:46:40 +00:00
[ " Kyoto/Alloc/CCallStackDolphin " , True ] ,
2022-10-09 23:48:42 +00:00
[ " Kyoto/Basics/COsContextDolphin " , True ] ,
[ " Kyoto/Basics/CSWDataDolphin " , True ] ,
2022-10-02 05:13:41 +00:00
" Kyoto/Basics/RAssertDolphin " ,
" Kyoto/Animation/CAnimation " ,
" Kyoto/Animation/CAnimationManager " ,
" Kyoto/Animation/CAnimationSet " ,
" Kyoto/Animation/CAnimCharacterSet " ,
" Kyoto/Animation/CAnimTreeLoopIn " ,
" Kyoto/Animation/CAnimTreeSequence " ,
" Kyoto/Animation/CCharacterInfo " ,
" Kyoto/Animation/CCharacterSet " ,
" Kyoto/Animation/CMetaAnimBlend " ,
" Kyoto/Animation/CMetaAnimFactory " ,
" Kyoto/Animation/CMetaAnimPhaseBlend " ,
" Kyoto/Animation/CMetaAnimPlay " ,
" Kyoto/Animation/CMetaAnimRandom " ,
" Kyoto/Animation/CMetaAnimSequence " ,
" Kyoto/Animation/CMetaTransFactory " ,
" Kyoto/Animation/CMetaTransMetaAnim " ,
" Kyoto/Animation/CMetaTransPhaseTrans " ,
" Kyoto/Animation/CMetaTransSnap " ,
" Kyoto/Animation/CMetaTransTrans " ,
" Kyoto/Animation/CPASAnimInfo " ,
" Kyoto/Animation/CPASAnimParm " ,
" Kyoto/Animation/CPASAnimState " ,
" Kyoto/Animation/CPASDatabase " ,
" Kyoto/Animation/CPASParmInfo " ,
" Kyoto/Animation/CPrimitive " ,
" Kyoto/Animation/CSequenceHelper " ,
" Kyoto/Animation/CTransition " ,
" Kyoto/Animation/CTransitionManager " ,
" Kyoto/Animation/CTreeUtils " ,
" Kyoto/Animation/IMetaAnim " ,
2022-10-09 23:48:42 +00:00
[ " Kyoto/Audio/CSfxHandle " , True ] ,
2022-10-02 05:13:41 +00:00
" Kyoto/Audio/CSfxManager " ,
" Kyoto/Animation/CAdvancementDeltas " ,
" Kyoto/Animation/CAnimMathUtils " ,
" Kyoto/Animation/CAnimPOIData " ,
" Kyoto/Animation/CAnimSource " ,
" Kyoto/Animation/CAnimSourceReader " ,
" Kyoto/Animation/CAnimSourceReaderBase " ,
" Kyoto/Animation/CAnimTreeAnimReaderContainer " ,
" Kyoto/Animation/CAnimTreeBlend " ,
" Kyoto/Animation/CAnimTreeContinuousPhaseBlend " ,
" Kyoto/Animation/CAnimTreeDoubleChild " ,
" Kyoto/Animation/CAnimTreeNode " ,
" Kyoto/Animation/CAnimTreeSingleChild " ,
" Kyoto/Animation/CAnimTreeTimeScale " ,
" Kyoto/Animation/CAnimTreeTransition " ,
" Kyoto/Animation/CAnimTreeTweenBase " ,
" Kyoto/Animation/CBoolPOINode " ,
" Kyoto/Animation/CCharAnimMemoryMetrics " ,
" Kyoto/Animation/CCharLayoutInfo " ,
" Kyoto/Animation/CFBStreamedAnimReader " ,
" Kyoto/Animation/CFBStreamedCompression " ,
" Kyoto/Animation/CHierarchyPoseBuilder " ,
" Kyoto/Animation/CInt32POINode " ,
" Kyoto/Animation/CParticlePOINode " ,
" Kyoto/Animation/CPOINode " ,
" Kyoto/Animation/CSegStatementSet " ,
" Kyoto/Animation/CTimeScaleFunctions " ,
" Kyoto/Animation/IAnimReader " ,
" Kyoto/Animation/CAllFormatsAnimSource " ,
" Kyoto/CDvdRequest " ,
" Kyoto/Text/CColorInstruction " ,
" Kyoto/Text/CColorOverrideInstruction " ,
" Kyoto/Text/CDrawStringOptions " ,
" Kyoto/Text/CFontInstruction " ,
" Kyoto/Text/CFontRenderState " ,
" Kyoto/Text/CLineExtraSpaceInstruction " ,
" Kyoto/Text/CLineInstruction " ,
" Kyoto/Text/CLineSpacingInstruction " ,
" Kyoto/Text/CPopStateInstruction " ,
" Kyoto/Text/CPushStateInstruction " ,
" Kyoto/Text/CRasterFont " ,
" Kyoto/Text/CRemoveColorOverrideInstruction " ,
" Kyoto/Text/CSavableState " ,
" Kyoto/Text/CTextExecuteBuffer " ,
" Kyoto/Text/CTextInstruction " ,
" Kyoto/Text/CTextParser " ,
" Kyoto/Text/CWordBreakTables " ,
" Kyoto/Text/CWordInstruction " ,
" Kyoto/Text/CBlockInstruction " ,
" Kyoto/Text/CFont " ,
2022-10-09 23:48:42 +00:00
[ " Kyoto/Graphics/CLight " , True ] ,
2022-10-02 05:13:41 +00:00
" Kyoto/Graphics/CCubeModel " ,
2022-10-09 23:48:42 +00:00
[ " Kyoto/Graphics/CGX " , True ] ,
2022-10-02 05:13:41 +00:00
" Kyoto/Graphics/CTevCombiners " ,
" Kyoto/Graphics/DolphinCGraphics " ,
" Kyoto/Graphics/DolphinCPalette " ,
" Kyoto/Graphics/DolphinCTexture " ,
2022-10-09 23:48:42 +00:00
[ " Kyoto/Math/CloseEnough " , True ] ,
2022-10-02 05:13:41 +00:00
" Kyoto/Math/CMatrix3f " ,
" Kyoto/Math/CMatrix4f " ,
" Kyoto/Math/CQuaternion " ,
2022-10-09 23:48:42 +00:00
[ " Kyoto/CRandom16 " , True ] ,
2022-10-02 05:13:41 +00:00
" Kyoto/Math/CTransform4f " ,
2022-10-09 23:48:42 +00:00
[ " Kyoto/Math/CUnitVector3f " , True ] ,
[ " Kyoto/Math/CVector2f " , True ] ,
[ " Kyoto/Math/CVector2i " , True ] ,
[ " Kyoto/Math/CVector3d " , True ] ,
2022-10-02 05:13:41 +00:00
" Kyoto/Math/CVector3f " ,
2022-10-09 23:48:42 +00:00
[ " Kyoto/Math/CVector3i " , True ] ,
2022-10-02 05:13:41 +00:00
" Kyoto/Math/RMathUtils " ,
2022-10-09 23:48:42 +00:00
[ " Kyoto/CCrc32 " , True ] ,
[ " Kyoto/Alloc/CCircularBuffer " , True ] ,
2022-10-12 08:07:35 +00:00
[ " Kyoto/Alloc/CMemory " , True ] ,
2022-10-09 23:48:42 +00:00
[ " Kyoto/Alloc/IAllocator " , True ] ,
2022-10-02 05:13:41 +00:00
" Kyoto/PVS/CPVSVisOctree " ,
" Kyoto/PVS/CPVSVisSet " ,
" Kyoto/Particles/CColorElement " ,
" Kyoto/Particles/CElementGen " ,
2022-10-09 23:48:42 +00:00
[ " Kyoto/Particles/CIntElement " , True ] ,
2022-10-09 04:11:17 +00:00
" Kyoto/Particles/CModVectorElement " ,
" Kyoto/Particles/CParticleDataFactory " ,
2022-10-02 05:13:41 +00:00
" Kyoto/Particles/CParticleGen " ,
" Kyoto/Particles/CParticleGlobals " ,
" Kyoto/Particles/CParticleSwoosh " ,
" Kyoto/Particles/CParticleSwooshDataFactory " ,
" Kyoto/Particles/CRealElement " ,
" Kyoto/Particles/CSpawnSystemKeyframeData " ,
" Kyoto/Particles/CUVElement " ,
" Kyoto/Particles/CVectorElement " ,
2022-10-09 23:48:42 +00:00
[ " Kyoto/Particles/CWarp " , True ] ,
[ " Kyoto/Math/CPlane " , True ] ,
[ " Kyoto/Math/CSphere " , True ] ,
2022-10-02 05:13:41 +00:00
" Kyoto/Math/CAABox " ,
" Kyoto/CFactoryMgr " ,
" Kyoto/CResFactory " ,
" Kyoto/CResLoader " ,
" Kyoto/rstl/rstl_map " ,
" Kyoto/rstl/rstl_strings " ,
" Kyoto/rstl/RstlExtras " ,
2022-10-09 23:48:42 +00:00
[ " Kyoto/Streams/CInputStream " , True ] ,
[ " Kyoto/Streams/CMemoryInStream " , True ] ,
2022-10-13 06:09:15 +00:00
[ " Kyoto/Streams/CMemoryStreamOut " , True ] ,
[ " Kyoto/Streams/COutputStream " , True ] ,
[ " Kyoto/Streams/CZipInputStream " , True ] ,
[ " Kyoto/Streams/CZipSupport " , True ] ,
2022-10-02 05:13:41 +00:00
" Kyoto/CSimplePool " ,
" Kyoto/CToken " ,
2022-10-09 23:48:42 +00:00
[ " Kyoto/IObj " , True ] ,
2022-10-02 05:13:41 +00:00
] ,
} ,
{
" lib " : " zlib " ,
" mwcc_version " : " 1.3.2 " ,
" cflags " : " $cflags_runtime " ,
" objects " : [
2022-10-09 23:48:42 +00:00
[ " Kyoto/zlib/adler32 " , True ] ,
[ " Kyoto/zlib/infblock " , True ] ,
[ " Kyoto/zlib/infcodes " , True ] ,
[ " Kyoto/zlib/inffast " , True ] ,
[ " Kyoto/zlib/inflate " , True ] ,
[ " Kyoto/zlib/inftrees " , True ] ,
[ " Kyoto/zlib/infutil " , True ] ,
[ " Kyoto/zlib/zutil " , True ] ,
2022-10-02 05:13:41 +00:00
]
} ,
{
" lib " : " Kyoto_CW2 " ,
" mwcc_version " : " 1.3.2 " ,
" cflags " : " $cflags_retro " ,
" objects " : [
" Kyoto/CARAMManager " ,
" Kyoto/Math/CFrustumPlanes " ,
" Kyoto/Graphics/CCubeMaterial " ,
" Kyoto/Graphics/CCubeSurface " ,
" Kyoto/Animation/CCharAnimTime " ,
2022-10-15 05:22:32 +00:00
[ " Kyoto/Animation/CSegIdList " , False ] ,
2022-10-09 23:48:42 +00:00
[ " Kyoto/Input/CFinalInput " , True ] ,
[ " Kyoto/Graphics/CColor " , True ] ,
2022-10-02 05:13:41 +00:00
" Kyoto/Audio/DolphinCAudioGroupSet " ,
" Kyoto/Audio/DolphinCAudioSys " ,
" Kyoto/DolphinCMemoryCardSys " ,
2022-10-09 23:48:42 +00:00
[ " Kyoto/Input/DolphinIController " , True ] ,
[ " Kyoto/Input/CDolphinController " , True ] ,
2022-10-02 05:13:41 +00:00
" Kyoto/DolphinCDvdFile " ,
" Kyoto/Alloc/CMediumAllocPool " ,
2022-10-09 23:48:42 +00:00
[ " Kyoto/Alloc/CSmallAllocPool " , True ] ,
2022-10-02 05:13:41 +00:00
" Kyoto/Alloc/CGameAllocator " ,
" Kyoto/Animation/DolphinCSkinnedModel " ,
" Kyoto/Animation/DolphinCSkinRules " ,
" Kyoto/Animation/DolphinCVirtualBone " ,
" Kyoto/Graphics/DolphinCModel " ,
2022-10-09 23:48:42 +00:00
[ " Kyoto/Text/CStringTable " , True ] ,
2022-10-02 05:13:41 +00:00
" Kyoto/Particles/CEmitterElement " ,
" Kyoto/Particles/CEffectComponent " ,
" Kyoto/Particles/CParticleData " ,
" Kyoto/Animation/CVertexMorphEffect " ,
" Kyoto/Animation/CSkinnedModelWithAvgNormals " ,
2022-10-09 23:48:42 +00:00
[ " Kyoto/CTimeProvider " , True ] ,
2022-10-02 05:13:41 +00:00
" Kyoto/CARAMToken " ,
" Kyoto/Audio/CMidiManager " ,
2022-10-09 23:48:42 +00:00
[ " Kyoto/Text/CFontImageDef " , True ] ,
2022-10-02 05:13:41 +00:00
" Kyoto/Text/CImageInstruction " ,
" Kyoto/Text/CTextRenderBuffer " ,
" Kyoto/Graphics/CCubeMoviePlayer " ,
" Kyoto/Animation/CAdditiveAnimPlayback " ,
" Kyoto/Particles/CParticleElectricDataFactory " ,
" Kyoto/Particles/CParticleElectric " ,
2022-10-09 23:48:42 +00:00
[ " Kyoto/Graphics/DolphinCColor " , True ] ,
2022-10-02 05:13:41 +00:00
" Kyoto/Audio/CDSPStreamManager " ,
" Kyoto/CDependencyGroup " ,
" Kyoto/Audio/CStreamAudioManager " ,
" Kyoto/Animation/CHalfTransition " ,
" Kyoto/Particles/CElectricDescription " ,
" Kyoto/Particles/CSwooshDescription " ,
" Kyoto/Particles/CGenDescription " ,
" Kyoto/CPakFile " ,
2022-10-12 05:16:08 +00:00
" Kyoto/Animation/CPoseAsTransformsVariableSize " ,
2022-10-02 05:13:41 +00:00
" Kyoto/Input/CRumbleVoice " ,
2022-10-09 23:48:42 +00:00
[ " Kyoto/Input/RumbleAdsr " , True ] ,
2022-10-02 05:13:41 +00:00
" Kyoto/Input/CRumbleGenerator " ,
" Kyoto/Audio/SDSPStream " ,
2022-10-09 23:48:42 +00:00
[ " Kyoto/Audio/g721 " , True ] ,
2022-10-02 05:13:41 +00:00
" Kyoto/Audio/CStaticAudioPlayer " ,
" Kyoto/CFrameDelayedKiller " ,
] ,
} ,
{
" lib " : " ai " ,
" mwcc_version " : " 1.2.5 " ,
" cflags " : " $cflags_base " ,
" objects " : [ " Dolphin/ai " ] ,
} ,
{
" lib " : " ar " ,
" mwcc_version " : " 1.2.5 " ,
" cflags " : " $cflags_base " ,
" objects " : [
" Dolphin/ar/ar " ,
" Dolphin/ar/arq " ,
] ,
} ,
{
" lib " : " base " ,
" mwcc_version " : " 1.2.5 " ,
" cflags " : " $cflags_base " ,
2022-10-09 23:48:42 +00:00
" objects " : [
[ " Dolphin/PPCArch " , True ] ,
] ,
2022-10-02 05:13:41 +00:00
} ,
{
" lib " : " db " ,
" mwcc_version " : " 1.2.5 " ,
" cflags " : " $cflags_base " ,
2022-10-13 16:33:30 +00:00
" objects " : [
[ " Dolphin/db " , True ] ,
] ,
2022-10-02 05:13:41 +00:00
} ,
{
" lib " : " dsp " ,
" mwcc_version " : " 1.2.5 " ,
" cflags " : " $cflags_base " ,
" objects " : [
" Dolphin/dsp/dsp " ,
2022-10-09 23:48:42 +00:00
[ " Dolphin/dsp/dsp_debug " , True ] ,
2022-10-02 05:13:41 +00:00
" Dolphin/dsp/dsp_task " ,
] ,
} ,
{
" lib " : " dvd " ,
" mwcc_version " : " 1.2.5 " ,
" cflags " : " $cflags_base " ,
" objects " : [
" Dolphin/dvd/dvdlow " ,
" Dolphin/dvd/dvdfs " ,
" Dolphin/dvd/dvd " ,
" Dolphin/dvd/dvdqueue " ,
" Dolphin/dvd/dvderror " ,
" Dolphin/dvd/dvdidutils " ,
" Dolphin/dvd/dvdfatal " ,
" Dolphin/dvd/fstload " ,
] ,
} ,
{
" lib " : " gx " ,
" mwcc_version " : " 1.2.5 " ,
" cflags " : " $cflags_base " ,
" objects " : [
" Dolphin/gx/GXInit " ,
" Dolphin/gx/GXFifo " ,
" Dolphin/gx/GXAttr " ,
" Dolphin/gx/GXMisc " ,
" Dolphin/gx/GXGeometry " ,
" Dolphin/gx/GXFrameBuf " ,
" Dolphin/gx/GXLight " ,
" Dolphin/gx/GXTexture " ,
" Dolphin/gx/GXBump " ,
" Dolphin/gx/GXTev " ,
" Dolphin/gx/GXPixel " ,
" Dolphin/gx/GXStubs " ,
" Dolphin/gx/GXDisplayList " ,
" Dolphin/gx/GXTransform " ,
" Dolphin/gx/GXPerf " ,
] ,
} ,
{
" lib " : " mtx " ,
" mwcc_version " : " 1.2.5 " ,
" cflags " : " $cflags_base " ,
" objects " : [
" Dolphin/mtx/mtx " ,
" Dolphin/mtx/mtx44vec " ,
" Dolphin/mtx/mtx44 " ,
" Dolphin/mtx/vec " ,
" Dolphin/mtx/psmtx " ,
] ,
} ,
{
" lib " : " os " ,
" mwcc_version " : " 1.2.5e " ,
" cflags " : " $cflags_base " ,
" objects " : [
2022-10-09 23:48:42 +00:00
[ " Dolphin/os/__start " , True ] ,
2022-10-02 05:13:41 +00:00
" Dolphin/os/OS " ,
" Dolphin/os/OSAlarm " ,
" Dolphin/os/OSArena " ,
2022-10-09 23:48:42 +00:00
[ " Dolphin/os/OSAudioSystem " , True ] ,
2022-10-02 05:13:41 +00:00
" Dolphin/os/OSCache " ,
" Dolphin/os/OSContext " ,
" Dolphin/os/OSError " ,
" Dolphin/os/OSFatal " ,
" Dolphin/os/OSFont " ,
" Dolphin/os/OSInterrupt " ,
" Dolphin/os/OSLink " ,
" Dolphin/os/OSMemory " ,
" Dolphin/os/OSMutex " ,
" Dolphin/os/OSReboot " ,
2022-10-11 07:01:27 +00:00
[ " Dolphin/os/OSReset " , True ] ,
2022-10-02 05:13:41 +00:00
" Dolphin/os/OSResetSW " ,
" Dolphin/os/OSRtc " ,
2022-10-10 17:03:39 +00:00
[ " Dolphin/os/OSSync " , True ] ,
2022-10-02 05:13:41 +00:00
" Dolphin/os/OSThread " ,
" Dolphin/os/OSTime " ,
2022-10-09 23:48:42 +00:00
[ " Dolphin/os/__ppc_eabi_init " , True ] ,
2022-10-02 05:13:41 +00:00
] ,
} ,
{
" lib " : " pad " ,
2022-10-07 22:58:07 +00:00
" mwcc_version " : " 1.2.5e " ,
2022-10-02 05:13:41 +00:00
" cflags " : " $cflags_base " ,
" objects " : [
2022-10-09 23:48:42 +00:00
[ " Dolphin/pad/PadClamp " , True ] ,
[ " Dolphin/pad/pad " , False ] ,
2022-10-02 05:13:41 +00:00
] ,
} ,
{
" lib " : " vi " ,
" mwcc_version " : " 1.2.5 " ,
" cflags " : " $cflags_base " ,
" objects " : [ " Dolphin/vi " ] ,
} ,
{
" lib " : " MSL_C.PPCEABI.bare.H " ,
" mwcc_version " : " 1.3.2 " ,
" cflags " : " $cflags_runtime " ,
" objects " : [
2022-10-09 23:48:42 +00:00
[ " Runtime/__mem " , True ] ,
2022-10-10 09:30:25 +00:00
[ " Runtime/__va_arg " , True ] ,
2022-10-10 08:46:54 +00:00
[ " Runtime/global_destructor_chain " , True ] ,
[ " Runtime/CPlusLibPPC " , True ] ,
2022-10-10 18:19:04 +00:00
[ " Runtime/NMWException " , True ] ,
2022-10-10 09:30:25 +00:00
[ " Runtime/ptmf " , True ] ,
2022-10-02 05:13:41 +00:00
" Runtime/runtime " ,
2022-10-10 08:46:54 +00:00
[ " Runtime/__init_cpp_exceptions " , True ] ,
2022-10-10 17:44:50 +00:00
[ " Runtime/Gecko_ExceptionPPC " , True ] ,
2022-10-09 23:48:42 +00:00
[ " Runtime/abort_exit " , True ] ,
2022-10-02 05:13:41 +00:00
" Runtime/alloc " ,
2022-10-13 08:02:37 +00:00
[ " Runtime/ansi_files " , True ] ,
2022-10-02 05:13:41 +00:00
" Runtime/ansi_fp " ,
" Runtime/arith " ,
2022-10-13 08:02:37 +00:00
[ " Runtime/buffer_io " , True ] ,
2022-10-09 23:48:42 +00:00
[ " Runtime/ctype " , True ] ,
[ " Runtime/locale " , True ] ,
2022-10-13 08:02:37 +00:00
[ " Runtime/direct_io " , True ] ,
[ " Runtime/file_io " , True ] ,
2022-10-13 15:19:18 +00:00
[ " Runtime/errno " , True ] ,
[ " Runtime/FILE_POS " , True ] ,
2022-10-02 05:13:41 +00:00
" Runtime/mbstring " ,
2022-10-09 23:48:42 +00:00
[ " Runtime/mem " , True ] ,
[ " Runtime/mem_funcs " , True ] ,
[ " Runtime/misc_io " , True ] ,
2022-10-02 05:13:41 +00:00
" Runtime/printf " ,
" Runtime/qsort " ,
2022-10-09 23:48:42 +00:00
[ " Runtime/rand " , True ] ,
2022-10-02 05:13:41 +00:00
" Runtime/sscanf " ,
" Runtime/string " ,
2022-10-11 15:23:29 +00:00
[ " Runtime/float " , True ] ,
2022-10-02 05:13:41 +00:00
" Runtime/strtold " ,
2022-10-10 17:44:50 +00:00
[ " Runtime/uart_console_io " , True ] ,
2022-10-09 23:48:42 +00:00
[ " Runtime/wchar_io " , True ] ,
[ " Runtime/e_acos " , True ] ,
[ " Runtime/e_asin " , True ] ,
[ " Runtime/e_atan2 " , True ] ,
2022-10-02 05:13:41 +00:00
" Runtime/e_exp " ,
2022-10-09 23:48:42 +00:00
[ " Runtime/e_fmod " , True ] ,
[ " Runtime/e_log " , True ] ,
2022-10-02 05:13:41 +00:00
" Runtime/e_pow " ,
2022-10-09 23:48:42 +00:00
[ " Runtime/e_rem_pio2 " , True ] ,
[ " Runtime/k_cos " , True ] ,
2022-10-12 04:44:08 +00:00
[ " Runtime/k_rem_pio2 " , True ] ,
2022-10-09 23:48:42 +00:00
[ " Runtime/k_sin " , True ] ,
[ " Runtime/k_tan " , True ] ,
2022-10-02 05:13:41 +00:00
" Runtime/s_atan " ,
2022-10-09 23:48:42 +00:00
[ " Runtime/s_copysign " , True ] ,
[ " Runtime/s_cos " , True ] ,
[ " Runtime/s_floor " , True ] ,
[ " Runtime/s_frexp " , True ] ,
[ " Runtime/s_ldexp " , True ] ,
[ " Runtime/s_modf " , True ] ,
[ " Runtime/s_nextafter " , True ] ,
[ " Runtime/s_sin " , True ] ,
[ " Runtime/s_tan " , True ] ,
[ " Runtime/w_acos " , True ] ,
[ " Runtime/w_asin " , True ] ,
[ " Runtime/w_atan2 " , True ] ,
[ " Runtime/w_exp " , True ] ,
[ " Runtime/w_fmod " , True ] ,
[ " Runtime/w_log " , True ] ,
[ " Runtime/w_pow " , True ] ,
[ " Runtime/math_ppc " , True ] ,
2022-10-02 05:13:41 +00:00
] ,
} ,
{
" lib " : " musyx " ,
" mwcc_version " : " 1.3.2 " ,
" cflags " : " $cflags_musyx " ,
" objects " : [
" musyx/seq " ,
" musyx/synth " ,
2022-10-09 23:48:42 +00:00
[ " musyx/seq_api " , True ] ,
2022-10-10 09:46:24 +00:00
[ " musyx/snd_synthapi " , False , False ] ,
2022-10-02 05:13:41 +00:00
" musyx/stream " ,
" musyx/synthdata " ,
" musyx/synthmacros " ,
" musyx/synthvoice " ,
2022-10-09 23:48:42 +00:00
[ " musyx/synth_ac " , True ] ,
2022-10-02 05:13:41 +00:00
" musyx/synth_adsr " ,
" musyx/synth_vsamples " ,
2022-10-09 23:48:42 +00:00
[ " musyx/synth_dbtab " , True ] ,
2022-10-02 05:13:41 +00:00
" musyx/s_data " ,
" musyx/hw_dspctrl " ,
" musyx/hw_volconv " ,
" musyx/snd3d " ,
2022-10-09 23:48:42 +00:00
[ " musyx/snd_init " , True ] ,
2022-10-02 05:13:41 +00:00
" musyx/snd_math " ,
" musyx/snd_midictrl " ,
2022-10-09 23:48:42 +00:00
[ " musyx/snd_service " , True ] ,
2022-10-02 05:13:41 +00:00
" musyx/hardware " ,
" musyx/hw_aramdma " ,
2022-10-09 23:48:42 +00:00
[ " musyx/dsp_import " , True ] ,
2022-10-02 05:13:41 +00:00
" musyx/hw_dolphin " ,
2022-10-09 23:48:42 +00:00
[ " musyx/hw_memory " , True ] ,
[ " musyx/creverb_fx " , True ] ,
2022-10-02 05:13:41 +00:00
" musyx/creverb " ,
2022-10-09 23:48:42 +00:00
[ " musyx/reverb_fx " , True ] ,
2022-10-02 05:13:41 +00:00
" musyx/reverb " ,
2022-10-09 23:48:42 +00:00
[ " musyx/delay_fx " , True ] ,
2022-10-02 05:13:41 +00:00
" musyx/chorus_fx " ,
] ,
} ,
{
" lib " : " dtk " ,
" mwcc_version " : " 1.2.5 " ,
" cflags " : " $cflags_base " ,
2022-10-09 23:48:42 +00:00
" objects " : [
[ " Dolphin/dtk " , True ] ,
] ,
2022-10-02 05:13:41 +00:00
} ,
{
" lib " : " card " ,
" mwcc_version " : " 1.2.5e " ,
" cflags " : " $cflags_base " ,
" objects " : [
" Dolphin/card/CARDBios " ,
2022-10-09 23:48:42 +00:00
[ " Dolphin/card/CARDUnlock " , True ] ,
[ " Dolphin/card/CARDRdwr " , True ] ,
[ " Dolphin/card/CARDBlock " , True ] ,
[ " Dolphin/card/CARDDir " , True ] ,
2022-10-02 05:13:41 +00:00
" Dolphin/card/CARDCheck " ,
2022-10-09 23:48:42 +00:00
[ " Dolphin/card/CARDMount " , True ] ,
[ " Dolphin/card/CARDFormat " , True ] ,
[ " Dolphin/card/CARDOpen " , True ] ,
[ " Dolphin/card/CARDCreate " , True ] ,
[ " Dolphin/card/CARDRead " , True ] ,
[ " Dolphin/card/CARDWrite " , True ] ,
[ " Dolphin/card/CARDDelete " , True ] ,
[ " Dolphin/card/CARDStat " , True ] ,
[ " Dolphin/card/CARDRename " , True ] ,
[ " Dolphin/card/CARDNet " , True ] ,
2022-10-02 05:13:41 +00:00
] ,
} ,
{
" lib " : " si " ,
2022-10-13 18:30:13 +00:00
" mwcc_version " : " 1.2.5e " ,
2022-10-02 05:13:41 +00:00
" cflags " : " $cflags_base " ,
" objects " : [
" Dolphin/si/SIBios " ,
2022-10-13 18:30:13 +00:00
[ " Dolphin/si/SISamplingRate " , True ] ,
2022-10-02 05:13:41 +00:00
] ,
} ,
{
" lib " : " exi " ,
" mwcc_version " : " 1.2.5 " ,
" cflags " : " $cflags_base " ,
" objects " : [
" Dolphin/exi/EXIBios " ,
" Dolphin/exi/EXIUart " ,
] ,
} ,
{
" lib " : " thp " ,
" mwcc_version " : " 1.2.5 " ,
" cflags " : " $cflags_base " ,
" objects " : [
" Dolphin/thp/THPDec " ,
" Dolphin/thp/THPAudio " ,
] ,
} ,
{
" lib " : " gba " ,
" mwcc_version " : " 1.2.5 " ,
" cflags " : " $cflags_base " ,
" objects " : [
" Dolphin/GBA/GBA " ,
" Dolphin/GBA/GBARead " ,
" Dolphin/GBA/GBAWrite " ,
" Dolphin/GBA/GBAXfer " ,
" Dolphin/GBA/GBAKey " ,
] ,
} ,
]
2022-10-04 00:00:46 +00:00
# Create & link static libraries
2022-10-05 01:31:43 +00:00
# Disabled by default for now until we can get it working on windows/macOS
2022-10-05 05:17:40 +00:00
ENABLE_STATIC_LIBS = args . static_libs
2022-10-04 00:00:46 +00:00
# On Windows, we need this to use && in commands
2022-10-02 05:13:41 +00:00
ALLOW_CHAIN = " cmd /c " if os . name == " nt " else " "
out = io . StringIO ( )
n = ninja_syntax . Writer ( out )
n . variable ( " ninja_required_version " , " 1.3 " )
n . newline ( )
n . comment ( " The arguments passed to configure.py, for rerunning it. " )
2022-10-07 04:39:17 +00:00
configure_args = sys . argv [ 1 : ]
# Ignore DEVKITPPC env var on Windows
2022-10-07 08:54:42 +00:00
if os . name != " nt " and " DEVKITPPC " in os . environ and not args . devkitppc :
2022-10-07 04:39:17 +00:00
configure_args . extend ( [ " --devkitppc " , os . environ [ " DEVKITPPC " ] ] )
n . variable ( " configure_args " , configure_args )
2022-10-02 05:13:41 +00:00
n . newline ( )
###
# Variables
###
n . variable ( " version " , args . version . lower ( ) )
if args . version . lower ( ) == ' kor ' :
n . variable ( " version_num " , " 2 " )
2022-10-07 04:39:17 +00:00
elif args . version . isnumeric ( ) and int ( args . version ) in [ 0 , 1 ] :
2022-10-02 05:13:41 +00:00
n . variable ( " version_num " , args . version )
else :
sys . exit ( f " Invalid version \" { args . version } \" " )
n . variable ( " builddir " , " build/mp1.$version " )
2022-10-07 04:39:17 +00:00
if args . devkitppc :
n . variable ( " devkitppc " , args . devkitppc )
elif os . name == " nt " :
n . variable ( " devkitppc " , " C: \ devkitPro \ devkitPPC " )
elif " DEVKITPPC " in os . environ :
n . variable ( " devkitppc " , os . environ [ " DEVKITPPC " ] )
else :
n . variable ( " devkitppc " , " /opt/devkitpro/devkitPPC " )
2022-10-02 05:13:41 +00:00
n . variable ( " cflags_base " , " -proc gekko -nodefaults -Cpp_exceptions off -RTTI off -fp hard -fp_contract on -O4,p -maxerrors 1 -enum int -inline auto -str reuse -nosyspath -MMD -DPRIME1 -DVERSION=$version_num -DNONMATCHING=0 -i include/ -i libc/ " )
n . variable ( " cflags_retro " ,
" $cflags_base -use_lmw_stmw on -str reuse,pool,readonly -gccinc -inline deferred,noauto -common on " )
n . variable ( " cflags_runtime " ,
" $cflags_base -use_lmw_stmw on -str reuse,pool,readonly -gccinc -inline deferred,auto " )
n . variable ( " cflags_musyx " , " $cflags_base -str reuse,pool,readonly " )
n . variable ( " asflags " , " -mgekko -I include/ --defsym version=$version_num -W " )
ldflags = " -fp fmadd -nodefaults -lcf ldscript.lcf -w off "
if args . map :
ldflags + = " -map $builddir/MetroidPrime.MAP "
n . variable ( " ldflags " , ldflags )
n . variable ( " mwcc_version " , " 1.3.2 " )
2022-10-07 04:39:17 +00:00
n . variable ( " python " , sys . executable )
2022-10-02 05:13:41 +00:00
if os . name == " nt " :
2022-10-07 04:39:17 +00:00
n . variable ( " sha1sum " , " sha1sum " )
n . variable ( " exe " , " .exe " )
2022-10-02 05:13:41 +00:00
else :
2022-10-07 04:39:17 +00:00
n . variable ( " sha1sum " , " shasum -a 1 " )
if " _NT- " in os . uname ( ) . sysname :
# MSYS2
n . variable ( " wine " , " " )
elif args . wine :
2022-10-07 08:54:42 +00:00
n . variable ( " wine " , args . wine + " " )
2022-10-07 04:39:17 +00:00
elif which ( " wibo " ) is not None :
n . variable ( " wine " , " wibo " )
else :
n . variable ( " wine " , " wine " )
n . variable ( " exe " , " " )
2022-10-02 05:13:41 +00:00
n . newline ( )
###
# Rules
###
n . newline ( )
if os . name == " nt " :
2022-10-07 04:39:17 +00:00
n . rule ( name = " mwcc " , command = " tools \\ mwcc_compiler \\ $mwcc_version \\ mwcceppc.exe $cflags -c $in -o $basedir " ,
2022-10-02 05:13:41 +00:00
description = " MWCC $out " , depfile = " $basefile.d " , deps = " gcc " )
n . newline ( )
2022-10-07 04:39:17 +00:00
n . rule ( name = " mwcc_frank " , command = ALLOW_CHAIN + " tools \\ mwcc_compiler \\ $mwcc_version \\ mwcceppc.exe $cflags -c $in -o $basedir && " +
" $python tools/franklite.py $out $out " ,
2022-10-02 05:13:41 +00:00
description = " FRANK $out " , depfile = " $basefile.d " , deps = " gcc " )
2022-10-07 04:39:17 +00:00
n . newline ( )
n . rule ( name = " link " , command = " tools \\ mwcc_compiler \\ $mwcc_version \\ mwldeppc.exe $ldflags -o $out @$out.rsp " ,
description = " LINK $out " , rspfile = " $out.rsp " , rspfile_content = " $in " )
n . newline ( )
n . rule ( name = " as " , command = " $devkitppc \\ bin \\ powerpc-eabi-as.exe $asflags -o $out $in -MD $out.d " ,
description = " AS $out " , depfile = " $out.d " , deps = " gcc " )
n . newline ( )
n . rule ( name = " ar " , command = " $devkitppc \\ bin \\ powerpc-eabi-ar.exe crs $out $in " ,
description = " AR $out " )
n . newline ( )
2022-10-02 05:13:41 +00:00
else :
2022-10-07 04:39:17 +00:00
n . rule ( name = " mwcc " , command = " $ {wine} tools/mwcc_compiler/$mwcc_version/mwcceppc.exe $cflags -c $in -o $basedir && " +
" $python tools/transform-dep.py $basefile.d $basefile.d " ,
2022-10-03 05:03:10 +00:00
description = " MWCC $out " , depfile = " $basefile.d " , deps = " gcc " )
2022-10-02 05:13:41 +00:00
n . newline ( )
2022-10-07 04:39:17 +00:00
n . rule ( name = " mwcc_frank " , command = " $ {wine} tools/mwcc_compiler/$mwcc_version/mwcceppc.exe $cflags -c $in -o $basedir && " +
" $python tools/franklite.py $out $out && " +
" $python tools/transform-dep.py $basefile.d $basefile.d " ,
2022-10-03 05:03:10 +00:00
description = " FRANK $out " , depfile = " $basefile.d " , deps = " gcc " )
2022-10-07 04:39:17 +00:00
n . newline ( )
n . rule ( name = " link " , command = " $ {wine} tools/mwcc_compiler/$mwcc_version/mwldeppc.exe $ldflags -o $out @$out.rsp " ,
description = " LINK $out " , rspfile = " $out.rsp " , rspfile_content = " $in " )
n . newline ( )
n . rule ( name = " as " , command = " $devkitppc/bin/powerpc-eabi-as $asflags -o $out $in -MD $out.d " ,
description = " AS $out " , depfile = " $out.d " , deps = " gcc " )
n . newline ( )
2022-10-04 00:00:46 +00:00
n . rule ( name = " ar " , command = " $devkitppc/bin/powerpc-eabi-ar crs $out $in " ,
2022-10-07 03:13:38 +00:00
description = " AR $out " )
2022-10-04 00:00:46 +00:00
n . newline ( )
2022-10-02 05:13:41 +00:00
2022-10-09 23:48:42 +00:00
from pprint import pprint
2022-10-02 05:13:41 +00:00
###
# Build
###
2022-10-10 09:21:02 +00:00
all_source_files = [ ]
2022-10-02 05:13:41 +00:00
for lib in LIBS :
inputs = [ ]
if " lib " in lib :
lib_name = lib [ " lib " ]
n . comment ( f " { lib_name } .a " )
else :
n . comment ( " Loose files " )
for object in lib [ " objects " ] :
2022-10-09 23:48:42 +00:00
completed = False
2022-10-10 09:46:24 +00:00
add_to_all = True
2022-10-09 23:48:42 +00:00
if type ( object ) is list :
2022-10-10 09:46:24 +00:00
if len ( object ) > 2 :
add_to_all = object [ 2 ]
2022-10-09 23:48:42 +00:00
completed = object [ 1 ]
object = object [ 0 ]
2022-10-02 05:13:41 +00:00
mwcc_version = lib [ " mwcc_version " ]
c_file = None
if os . path . exists ( os . path . join ( " src " , f " { object } .cpp " ) ) :
c_file = os . path . join ( " src " , f " { object } .cpp " )
elif os . path . exists ( os . path . join ( " src " , f " { object } .c " ) ) :
c_file = os . path . join ( " src " , f " { object } .c " )
if c_file is not None :
rule = " mwcc "
if mwcc_version == " 1.2.5e " :
mwcc_version = " 1.2.5 "
rule = " mwcc_frank "
n . build ( f " $builddir/src/ { object } .o " , rule , c_file ,
variables = {
" mwcc_version " : mwcc_version ,
" cflags " : lib [ " cflags " ] ,
" basedir " : os . path . dirname ( f " $builddir/src/ { object } " ) ,
" basefile " : f " $builddir/src/ { object } "
} )
2022-10-10 09:46:24 +00:00
if add_to_all :
all_source_files . append ( f " $builddir/src/ { object } .o " )
2022-10-02 05:13:41 +00:00
if os . path . exists ( os . path . join ( " asm " , f " { object } .s " ) ) :
n . build ( f " $builddir/asm/ { object } .o " , " as " , f " asm/ { object } .s " )
2022-10-09 23:48:42 +00:00
if completed :
2022-10-02 05:13:41 +00:00
inputs . append ( f " $builddir/src/ { object } .o " )
else :
inputs . append ( f " $builddir/asm/ { object } .o " )
2022-10-04 00:00:46 +00:00
if ENABLE_STATIC_LIBS and " lib " in lib :
2022-10-02 05:13:41 +00:00
lib_name = lib [ " lib " ]
2022-10-04 00:00:46 +00:00
n . build ( f " $builddir/lib/ { lib_name } .a " , " ar " , inputs )
2022-10-02 05:13:41 +00:00
n . newline ( )
n . comment ( " main.elf " )
inputs = [ ]
for lib in LIBS :
2022-10-04 00:00:46 +00:00
if ENABLE_STATIC_LIBS and " lib " in lib :
lib_name = lib [ " lib " ]
inputs . append ( f " $builddir/lib/ { lib_name } .a " )
else :
for object in lib [ " objects " ] :
2022-10-09 23:48:42 +00:00
completed = False
if type ( object ) is list :
completed = object [ 1 ]
object = object [ 0 ]
if completed :
2022-10-04 00:00:46 +00:00
inputs . append ( f " $builddir/src/ { object } .o " )
else :
inputs . append ( f " $builddir/asm/ { object } .o " )
2022-10-02 05:13:41 +00:00
if args . map :
n . build ( " $builddir/main.elf " , " link " , inputs ,
implicit_outputs = " $builddir/MetroidPrime.MAP " )
else :
n . build ( " $builddir/main.elf " , " link " , inputs )
n . newline ( )
2022-10-10 09:21:02 +00:00
###
# Helper rule for building all source files
###
n . comment ( " Adds a command for building all source files " )
n . build ( " all_source " , " phony " , all_source_files )
n . newline ( )
2022-10-02 05:13:41 +00:00
###
# Generate DOL
###
n . comment ( " main.dol " )
2022-10-07 04:39:17 +00:00
# TODO MSVC?
n . rule ( name = " cc " , command = " cc -MMD -MT $out -MF $out.d $in -o $out " ,
description = " CC $out " , depfile = " $out.d " , deps = " gcc " )
n . build ( " build/elf2dol$exe " , " cc " , " tools/elf2dol.c " )
n . build ( " build/metroidbuildinfo$exe " , " cc " , " tools/metroidbuildinfo.c " )
2022-10-07 03:13:38 +00:00
n . rule ( name = " elf2dol " ,
2022-10-07 04:39:17 +00:00
command = ALLOW_CHAIN + os . path . join ( " build " , " elf2dol$exe " ) + " $in $out && " +
os . path . join ( " build " , " metroidbuildinfo$exe " ) +
" $out buildstrings/mp1.$version.build " ,
2022-10-07 03:13:38 +00:00
description = " DOL $out " )
n . build ( " $builddir/main.dol " , " elf2dol " , " $builddir/main.elf " ,
2022-10-07 04:39:17 +00:00
implicit = [ " build/elf2dol$exe " , " build/metroidbuildinfo$exe " ] )
2022-10-02 05:13:41 +00:00
n . newline ( )
###
# Check DOL hash
###
if args . check :
2022-10-07 04:39:17 +00:00
n . rule ( name = " check " , command = ALLOW_CHAIN + " $sha1sum -c $in && touch $out " ,
2022-10-02 05:13:41 +00:00
description = " CHECK $in " )
n . build ( " $builddir/main.dol.ok " , " check " ,
2022-10-03 05:03:10 +00:00
" sha1/mp1.$version.sha1 " , implicit = " $builddir/main.dol " )
2022-10-02 05:13:41 +00:00
n . newline ( )
###
# Progress script
###
if args . map :
2022-10-07 04:39:17 +00:00
n . rule ( name = " progress " , command = ALLOW_CHAIN + " $python tools/calcprogress.py $in && touch $out " ,
2022-10-02 05:13:41 +00:00
description = " PROGRESS $in " )
n . build ( " $builddir/main.dol.progress " , " progress " ,
[ " $builddir/main.dol " , " $builddir/MetroidPrime.MAP " ] )
n . newline ( )
###
# Regenerate on change
###
n . comment ( " Regenerate build files if build script changes. " )
n . rule ( name = " configure " , command = " $python configure.py $configure_args " , generator = True )
n . build ( " build.ninja " , " configure " , implicit = [
" configure.py " , " tools/ninja_syntax.py " ] )
n . newline ( )
###
# Default rule
###
dol_out = " $builddir/main.dol "
if args . check :
dol_out = " $builddir/main.dol.ok "
if args . map :
n . default ( [ dol_out , " $builddir/main.dol.progress " ] )
else :
n . default ( dol_out )
with open ( " build.ninja " , ' w ' ) as f :
f . write ( out . getvalue ( ) )
n . close ( )