Skip to content
Merged
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
245 changes: 233 additions & 12 deletions src/SB/Game/zNPCTypePrawn.cpp
Original file line number Diff line number Diff line change
@@ -1,7 +1,12 @@
#include "zNPCTypePrawn.h"

#include "rwcore.h"
#include "xDebug.h"

#include "xMemMgr.h"
#include "zEntCruiseBubble.h"
#include "zNPCTypeCommon.h"
#include "zRenderState.h"
#include <types.h>

#define f1052 1.0f
Expand Down Expand Up @@ -76,21 +81,117 @@ namespace
tweak_callback cb_sound;
tweak_callback cb_sound_asset;

void register_tweaks(bool init, xModelAssetParam* ap, U32 apsize);
void load(xModelAssetParam* p, U32 i);
void register_tweaks(bool init, xModelAssetParam* ap, U32 apsiz, const char* c);
}; // namespace tweak_group

static tweak_group tweak;

void init_sound()
{
}

void kill_sound(S32, U32)
{
}

struct television
{
RwCamera* cam;
RwRaster* raster;
RwRaster* bgraster;
RpWorld* world;
RwTexture* texture;
U32 vert_buffer_used;
RwRGBA bgcolor;
F32 rcz;
F32 w;
F32 h;

void create(S32, S32);
void destroy();
void set_background(iColor_tag);
void set_model_texture(xModelInstance&);
void update(xModelInstance&, xLightKit*);
void render_static();
void render_background();
void set_vert(rwGameCube2DVertex&, F32, F32, F32, F32);
void move(const xVec3&, const xVec3&);
};

void television::create(S32 i1, S32 i2)
{
}

void television::destroy()
{
}

void television::set_background(iColor_tag color)
{
this->bgraster = 0;
this->bgcolor.red = color.r;
this->bgcolor.green = color.g;
this->bgcolor.blue = color.b;
this->bgcolor.alpha = color.a;
}

void television::set_model_texture(xModelInstance& m)
{
}

void television::update(xModelInstance& m, xLightKit* l)
{
}

void television::render_static()
{
}

void television::render_background()
{
zRenderState(SDRS_Fill);
RwRenderStateSet(rwRENDERSTATETEXTURERASTER, this->bgraster);
}

void television::set_vert(rwGameCube2DVertex& vert, F32 x, F32 y, F32 u, F32 v)
{
vert.x = x;
vert.y = y;
vert.z = 1.0f;
vert.u = u;
vert.v = v;
vert.emissiveColor.red = 0xff;
vert.emissiveColor.green = 0xff;
vert.emissiveColor.blue = 0xff;
vert.emissiveColor.alpha = 0xff;
}

void television::move(const xVec3& v1, const xVec3& v2)
{
RwFrameTranslate((RwFrame*)this->cam->object.object.parent, (const RwV3d*)&v1, rwCOMBINEREPLACE);
xMat3x3LookAt((xMat3x3*)this->cam->object.object.parent, &v2, &v1);
}

static television closeup;

xBinaryCamera boss_cam;

S32 load_patterns(xModelAssetParam*, U32, const char*, zNPCPrawn::range_type*, S32);
} // namespace

void tweak_group::load(xModelAssetParam* p, U32 i)
{
this->register_tweaks(TRUE, p, i, 0);
}

/*

TODO: 42%, needs quite a bit of work still.
Thought this function was going to be an easy copy/paste like other register_tweak fn,
but turning out to be harder to decipher than I anticipated so leaving it like this for now.
*/
void tweak_group::register_tweaks(bool init, xModelAssetParam* ap, U32 apsize)
void tweak_group::register_tweaks(bool init, xModelAssetParam* ap, U32 apsize, const char* c)
{
if (init)
{
Expand Down Expand Up @@ -236,6 +337,16 @@ void tweak_group::register_tweaks(bool init, xModelAssetParam* ap, U32 apsize)
*/
}

void aqua_beam::load(const aqua_beam::config& c, U32 i)
{
void* a = xSTFindAsset(i, 0);
aqua_beam::load(c, *(RpAtomic*)a);
}

void aqua_beam::load(const aqua_beam::config& c, RpAtomic& a)
{
}

void aqua_beam::reset() // I don't know whats wrong here. Probably a simple error
{
firing = 0;
Expand Down Expand Up @@ -341,12 +452,102 @@ xAnimTable* ZNPC_AnimTable_Prawn()
return table;
}

void zNPCPrawn::Init(xEntAsset* a)
{
boss_cam.init();
init_sound();
zNPCCommon::Init(a);
memset(&this->flag, 0, 1);
this->flg_move = 1;
this->flg_vuln = 0x11;
this->chkby = 0x10;
this->penby = 0x10;
this->beam.load(this->beam.cfg, xStrHash("glow_ring_add.dff"));
closeup.create(0x100, 0x100);
}

void zNPCPrawn::Destroy()
{
zNPCCommon::Destroy();
closeup.destroy();
}

void zNPCPrawn::NewTime(xScene* xscn, float dt)
{
zNPCCommon::NewTime(xscn, dt);
zNPCPrawn::render_closeup();
}



void zNPCPrawn::ParseINI()
{
zNPCCommon::ParseINI();
tweak.load(this->parmdata, this->pdatsize);
tweak.turn_accel = zParamGetFloat(this->parmdata, this->pdatsize, "turn_accel", 5.0f);
tweak.spawn_delay = zParamGetFloat(this->parmdata, this->pdatsize, "spawn_delay", 1.0f);
tweak.repel_radius = zParamGetFloat(this->parmdata, this->pdatsize, "repel_radius", 4.2f);
tweak.safe.pattern.min = zParamGetInt(this->parmdata, this->pdatsize, "safe.pattern.min", 0);
tweak.safe.pattern.max = zParamGetInt(this->parmdata, this->pdatsize, "safe.pattern.max", 0);
tweak.begin.pattern.min = zParamGetInt(this->parmdata, this->pdatsize, "begin.pattern.min", 0);
tweak.begin.pattern.max = zParamGetInt(this->parmdata, this->pdatsize, "begin.pattern.max", 1);
tweak.begin.state_delay = zParamGetFloat(this->parmdata, this->pdatsize, "begin.state_delay", 0.0f);
tweak.begin.transition_delay = zParamGetFloat(this->parmdata, this->pdatsize, "begin.transition_delay", 1.0f);
tweak.beam.delay[0] = zParamGetFloat(this->parmdata, this->pdatsize, "beam.delay[0]", 2.5f);
tweak.beam.delay[1] = zParamGetFloat(this->parmdata, this->pdatsize, "beam.delay[1]", 4.5f);
tweak.beam.delay[2] = zParamGetFloat(this->parmdata, this->pdatsize, "beam.delay[2]", 6.5f);
tweak.beam.pattern.min = zParamGetInt(this->parmdata, this->pdatsize, "beam.pattern.min", 3);
tweak.beam.pattern.max = zParamGetInt(this->parmdata, this->pdatsize, "beam.pattern.max", 0x13);
tweak.beam.state_delay = zParamGetFloat(this->parmdata, this->pdatsize, "beam.state_delay", 0.05f);
tweak.beam.transition_delay = zParamGetFloat(this->parmdata, this->pdatsize, "beam.transition_delay", 0.05f);
tweak.beam.exhaust_vel = zParamGetFloat(this->parmdata, this->pdatsize, "beam.exhaust_vel", 15.0f);
tweak.beam.knock_back = zParamGetFloat(this->parmdata, this->pdatsize, "beam.knock_back", 1.0f);
tweak.beam.sweep.amount[0] = zParamGetInt(this->parmdata, this->pdatsize, "beam.sweep.amount[0]", 2);
tweak.beam.sweep.amount[1] = zParamGetInt(this->parmdata, this->pdatsize, "beam.sweep.amount[1]", 3);
tweak.beam.sweep.amount[2] = zParamGetInt(this->parmdata, this->pdatsize, "beam.sweep.amount[2]", 4);
tweak.beam.sweep.arc = zParamGetFloat(this->parmdata, this->pdatsize, "beam.sweep.arc", 20.0f);
tweak.beam.sweep.arc = zParamGetFloat(this->parmdata, this->pdatsize, "beam.sweep.delay", 0.5f);
tweak.beam.sweep.arc = zParamGetFloat(this->parmdata, this->pdatsize, "beam.sweep.accel", 60.0f);
tweak.beam.sweep.arc = zParamGetFloat(this->parmdata, this->pdatsize, "beam.sweep.max_vel", 26.5f);
tweak.beam.sweep.arc = zParamGetFloat(this->parmdata, this->pdatsize, "beam.fire.ring.size", 0.4f);
tweak.beam.sweep.arc = zParamGetFloat(this->parmdata, this->pdatsize, "beam.fire.ring.alpha", 1.0f);
tweak.beam.sweep.arc = zParamGetFloat(this->parmdata, this->pdatsize, "beam.fire.ring.vel", 9.0f);
tweak.beam.sweep.arc = zParamGetFloat(this->parmdata, this->pdatsize, "beam.fire.ring.accel", 10.0f);
tweak.beam.sweep.arc = zParamGetFloat(this->parmdata, this->pdatsize, "beam.fire.ring.emit_delay", 0.1f);
tweak.beam.sweep.arc = zParamGetFloat(this->parmdata, this->pdatsize, "beam.fire.ring.grow", 0.15f);
tweak.beam.sweep.arc = zParamGetFloat(this->parmdata, this->pdatsize, "beam.fire.ring.fade_dist", 15.0f);
tweak.beam.sweep.arc = zParamGetFloat(this->parmdata, this->pdatsize, "beam.fire.ring.kill_dist", 20.0f);
tweak.beam.sweep.arc = zParamGetFloat(this->parmdata, this->pdatsize, "beam.fire.ring.follow", 0.0f);
tweak.beam.sweep.arc = zParamGetFloat(this->parmdata, this->pdatsize, "beam.fire.ring.hit_radius", 0.3f);
tweak.beam.fire.ring.hit_offset = zParamGetVector(this->parmdata, this->pdatsize, "beam.fire.ring.hit_offset", xVec3::create(0.0f, 0.0f, 0.0f), &tweak.beam.fire.ring.hit_offset);
tweak.beam.fire.emit_bone = zParamGetInt(this->parmdata, this->pdatsize, "beam.fire.emit_bone", 0x2b);
tweak.beam.fire.offset = zParamGetVector(this->parmdata, this->pdatsize, "beam.fire.offset", xVec3::create(0.0f, 0.0f, 0.0f), &tweak.beam.fire.offset);
tweak.beam.fire.yaw = zParamGetFloat(this->parmdata, this->pdatsize, "beam.fire.yaw", 0.0f);
tweak.beam.fire.pitch = zParamGetFloat(this->parmdata, this->pdatsize, "beam.fire.pitch", 5.5f);
isin(tweak.beam.fire.pitch);
icos(tweak.beam.fire.pitch);
tweak.aim_lane.duration = zParamGetFloat(this->parmdata, this->pdatsize, "aim_lane.duration", 2.0f);
tweak.aim_lane.state_delay = zParamGetFloat(this->parmdata, this->pdatsize, "aim_lane.state_delay", 0.1f);
tweak.aim_lane.transition_delay = zParamGetFloat(this->parmdata, this->pdatsize, "aim_lane.transition_delay", 0.1f);
tweak.aim_lane.pattern.first = zParamGetInt(this->parmdata, this->pdatsize, "aim_lane.pattern.first", 0x15);
tweak.aim_lane.pattern.range = zParamGetInt(this->parmdata, this->pdatsize, "aim_lane.pattern.range", 0x8);
tweak.aim_lane.pattern.offset = zParamGetInt(this->parmdata, this->pdatsize, "aim_lane.pattern.offset", 0x9);
tweak.aim_lane.pattern.size = zParamGetInt(this->parmdata, this->pdatsize, "aim_lane.pattern.size", 0x4);
tweak.lane.duration[0] = zParamGetFloat(this->parmdata, this->pdatsize, "lane.duration[0]", 8.0f);
tweak.lane.duration[1] = zParamGetFloat(this->parmdata, this->pdatsize, "lane.duration[1]", 7.0f);
tweak.lane.duration[2] = zParamGetFloat(this->parmdata, this->pdatsize, "lane.duration[2]", 6.0f);
tweak.lane.state_delay = zParamGetFloat(this->parmdata, this->pdatsize, "lane.state_delay", 0.0f);
tweak.lane.transition_delay = zParamGetFloat(this->parmdata, this->pdatsize, "lane.transition_delay", 0.1f);
tweak.lane.pattern.first = zParamGetInt(this->parmdata, this->pdatsize, "lane.pattern.first", 0x39);
tweak.lane.pattern.range = zParamGetInt(this->parmdata, this->pdatsize, "lane.pattern.range", 0x8);
tweak.lane.pattern.offset = zParamGetInt(this->parmdata, this->pdatsize, "lane.pattern.offset", 0x9);
tweak.lane.pattern.size = zParamGetInt(this->parmdata, this->pdatsize, "lane.pattern.size", 0x4);
tweak.danger.state_delay = zParamGetFloat(this->parmdata, this->pdatsize, "danger.state_delay", 0.2f);
tweak.danger.transition_delay = zParamGetFloat(this->parmdata, this->pdatsize, "danger.transition_delay", 0.2f);
tweak.danger.cycle_delay = zParamGetFloat(this->parmdata, this->pdatsize, "danger.cycle_delay", 6.0f);
tweak.danger.pattern_offset = zParamGetInt(this->parmdata, this->pdatsize, "danger.pattern_offset", 0x5d);
}

void zNPCPrawn::SelfSetup()
{
xBehaveMgr* bmgr;
Expand All @@ -366,10 +567,6 @@ void zNPCPrawn::SelfSetup()
psy->SetSafety(NPC_GOAL_PRAWNIDLE);
}

void zNPCPrawn::render_debug()
{
}

void zNPCPrawn::Render()
{
xNPCBasic::Render();
Expand Down Expand Up @@ -608,6 +805,15 @@ void xDebugAddTweak(const char*, xVec3*, const tweak_callback*, void*, U32)
{
}

xVec3& zNPCPrawn::get_center() const
{
return reinterpret_cast<xVec3&>(this->model->Mat->pos);
}

void zNPCPrawn::render_debug()
{
}

// void zNPCPrawn::turning() const
// {
// }
Expand All @@ -628,22 +834,37 @@ void zNPCPrawn::turning() const
temp_f3 = this->turn.vel;
}

U8 zNPCPrawn::PhysicsFlags() const
xVec3& zNPCPrawn::get_facing() const
{
return 3;
return reinterpret_cast<xVec3&>(this->model->Mat->at);
}

U8 zNPCPrawn::ColPenByFlags() const
U8 zNPCPrawn::ColChkFlags() const
{
return 16;
return 0;
}

U8 zNPCPrawn::ColPenFlags() const
{
return 0;
}

U8 zNPCPrawn::ColChkByFlags() const
{
return 16;
}

U8 zNPCPrawn::ColPenFlags() const
U8 zNPCPrawn::ColPenByFlags() const
{
return 0;
return 16;
}

U8 zNPCPrawn::PhysicsFlags() const
{
return 3;
}

S32 zNPCPrawn::IsAlive()
{
return this->life != 0;
}
15 changes: 12 additions & 3 deletions src/SB/Game/zNPCTypePrawn.h
Original file line number Diff line number Diff line change
Expand Up @@ -177,6 +177,8 @@ struct aqua_beam
} squiggle;

S32 ring_sounds; //0xf54
void load(const aqua_beam::config&, U32);
void load(const aqua_beam::config&, RpAtomic&);
void reset();
void start();
void stop();
Expand Down Expand Up @@ -250,7 +252,10 @@ struct zNPCPrawn : zNPCSubBoss
void render_debug();
void Render();
void update_particles(float);
void Init(xEntAsset*);
void Destroy();
void NewTime(xScene*, float);
void ParseINI();
void SelfSetup();
void apply_pending();
void vanish();
Expand All @@ -262,10 +267,14 @@ struct zNPCPrawn : zNPCSubBoss
void set_floor_state(zNPCPrawn::floor_state_enum, bool, bool);
void Damage(en_NPC_DAMAGE_TYPE, xBase*, const xVec3*);

U8 PhysicsFlags() const;
U8 ColPenByFlags() const;
U8 ColChkByFlags() const;
xVec3& get_center() const;
xVec3& get_facing() const;
U8 ColChkFlags() const;
U8 ColPenFlags() const;
U8 ColChkByFlags() const;
U8 ColPenByFlags() const;
U8 PhysicsFlags() const;
S32 IsAlive();
};

struct zNPCGoalPrawnIdle : zNPCGoalCommon
Expand Down