//-------------------------------------------------------------------------
/*
Copyright (C) 1996, 2003 - 3D Realms Entertainment
Copyright (C) 2000, 2003 - Matt Saettler (EDuke Enhancements)
Copyright (C) 2004, 2007 - EDuke32 developers

This file is part of EDuke32

EDuke32 is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License version 2
as published by the Free Software Foundation.

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.
*/
//-------------------------------------------------------------------------

#ifndef __funct_h__
#define __funct_h__

extern void sendscore(const char *s);
extern void SoundStartup(void);
extern void SoundShutdown(void);
extern void MusicStartup(void);
extern void MusicShutdown(void);
extern void intomenusounds(void);
extern int playmusic(const char *fn, const int sel);
extern int loadsound(unsigned num);
extern int xyzsound(int num,int i,int x,int y,int z);
extern void sound(int num);
extern int spritesound(unsigned int num,int i);
extern void stopsound(int num);
extern void stopenvsound(int num,int i);
extern void pan3dsound(void);
extern void testcallback(unsigned int num);
extern void clearsoundlocks(void);
extern int callsound(int sn,int whatsprite);
extern int check_activator_motion(int lotag);
extern int isadoorwall(int dapic);
extern int isanunderoperator(int lotag);
extern int isanearoperator(int lotag);
extern inline int checkcursectnums(int sect);
extern int ldist(spritetype *s1,spritetype *s2);
extern int dist(spritetype *s1,spritetype *s2);
extern int findplayer(spritetype *s,int *d);
extern int findotherplayer(int p,int *d);
extern void doanimations(void);
extern int getanimationgoal(int *animptr);
extern int setanimation(int animsect,int *animptr,int thegoal,int thevel);
extern void animatecamsprite(void);
extern void animatewalls(void);
extern int activatewarpelevators(int s,int d);
extern void operatesectors(int sn,int ii);
extern void operaterespawns(int low);
extern void operateactivators(int low,int snum);
extern void operatemasterswitches(int low);
extern void operateforcefields(int s,int low);
extern int checkhitswitch(int snum,int w,int switchtype);
extern void activatebysector(int sect,int j);
extern void checkhitwall(int spr,int dawallnum,int x,int y,int z,int atwith);
extern void checkplayerhurt(player_struct *p,int j);
extern int checkhitceiling(int sn);
extern void checkhitsprite(int i,int sn);
extern void allignwarpelevators(void);
extern void sharedkeys(int snum);
extern void checksectors(int snum);
extern int32 RTS_AddFile(const char *filename);
extern void RTS_Init(const char *filename);
extern int32 RTS_NumSounds(void);
extern int32 RTS_SoundLength(int32 lump);
extern const char *RTS_GetSoundName(int32 i);
extern void RTS_ReadLump(int32 lump,void *dest);
extern void *RTS_GetSound(int32 lump);
extern void docacheit(void);
extern void xyzmirror(int i,int wn);
extern void vscrn(void);
extern void pickrandomspot(int snum);
extern void resetweapons(int snum);
extern void resetinventory(int snum);
extern void newgame(int vn,int ln,int sk);
extern void resettimevars(void);
extern void waitforeverybody(void);
extern void cacheit(void);
extern void clearfifo(void);
extern void resetmys(void);
extern int  enterlevel(int g);
extern void backtomenu(void);
extern void setpal(player_struct *p);
extern void quickkill(player_struct *p);
extern int hits(int i);
extern int hitasprite(int i,short *hitsp);
extern int shoot(int i,int atwith);
extern void displaymasks(int snum);
extern void displayweapon(int snum);
extern void getinput(int snum);
extern void checkweapons(player_struct *p);
extern void processinput(int snum);
extern void cmenu(int cm);
extern void savetemp(const char *fn,int daptr,int dasiz);
// extern int loadpheader(char spot,int32 *vn,int32 *ln,int32 *psk,int32 *numplr);
extern int loadplayer(int spot);
extern int saveplayer(int spot);
extern int menutext_(int x,int y,int s,int p,char *t,int bits);
#define menutext(x,y,s,p,t) menutext_(x,y,s,p,(char *)stripcolorcodes(t,menutextbuf),10+16)
extern void menus(void);
extern void palto(int r,int g,int b,int e);
extern void playanm(const char *fn,char);
extern int getincangle(int a,int na);
extern void getglobalz(int iActor);
extern void makeitfall(int iActor);
extern void loadefs(const char *fn);
extern int furthestangle(int iActor,int angs);
extern void execute(int iActor,int iPlayer,int lDist);
extern void overwritesprite(int thex,int they,int tilenum,int shade,int stat,int dapalnum);
extern void gamenumber(int x,int y,int n,int s);
extern void Shutdown(void);
extern void getpackets(void);
extern void check_fta_sounds(int i);
extern inline int inventory(spritetype *s);
extern inline int badguy(spritetype *s);
extern int badguypic(int pn);
extern void myos(int x,int y,int tilenum,int shade,int orientation);
extern void myospal(int x,int y,int tilenum,int shade,int orientation,int p);
extern void displayfragbar(void);
extern void FTA(int q,player_struct *p);
extern void gameexit(const char *t);
extern inline int strget(int x,int y,char *t,int dalen,int c);
extern void displayrest(int smoothratio);
extern void updatesectorz(int x,int y,int z,short *sectnum);
extern void drawbackground(void);
extern void displayrooms(int snum,int smoothratio);
extern int EGS(int whatsect,int s_x,int s_y,int s_z,int s_pn,int s_s,int s_xr,int s_yr,int s_a,int s_ve,int s_zv,int s_ow,int s_ss);
extern int wallswitchcheck(int i);
extern int spawn(int j,int pn);
extern void animatesprites(int x,int y,int a,int smoothratio);
extern int main(int argc,char **argv);
extern void opendemowrite(void);
extern void closedemowrite(void);
extern void dobonus(int bonusonly);
extern void lotsofglass(int i,int wallnum,int n);
extern void spriteglass(int i,int n);
extern void ceilingglass(int i,int sectnum,int n);
extern void lotsofcolourglass(int i,int wallnum,int n);
extern inline int GetTime(void);
extern void CONFIG_GetSetupFilename(void);
extern int32 CONFIG_FunctionNameToNum(char *func);
extern char *CONFIG_FunctionNumToName(int32 func);
extern int32 CONFIG_AnalogNameToNum(char *func);
extern char *CONFIG_AnalogNumToName(int32 func);
extern void CONFIG_SetDefaults(void);
extern void CONFIG_ReadKeys(void);
extern void readsavenames(void);
extern int32 CONFIG_ReadSetup(void);
extern void CONFIG_WriteSetup(void);
extern inline void updateinterpolations(void);
extern void setinterpolation(int *posptr);
extern void stopinterpolation(int *posptr);
extern void dointerpolations(int smoothratio);
extern inline void restoreinterpolations(void);
extern inline int ceilingspace(int sectnum);
extern inline int floorspace(int sectnum);
extern void addammo(int weapon,player_struct *p,int amount);
extern void addweaponnoswitch(player_struct *p,int weapon);
extern void addweapon(player_struct *p,int weapon);
extern void checkavailinven(player_struct *p);
extern void checkavailweapon(player_struct *p);
extern void hitradius(int i,int r,int hp1,int hp2,int hp3,int hp4);
extern int movesprite(int spritenum,int xchange,int ychange,int zchange,unsigned int cliptype);
extern inline int ssp(int i,unsigned int cliptype);
extern void insertspriteq(int i);
extern void lotsofmoneymailpaper(int sp,int n,int pic);
extern void guts(int sp,int gtype,int n);
extern void setsectinterpolate(int i);
extern void clearsectinterpolate(int i);
extern int ifhitsectors(int sectnum);
extern int ifhitbyweapon(int sn);
extern void moveobjects(void);
extern void movecyclers(void);
extern void movedummyplayers(void);

// game.c
extern inline void setstatusbarscale(int sc);

extern void setgamepalette(player_struct *player, char *pal, int set);
extern void fadepal(int r, int g, int b, int start, int end, int step);

extern inline int gametext_z(int small, int starttile, int x,int y,const char *t,int s,int p,int orientation,int x1, int y1, int x2, int y2,int z);
extern void txdigitalnumberz(int starttile, int x,int y,int n,int s,int pal,int cs,int x1, int y1, int x2, int y2, int z);
extern void myosx(int x,int y,int tilenum,int shade,int orientation);
extern void myospalx(int x,int y,int tilenum,int shade,int orientation,int p);
extern void ResetGameVars(void);
extern void ResetActorGameVars(int iActor);

extern int minitext_(int x,int y,const char *t,int s,int p,int sb);

#define minitextshade(x, y, t, s, p, sb) minitext_(x,y,t,s,p,sb)
#define minitext(x, y, t, p, sb) minitext_(x,y,t,0,p,sb)

#define gametext(x,y,t,s,dabits) gametext_z(0,STARTALPHANUM, x,y,t,s,0,dabits,0, 0, xdim-1, ydim-1, 65536)
#define gametextpal(x,y,t,s,p) gametext_z(0,STARTALPHANUM, x,y,t,s,p,26,0, 0, xdim-1, ydim-1, 65536)
#define gametextpalbits(x,y,t,s,p,dabits) gametext_z(0,STARTALPHANUM, x,y,t,s,p,dabits,0, 0, xdim-1, ydim-1, 65536)

extern void setupdynamictostatic();
extern void processnames(const char *szLabel, int lValue);

extern void LoadActor(int sActor);

extern int GetGameVar(const char *szGameLabel, int lDefault, int iActor, int iPlayer);
extern void DumpGameVars(FILE *fp);
// extern void AddLog(const char *psz, ...);

extern void ResetSystemDefaults(void);
extern void InitGameVarPointers(void);
extern void InitGameVars(void);
extern void SaveGameVars(FILE *fil);
extern int ReadGameVars(int fil);

extern int GetGameVarID(int id, int iActor, int iPlayer);
extern void SetGameVarID(int id, int lValue, int iActor, int iPlayer);
// extern void SetGameArrayID(int id,int index, int lValue);

extern int AddGameVar(const char *pszLabel, int lValue, unsigned int dwFlags);
extern int AddGameArray(const char *pszLabel, int asize);
extern void ReportError(int iError);

extern void onvideomodechange(int newmode);

extern void OnEvent(int iEventID, int sActor, int sPlayer, int lDist);

extern int isspritemakingsound(int i, int num);
extern int issoundplaying(int i, int num);
extern void stopspritesound(int num, int i);
extern void updateplayer(void);
extern void sendboardname(void);
extern void sendquit(void);

extern void adduserquote(const char *daquote);
extern void mpchangemap(int volume, int level);

extern inline int checkspriteflags(int iActor, int iType);
extern inline int checkspriteflagsp(int iPicnum, int iType);

extern int getteampal(int team);

extern void se40code(int x,int y,int z,int a,int h, int smoothratio);

extern void FreeMapState(int mapnum);
extern void getlevelfromfilename(const char *fn, char *volume, char *level);

extern void GetCrosshairColor(void);
extern void SetCrosshairColor(int r, int g, int b);
extern int kopen4loadfrommod(char *filename, char searchfirst);
#endif // __funct_h__
