Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
86 changes: 69 additions & 17 deletions include/Kameda/Motor.h
Original file line number Diff line number Diff line change
@@ -1,41 +1,93 @@
#ifndef MOTOR_H
#define MOTOR_H

#include "types.h"
#include "JSystem/JKernel/JKRHeap.h"
#include "JSystem/JORReflexible.h"
#include "Kaneshige/HioMgr.h"
#include "Osako/kartPad.h"
#include "types.h"

class MotorParam : public JORReflexible {
class MotorParam : public JORReflexible
{
public:
// Inline/Unused
MotorParam();
MotorParam()
{
mUnknownContainer[0].flag = false;
mUnknownContainer[1].flag = false;
mUnknownContainer[2].flag = false;
mUnknownContainer[3].flag = false;
mUnknownFloat = 1.0f;
mUnknownValue = 0x1e;
mUnknownFlag = false;
}
virtual ~MotorParam() {}

struct
{
bool flag; // 0x48
u8 _49[0x100 - 1]; // 0x49
} mUnknownContainer[4];

f32 mUnknownFloat; // 0x448
u8 mUnknownValue; // 0x44c
bool mUnknownFlag; // 0x44d
};

class MotorHioNode : public HioNode {
class MotorHioNode : public HioNode
{
public:
MotorHioNode();
MotorHioNode() : HioNode("モーター", &mParam, 0, 0) {}
virtual ~MotorHioNode() {}

MotorParam mParam;
};

class Motor { // Autogenerated
class Motor
{
public:
Motor(JKRHeap *); // 0x801304d8
void init(); // 0x801305c4
~Motor(); // 0x80130668
void exec(); // 0x8013073c
void triggerWave(KartGamePad *, int); // 0x80130ad8
void powerWave(KartGamePad *, f32, u8, u8); // 0x80130b50
void stop(); // 0x80130cbc
static const char *mPatternWave[26]; // 0x803942e8
Motor(JKRHeap *heap); // 0x801304d8
void init(); // 0x801305c4
~Motor(); // 0x80130668
void exec(); // 0x8013073c
void triggerWave(KartGamePad *kartGamePad, int index); // 0x80130ad8
void powerWave(KartGamePad *kartGamePad,
f32 strength,
u8 phase1Duration,
u8 phase2Duration); // 0x80130b50
void stop(); // 0x80130cbc

// Inline/Unused
void loopWave(KartGamePad *, int);
void loopWave(KartGamePad *, char *);
void checkLoop(int, const char *);
void triggerWave(KartGamePad *, char *);
}; // class Motor
#endif // MOTOR_H

private:
static const char *mPatternWave[26]; // 0x803942e8

struct
{
KartGamePad *mKartGamePad; // 0x0

struct
{
const char *wave; // 0x4
u32 value; // 0x8
} mDriverMotor[4]; // 0x4

struct
{
const char *wave; // 0x24
u32 value; // 0x28
} mPartnerMotor[4]; // 0x24

u32 mUnknown[4]; // 0x44
} mMotorData[4];

void *mUnknownPtr; // 0x150
s32 mCount; // 0x154

MotorHioNode *mHioNode; // 0x158 (344)
};

#endif // MOTOR_H
1 change: 1 addition & 0 deletions include/Osako/kartPad.h
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ class KartGamePad : public JUTGamePad
PORT_2 = 1,
PORT_3 = 2,
PORT_4 = 3,
PORT_COUNT = 4,
};

enum PadType
Expand Down
175 changes: 166 additions & 9 deletions src/Kameda/Motor.cpp
Original file line number Diff line number Diff line change
@@ -1,5 +1,12 @@
#include "Kameda/Motor.h"

#include "JSystem/JAudio/JASFakeMatch2.h" // For static initializer
#include "Kaneshige/RaceMgr.h"
#include "Osako/kartPad.h"
#include "Yamamoto/kartCtrl.h"
#include "dolphin/pad.h"

// clang-format off
const char *Motor::mPatternWave[26] = {
"/",
"*****---**--*",
Expand All @@ -24,23 +31,173 @@ const char *Motor::mPatternWave[26] = {
"********/",
"**------*-----*---*--*-*-******-*-*--*--*---*----*-----*------*-------*--------*---------*----------*",
"***-------*-------*------*-----*----*----*---*---*---*---*---*--*--*--*-*-*-*-*-*-*-*-*-*-*-*--*--*--*--*---*---*---*---*---*---*---*---*----*----*-----*-----*-----*------*------*------*-------*-------*-------*-------*--------*----------*------------*",
"******---*-------*/",
"******-***-**-*--*------*",
"*****--**--*"
"******---*-------*/",
"******-***-**-*--*------*",
"*****--**--*",
};
// clang-format on

Motor::Motor(JKRHeap *heap)
{
mHioNode = new (heap, 0) MotorHioNode();

init();
}

void Motor::init()
{
for (int i = 0; i < 4; ++i)
{
mMotorData[i].mKartGamePad = nullptr;

for (int j = 0; j < 4; ++j)
{
mMotorData[i].mDriverMotor[j].wave = mPatternWave[0];
mMotorData[i].mDriverMotor[j].value = 0xFFFFFFFF;

mMotorData[i].mUnknown[0] = 0;

mMotorData[i].mPartnerMotor[j].wave = mPatternWave[0];
mMotorData[i].mPartnerMotor[j].value = 0xFFFFFFFF;
}

// TODO: Not quite it.
}

#if 0
iVar2 = 0;

for (int i = 0; i < 4; ++i)
{
pMVar5 = this + iVar2;
*(undefined4 *)pMVar5 = 0;

iVar3 = 0;
iVar4 = 0;

for (int j = 0; j < 4; ++j)
{
iVar1 = iVar3 + 0x44;
iVar3 = iVar3 + 4;

*(undefined **)(pMVar5 + iVar4 + 4) = mPatternWave;
*(undefined4 *)(pMVar5 + iVar4 + 8) = 0xffffffff;
*(undefined4 *)(pMVar5 + iVar1) = 0;
*(undefined **)(pMVar5 + iVar4 + 0x24) = mPatternWave;
*(undefined4 *)(pMVar5 + iVar4 + 0x28) = 0xffffffff;

iVar4 = iVar4 + 8;
}

Motor::Motor(JKRHeap *) {}
iVar2 = iVar2 + 0x54;
}
#endif

void Motor::init() {}
mUnknownPtr = nullptr;
mCount = 0;

stop();
}

Motor::~Motor() {}

void Motor::exec() {}

void Motor::triggerWave(KartGamePad *, int) {}
void Motor::triggerWave(KartGamePad *kartGamePad, int index)
{
if (!kartGamePad)
return;

KartGamePad::PadPort padPort = kartGamePad->getPadPort();
if (0 <= padPort && padPort < KartGamePad::PORT_COUNT)
{
mMotorData[padPort].mKartGamePad = kartGamePad;

mMotorData[padPort].mPartnerMotor[mCount].wave = mPatternWave[index];
mMotorData[padPort].mPartnerMotor[mCount].value = 0;

if (++mCount >= 4)
{
mCount = 0;
}
}
}

void Motor::powerWave(KartGamePad *kartGamePad, f32 strength, u8 phase1Duration, u8 phase2Duration)
{
KartGamePad::PadPort padPort = kartGamePad->getPadPort();
if (0 <= padPort && padPort < KartGamePad::PORT_COUNT)
{
static char patterns[KartGamePad::PORT_COUNT][512];
char *pattern = patterns[padPort];

f32 power = 0.0f;

for (s32 duration = phase1Duration + phase2Duration, i = 0; duration > 0; --duration)
{
if (i < phase1Duration)
{
power += strength;

if (power >= 1.0f)
{
power = power - 1.0f;
*pattern = '*';
}
else
{
*pattern = '-';
}
}
else
{
power += strength * (1.0f - (i - phase1Duration) / (f32)phase2Duration);

if (power >= 1.0f)
{
power = power - 1.0f;
*pattern = '*';
}
else
{
*pattern = '-';
}
}

++i;
pattern += 1;
}

pattern[phase1Duration + phase2Duration] = '\0';

if (!kartGamePad)
return;

KartGamePad::PadPort padPort = kartGamePad->getPadPort();
if (0 <= padPort && padPort < KartGamePad::PORT_COUNT)
{
mMotorData[padPort].mKartGamePad = kartGamePad;

mMotorData[padPort].mPartnerMotor[mCount].wave = pattern;
mMotorData[padPort].mPartnerMotor[mCount].value = 0;

void Motor::powerWave(KartGamePad *, f32, u8, u8) {}
if (++mCount >= 4)
{
mCount = 0;
}
}
}
}

void Motor::stop() {}
void Motor::stop()
{
PADControlMotor(0, 0);
PADControlMotor(1, 0);
PADControlMotor(2, 0);
PADControlMotor(3, 0);

#include "JSystem/JAudio/JASFakeMatch2.h"
for (int i = 0; i < RaceMgr::getManager()->getKartNumber(); ++i)
{
KartCtrl::getKartCtrl()->getKartBody(i)->getHandle()->StopMotor();
}
}
Loading