mirror of https://github.com/AxioDL/metaforce.git
various implementation
This commit is contained in:
parent
b9c3c8138e
commit
e1d45fd01c
|
@ -2,7 +2,7 @@ cmake_minimum_required(VERSION 3.0)
|
|||
project(RetroCommon)
|
||||
|
||||
cmake_minimum_required(VERSION 3.0)
|
||||
project(hecl)
|
||||
project(RetroCommon)
|
||||
if(MSVC)
|
||||
# Shaddup MSVC
|
||||
add_definitions(-DUNICODE=1 -D_UNICODE=1 -D_CRT_SECURE_NO_WARNINGS=1 /wd4267 /wd4244)
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
#include <stdint.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "RetroTemplates.hpp"
|
||||
#include "RetroTypes.hpp"
|
||||
|
||||
#include <Athena/IStreamReader.hpp>
|
||||
#include <Athena/IStreamWriter.hpp>
|
||||
|
|
|
@ -0,0 +1,50 @@
|
|||
#include "CEntity.hpp"
|
||||
|
||||
namespace Retro
|
||||
{
|
||||
|
||||
CEntity::CEntity(TUniqueId uniqueId, const CEntityInfo& info, bool active)
|
||||
: m_uid(uniqueId), m_info(info), m_active(active) {}
|
||||
|
||||
void CEntity::AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId objId, CStateManager& stateMgr)
|
||||
{
|
||||
switch (msg)
|
||||
{
|
||||
case MsgActivate:
|
||||
if (!GetActive())
|
||||
{
|
||||
SetActive(true);
|
||||
SendScriptMsgs(StActive, stateMgr, MsgNone);
|
||||
}
|
||||
break;
|
||||
case MsgDeactivate:
|
||||
if (GetActive())
|
||||
{
|
||||
SetActive(false);
|
||||
SendScriptMsgs(StInactive, stateMgr, MsgNone);
|
||||
}
|
||||
break;
|
||||
case MsgToggleActive:
|
||||
if (GetActive())
|
||||
{
|
||||
SetActive(false);
|
||||
SendScriptMsgs(StInactive, stateMgr, MsgNone);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetActive(true);
|
||||
SendScriptMsgs(StActive, stateMgr, MsgNone);
|
||||
}
|
||||
break;
|
||||
default: break;
|
||||
}
|
||||
}
|
||||
|
||||
void CEntity::SendScriptMsgs(EScriptObjectState state, CStateManager& stateMgr, EScriptObjectMessage skipMsg)
|
||||
{
|
||||
for (const SConnection& conn : m_info.m_conns)
|
||||
if (conn.state == state && conn.msg != skipMsg)
|
||||
stateMgr.SendScriptMsg(m_uid, conn.objId, conn.msg, state);
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,48 @@
|
|||
#ifndef __RETRO_CENTITY_HPP__
|
||||
#define __RETRO_CENTITY_HPP__
|
||||
|
||||
#include "RetroTypes.hpp"
|
||||
#include "ScriptObjectSupport.hpp"
|
||||
#include "CStateManager.hpp"
|
||||
|
||||
namespace Retro
|
||||
{
|
||||
|
||||
struct SConnection
|
||||
{
|
||||
EScriptObjectState state;
|
||||
EScriptObjectMessage msg;
|
||||
TEditorId objId;
|
||||
};
|
||||
|
||||
class CEntityInfo
|
||||
{
|
||||
friend class CEntity;
|
||||
TAreaId m_aid;
|
||||
std::vector<SConnection> m_conns;
|
||||
public:
|
||||
CEntityInfo(TAreaId aid, const std::vector<SConnection>& conns)
|
||||
: m_aid(aid), m_conns(conns) {}
|
||||
};
|
||||
|
||||
class CEntity
|
||||
{
|
||||
protected:
|
||||
TUniqueId m_uid;
|
||||
CEntityInfo m_info;
|
||||
bool m_active = false;
|
||||
public:
|
||||
virtual ~CEntity() {}
|
||||
CEntity(TUniqueId uid, const CEntityInfo& info, bool active);
|
||||
virtual void PreThink(float, CStateManager&) {}
|
||||
virtual void Think(float, CStateManager&) {}
|
||||
virtual void AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId objId, CStateManager& stateMgr);
|
||||
virtual bool GetActive() const {return m_active;}
|
||||
virtual void SetActive(bool active) {m_active = active;}
|
||||
|
||||
void SendScriptMsgs(EScriptObjectState state, CStateManager& stateMgr, EScriptObjectMessage msg);
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif // __RETRO_CENTITY_HPP__
|
|
@ -31,9 +31,12 @@ add_library(RuntimeCommon
|
|||
CGameOptions.hpp CGameOptions.cpp
|
||||
CStaticInterference.hpp CStaticInterference.cpp
|
||||
CCRC32.hpp CCRC32.cpp
|
||||
CEntity.hpp CEntity.cpp
|
||||
IFactory.hpp
|
||||
ScriptObjectSupport.hpp ScriptObjectSupport.cpp
|
||||
CObjectList.hpp CObjectList.cpp
|
||||
GameGlobalObjects.hpp
|
||||
RetroTemplates.hpp
|
||||
RetroTypes.hpp
|
||||
GCNTypes.hpp)
|
||||
|
||||
add_subdirectory(MP1)
|
||||
|
|
|
@ -0,0 +1,98 @@
|
|||
#ifndef __RETRO_COBJECTLIST_HPP__
|
||||
#define __RETRO_COBJECTLIST_HPP__
|
||||
|
||||
#include "CEntity.hpp"
|
||||
#include "RetroTypes.hpp"
|
||||
|
||||
namespace Retro
|
||||
{
|
||||
|
||||
enum EGameObjectList
|
||||
{
|
||||
ListAll,
|
||||
ListActor,
|
||||
ListPhysicsActor,
|
||||
ListGameCamera,
|
||||
ListGameLight,
|
||||
ListListeningAi,
|
||||
ListAiWaypoint,
|
||||
ListPlatformAndDoor,
|
||||
};
|
||||
|
||||
class CObjectList
|
||||
{
|
||||
struct SObjectListEntry
|
||||
{
|
||||
CEntity* entity = nullptr;
|
||||
TUniqueId prev = -1;
|
||||
TUniqueId next = -1;
|
||||
};
|
||||
SObjectListEntry m_list[1024];
|
||||
EGameObjectList m_listEnum;
|
||||
TUniqueId m_lastId = -1;
|
||||
u16 m_count = 0;
|
||||
public:
|
||||
CObjectList(EGameObjectList listEnum)
|
||||
: m_listEnum(listEnum)
|
||||
{}
|
||||
|
||||
void AddObject(CEntity& entity)
|
||||
{
|
||||
if (IsQualified())
|
||||
{
|
||||
if (m_lastId != -1)
|
||||
m_list[m_lastId].next = entity.m_uid & 0x3ff;
|
||||
TUniqueId prevLast = m_lastId;
|
||||
m_lastId = entity.m_uid & 0x3ff;
|
||||
SObjectListEntry& newEnt = m_list[m_lastId];
|
||||
newEnt.entity = &entity;
|
||||
newEnt.prev = prevLast;
|
||||
newEnt.next = -1;
|
||||
++m_count;
|
||||
}
|
||||
}
|
||||
|
||||
void RemoveObject(TUniqueId uid)
|
||||
{
|
||||
uid = uid & 0x3ff;
|
||||
SObjectListEntry& ent = m_list[uid];
|
||||
if (!ent.entity || ent.entity->m_uid != uid)
|
||||
return;
|
||||
if (uid == m_lastId)
|
||||
{
|
||||
m_lastId = ent.prev;
|
||||
if (ent.prev != -1)
|
||||
m_list[ent.prev].next = -1;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (ent.prev != -1)
|
||||
m_list[ent.prev].next = -1;
|
||||
m_list[ent.next].prev = -1;
|
||||
}
|
||||
ent.entity = nullptr;
|
||||
ent.prev = -1;
|
||||
ent.next = -1;
|
||||
--m_count;
|
||||
}
|
||||
|
||||
const CEntity* GetObjectById(TUniqueId uid) const
|
||||
{
|
||||
if (!uid)
|
||||
return nullptr;
|
||||
return m_list[uid & 0x3ff].entity;
|
||||
}
|
||||
|
||||
CEntity* GetObjectById(TUniqueId uid)
|
||||
{
|
||||
if (!uid)
|
||||
return nullptr;
|
||||
return m_list[uid & 0x3ff].entity;
|
||||
}
|
||||
|
||||
virtual bool IsQualified() {return true;}
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif // __RETRO_COBJECTLIST_HPP__
|
|
@ -1,7 +1,7 @@
|
|||
#ifndef __RETRO_CPLAYERSTATE_HPP__
|
||||
#define __RETRO_CPLAYERSTATE_HPP__
|
||||
|
||||
#include "RetroTemplates.hpp"
|
||||
#include "RetroTypes.hpp"
|
||||
#include "CStaticInterference.hpp"
|
||||
|
||||
namespace Retro
|
||||
|
|
|
@ -3,4 +3,8 @@
|
|||
namespace Retro
|
||||
{
|
||||
|
||||
void CStateManager::SendScriptMsg(TUniqueId uid, TEditorId eid, EScriptObjectMessage msg, EScriptObjectState state)
|
||||
{
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -7,6 +7,7 @@
|
|||
#include "CMapWorldInfo.hpp"
|
||||
#include "CPlayerState.hpp"
|
||||
#include "CWorldTransManager.hpp"
|
||||
#include "ScriptObjectSupport.hpp"
|
||||
|
||||
namespace Retro
|
||||
{
|
||||
|
@ -18,6 +19,15 @@ public:
|
|||
const std::weak_ptr<CMapWorldInfo>&,
|
||||
const std::weak_ptr<CPlayerState>&,
|
||||
const std::weak_ptr<CWorldTransManager>&);
|
||||
|
||||
void GetObjectListById() const
|
||||
{
|
||||
}
|
||||
void GetObjectById(TUniqueId uid) const
|
||||
{
|
||||
|
||||
}
|
||||
void SendScriptMsg(TUniqueId uid, TEditorId eid, EScriptObjectMessage msg, EScriptObjectState state);
|
||||
};
|
||||
|
||||
}
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
#ifndef __RETRO_TEMPLATES_HPP__
|
||||
#define __RETRO_TEMPLATES_HPP__
|
||||
#ifndef __RETRO_TYPES_HPP__
|
||||
#define __RETRO_TYPES_HPP__
|
||||
|
||||
#include <utility>
|
||||
#include "GCNTypes.hpp"
|
||||
|
@ -8,13 +8,13 @@ namespace Retro
|
|||
{
|
||||
|
||||
/**
|
||||
* @brief Inheritable singleton static-allocator
|
||||
* @brief singleton static-allocator
|
||||
*/
|
||||
template<class T>
|
||||
class TOneStatic
|
||||
{
|
||||
static u8 m_allocspace[sizeof(T)];
|
||||
static uint32_t m_refCount;
|
||||
static u32 m_refCount;
|
||||
public:
|
||||
static T* GetAllocSpace() {return (T*)m_allocspace;}
|
||||
static u32& ReferenceCount() {return m_refCount;}
|
||||
|
@ -42,6 +42,10 @@ public:
|
|||
template<class T> u8 TOneStatic<T>::m_allocspace[sizeof(T)];
|
||||
template<class T> u32 TOneStatic<T>::m_refCount;
|
||||
|
||||
using TUniqueId = s16;
|
||||
using TEditorId = u32;
|
||||
using TAreaId = u32;
|
||||
|
||||
}
|
||||
|
||||
#endif // __RETRO_TEMPLATES_HPP__
|
||||
#endif // __RETRO_TYPES_HPP__
|
|
@ -0,0 +1,73 @@
|
|||
#ifndef __SCRIPT_OBJECT_SUPPORT_HPP__
|
||||
#define __SCRIPT_OBJECT_SUPPORT_HPP__
|
||||
|
||||
namespace Retro
|
||||
{
|
||||
|
||||
enum EScriptObjectState
|
||||
{
|
||||
StActive,
|
||||
StArrived,
|
||||
StClosed,
|
||||
StEntered,
|
||||
StExited,
|
||||
StInactive,
|
||||
StInside,
|
||||
StMaxReached,
|
||||
StOpen,
|
||||
StZero,
|
||||
StAttack,
|
||||
StUNKS1,
|
||||
StRetreat,
|
||||
StPatrol,
|
||||
StDead,
|
||||
StCameraPath,
|
||||
StCameraTarget,
|
||||
StUNKS2,
|
||||
StPlay,
|
||||
StUNKS3,
|
||||
StDeathRattle,
|
||||
StUNKS4,
|
||||
StDamage,
|
||||
StUNKS6,
|
||||
StUNKS5,
|
||||
StModify,
|
||||
StUNKS7,
|
||||
StUNKS8,
|
||||
StScanDone,
|
||||
StUNKS9,
|
||||
StDFST,
|
||||
StReflectedDamage,
|
||||
StInheritBounds
|
||||
};
|
||||
|
||||
enum EScriptObjectMessage
|
||||
{
|
||||
MsgNone = -1,
|
||||
MsgUNKM1 = 0,
|
||||
MsgActivate,
|
||||
MsgUNKM2,
|
||||
MsgClose,
|
||||
MsgDeactivate,
|
||||
MsgDecrement,
|
||||
MsgFollow,
|
||||
MsgIncrement,
|
||||
MsgNext,
|
||||
MsgOpen,
|
||||
MsgReset,
|
||||
MsgResetAndStart,
|
||||
MsgSetToMax,
|
||||
MsgSetToZero,
|
||||
MsgStart,
|
||||
MsgStop,
|
||||
MsgStopAndReset,
|
||||
MsgToggleActive,
|
||||
MsgUNKM3,
|
||||
MsgAction,
|
||||
MsgPlay,
|
||||
MsgAlert
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif // __SCRIPT_OBJECT_SUPPORT_HPP__
|
2
libBoo
2
libBoo
|
@ -1 +1 @@
|
|||
Subproject commit 2c2991d44ec275a31974e42eadfbcdd68c32a400
|
||||
Subproject commit 3a6dd3f6b8277ffc0a3a34a933006176024c900a
|
Loading…
Reference in New Issue