From 19c47fdcb57d146ad1b39e1f0a1a6adb5a265491 Mon Sep 17 00:00:00 2001 From: Joshua Andrew Date: Tue, 12 Sep 2023 23:30:04 -0400 Subject: [PATCH] some progress on `ScenarioSelectStar.o` --- build.py | 2 +- csv/Map.csv | 16 +-- data/Game.json | 2 +- data/json/Map.json | 2 +- docs/PROGRESS.md | 2 +- docs/lib/Map.md | 2 +- docs/lib/Map/ScenarioSelectStar.md | 18 +-- include/Game/Map/ScenarioSelectStar.h | 52 +++++++++ include/Game/Scene/MultiSceneActor.h | 31 ++++- include/Game/Util/MathUtil.h | 25 +++- .../include/JSystem/JMath/JMATrigonometric.h | 11 ++ prog.png | Bin 25623 -> 25949 bytes source/Game/Map/ScenarioSelectStar.cpp | 109 ++++++++++++++++++ 13 files changed, 248 insertions(+), 24 deletions(-) create mode 100644 include/Game/Map/ScenarioSelectStar.h create mode 100644 source/Game/Map/ScenarioSelectStar.cpp diff --git a/build.py b/build.py index e7d97633..06c66f90 100644 --- a/build.py +++ b/build.py @@ -64,7 +64,7 @@ def main(compile_non_matching, use_ninja, clean_ninja, link): isNotWindows = os.name != "nt" - flags = "-c -Cpp_exceptions off -nodefaults -proc gekko -fp hard -lang=c++ -ipa file -inline auto -O4,s -rtti off -sdata 4 -sdata2 4 -align powerpc -enum int -msgstyle gcc " + flags = "-c -Cpp_exceptions off -nodefaults -proc gekko -fp hard -lang=c++ -ipa file -inline auto,level=2 -O4,s -rtti off -sdata 4 -sdata2 4 -align powerpc -enum int -msgstyle gcc " includes = "-i . -I- -i include " default_compiler_path = pathlib.Path("GC/3.0a3/") diff --git a/csv/Map.csv b/csv/Map.csv index 9f1f8ead..00491b49 100644 --- a/csv/Map.csv +++ b/csv/Map.csv @@ -1212,18 +1212,18 @@ getNearestParam__8RailPartCFRCQ29JGeometry8TVec3f,RailPart.o,Map.a,true set__14LinearRailPartFRCQ29JGeometry8TVec3RCQ29JGeometry8TVec3,RailPart.o,Map.a,true getNearestParam__14LinearRailPartCFRCQ29JGeometry8TVec3f,RailPart.o,Map.a,false __dt__15MultiSceneActorFv,ScenarioSelectStar.o,Map.a,false -__ct__18ScenarioSelectStarFP12EffectSystem,ScenarioSelectStar.o,Map.a,false +__ct__18ScenarioSelectStarFP12EffectSystem,ScenarioSelectStar.o,Map.a,true init__18ScenarioSelectStarFRC12JMapInfoIter,ScenarioSelectStar.o,Map.a,false -calcViewAndEntry__18ScenarioSelectStarFv,ScenarioSelectStar.o,Map.a,false -appear__18ScenarioSelectStarFv,ScenarioSelectStar.o,Map.a,false +calcViewAndEntry__18ScenarioSelectStarFv,ScenarioSelectStar.o,Map.a,true +appear__18ScenarioSelectStarFv,ScenarioSelectStar.o,Map.a,true kill__18ScenarioSelectStarFv,ScenarioSelectStar.o,Map.a,false -tryPointing__18ScenarioSelectStarFv,ScenarioSelectStar.o,Map.a,false +tryPointing__18ScenarioSelectStarFv,ScenarioSelectStar.o,Map.a,true select__18ScenarioSelectStarFv,ScenarioSelectStar.o,Map.a,false notSelect__18ScenarioSelectStarFv,ScenarioSelectStar.o,Map.a,false -isAppearEnd__18ScenarioSelectStarCFv,ScenarioSelectStar.o,Map.a,false -setup__18ScenarioSelectStarFliRCQ29JGeometry8TVec3l,ScenarioSelectStar.o,Map.a,false -control__18ScenarioSelectStarFv,ScenarioSelectStar.o,Map.a,false -tryEndPointing__18ScenarioSelectStarFv,ScenarioSelectStar.o,Map.a,false +isAppearEnd__18ScenarioSelectStarCFv,ScenarioSelectStar.o,Map.a,true +setup__18ScenarioSelectStarFliRCQ29JGeometry8TVec3l,ScenarioSelectStar.o,Map.a,true +control__18ScenarioSelectStarFv,ScenarioSelectStar.o,Map.a,true +tryEndPointing__18ScenarioSelectStarFv,ScenarioSelectStar.o,Map.a,true updatePos__18ScenarioSelectStarFv,ScenarioSelectStar.o,Map.a,false exeAppear__18ScenarioSelectStarFv,ScenarioSelectStar.o,Map.a,false exeNotPointing__18ScenarioSelectStarFv,ScenarioSelectStar.o,Map.a,false diff --git a/data/Game.json b/data/Game.json index 76217b6b..53252ce6 100644 --- a/data/Game.json +++ b/data/Game.json @@ -1,6 +1,6 @@ { "schemaVersion": 1, "label": "Game", - "message": "11.498%", + "message": "11.524%", "color": "blue" } \ No newline at end of file diff --git a/data/json/Map.json b/data/json/Map.json index 714511ef..b5ae6cd2 100644 --- a/data/json/Map.json +++ b/data/json/Map.json @@ -1,6 +1,6 @@ { "schemaVersion": 1, "label": "Map", - "message": "16.35%", + "message": "16.858%", "color": "silver" } \ No newline at end of file diff --git a/docs/PROGRESS.md b/docs/PROGRESS.md index 3a9f7e45..f5764e2c 100644 --- a/docs/PROGRESS.md +++ b/docs/PROGRESS.md @@ -11,7 +11,7 @@ | [GameAudio](https://github.com/shibbo/Petari/blob/master/docs/lib/GameAudio.md) | 0.0% | | [Gravity](https://github.com/shibbo/Petari/blob/master/docs/lib/Gravity.md) | 56.816792337477075% | | [LiveActor](https://github.com/shibbo/Petari/blob/master/docs/lib/LiveActor.md) | 41.44767173812817% | -| [Map](https://github.com/shibbo/Petari/blob/master/docs/lib/Map.md) | 16.35006406328338% | +| [Map](https://github.com/shibbo/Petari/blob/master/docs/lib/Map.md) | 16.858856516814292% | | [MapObj](https://github.com/shibbo/Petari/blob/master/docs/lib/MapObj.md) | 24.973738676429292% | | [NameObj](https://github.com/shibbo/Petari/blob/master/docs/lib/NameObj.md) | 30.427688079697695% | | [NPC](https://github.com/shibbo/Petari/blob/master/docs/lib/NPC.md) | 2.155878467635403% | diff --git a/docs/lib/Map.md b/docs/lib/Map.md index f63d2df4..d611f605 100644 --- a/docs/lib/Map.md +++ b/docs/lib/Map.md @@ -69,7 +69,7 @@ | [RailGraphIter.o](https://github.com/shibbo/Petari/blob/master/docs/lib/Map/RailGraphIter.md) | 100.0% | 15 / 15 | 100.0% | :white_check_mark: | [RailGraphNode.o](https://github.com/shibbo/Petari/blob/master/docs/lib/Map/RailGraphNode.md) | 100.0% | 1 / 1 | 100.0% | :white_check_mark: | [RailPart.o](https://github.com/shibbo/Petari/blob/master/docs/lib/Map/RailPart.md) | 81.33333333333333% | 11 / 12 | 91.66666666666666% | :eight_pointed_black_star: -| [ScenarioSelectStar.o](https://github.com/shibbo/Petari/blob/master/docs/lib/Map/ScenarioSelectStar.md) | 0.0% | 0 / 37 | 0.0% | :x: +| [ScenarioSelectStar.o](https://github.com/shibbo/Petari/blob/master/docs/lib/Map/ScenarioSelectStar.md) | 35.44631306597672% | 8 / 37 | 21.62162162162162% | :eight_pointed_black_star: | [SeaGull.o](https://github.com/shibbo/Petari/blob/master/docs/lib/Map/SeaGull.md) | 54.52127659574468% | 17 / 20 | 85.0% | :eight_pointed_black_star: | [Sky.o](https://github.com/shibbo/Petari/blob/master/docs/lib/Map/Sky.md) | 97.39696312364426% | 19 / 20 | 95.0% | :eight_pointed_black_star: | [SleepController.o](https://github.com/shibbo/Petari/blob/master/docs/lib/Map/SleepController.md) | 0.0% | 0 / 3 | 0.0% | :x: diff --git a/docs/lib/Map/ScenarioSelectStar.md b/docs/lib/Map/ScenarioSelectStar.md index e45c1e4e..b86c9c2c 100644 --- a/docs/lib/Map/ScenarioSelectStar.md +++ b/docs/lib/Map/ScenarioSelectStar.md @@ -5,23 +5,23 @@ | :white_check_mark: | Function is completed. -# 0 / 37 Completed -- (0.0%) +# 8 / 37 Completed -- (21.62162162162162%) # ScenarioSelectStar.o | Symbol | Decompiled? | | ------------- | ------------- | | `__dt__15MultiSceneActorFv` | :x: | -| `__ct__18ScenarioSelectStarFP12EffectSystem` | :x: | +| `__ct__18ScenarioSelectStarFP12EffectSystem` | :white_check_mark: | | `init__18ScenarioSelectStarFRC12JMapInfoIter` | :x: | -| `calcViewAndEntry__18ScenarioSelectStarFv` | :x: | -| `appear__18ScenarioSelectStarFv` | :x: | +| `calcViewAndEntry__18ScenarioSelectStarFv` | :white_check_mark: | +| `appear__18ScenarioSelectStarFv` | :white_check_mark: | | `kill__18ScenarioSelectStarFv` | :x: | -| `tryPointing__18ScenarioSelectStarFv` | :x: | +| `tryPointing__18ScenarioSelectStarFv` | :white_check_mark: | | `select__18ScenarioSelectStarFv` | :x: | | `notSelect__18ScenarioSelectStarFv` | :x: | -| `isAppearEnd__18ScenarioSelectStarCFv` | :x: | -| `setup__18ScenarioSelectStarFliRCQ29JGeometry8TVec3l` | :x: | -| `control__18ScenarioSelectStarFv` | :x: | -| `tryEndPointing__18ScenarioSelectStarFv` | :x: | +| `isAppearEnd__18ScenarioSelectStarCFv` | :white_check_mark: | +| `setup__18ScenarioSelectStarFliRCQ29JGeometry8TVec3l` | :white_check_mark: | +| `control__18ScenarioSelectStarFv` | :white_check_mark: | +| `tryEndPointing__18ScenarioSelectStarFv` | :white_check_mark: | | `updatePos__18ScenarioSelectStarFv` | :x: | | `exeAppear__18ScenarioSelectStarFv` | :x: | | `exeNotPointing__18ScenarioSelectStarFv` | :x: | diff --git a/include/Game/Map/ScenarioSelectStar.h b/include/Game/Map/ScenarioSelectStar.h new file mode 100644 index 00000000..0a39b55f --- /dev/null +++ b/include/Game/Map/ScenarioSelectStar.h @@ -0,0 +1,52 @@ +#pragma once + +#include "Game/Scene/MultiSceneActor.h" +#include "Game/MapObj/PowerStar.h" + +class ScenarioSelectStar : public MultiSceneActor { +public: + ScenarioSelectStar(EffectSystem *); + + virtual ~ScenarioSelectStar(); + virtual void init(const JMapInfoIter &); + virtual void calcViewAndEntry(); + virtual void appear(); + virtual void kill(); + virtual void control(); + + void tryPointing(); + void select(); + void notSelect(); + bool isAppearEnd() const; + void setup(s32, int, const TVec3f &, s32); + bool tryEndPointing(); + void updatePos(); + void exeAppear(); + void exeNotPointing(); + void exePointing(); + void exeEndPointing(); + void exeSelected(); + void exeSelectedMove(); + void exeNotSelected(); + + int _44; + s32 mFrame; // _48 + s32 _4C; + u8 _50; + f32 _54; + s32 _58; + TVec3f _5C; + TVec3f _68; + int _74; + f32 _78; +}; + +namespace NrvScenarioSelectStar { + NERVE_DECL(ScenarioSelectStarNrvAppear, ScenarioSelectStar, ScenarioSelectStar::exeAppear); + NERVE_DECL(ScenarioSelectStarNrvNotPointing, ScenarioSelectStar, ScenarioSelectStar::exeNotPointing); + NERVE_DECL(ScenarioSelectStarNrvPointing, ScenarioSelectStar, ScenarioSelectStar::exePointing); + NERVE_DECL(ScenarioSelectStarNrvEndPointing, ScenarioSelectStar, ScenarioSelectStar::exeEndPointing); + NERVE_DECL(ScenarioSelectStarNrvSelected, ScenarioSelectStar, ScenarioSelectStar::exeSelected); + NERVE_DECL(ScenarioSelectStarNrvSelectedMove, ScenarioSelectStar, ScenarioSelectStar::exeSelectedMove); + NERVE_DECL(ScenarioSelectStarNrvNotSelected, ScenarioSelectStar, ScenarioSelectStar::exeNotSelected); +}; \ No newline at end of file diff --git a/include/Game/Scene/MultiSceneActor.h b/include/Game/Scene/MultiSceneActor.h index 84668c95..051fad80 100644 --- a/include/Game/Scene/MultiSceneActor.h +++ b/include/Game/Scene/MultiSceneActor.h @@ -9,7 +9,10 @@ class MultiSceneActor : public NameObj { public: MultiSceneActor(const char *, const char *, bool); - virtual ~MultiSceneActor(); + virtual ~MultiSceneActor() { + + } + virtual void init(const JMapInfoIter &); virtual void movement(); virtual void calcAnim(); @@ -31,4 +34,30 @@ public: EffectSystem* mEffectSystem; // _38 MultiSceneEffectKeeper* mEffectKeeper; // _3C Spine* mNerve; // _40 +}; + +class MultiScene { +public: + static void startBck(MultiSceneActor *, const char *); + static void startBtk(MultiSceneActor *, const char *); + static void startBtp(MultiSceneActor *, const char *); + static void startBva(MultiSceneActor *, const char *); + static void setBtpFrameAndStop(MultiSceneActor *, f32); + static void setBvaFrameAndStop(MultiSceneActor *, f32); + static bool isBckStopped(MultiSceneActor *); + static bool isStep(const MultiSceneActor *, s32); + static bool isFirstStep(const MultiSceneActor *); + static bool isGreaterStep(const MultiSceneActor *, s32); + static bool isLessStep(const MultiSceneActor *, s32); + static bool isLessEqualStep(const MultiSceneActor *, s32); + static void setNerveAtStep(MultiSceneActor *, const Nerve *, s32); + static void setNerveAtBckStopped(MultiSceneActor *, const Nerve *); + static f32 calcNerveRate(const MultiSceneActor *, s32); + static f32 calcNerveRate(const MultiSceneActor *, s32, s32); + static f32 calcNerveEaseOutRate(const MultiSceneActor *, s32); + static f32 calcNerveValue(const MultiSceneActor *, s32, f32, f32); + static void emitEffect(const MultiSceneActor *, const char *); + static void deleteEffectAll(const MultiSceneActor *); + static void forceDeleteEffectAll(const MultiSceneActor *); + static MtxPtr getJointMtx(const MultiSceneActor *, const char *); }; \ No newline at end of file diff --git a/include/Game/Util/MathUtil.h b/include/Game/Util/MathUtil.h index 39c9cd20..41312053 100644 --- a/include/Game/Util/MathUtil.h +++ b/include/Game/Util/MathUtil.h @@ -3,6 +3,7 @@ #include #include #include "JSystem/JGeometry.h" +#include static f32 minDegree = 0.0f; static f32 maxDegree = 360.0f; @@ -232,6 +233,11 @@ namespace MR { return a1 + (f32)fmod(a3 + a2, a3); } + inline f32 modAndSubtract(f32 a1, f32 a3, f32 a4) { + f32 mod = fmod((a3 + (a1 - a4)), a3); + return a4 + mod; + } + inline f32 add(f32 lhs, f32 rhs) { return lhs + rhs; } @@ -265,7 +271,24 @@ namespace MR { } f32 cos(f32); - f32 sin(f32); + f32 sin(f32 val) { + /*f32 res; + + if (val < 0.0f) { + res = -JMath::sSinCosTable.sinShort(-2607.5945f * val); + } + else { + res = JMath::sSinCosTable.sinShort(2607.5945f * val); + } + + return res;*/ + + return JMath::sSinCosTable.sinLap(val); + } + + inline f32 sin_inline(f32 val) { + return JMath::sSinCosTable.sinLap(val); + } }; f32 PSVECKillElement(const Vec *, const Vec *, const Vec *); \ No newline at end of file diff --git a/libs/JSystem/include/JSystem/JMath/JMATrigonometric.h b/libs/JSystem/include/JSystem/JMath/JMATrigonometric.h index 98247219..36ed4092 100644 --- a/libs/JSystem/include/JSystem/JMath/JMATrigonometric.h +++ b/libs/JSystem/include/JSystem/JMath/JMATrigonometric.h @@ -23,6 +23,17 @@ namespace JMath f32 sinShort(s8 v) const { return table[static_cast(v) >> 3].a1; } f32 cosShort(s8 v) const { return table[static_cast(v) >> 3].b1; } + + inline f32 sinLap(f32 v) { + if (v < 0.0f) { + v *= -2607.5945f; + return -table[(u16)v & 0x3FFF].a1; + } + else { + v *= 2607.5945f; + return table[(u16)v & 0x3FFF].a1; + } + } }; template diff --git a/prog.png b/prog.png index a0dfc1a7b41df62bebcbc6428af8ee4dc9a745e0..102404efe28237af1d6d9f6206797bb84924c984 100644 GIT binary patch literal 25949 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 literal 25623 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 YlDj=?qc->-ez2TU(>$JX?DC!e2kUu1N&o-= diff --git a/source/Game/Map/ScenarioSelectStar.cpp b/source/Game/Map/ScenarioSelectStar.cpp new file mode 100644 index 00000000..e2586714 --- /dev/null +++ b/source/Game/Map/ScenarioSelectStar.cpp @@ -0,0 +1,109 @@ +#include "Game/Map/ScenarioSelectStar.h" +#include "Game/MapObj/PowerStar.h" +#include "Game/Util.h" +#include + +ScenarioSelectStar::ScenarioSelectStar(EffectSystem *pSystem) : MultiSceneActor("シナリオ選択のスター", "PowerStar", false), + _44(0), mFrame(1), _4C(0), _50(0), _54(0.0f), _5C(gZeroVec), _68(gZeroVec) { + _74 = 60; + _78 = 1.0f; + initEffect(pSystem, 0, "ScenarioStar"); + } + +void ScenarioSelectStar::init(const JMapInfoIter &rIter) { + initNerve(&NrvScenarioSelectStar::ScenarioSelectStarNrvNotPointing::sInstance); +} + +void ScenarioSelectStar::calcViewAndEntry() { + if (isNerve(&NrvScenarioSelectStar::ScenarioSelectStarNrvAppear::sInstance) || !MultiScene::isLessEqualStep(this, _74 + 1)) { + MultiSceneActor::calcViewAndEntry(); + } +} + +void ScenarioSelectStar::appear() { + mScale.x = 0.89999998f; + mScale.y = 0.89999998f; + mScale.z = 0.89999998f; + _50 = 0; + _54 = 0.0f; + updatePos(); + MultiScene::startBtp(this, "PowerStar"); + MultiScene::startBva(this, "PowerStar"); + MultiScene::setBtpFrameAndStop(this, PowerStar::getBtpFrameCurrentStage(mFrame)); + MultiScene::setBvaFrameAndStop(this, _44 == 0 ? 1.0f : 0.0f); + MultiSceneActor::appear(); + setNerve(&NrvScenarioSelectStar::ScenarioSelectStarNrvAppear::sInstance); +} + +void ScenarioSelectStar::kill() { + MultiScene::forceDeleteEffectAll(this); + MultiSceneActor::kill(); +} + +void ScenarioSelectStar::tryPointing() { + _50 = 1; + + if (isNerve(&NrvScenarioSelectStar::ScenarioSelectStarNrvNotPointing::sInstance) || isNerve(&NrvScenarioSelectStar::ScenarioSelectStarNrvEndPointing::sInstance)) { + setNerve(&NrvScenarioSelectStar::ScenarioSelectStarNrvPointing::sInstance); + } +} + +void ScenarioSelectStar::select() { + setNerve(&NrvScenarioSelectStar::ScenarioSelectStarNrvSelected::sInstance); +} + +void ScenarioSelectStar::notSelect() { + setNerve(&NrvScenarioSelectStar::ScenarioSelectStarNrvNotSelected::sInstance); +} + +bool ScenarioSelectStar::isAppearEnd() const { + bool ret = false; + + if (!_30 && !isNerve(&NrvScenarioSelectStar::ScenarioSelectStarNrvAppear::sInstance)) { + ret = true; + } + + return ret; +} + +void ScenarioSelectStar::setup(s32 a1, int a2, const TVec3f &a3, s32 a4) { + _44 = a2; + mFrame = a1; + _5C.set(a3); + _4C = a4; + + mRotation.set(0.0f, 0.0f, (150.0f * a4)); + int v7 = _4C; + _74 = 15 * v7 + 60; + _58 = 15 * v7 + ((v7 % 2) ? 0 : 0x5A); +} + +void ScenarioSelectStar::control() { + _50 = 0; + mRotation.z = MR::modAndSubtract(mRotation.z + _54, 360.0f, 0.0f); + + if (isNerve(&NrvScenarioSelectStar::ScenarioSelectStarNrvNotPointing::sInstance) + || isNerve(&NrvScenarioSelectStar::ScenarioSelectStarNrvPointing::sInstance) + || isNerve(&NrvScenarioSelectStar::ScenarioSelectStarNrvEndPointing::sInstance)) { + _58++; + updatePos(); + } +} + +bool ScenarioSelectStar::tryEndPointing() { + if (!_50) { + setNerve(&NrvScenarioSelectStar::ScenarioSelectStarNrvEndPointing::sInstance); + return true; + } + + return false; +} + +/* +void ScenarioSelectStar::updatePos() { + f32 mod = MR::modAndSubtract(360.0f * (_58 / 180.0f), 360.0f, 0.0f); + //f32 val = MR::sin_inline(mod); + + _58 = mod; +} +*/ \ No newline at end of file