quake2-zaero/z_mtest.c

562 lines
12 KiB
C

#if defined(_DEBUG) && defined(_Z_TESTMODE)
#include "g_local.h"
void Weapon_Generic (edict_t *ent,
int FRAME_ACTIVATE_LAST,
int FRAME_FIRE_LAST,
int FRAME_IDLE_LAST,
int FRAME_DEACTIVATE_LAST,
int *pause_frames,
int *fire_frames,
void (*fire)(edict_t *ent));
void P_ProjectSource (gclient_t *client, vec3_t point, vec3_t distance, vec3_t forward, vec3_t right, vec3_t result);
static char testItem_className[256];
static char testItem_gModel[256];
static char testItem_icon[256];
static char testItem_name[256];
static char testItem_aminationFramesStr[4096];
static int testItem_aminationFrames[100];
static vec3_t testItem_Size[2];
gitem_t *testItem;
edict_t *testItemDroped = NULL;
int animUpto;
qboolean testitemOriginMove = false;
float animSpeed = 1.0;
float lineSize = 100.0f;
void Weapon_LineDraw_Fire (edict_t *ent);
void Weapon_LineDraw_Think (edict_t *ent)
{
Weapon_LineDraw_Fire (ent->owner);
ent->owner->client->ps.gunframe--;
}
void Weapon_LineDraw_Fire (edict_t *ent)
{
edict_t *beam;
vec3_t start;
vec3_t forward, right;
vec3_t offset;
AngleVectors (ent->client->v_angle, forward, right, NULL);
VectorSet(offset, 0, 7, ent->viewheight - 8);
P_ProjectSource (ent->client, ent->s.origin, offset, forward, right, start);
if(!ent->client->lineDraw)
{
beam = ent->client->lineDraw = G_Spawn();
beam->classname = "DrawLine";
beam->flags |= FL_DONTSETOLDORIGIN;
beam->owner = ent;
beam->movetype = MOVETYPE_NONE;
beam->solid = SOLID_NOT;
beam->s.renderfx |= RF_BEAM|RF_TRANSLUCENT;
beam->s.modelindex = 1; // must be non-zero
VectorSet (beam->mins, -8, -8, -8);
VectorSet (beam->maxs, 8, 8, 8);
beam->s.frame = 2;
beam->s.skinnum = 0xf3f3f1f1;
beam->think = Weapon_LineDraw_Think;
beam->nextthink = level.time + (FRAMETIME * 2);
}
else
{
beam = ent->client->lineDraw;
}
VectorCopy (start, beam->s.origin);
VectorMA (start, lineSize, forward, beam->s.old_origin);
gi.linkentity (beam);
ent->client->ps.gunframe++;
}
void Weapon_LineDraw (edict_t *ent)
{
static int pause_frames[] = {19, 32, 0};
static int fire_frames[] = {5, 0};
Weapon_Generic (ent, 4, 8, 52, 55, pause_frames, fire_frames, Weapon_LineDraw_Fire);
}
static char testWeap_className[256];
static char testWeap_gModel[256];
static char testWeap_vModel[256];
static char testWeap_icon[256];
static char testWeap_name[256];
static char testWeap_aminationFrames[512];
static char testWeap_idleFrames[512];
static char testWeap_fireFrames[512];
static int testWeap_FRAME_ACTIVATE_LAST;
static int testWeap_FRAME_FIRE_LAST;
static int testWeap_FRAME_IDLE_LAST;
static int testWeap_FRAME_DEACTIVATE_LAST;
static int testWeap_pause_frames[20];
static int testWeap_fire_frames[20];
gitem_t *testWeapon;
void convertToNumbers(char *frames, int *arrayFrames)
{
int num = 0;
char *bp, *sp;
sp = bp = frames;
while(1)
{
while(*bp != ',' && *bp != (char)NULL)
{
bp++;
}
arrayFrames[num] = atoi(sp);
num++;
if(*bp == (char)NULL)
{
break;
}
sp = bp + 1;
while(*sp == ' ')
{
sp++;
}
bp = sp;
}
arrayFrames[num] = 0;
}
void convertToVector(char *vecStr, vec3_t *size)
{
int num = 0;
char *bp, *sp;
sp = bp = vecStr;
while(1)
{
while(*bp != ',' && *bp != (char)NULL)
{
bp++;
}
(*size)[num] = atof(sp);
num++;
if(num > 2)
{
break;
}
if(*bp == (char)NULL)
{
break;
}
sp = bp + 1;
while(*sp == ' ')
{
sp++;
}
bp = sp;
}
}
void InitTestWeapon(void)
{
FILE *wCfgFile;
char fname[256];
testWeapon = FindItemByClassname ("weapon_test");
if(!testWeapon)
{
return;
}
strcpy(fname, gamedir->string);
strcat(fname, "/testweapon.cfg");
wCfgFile = fopen(fname, "rt");
if(!wCfgFile)
{
return;
}
if(!fgets(testWeap_className, 256, wCfgFile))
{
fclose(wCfgFile);
return;
}
testWeap_className[strlen(testWeap_className) - 1] = 0;
if(!fgets(testWeap_gModel, 256, wCfgFile))
{
fclose(wCfgFile);
return;
}
testWeap_gModel[strlen(testWeap_gModel) - 1] = 0;
if(!fgets(testWeap_vModel, 256, wCfgFile))
{
fclose(wCfgFile);
return;
}
testWeap_vModel[strlen(testWeap_vModel) - 1] = 0;
if(!fgets(testWeap_icon, 256, wCfgFile))
{
fclose(wCfgFile);
return;
}
testWeap_icon[strlen(testWeap_icon) - 1] = 0;
if(!fgets(testWeap_name, 256, wCfgFile))
{
fclose(wCfgFile);
return;
}
testWeap_name[strlen(testWeap_name) - 1] = 0;
if(!fgets(testWeap_aminationFrames, 512, wCfgFile))
{
fclose(wCfgFile);
return;
}
if(!fgets(testWeap_idleFrames, 512, wCfgFile))
{
fclose(wCfgFile);
return;
}
if(!fgets(testWeap_fireFrames, 512, wCfgFile))
{
fclose(wCfgFile);
return;
}
fclose(wCfgFile);
sscanf(testWeap_aminationFrames, "%d,%d,%d,%d", &testWeap_FRAME_ACTIVATE_LAST, &testWeap_FRAME_FIRE_LAST, &testWeap_FRAME_IDLE_LAST, &testWeap_FRAME_DEACTIVATE_LAST);
convertToNumbers(testWeap_idleFrames, testWeap_pause_frames);
convertToNumbers(testWeap_fireFrames, testWeap_fire_frames);
testWeapon->classname = testWeap_className;
testWeapon->world_model = testWeap_gModel;
testWeapon->view_model = testWeap_vModel;
testWeapon->icon = testWeap_icon;
testWeapon->pickup_name = testWeap_name;
}
void Weapon_Test_Fire (edict_t *ent)
{
gi.sound(ent, CHAN_VOICE, gi.soundindex("weapons/blastf1a.wav"), 1, ATTN_NORM, 0);
ent->client->ps.gunframe++;
}
void Weapon_Test (edict_t *ent)
{
Weapon_Generic (ent, testWeap_FRAME_ACTIVATE_LAST,
testWeap_FRAME_FIRE_LAST, testWeap_FRAME_IDLE_LAST,
testWeap_FRAME_DEACTIVATE_LAST,
testWeap_pause_frames, testWeap_fire_frames, Weapon_Test_Fire);
}
static void testitem_think (edict_t *ent)
{
if(testItem_aminationFrames[animUpto])
{
ent->s.frame++;
if(ent->s.frame >= testItem_aminationFrames[animUpto])
{
if(animUpto)
{
ent->s.frame = testItem_aminationFrames[animUpto - 1];
}
else
{
ent->s.frame = 0;
}
}
}
ent->nextthink = level.time + (FRAMETIME * animSpeed);
}
void Cmd_TestItem (edict_t *ent)
{
char *cmd;
cmd = gi.argv(1);
if (Q_stricmp (cmd, "animnext") == 0)
{
if(testItem_aminationFrames[animUpto] && testItem_aminationFrames[animUpto + 1])
{
animUpto++;
gi.cprintf (ent, PRINT_HIGH, "Animation %d set\n", animUpto);
}
}
else if (Q_stricmp (cmd, "animprev") == 0)
{
if(animUpto && testItem_aminationFrames[animUpto - 1])
{
animUpto--;
gi.cprintf (ent, PRINT_HIGH, "Animation %d set\n", animUpto);
}
}
else if (Q_stricmp (cmd, "animspeed") == 0)
{
float as = atof(gi.argv(2));
if(as < 1.0)
{
gi.cprintf (ent, PRINT_HIGH, "AnimSpeed must be greater than or equal to 1\n");
return;
}
animSpeed = as;
}
else if (Q_stricmp (cmd, "movestart") == 0)
{
if(testItemDroped)
{
testitemOriginMove = true;
gi.cprintf (ent, PRINT_HIGH, "testitem move start\n");
}
}
else if (Q_stricmp (cmd, "moveend") == 0)
{
if(testItemDroped)
{
testitemOriginMove = false;
gi.cprintf (ent, PRINT_HIGH, "testitem move end\n");
}
}
else if (Q_stricmp (cmd, "rotatestart") == 0)
{
if(testItemDroped)
{
testItemDroped->s.effects = EF_ROTATE;
gi.cprintf (ent, PRINT_HIGH, "Rotate On\n");
}
}
else if (Q_stricmp (cmd, "rotateend") == 0)
{
if(testItemDroped)
{
testItemDroped->s.effects = 0;
gi.cprintf (ent, PRINT_HIGH, "Rotate Off\n");
}
}
else
{
gi.cprintf (ent, PRINT_HIGH, "Bad testitem command\n");
}
}
void InitTestItem(void)
{
FILE *wCfgFile;
char fname[256];
testItem = FindItemByClassname ("item_test");
if(!testItem)
{
return;
}
strcpy(fname, gamedir->string);
strcat(fname, "/testitem.cfg");
wCfgFile = fopen(fname, "rt");
if(!wCfgFile)
{
return;
}
if(!fgets(testItem_className, 256, wCfgFile))
{
fclose(wCfgFile);
return;
}
testItem_className[strlen(testItem_className) - 1] = 0;
if(!fgets(testItem_gModel, 256, wCfgFile))
{
fclose(wCfgFile);
return;
}
testItem_gModel[strlen(testItem_gModel) - 1] = 0;
if(!fgets(testItem_icon, 256, wCfgFile))
{
fclose(wCfgFile);
return;
}
testItem_icon[strlen(testItem_icon) - 1] = 0;
if(!fgets(testItem_name, 256, wCfgFile))
{
fclose(wCfgFile);
return;
}
testItem_name[strlen(testItem_name) - 1] = 0;
if(!fgets(testItem_aminationFramesStr, 4096, wCfgFile))
{
fclose(wCfgFile);
return;
}
convertToNumbers(testItem_aminationFramesStr, testItem_aminationFrames);
if(!fgets(testItem_aminationFramesStr, 4096, wCfgFile))
{
fclose(wCfgFile);
return;
}
convertToVector(testItem_aminationFramesStr, &(testItem_Size[0]));
if(!fgets(testItem_aminationFramesStr, 4096, wCfgFile))
{
fclose(wCfgFile);
return;
}
convertToVector(testItem_aminationFramesStr, &(testItem_Size[1]));
testItem->classname = testItem_className;
testItem->world_model = testItem_gModel;
testItem->view_model = testItem_gModel;
testItem->icon = testItem_icon;
testItem->pickup_name = testItem_name;
}
qboolean Pickup_TestItem (edict_t *ent, edict_t *other)
{
other->client->pers.inventory[ITEM_INDEX(ent->item)]++;
return true;
}
void drop_temp_touch (edict_t *ent, edict_t *other, cplane_t *plane, csurface_t *surf);
void Drop_TestItem (edict_t *ent, gitem_t *item)
{
vec3_t forward, right;
vec3_t offset;
testitemOriginMove = false;
testItemDroped = G_Spawn();
testItemDroped->classname = item->classname;
testItemDroped->item = item;
testItemDroped->spawnflags = DROPPED_ITEM;
testItemDroped->s.effects = item->world_model_flags;
testItemDroped->s.renderfx = RF_GLOW;
VectorCopy(testItem_Size[0], testItemDroped->mins);
VectorCopy(testItem_Size[1], testItemDroped->maxs);
gi.setmodel (testItemDroped, testItemDroped->item->world_model);
testItemDroped->s.skinnum = 0;
testItemDroped->solid = SOLID_TRIGGER;
testItemDroped->movetype = MOVETYPE_TOSS;
testItemDroped->touch = drop_temp_touch;
testItemDroped->owner = ent;
if (ent->client)
{
trace_t trace;
AngleVectors (ent->client->v_angle, forward, right, NULL);
VectorSet(offset, 24, 0, -16);
G_ProjectSource (ent->s.origin, offset, forward, right, testItemDroped->s.origin);
trace = gi.trace (ent->s.origin, testItemDroped->mins, testItemDroped->maxs,
testItemDroped->s.origin, ent, CONTENTS_SOLID);
VectorCopy (trace.endpos, testItemDroped->s.origin);
}
else
{
AngleVectors (ent->s.angles, forward, right, NULL);
VectorCopy (ent->s.origin, testItemDroped->s.origin);
}
VectorScale (forward, 100, testItemDroped->velocity);
testItemDroped->velocity[2] = 300;
testItemDroped->think = testitem_think;
testItemDroped->nextthink = level.time + 1;
gi.linkentity (testItemDroped);
ent->client->pers.inventory[ITEM_INDEX(item)]--;
ValidateSelectedItem (ent);
}
#endif