diff --git a/config/SOUE01/splits.txt b/config/SOUE01/splits.txt index 4973c05f..09ef2ec0 100644 --- a/config/SOUE01/splits.txt +++ b/config/SOUE01/splits.txt @@ -208,6 +208,11 @@ f/f_manager.cpp: .sbss start:0x80575BB8 end:0x80575BC0 .bss start:0x805B84D8 end:0x805B8588 +m/m_angle.cpp: + .text start:0x802EE5F0 end:0x802EE6B8 + .ctors start:0x804DB8CC end:0x804DB8D0 + .sbss start:0x80575C08 end:0x80575C10 + m/m_heap.cpp: .text start:0x802F0F00 end:0x802F1660 .rodata start:0x804F0570 end:0x804F0580 diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index f3114665..f5a96a71 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -17710,8 +17710,8 @@ fn_802EE4A0 = .text:0x802EE4A0; // type:function size:0x70 fn_802EE510 = .text:0x802EE510; // type:function size:0x4C adjustFrmHeapRestoreCurrent__16mHeapAllocator_cFv = .text:0x802EE560; // type:function size:0x64 fn_802EE5D0 = .text:0x802EE5D0; // type:function size:0x1C -fn_802EE5F0 = .text:0x802EE5F0; // type:function size:0xA4 -fn_802EE6A0 = .text:0x802EE6A0; // type:function size:0x18 +step__4mAngFsiss = .text:0x802EE5F0; // type:function size:0xA4 +__sinit_\m_angle_cpp = .text:0x802EE6A0; // type:function size:0x18 scope:local fn_802EE6C0 = .text:0x802EE6C0; // type:function size:0x114 fn_802EE7E0 = .text:0x802EE7E0; // type:function size:0x44 fn_802EE830 = .text:0x802EE830; // type:function size:0x58 @@ -40251,7 +40251,7 @@ lbl_80575BF4 = .sbss:0x80575BF4; // type:object size:0x4 data:4byte lbl_80575BF8 = .sbss:0x80575BF8; // type:object size:0x4 data:4byte lbl_80575BFC = .sbss:0x80575BFC; // type:object size:0x1 data:byte lbl_80575C00 = .sbss:0x80575C00; // type:object size:0x8 data:4byte -lbl_80575C08 = .sbss:0x80575C08; // type:object size:0x8 data:2byte +Zero__7mAng3_c = .sbss:0x80575C08; // type:object size:0x6 data:2byte lbl_80575C10 = .sbss:0x80575C10; // type:object size:0x4 data:4byte lbl_80575C14 = .sbss:0x80575C14; // type:object size:0x4 data:4byte lbl_80575C18 = .sbss:0x80575C18; // type:object size:0x4 data:4byte diff --git a/configure.py b/configure.py index 3123135c..01492c45 100644 --- a/configure.py +++ b/configure.py @@ -300,6 +300,7 @@ config.libs = [ Object(NonMatching, "f/f_base.cpp"), Object(Matching, "f/f_list.cpp"), Object(Matching, "f/f_manager.cpp"), + Object(Matching, "m/m_angle.cpp"), Object(Matching, "m/m_heap.cpp"), Object(NonMatching, "m/m_mtx.cpp"), # framework (f_name) diff --git a/include/m/m_angle.h b/include/m/m_angle.h index 29a20d18..37fca394 100644 --- a/include/m/m_angle.h +++ b/include/m/m_angle.h @@ -5,18 +5,25 @@ struct mAng { mAng() {} - mAng(s16 s) : val(s) {} - s16 val; + mAng(s16 s) : mVal(s) {} + + s32 step(s16 target, s32 steps, s16 max, s16 min); + + s16 mVal; }; class mAng3_c { public: s16 x, y, z; + mAng3_c(s16 fx, s16 fy, s16 fz) : x(fx), y(fy), z(fz) {} + void set(s16 fx, s16 fy, s16 fz) { x = fx; y = fy; z = fz; } + + static mAng3_c Zero; }; #endif diff --git a/src/m/m_angle.cpp b/src/m/m_angle.cpp new file mode 100644 index 00000000..a9e9474f --- /dev/null +++ b/src/m/m_angle.cpp @@ -0,0 +1,30 @@ +#include + +/** 80575c08 */ +mAng3_c mAng3_c::Zero = mAng3_c::mAng3_c(0, 0, 0); + +/** 802ee5f0 */ +s32 mAng::step(s16 target, s32 steps, s16 max, s16 min) { + if (mVal != target) { + int stepSize; + int diff = target - mVal; + stepSize = diff / steps; + if (stepSize > min || stepSize < -min) { + mVal += stepSize < -max ? -max : stepSize > max ? max : stepSize; + } else if (diff >= 0) { + if (mVal + min >= target) { + mVal = target; + } else { + mVal += min; + } + } else { + if (mVal - min <= target) { + mVal = target; + } else { + mVal -= min; + } + } + } + + return target - mVal; +}