sof-sdk/Source/Game/gamecpp/test.cpp
2000-06-15 00:00:00 +00:00

237 lines
5.5 KiB
C++

#include "g_local.h"
#include "callback.h"
#include "..\qcommon\ef_flags.h"
#include <windows.h>
static bool testSeqEnded;
static int testSeqCounter;
TestSeqEndCallback theTestSeqEndCallback;
bool TestSeqEndCallback::Execute(IGhoulInst *me,void *ent,float time,const void *matrix)
{
edict_t *self=(edict_t *)ent;
testSeqEnded = true;
return true;
}
void ghoul_model_think (edict_t *self)
{
GhoulID cshootSeq=0;
ggObjC *cshoot=0;
GhoulID tempNote;
//see if my end-of sequence callback has fired--if so, get a new sequence
if (testSeqEnded)
{
gi.dprintf("my sequence has ended! hooha!\n");
//get my object again, to find sequences & notes
cshoot=game_ghoul.FindObject("enemy/ecto","officer");
if (testSeqCounter > 6)
{
//no new sequence--want to get rid of the callback, just to show how to do it if ya want.
}
else
{
//pick a new sequence
switch (testSeqCounter%2)
{
case 0:
//this is stretching anim
cshootSeq = game_ghoul.FindObjectSequence(cshoot,"std_istretch_n_a_a");
break;
case 1:
default:
//this is a simple breathe anim
cshootSeq = game_ghoul.FindObjectSequence(cshoot,"std_istand_n_a_n");
break;
}
testSeqCounter++;
}
//if my new sequence is valid, play it
if (cshootSeq)
{
self->ghoulInst->Play(cshootSeq,level.time,0.0f,true,IGhoulInst::Hold);
testSeqEnded = false;
}
else
{
//see if i've registered the end-of-sequence note
tempNote=cshoot->GetMyObject()->FindNoteToken("EOS");
//remove the end-of-sequence callback
if (tempNote)
{
testSeqEnded = false;
self->ghoulInst->RemoveNoteCallBack(&theTestSeqEndCallback,tempNote);
gi.dprintf("getting rid of seq-end callback\n");
//play whatever my first sequence is, just to prove there's no seq-end callback there
cshootSeq = game_ghoul.FindObjectSequence(cshoot,"std_ilooking_n_a_a");
if (cshootSeq)
{
self->ghoulInst->Play(cshootSeq,level.time,0.0f,true,IGhoulInst::Loop);
testSeqEnded = false;
}
}
}
}
self->nextthink = level.time + FRAMETIME;
}
void SP_ghoul_model (edict_t *ent)
{
ggObjC *cshoot=0;
ggObjC *cgun=0;
GhoulID cshootSeq=0;
GhoulID cshootBolt=0;
GhoulID gunSeq=0;
GhoulID gunBolt=0;
ggOinstC *t2;
ggBinstC *gunBolted;
GhoulID tempNote;
ent->movetype = MOVETYPE_STEP;
ent->solid = SOLID_BBOX;
ent->s.renderfx = RF_GHOUL;
cshoot = game_ghoul.FindObject("enemy/ecto","officer");
cgun = game_ghoul.FindObject("enemy/bolt","w_briefcase");
cshootSeq = game_ghoul.FindObjectSequence(cshoot,"std_ilooking_n_a_a");
gunSeq = game_ghoul.FindObjectSequence(cgun,"w_briefcase");
cshootBolt = cshoot->GetMyObject()->FindPart("wbolt_hand_l");
gunBolt = cgun->GetMyObject()->FindPart("to_wbolt_hand_l");
t2 = game_ghoul.AddObjectInstance(cshoot, ent);
ent->ghoulInst=t2->GetInstPtr();
ent->ghoulInst->SetUserData(ent);
if (cshootSeq)
{
ent->ghoulInst->Play(cshootSeq,level.time,0.0f,true,IGhoulInst::Hold);
//see if i've registered the end-of-sequence note
tempNote=cshoot->GetMyObject()->FindNoteToken("EOS");
//add the end-of-sequence callback
if (tempNote)
{
testSeqEnded = false;
testSeqCounter = 0;
ent->ghoulInst->AddNoteCallBack(&theTestSeqEndCallback,tempNote);
}
}
if (gunSeq && cgun && gunBolt && t2 && cshootBolt)
{
gunBolted=t2->AddBoltInstance(cshootBolt, cgun, gunBolt);
gunBolted->PlaySequence(gunSeq,level.time,0.0,true,IGhoulInst::HoldFrame,false,false);
}
VectorSet (ent->mins, -16, -16, -32);
VectorSet (ent->maxs, 16, 16, 16);
ent->think = ghoul_model_think;
ent->nextthink = level.time + FRAMETIME;
gi.linkentity (ent);
}
class TestCallback :public IGhoulCallBack
{
public:
bool Execute(IGhoulInst *me,void *ent,float time,const void *matrix);
};
TestCallback theTestCallback;
bool TestCallback::Execute(IGhoulInst *me,void *ent,float time,const void *matrix)
{
static DWORD last;
edict_t *self=(edict_t *)ent;
// Com_Printf("Diff = %10.2f\n",level.time);
// last = timeGetTime();
return true;
}
/*QUAKED test_rj (1 .5 0) (-16 -16 -16) (16 16 16)
RJ testing model
*/
void SP_test_rj (edict_t *ent)
{
return;
ent->movetype = MOVETYPE_STEP;
ent->solid = SOLID_BBOX;
game_ghoul.SetSimpleGhoulModel(ent, "rj", "rj");
// game_ghoul.SetSimpleGhoulModel(ent, "objects/newyork/gumball", "gumball");
if (ent->ghoulInst)
{
ent->ghoulInst->AddNoteCallBack(&theTestCallback,"rj");
}
gi.linkentity (ent);
/* ggObjC *cshoot=0;
ggObjC *cgun=0;
GhoulID cshootSeq=0;
GhoulID cshootBolt=0;
GhoulID gunSeq=0;
GhoulID gunBolt=0;
ggOinstC *t2;
GhoulID tempNote;
ent->movetype = MOVETYPE_STEP;
ent->solid = SOLID_BBOX;
ent->s.renderfx = RF_GHOUL;
cshoot = game_ghoul.FindObject("rj","rj");
cshootSeq = game_ghoul.FindObjectSequence(cshoot,"rj");
t2 = game_ghoul.AddObjectInstance(cshoot, ent);
ent->ghoulInst=t2->GetInstPtr();
ent->ghoulInst->SetUserData(ent);
if (cshootSeq)
{
ent->ghoulInst->Play(cshootSeq,level.time,0.0f,true,IGhoulInst::Hold);
//see if i've registered the end-of-sequence note
tempNote=cshoot->GetMyObject()->FindNoteToken("RJ");
//add the end-of-sequence callback
if (tempNote)
{
testSeqEnded = false;
testSeqCounter = 0;
ent->ghoulInst->AddNoteCallBack(&theTestCallback,tempNote);
}
}
VectorSet (ent->mins, -16, -16, -32);
VectorSet (ent->maxs, 16, 16, 16);
gi.linkentity (ent);*/
}