summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorColin Noga <Tempus@chronometry.ca>2012-03-20 17:03:19 -0500
committerColin Noga <Tempus@chronometry.ca>2012-03-20 17:03:19 -0500
commita550f21ec661ddd8771a9c779f2b784209fee1f9 (patch)
treeb6afe90fa01765019f0aad4e8068970c2ec36ae8
parent58b4ab236f6e4b0b5c4cf8384a3a8be299c86623 (diff)
downloadkamek-a550f21ec661ddd8771a9c779f2b784209fee1f9.tar.gz
kamek-a550f21ec661ddd8771a9c779f2b784209fee1f9.zip
Added challenge star, clown car junk, bowser improvements, some fixes here and there, and a roll your own model sprite for skawo.
Diffstat (limited to '')
-rw-r--r--NewerProject.yaml2
-rw-r--r--bossCaptainBowser.yaml69
-rw-r--r--challengeStar.yaml17
-rw-r--r--kamek_pal.x10
-rw-r--r--makeYourOwn.yaml17
-rw-r--r--src/bossCaptainBowser.cpp81
-rw-r--r--src/bossFlameThrower.cpp291
-rw-r--r--src/bossKoopaThrow.cpp37
-rw-r--r--src/bossPlayerClown.cpp60
-rw-r--r--src/challengeStar.cpp130
-rwxr-xr-xsrc/growup.s4
-rw-r--r--src/levelspecial.cpp18
-rw-r--r--src/makeYourOwnModelSprite.cpp300
13 files changed, 720 insertions, 316 deletions
diff --git a/NewerProject.yaml b/NewerProject.yaml
index c8b836a..b2c9693 100644
--- a/NewerProject.yaml
+++ b/NewerProject.yaml
@@ -47,5 +47,7 @@ modules:
- processed/meteor.yaml
- processed/topman.yaml
- processed/electricLine.yaml
+ - processed/makeYourOwn.yaml
+ - processed/challengeStar.yaml
# - processed/pengi.yaml
# - processed/actorlog.yaml
diff --git a/bossCaptainBowser.yaml b/bossCaptainBowser.yaml
index 5ef0ea0..0583af0 100644
--- a/bossCaptainBowser.yaml
+++ b/bossCaptainBowser.yaml
@@ -1,10 +1,10 @@
---
-# Captain Bowser Replaces Mask
+# Captain Bowser Replaces Branch
#
# KoopaThrow = WM_ANCHOR
-# FlameThrower = WM_ANTLION_MGR
+# FlameThrower = WM_ANTLION
-source_files: [../src/bossCaptainBowser.cpp, ../src/bossKoopaThrow.cpp, ../src/bossFlameThrower.cpp]
+source_files: [../src/bossPlayerClown.cpp, ../src/bossCaptainBowser.cpp, ../src/bossKoopaThrow.cpp, ../src/bossFlameThrower.cpp]
hooks:
- name: BossCaptainBoswerBuild
@@ -12,6 +12,14 @@ hooks:
src_addr_pal: 0x80955978
target_func: 'daCaptainBowser::build(void)'
+ - name: UpdateaptainBoswerSpriteInfo
+ type: patch
+ addr_pal: 0x8030C4AC
+ # [010] ( 16, 16) ( 0, 0 32: 32) 64? 64? 0? 0? | [0:No Flags]
+ data: '0002 0000'
+ # 0x8030A340 + sprite num * 0x28 == offset (+24 in this case)
+
+
- name: KoopaThrowBuild
type: add_func_pointer
src_addr_pal: 0x80981960
@@ -26,7 +34,7 @@ hooks:
- name: KFlameThrowerBuild
type: add_func_pointer
- src_addr_pal: 0x80981BD4
+ src_addr_pal: 0x80981A3C
target_func: 'daKoopaBreath::build(void)'
- name: UpdateKoopaThrowSpriteInfo
@@ -35,3 +43,56 @@ hooks:
# [011] ( 16, 16) ( 0, 0 32: 32) 64? 64? 0? 0? | [0:No Flags]
data: '0271 0000 00000010 00000010 00000000 00000000 00000020 00000020 0040 0040 0000 0000 0000 0000'
# 0x8030A340 + sprite num * 0x28 == offset
+
+
+
+ - name: ClownCarFloor
+ type: patch
+ addr_pal: 0x80810A40
+ data: '60000000'
+
+ - name: ClownCarWalls
+ type: patch
+ addr_pal: 0x80937A60
+ data: '471C4000'
+
+ - name: ClownCarAllocation
+ type: patch
+ addr_pal: 0x8080F918
+ data: '38600FD0' # Replace 0x0FD0 which how much space I want to allocate
+
+
+
+ # Official Funcs
+ # - name: ClownCarCtor
+ # type: branch_insn
+ # branch_type: bl
+ # src_addr_pal: 0x8080F92C
+ # target_func: 'newClownCtor(dEn_c *clown)'
+
+ # - name: ClownCarDtor
+ # type: add_func_pointer
+ # src_addr_pal: 0x809602A8
+ # target_func: 'newClownDtor(dEn_c *clown, u32 willDelete)'
+
+
+ # # My overrides
+ # - name: ClownCarMoveExecute
+ # type: add_func_pointer
+ # src_addr_pal: 0x80960184
+ # target_func: 'CConExecuteMove(dEn_c *clown)'
+
+ # - name: ClownCarAfterCreate
+ # type: add_func_pointer
+ # src_addr_pal: 0x8095FEF8
+ # target_func: 'CCafterCreate(dEn_c *clown)'
+
+ # - name: ClownCarOnExecute
+ # type: add_func_pointer
+ # src_addr_pal: 0x8095FF08
+ # target_func: 'CConExecute(dEn_c *clown)'
+
+ # - name: ClownCarOnDraw
+ # type: add_func_pointer
+ # src_addr_pal: 0x8095FF14
+ # target_func: 'CConDraw(dEn_c *clown)'
diff --git a/challengeStar.yaml b/challengeStar.yaml
new file mode 100644
index 0000000..8164043
--- /dev/null
+++ b/challengeStar.yaml
@@ -0,0 +1,17 @@
+---
+# Replaces WM_Kuribo
+
+source_files: [../src/challengeStar.cpp]
+hooks:
+ - name: ChallengeStarBuild
+ type: add_func_pointer
+ src_addr_pal: 0x8098872C
+ target_func: 'dChallengeStar::build(void)'
+
+ - name: UpdateModelSpriteInfo
+ type: patch
+ # 0x8030A340 + sprite num * 0x28 == offset
+ addr_pal: 0x8030A520
+ # -ID- ---- -X Offs- -Y Offs- -RectX1- -RectY1- -RectX2- -RectY2- -1C- -1E- -20- -22- Flag ----
+ # Orig 01FC 0000 00000008 00000000 00000000 FFFFFFC0 00000010 00000040 0030 0030 0000 0000 0008 0000
+ data: '028F 0000 00000000 00000000 00000000 00000000 00000040 00000010 0000 0000 0000 0000 0000 0000'
diff --git a/kamek_pal.x b/kamek_pal.x
index 4e979e3..18b4a8b 100644
--- a/kamek_pal.x
+++ b/kamek_pal.x
@@ -5,6 +5,16 @@ OUTPUT_FORMAT ("binary")
}*/
SECTIONS {
+
+/* Scrolling is annoying, clown car goes here! */
+
+ __ct__20daJrClownForPlayer_cFv = 0x8080F910;
+ __dt__20daJrClownForPlayer_cFv = 0x80810500; /* Or 0x80810540 maybe, beans if I know */
+
+
+
+/* Back to other shit I didn't want to scroll for */
+
GlobalTickCount = 0x8042A648;
GetSpecificPlayerActor = 0x8005F900;
diff --git a/makeYourOwn.yaml b/makeYourOwn.yaml
new file mode 100644
index 0000000..6309b88
--- /dev/null
+++ b/makeYourOwn.yaml
@@ -0,0 +1,17 @@
+---
+# Replaces WM_KoopaCastle
+
+source_files: [../src/makeYourOwnModelSprite.cpp]
+hooks:
+ - name: BuildYourOwnModel
+ type: add_func_pointer
+ src_addr_pal: 0x80988574
+ target_func: 'dMakeYourOwn::build(void)'
+
+ - name: UpdateModelSpriteInfo
+ type: patch
+ # 0x8030A340 + sprite num * 0x28 == offset
+ addr_pal: 0x8030A4F8
+ # -ID- ---- -X Offs- -Y Offs- -RectX1- -RectY1- -RectX2- -RectY2- -1C- -1E- -20- -22- Flag ----
+ # Orig 01FC 0000 00000008 00000000 00000000 FFFFFFC0 00000010 00000040 0030 0030 0000 0000 0008 0000
+ data: '029E 0000 00000000 00000000 FFFFFC00 FFFFFC00 00000400 00000400 0400 0400 0000 0000 0008 0000'
diff --git a/src/bossCaptainBowser.cpp b/src/bossCaptainBowser.cpp
index 710af77..6152b42 100644
--- a/src/bossCaptainBowser.cpp
+++ b/src/bossCaptainBowser.cpp
@@ -5,12 +5,34 @@
#include <stage.h>
#include "boss.h"
+
+
+const char* effects_name_list [] = {
+ "Wm_jr_electricline", // cool
+ "Wm_jr_fireattack", // cool
+ "Wm_jr_firehit", // cool
+ "Wm_jr_fireplace", // cool
+ "Wm_jr_fireplace_ind", // cool
+ "Wm_jr_shot",
+ "Wm_jr_sweat",
+ "Wm_ko_fireattack", // cool
+ "Wm_ko_firehit", // cool
+ "Wm_ko_firehitdie01", // cool
+ "Wm_ko_firehitdie02", // cool
+ "Wm_ko_firehitdie03", // cool
+ "Wm_ko_magmapocha",
+ "Wm_ko_magmapochabig",
+ "Wm_ko_shout", // cool
+ "Wm_ko_shout02", // cool
+ "Wm_seacloudout", // cool
+};
+
+
+
void ShipPhysicsCallback(daBoss *self, dStageActor_c *other) {
- OSReport("Physics");
if (other->name == EN_CANNON_BULLET) {
}
-
}
@@ -32,9 +54,12 @@ public:
m3d::anmChr_c shipAnm;
Physics ShipPhysics;
+ ActivePhysics Roar;
+ mEf::es2 effect;
char isAngry;
char isInvulnerable;
+ float scaleIncreaser;
// int isInvulnerableCountdown;
// int isTurningCountdown;
// char charging;
@@ -182,6 +207,25 @@ int daCaptainBowser::onCreate() {
this->aPhysics.addToList();
+
+ // Roar Physics!
+ ActivePhysics::Info RoarStruct;
+ RoarStruct.xDistToCenter = -186.0;
+ RoarStruct.yDistToCenter = 138.0;
+
+ RoarStruct.xDistToEdge = 20.0;
+ RoarStruct.yDistToEdge = 20.0;
+
+ RoarStruct.category1 = 0x3;
+ RoarStruct.category2 = 0x0;
+ RoarStruct.bitfield1 = 0x4F;
+ RoarStruct.bitfield2 = 0x8028E;
+ RoarStruct.unkShort1C = 0;
+ RoarStruct.callback = &dEn_c::collisionCallback;
+
+ this->Roar.initWithStruct(this, &RoarStruct);
+
+
// State Changers
doStateChange(&StateID_Wait);
@@ -196,6 +240,8 @@ int daCaptainBowser::onExecute() {
acState.execute();
this->ShipPhysics.update();
+ PlaySound(this, SE_BOSS_SHIP_PRPL);
+
bodyModel._vf1C();
shipModel._vf1C();
@@ -265,6 +311,9 @@ int daCaptainBowser::onDraw() {
if (num == 0) {
doStateChange(&StateID_Fire);
}
+ else if (num == 1) {
+ doStateChange(&StateID_Roar);
+ }
else{
doStateChange(&StateID_Throw);
}
@@ -320,8 +369,9 @@ int daCaptainBowser::onDraw() {
}
void daCaptainBowser::executeState_Fire() {
- if (this->chrAnimation.getCurrentFrame() == 70) { // spit fire
- CreateActor(KOOPA_FIRE, 0x30, (Vec){pos.x-156.0, pos.y+128.0, pos.z}, 0, 0); // Seems like nyb 5 has a setting, 2 bits long, maybe.
+ if (this->chrAnimation.getCurrentFrame() == 70.5) { // spit fire
+ PlaySound(this, SE_BOSS_KOOPA_L_FIRE_SHOT);
+ CreateActor(WM_ANTLION, 0, (Vec){pos.x-172.0, pos.y+152.0, pos.z}, 0, 0);
}
if (this->chrAnimation.isAnimationDone()) {
@@ -349,11 +399,30 @@ int daCaptainBowser::onDraw() {
void daCaptainBowser::beginState_Roar() {
bindAnimChr_and_setUpdateRate("kp_roar3", 1, 0.0, 1.0);
this->isInvulnerable = 1;
+ this->timer = 0;
+ this->scaleIncreaser = 0.5;
+
+ this->Roar.info.xDistToEdge = 70.0 * scaleIncreaser;
+ this->Roar.info.yDistToEdge = 70.0 * scaleIncreaser;
+ this->Roar.addToList();
}
void daCaptainBowser::executeState_Roar() {
+
if (this->chrAnimation.getCurrentFrame() == 53.0) { // This is where the smackdown starts
- SpawnEffect("Wm_ob_itemget_ring", 0, &this->pos, &(S16Vec){0,0,0}, &(Vec){1.0, 1.0, 1.0});
+ PlaySound(this, SE_VOC_KP_L_SHOUT);
+ }
+
+ if (this->chrAnimation.getCurrentFrame() > 53.0) { // This is where the smackdown starts
+ scaleIncreaser += 0.014285;
+ effect.spawn("Wm_ko_shout", 0, &(Vec){pos.x-186.0+(scaleIncreaser*16.0), pos.y+138.0+(scaleIncreaser*16.0), pos.z}, &(S16Vec){0,0,0}, &(Vec){scaleIncreaser, scaleIncreaser, scaleIncreaser});
+
+ this->Roar.info.xDistToEdge = 70.0 * scaleIncreaser;
+ this->Roar.info.yDistToEdge = 70.0 * scaleIncreaser;
+ }
+
+ if (this->chrAnimation.getCurrentFrame() == 197.0) { // This is where the smackdown ends
+ this->Roar.removeFromList();
}
if (this->chrAnimation.isAnimationDone()) {
@@ -375,6 +444,8 @@ int daCaptainBowser::onDraw() {
bindAnimChr_and_setUpdateRate("grow_big", 1, 0.0, 1.0);
this->isInvulnerable = 1;
this->chrAnimation.setCurrentFrame(9.0);
+
+ PlaySound(this, SE_VOC_KP_DAMAGE_HPDP);
}
void daCaptainBowser::executeState_Damage() {
diff --git a/src/bossFlameThrower.cpp b/src/bossFlameThrower.cpp
index 70583fd..3a77621 100644
--- a/src/bossFlameThrower.cpp
+++ b/src/bossFlameThrower.cpp
@@ -7,69 +7,17 @@
class daKoopaBreath : public dEn_c {
int onCreate();
int onExecute();
- int onDelete();
- int onDraw();
-
- mHeapAllocator_c allocator;
- m3d::mdl_c bodyModel;
-
- int timer;
- char Kaboom;
- char direction;
- char front;
- float ymod;
- int lifespan;
- u32 cmgr_returnValue;
+ mEf::es2 effect;
static daKoopaBreath *build();
- void updateModelMatrices();
void playerCollision(ActivePhysics *apThis, ActivePhysics *apOther);
-
- void collisionCat1_Fireball_E_Explosion(ActivePhysics *apThis, ActivePhysics *apOther);
- bool collisionCat2_IceBall_15_YoshiIce(ActivePhysics *apThis, ActivePhysics *apOther);
- void collisionCat9_RollingObject(ActivePhysics *apThis, ActivePhysics *apOther);
- void collisionCat13_Hammer(ActivePhysics *apThis, ActivePhysics *apOther);
- void collisionCat14_YoshiFire(ActivePhysics *apThis, ActivePhysics *apOther);
- void collisionCat7_WMWaggleWater(ActivePhysics *apThis, ActivePhysics *apOther);
-
-
- USING_STATES(daKoopaBreath);
- DECLARE_STATE(Straight);
- DECLARE_STATE(Kaboom);
+ void spriteCollision(ActivePhysics *apThis, ActivePhysics *apOther);
};
-CREATE_STATE(daKoopaBreath, Straight);
-CREATE_STATE(daKoopaBreath, Kaboom);
-
-
-extern "C" void *PlayWrenchSound(dEn_c *);
-
-
void daKoopaBreath::playerCollision(ActivePhysics *apThis, ActivePhysics *apOther) { DamagePlayer(this, apThis, apOther); }
-
-void daKoopaBreath::collisionCat1_Fireball_E_Explosion(ActivePhysics *apThis, ActivePhysics *apOther) { }
-bool daKoopaBreath::collisionCat2_IceBall_15_YoshiIce(ActivePhysics *apThis, ActivePhysics *apOther) {
- return false;
-}
-void daKoopaBreath::collisionCat9_RollingObject(ActivePhysics *apThis, ActivePhysics *apOther) {}
-void daKoopaBreath::collisionCat13_Hammer(ActivePhysics *apThis, ActivePhysics *apOther) {
- SpawnEffect("Wm_ob_cmnboxgrain", 0, &this->pos, &(S16Vec){0,0,0}, &(Vec){0.5, 0.5, 0.5});
-
- PlaySoundAsync(this, SE_BOSS_JR_FLOOR_BREAK);
- this->Delete(1);
-}
-void daKoopaBreath::collisionCat14_YoshiFire(ActivePhysics *apThis, ActivePhysics *apOther) {}
-void daKoopaBreath::collisionCat7_WMWaggleWater(ActivePhysics *apThis, ActivePhysics *apOther) {
- this->_vf220(apOther->owner);
-
- SpawnEffect("Wm_ob_cmnboxgrain", 0, &this->pos, &(S16Vec){0,0,0}, &(Vec){0.5, 0.5, 0.5});
-
- PlaySoundAsync(this, SE_BOSS_JR_FLOOR_BREAK);
- this->Delete(1);
-}
-
+void daKoopaBreath::spriteCollision(ActivePhysics *apThis, ActivePhysics *apOther) {}
daKoopaBreath *daKoopaBreath::build() {
@@ -80,234 +28,43 @@ daKoopaBreath *daKoopaBreath::build() {
int daKoopaBreath::onCreate() {
- allocator.link(-1, GameHeaps[0], 0, 0x20);
-
- nw4r::g3d::ResFile rf(getResource("choropoo", "g3d/choropoo.brres"));
- bodyModel.setup(rf.GetResMdl("spanner"), &allocator, 0x224, 1, 0);
- SetupTextures_Enemy(&bodyModel, 0);
-
- allocator.unlink();
-
-
- this->direction = this->settings & 0xF;
- this->Kaboom = (this->settings >> 4) & 0xF;
- this->front = (this->settings >> 8) & 0xF;
-
- ActivePhysics::Info HitMeBaby;
-
- if (this->Kaboom == 0) {
- HitMeBaby.xDistToCenter = 0.0;
- HitMeBaby.yDistToCenter = 0.0;
- HitMeBaby.xDistToEdge = 5.0;
- HitMeBaby.yDistToEdge = 5.0;
-
- this->scale.x = 1.25;
- this->scale.y = 1.25;
- this->scale.z = 1.25;
- }
-
- else {
- HitMeBaby.xDistToCenter = 0.0;
- HitMeBaby.yDistToCenter = 0.0;
- HitMeBaby.xDistToEdge = 8.0;
- HitMeBaby.yDistToEdge = 8.0;
+ OSReport("Made a fireball");
+ ActivePhysics::Info GreatBalls;
- this->scale.x = 2.0;
- this->scale.y = 2.0;
- this->scale.z = 2.0;
- }
+ GreatBalls.xDistToCenter = 0.0;
+ GreatBalls.yDistToCenter = 18.0;
+ GreatBalls.xDistToEdge = 38.0;
+ GreatBalls.yDistToEdge = 38.0;
- HitMeBaby.category1 = 0x3;
- HitMeBaby.category2 = 0x0;
- HitMeBaby.bitfield1 = 0x47;
- HitMeBaby.bitfield2 = 0xFFFFFFFF;
- HitMeBaby.unkShort1C = 0;
- HitMeBaby.callback = &dEn_c::collisionCallback;
-
- this->aPhysics.initWithStruct(this, &HitMeBaby);
+ GreatBalls.category1 = 0x3;
+ GreatBalls.category2 = 0x0;
+ GreatBalls.bitfield1 = 0x47;
+ GreatBalls.bitfield2 = 0xFFFFFFFF;
+ GreatBalls.unkShort1C = 0;
+ GreatBalls.callback = &dEn_c::collisionCallback;
+
+ this->aPhysics.initWithStruct(this, &GreatBalls);
this->aPhysics.addToList();
-
-
- spriteSomeRectX = 5.0f;
- spriteSomeRectY = 5.0f;
- _320 = 0.0f;
- _324 = 5.0f;
-
- // These structs tell stupid collider what to collide with - these are from koopa troopa
- static const u8 one[16] = {0,0,0,1, 0,0,0xC0,0, 0,0,0x40,0, 0,0,0,0};
- static const u8 two[12] = {0,0,0,0, 0,0,0,0, 0,0,0xC0,0};
- static const u8 three[16] = {0,0,0,1, 0,0,0x60,0, 0,0,0x90,0, 0,0,0x60,0};
-
- collMgr.Init(this, one, two, three);
- collMgr.execute();
-
- cmgr_returnValue = collMgr.CollidedWithTile();
-
-
- if (this->direction == 0) { // Ground Facing Left
- this->pos.x -= 0.0; // -32 to +32
- this->pos.y += 36.0;
- this->rot.z = 0x2000;
- }
- else if (this->direction == 1) { // Ground Facing Right
- this->pos.x += 0.0; // +32 to -32
- this->pos.y += 36.0;
- this->rot.z = 0xE000;
- }
- if (this->front == 1) { this->pos.z = -1804.0; }
- else { this->pos.z = 3300.0; }
-
-
- if (this->Kaboom) {
- doStateChange(&StateID_Kaboom); }
- else {
- doStateChange(&StateID_Straight); }
+ speed.x = -2.0;
this->onExecute();
return true;
}
-int daKoopaBreath::onDelete() {
- return true;
-}
-
-int daKoopaBreath::onDraw() {
- bodyModel.scheduleForDrawing();
- return true;
-}
-
-
-void daKoopaBreath::updateModelMatrices() {
- matrix.translation(pos.x, pos.y, pos.z);
- matrix.applyRotationYXZ(&rot.x, &rot.y, &rot.z);
-
- bodyModel.setDrawMatrix(matrix);
- bodyModel.setScale(&scale);
- bodyModel.calcWorld(false);
-}
-
-
int daKoopaBreath::onExecute() {
- acState.execute();
- updateModelMatrices();
-
- return true;
-}
-
-
-void daKoopaBreath::beginState_Kaboom() {
- float rand = (float)GenerateRandomNumber(10) * 0.4;
-
- if (this->direction == 0) { // directions 1 spins clockwise, fly rightwards
- speed.x = 1.0 + rand;
- }
- else { // directions 0 spins anti-clockwise, fly leftwards
- speed.x = -1.0 - rand;
- }
-
- speed.y = 6.0;
-}
-void daKoopaBreath::executeState_Kaboom() {
-
- speed.y = speed.y - 0.01875;
-
- HandleXSpeed();
- HandleYSpeed();
- doSpriteMovement();
-
- cmgr_returnValue = collMgr.CollidedWithTile();
- collMgr.execute();
-
- if (collMgr.CollidedWithTile()) {
- // hit the ground
- PlaySoundAsync(this, SE_BOSS_JR_BOMB_BURST);
-
- SpawnEffect("Wm_en_burst_s", 0, &this->pos, &(S16Vec){0,0,0}, &(Vec){0.75, 0.75, 0.75});
- SpawnEffect("Wm_mr_wirehit", 0, &this->pos, &(S16Vec){0,0,0}, &(Vec){1.25, 1.25, 1.25});
- this->Delete(1);
- }
- if (collMgr.bitfield_for_checks & (0x15 << direction)) {
- // hit the wall
- PlaySoundAsync(this, SE_BOSS_JR_BOMB_BURST);
-
- if (this->direction == 0) { // directions 1 spins clockwise, fly rightwards
- SpawnEffect("Wm_en_burst_s", 0, &this->pos, &(S16Vec){0,0x4000,0}, &(Vec){0.75, 0.75, 0.75});
- SpawnEffect("Wm_mr_wirehit", 0, &this->pos, &(S16Vec){0,0x4000,0}, &(Vec){1.25, 1.25, 1.25});
- }
- else { // directions 0 spins anti-clockwise, fly leftwards
- SpawnEffect("Wm_en_burst_s", 0, &this->pos, &(S16Vec){0,0xE000,0}, &(Vec){0.75, 0.75, 0.75});
- SpawnEffect("Wm_mr_wirehit", 0, &this->pos, &(S16Vec){0,0xE000,0}, &(Vec){1.25, 1.25, 1.25});
- }
-
- this->Delete(1);
- }
-
- if (this->direction == 1) { // directions 1 spins clockwise, fly rightwards
- this->rot.z -= 0x1000; }
- else { // directions 0 spins anti-clockwise, fly leftwards
- this->rot.z += 0x1000; }
-
- PlayWrenchSound(this);
-
-}
-void daKoopaBreath::endState_Kaboom() { }
-
-
-
-void daKoopaBreath::beginState_Straight() {
- float rand = (float)GenerateRandomNumber(10) * 0.4;
-
- if (this->direction == 0) { // directions 1 spins clockwise, fly rightwards
- speed.x = 1.0 + rand;
- }
- else { // directions 0 spins anti-clockwise, fly leftwards
- speed.x = -1.0 - rand;
- }
-
- speed.y = 6.0;
-}
-void daKoopaBreath::executeState_Straight() {
-
- speed.y = speed.y - 0.01875;
-
HandleXSpeed();
- HandleYSpeed();
doSpriteMovement();
- cmgr_returnValue = collMgr.CollidedWithTile();
- collMgr.execute();
+ PlaySound(this, SE_BOSS_JR_FIRE_BURNING);
- if (collMgr.CollidedWithTile()) {
- // hit the ground
- PlaySoundAsync(this, SE_BOSS_JR_FLOOR_BREAK);
+ effect.spawn("Wm_ko_fireattack", 0, &(Vec){pos.x, pos.y, pos.z}, &(S16Vec){0,0,0}, &(Vec){3.0, 3.0, 3.0});
- SpawnEffect("Wm_en_burst_s", 0, &this->pos, &(S16Vec){0,0,0}, &(Vec){0.75, 0.75, 0.75});
+ float rect[] = {0.0, 0.0, 38.0, 38.0};
+ int ret = this->outOfZone(this->pos, (float*)&rect, this->currentZoneID);
+ if(ret) {
this->Delete(1);
}
- if (collMgr.bitfield_for_checks & (0x15 << direction)) {
- // hit the wall
- PlaySoundAsync(this, SE_BOSS_JR_FLOOR_BREAK);
-
- SpawnEffect("Wm_en_burst_s", 0, &this->pos, &(S16Vec){0,0,0}, &(Vec){0.75, 0.75, 0.75});
- this->Delete(1);
- }
-
- if (this->direction == 1) { // directions 1 spins clockwise, fly rightwards
- this->rot.z -= 0x1000; }
- else { // directions 0 spins anti-clockwise, fly leftwards
- this->rot.z += 0x1000; }
-
- PlayWrenchSound(this);
+ return true;
}
-void daKoopaBreath::endState_Straight() { }
-
-
-
-
-
-// Wm_en_explosion_smk
-
-
-
diff --git a/src/bossKoopaThrow.cpp b/src/bossKoopaThrow.cpp
index 19beadd..821a848 100644
--- a/src/bossKoopaThrow.cpp
+++ b/src/bossKoopaThrow.cpp
@@ -22,10 +22,10 @@ struct TypeInfo {
static const TypeInfo types[6] = {
{"choropoo", "g3d/choropoo.brres", "spanner", "Wm_en_hit", 0, SE_BOSS_JR_FLOOR_BREAK, 0, 8.0f, 2.0f, 0, 0, 0x1000},
{"choropoo", "g3d/choropoo.brres", "spanner", "Wm_en_burst_s", 0, SE_BOSS_JR_BOMB_BURST, 0, 8.0f, 2.0f, 0, 0, 0x1000},
- {"koopa_clown_bomb", "g3d/koopa_clown_bomb.brres", "koopa_clown_bomb", "Wm_en_burst_s", SE_BOSS_JR_BOMB_BOUND, SE_BOSS_JR_BOMB_BURST, 0, 16.0f, 0.8f, 0x200, 0x800, 0x1000},
+ {"koopa_clown_bomb", "g3d/koopa_clown_bomb.brres", "koopa_clown_bomb", "Wm_en_burst_s", SE_EMY_ELCJ_THROW, SE_BOSS_JR_BOMB_BURST, 0, 16.0f, 0.8f, 0x200, 0x800, 0x1000},
{"bros", "g3d/t00.brres", "bros_hammer", "Wm_en_hit", 0, SE_OBJ_HAMMER_HIT_BOTH, SE_EMY_MEGA_BROS_HAMMER, 16.0f, 2.0f, 0, 0, 0x1000},
{"dossun", "g3d/t00.brres", "dossun", "Wm_en_hit", SE_EMY_DOSSUN, SE_EMY_DOSSUN_DEAD, 0, 16.0f, 1.0f, 0x100, 0x100, 0x100},
- {"KoopaShip", "g3d/present.brres", "PresentBox_penguin", "Wm_dm_presentopen",SE_DEMO_OP_PRESENT_THROW_2400f, SE_DEMO_OP_PRESENT_BOX_BURST, 0, 12.0f, 1.0f, 0x20, 0x40, 0x200}
+ {"KoopaShip", "g3d/present.brres", "PresentBox_penguin", "Wm_dm_presentopen",SE_DEMO_OP_PRESENT_THROW_2400f, SE_DEMO_OP_PRESENT_BOX_BURST, 0, 20.0f, 1.0f, 0x20, 0x40, 0x200}
};
@@ -88,7 +88,7 @@ void daKoopaThrow::playerCollision(ActivePhysics *apThis, ActivePhysics *apOther
if (Type == 5) {
PlaySoundAsync(this, currentInfo->breakSound);
SpawnEffect(currentInfo->deathEffect, 0, &this->pos, &(S16Vec){0,0,0}, &(Vec){3.0, 3.0, 3.0});
- dStageActor_c *spawned = CreateActor(EN_HATENA_BALLOON, 0x100, this->pos, 0, 0);
+ dStageActor_c *spawned = CreateActor(EN_ITEM, 0x20000063, this->pos, 0, 0);
spawned->pos.x = this->pos.x;
spawned->pos.y = this->pos.y;
this->Delete(1);
@@ -141,9 +141,7 @@ void daKoopaThrow::collisionCat7_WMWaggleWater(ActivePhysics *apThis, ActivePhys
daKoopaThrow *daKoopaThrow::build() {
- OSReport("Building");
void *buffer = AllocFromGameHeap1(sizeof(daKoopaThrow));
- OSReport("Built");
return new(buffer) daKoopaThrow;
}
@@ -154,31 +152,20 @@ int daKoopaThrow::onCreate() {
this->Type = (this->settings >> 4) & 0xF;
this->front = (this->settings >> 8) & 0xF;
- OSReport("Type is %d", this->Type);
-
currentInfo = &types[Type];
- OSReport("Current Info is: %s, %s, %s", currentInfo->arcName, currentInfo->brresName, currentInfo->modelName);
-
allocator.link(-1, GameHeaps[0], 0, 0x20);
- OSReport("Allocated");
-
nw4r::g3d::ResFile rf(getResource(currentInfo->arcName, currentInfo->brresName));
- OSReport("Res File Gotten");
bodyModel.setup(rf.GetResMdl(currentInfo->modelName), &allocator, 0x224, 1, 0);
- OSReport("Body model setup");
SetupTextures_Enemy(&bodyModel, 0);
- OSReport("Textures setup");
allocator.unlink();
- OSReport("Onwards to Physics");
-
ActivePhysics::Info KoopaJunk;
- KoopaJunk.xDistToCenter = 0.0;
+ KoopaJunk.xDistToCenter = -currentInfo->size;
KoopaJunk.yDistToCenter = 0.0;
KoopaJunk.xDistToEdge = currentInfo->size;
KoopaJunk.yDistToEdge = currentInfo->size;
@@ -266,7 +253,6 @@ int daKoopaThrow::onExecute() {
float rect[] = {this->_320, this->_324, this->spriteSomeRectX, this->spriteSomeRectY};
int ret = this->outOfZone(this->pos, (float*)&rect, this->currentZoneID);
if(ret) {
- OSReport("Deleting");
this->Delete(1);
}
@@ -295,8 +281,8 @@ void daKoopaThrow::executeState_Straight() {
HandleYSpeed();
doSpriteMovement();
- cmgr_returnValue = collMgr.CollidedWithTile();
- collMgr.execute();
+ // cmgr_returnValue = collMgr.CollidedWithTile();
+ // collMgr.execute();
// if (collMgr.CollidedWithTile() || (collMgr.bitfield_for_checks & (0x15 << direction))) {
// // hit the ground or wall
@@ -324,17 +310,6 @@ void daKoopaThrow::executeState_Straight() {
PlaySound(this, currentInfo->flySound);
}
- if (Type == 5) {
- if (this->speed.y < 0.0) {
- PlaySoundAsync(this, currentInfo->breakSound);
- SpawnEffect(currentInfo->deathEffect, 0, &this->pos, &(S16Vec){0,0,0}, &(Vec){1.0, 1.0, 1.0});
- dStageActor_c *spawned = CreateActor(EN_HATENA_BALLOON, 0x100, this->pos, 0, 0);
- spawned->pos.x = this->pos.x;
- spawned->pos.y = this->pos.y;
- this->Delete(1);
- }
- }
-
}
void daKoopaThrow::endState_Straight() { }
diff --git a/src/bossPlayerClown.cpp b/src/bossPlayerClown.cpp
new file mode 100644
index 0000000..afa8c3e
--- /dev/null
+++ b/src/bossPlayerClown.cpp
@@ -0,0 +1,60 @@
+#include <common.h>
+#include <game.h>
+#include <g3dhax.h>
+#include <sfx.h>
+#include <stage.h>
+#include "boss.h"
+
+
+#define CLOWN_MODEL(clown) ((m3d::mdl_c*)( ((u32)(clown)) + 0xFD0 ))
+
+dEn_c *newClownCtor(dEn_c *clown);
+void newClownDtor(dEn_c *clown, u32 willDelete);
+
+void CConDraw(dEn_c *clown) {
+ // setup matrices
+ CLOWN_MODEL(clown)->scheduleForDrawing();
+
+ // run normal clown function
+}
+
+void CConExecute(dEn_c *clown) {
+ // run normal execute
+}
+
+void CCafterCreate(dEn_c *clown) {
+ clown->scale.x = clown->scale.x * 1.25;
+ clown->scale.y = clown->scale.y * 1.25;
+ clown->scale.z = clown->scale.z * 1.25;
+
+ // setup the model
+
+ // dEn_c::afterCreate(1);
+}
+
+void CConExecuteMove(dEn_c *clown) {
+ // run normal move
+
+ // check for wiimote button presses
+
+ // spawn effect and attack if there are any
+}
+
+
+extern "C" m3d::mdl_c *__ct__Q23m3d5mdl_cFv(m3d::mdl_c *mdl);
+extern "C" dEn_c *__ct__20daJrClownForPlayer_cFv(dEn_c *clown);
+
+dEn_c *newClownCtor(dEn_c *clown) {
+ __ct__20daJrClownForPlayer_cFv(clown);
+ __ct__Q23m3d5mdl_cFv(CLOWN_MODEL(clown));
+ return clown;
+}
+
+
+extern "C" void __dt__Q23m3d5mdl_cFv(m3d::mdl_c *mdl, u32 willDelete);
+extern "C" void __dt__20daJrClownForPlayer_cFv(dEn_c *mdl, u32 willDelete);
+
+void newClownDtor(dEn_c *clown, u32 willDelete) {
+ __dt__Q23m3d5mdl_cFv(CLOWN_MODEL(clown), 0xFFFFFFFF);
+ __dt__20daJrClownForPlayer_cFv(clown, willDelete);
+}
diff --git a/src/challengeStar.cpp b/src/challengeStar.cpp
new file mode 100644
index 0000000..fc710d4
--- /dev/null
+++ b/src/challengeStar.cpp
@@ -0,0 +1,130 @@
+#include <common.h>
+#include <game.h>
+#include <g3dhax.h>
+#include <sfx.h>
+
+
+extern "C" void *PlaySound(dEn_c *, int soundID);
+extern "C" bool SpawnEffect(const char*, int, Vec*, S16Vec*, Vec*);
+
+extern int GlobalStarsCollected;
+
+struct EventTable_t { u64 events; };
+extern EventTable_t *EventTable;
+
+
+class dChallengeStar : public dEn_c {
+ int onCreate();
+ int onExecute();
+ int onDelete();
+ int onDraw();
+
+ mHeapAllocator_c allocator;
+ m3d::mdl_c bodyModel;
+
+ mEf::es2 effect;
+
+ u64 eventFlag;
+ s32 timer;
+
+ static dChallengeStar *build();
+
+ void updateModelMatrices();
+ void playerCollision(ActivePhysics *apThis, ActivePhysics *apOther);
+ void yoshiCollision(ActivePhysics *apThis, ActivePhysics *apOther);
+
+ void collisionCat9_RollingObject(ActivePhysics *apThis, ActivePhysics *apOther);
+
+};
+
+
+void dChallengeStar::playerCollision(ActivePhysics *apThis, ActivePhysics *apOther) {
+ PlaySound(this, SE_OBJ_BROOM_KEY_SHOW);
+ SpawnEffect("Wm_ob_greencoinkira_a", 0, &this->pos, &(S16Vec){0,0,0}, &(Vec){0.8, 0.8, 0.8});
+
+ GlobalStarsCollected++;
+ if (GlobalStarsCollected == 50) {
+ GlobalStarsCollected = 0;
+ EventTable->events = EventTable->events | this->eventFlag;
+ }
+
+ this->Delete(this->_390);
+}
+
+void dChallengeStar::yoshiCollision(ActivePhysics *apThis, ActivePhysics *apOther) { this->playerCollision(apThis, apOther); }
+void dChallengeStar::collisionCat9_RollingObject(ActivePhysics *apThis, ActivePhysics *apOther) { this->playerCollision(apThis, apOther); }
+
+
+dChallengeStar *dChallengeStar::build() {
+ void *buffer = AllocFromGameHeap1(sizeof(dChallengeStar));
+ return new(buffer) dChallengeStar;
+}
+
+
+int dChallengeStar::onCreate() {
+
+ OSReport("Creating a star collectable\n");
+ allocator.link(-1, GameHeaps[0], 0, 0x20);
+
+ nw4r::g3d::ResFile rf(getResource("I_star", "g3d/I_star.brres"));
+ bodyModel.setup(rf.GetResMdl("I_star"), &allocator, 0x224, 1, 0);
+ SetupTextures_Map(&bodyModel, 0);
+
+ allocator.unlink();
+
+ ActivePhysics::Info HitMeBaby;
+ HitMeBaby.xDistToCenter = 0.0;
+ HitMeBaby.yDistToCenter = -3.0;
+ HitMeBaby.xDistToEdge = 4.0;
+ HitMeBaby.yDistToEdge = 4.0;
+ HitMeBaby.category1 = 0x5;
+ HitMeBaby.category2 = 0x0;
+ HitMeBaby.bitfield1 = 0x4F;
+ HitMeBaby.bitfield2 = 0xFFFFFFFF;
+ HitMeBaby.unkShort1C = 0;
+ HitMeBaby.callback = &dEn_c::collisionCallback;
+
+ this->aPhysics.initWithStruct(this, &HitMeBaby);
+ this->aPhysics.addToList();
+
+ char eventNum = (this->settings >> 24) & 0xFF;
+ this->eventFlag = (u64)1 << (eventNum - 1);
+
+ this->scale.x = 0.5;
+ this->scale.y = 0.5;
+ this->scale.z = 0.5;
+
+ this->pos.z = 3300.0;
+
+ this->onExecute();
+ return true;
+}
+
+
+int dChallengeStar::onDelete() {
+ return true;
+}
+
+int dChallengeStar::onDraw() {
+ bodyModel.scheduleForDrawing();
+ return true;
+}
+
+
+void dChallengeStar::updateModelMatrices() {
+ matrix.translation(pos.x, pos.y, pos.z);
+ matrix.applyRotationYXZ(&rot.x, &rot.y, &rot.z);
+
+ bodyModel.setDrawMatrix(matrix);
+ bodyModel.setScale(&scale);
+ bodyModel.calcWorld(false);
+}
+
+int dChallengeStar::onExecute() {
+ updateModelMatrices();
+
+ effect.spawn("Wm_ob_keyget02_kira", 0, &this->pos, &(S16Vec){0,0,0}, &(Vec){1.0, 1.0, 1.0});
+ this->rot.y += 0x200;
+ return true;
+}
+
diff --git a/src/growup.s b/src/growup.s
index 0b284ce..6e78e52 100755
--- a/src/growup.s
+++ b/src/growup.s
@@ -1291,6 +1291,10 @@ GlobalSpriteSpeed:
GlobalRiderSize:
.float 1.0
+.global GlobalStarsCollected
+GlobalStarsCollected:
+ .int 0
+
.global SizerOn
SizerOn:
.byte 0
diff --git a/src/levelspecial.cpp b/src/levelspecial.cpp
index b5447e9..f57e14a 100644
--- a/src/levelspecial.cpp
+++ b/src/levelspecial.cpp
@@ -26,8 +26,8 @@ struct EventTable_t {
extern EventTable_t *EventTable;
-// extern u16 TimeStopFlag;
-// extern u32 TimerBranch;
+extern u16 TimeStopFlag;
+extern u32 TimerBranch;
extern u32 AlwaysDrawFlag;
extern u32 AlwaysDrawBranch;
@@ -62,7 +62,7 @@ fBase_c *FindActorByID(u32 id);
bool ResetAfterLevel(void) {
// TimeStopFlag = 0;
- // TimerBranch = 0x3403FFA4;
+ TimerBranch = 0x3403FFA4;
MarioDescentRate = -4;
MarioJumpMax = 3.628;
MarioJumpArc = 2.5;
@@ -120,9 +120,9 @@ void LevelSpecial_Update(LevelSpecial *self) {
// TimeStopFlag = self->effect * 0x100;
// break;
- // case 2: // Stop Timer
- // TimerBranch = 0x7C601B78;
- // break;
+ case 2: // Stop Timer
+ TimerBranch = 0x7C601B78;
+ break;
case 3: // Mario Gravity
@@ -262,9 +262,9 @@ void LevelSpecial_Update(LevelSpecial *self) {
// TimeStopFlag = 0;
// break;
- // case 2: // Stop Timer
- // TimerBranch = 0x3403FFA4;
- // break;
+ case 2: // Stop Timer
+ TimerBranch = 0x3403FFA4;
+ break;
case 3: // Mario Gravity
diff --git a/src/makeYourOwnModelSprite.cpp b/src/makeYourOwnModelSprite.cpp
new file mode 100644
index 0000000..d607f78
--- /dev/null
+++ b/src/makeYourOwnModelSprite.cpp
@@ -0,0 +1,300 @@
+#include <common.h>
+#include <game.h>
+#include <g3dhax.h>
+
+
+//////////////////////////////////////////////////////////
+//
+// How it works:
+//
+// 1) Skip down to line 70 - read the comments along the way if you like
+// 2) Change the stuff inside " " to be what you want.
+// 3) Copy paste an entire 'case' section of code, and change the number to change the setting it uses
+// 4) give it back to Tempus to compile in
+//
+
+
+
+// This is the class allocator, you don't need to touch this
+class dMakeYourOwn : public dStageActor_c {
+ // Let's give ourselves a few functions
+ int onCreate();
+ int onDelete();
+ int onExecute();
+ int onDraw();
+
+ static dMakeYourOwn *build();
+
+ // And a model and an anmChr
+ mHeapAllocator_c allocator;
+ m3d::mdl_c bodyModel;
+ nw4r::g3d::ResFile resFile;
+ m3d::anmChr_c chrAnimation;
+
+ nw4r::g3d::ResMdl mdl;
+
+ // Some variables to use
+ int model;
+ char isAnimating;
+ float size;
+
+ void setupAnim(const char* name, float rate);
+ void setupModel(const char* arcName, const char* brresName, const char* mdlName);
+};
+
+// This sets up how much space we have in memory
+dMakeYourOwn *dMakeYourOwn::build() {
+ void *buffer = AllocFromGameHeap1(sizeof(dMakeYourOwn));
+ return new(buffer) dMakeYourOwn;
+}
+
+
+// Saves space when we do it like this
+void dMakeYourOwn::setupAnim(const char* name, float rate) {
+ if (isAnimating) {
+ nw4r::g3d::ResAnmChr anmChr;
+
+ anmChr = this->resFile.GetResAnmChr(name);
+ this->chrAnimation.setup(this->mdl, anmChr, &this->allocator, 0);
+ this->chrAnimation.bind(&this->bodyModel, anmChr, 1);
+ this->bodyModel.bindAnim(&this->chrAnimation, 0.0);
+ this->chrAnimation.setUpdateRate(rate);
+ }
+}
+
+void dMakeYourOwn::setupModel(const char* arcName, const char* brresName, const char* mdlName) {
+ this->resFile.data = getResource(arcName, brresName);
+ this->mdl = this->resFile.GetResMdl(mdlName);
+
+ bodyModel.setup(mdl, &allocator, 0x224, 1, 0);
+}
+
+
+// This gets run when the sprite spawns!
+int dMakeYourOwn::onCreate() {
+
+ // Settings for your sprite!
+
+ this->model = this->settings & 0xFF; // Sets nubble 12 to choose the model you want
+ this->isAnimating = this->settings & 0x100; // Sets nybble 11 to a checkbox for whether or not the model has an anmChr to use
+ this->size = (float)((this->settings >> 24) & 0xFF) / 4.0; // Sets nybbles 5-6 to size. Size equals value / 4.
+
+ // Setup the models inside an allocator
+ allocator.link(-1, GameHeaps[0], 0, 0x20);
+
+
+ // Makes the code shorter and clearer to put these up here
+
+ // A switch case, add extra models in here
+ switch (this->model) {
+
+ // COPY FROM BELOW HERE
+
+ case 0: // If nyb 12 is 0, it'll load this model
+
+ setupModel("arrow", "g3d/bre0.brres", "ballon_red"); // arc name (no .arc), brres name, model name
+ SetupTextures_Item(&bodyModel, 0);
+ this->pos.z = -3300.0;
+
+ setupAnim("anim00", 1.0); // AnmChr name, animation speed
+
+ break; // ends the case
+
+ // TO HERE
+ // That is a 'block' of case code, which will run depending on your sprite setting
+
+ case 1: // If nyb 12 is 1, it'll load this model. Add more cases for each model you'd like!
+
+ setupModel("arrow", "g3d/bre1.brres", "ballon_green"); // arc name (no .arc), brres name, model name
+ SetupTextures_Item(&bodyModel, 0);
+ this->pos.z = 3300.0;
+
+ setupAnim("anim01", 1.0); // AnmChr name, animation speed
+ break; // ends the case
+
+ case 2: // If nyb 12 is 2, it'll load this model
+
+ setupModel("arrow", "g3d/bre2.brres", "mario_ts"); // arc name (no .arc), brres name, model name
+ SetupTextures_Player(&bodyModel, 0);
+ this->pos.z = -3000.0;
+
+ setupAnim("anim02", 1.0); // AnmChr name, animation speed
+ break; // ends the case
+
+ case 3: // If nyb 12 is 0, it'll load this model
+
+ setupModel("arrow", "g3d/bre3.brres", "peach_ts"); // arc name (no .arc), brres name, model name
+ SetupTextures_Enemy(&bodyModel, 0);
+ this->pos.z = -3000.0;
+
+ setupAnim("anim03", 1.0); // AnmChr name, animation speed
+ break; // ends the case
+
+ case 4: // If nyb 12 is 0, it'll load this model
+
+ setupModel("arrow", "g3d/bre4.brres", "luigi_ts"); // arc name (no .arc), brres name, model name
+ SetupTextures_Player(&bodyModel, 0);
+ this->pos.z = 3000.0;
+
+ setupAnim("anim04", 1.0); // AnmChr name, animation speed
+ break; // ends the case
+
+ case 5: // If nyb 12 is 0, it'll load this model
+
+ setupModel("arrow", "g3d/bre5.brres", "toady_ts"); // arc name (no .arc), brres name, model name
+ SetupTextures_Player(&bodyModel, 0);
+ this->pos.z = 3000.0;
+
+ setupAnim("anim05", 1.0); // AnmChr name, animation speed
+ break; // ends the case
+
+ case 6: // If nyb 12 is 0, it'll load this model
+
+ setupModel("arrow", "g3d/bre6.brres", "toadb_ts"); // arc name (no .arc), brres name, model name
+ SetupTextures_Player(&bodyModel, 0);
+ this->pos.z = 3000.0;
+
+ setupAnim("anim06", 1.0); // AnmChr name, animation speed
+ break; // ends the case
+
+ case 7: // If nyb 12 is 0, it'll load this model
+
+ setupModel("block_arrow", "g3d/bre7.brres", "clowncar_mario"); // arc name (no .arc), brres name, model name
+ SetupTextures_MapObj(&bodyModel, 0);
+ this->pos.z = 3300.0;
+
+ setupAnim("anim07", 1.0); // AnmChr name, animation speed
+ break; // ends the case
+
+ case 8: // If nyb 12 is 0, it'll load this model
+
+ setupModel("block_arrow", "g3d/bre8.brres", "clowncar_luigi"); // arc name (no .arc), brres name, model name
+ SetupTextures_MapObj(&bodyModel, 0);
+ this->pos.z = 3300.0;
+
+ setupAnim("anim08", 1.0); // AnmChr name, animation speed
+ break; // ends the case
+
+ case 9: // If nyb 12 is 0, it'll load this model
+
+ setupModel("block_arrow", "g3d/bre9.brres", "clowncar_toady"); // arc name (no .arc), brres name, model name
+ SetupTextures_MapObj(&bodyModel, 0);
+ this->pos.z = 3300.0;
+
+ setupAnim("anim09", 1.0); // AnmChr name, animation speed
+ break; // ends the case
+
+ case 10: // If nyb 12 is 0, it'll load this model
+
+ setupModel("block_arrow", "g3d/bre10.brres", "clowncar_toadb"); // arc name (no .arc), brres name, model name
+ SetupTextures_MapObj(&bodyModel, 0);
+ this->pos.z = 3300.0;
+
+ setupAnim("anim10", 1.0); // AnmChr name, animation speed
+ break; // ends the case
+
+ case 11: // If nyb 12 is 0, it'll load this model
+
+ setupModel("block_arrow", "g3d/bre11.brres", "clowncar_peach"); // arc name (no .arc), brres name, model name
+ SetupTextures_MapObj(&bodyModel, 0);
+ this->pos.z = 3300.0;
+
+ setupAnim("anim11", 1.0); // AnmChr name, animation speed
+ break; // ends the case
+
+ case 12: // If nyb 12 is 0, it'll load this model
+
+ setupModel("block_arrow", "g3d/bre12.brres", "mario_end"); // arc name (no .arc), brres name, model name
+ SetupTextures_MapObj(&bodyModel, 0);
+ this->pos.z = 3000.0;
+
+ setupAnim("anim12", 1.0); // AnmChr name, animation speed
+ break; // ends the case
+
+ case 13: // If nyb 12 is 0, it'll load this model
+
+ setupModel("block_arrow", "g3d/bre13.brres", "luigi_end"); // arc name (no .arc), brres name, model name
+ SetupTextures_MapObj(&bodyModel, 0);
+ this->pos.z = 3000.0;
+
+ setupAnim("anim13", 1.0); // AnmChr name, animation speed
+ break; // ends the case
+
+ case 14: // If nyb 12 is 0, it'll load this model
+
+ setupModel("block_arrow", "g3d/bre14.brres", "toady_end"); // arc name (no .arc), brres name, model name
+ SetupTextures_MapObj(&bodyModel, 0);
+ this->pos.z = 3000.0;
+
+ setupAnim("anim14", 1.0); // AnmChr name, animation speed
+ break; // ends the case
+
+ case 15: // If nyb 12 is 0, it'll load this model
+
+ setupModel("block_arrow", "g3d/bre15.brres", "toadb_end"); // arc name (no .arc), brres name, model name
+ SetupTextures_MapObj(&bodyModel, 0);
+ this->pos.z = 3000.0;
+
+ setupAnim("anim15", 1.0); // AnmChr name, animation speed
+ break; // ends the case
+
+ case 16: // If nyb 12 is 0, it'll load this model
+
+ setupModel("block_arrow", "g3d/bre16.brres", "peach_end"); // arc name (no .arc), brres name, model name
+ SetupTextures_MapObj(&bodyModel, 0);
+ this->pos.z = 3000.0;
+
+ setupAnim("anim16", 1.0); // AnmChr name, animation speed
+ break; // ends the case
+
+ // COPY the entire case here, and then change the number
+ //
+ //case 2:
+ //case 3:
+ //etc, etc...
+ }
+
+ allocator.unlink();
+
+ if (size == 0.0) { // If the person has the size nybble at zero, make it normal sized
+ this->scale = (Vec){1.0,1.0,1.0};
+ }
+ else { // Else, use our size
+ this->scale = (Vec){size,size,size};
+ }
+
+ this->onExecute();
+ return true;
+}
+
+
+// YOU'RE DONE, no need to do anything below here.
+
+
+int dMakeYourOwn::onDelete() {
+ return true;
+}
+
+int dMakeYourOwn::onExecute() {
+ if (isAnimating) {
+ bodyModel._vf1C(); // Advances the animation one update
+
+ if(this->chrAnimation.isAnimationDone()) {
+ this->chrAnimation.setCurrentFrame(0.0); // Resets the animation when it's done
+ }
+ }
+
+ return true;
+}
+
+int dMakeYourOwn::onDraw() {
+ matrix.translation(pos.x, pos.y, pos.z - 6500.0); // Set where to draw the model : -5500.0 is the official behind layer 2, while 5500.0 is in front of layer 0.
+ matrix.applyRotationYXZ(&rot.x, &rot.y, &rot.z); // Set how to rotate the drawn model
+
+ bodyModel.setDrawMatrix(matrix); // Apply matrix
+ bodyModel.setScale(&scale); // Apply scale
+ bodyModel.calcWorld(false); // Do some shit
+
+ bodyModel.scheduleForDrawing(); // Add it to the draw list for the game
+ return true;
+}