5d05b9d3e9
This ports id Software's Quake to run on the SDL plugin runtime. The source code originated from id under the GPLv2 license. I used https://github.com/ahefner/sdlquake as the base of my port. Performance is, unsurprisingly, not on par with what you're probably used to on PC. I average about 10FPS on ipod6g, but it's still playable. Sound works well enough, but in-game music is not supported. I've written ARM assembly routines for the inner sound loop. Make sure you turn the "brightness" all the way down, or colors will look funky. To run, extract Quake's data files to /.rockbox/quake. Have fun! Change-Id: I4285036e967d7f0722802d43cf2096c808ca5799
134 lines
3.7 KiB
C
134 lines
3.7 KiB
C
/*
|
|
Copyright (C) 1996-1997 Id Software, Inc.
|
|
|
|
This program is free software; you can redistribute it and/or
|
|
modify it under the terms of the GNU General Public License
|
|
as published by the Free Software Foundation; either version 2
|
|
of the License, or (at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
|
|
See the GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program; if not, write to the Free Software
|
|
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
|
|
*/
|
|
|
|
#include "pr_comp.h" // defs shared with qcc
|
|
#include "progdefs.h" // generated by program cdefs
|
|
|
|
typedef union eval_s
|
|
{
|
|
string_t string;
|
|
float _float;
|
|
float vector[3];
|
|
func_t function;
|
|
int _int;
|
|
int edict;
|
|
} eval_t;
|
|
|
|
#define MAX_ENT_LEAFS 16
|
|
typedef struct edict_s
|
|
{
|
|
qboolean free;
|
|
link_t area; // linked to a division node or leaf
|
|
|
|
int num_leafs;
|
|
short leafnums[MAX_ENT_LEAFS];
|
|
|
|
entity_state_t baseline;
|
|
|
|
float freetime; // sv.time when the object was freed
|
|
entvars_t v; // C exported fields from progs
|
|
// other fields from progs come immediately after
|
|
} edict_t;
|
|
#define EDICT_FROM_AREA(l) STRUCT_FROM_LINK(l,edict_t,area)
|
|
|
|
//============================================================================
|
|
|
|
extern dprograms_t *progs;
|
|
extern dfunction_t *pr_functions;
|
|
extern char *pr_strings;
|
|
extern ddef_t *pr_globaldefs;
|
|
extern ddef_t *pr_fielddefs;
|
|
extern dstatement_t *pr_statements;
|
|
extern globalvars_t *pr_global_struct;
|
|
extern float *pr_globals; // same as pr_global_struct
|
|
|
|
extern int pr_edict_size; // in bytes
|
|
|
|
//============================================================================
|
|
|
|
void PR_Init (void);
|
|
|
|
void PR_ExecuteProgram (func_t fnum);
|
|
void PR_LoadProgs (void);
|
|
|
|
void PR_Profile_f (void);
|
|
|
|
edict_t *ED_Alloc (void);
|
|
void ED_Free (edict_t *ed);
|
|
|
|
char *ED_NewString (char *string);
|
|
// returns a copy of the string allocated from the server's string heap
|
|
|
|
void ED_Print (edict_t *ed);
|
|
void ED_Write (FILE *f, edict_t *ed);
|
|
char *ED_ParseEdict (char *data, edict_t *ent);
|
|
|
|
void ED_WriteGlobals (FILE *f);
|
|
void ED_ParseGlobals (char *data);
|
|
|
|
void ED_LoadFromFile (char *data);
|
|
|
|
//define EDICT_NUM(n) ((edict_t *)(sv.edicts+ (n)*pr_edict_size))
|
|
//define NUM_FOR_EDICT(e) (((byte *)(e) - sv.edicts)/pr_edict_size)
|
|
|
|
edict_t *EDICT_NUM(int n);
|
|
int NUM_FOR_EDICT(edict_t *e);
|
|
|
|
#define NEXT_EDICT(e) ((edict_t *)( (byte *)e + pr_edict_size))
|
|
|
|
#define EDICT_TO_PROG(e) ((byte *)e - (byte *)sv.edicts)
|
|
#define PROG_TO_EDICT(e) ((edict_t *)((byte *)sv.edicts + e))
|
|
|
|
//============================================================================
|
|
|
|
#define G_FLOAT(o) (pr_globals[o])
|
|
#define G_INT(o) (*(int *)&pr_globals[o])
|
|
#define G_EDICT(o) ((edict_t *)((byte *)sv.edicts+ *(int *)&pr_globals[o]))
|
|
#define G_EDICTNUM(o) NUM_FOR_EDICT(G_EDICT(o))
|
|
#define G_VECTOR(o) (&pr_globals[o])
|
|
#define G_STRING(o) (pr_strings + *(string_t *)&pr_globals[o])
|
|
#define G_FUNCTION(o) (*(func_t *)&pr_globals[o])
|
|
|
|
#define E_FLOAT(e,o) (((float*)&e->v)[o])
|
|
#define E_INT(e,o) (*(int *)&((float*)&e->v)[o])
|
|
#define E_VECTOR(e,o) (&((float*)&e->v)[o])
|
|
#define E_STRING(e,o) (pr_strings + *(string_t *)&((float*)&e->v)[o])
|
|
|
|
extern int type_size[8];
|
|
|
|
typedef void (*builtin_t) (void);
|
|
extern builtin_t *pr_builtins;
|
|
extern int pr_numbuiltins;
|
|
|
|
extern int pr_argc;
|
|
|
|
extern qboolean pr_trace;
|
|
extern dfunction_t *pr_xfunction;
|
|
extern int pr_xstatement;
|
|
|
|
extern unsigned short pr_crc;
|
|
|
|
void PR_RunError (char *error, ...);
|
|
|
|
void ED_PrintEdicts (void);
|
|
void ED_PrintNum (int ent);
|
|
|
|
eval_t *GetEdictFieldValue(edict_t *ed, char *field);
|
|
|