From afdbd90bc140c7dd9ae4f09ba8c6e76d2d7cbf1f Mon Sep 17 00:00:00 2001 From: Bill Currie Date: Wed, 11 Feb 2004 02:23:40 +0000 Subject: [PATCH] some tests I've accumulated over time. don't want to lose them accidently :) --- tools/qfcc/test/base.r | 4 + tools/qfcc/test/bool.r | 10 + tools/qfcc/test/chat.r | 410 +++++++++++++++++++ tools/qfcc/test/convert.r | 9 + tools/qfcc/test/debug.r | 21 + tools/qfcc/test/defs.h | 724 +++++++++++++++++++++++++++++++++ tools/qfcc/test/fold.r | 10 + tools/qfcc/test/foo.r | 13 + tools/qfcc/test/func.r | 8 + tools/qfcc/test/libfrikbot.h | 318 +++++++++++++++ tools/qfcc/test/membarray.r | 59 +++ tools/qfcc/test/message.r | 8 + tools/qfcc/test/offset.r | 12 + tools/qfcc/test/prec.qc | 29 ++ tools/qfcc/test/precedence.r | 9 + tools/qfcc/test/progs.src | 3 + tools/qfcc/test/selector.r | 4 + tools/qfcc/test/semi.r | 11 + tools/qfcc/test/shortcircuit.r | 9 + tools/qfcc/test/state.r | 3 + tools/qfcc/test/switch.r | 35 ++ tools/qfcc/test/test.qc | 41 ++ tools/qfcc/test/test.r | 12 + 23 files changed, 1762 insertions(+) create mode 100644 tools/qfcc/test/base.r create mode 100644 tools/qfcc/test/bool.r create mode 100644 tools/qfcc/test/chat.r create mode 100644 tools/qfcc/test/convert.r create mode 100644 tools/qfcc/test/debug.r create mode 100644 tools/qfcc/test/defs.h create mode 100644 tools/qfcc/test/fold.r create mode 100644 tools/qfcc/test/foo.r create mode 100644 tools/qfcc/test/func.r create mode 100644 tools/qfcc/test/libfrikbot.h create mode 100644 tools/qfcc/test/membarray.r create mode 100644 tools/qfcc/test/message.r create mode 100644 tools/qfcc/test/offset.r create mode 100644 tools/qfcc/test/prec.qc create mode 100644 tools/qfcc/test/precedence.r create mode 100644 tools/qfcc/test/progs.src create mode 100644 tools/qfcc/test/selector.r create mode 100644 tools/qfcc/test/semi.r create mode 100644 tools/qfcc/test/shortcircuit.r create mode 100644 tools/qfcc/test/state.r create mode 100644 tools/qfcc/test/switch.r create mode 100644 tools/qfcc/test/test.qc create mode 100644 tools/qfcc/test/test.r diff --git a/tools/qfcc/test/base.r b/tools/qfcc/test/base.r new file mode 100644 index 000000000..2ed07e1ce --- /dev/null +++ b/tools/qfcc/test/base.r @@ -0,0 +1,4 @@ +@class foo; + +@interface bar : foo +@end diff --git a/tools/qfcc/test/bool.r b/tools/qfcc/test/bool.r new file mode 100644 index 000000000..7e6e246ea --- /dev/null +++ b/tools/qfcc/test/bool.r @@ -0,0 +1,10 @@ +integer (integer x, integer y, integer z) foo = +{ + if (x || !y && z) { + return x || y && z; + } else { + for (x = 0; (x || y) && z < 3; x++) + return (x || y && z) ? 4 : 9; + } + return !x; +}; diff --git a/tools/qfcc/test/chat.r b/tools/qfcc/test/chat.r new file mode 100644 index 000000000..37a7319bd --- /dev/null +++ b/tools/qfcc/test/chat.r @@ -0,0 +1,410 @@ +/*********************************************** +* * +* FrikBot Misc Code * +* "Because you can't name it anything else" * +* * +***********************************************/ + +/* +This program is in the Public Domain. My crack legal +team would like to add: + +RYAN "FRIKAC" SMITH IS PROVIDING THIS SOFTWARE "AS IS" +AND MAKES NO WARRANTY, EXPRESS OR IMPLIED, AS TO THE +ACCURACY, CAPABILITY, EFFICIENCY, MERCHANTABILITY, OR +FUNCTIONING OF THIS SOFTWARE AND/OR DOCUMENTATION. IN +NO EVENT WILL RYAN "FRIKAC" SMITH BE LIABLE FOR ANY +GENERAL, CONSEQUENTIAL, INDIRECT, INCIDENTAL, +EXEMPLARY, OR SPECIAL DAMAGES, EVEN IF RYAN "FRIKAC" +SMITH HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES, IRRESPECTIVE OF THE CAUSE OF SUCH DAMAGES. + +You accept this software on the condition that you +indemnify and hold harmless Ryan "FrikaC" Smith from +any and all liability or damages to third parties, +including attorney fees, court costs, and other +related costs and expenses, arising out of your use +of this software irrespective of the cause of said +liability. + +The export from the United States or the subsequent +reexport of this software is subject to compliance +with United States export control and munitions +control restrictions. You agree that in the event you +seek to export this software, you assume full +responsibility for obtaining all necessary export +licenses and approvals and for assuring compliance +with applicable reexport restrictions. + +Any reproduction of this software must contain +this notice in its entirety. +*/ + +#include "libfrikbot.h" + +integer bot_chat_linker; + +@static Bot b_originator; +@static integer b_topic; +/* FBX Topics + +b_originator == self + 1 - sign on + 2 - killed targ + 3 - team message "friendly eyes" + 4 - team message "on your back" + 5 - team message "need back up" + 6 - excuses + ---- + 7 - gameover + ---- + 8 - welcoming someone onto server + 9 - ridicule lost frag (killed self?) + 10 - ridicule lost frag (lava) + 11 - lag +b_originator == targ +*/ + +@implementation Bot (Chat) + +-(void)say:(string)msg +{ + WriteByte (MSG_ALL, 8); + WriteByte (MSG_ALL, 3); + WriteByte (MSG_ALL, 1); + WriteString (MSG_ALL, ent.netname); + WriteByte (MSG_ALL, 8); + WriteByte (MSG_ALL, 3); + WriteByte (MSG_ALL, 2); + WriteString (MSG_ALL, msg); +} + +-(void)say2:(string)msg +{ + WriteByte (MSG_ALL, 8); + WriteByte (MSG_ALL, 3); + WriteByte (MSG_ALL, 2); + WriteString (MSG_ALL, msg); +} + +-(void)sayTeam:(string)msg +{ + // FBX QW doesn't support teamplay...yet +} + +-(void)sayInit +{ + WriteByte (MSG_ALL, 8); + WriteByte (MSG_ALL, 3); + WriteByte (MSG_ALL, 1); + WriteString (MSG_ALL, ent.netname); +} + +// I didn't like the old code so this is very stripped down +-(void)start_topic:(integer)topic +{ + if (random() < 0.2) { + b_topic = topic; + b_originator = self; + } else + b_topic = 0; +} + +-(void)chat +{ + local float r; + + if (b_options & OPT_NOCHAT) + return; + + r = ceil (6 * random ()); + + if (b_chattime > time) { + if (b_skill < 2) + keys = 0; + ent.button0 = ent.button2 = 0; + return; + } else if (b_chattime) { + switch (b_topic) { + case 1: + if (b_originator == self) { + switch (r) { + case 1: + [self say:": lo all\n"]; + [self start_topic:8]; + break; + case 2: + [self say:": hey everyone\n"]; + [self start_topic:8]; + break; + case 3: + [self say:": prepare to be fragged!\n"]; + [self start_topic:0]; + break; + case 4: + [self say:": boy this is laggy\n"]; + [self start_topic:11]; + break; + case 5: + [self say:": #mm getting some lag here\n"]; + [self start_topic:11]; + break; + default: + [self say:": hi everyone\n"]; + [self start_topic:8]; + break; + } + } + break; + case 2: + if (b_originator == self) { + switch (r) { + case 1: + [self say:": take that\n"]; + break; + case 2: + [self say:": yehaww!\n"]; + break; + case 3: + [self say:": wh00p\n"]; + break; + case 4: + [self say:": j00_sawk();\n"]; + break; + case 5: + [self say:": i rule\n"]; + break; + default: + [self say:": eat that\n"]; + break; + } + [self start_topic:0]; + } + break; + case 3: + if (b_originator == self) { + if (r < 3) + [self sayTeam:": friendly eyes\n"]; + else + [self sayTeam:": team eyes\n"]; + [self start_topic:0]; + } + break; + case 4: + if (b_originator == self) { + if (r < 3) + [self sayTeam:": on your back\n"]; + else + [self sayTeam:": I'm with you\n"]; + [self start_topic:0]; + } + break; + case 5: + if (b_originator == self) { + if (r < 3) + [self sayTeam:": I need help\n"]; + else + [self sayTeam:": need backup\n"]; + [self start_topic:0]; + } + break; + case 6: + if (b_originator == self) { + switch (r) { + case 1: + [self say:": sun got in my eyes\n"]; + [self start_topic:0]; + break; + case 2: + [self say:": mouse needs cleaning\n"]; + [self start_topic:0]; + break; + case 3: + [self say:": i meant to do that\n"]; + [self start_topic:0]; + break; + case 4: + [self say:": lag\n"]; + [self start_topic:11]; + break; + case 5: + [self say:": killer lag\n"]; + [self start_topic:11]; + break; + default: + [self say:": 100% lag\n"]; + [self start_topic:11]; + break; + } + } + break; + case 7: + switch (r) { + case 1: + [self say:": gg\n"]; + break; + case 2: + [self say:": gg all\n"]; + break; + case 3: + [self say:": that was fun\n"]; + break; + case 4: + [self say:": good game\n"]; + break; + case 5: + [self say:": pah\n"]; + break; + default: + [self say:": hrm\n"]; + break; + } + [self start_topic:0]; + break; + case 8: + if (b_originator != self) { + switch (r) { + case 1: + [self say:": heya\n"]; + [self start_topic:0]; + break; + case 2: + [self say:": welcome\n"]; + [self start_topic:0]; + break; + case 3: + [self sayInit]; + [self say2:": hi "]; + [self say2:b_originator.ent.netname]; + [self say2:"\n"]; + [self start_topic:0]; + break; + case 5: + [self sayInit]; + [self say2:": hey "]; + [self say2:b_originator.ent.netname]; + [self say2:"\n"]; + [self start_topic:0]; + break; + case 6: + [self say:": howdy\n"]; + [self start_topic:0]; + break; + default: + [self say:": lo\n"]; + [self start_topic:0]; + break; + } + } + break; + case 9: + if (b_originator != self) { + switch (r) { + case 1: + [self say:": hah\n"]; + break; + case 2: + [self say:": heheh\n"]; + break; + case 3: + [self sayInit]; + [self say2:": good work "]; + [self say2:b_originator.ent.netname]; + [self say2:"\n"]; + break; + case 4: + [self sayInit]; + [self say2:": nice1 "]; + [self say2:b_originator.ent.netname]; + [self say2:"\n"]; + break; + case 5: + [self say:": lol\n"]; + break; + default: + [self say:": :)\n"]; + break; + } + b_topic = 6; + } + break; + case 10: + if (b_originator != self) { + switch (r) { + case 1: + [self say:": have a nice dip?\n"]; + break; + case 2: + [self say:": bah I hate levels with lava\n"]; + break; + case 3: + [self sayInit]; + [self say2:": good job "]; + [self say2:b_originator.ent.netname]; + [self say2:"\n"]; + break; + case 4: + [self sayInit]; + [self say2:": nice backflip "]; + [self say2:b_originator.ent.netname]; + [self say2:"\n"]; + break; + case 5: + [self say:": watch your step\n"]; + break; + default: + [self say:": hehe\n"]; + break; + } + b_topic = 6; + } + break; + case 11: + if (b_originator != self) { + switch (r) { + case 1: + [self sayInit]; + [self say2:": yeah right "]; + [self say2:b_originator.ent.netname]; + [self say2:"\n"]; + [self start_topic:0]; + break; + case 2: + [self say:": ping\n"]; + [self start_topic:0]; + break; + case 3: + [self say:": shuddup, you're an lpb\n"]; + [self start_topic:0]; + break; + case 4: + [self say:": lag my eye\n"]; + [self start_topic:0]; + break; + case 5: + [self say:": yeah\n"]; + [self start_topic:11]; + break; + default: + [self say:": totally\n"]; + [self start_topic:11]; + break; + } + } + default: + break; + } + b_chattime = 0; + } else if (b_topic) { + if (random () < 0.5) { + if (self == b_originator) { + if (b_topic <= 7) + b_chattime = time + 2; + } else { + if (b_topic >= 7) + b_chattime = time + 2; + } + } + } +} +@end diff --git a/tools/qfcc/test/convert.r b/tools/qfcc/test/convert.r new file mode 100644 index 000000000..fe9cd3ca1 --- /dev/null +++ b/tools/qfcc/test/convert.r @@ -0,0 +1,9 @@ +#include "gui/Rect.h" + +void (integer x) foo; + +void (float y) bar = +{ + foo (y); + [[Rect alloc] initWithComponents:1 :2 :y :3]; +}; diff --git a/tools/qfcc/test/debug.r b/tools/qfcc/test/debug.r new file mode 100644 index 000000000..ff7372eee --- /dev/null +++ b/tools/qfcc/test/debug.r @@ -0,0 +1,21 @@ +void (entity e) remove; + +void() SUB_Null = {}; + +void() SUB_Remove = {remove(@self);} +// 0 +// 1 +// 2 +// 3 +// 4 +// 5 +// 6 +// 7 +// 8 +// 9 +// a +// b +void () foo = +{ + return; +}; diff --git a/tools/qfcc/test/defs.h b/tools/qfcc/test/defs.h new file mode 100644 index 000000000..71c2a252a --- /dev/null +++ b/tools/qfcc/test/defs.h @@ -0,0 +1,724 @@ + +/* +============================================================================== + + SOURCE FOR GLOBALVARS_T C STRUCTURE + +============================================================================== +*/ + +// +// system globals +// +@extern entity other; +@extern entity world; +@extern float time; +@extern float frametime; + +@extern entity newmis; // if this is set, the entity that just + // run created a new missile that should + // be simulated immediately + + +@extern float force_retouch; // force all entities to touch triggers + // next frame. this is needed because + // non-moving things don't normally scan + // for triggers, and when a trigger is + // created (like a teleport trigger), it + // needs to catch everything. + // decremented each frame, so set to 2 + // to guarantee everything is touched +@extern string mapname; + +@extern float serverflags; // propagated from level to level, used to + // keep track of completed episodes + +@extern float total_secrets; +@extern float total_monsters; + +@extern float found_secrets; // number of secrets found +@extern float killed_monsters; // number of monsters killed + + +// spawnparms are used to encode information about clients across server +// level changes +@extern float parm1, parm2, parm3, parm4, parm5, parm6, parm7, parm8, parm9, parm10, parm11, parm12, parm13, parm14, parm15, parm16; + +// +// global variables set by built in functions +// +@extern vector v_forward, v_up, v_right; // set by makevectors() + +// set by traceline / tracebox +@extern float trace_allsolid; +@extern float trace_startsolid; +@extern float trace_fraction; +@extern vector trace_endpos; +@extern vector trace_plane_normal; +@extern float trace_plane_dist; +@extern entity trace_ent; +@extern float trace_inopen; +@extern float trace_inwater; + +@extern entity msg_entity; // destination of single entity writes + +// +// required prog functions +// +@extern void() main; // only for testing + +@extern void() StartFrame; + +@extern void() PlayerPreThink; +@extern void() PlayerPostThink; + +@extern void() ClientKill; +@extern void() ClientConnect; +@extern void() PutClientInServer; // call after setting the parm1... parms +@extern void() ClientDisconnect; + +@extern void() SetNewParms; // called when a client first connects to + // a server. sets parms so they can be + // saved off for restarts + +@extern void() SetChangeParms; // call to set parms for self so they can + // be saved for a level transition + + +//================================================ +@extern void end_sys_globals; // flag for structure dumping +//================================================ + +/* +============================================================================== + + SOURCE FOR ENTVARS_T C STRUCTURE + +============================================================================== +*/ + +// +// system fields (*** = do not set in prog code, maintained by C code) +// +@extern .float modelindex; // *** model index in the precached list +@extern .vector absmin, absmax; // *** origin + mins / maxs + +@extern .float ltime; // local time for entity +@extern .float lastruntime; // *** to allow entities to run out of sequence + +@extern .float movetype; +@extern .float solid; + +@extern .vector origin; // *** +@extern .vector oldorigin; // *** +@extern .vector velocity; +@extern .vector angles; +@extern .vector avelocity; + +@extern .string classname; // spawn function +@extern .string model; +@extern .float frame; +@extern .float skin; +@extern .float effects; + +@extern .vector mins, maxs; // bounding box extents reletive to origin +@extern .vector size; // maxs - mins + +@extern .void() touch; +@extern .void() use; +@extern .void() think; +@extern .void() blocked; // for doors or plats, called when can't push other + +@extern .float nextthink; +@extern .entity groundentity; + + + +// stats +@extern .float health; +@extern .float frags; +@extern .float weapon; // one of the IT_SHOTGUN, etc flags +@extern .string weaponmodel; +@extern .float weaponframe; +@extern .float currentammo; +@extern .float ammo_shells, ammo_nails, ammo_rockets, ammo_cells; + +@extern .float items; // bit flags + +@extern .float takedamage; +@extern .entity chain; +@extern .float deadflag; + +@extern .vector view_ofs; // add to origin to get eye point + + +@extern .float button0; // fire +@extern .float button1; // use +@extern .float button2; // jump + +@extern .float impulse; // weapon changes + +@extern .float fixangle; +@extern .vector v_angle; // view / targeting angle for players + +@extern .string netname; + +@extern .entity enemy; + +@extern .float flags; + +@extern .float colormap; +@extern .float team; + +@extern .float max_health; // players maximum health is stored here + +@extern .float teleport_time; // don't back up + +@extern .float armortype; // save this fraction of incoming damage +@extern .float armorvalue; + +@extern .float waterlevel; // 0 = not in, 1 = feet, 2 = wast, 3 = eyes +@extern .float watertype; // a contents value + +@extern .float ideal_yaw; +@extern .float yaw_speed; + +@extern .entity aiment; + +@extern .entity goalentity; // a movetarget or an enemy + +@extern .float spawnflags; + +@extern .string target; +@extern .string targetname; + +// damage is accumulated through a frame. and sent as one single +// message, so the super shotgun doesn't generate huge messages +@extern .float dmg_take; +@extern .float dmg_save; +@extern .entity dmg_inflictor; + +@extern .entity owner; // who launched a missile +@extern .vector movedir; // mostly for doors, but also used for waterjump + +@extern .string message; // trigger messages + +@extern .float sounds; // either a cd track number or sound number + +@extern .string noise, noise1, noise2, noise3; // contains names of wavs to play + +//================================================ +@extern void end_sys_fields; // flag for structure dumping +//================================================ + +/* +============================================================================== + + VARS NOT REFERENCED BY C CODE + +============================================================================== +*/ + + +// +// constants +// + +// edict.flags +@extern float FL_FLY; +@extern float FL_SWIM; +@extern float FL_CLIENT; // set for all client edicts +@extern float FL_INWATER; // for enter / leave water splash +@extern float FL_MONSTER; +@extern float FL_GODMODE; // player cheat +@extern float FL_NOTARGET; // player cheat +@extern float FL_ITEM; // extra wide size for bonus items +@extern float FL_ONGROUND; // standing on something +@extern float FL_PARTIALGROUND; // not all corners are valid +@extern float FL_WATERJUMP; // player jumping out of water +@extern float FL_JUMPRELEASED; // for jump debouncing + +// edict.movetype values +#define MOVETYPE_NONE 0 // never moves +//#define MOVETYPE_ANGLENOCLIP 1 +//#define MOVETYPE_ANGLECLIP 2 +#define MOVETYPE_WALK 3 // players only +#define MOVETYPE_STEP 4 // discrete, not real time unless fall +#define MOVETYPE_FLY 5 +#define MOVETYPE_TOSS 6 // gravity +#define MOVETYPE_PUSH 7 // no clip to world, push and crush +#define MOVETYPE_NOCLIP 8 +#define MOVETYPE_FLYMISSILE 9 // fly with extra size against monsters +#define MOVETYPE_BOUNCE 10 +#define MOVETYPE_BOUNCEMISSILE 11 // bounce with extra size + +// edict.solid values +@extern float SOLID_NOT; // no interaction with other objects +@extern float SOLID_TRIGGER; // touch on edge, but not blocking +@extern float SOLID_BBOX; // touch on edge, block +@extern float SOLID_SLIDEBOX; // touch on edge, but not an onground +@extern float SOLID_BSP; // bsp clip, touch on edge, block + +// range values +@extern float RANGE_MELEE; +@extern float RANGE_NEAR; +@extern float RANGE_MID; +@extern float RANGE_FAR; + +// deadflag values + +@extern float DEAD_NO; +@extern float DEAD_DYING; +@extern float DEAD_DEAD; +@extern float DEAD_RESPAWNABLE; + +// takedamage values + +@extern float DAMAGE_NO; +@extern float DAMAGE_YES; +@extern float DAMAGE_AIM; + +// items +#define IT_AXE 0x001000 +#define IT_SHOTGUN 0x000001 +#define IT_SUPER_SHOTGUN 0x000002 +#define IT_NAILGUN 0x000004 +#define IT_SUPER_NAILGUN 0x000008 +#define IT_GRENADE_LAUNCHER 0x000010 +#define IT_ROCKET_LAUNCHER 0x000020 +#define IT_LIGHTNING 0x000040 +#define IT_EXTRA_WEAPON 0x000080 + +#define IT_SHELLS 0x000100 +#define IT_NAILS 0x000200 +#define IT_ROCKETS 0x000400 +#define IT_CELLS 0x000800 + +#define IT_ARMOR1 0x002000 +#define IT_ARMOR2 0x004000 +#define IT_ARMOR3 0x008000 +#define IT_SUPERHEALTH 0x010000 + +#define IT_KEY1 0x020000 +#define IT_KEY2 0x040000 + +#define IT_INVISIBILITY 0x080000 +#define IT_INVULNERABILITY 0x100000 +#define IT_SUIT 0x200000 +#define IT_QUAD 0x400000 + +// point content values + +@extern float CONTENT_EMPTY; +@extern float CONTENT_SOLID; +@extern float CONTENT_WATER; +@extern float CONTENT_SLIME; +@extern float CONTENT_LAVA; +@extern float CONTENT_SKY; + +@extern float STATE_TOP; +@extern float STATE_BOTTOM; +@extern float STATE_UP; +@extern float STATE_DOWN; + +@extern vector VEC_ORIGIN; +@extern vector VEC_HULL_MIN; +@extern vector VEC_HULL_MAX; + +@extern vector VEC_HULL2_MIN; +@extern vector VEC_HULL2_MAX; + +// protocol bytes +@extern float SVC_TEMPENTITY; +@extern float SVC_KILLEDMONSTER; +@extern float SVC_FOUNDSECRET; +@extern float SVC_INTERMISSION; +@extern float SVC_FINALE; +@extern float SVC_CDTRACK; +@extern float SVC_SELLSCREEN; +@extern float SVC_SMALLKICK; +@extern float SVC_BIGKICK; +@extern float SVC_MUZZLEFLASH; + + +@extern float TE_SPIKE; +@extern float TE_SUPERSPIKE; +@extern float TE_GUNSHOT; +@extern float TE_EXPLOSION; +@extern float TE_TAREXPLOSION; +@extern float TE_LIGHTNING1; +@extern float TE_LIGHTNING2; +@extern float TE_WIZSPIKE; +@extern float TE_KNIGHTSPIKE; +@extern float TE_LIGHTNING3; +@extern float TE_LAVASPLASH; +@extern float TE_TELEPORT; +@extern float TE_BLOOD; +@extern float TE_LIGHTNINGBLOOD; + +// sound channels +// channel 0 never willingly overrides +// other channels (1-7) allways override a playing sound on that channel +@extern float CHAN_AUTO; +@extern float CHAN_WEAPON; +@extern float CHAN_VOICE; +@extern float CHAN_ITEM; +@extern float CHAN_BODY; +@extern float CHAN_NO_PHS_ADD; // ie: CHAN_BODY+CHAN_NO_PHS_ADD + +@extern float ATTN_NONE; +@extern float ATTN_NORM; +@extern float ATTN_IDLE; +@extern float ATTN_STATIC; + +// update types + +@extern float UPDATE_GENERAL; +@extern float UPDATE_STATIC; +@extern float UPDATE_BINARY; +@extern float UPDATE_TEMP; + +// entity effects + +//float EF_BRIGHTFIELD; +//float EF_MUZZLEFLASH; +@extern float EF_BRIGHTLIGHT; +@extern float EF_DIMLIGHT; +@extern float EF_FLAG1; +@extern float EF_FLAG2; +// GLQuakeWorld Stuff +@extern float EF_BLUE; // Blue Globe effect for Quad +@extern float EF_RED; // Red Globe effect for Pentagram +// messages +@extern float MSG_BROADCAST; // unreliable to all +@extern float MSG_ONE; // reliable to one (msg_entity) +@extern float MSG_ALL; // reliable to all +@extern float MSG_INIT; // write to the init string +@extern float MSG_MULTICAST; // for multicast() call + +// message levels +@extern float PRINT_LOW; // pickup messages +@extern float PRINT_MEDIUM; // death messages +@extern float PRINT_HIGH; // critical messages +@extern float PRINT_CHAT; // also goes to chat console + +// multicast sets +@extern float MULTICAST_ALL; // every client +@extern float MULTICAST_PHS; // within hearing +@extern float MULTICAST_PVS; // within sight +@extern float MULTICAST_ALL_R; // every client, reliable +@extern float MULTICAST_PHS_R; // within hearing, reliable +@extern float MULTICAST_PVS_R; // within sight, reliable + + + + +//================================================ + +// +// globals +// +@extern float movedist; + +@extern string string_null; // null string, nothing should be held here +@extern float empty_float; + +@extern entity activator; // the entity that activated a trigger or brush + +@extern entity damage_attacker; // set by T_Damage +@extern entity damage_inflictor; +@extern float framecount; + +// +// cvars checked each frame +// +@extern float teamplay; +@extern float timelimit; +@extern float fraglimit; +@extern float deathmatch; +@extern float rj; + +//================================================ + +// +// world fields (FIXME: make globals) +// +@extern .string wad; +@extern .string map; +@extern .float worldtype; // 0=medieval 1=metal 2=base + +//================================================ + +@extern .string killtarget; + +// +// quakeed fields +// +@extern .float light_lev; // not used by game, but parsed by light util +@extern .float style; + + +// +// monster ai +// +@extern .void() th_stand; +@extern .void() th_walk; +@extern .void() th_run; +@extern .void() th_missile; +@extern .void() th_melee; +@extern .void(entity attacker, float damage) th_pain; +@extern .void() th_die; + +@extern .entity oldenemy; // mad at this player before taking damage + +@extern .float speed; + +@extern .float lefty; + +@extern .float search_time; +@extern .float attack_state; + +@extern float AS_STRAIGHT; +@extern float AS_SLIDING; +@extern float AS_MELEE; +@extern float AS_MISSILE; + +// +// player only fields +// +@extern .float voided; +@extern .float walkframe; + +// Zoid Additions +@extern .float maxspeed; // Used to set Maxspeed on a player +@extern .float gravity; // Gravity Multiplier (0 to 1.0) + + + +@extern .float attack_finished; +@extern .float pain_finished; + +@extern .float invincible_finished; +@extern .float invisible_finished; +@extern .float super_damage_finished; +@extern .float radsuit_finished; + +@extern .float invincible_time, invincible_sound; +@extern .float invisible_time, invisible_sound; +@extern .float super_time, super_sound; +@extern .float rad_time; +@extern .float fly_sound; + +@extern .float axhitme; + +@extern .float show_hostile; // set to time+0.2 whenever a client fires a + // weapon or takes damage. Used to alert + // monsters that otherwise would let the player go +@extern .float jump_flag; // player jump flag +@extern .float swim_flag; // player swimming sound flag +@extern .float air_finished; // when time > air_finished, start drowning +@extern .float bubble_count; // keeps track of the number of bubbles +@extern .string deathtype; // keeps track of how the player died + +// +// object stuff +// +@extern .string mdl; +@extern .vector mangle; // angle at start + +@extern .vector oldorigin; // only used by secret door + +@extern .float t_length, t_width; + + +// +// doors, etc +// +@extern .vector dest, dest1, dest2; +@extern .float wait; // time from firing to restarting +@extern .float delay; // time from activation to firing +@extern .entity trigger_field; // door's trigger entity +@extern .string noise4; + +// +// monsters +// +@extern .float pausetime; +@extern .entity movetarget; + + +// +// doors +// +@extern .float aflag; +@extern .float dmg; // damage done by door when hit + +// +// misc +// +@extern .float cnt; // misc flag + +// +// subs +// +@extern .void() think1; +@extern .vector finaldest, finalangle; + +// +// triggers +// +@extern .float count; // for counting triggers + + +// +// plats / doors / buttons +// +@extern .float lip; +@extern .float state; +@extern .vector pos1, pos2; // top and bottom positions +@extern .float height; + +// +// sounds +// +@extern .float waitmin, waitmax; +@extern .float distance; +@extern .float volume; + + + + +//=========================================================================== + + +// +// builtin functions +// + +@extern void(vector ang) makevectors; // sets v_forward, etc globals +@extern void(entity e, vector o) setorigin; +@extern void(entity e, string m) setmodel; // set movetype and solid first +@extern void(entity e, vector min, vector max) setsize; +// #5 was removed +//void() break; +@extern float() random; // returns 0 - 1 +@extern void(entity e, float chan, string samp, float vol, float atten) sound; +@extern vector(vector v) normalize; +@extern void(string e) error; +@extern void(string e) objerror; +@extern float(vector v) vlen; +@extern float(vector v) vectoyaw; +@extern entity() spawn; +@extern void(entity e) remove; + +// sets trace_* globals +// nomonsters can be: +// An entity will also be ignored for testing if forent == test, +// forent->owner == test, or test->owner == forent +// a forent of world is ignored +@extern void(vector v1, vector v2, float nomonsters, entity forent) traceline; + +@extern entity() checkclient; // returns a client to look for +@extern entity(entity start, .string fld, string match) find; +@extern string(string s) precache_sound; +@extern string(string s) precache_model; +@extern void(entity client, string s)stuffcmd; +@extern entity(vector org, float rad) findradius; +@extern void(float level, string s) bprint; +@extern void(entity client, float level, string s) sprint; +@extern void(string s) dprint; +@extern string(float f) ftos; +@extern string(vector v) vtos; +@extern void() coredump; // prints all edicts +@extern void() traceon; // turns statment trace on +@extern void() traceoff; +@extern void(entity e) eprint; // prints an entire edict +@extern float(float yaw, float dist) walkmove; // returns TRUE or FALSE +// #33 was removed +@extern float() droptofloor; // TRUE if landed on floor +@extern void(float style, string value) lightstyle; +@extern float(float v) rint; // round to nearest int +@extern float(float v) floor; // largest integer <= v +@extern float(float v) ceil; // smallest integer >= v +// #39 was removed +@extern float(entity e) checkbottom; // true if self is on ground +@extern float(vector v) pointcontents; // returns a CONTENT_* +// #42 was removed +@extern float(float f) fabs; +@extern vector(entity e, float speed) aim; // returns the shooting vector +@extern float(string s) cvar; // return cvar.value +@extern void(string s) localcmd; // put string into local que +@extern entity(entity e) nextent; // for looping through all ents +// #48 was removed +@extern void() ChangeYaw; // turn towards self.ideal_yaw + // at self.yaw_speed +// #50 was removed +@extern vector(vector v) vectoangles; + +// +// direct client message generation +// +@extern void(float to, float f) WriteByte; +@extern void(float to, float f) WriteChar; +@extern void(float to, float f) WriteShort; +@extern void(float to, float f) WriteLong; +@extern void(float to, float f) WriteCoord; +@extern void(float to, float f) WriteAngle; +@extern void(float to, string s) WriteString; +@extern void(float to, entity s) WriteEntity; + +// several removed + +@extern void(float step) movetogoal; + +@extern string(string s) precache_file; // no effect except for -copy +@extern void(entity e) makestatic; +@extern void(string s) changelevel; + +//#71 was removed + +@extern void(string var, string val) cvar_set; // sets cvar.value + +@extern void(entity client, string s) centerprint; // sprint, but in middle + +@extern void(vector pos, string samp, float vol, float atten) ambientsound; + +@extern string(string s) precache_model2; // registered version only +@extern string(string s) precache_sound2; // registered version only +@extern string(string s) precache_file2; // registered version only + +@extern void(entity e) setspawnparms; // set parm1... to the + // values at level start + // for coop respawn +@extern void(entity killer, entity killee) logfrag; // add to stats + +@extern string(entity e, string key) infokey; // get a key value (world = serverinfo) +@extern float(string s) stof; // convert string to float +@extern void(vector where, float set) multicast; // sends the temp message to a set + // of clients, possibly in PVS or PHS + +//============================================================================ + +// +// subs.qc +// +@extern void(vector tdest, float tspeed, void() func) SUB_CalcMove; +@extern void(entity ent, vector tdest, float tspeed, void() func) SUB_CalcMoveEnt; +@extern void(vector destangle, float tspeed, void() func) SUB_CalcAngleMove; +@extern void() SUB_CalcMoveDone; +@extern void() SUB_CalcAngleMoveDone; +@extern void() SUB_Null; +@extern void() SUB_UseTargets; +@extern void() SUB_Remove; + +// +// combat.qc +// +@extern void(entity targ, entity inflictor, entity attacker, float damage) T_Damage; + + +@extern float (entity e, float healamount, float ignore) T_Heal; // health function + +@extern float(entity targ, entity inflictor) CanDamage; + + diff --git a/tools/qfcc/test/fold.r b/tools/qfcc/test/fold.r new file mode 100644 index 000000000..5390ed73e --- /dev/null +++ b/tools/qfcc/test/fold.r @@ -0,0 +1,10 @@ +float FL_MONSTER = 32; +float FL_FLY = 1; +float FL_SWIM = 2; +.integer flags; +void (entity other) +trigger_monsterjump_touch = +{ + if (other.flags & (FL_MONSTER | FL_FLY | FL_SWIM) != FL_MONSTER) + return; +}; diff --git a/tools/qfcc/test/foo.r b/tools/qfcc/test/foo.r new file mode 100644 index 000000000..42f6a3ace --- /dev/null +++ b/tools/qfcc/test/foo.r @@ -0,0 +1,13 @@ +#include + +@interface Foo : Object +-free; +@end + +@implementation Foo +-free +{ + [super free]; + [self free]; +} +@end diff --git a/tools/qfcc/test/func.r b/tools/qfcc/test/func.r new file mode 100644 index 000000000..58c0a29fa --- /dev/null +++ b/tools/qfcc/test/func.r @@ -0,0 +1,8 @@ +@extern float (integer i) itof; + +void (integer size, integer perc_val) func = +{ + local float perc; + + perc = itof (perc_val) / (100 / itof (size)); +}; diff --git a/tools/qfcc/test/libfrikbot.h b/tools/qfcc/test/libfrikbot.h new file mode 100644 index 000000000..11d22a9d8 --- /dev/null +++ b/tools/qfcc/test/libfrikbot.h @@ -0,0 +1,318 @@ +#include "Entity.h" + +@class Bot; +@class Waypoint; + +struct bot_data_t = { + string name; + float pants, shirt; +}; +typedef struct bot_data_t bot_data_t; + +@interface Target: Entity +{ +} +-(vector)realorigin; +-(integer)canSee:(Target)targ ignoring:(entity)ignore; +-(void)setOrigin:(vector) org; +@end + +@interface Waypoint: Target +{ +@public + Waypoint [4] targets; + integer flags; + vector origin; + + integer b_pants, b_skill, b_shirt, b_frags, b_sound; + integer keys; + float items; + Waypoint enemy; + float search_time; +} ++(void)clearAll; ++(Waypoint)waypointForNum:(integer)num; ++(void)fixWaypoints; + ++(void)clearRouteTable; ++(void)clearMyRoute:(Bot) bot; + +-(void)fix; +-(id)init; +-(id)initAt:(vector)org; +-(id)initFromEntity:(entity)ent; + +-(integer)isLinkedTo:(Waypoint)way; +-(integer)linkWay:(Waypoint)way; +-(integer)teleLinkWay:(Waypoint)way; +-(void)unlinkWay:(Waypoint)way; + +-(void)followLink:(Waypoint)e2 :(integer)b_bit; +-(void)waypointThink; + +-(void)clearRoute; +-(void)clearRouteForBot:(Bot)bot; + +-(id)queueForThink; +@end +@class Array; +@extern Array waypoint_array; + +@interface Bot: Target +{ +@public + //model modelindex + //frame angles colormap effects + //owner + + //movetype solid touch watertype flags think nextthink + + integer keys, oldkeys; + integer buttons, impulse; + vector v_angle, b_angle; + vector mouse_emu; + + integer wallhug; + integer ishuman; + float b_frags; + integer b_clientno, b_clientflag; + float b_shirt, b_pants; + float ai_time; + float b_sound; + float missile_speed; + float portal_time; + integer b_skill; + float switch_wallhug; + integer b_aiflags; + integer b_num; + float b_chattime; + float b_entertime; + float b_menu, b_menu_time, b_menu_value; + integer route_failed; + integer dyn_flags, dyn_plat; + float dyn_time; + Waypoint temp_way, last_way, current_way; + entity [4] targets; + entity avoid; + vector obs_dir; + vector b_dir; + vector dyn_dest; + vector punchangle; + + float teleport_time, portal_time; +} +- (id) init; +- (id) initWithEntity: (entity) e named:(bot_data_t [])name skill:(integer)skill; +- (id) initFromPlayer: (entity) e; +- (void) preThink; +- (void) postThink; +- (void) frame; +- (void) disconnect; + +- (void) updateClient; +@end + +@interface Bot (Misc) ++(bot_data_t [])name:(integer)r; ++(bot_data_t [])randomName; +-(integer)fov:(entity)targ; + ++(void)kick; +@end + +@interface Bot (Physics) +- (void)sendMove; +@end + +@interface Bot (Move) +- (void)jump; +- (integer)can_rj; +- (integer)recognize_plat: (integer) flag; +- (integer)keysForDir: (vector) sdir; +- (void)obstructed: (vector) whichway : (integer) danger; +- (void)obstacles; +- (void)dodge_obstruction; +- (void)movetogoal; +- (integer)walkmove: (vector) weird; +- (void)roam; +@end + +@interface Bot (AI) +-(integer)target_onstack:(entity)scot; +-(void)target_add:(entity)e; +-(void)target_drop:(entity)e; +-(void)lost:(Waypoint)targ :(integer)success; +-(void)check_lost:(Waypoint)targ; +-(void)handle_ai; +-(void)path; +-(float)priority_for_thing:(entity)thing; +-(void)look_for_crap:(integer)scope; +-(void)angle_set; +-(void)AI; +@end + +@interface Bot (Fight) +-(float)size_player:(entity)e; +-(void)dodge_stuff; +-(void)weapon_switch:(float)brange; +-(void)shoot; +-(void)fight_style; +@end + +@interface Bot (Way) +-(Waypoint)findWaypoint:(Waypoint)start; +-(void)deleteWaypoint:(Waypoint)what; +-(entity)findThing:(string)s; +-(Waypoint)findRoute:(Waypoint)lastone; +-(void)mark_path:(entity)this; +-(void)get_path:(Waypoint)this :(integer)direct; +-(integer)begin_route; +-(void)spawnTempWaypoint:(vector)org; +-(void)dynamicWaypoint; + +-(integer)canSee:(Target)targ; +@end + +@interface Bot (Chat) +-(void)start_topic:(integer)topic; +-(void)say:(string)msg; +-(void)say2:(string)msg; +-(void)sayTeam:(string)msg; +-(void)sayInit; +-(void)chat; +@end + +#define FALSE 0 +#define TRUE 1 + +/* punchangle + * bot fake kick? + */ +@extern .vector punchangle; // HACK - Don't want to screw with bot_phys + +// --------defines----- +#define SVC_UPDATENAME 13 +#define SVC_UPDATEFRAGS 14 +#define SVC_UPDATECOLORS 17 + +// used for the physics & movement AI +#define KEY_MOVEUP 0x001 +#define KEY_MOVEDOWN 0x002 +#define KEY_MOVELEFT 0x004 +#define KEY_MOVERIGHT 0x008 +#define KEY_MOVEFORWARD 0x010 +#define KEY_MOVEBACK 0x020 +#define KEY_LOOKUP 0x040 +#define KEY_LOOKDOWN 0x080 +#define KEY_LOOKLEFT 0x100 +#define KEY_LOOKRIGHT 0x200 + +#define KEY_LOOK (KEY_LOOKRIGHT|KEY_LOOKLEFT|KEY_LOOKDOWN|KEY_LOOKUP) +#define KEY_MOVE (KEY_MOVEBACK|KEY_MOVEFORWARD|KEY_MOVERIGHT\ + |KEY_MOVELEFT|KEY_MOVEDOWN|KEY_MOVEUP) + +// these are aiflags for waypoints +// some overlap to the bot +#define AI_TELELINK_1 0x00001 // link type +#define AI_TELELINK_2 0x00002 // link type +#define AI_TELELINK_3 0x00004 // link type +#define AI_TELELINK_4 0x00008 // link type +#define AI_DOORFLAG 0x00010 // read ahead +#define AI_PRECISION 0x00020 // read ahead + point +#define AI_SURFACE 0x00040 // point +#define AI_BLIND 0x00080 // read ahead + point +#define AI_JUMP 0x00100 // point + ignore +#define AI_DIRECTIONAL 0x00200 // read ahead + ignore +#define AI_PLAT_BOTTOM 0x00400 // read ahead +#define AI_RIDE_TRAIN 0x00800 // read ahead +#define AI_SUPER_JUMP 0x01000 // point + ignore + route test +#define AI_SNIPER 0x02000 // point type +#define AI_AMBUSH 0x04000 // point type +#define AI_DOOR_NO_OPEN 0x08000 // read ahead +#define AI_DIFFICULT 0x10000 // route test +#define AI_TRACE_TEST 0x20000 // route test + +// addition masks +#define AI_POINT_TYPES (AI_AMBUSH|AI_SNIPER|AI_SUPER_JUMP|AI_JUMP\ + |AI_BLIND|AI_SURFACE|AI_PRECISION) +#define AI_READAHEAD_TYPES (AI_DOOR_NO_OPEN|AI_RIDE_TRAIN|AI_PLAT_BOTTOM\ + |AI_DIRECTIONAL) +#define AI_IGNORE_TYPES (AI_SUPER_JUMP|AI_DIRECTIONAL|AI_JUMP) + +// these are flags for bots/players (dynamic/editor flags) +#define AI_OBSTRUCTED 1 +#define AI_HOLD_SELECT 2 +#define AI_ROUTE_FAILED 2 +#define AI_WAIT 4 +#define AI_DANGER 8 + +#define WM_UNINIT 0 +#define WM_DYNAMIC 1 +#define WM_LOADING 2 +#define WM_LOADED 3 +// editor modes aren't available in QW, but we retain support of them +// since the editor is still built into the AI in places +#define WM_EDITOR 4 +#define WM_EDITOR_DYNAMIC 5 +#define WM_EDITOR_DYNLINK 6 + +#define OPT_NOCHAT 2 + +// -------globals----- +@extern Bot [32] players; +@extern float real_frametime; +@extern float bot_count, b_options; +@extern float lasttime; +@extern float waypoint_mode; +@extern float dump_mode; +@extern float direct_route; +@extern float sv_friction, sv_gravity; +@extern float sv_accelerate, sv_maxspeed, sv_stopspeed; +@extern Bot route_table; +@extern integer busy_waypoints; + +@extern float coop; + +// -------ProtoTypes------ +// external, in main code +@extern void() ClientConnect; +@extern void() ClientDisconnect; +@extern void() SetNewParms; + +// rankings +@extern integer (entity e) ClientNumber; + +@extern void(vector org, vector bit1, integer bit4, integer flargs) make_way; + +@extern void () map_dm1; +@extern void () map_dm2; +@extern void () map_dm3; +@extern void () map_dm4; +@extern void () map_dm5; +@extern void () map_dm6; + +// physics & movement +@extern void() SV_Physics_Client; +@extern void() SV_ClientThink; +@extern void() CL_KeyMove; + +// ai & misc +@extern float(float y1, float y2) angcomp; +@extern float(entity ent, entity targ) sisible; +@extern vector(entity ent) realorigin; +@extern float(float v) frik_anglemod; + +@extern void(Waypoint e1, Waypoint e2, integer flag) DeveloperLightning; + +/* + angles is pitch yaw roll + move is forward right up +*/ +@extern void (entity cl, float sec, vector angles, vector move, integer buttons, integer impulse) SV_UserCmd; + +@extern integer bot_way_linker; +@extern integer bot_move_linker; +@extern integer bot_phys_linker; +@extern integer bot_chat_linker; + +#include "defs.h" diff --git a/tools/qfcc/test/membarray.r b/tools/qfcc/test/membarray.r new file mode 100644 index 000000000..c295083f2 --- /dev/null +++ b/tools/qfcc/test/membarray.r @@ -0,0 +1,59 @@ +#include "Entity.h" + +@class Waypoint; +@class Bot; + +struct bot_data_t = { + string name; + float pants, shirt; +}; +typedef struct bot_data_t bot_data_t; + +@interface Target: Entity +{ +@public + Waypoint current_way; + Target _last; +} +@end + +@interface Waypoint: Target +{ +@public + Waypoint [4] links; + Waypoint []list; + unsigned count; + unsigned b_sound; +} +-(void)fix; +-(void)clearRouteForBot:(Bot)bot; +@end + +@interface Bot: Target +{ +@public + integer b_clientflag; +} +@end + +@implementation Target +@end + +@implementation Waypoint +-(void)fix +{ + //local integer i = 2, tmp; + local unsigned u; + //tmp = (integer)links[i]; + //for (u = 0; u < count; u++) + [list[u] fix]; +} + +-(void)clearRouteForBot:(Bot)bot +{ + local integer flag; + flag = bot.b_clientflag; + b_sound &= ~flag; +} +@end + diff --git a/tools/qfcc/test/message.r b/tools/qfcc/test/message.r new file mode 100644 index 000000000..332fced7f --- /dev/null +++ b/tools/qfcc/test/message.r @@ -0,0 +1,8 @@ +#include +integer zero; +string (Object foo) getstr; + +id (Object foo) bar = +{ + return [foo error:"foo %s", getstr(foo)]; +}; diff --git a/tools/qfcc/test/offset.r b/tools/qfcc/test/offset.r new file mode 100644 index 000000000..d5e16e51e --- /dev/null +++ b/tools/qfcc/test/offset.r @@ -0,0 +1,12 @@ +struct foobar_s = { + integer a; + (struct foobar_s [])[4]b; +}; +typedef struct foobar_s foobar_t; +typedef foobar_t [] foobar_p; + +void (foobar_p foo, vector x, integer y) bar = +{ + foo.a = x.z; + foo.b[1] = (foobar_p)(integer)x.y; +}; diff --git a/tools/qfcc/test/prec.qc b/tools/qfcc/test/prec.qc new file mode 100644 index 000000000..2a84d9b0c --- /dev/null +++ b/tools/qfcc/test/prec.qc @@ -0,0 +1,29 @@ +float (float x, float y, float z) foo = +{ + return !x * y; + return !x / y; + return !x + y; + return !x - y; + return !x < y; + return !x <= y; + return !x > y; + return !x >= y; + return !x == y; + return !x != y; + return !x & y; + return !x | y; + return !x && y; + return !x || y; + return !x = y; +// return x & y = z; // XXX +// return x = y & z; // XXX + return x * y & z; + return x & y * z; +// return x && y = z; // XXX +// return x = y && z; // XXX +// return x && y || z; +// return x || y && z; +// return x < y == z; +// return x == y < z; +// return x * y = z; +}; diff --git a/tools/qfcc/test/precedence.r b/tools/qfcc/test/precedence.r new file mode 100644 index 000000000..9b2aa35df --- /dev/null +++ b/tools/qfcc/test/precedence.r @@ -0,0 +1,9 @@ +float (float x, float y, float z) foo = +{ +// return x || (y && z); +// return (x || y) && z; +// return x || y && z; +// return !x & y; + return x * y + z; + return x + y * z; +}; diff --git a/tools/qfcc/test/progs.src b/tools/qfcc/test/progs.src new file mode 100644 index 000000000..e1545c1c4 --- /dev/null +++ b/tools/qfcc/test/progs.src @@ -0,0 +1,3 @@ +progs.dat + +prec.qc diff --git a/tools/qfcc/test/selector.r b/tools/qfcc/test/selector.r new file mode 100644 index 000000000..f1d5802fa --- /dev/null +++ b/tools/qfcc/test/selector.r @@ -0,0 +1,4 @@ +SEL a = @selector (setBasePos:y:); +SEL b = @selector (setBasePos:); + +void () foo = {}; diff --git a/tools/qfcc/test/semi.r b/tools/qfcc/test/semi.r new file mode 100644 index 000000000..767dcc7d0 --- /dev/null +++ b/tools/qfcc/test/semi.r @@ -0,0 +1,11 @@ +void () zzz = #0; +void () xxx; +void () foo = #0, baz; +void () bar, snafu=#0, blah = {} + +void blaze (); +void fire () = #22; +integer fry (integer x) +{ + return 3 * x; +} diff --git a/tools/qfcc/test/shortcircuit.r b/tools/qfcc/test/shortcircuit.r new file mode 100644 index 000000000..04208c890 --- /dev/null +++ b/tools/qfcc/test/shortcircuit.r @@ -0,0 +1,9 @@ +void (integer x, integer y) foo = +{ + if (x && y) + x += 2; + if (0) + x -= 1; + if (1) + x += 2; +}; diff --git a/tools/qfcc/test/state.r b/tools/qfcc/test/state.r new file mode 100644 index 000000000..f35ae6afe --- /dev/null +++ b/tools/qfcc/test/state.r @@ -0,0 +1,3 @@ +void () bar; +void () foo = [1,bar,0.2] {} +void () bar = [1,foo] {} diff --git a/tools/qfcc/test/switch.r b/tools/qfcc/test/switch.r new file mode 100644 index 000000000..fdd9df808 --- /dev/null +++ b/tools/qfcc/test/switch.r @@ -0,0 +1,35 @@ +#define IT_AXE 0x001000 +#define IT_SHOTGUN 0x000001 +#define IT_SUPER_SHOTGUN 0x000002 +#define IT_NAILGUN 0x000004 +#define IT_SUPER_NAILGUN 0x000008 +#define IT_GRENADE_LAUNCHER 0x000010 +#define IT_ROCKET_LAUNCHER 0x000020 +#define IT_LIGHTNING 0x000040 +#define IT_EXTRA_WEAPON 0x000080 +string foo = "oo"; +vector (integer wep) +weapon_range = +{ + switch (wep) { + case IT_AXE: + return '48 0 64'; + case IT_SHOTGUN: + return '128 0 99999'; + case IT_SUPER_SHOTGUN: + return '128 0 99999'; + case IT_NAILGUN: + return '180 0 3000'; + case IT_SUPER_NAILGUN: + return '180 0 3000'; + case IT_GRENADE_LAUNCHER: + return '180 48 3000'; + case IT_ROCKET_LAUNCHER: + return '180 48 3000'; + case IT_LIGHTNING: + return '350 0 512'; + default: + return '0 0 0'; + } +}; + diff --git a/tools/qfcc/test/test.qc b/tools/qfcc/test/test.qc new file mode 100644 index 000000000..649924182 --- /dev/null +++ b/tools/qfcc/test/test.qc @@ -0,0 +1,41 @@ +#if 0 +#if 0 +integer (void [] a, void [] b) cmp = +{ + return a == b; +}; +#else +entity e; +.@va_list a; +.vector v; + +integer (string fmt, @va_list args) vprintf = +{ + return args.count; +}; + +integer (string fmt, ...) printf = +{ + local @va_list s; + local @va_list t; + s = @args; + //t = @args = s; + s = e.a; + e.a = s; + e.a = s = @args; + return vprintf (fmt, @args); +}; +#endif + +void () blah = +{ + printf ("", 0x1, 0x9, 0xA, 0xF, 0xa, 0xf, 0x12abCD); +}; +#else +entity self; +.float keys; +float (float key) CL_KeyState = +{ + return (float)((self.keys & key) > 0); +}; +#endif diff --git a/tools/qfcc/test/test.r b/tools/qfcc/test/test.r new file mode 100644 index 000000000..38f5cb870 --- /dev/null +++ b/tools/qfcc/test/test.r @@ -0,0 +1,12 @@ +entity self; +.float heat; +.entity ent; +.entity own; +entity () blah; +void (float x) foo = +{ + if (self.heat = 0) + return; + if ((x = self.heat && 0)) + return; +};