1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
|
#include <common.h>
#include <game.h>
#include <g3dhax.h>
#include <sfx.h>
#include "boss.h"
#define cPlayerOccupying (*(dStageActor_c**)(((u32)(clown)) + 0x738 ))
#define cAllocator ((mHeapAllocator_c*)(((u32)(clown)) + 0xFD0 ))
#define cModel ((m3d::mdl_c*)( ((u32)(clown)) + 0xFEC ))
extern "C" int PClownCarExecute(dEn_c *clown);
extern "C" void PClownCarAfterCreate(dEn_c *clown, u32);
extern "C" int PClownCarDraw(dEn_c *clown);
extern "C" void PClownCarMove(dEn_c *clown);
int CConDraw(dEn_c *clown) {
// setup cannon model
clown->matrix.translation(clown->pos.x, clown->pos.y, clown->pos.z);
short newrot = 0x4000;
clown->matrix.applyRotationYXZ(&clown->rot.x, &newrot, &clown->rot.z);
cModel->setDrawMatrix(clown->matrix);
cModel->setScale(&clown->scale);
cModel->calcWorld(false);
cModel->scheduleForDrawing();
return PClownCarDraw(clown);
// run normal clown function
}
int CConExecute(dEn_c *clown) {
return PClownCarExecute(clown);
}
void CCafterCreate(dEn_c *clown, u32 param) {
clown->scale.x *= 1.25;
clown->scale.y *= 1.25;
clown->scale.z *= 1.25;
OSReport("AfterCreate");
// setup the model
nw4r::g3d::ResFile resFile;
OSReport("defined");
cAllocator->link(-1, GameHeaps[0], 0, 0x20);
OSReport("allocated");
resFile.data = getResource("koopaJr_clown_ply", "g3d/cannon.brres");
OSReport("resource");
nw4r::g3d::ResMdl mdl = resFile.GetResMdl("Cannon");
OSReport("model");
cModel->setup(mdl, cAllocator, 0x224, 1, 0);
OSReport("setup");
SetupTextures_MapObj(cModel, 0);
OSReport("lightmaps");
cAllocator->unlink();
OSReport("unlinked");
// Original AfterCreate
PClownCarAfterCreate(clown, param);
}
void CConExecuteMove(dEn_c *clown) {
u8 player = cPlayerOccupying->which_player;
// OSReport("Angle = %x, %x, %x", (GetSpecificPlayerActor(player))->rot.y, (GetSpecificPlayerActor(player))->rot.x, (GetSpecificPlayerActor(player))->rot.z);
// OSReport("Clown = %x, %x, %x", (clown)->rot.y, (clown)->rot.x, (clown)->rot.z);
RemoconMngClass* Remo = GetRemoconMng();
Vec tempPos;
u32 buttonPushed = Remocon_GetPressed(Remo->controllers[player]);
if (buttonPushed & 0x0100) {
if (clown->direction == 0) { // Going right
tempPos = (Vec){clown->pos.x + 32.0, clown->pos.y + 32.0, 3564.0};
dStageActor_c *spawned = CreateActor(347, clown->direction, tempPos, 0, 0);
spawned->speed.x = 5.0;
}
else {
tempPos = (Vec){clown->pos.x - 32.0, clown->pos.y + 32.0, 3564.0};
dStageActor_c *spawned = CreateActor(347, clown->direction, tempPos, 0, 0);
spawned->speed.x = -5.0;
}
SpawnEffect("Wm_en_killervanish", 0, &tempPos, &(S16Vec){0,0,0}, &(Vec){0.25, 0.25, 0.25});
PlaySoundAsync(clown, SE_OBJ_HOUDAI_S_SHOT);
}
// run normal move
PClownCarMove(clown);
// 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" mHeapAllocator_c *__ct__16mHeapAllocator_cFv(mHeapAllocator_c *al);
extern "C" dEn_c *__ct__20daJrClownForPlayer_cFv(dEn_c *clown);
dEn_c *newClownCtor(dEn_c *clown) {
OSReport("ctor");
__ct__20daJrClownForPlayer_cFv(clown);
__ct__16mHeapAllocator_cFv(cAllocator);
__ct__Q23m3d5mdl_cFv(cModel);
return clown;
}
extern "C" void __dt__Q23m3d5mdl_cFv(m3d::mdl_c *mdl, u32 willDelete);
extern "C" void __dt__16mHeapAllocator_cFv(mHeapAllocator_c *al, u32 willDelete);
extern "C" void __dt__20daJrClownForPlayer_cFv(dEn_c *clown, u32 willDelete);
void newClownDtor(dEn_c *clown, u32 willDelete) {
__dt__Q23m3d5mdl_cFv(cModel, 0xFFFFFFFF);
__dt__16mHeapAllocator_cFv(cAllocator, 0xFFFFFFFF);
__dt__20daJrClownForPlayer_cFv(clown, willDelete);
}
|