summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--NewerProjectKP.yaml13
-rw-r--r--bugfixes.yaml4
-rwxr-xr-xhacksToDropbox11
-rwxr-xr-xhacksToDropboxKP11
-rwxr-xr-xinclude/game.h9
-rw-r--r--kamek_configs.yaml3
-rw-r--r--kamek_pal.x14
-rw-r--r--koopatlas.yaml3
-rw-r--r--magicplatform.yaml2
-rwxr-xr-xmakeNewer4
-rwxr-xr-xmakeNewerAll6
-rwxr-xr-xmakeNewerKP4
-rwxr-xr-xmakeNewerKPAll6
-rw-r--r--src/koopatlas/camera.cpp8
-rw-r--r--src/koopatlas/core.cpp4
-rw-r--r--src/koopatlas/core.h4
-rw-r--r--src/koopatlas/map.cpp36
-rw-r--r--src/koopatlas/mapdata.cpp2
-rw-r--r--src/magicplatform.cpp100
-rw-r--r--src/prolog.S2
-rw-r--r--tools/dumprelocs.py19
-rwxr-xr-xtools/hooks.py73
-rw-r--r--tools/kamek.py135
23 files changed, 389 insertions, 84 deletions
diff --git a/NewerProjectKP.yaml b/NewerProjectKP.yaml
index 3c9657b..d7d4343 100644
--- a/NewerProjectKP.yaml
+++ b/NewerProjectKP.yaml
@@ -2,8 +2,8 @@ output_dir: "NewerASM"
code_address: 0x808D9000
modules:
- processed/prolog.yaml
+ - processed/magicplatform.yaml
- processed/bugfixes.yaml
-# - processed/worldmap.yaml
- processed/koopatlas.yaml
- processed/levelnames.yaml
- processed/animtiles.yaml
@@ -16,6 +16,7 @@ modules:
- processed/poweruphax.yaml
# - processed/heapbar.yaml
- processed/randtiles.yaml
+ - processed/objkinoko.yaml
- processed/tilegod.yaml
- processed/linegod.yaml
- processed/tilesetfixer.yaml
@@ -37,6 +38,16 @@ modules:
- processed/bossRamboo.yaml
- processed/bossBalboaWrench.yaml
- processed/bossWrenchThrow.yaml
+ - processed/bossPodouble.yaml
+ - processed/bossTopman.yaml
+ - processed/bossCaptainBowser.yaml
- processed/effectVideo.yaml
- processed/fakeStarCoin.yaml
+ - processed/shyguy.yaml
+ - processed/meteor.yaml
+ - processed/topman.yaml
+ - processed/electricLine.yaml
+ - processed/makeYourOwn.yaml
+ - processed/challengeStar.yaml
+ # - processed/pengi.yaml
# - processed/actorlog.yaml
diff --git a/bugfixes.yaml b/bugfixes.yaml
index 63cc6a2..27134b6 100644
--- a/bugfixes.yaml
+++ b/bugfixes.yaml
@@ -1,6 +1,10 @@
---
source_files: [../src/randomcrap.S, ../src/music.S, ../src/fix38.S]
hooks:
+ - name: FixMemoryLeaks
+ type: nop_insn
+ area_pal: 0x800E53E0
+
- name: MusicHax
type: branch_insn
src_addr_pal: 0x8008E5E4
diff --git a/hacksToDropbox b/hacksToDropbox
new file mode 100755
index 0000000..5077946
--- /dev/null
+++ b/hacksToDropbox
@@ -0,0 +1,11 @@
+path=/home/me/Dropbox/NEWERsmbw/Test\ Pack/NewerTestPack/SysSelect
+cp NewerASM/pal_loader.bin "$path/SystemEU_1.bin"
+cp NewerASM/pal_dlcode.bin "$path/DLCodeEU_1.bin"
+cp NewerASM/pal_dlrelocs.bin "$path/DLRelocsEU_1.bin"
+cp NewerASM/ntsc_loader.bin "$path/SystemUS_1.bin"
+cp NewerASM/ntsc_dlcode.bin "$path/DLCodeUS_1.bin"
+cp NewerASM/ntsc_dlrelocs.bin "$path/DLRelocsUS_1.bin"
+cp NewerASM/ntsc2_loader.bin "$path/SystemUS_2.bin"
+cp NewerASM/ntsc2_dlcode.bin "$path/DLCodeUS_2.bin"
+cp NewerASM/ntsc2_dlrelocs.bin "$path/DLRelocsUS_2.bin"
+
diff --git a/hacksToDropboxKP b/hacksToDropboxKP
new file mode 100755
index 0000000..419de5b
--- /dev/null
+++ b/hacksToDropboxKP
@@ -0,0 +1,11 @@
+path=/home/me/Dropbox/NEWERsmbw/Test\ Pack/NewerTestPack/SysMap
+cp NewerASM/pal_loader.bin "$path/SystemEU_1.bin"
+cp NewerASM/pal_dlcode.bin "$path/DLCodeEU_1.bin"
+cp NewerASM/pal_dlrelocs.bin "$path/DLRelocsEU_1.bin"
+cp NewerASM/ntsc_loader.bin "$path/SystemUS_1.bin"
+cp NewerASM/ntsc_dlcode.bin "$path/DLCodeUS_1.bin"
+cp NewerASM/ntsc_dlrelocs.bin "$path/DLRelocsUS_1.bin"
+cp NewerASM/ntsc2_loader.bin "$path/SystemUS_2.bin"
+cp NewerASM/ntsc2_dlcode.bin "$path/DLCodeUS_2.bin"
+cp NewerASM/ntsc2_dlrelocs.bin "$path/DLRelocsUS_2.bin"
+
diff --git a/include/game.h b/include/game.h
index efe5fa6..3691fc7 100755
--- a/include/game.h
+++ b/include/game.h
@@ -2911,5 +2911,14 @@ class ClassWithCameraInfo {
};
+namespace mHeap {
+ extern void *archiveHeap;
+ extern void *commandHeap;
+ extern void *dylinkHeap;
+ extern void *assertHeap;
+ extern void *gameHeaps[3];
+};
+
+
#endif
diff --git a/kamek_configs.yaml b/kamek_configs.yaml
index 06dd6c3..a65f321 100644
--- a/kamek_configs.yaml
+++ b/kamek_configs.yaml
@@ -4,6 +4,7 @@
defines: [REGION_PAL, VERSION_1]
include_dirs: ['include', 'src']
linker_script: kamek_pal.x
+ dynamic_link: true
rel_area_start: 0x807684C0
rel_area_end: 0x80B75CA8
@@ -12,6 +13,7 @@
defines: [REGION_NTSC, VERSION_1]
include_dirs: ['include', 'src']
linker_script: kamek_ntsc.x
+ dynamic_link: true
rel_area_start: 0x807684C0
rel_area_end: 0x80B8E33C
@@ -20,6 +22,7 @@
defines: [REGION_NTSC, VERSION_2]
include_dirs: ['include', 'src']
linker_script: kamek_ntsc2.x
+ dynamic_link: true
rel_area_start: 0x807684C0
rel_area_end: 0x80B8E33C
diff --git a/kamek_pal.x b/kamek_pal.x
index 10e75c2..0079576 100644
--- a/kamek_pal.x
+++ b/kamek_pal.x
@@ -1,9 +1,3 @@
-OUTPUT_FORMAT ("binary")
-
-/*MEMORY {
- loader_section : ORIGIN = 0x80001800, LENGTH = 0x1800
-}*/
-
SECTIONS {
/* Scrolling is annoying, clown car goes here! */
@@ -51,6 +45,12 @@ SECTIONS {
CosFIdx__Q24nw4r4mathFf = 0x80237D80;
SinCosFIdx__Q24nw4r4mathFPfPff = 0x80237DE0;
+ archiveHeap__5mHeap = 0x8042A72C;
+ commandHeap__5mHeap = 0x8042A730;
+ dylinkHeap__5mHeap = 0x8042A734;
+ assertHeap__5mHeap = 0x8042A738;
+ gameHeaps__5mHeap = 0x80377F48;
+
init__18StandOnTopColliderFP13dStageActor_cfffffsUcP7Point2d = 0x800DB270;
__ct__18StandOnTopColliderFv = 0x800DB220;
__dt__18StandOnTopColliderFv = 0x80044400;
@@ -1490,6 +1490,8 @@ SECTIONS {
SpawnThwompEffects = 0x809f6660;
+ HurtMarioBecauseOfBeingSquashed = 0x80056370;
+
.text : {
FILL (0)
diff --git a/koopatlas.yaml b/koopatlas.yaml
index 37c4a3d..55c9c44 100644
--- a/koopatlas.yaml
+++ b/koopatlas.yaml
@@ -1,11 +1,10 @@
---
source_files:
+ - ../src/boss.cpp # wtf is this doing in the Level Select/WorldMap stuff??
- ../src/fileload.cpp
- ../src/scene.S
- ../src/levelinfo.cpp
- ../src/levelinfo_old.cpp # backwards compatibility for LevelNames
- - ../src/player.cpp
- - ../src/effects.cpp
- ../src/koopatlas/core.cpp
- ../src/koopatlas/player.cpp
- ../src/koopatlas/hud.cpp
diff --git a/magicplatform.yaml b/magicplatform.yaml
index 69b349c..df98819 100644
--- a/magicplatform.yaml
+++ b/magicplatform.yaml
@@ -11,5 +11,5 @@ hooks:
addr_pal: 0x8030BDA8
# -ID- ---- -X Offs- -Y Offs- -RectX1- -RectY1- -RectX2- -RectY2- -1C- -1E- -20- -22- Flag ----
# Orig 00C4 0000 00000008 FFFFFFF0 00000000 00000010 00000010 00000010 0000 0000 0000 0000 0000 0000
- data: '00C4 0000 00000000 00000000 00000000 00000000 00000100 00000100 0000 0000 0000 0000 0000 0000'
+ data: '00C4 0000 00000000 00000000 00000000 00000000 00000100 00000100 0000 0000 0000 0000 0002 0000'
diff --git a/makeNewer b/makeNewer
index c9d7ee5..6e142c0 100755
--- a/makeNewer
+++ b/makeNewer
@@ -8,7 +8,7 @@ else
fi
cp NewerASM/pal_loader.bin ~/Games/Newer/DolphinPatch/NewerRes/SystemEU_1.bin
-cp NewerASM/ntsc_loader.bin ~/Games/Newer/DolphinPatch/NewerRes/SystemUS_1.bin
-cp NewerASM/ntsc2_loader.bin ~/Games/Newer/DolphinPatch/NewerRes/SystemUS_2.bin
+cp NewerASM/pal_dlcode.bin ~/Games/Newer/DolphinPatch/NewerRes/DLCodeEU_1.bin
+cp NewerASM/pal_dlrelocs.bin ~/Games/Newer/DolphinPatch/NewerRes/DLRelocsEU_1.bin
echo Built PAL!
diff --git a/makeNewerAll b/makeNewerAll
index ec5fc35..cceea26 100755
--- a/makeNewerAll
+++ b/makeNewerAll
@@ -8,7 +8,13 @@ else
fi
cp NewerASM/pal_loader.bin ~/Games/Newer/DolphinPatch/NewerRes/SystemEU_1.bin
+cp NewerASM/pal_dlcode.bin ~/Games/Newer/DolphinPatch/NewerRes/DLCodeEU_1.bin
+cp NewerASM/pal_dlrelocs.bin ~/Games/Newer/DolphinPatch/NewerRes/DLRelocsEU_1.bin
cp NewerASM/ntsc_loader.bin ~/Games/Newer/DolphinPatch/NewerRes/SystemUS_1.bin
+cp NewerASM/ntsc_dlcode.bin ~/Games/Newer/DolphinPatch/NewerRes/DLCodeUS_1.bin
+cp NewerASM/ntsc_dlrelocs.bin ~/Games/Newer/DolphinPatch/NewerRes/DLRelocsUS_1.bin
cp NewerASM/ntsc2_loader.bin ~/Games/Newer/DolphinPatch/NewerRes/SystemUS_2.bin
+cp NewerASM/ntsc2_dlcode.bin ~/Games/Newer/DolphinPatch/NewerRes/DLCodeUS_2.bin
+cp NewerASM/ntsc2_dlrelocs.bin ~/Games/Newer/DolphinPatch/NewerRes/DLRelocsUS_2.bin
echo Built all!
diff --git a/makeNewerKP b/makeNewerKP
index 21f6db8..36cb034 100755
--- a/makeNewerKP
+++ b/makeNewerKP
@@ -8,7 +8,7 @@ else
fi
cp NewerASM/pal_loader.bin ~/Games/Newer/DolphinPatch/NewerRes/SystemEU_1.bin
-cp NewerASM/ntsc_loader.bin ~/Games/Newer/DolphinPatch/NewerRes/SystemUS_1.bin
-cp NewerASM/ntsc2_loader.bin ~/Games/Newer/DolphinPatch/NewerRes/SystemUS_2.bin
+cp NewerASM/pal_dlcode.bin ~/Games/Newer/DolphinPatch/NewerRes/DLCodeEU_1.bin
+cp NewerASM/pal_dlrelocs.bin ~/Games/Newer/DolphinPatch/NewerRes/DLRelocsEU_1.bin
echo Built PAL!
diff --git a/makeNewerKPAll b/makeNewerKPAll
index 065735f..7d10af6 100755
--- a/makeNewerKPAll
+++ b/makeNewerKPAll
@@ -8,7 +8,13 @@ else
fi
cp NewerASM/pal_loader.bin ~/Games/Newer/DolphinPatch/NewerRes/SystemEU_1.bin
+cp NewerASM/pal_dlcode.bin ~/Games/Newer/DolphinPatch/NewerRes/DLCodeEU_1.bin
+cp NewerASM/pal_dlrelocs.bin ~/Games/Newer/DolphinPatch/NewerRes/DLRelocsEU_1.bin
cp NewerASM/ntsc_loader.bin ~/Games/Newer/DolphinPatch/NewerRes/SystemUS_1.bin
+cp NewerASM/ntsc_dlcode.bin ~/Games/Newer/DolphinPatch/NewerRes/DLCodeUS_1.bin
+cp NewerASM/ntsc_dlrelocs.bin ~/Games/Newer/DolphinPatch/NewerRes/DLRelocsUS_1.bin
cp NewerASM/ntsc2_loader.bin ~/Games/Newer/DolphinPatch/NewerRes/SystemUS_2.bin
+cp NewerASM/ntsc2_dlcode.bin ~/Games/Newer/DolphinPatch/NewerRes/DLCodeUS_2.bin
+cp NewerASM/ntsc2_dlrelocs.bin ~/Games/Newer/DolphinPatch/NewerRes/DLRelocsUS_2.bin
echo Built all!
diff --git a/src/koopatlas/camera.cpp b/src/koopatlas/camera.cpp
index 47b68a5..c13db56 100644
--- a/src/koopatlas/camera.cpp
+++ b/src/koopatlas/camera.cpp
@@ -69,7 +69,7 @@ int dWorldCamera_c::onExecute() {
int heldButtons = Remocon_GetButtons(GetActiveRemocon());
if (heldButtons & WPAD_MINUS) {
bool change = false;
- if (heldButtons & WPAD_LEFT) {
+ /*if (heldButtons & WPAD_LEFT) {
currentX -= 8.0f;
change = true;
}
@@ -84,7 +84,7 @@ int dWorldCamera_c::onExecute() {
if (heldButtons & WPAD_DOWN) {
currentY -= 8.0f;
change = true;
- }
+ }*/
if (heldButtons & WPAD_B) {
zoomLevel -= 0.10f;
change = true;
@@ -96,6 +96,10 @@ int dWorldCamera_c::onExecute() {
if (change) {
}
}
+ daWMPlayer_c *player = daWMPlayer_c::instance;
+ currentX = player->pos.x;
+ currentY = player->pos.y;
+
calculateScreenGeometry();
doStuff(10000.0);
generateCameraMatrices();
diff --git a/src/koopatlas/core.cpp b/src/koopatlas/core.cpp
index f7acf00..5e15d99 100644
--- a/src/koopatlas/core.cpp
+++ b/src/koopatlas/core.cpp
@@ -175,6 +175,7 @@ bool WMInit_LoadResources2(void *ptr) {
wm->mapPath = wm->getMapNameForIndex(wm->currentMapID);
if (wm->mapPath == 0)
wm->mapPath = wm->getMapNameForIndex(0);
+ OSReport("Load map: %s\n", wm->mapPath);
}
return wm->mapData.load(wm->mapPath);
@@ -229,7 +230,7 @@ bool WMInit_SetupExtra(void *ptr) {
wm->player->modelHandler->mdlClass->startAnimation(0, 1.2f, 10.0f, 0.0f);
dKPNode_s *cNode = wm->pathManager.currentNode;
- wm->player->pos = (Vec){cNode->x, -cNode->y, wm->player->pos.y};
+ wm->player->pos = (Vec){cNode->x, -cNode->y, wm->player->pos.z};
// is last param correct? must check :/
wm->map = (dWMMap_c*)CreateParentedObject(WM_MAP, wm, 0, 0);
@@ -857,6 +858,7 @@ u32 dScKoopatlas_c::iterateMapList(u32(*callback)(u32,const char *,int,int), u32
while (true) {
u8 chr = *ptr;
if (chr == 13) {
+ *ptr = 0;
++ptr;
continue;
}
diff --git a/src/koopatlas/core.h b/src/koopatlas/core.h
index 6a76cc4..fc517b2 100644
--- a/src/koopatlas/core.h
+++ b/src/koopatlas/core.h
@@ -19,13 +19,13 @@
#ifdef WM_DEBUGGING
#define MapReport OSReport
#else
-inline void MapReport(const char *str, ...) { }
+#define MapReport(...)
#endif
#ifdef WM_SPAMMY_DEBUGGING
#define SpammyReport OSReport
#else
-inline void SpammyReport(const char *str, ...) { }
+#define SpammyReport(...)
#endif
void NewerMapDrawFunc();
diff --git a/src/koopatlas/map.cpp b/src/koopatlas/map.cpp
index 4b90cb7..f4b953c 100644
--- a/src/koopatlas/map.cpp
+++ b/src/koopatlas/map.cpp
@@ -6,18 +6,21 @@
//#define DOODAD_DEBUGGING
#ifdef TILE_DEBUGGING
+#define TileReport OSReport
#else
-inline void TileReport(const char *str, ...) { }
+#define TileReport(...)
#endif
#ifdef BOUND_DEBUGGING
+#define BoundReport OSReport
#else
-inline void BoundReport(const char *str, ...) { }
+#define BoundReport(...)
#endif
#ifdef DOODAD_DEBUGGING
+#define DoodadReport OSReport
#else
-inline void DoodadReport(const char *str, ...) { }
+#define DoodadReport(...)
#endif
dWMMap_c *dWMMap_c::instance = 0;
@@ -41,8 +44,6 @@ dWMMap_c::dWMMap_c() {
int dWMMap_c::onCreate() {
renderer.allocator.setup(GameHeaps[0], 0x20);
bool result = renderer.setup(&renderer.allocator);
- // if (result)
- // else
bgMatrix.translation(1140.0f, -2910.0f, -500.0f);
s16 rot = 0x4000;
@@ -141,9 +142,11 @@ void dWMMap_c::renderer_c::beginRendering() {
GXSetVtxDesc(GX_VA_POS, GX_DIRECT);
GXSetVtxDesc(GX_VA_TEX0, GX_DIRECT);
+ // Tiles
GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_POS, GX_POS_XY, GX_S16, 0);
- GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_TEX0, GX_TEX_ST, GX_U8, 8);
+ GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_TEX0, GX_TEX_ST, GX_F32, 0);
+ // Doodads
GXSetVtxAttrFmt(GX_VTXFMT1, GX_VA_POS, GX_POS_XY, GX_F32, 0);
GXSetVtxAttrFmt(GX_VTXFMT1, GX_VA_TEX0, GX_TEX_ST, GX_U8, 8);
@@ -248,19 +251,28 @@ void dWMMap_c::renderer_c::renderTileLayer(dKPLayer_s *layer, dKPLayer_s::sector
s16 worldX = (worldSectorX | inX) * 24;
s16 worldY = -((worldSectorY | inY) * 24);
- u8 tileX = (tileID & 0x1F) * 8;
- u8 tileY = ((tileID & 0x1E0) / 32) * 16;
TileReport("Drawing tile %d at %d,%d\n", tileID, worldX, worldY);
+
+ float tileX = (float)((tileID & 0x1F) * 28);
+ float tileY = (float)(((tileID & 0x1E0) >> 5) * 28);
+
+ float xMult = (1.0f / 896.0f);
+ float yMult = (1.0f / 448.0f);
+
+ float coordX1 = xMult * (tileX + 2.0f);
+ float coordX2 = xMult * (tileX + 26.0f);
+ float coordY1 = yMult * (tileY + 2.0f);
+ float coordY2 = yMult * (tileY + 26.0f);
GXBegin(GX_QUADS, GX_VTXFMT0, 4);
GXPosition2s16(worldX + 24, worldY - 24);
- GXTexCoord2u8(tileX + 7, tileY + 14);
+ GXTexCoord2f32(coordX2, coordY2);
GXPosition2s16(worldX + 24, worldY);
- GXTexCoord2u8(tileX + 7, tileY + 2);
+ GXTexCoord2f32(coordX2, coordY1);
GXPosition2s16(worldX, worldY);
- GXTexCoord2u8(tileX + 1, tileY + 2);
+ GXTexCoord2f32(coordX1, coordY1);
GXPosition2s16(worldX, worldY - 24);
- GXTexCoord2u8(tileX + 1, tileY + 14);//*/
+ GXTexCoord2f32(coordX1, coordY2);
GXEnd();
}
}
diff --git a/src/koopatlas/mapdata.cpp b/src/koopatlas/mapdata.cpp
index eaf9c75..6838741 100644
--- a/src/koopatlas/mapdata.cpp
+++ b/src/koopatlas/mapdata.cpp
@@ -40,7 +40,7 @@ dKPMapData_c::~dKPMapData_c() {
}
bool dKPMapData_c::load(const char *filename) {
- data = (dKPMapFile_s*)m_fileLoader.load(filename);
+ data = (dKPMapFile_s*)m_fileLoader.load(filename, 0, mHeap::archiveHeap);
if (data == 0)
return false;
diff --git a/src/magicplatform.cpp b/src/magicplatform.cpp
index 924d849..e9fa940 100644
--- a/src/magicplatform.cpp
+++ b/src/magicplatform.cpp
@@ -12,6 +12,10 @@ class daEnMagicPlatform_c : public dEn_c {
// Settings
u8 rectID, moveSpeed, moveDirection, moveLength;
+ u8 moveDelay, currentMoveDelay;
+
+ bool doesMoveInfinitely;
+
float moveMin, moveMax, moveDelta, moveBaseDelta;
float *moveTarget;
@@ -41,12 +45,87 @@ daEnMagicPlatform_c *daEnMagicPlatform_c::build() {
return c;
}
+extern "C" void HurtMarioBecauseOfBeingSquashed(void *mario, dStageActor_c *squasher, int type);
+
+static void PhysCB1(daEnMagicPlatform_c *one, dStageActor_c *two) {
+ if (two->stageActorType != 1)
+ return;
+
+ // if left/right
+ if (one->moveDirection <= 1)
+ return;
+
+ if (one->pos_delta.y > 0.0f)
+ HurtMarioBecauseOfBeingSquashed(two, one, 1);
+ else
+ HurtMarioBecauseOfBeingSquashed(two, one, 9);
+}
+
+static void PhysCB2(daEnMagicPlatform_c *one, dStageActor_c *two) {
+ if (two->stageActorType != 1)
+ return;
+
+ // if left/right
+ if (one->moveDirection <= 1)
+ return;
+
+ if (one->pos_delta.y < 0.0f)
+ HurtMarioBecauseOfBeingSquashed(two, one, 2);
+ else
+ HurtMarioBecauseOfBeingSquashed(two, one, 10);
+}
+
+static void PhysCB3(daEnMagicPlatform_c *one, dStageActor_c *two, bool unkMaybeNotBool) {
+ if (two->stageActorType != 1)
+ return;
+
+ // if left/right
+ if (one->moveDirection <= 1)
+ return;
+
+ if (unkMaybeNotBool) {
+ if (one->pos_delta.x > 0.0f)
+ HurtMarioBecauseOfBeingSquashed(two, one, 6);
+ else
+ HurtMarioBecauseOfBeingSquashed(two, one, 12);
+ } else {
+ if (one->pos_delta.x < 0.0f)
+ HurtMarioBecauseOfBeingSquashed(two, one, 5);
+ else
+ HurtMarioBecauseOfBeingSquashed(two, one, 11);
+ }
+}
+
+static bool PhysCB4(daEnMagicPlatform_c *one, dStageActor_c *two) {
+ return (one->pos_delta.y > 0.0f);
+}
+
+static bool PhysCB5(daEnMagicPlatform_c *one, dStageActor_c *two) {
+ return (one->pos_delta.y < 0.0f);
+}
+
+static bool PhysCB6(daEnMagicPlatform_c *one, dStageActor_c *two, bool unkMaybeNotBool) {
+ if (unkMaybeNotBool) {
+ if (one->pos_delta.x > 0.0f)
+ return true;
+ } else {
+ if (one->pos_delta.x < 0.0f)
+ return true;
+ }
+ return false;
+}
+
int daEnMagicPlatform_c::onCreate() {
rectID = settings & 0xFF;
+
moveSpeed = (settings & 0xF00) >> 8;
moveDirection = (settings & 0x3000) >> 12;
moveLength = ((settings & 0xF0000) >> 16) + 1;
+ moveDelay = ((settings & 0xF00000) >> 20) * 6;
+
+ doesMoveInfinitely = (settings & 0x10000000);
+
setupMovement();
findSourceArea();
@@ -56,7 +135,11 @@ int daEnMagicPlatform_c::onCreate() {
float fHeight = height * 16.0f;
physics.setup(this,
0.0f, 0.0f, fWidth, -fHeight,
- 0, 0, 0/*&PhysCB1, &PhysCB2, &PhysCB3*/, 1, 0, 0);
+ &PhysCB1, &PhysCB2, &PhysCB3, 1, 0, 0);
+
+ physics.callback1 = &PhysCB4;
+ physics.callback2 = &PhysCB5;
+ physics.callback3 = &PhysCB6;
physics.addToList();
@@ -77,6 +160,9 @@ int daEnMagicPlatform_c::onExecute() {
updateTilePositions();
physics.update();
+ if (doesMoveInfinitely)
+ checkZoneBoundaries(0);
+
return 1;
}
@@ -119,6 +205,8 @@ void daEnMagicPlatform_c::setupMovement() {
} else {
isMoving = false;
}
+
+ currentMoveDelay = 0;
}
void daEnMagicPlatform_c::handleMovement() {
@@ -145,12 +233,21 @@ void daEnMagicPlatform_c::handleMovement() {
if (!isMoving)
return;
+ if (currentMoveDelay > 0) {
+ currentMoveDelay--;
+ return;
+ }
+
// Do it
bool goesForward = (moveDelta > 0.0f);
bool reachedEnd = false;
*moveTarget += moveDelta;
+ // if we're set to move infinitely, never stop
+ if (doesMoveInfinitely)
+ return;
+
if (goesForward) {
if (*moveTarget >= moveMax) {
*moveTarget = moveMax;
@@ -175,6 +272,7 @@ void daEnMagicPlatform_c::handleMovement() {
} else {
// Otherwise, reverse
moveDelta = -moveDelta;
+ currentMoveDelay = moveDelay;
}
}
}
diff --git a/src/prolog.S b/src/prolog.S
index 38bcb6b..e86bfa3 100644
--- a/src/prolog.S
+++ b/src/prolog.S
@@ -61,7 +61,7 @@ startLoop:
.data
PMsg:
- .string "Newer Super Mario Bros. Wii - Hacks by Treeki and Tempus 2009-2011\n.ctors: %p - %p\n"
+ .string "Newer Super Mario Bros. Wii - Hacks by Treeki and Tempus 2009-2012\n.ctors: %p - %p\n"
PMsg2:
.string "%d inits called\n"
diff --git a/tools/dumprelocs.py b/tools/dumprelocs.py
new file mode 100644
index 0000000..d5773e3
--- /dev/null
+++ b/tools/dumprelocs.py
@@ -0,0 +1,19 @@
+import struct
+up = struct.Struct('>II').unpack
+u32 = struct.Struct('>I').unpack
+
+data = open('NewerASM/pal_dlrelocs.bin', 'rb').read()
+addr_offset = struct.unpack('>xxxxxxxxI', data[0:0xC])[0] - 0xC
+data = data[0xC:]
+
+reloc_count = addr_offset / 8
+
+for i in xrange(reloc_count):
+ entry = up(data[i*8:i*8+8])
+ reltype = entry[0] >> 24
+ addr_id = entry[0] & 0xFFFFFF
+ offset = entry[1]
+
+ offs = addr_offset+(addr_id*4)
+ print "%2d: %08x => %08x" % (reltype, offset, u32(data[offs:offs+4])[0])
+
diff --git a/tools/hooks.py b/tools/hooks.py
index 13c4e19..388efcb 100755
--- a/tools/hooks.py
+++ b/tools/hooks.py
@@ -3,14 +3,18 @@ import struct
u32 = struct.Struct('>I')
+BRANCH_TYPES = ['b', 'bl', 'ba', 'bla']
def make_branch_insn(fromAddr, toAddr, branchType):
- branchTypes = ['b', 'bl', 'ba', 'bla']
- if branchType not in branchTypes:
+ if branchType not in BRANCH_TYPES:
raise ValueError, 'invalid branch type: %s' % branchType
- extra = branchTypes.index(branchType)
+ extra = BRANCH_TYPES.index(branchType)
- distance = toAddr - fromAddr
+ if toAddr == -1:
+ distance = 0 # placeholder, will be added later by relocs
+ else:
+ distance = toAddr - fromAddr
+
if distance >= 0x2000000 or distance <= -0x2000000:
raise ValueError, 'branching too far: %08x to %08x' % (fromAddr, toAddr)
@@ -44,7 +48,7 @@ class Hook(object):
self.context.hooks.append(self)
# validate the hook's data
- current_config_name = builder._config_short_name
+ current_config_name = builder.config_short_name
for field in self.required_data:
field = field.replace('%CONFIG%', current_config_name)
@@ -65,7 +69,7 @@ class BasicPatchHook(Hook):
Hook.__init__(self, builder, module, data)
def create_patches(self):
- addr = self.data['addr_%s' % self.builder._config_short_name]
+ addr = self.data['addr_%s' % self.builder.config_short_name]
hex_data = self.data['data']
@@ -75,7 +79,7 @@ class BasicPatchHook(Hook):
patch = binascii.unhexlify(hex_data)
- self.builder._add_patch(addr, patch)
+ self.builder.add_patch(addr, patch)
@@ -91,19 +95,23 @@ class BranchInsnHook(Hook):
try:
target_func = self.data['target_func']
except KeyError:
- target_func = self.data['target_func_%s' % self.builder._config_short_name]
-
- if isinstance(target_func, str):
- target_func = self.builder._find_func_by_symbol(target_func)
+ target_func = self.data['target_func_%s' % self.builder.config_short_name]
+
+ src_addr = self.data['src_addr_%s' % self.builder.config_short_name]
+ is_symbol_name = isinstance(target_func, str)
+
+ if is_symbol_name:
+ target_func = self.builder.find_func_by_symbol(target_func)
+
+ if is_symbol_name and self.builder.dynamic_link:
+ branch_insn = make_branch_insn(src_addr, -1, self.data['branch_type'])
+ self.builder.add_patch(src_addr, u32.pack(branch_insn))
+
+ dylink = self.builder.dynamic_link
+ dylink.add_reloc(dylink.R_PPC_REL24, src_addr, target_func)
else:
- # assume it's an address
- pass
-
-
- src_addr = self.data['src_addr_%s' % self.builder._config_short_name]
- branch_insn = make_branch_insn(src_addr, target_func, self.data['branch_type'])
-
- self.builder._add_patch(src_addr, u32.pack(branch_insn))
+ branch_insn = make_branch_insn(src_addr, target_func, self.data['branch_type'])
+ self.builder.add_patch(src_addr, u32.pack(branch_insn))
@@ -119,18 +127,19 @@ class AddFunctionPointerHook(Hook):
try:
target_func = self.data['target_func']
except KeyError:
- target_func = self.data['target_func_%s' % self.builder._config_short_name]
-
- if isinstance(target_func, str):
- target_func = self.builder._find_func_by_symbol(target_func)
+ target_func = self.data['target_func_%s' % self.builder.config_short_name]
+
+ src_addr = self.data['src_addr_%s' % self.builder.config_short_name]
+ is_symbol_name = isinstance(target_func, str)
+
+ if is_symbol_name:
+ target_func = self.builder.find_func_by_symbol(target_func)
+
+ if is_symbol_name and self.builder.dynamic_link:
+ dylink = self.builder.dynamic_link
+ dylink.add_reloc(dylink.R_PPC_ADDR32, src_addr, target_func)
else:
- # assume it's an address
- pass
-
-
- src_addr = self.data['src_addr_%s' % self.builder._config_short_name]
-
- self.builder._add_patch(src_addr, u32.pack(target_func))
+ self.builder.add_patch(src_addr, u32.pack(target_func))
@@ -143,7 +152,7 @@ class NopInsnHook(Hook):
Hook.__init__(self, builder, module, data)
def create_patches(self):
- area = self.data['area_%s' % self.builder._config_short_name]
+ area = self.data['area_%s' % self.builder.config_short_name]
if isinstance(area, list):
addr, end = area
@@ -153,7 +162,7 @@ class NopInsnHook(Hook):
addr = area
nop_patch = '\x60\x00\x00\x00'
- self.builder._add_patch(addr, nop_patch)
+ self.builder.add_patch(addr, nop_patch)
diff --git a/tools/kamek.py b/tools/kamek.py
index 97b02cf..43b4556 100644
--- a/tools/kamek.py
+++ b/tools/kamek.py
@@ -1,12 +1,12 @@
#!/usr/bin/env python
# Kamek - build tool for custom C++ code in New Super Mario Bros. Wii
-# All rights reserved (c) Treeki 2010
-# Some function definitions by megazig
+# All rights reserved (c) Treeki 2010 - 2012
+# Header files compiled by Treeki, Tempus and megazig
-# Requires PyYAML
+# Requires PyYAML and pyelftools
-version_str = 'Kamek 0.1 by Treeki'
+version_str = 'Kamek 0.2 by Treeki'
import binascii
import os
@@ -18,6 +18,8 @@ import sys
import tempfile
import yaml
+import elftools.elf.elffile
+
import hooks
u32 = struct.Struct('>I')
@@ -151,6 +153,78 @@ def generate_kamek_patches(patchlist):
return kamekpatch
+class DyLinkCreator(object):
+ R_PPC_ADDR32 = 1
+ R_PPC_ADDR16_LO = 4
+ R_PPC_ADDR16_HI = 5
+ R_PPC_ADDR16_HA = 6
+ R_PPC_REL24 = 10
+
+ VALID_RELOCS = set([1, 4, 5, 6, 10])
+
+ def __init__(self):
+ self._relocs = []
+
+ self._targets = []
+ self._target_lookups = {}
+
+ self.elf = None
+
+ def set_elf(self, stream):
+ if self.elf != None:
+ raise ValueError('ELF already set')
+
+ self.elf = elftools.elf.elffile.ELFFile(stream)
+ self.code = self.elf.get_section_by_name('.text').data()
+
+ self._add_relocs(self.elf.get_section_by_name('.rela.text'))
+
+ def _add_relocs(self, section):
+ sym_values = {}
+ sym_section = self.elf.get_section_by_name('.symtab')
+
+ for reloc in section.iter_relocations():
+ entry = reloc.entry
+ #print entry
+
+ sym_id = entry['r_info_sym']
+ try:
+ sym_value = sym_values[sym_id]
+ except KeyError:
+ sym = sym_section.get_symbol(sym_id)
+ sym_value = sym.entry['st_value']
+ sym_values[sym_id] = sym_value
+ #print hex(sym_value)
+
+ self.add_reloc(entry['r_info_type'], entry['r_offset'], sym_value+entry['r_addend'])
+
+ def add_reloc(self, reltype, addr, target):
+ if reltype not in self.VALID_RELOCS:
+ raise ValueError('Unknown/unsupported rel type: %d (%x => %x)' % (reltype, addr, target))
+
+ try:
+ target_id = self._target_lookups[target]
+ except KeyError:
+ target_id = len(self._targets)
+ self._target_lookups[target] = target_id
+ self._targets.append(target)
+
+ self._relocs.append((reltype, addr, target_id))
+
+ def build_reloc_data(self):
+ header_struct = struct.Struct('>8sI')
+
+ rel_struct_pack = struct.Struct('>II').pack
+ target_struct_pack = struct.Struct('>I').pack
+
+ rel_data = map(lambda x: rel_struct_pack((x[0] << 24) | x[2], x[1]), self._relocs)
+ target_data = map(target_struct_pack, self._targets)
+
+ header = header_struct.pack('NewerREL', 12 + (len(self._relocs) * 8))
+
+ return header + ''.join(rel_data) + ''.join(target_data)
+
+
class KamekModule(object):
_requiredFields = ['source_files']
@@ -195,6 +269,11 @@ class KamekBuilder(object):
self._configTempDir = tempfile.mkdtemp()
print_debug('Temp files for this configuration are in: '+self._configTempDir)
+
+ if 'dynamic_link' in self._config and self._config['dynamic_link']:
+ self.dynamic_link = DyLinkCreator()
+ else:
+ self.dynamic_link = None
self._builtCodeAddr = 0x80001800
if 'code_address' in self.project.data:
@@ -214,6 +293,9 @@ class KamekBuilder(object):
self._compile_modules()
self._link()
self._read_symbol_map()
+
+ if self.dynamic_link:
+ self.dynamic_link.set_elf(open(self._outFile, 'rb'))
for hook in self._hooks:
hook.create_patches()
@@ -238,7 +320,7 @@ class KamekBuilder(object):
print_debug('---')
print_debug('Building for configuration: '+config['friendly_name'])
- self._config_short_name = config['short_name']
+ self.config_short_name = config['short_name']
self._rel_area = (config['rel_area_start'], config['rel_area_end'])
@@ -338,14 +420,20 @@ class KamekBuilder(object):
print_debug('---')
print_debug('Linking project')
- self._mapFile = '%s/%s_linkmap.map' % (self._outDir, self._config_short_name)
- self._outFile = '%s/%s_out.bin' % (self._outDir, self._config_short_name)
+ self._mapFile = '%s/%s_linkmap.map' % (self._outDir, self.config_short_name)
+ outname = 'object.plf' if self.dynamic_link else 'object.bin'
+ self._outFile = '%s/%s_%s' % (self._outDir, self.config_short_name, outname)
ld_command = ['%s%s-ld' % (gcc_path, gcc_type), '-L.']
ld_command.append('-o')
ld_command.append(self._outFile)
- ld_command.append('-Ttext')
- ld_command.append('0x%08X' % self._builtCodeAddr)
+ if self.dynamic_link:
+ ld_command.append('-r')
+ ld_command.append('--oformat=elf32-powerpc')
+ else:
+ ld_command.append('--oformat=binary')
+ ld_command.append('-Ttext')
+ ld_command.append('0x%08X' % self._builtCodeAddr)
ld_command.append('-T')
ld_command.append(self._config['linker_script'])
ld_command.append('-Map')
@@ -429,7 +517,7 @@ class KamekBuilder(object):
print_debug('Generated code is at 0x%08X .. 0x%08X' % (self._codeStart, self._codeEnd - 4))
- def _find_func_by_symbol(self, find_symbol):
+ def find_func_by_symbol(self, find_symbol):
for sym in self._symbols:
#if show_cmd:
# out = "0x%08x - %s - %s" % (sym[0], sym[1], sym[2])
@@ -440,7 +528,7 @@ class KamekBuilder(object):
raise ValueError, 'Cannot find function: %s' % find_symbol
- def _add_patch(self, offset, data):
+ def add_patch(self, offset, data):
if offset >= self._rel_area[0] and offset <= self._rel_area[1] and use_rels:
self._rel_patches.append((offset, data))
else:
@@ -457,13 +545,24 @@ class KamekBuilder(object):
#self._patches.append((0x817F4800, kamekpatch))
self._patches.append((0x80002F60, kamekpatch))
- # add the outfile as a patch
- file = open(self._outFile, 'rb')
- patch = (self._codeStart, file.read())
- file.close()
-
- self._patches.append(patch)
-
+ if self.dynamic_link:
+ # put together the dynamic link files
+ dlcode = open('%s/%s_dlcode.bin' % (self._outDir, self._config['short_name']), 'wb')
+ dlcode.write(self.dynamic_link.code)
+ dlcode.close()
+
+ dlrelocs = open('%s/%s_dlrelocs.bin' % (self._outDir, self._config['short_name']), 'wb')
+ dlrelocs.write(self.dynamic_link.build_reloc_data())
+ dlrelocs.close()
+
+ else:
+ # add the outfile as a patch if not using dynamic linking
+ file = open(self._outFile, 'rb')
+ patch = (self._codeStart, file.read())
+ file.close()
+
+ self._patches.append(patch)
+
# generate a Riivolution patch
riiv = open('%s/%s_riiv.xml' % (self._outDir, self._config['short_name']), 'w')
for patch in self._patches: