mirror of
https://github.com/ondra-novak/gates_of_skeldal.git
synced 2025-07-04 21:50:38 -04:00
1838 lines
58 KiB
C
1838 lines
58 KiB
C
|
||
#include <libs/types.h>
|
||
#include "engine1.h"
|
||
#include "temp_storage.h"
|
||
#include <platform/config.h>
|
||
#include <string.h>
|
||
#include <stdint.h>
|
||
#include <stdlib.h>
|
||
#include <malloc.h>
|
||
#include <libs/memman.h>
|
||
|
||
#define POCET_POSTAV 6
|
||
#define HODINA 360
|
||
|
||
#define MAX_FILESYSTEM_PATH 256
|
||
|
||
#define A_SIDEMAP 0x8001
|
||
#define A_SECTMAP 0x8002
|
||
#define A_STRMAIN 0x8003 //stena main
|
||
#define A_STRLEFT 0x8004 //stena leva
|
||
#define A_STRRIGHT 0x8005 //stena prava
|
||
#define A_STRCEIL 0x8006 //strop
|
||
#define A_STRFLOOR 0x8007 //podlaha
|
||
#define A_STRARC 0x8008 //oblouk
|
||
#define A_MAPINFO 0x8009
|
||
#define A_MAPGLOB 0x800A //globalni vlastnosti mapy
|
||
#define A_STRARC2 0x800B //oblouk pravy
|
||
#define A_MAPITEM 0x800C //pozice vsech predmetu;
|
||
#define A_MAPMACR 0x800D //makra
|
||
#define A_MAPMOBS 0x800F
|
||
#define A_MAPVYK 0x8010 //vyklenky
|
||
#define A_MOBS 0x8011 //Mobs
|
||
#define A_MOBSND 0x8012 //Mob sounds
|
||
#define A_PASSW 0x8013
|
||
#define A_MAPEND 0x8000
|
||
|
||
#define E_KROK 34 //udalost jenz se zavola pri kazdem kroku postav(y)
|
||
#define E_AUTOMAP_REDRAW 35
|
||
#define E_MENU_SELECT 36
|
||
#define E_CLOSE_MAP 37
|
||
#define E_CLOSE_GEN 38
|
||
#define E_HACKER 39
|
||
|
||
//side flags
|
||
|
||
#define SD_AUTOMAP 0x1
|
||
#define SD_PLAY_IMPS 0x2
|
||
#define SD_MONST_IMPS 0x4
|
||
#define SD_THING_IMPS 0x8
|
||
#define SD_SOUND_IMPS 0x10
|
||
#define SD_ALARM 0x20
|
||
#define SD_PASS_ACTION 0x40
|
||
#define SD_TRANSPARENT 0x80
|
||
#define SD_PRIM_ANIM 0x100
|
||
#define SD_PRIM_VIS 0x200
|
||
#define SD_PRIM_GAB 0x400
|
||
#define SD_PRIM_FORV 0x800
|
||
#define SD_SEC_ANIM 0x1000
|
||
#define SD_SEC_VIS 0x2000
|
||
#define SD_SEC_GAB 0x4000
|
||
#define SD_SEC_FORV 0x8000
|
||
#define SD_LEFT_ARC 0x10000
|
||
#define SD_RIGHT_ARC 0x20000
|
||
#define SD_DOUBLE_SIDE 0x40000
|
||
#define SD_SPEC 0x80000
|
||
#define SD_COPY_ACTION 0x100000
|
||
#define SD_SEND_ACTION 0x200000
|
||
#define SD_APPLY_2ND 0x400000
|
||
#define SD_AUTOANIM 0x800000
|
||
#define SD_SECRET 0x20000000
|
||
#define SD_TRUESEE 0x40000000
|
||
#define SD_INVIS 0x80000000
|
||
|
||
//extended side flags (oblouky)
|
||
#define SD_POSITION 0x60
|
||
#define SD_RECESS 0x10 //vyklenek
|
||
#define SD_ITPUSH 0x80 //vec lze zkrs tuto stenu polozit na dalsi sektor
|
||
|
||
|
||
//extra side flags (direction)
|
||
#define SD_SHIFTUP 0x80 //presune sekundarni stenu dopredu
|
||
#define SD_UNUSED2 0x40 //nevyuzite (rezervovane) vlajky
|
||
#define SD_UNUSED3 0x20
|
||
#define SD_UNUSED4 0x10
|
||
#define SD_UNUSED5 0x08
|
||
#define SD_RESERVED 0x04 //rezervovano pro pripadnou expanzi SD_DIRECTION
|
||
#define SD_DIRECTION 0x03 //smer akce.
|
||
|
||
#define get_string(t) texty[t]
|
||
static __inline unsigned int rnd(unsigned int max) {
|
||
if (max == 0) return 0;
|
||
return rand() % max;
|
||
}
|
||
|
||
|
||
static __inline int rangrnd(int a, int b) {return rnd(b-a+1)+a;}
|
||
|
||
#define font_color(tabl) memcpy(charcolors,tabl,sizeof(charcolors));
|
||
#define tick_tack(num) game_time+=num;
|
||
#define TEXTY "POPISY.TXT"
|
||
#define ITEM_FILE "ITEMS.DAT"
|
||
|
||
#define XICHT_NAME "XICHT%02x.PCX"
|
||
#define CHAR_NAME "CHAR%02x.PCX"
|
||
|
||
#define STORY_BOOK "_STORY.TMP"
|
||
|
||
#define TX_LOAD 0
|
||
|
||
#define LODKA_POS (SCREEN_OFFLINE+301)*GetBuffer2ndPitch()+GetBuffer2nd()
|
||
#define LODKA_SIZ 640*60
|
||
|
||
|
||
#define VEL_RAMEC 12 //velikost zakladni jednotky ramecku (ctverec)
|
||
#define COL_RAMEC RGB555(31,31,26) //((31*32+31)*32+26)
|
||
|
||
#undef RGB
|
||
#define RGB(r,g,b) RGB888(r,g,b)
|
||
#define GET_R_COLOR(col) ((col & 0xF800)>>8)
|
||
#define GET_G_COLOR(col) ((col & 0x07E0)>>3)
|
||
#define GET_B_COLOR(col) ((col & 0x001F)<<3)
|
||
|
||
#define NOSHADOW(x) ((x)|BGSWITCHBIT)
|
||
|
||
|
||
#define PICTURES ".." PATH_SEPARATOR "OBRAZKY" PATH_SEPARATOR
|
||
#define PIC_FADE_PAL_SIZE (10*512+6)
|
||
|
||
#define E_REFRESH 256 //udalost refresh scene
|
||
#define E_KOUZLO_KOLO 257 //funkce kouzel kazde jedno kolo
|
||
#define E_KOUZLO_ANM 258 //funkce kouzel kazdy frame
|
||
|
||
//Registracni konstranty
|
||
#define H_DESK 0
|
||
#define H_TOPBAR 1
|
||
#define H_OKNO 2
|
||
#define H_KOMPAS 3
|
||
#define H_SIPKY_S 4
|
||
#define H_SIPKY_SV 8
|
||
#define H_SIPKY_SZ 9
|
||
#define H_SIPKY_V 5
|
||
#define H_SIPKY_Z 7
|
||
#define H_SIPKY_J 6
|
||
#define H_BACKMAP 10
|
||
#define H_IOBLOUK 11
|
||
#define H_IDESKA 12
|
||
#define H_IMRIZ1 13
|
||
#define H_RAMECEK 14
|
||
#define H_ENEMY 15
|
||
#define H_FBOLD 16
|
||
#define H_FSYMB 17
|
||
#define H_FLITT 18
|
||
#define H_FLITT5 19
|
||
#define H_FONT6 20
|
||
#define H_FONT7 21
|
||
#define H_FTINY 22
|
||
#define H_FKNIHA 23
|
||
#define H_KOUZLA 24
|
||
#define H_POWERBAR 25
|
||
#define H_POWERLED 26
|
||
#define H_LODKA 27
|
||
#define H_BATTLE_BAR 33
|
||
#define H_BATTLE_MASK 34
|
||
#define H_MZASAH1 35
|
||
#define H_MZASAH2 36
|
||
#define H_MZASAH3 37
|
||
#define H_PZASAH 38
|
||
#define H_BATTLE_CLICK 39
|
||
#define H_SIPKY_END 40
|
||
#define H_LEBKA 41
|
||
#define H_KOSTRA 42
|
||
#define H_KNIHA 43
|
||
#define H_NS_LOGO 44
|
||
#define H_WINTXTR 45
|
||
#define H_SAVELOAD 46
|
||
#define H_SVITEK 47
|
||
#define H_LOADTXTR 48
|
||
#define H_DIALOGY_DAT 49
|
||
#define H_DIALOG 50
|
||
#define H_MS_DEFAULT 51
|
||
#define H_MS_SOUBOJ 52
|
||
#define H_MS_WHO 53
|
||
#define H_MS_LIST 54
|
||
#define H_MS_ZARE 55
|
||
#define H_POSTAVY 60
|
||
#define H_BOTTBAR 66
|
||
#define H_RUNEHOLE 68
|
||
#define H_RUNEMASK 69
|
||
#define H_CHARS 70
|
||
#define H_CHARS_MAX 6
|
||
#define H_POSTAVY_DAT 76
|
||
#define H_SOUND_DAT 77
|
||
#define H_SND_SWHIT1 78
|
||
#define H_SND_SWHIT2 79
|
||
#define H_SND_SWMISS1 80
|
||
#define H_SND_SWMISS2 81
|
||
#define H_SND_SIP1 82
|
||
#define H_SND_SIP2 83
|
||
#define H_SND_KNIHA 84
|
||
#define H_SND_OBCHOD 85
|
||
#define H_SND_LEKTVAR 86
|
||
#define H_SND_TELEPIN 87
|
||
#define H_SND_TELEPOUT 88
|
||
#define H_SND_HEK1M 89
|
||
#define H_SND_HEK2M 90
|
||
#define H_SND_HEK1F 91
|
||
#define H_SND_HEK2F 92
|
||
#define H_SND_EAT 93
|
||
#define H_SND_WEAR 94
|
||
#define H_SND_PUTINV 95
|
||
#define H_RUNEBAR1 100
|
||
#define H_RUNEBAR2 101
|
||
#define H_RUNEBAR3 102
|
||
#define H_RUNEBAR4 103
|
||
#define H_RUNEBAR5 104
|
||
#define H_SPELLDEF 105
|
||
#define H_BUTBIG 106
|
||
#define H_BUTSMALL 107
|
||
#define H_TELEPORT 108
|
||
#define H_XICHTY 112
|
||
#define H_XICHTY_MAX 6
|
||
#define H_DIALOG_PIC 124
|
||
#define H_SHOP_PIC 125
|
||
#define H_SPELL_ANM 127
|
||
#define H_SPELL_WAV 128
|
||
#define H_TELEP_PCX 129
|
||
#define H_TELEP_CNT 14
|
||
#define H_FX 143
|
||
#define H_KILL 144
|
||
#define H_KILL_MAX 10
|
||
#define H_CHECKBOX 154
|
||
#define H_SETUPBAR 155
|
||
#define H_SOUPAK 156
|
||
#define H_SETUPOK 157
|
||
#define H_POSTUP 158
|
||
#define H_LODKA0 159
|
||
#define H_LODKA1 160
|
||
#define H_LODKA2 161
|
||
#define H_LODKA3 162
|
||
#define H_LODKA4 163
|
||
#define H_LODKA5 164
|
||
#define H_LODKA6 165
|
||
#define H_LODKA7 166
|
||
#define H_FLETNA 167
|
||
#define H_FLETNA_BAR 168
|
||
#define H_FLETNA_MASK 169
|
||
#define H_SND_SEVER 170
|
||
#define H_SND_VYCHOD 171
|
||
#define H_SND_JIH 172
|
||
#define H_SND_ZAPAD 173
|
||
#define H_SND_RAND1 174
|
||
#define H_SND_RAND2 175
|
||
#define H_SND_RAND3 176
|
||
#define H_SND_RAND4 177
|
||
#define H_FBIG 178
|
||
#define H_CHARGEN 179
|
||
#define H_CHARGENB 180
|
||
#define H_CHARGENM 181
|
||
#define H_BGR_BUFF 182
|
||
#define H_KREVMIN 183
|
||
#define H_KREVMID 184
|
||
#define H_KREVMAX 185
|
||
#define H_ARMAGED 186
|
||
#define H_GLOBMAP 200
|
||
#define H_ARMA_CNT 13
|
||
#define H_FIRST_FREE 225
|
||
#define H_MENUS_FREE 32768
|
||
|
||
#define MAX_HLAD(x) (((x)->vlastnosti[VLS_MAXHIT]/2+2*24)*HODINA)
|
||
#define MAX_ZIZEN(x) (((x)->vlastnosti[VLS_MAXHIT]/3+24)*HODINA)
|
||
|
||
|
||
#define concat(c,s1,s2) c=strcat(strcpy((char *)alloca(strlen(s1)+strlen(s2)+1),s1),s2)
|
||
#define local_strdup(c) strcpy((char *)alloca(strlen(c)+1), c)
|
||
#define concat2(s1,s2) strcat(strcpy((char *)alloca(strlen(s1)+strlen(s2)+1),s1),s2)
|
||
#define concat3(s1,s2,s3) strcat(strcat(strcpy((char *)alloca(strlen(s1)+strlen(s2)+strlen(s3)+1),s1),s2),s3)
|
||
#define concat4(s1,s2,s3,s4) strcat(strcat(strcat(strcpy((char *)alloca(strlen(s1)+strlen(s2)+strlen(s3)+strlen(s4)+1),s1),s2),s3),s4)
|
||
#define countof(array) (sizeof(array)/sizeof(array[0]))
|
||
|
||
#define AP_MULTIPLIER 15
|
||
#define get_ap(vls) (((vls[VLS_POHYB])>0 && (vls[VLS_POHYB])<AP_MULTIPLIER)?1:(vls[VLS_POHYB])/AP_MULTIPLIER)
|
||
|
||
#define SAVE_NAME_SIZE 32
|
||
|
||
static inline int mgochrana(int x) {
|
||
if (x > 100) return 100;
|
||
return 100-x;
|
||
}
|
||
//#define mgochrana(x) (100-(x))
|
||
//#define mgochrana(x) (1000/(10+(x)))
|
||
|
||
//typy sektoru
|
||
|
||
#define ISTELEPORT(c) ((c)==S_TELEPORT || ((c)>=S_USERTELEPORT && (c)<=S_USERTELEPORT_END))
|
||
#define ISTELEPORTSECT(sect) ISTELEPORT(map_sectors[sect].sector_type)
|
||
|
||
#undef S_NORMAL
|
||
|
||
#define S_NORMAL 1
|
||
#define S_SCHODY 2
|
||
#define S_SMER 5
|
||
#define S_VODA 9
|
||
#define S_SLOUP 10
|
||
#define S_DIRA 11
|
||
#define S_TELEPORT 12
|
||
#define S_LAVA 4
|
||
#define S_LODKA 3
|
||
#define S_TLAC_OFF 13
|
||
#define S_TLAC_ON 14
|
||
#define S_FLT_SMER 15
|
||
#define S_LEAVE 19
|
||
#define S_VIR 20
|
||
#define S_SSMRT 21
|
||
#define S_ACID 22
|
||
#define S_USERTELEPORT 50
|
||
#define S_USERTELEPORT_END 58
|
||
|
||
//sector flags
|
||
|
||
#define MC_AUTOMAP 0x1 //automapovano
|
||
#define MC_FLY 0x2 //fly na sektoru
|
||
#define MC_PLAYER 0x4 //hrac na sektoru
|
||
#define MC_SHADING 0x100 //druhe stinovani (do tmy)
|
||
#define MC_DEAD_PLR 0x8 //mrtvy hrac na sektoru
|
||
#define MC_DPLAYER (MC_PLAYER | MC_DEAD_PLR) //nejaky hrac na sektoru
|
||
#define MC_SPECTXTR 0x10 //specialni textura na sektoru (viz spectxtr)
|
||
#define MC_SAFEPLACE 0x20 //bezpecne misto (pod vodou muzou dychat);
|
||
#define MC_MARKED 0x80 //oznaceny sektor (pro volne pouziti)
|
||
#define MC_DISCLOSED 0x40 //odhaleno kouzlem automapping
|
||
#define MC_SHOW_STAIRS 0x200 //obrazek schodu
|
||
#define MC_STAIRS_DOWN 0x400 //obrazek schodu dolu (nebo sipka)
|
||
#define MC_NOAUTOMAP 0x800 //nelze najit automapingem
|
||
#define MC_NOSUMMON 0x1000 //nelze privolat hrace
|
||
|
||
|
||
typedef enum skeldal_folders_tag {
|
||
SR_DATA,
|
||
SR_GRAFIKA,
|
||
SR_ZVUKY,
|
||
SR_FONT,
|
||
SR_MAP,
|
||
SR_MUSIC,
|
||
SR_TEMP, /* = unused group */
|
||
SR_BGRAFIKA ,
|
||
SR_ITEMS,
|
||
SR_ENEMIES,
|
||
SR_VIDEO,
|
||
SR_DIALOGS,
|
||
SR_SAVES,
|
||
SR_WORK,
|
||
SR_LANG,
|
||
|
||
|
||
SR_COUNT} SKELDAL_FOLDERS_TAG;
|
||
#if 0 //adresare
|
||
#define SR_DATA 0
|
||
#define SR_GRAFIKA 1
|
||
#define SR_ZVUKY 2
|
||
#define SR_FONT 3
|
||
#define SR_MAP 4
|
||
#define SR_MUSIC 5
|
||
#define SR_BGRAFIKA 7
|
||
#define SR_ITEMS 8
|
||
#define SR_ENEMIES 9
|
||
#define SR_VIDEO 10
|
||
#define SR_DIALOGS 11
|
||
#define SR_SAVES 12
|
||
#define SR_WORK 13
|
||
#define SR_CD 14
|
||
#define SR_MAP2 15
|
||
#define SR_ORGMUSIC 16
|
||
#define SR_COUNT 17
|
||
#endif
|
||
|
||
//globalni cisla k casovacum
|
||
#define TM_BACK_MUSIC 1
|
||
#define TM_SCENE 2
|
||
#define TM_FAST_TIMER 3
|
||
#define TM_SOUND_RANDOMIZER 4
|
||
#define TM_BOTT_MESSAGE 5
|
||
#define TM_FLY 6
|
||
#define TM_CLEAR_ZASAHY 7
|
||
#define TM_REGEN 8
|
||
#define TM_WAITER 9
|
||
#define TM_SCENE2 10
|
||
#define TM_HACKER 11
|
||
#define TM_FX 12
|
||
#define TM_CHECKBOX 13
|
||
#define TM_FLETNA 14
|
||
#define TM_DELAIER 15
|
||
#define TM_VZPLANUTI 16
|
||
|
||
//umisteni predmetu
|
||
|
||
#define PL_NIKAM 0
|
||
#define PL_BATOH 1
|
||
#define PL_TELO_H 2
|
||
#define PL_TELO_D 3
|
||
#define PL_HLAVA 4
|
||
#define PL_NOHY 5
|
||
#define PL_KUTNA 6
|
||
#define PL_KRK 7
|
||
#define PL_RUKA 8
|
||
#define PL_OBOUR 9
|
||
#define PL_PRSTEN 10
|
||
#define PL_SIP 11
|
||
|
||
//hracovi_pozice
|
||
#define PO_BATOH 0
|
||
#define PO_TELO_H 1
|
||
#define PO_TELO_D 2
|
||
#define PO_HLAVA 3
|
||
#define PO_NOHY 4
|
||
#define PO_KUTNA 5
|
||
#define PO_KRK 6
|
||
#define PO_RUKA_L 7
|
||
#define PO_RUKA_R 8
|
||
|
||
|
||
//hracovi vlastnosti
|
||
|
||
#define VLS_MAX 24
|
||
#define VLS_SILA 0
|
||
#define VLS_SMAGIE 1
|
||
#define VLS_POHYB 2
|
||
#define VLS_OBRAT 3
|
||
#define VLS_MAXHIT 4
|
||
#define VLS_KONDIC 5
|
||
#define VLS_MAXMANA 6
|
||
#define VLS_OBRAN_L 7
|
||
#define VLS_OBRAN_H 8
|
||
#define VLS_UTOK_L 9
|
||
#define VLS_UTOK_H 10
|
||
#define VLS_OHEN 11
|
||
#define VLS_VODA 12
|
||
#define VLS_ZEME 13
|
||
#define VLS_VZDUCH 14
|
||
#define VLS_MYSL 15
|
||
#define VLS_HPREG 16
|
||
#define VLS_MPREG 17
|
||
#define VLS_VPREG 18
|
||
#define VLS_MGSIL_L 19
|
||
#define VLS_MGSIL_H 20
|
||
#define VLS_MGZIVEL 21
|
||
#define VLS_DAMAGE 22
|
||
#define VLS_KOUZLA 23
|
||
|
||
|
||
//rezimy interakce
|
||
|
||
#define MD_GAME 0
|
||
#define MD_MAP 1
|
||
#define MD_INV 2
|
||
#define MD_SETUP 3
|
||
#define MD_INBATTLE 4
|
||
#define MD_PRESUN 5
|
||
#define MD_PREZBROJIT 6
|
||
#define MD_UTEK 7
|
||
#define MD_KZ_VYBER 8
|
||
#define MD_END_GAME 9
|
||
#define MD_SHOP 10
|
||
#define MD_ANOTHER_MAP 11
|
||
|
||
//typy map
|
||
#define ME_NORMAL 0 //normal map
|
||
#define ME_SOPKA 1 //sopka
|
||
#define ME_LEDOV 2 //ledove jeskyne
|
||
#define ME_PVODA 3 //pod vodou
|
||
#define ME_MESTO 4 //nejde sleep (ve meste)
|
||
|
||
#define CASE_KEY_1_6 case 2:\
|
||
case 3:\
|
||
case 4:\
|
||
case 5:\
|
||
case 6:\
|
||
case 7
|
||
|
||
typedef struct tdregisters
|
||
{
|
||
int h_num;
|
||
char name[13];
|
||
ABLOCK_DECODEPROC proc;
|
||
char path;
|
||
}TDREGISTERS;
|
||
|
||
typedef struct tstena
|
||
{
|
||
char prim,sec,oblouk,side_tag;
|
||
unsigned short sector_tag;
|
||
char xsec,ysec;
|
||
uint32_t flags;
|
||
char prim_anim,sec_anim,lclip,action;
|
||
}TSTENA;
|
||
|
||
typedef struct tsector
|
||
{
|
||
char floor,ceil;
|
||
char flags,sector_type; //sector_type = 0 - sector not used;
|
||
char action,side_tag;
|
||
unsigned short step_next[4];
|
||
unsigned short sector_tag;
|
||
}TSECTOR;
|
||
|
||
typedef struct tvyklenek
|
||
{
|
||
short sector,dir,xpos,ypos,xs,ys;
|
||
short items[9];
|
||
short reserved;
|
||
}TVYKLENEK;
|
||
|
||
|
||
|
||
typedef TSTENA TSIDEDEF[][4];
|
||
typedef TSECTOR TSECTORDEF[];
|
||
|
||
typedef struct tmap_edit_info
|
||
{
|
||
short x,y,layer,flags;
|
||
}TMAP_EDIT_INFO;
|
||
|
||
typedef TMAP_EDIT_INFO TMAP_EDIT[];
|
||
|
||
typedef
|
||
struct mapglobal
|
||
{
|
||
char back_fnames[4][13];
|
||
int fade_r,fade_g,fade_b;
|
||
int start_sector;
|
||
int direction;
|
||
char mapname[30];
|
||
char map_effector;
|
||
char local_monsters;
|
||
char map_autofadefc;
|
||
}MAPGLOBAL;
|
||
|
||
typedef struct the_timer
|
||
{
|
||
int zero;
|
||
int id;
|
||
int counter,count_max,calls;
|
||
void (*proc)(struct the_timer *);
|
||
int32_t userdata[4];
|
||
struct the_timer *next;
|
||
char zavora;
|
||
}THE_TIMER;
|
||
|
||
typedef struct d_action
|
||
{
|
||
unsigned short action,sector,side,flags,nocopy,delay;
|
||
struct d_action *next;
|
||
}D_ACTION;
|
||
|
||
extern word color_topbar[7];
|
||
|
||
|
||
extern MAPGLOBAL mglob; //globalni informace o levelu
|
||
extern TSTENA *map_sides; //popisy jednotlivych sten (map_sides[(sector<<2)+dir])
|
||
extern TSECTOR *map_sectors; //popisy sektoru map_sectors[sector]
|
||
extern TVYKLENEK *map_vyk; //mapa vyklenku
|
||
extern word vyk_max; //pocet vyklenku v mape
|
||
extern char *flag_map; //mapa prenasenych flagu
|
||
extern TMAP_EDIT_INFO *map_coord; //mapa souradnic a flagu
|
||
extern int viewsector; //aktualni sektor vyhledu
|
||
extern int viewdir; //aktualni smer vyhledu
|
||
extern THE_TIMER timer_tree; //strom casovych udalosti
|
||
extern D_ACTION *d_action; //spojovy seznam zpozdenych akci
|
||
extern const char *gpathtable[SR_COUNT]; //tabulka adresaru
|
||
extern char level_preload; //informace o preloadingu
|
||
extern char **texty; //globalni tabulka textu
|
||
extern char **level_texts; //lokalni tabulka textu
|
||
extern char *level_fname; //jmeno levelu
|
||
extern int mapsize; //pocet sektoru v mape
|
||
extern int hl_ptr; //ukazatel na konec staticke tabulky registraci
|
||
extern int end_ptr; //ukazatel na uplny konec tabulky registraci
|
||
extern short **map_items; //ukazatel na mapu predmetu
|
||
extern int default_ms_cursor; //cislo zakladniho mysiho kurzoru
|
||
extern void (*unwire_proc)(void); //procedura zajistujici odpojeni prave ukoncovane interakce
|
||
extern void (*wire_proc)(void); //procedura zajistujici pripojeni drive ukoncene interakce
|
||
extern char cur_mode; //cislo aktualni interakce
|
||
extern word minimap[VIEW3D_Z+1][VIEW3D_X*2+1]; //minimalizovana mapa s informacemi pro sestaveni vyhledu
|
||
extern char norefresh; //vypina refresh obrazovky
|
||
extern char cancel_pass; //okamzite zrusi plynuly prechod
|
||
extern char reverse_draw ; //kresba odpredu dozadu
|
||
extern char gamespeed; //rychlost hry
|
||
extern char gamespeedbattle; //akcelerace rychlosti pro bitvy
|
||
extern int num_ofsets[]; //tabulka offsetu pro steny
|
||
extern int back_color; //cislo barvy pozadi
|
||
extern uint8_t cur_group; //cislo aktualni skupiny
|
||
extern uint8_t group_select; //1 = prave byla sestavena nova skupina
|
||
extern unsigned int barvy_skupin[POCET_POSTAV+1]; //cisla barev skupin
|
||
extern char battle; //jednicka znaci ze bezi bitva
|
||
extern char battle_mode; //rezim bitvy 0=programovani
|
||
extern char neco_v_pohybu; //jednicka znaci ze se nektere potvory jeste hejbou
|
||
extern short select_player; //vybrana postava nebo -1
|
||
extern char group_sort[POCET_POSTAV]; //pretrideni skupin
|
||
extern char global_anim_counter;
|
||
extern char one_buffer; //1 zapina pouziti pouze jednoho bufferu pro render
|
||
extern char save_map; //1 oznamuje ze pri opusteni levelu je nutne ulozit stav mapy
|
||
extern int32_t money; //stav konta hracu
|
||
extern int32_t level_map[]; //tabulka urovni
|
||
extern char true_seeing; //1 oznamuje ze bezi kouzlo true_seeing
|
||
extern char set_halucination;
|
||
extern int hal_sector; //cislo sektoru a smeru pri halucinaci
|
||
extern int hal_dir;
|
||
extern char side_touched; //promena se nastavuje na 1 pri kazdem uspesnem dotyku steny
|
||
extern const char *texty_knihy; //jmeno souboru s textamy knihy
|
||
extern int cur_page; //cislo stranky v knize;
|
||
extern int32_t game_time; //hraci cas
|
||
extern char autoattack;
|
||
extern char enable_sort;
|
||
extern char last_send_action; //naposled vyslana akce
|
||
extern char see_monster; //jednicka pokud hraci vidi nestvuru
|
||
extern char lodka;
|
||
extern char lodka_battle_draw; //jedncka pokud se zobrazuje programovani (pro lodku)
|
||
extern char anim_mirror; //je li 1 pak animace kouzel a zbrani jsou zrcadlove otocene
|
||
extern char insleep; //je li 1 pak bezi sleep
|
||
extern char pass_zavora; //je-li 1 pak bezi passing (hraci zrovna jdou)
|
||
extern short moving_player; //cislo presouvaneho hrace
|
||
extern int bgr_distance; //vzdalenost pozadi od pohledu
|
||
extern int bgr_handle; //cislo handle k obrazku pozadi;
|
||
extern char enable_glmap; //povoluje globalni mapu;
|
||
extern int charmin;
|
||
extern int charmax;
|
||
extern uint32_t current_map_hash;
|
||
|
||
extern int autoopenaction;
|
||
extern int autoopendata;
|
||
|
||
extern char doNotLoadMapState;
|
||
|
||
extern char log_combat;
|
||
|
||
//builder - skeldal
|
||
|
||
void game_keyboard(EVENT_MSG *msg,void **usr);
|
||
void calc_animations(void);
|
||
int load_map(const char *filename);
|
||
void other_draw(void);
|
||
void refresh_scene(THE_TIMER *t);
|
||
const void *pcx_fade_decomp(const void *p, int32_t *s, int h);
|
||
const void *pcx_15bit_decomp(const void *p, int32_t *s, int h);
|
||
const void *pcx_15bit_autofade(const void *p, int32_t *s, int h);
|
||
const void *pcx_15bit_backgrnd(const void *p, int32_t *s, int h);
|
||
const void *pcx_8bit_decomp(const void *p, int32_t *s, int h);
|
||
const void *hi_8bit_correct(const void *p, int32_t *s, int h);
|
||
const void *pcx_8bit_nopal(const void *p, int32_t *s, int h);
|
||
const void *set_background(const void *p, int32_t *s, int h);
|
||
const void *wav_load(const void *p, int32_t *s, int h);
|
||
const void *load_mob_legacy_format_direct(const void *p, int32_t *s, int h);
|
||
const void *load_mob_legacy_format(const void *p, int32_t *s, int h);
|
||
const void *load_spells_legacy_format(const void *p, int32_t *s, int h);
|
||
void wire_main_functs(void);
|
||
void ukaz_kompas(char mode);
|
||
void timming(EVENT_MSG *msg,void **data);
|
||
void do_timer(void);
|
||
void hold_timer(int id,char hld);
|
||
typedef void (*TIMER_PROC)(THE_TIMER *t);
|
||
THE_TIMER *add_to_timer(int id,int delay,int maxcall,TIMER_PROC proc);
|
||
void delete_from_timer(int id);
|
||
THE_TIMER *find_timer(int id);
|
||
void objekty_mimo(THE_TIMER *t);
|
||
void mouse_set_cursor(int cursor);
|
||
#define FONT_TSHADOW 0x10000
|
||
#define FONT_TSHADOW_GRAY 0x30000
|
||
void set_font(int font,int c1,...);
|
||
void bott_draw(char);
|
||
const void *bott_draw_proc(const void *p, int32_t *s, int h);
|
||
void mouse_set_default(int cursor);
|
||
void create_frame(int x,int y,int xs,int ys,char clear);
|
||
void save_dump(const uint16_t *screen_addr,
|
||
unsigned int width,
|
||
unsigned int height,
|
||
unsigned int linelen);
|
||
void bott_disp_text(const char *);
|
||
void bott_text_forever(void);
|
||
char chod_s_postavama(char sekupit);
|
||
void hide_ms_at(int line); //schova mysku ktera je nad line
|
||
int cislovka(int i);
|
||
void wire_kniha(void);
|
||
void purge_temps(char z); //z=1 vymaze i swapsoubor
|
||
void destroy_player_map(void); //je nutne volat pred presunem postav
|
||
void build_player_map(void); //je nutne volat po presunem postav
|
||
int postavy_propadnout(int sector);
|
||
void postavy_teleport_effect(int sector,int dir,int postava,char eff);
|
||
void reg_grafiku_postav(void);
|
||
void play_movie_seq(const char *s,int y);
|
||
void check_postavy_teleport(void); //je-li viewsector=teleport pak presune postavy
|
||
|
||
|
||
|
||
//builder
|
||
#define MAIN_NUM 0
|
||
#define LEFT_NUM 1
|
||
#define RIGHT_NUM 2
|
||
#define CEIL_NUM 3
|
||
#define FLOOR_NUM 4
|
||
#define OBL_NUM 5
|
||
#define OBL2_NUM 6
|
||
#define BACK_NUM 7
|
||
|
||
#define MSG_DELAY (50*10)
|
||
|
||
|
||
extern char bott_display; //cislo udava co je zobrazeno v dolni casti
|
||
extern int vmode;
|
||
extern char runes[5];
|
||
|
||
|
||
typedef struct spectxtr
|
||
{
|
||
word sector;
|
||
word handle;
|
||
char count;
|
||
char pos;
|
||
signed char xpos;
|
||
char repeat;
|
||
}SPECTXTR;
|
||
|
||
#define MAX_SPECTXTRS 64
|
||
typedef SPECTXTR SPECTXT_ARR[MAX_SPECTXTRS];
|
||
|
||
extern SPECTXT_ARR spectxtr;
|
||
|
||
void add_spectxtr(word sector,word fhandle,word count,word repeat,integer xpos);
|
||
void calc_spectxtrs(void);
|
||
void init_spectxtrs(void);
|
||
void play_fx(int x,int y);
|
||
void draw_fx(void);
|
||
void play_fx_at(int where);
|
||
void draw_blood(char mode,int mob_dostal,int mob_dostal_pocet);
|
||
//kresli krev. mode=1 nasaveni, mode=0 kresleni, pri mode=0 se parametry ignoruji
|
||
|
||
#define FX_MAGIC 0
|
||
#define FX_BOOK 1
|
||
#define FX_MONEY 2
|
||
#define FX_MAP 3
|
||
#define FX_SAVE 4
|
||
|
||
|
||
|
||
|
||
#define BOTT_NORMAL 0
|
||
#define BOTT_TEXT 1
|
||
#define BOTT_FLETNA 2
|
||
#define BOTT_RUNA 3
|
||
|
||
|
||
void step_zoom(char smer);
|
||
void turn_zoom(int smer);
|
||
void a_touch(int sector,int dir);
|
||
int do_action(int action_numb,int sector,int direct,int flags,int nosend);
|
||
void delay_action(int action_numb,int sector,int direct,int flags,int nosend,int delay);
|
||
int32_t load_section(FILE *f,void **section, int *sct_type,int32_t *sect_size);
|
||
int prepare_graphics(int *ofs,char *names,int32_t size,ABLOCK_DECODEPROC decomp,int class);
|
||
void show_automap(char full);
|
||
void draw_medium_map(void);
|
||
void anim_sipky(int h,int mode);
|
||
void redraw_scene(void);
|
||
void calc_game(void);
|
||
void do_delay_actions(void);
|
||
void real_krok(EVENT_MSG *msg,void **data);
|
||
void sort_groups(void);
|
||
void recheck_button(int sector,char auto_action);
|
||
void start_dialog(int entr,int mob);
|
||
void show_money(void);
|
||
void chveni(int i);
|
||
void render_scene(int,int);
|
||
void bott_draw_fletna(void);
|
||
void bott_disp_rune(char rune, int item);
|
||
|
||
void display_ver(int x,int y,int ax,int ay);
|
||
void check_players_place(char mode);
|
||
|
||
|
||
void add_leaving_place(int sector);
|
||
int set_leaving_place(void);
|
||
int get_leaving_place(char *level_name);
|
||
|
||
|
||
//click_map
|
||
|
||
typedef struct t_clk_map
|
||
{
|
||
int id,xlu,ylu,xrb,yrb;
|
||
char (*proc)(int id,int xa,int ya,int xr,int yr);
|
||
char mask;
|
||
int cursor;
|
||
}T_CLK_MAP;
|
||
|
||
#define CLK_MAIN_VIEW 18
|
||
#define MS_GAME_WIN 256
|
||
extern T_CLK_MAP clk_main_view[]; //clickovaci mapa pro hlavni vyhled
|
||
|
||
void change_click_map(T_CLK_MAP *map,int mapsize);
|
||
void ms_clicker(EVENT_MSG *msg,void **usr);
|
||
const T_CLK_MAP * find_in_click_map_entry(int x, int y,T_CLK_MAP *pt,int pocet,int evtype);
|
||
void restore_click_map(void *map,int mapsize);
|
||
void save_click_map(void **map,int *mapsize);
|
||
void set_game_click_map(void);
|
||
void change_global_click_map(T_CLK_MAP *map,int mapsize);
|
||
char empty_clk(int id,int xa,int ya,int xr,int yr); //tato udalost slouzi ke zruseni nekterych mist v globalni mape
|
||
void disable_click_map(void);
|
||
|
||
char start_invetory(int id,int xa,int ya,int xr,int yr);
|
||
char go_map(int id,int xa,int ya,int xr,int yr);
|
||
char konec(int id,int xa,int ya,int xr,int yr);
|
||
char return_game(int id,int xa,int ya,int xr,int yr);
|
||
char clk_step(int id,int xa,int ya,int xr,int yr);
|
||
char clk_touch(int id,int xa,int ya,int xr,int yr);
|
||
char go_book(int id,int xa,int ya,int xr,int yr);
|
||
char clk_saveload(int id,int xa,int ya,int xr,int yr);
|
||
char clk_sleep(int id,int xa,int ya,int xr,int yr);
|
||
char spell_casting(int id,int xa,int ya,int xr,int yr);
|
||
|
||
|
||
//inventory viewer - items
|
||
|
||
#define IT_ICONE_SIZE (2+2+2+2*256+55*45)
|
||
#define MAX_INV 30
|
||
#define HUMAN_PLACES 9
|
||
#define HUMAN_RINGS 4
|
||
|
||
extern int item_count; //pocet predmetu ve hre
|
||
extern int it_count_orgn; //puvodni pocet predmetu ve hre (pri loadmap)
|
||
extern short water_breath; //vec pro dychani pod vodou
|
||
extern short flute_item;
|
||
|
||
void load_items(void);
|
||
void load_item_map(void *p,int32_t s);
|
||
void draw_placed_items_normal(int celx,int cely,int sect,int side);
|
||
|
||
#define SPL_INVIS 0x1 //hrac je neviditelny
|
||
#define SPL_OKO 0x2 //hrac ma kouzlo oko za oko
|
||
#define SPL_TVAR 0x4 //hrac ma kouzlo nastav tvar
|
||
#define SPL_DRAIN 0x8 //hrac kazdym utokem drainuje nepritele
|
||
#define SPL_MANASHIELD 0x10 //hrac je chranen stitem z many
|
||
#define SPL_SANC 0x20 //resistance to fyzical attack
|
||
#define SPL_HSANC 0x40 //resistance to all attack
|
||
#define SPL_BLIND 0x80 //hrac je slepy
|
||
#define SPL_REGEN 0x100 //hrac ma regeneraci pri boji
|
||
#define SPL_ICE_RES 0x200 //hrac je chranen proti ledu
|
||
#define SPL_FIRE_RES 0x400 //hrac je chranen proti ohni
|
||
#define SPL_KNOCK 0x800 //knock target back
|
||
#define SPL_FEAR 0x1000 //hrac nebo nestvura jsou posedle kouzlem "strach"
|
||
#define SPL_STONED 0x2000 //hrac nebo nestvura jsou zkamenele
|
||
#define SPL_LEVITATION 0x4000 //hrac nebo nestvura levituji, takze se na ne neuplatnuji nektere efekty sektoru
|
||
#define SPL_DEMON 0x8000 //hrac je zmenen v demona
|
||
|
||
|
||
#define AC_ATTACK 1
|
||
#define AC_MOVE 2
|
||
#define AC_CANCEL 3
|
||
#define AC_RUN 4
|
||
#define AC_ARMOR 5
|
||
#define AC_STAND 6
|
||
#define AC_MAGIC 7
|
||
#define AC_START 8
|
||
#define AC_THROW 9
|
||
|
||
#define TYP_NESPEC 0
|
||
#define TYP_UTOC 1
|
||
#define TYP_VRHACI 2
|
||
#define TYP_STRELNA 3
|
||
#define TYP_ZBROJ 4
|
||
#define TYP_SVITEK 5
|
||
#define TYP_LEKTVAR 6
|
||
#define TYP_MECH 7
|
||
#define TYP_VODA 7
|
||
#define TYP_JIDLO 8
|
||
#define TYP_SPECIALNI 9
|
||
#define TYP_RUNA 10
|
||
#define TYP_PENIZE 11
|
||
#define TYP_SVITXT 12
|
||
#define TYP_PRACH 13
|
||
#define TYP_OTHER 14
|
||
|
||
#define ITF_DUPLIC 0x8000 //Predmet je duplikaci jineho predmetu
|
||
#define ITF_FREE 0x4000 //Predmet byl duplikaci, ted je jeho pozice volna
|
||
#define ITF_DESTROY 0x1
|
||
#define ITF_NOREMOVE 0x2
|
||
#define IT_FACES 5
|
||
|
||
#define TPW_MEC 0
|
||
#define TPW_SEKERA 1
|
||
#define TPW_KLADIVO 2
|
||
#define TPW_HUL 3
|
||
#define TPW_DYKA 4
|
||
#define TPW_STRELNA 5
|
||
#define TPW_OST 6
|
||
#define TPW_MAX 7
|
||
|
||
#define TSP_WATER_BREATH 1 //cislo specialni veci pro dychani pod vodou
|
||
#define TSP_FLUTE 2
|
||
|
||
#define MAX_SLEEP 4320
|
||
|
||
typedef struct titem
|
||
{
|
||
char jmeno[32]; //32 Jmeno predmetu
|
||
char popis[32]; //64
|
||
short zmeny[24]; //112 Tabulka, jakych zmen ma na hracovy vlastnosti
|
||
short podminky[4];//120 Tabulka, jake vlastnosti musi mit hrac k pouziti predmetu
|
||
short hmotnost,nosnost,druh; //126 druh = Typ predmetu
|
||
short umisteni; //128 Kam se predmet umisti?
|
||
word flags; //130 ruzne vlajky
|
||
short spell,magie,sound_handle;//136 specialni kouzla / rukojet zvuku
|
||
short use_event; //140 specialni udalost
|
||
unsigned short ikona,vzhled; //144 ikony a vzhled
|
||
short user_value; //146 uzivatelska hodnota
|
||
short keynum; //148 cislo klice
|
||
short polohy[2][2]; //156 souradnice poloh pro zobrazeni v inv
|
||
uint8_t typ_zbrane; //160 Typ zbrane
|
||
char unused;
|
||
short sound; //cislo zvuku
|
||
short v_letu[16]; //192
|
||
unsigned short cena;
|
||
unsigned short cena_high;
|
||
char weapon_attack; //relativni handle k souboru s animaci utok
|
||
char hitpos; //pozice zasahu animace
|
||
char shiftup;
|
||
char byteres;
|
||
short rezerva[12]; //224 rezervovane
|
||
}TITEM;
|
||
|
||
#define PLAYER_MAX_LEVEL 40
|
||
|
||
|
||
typedef struct hum_action
|
||
{
|
||
short action,data1,data2,data3;
|
||
}HUM_ACTION;
|
||
|
||
|
||
|
||
typedef struct thuman
|
||
{
|
||
char used; //1 kdyz je pozice pouzita
|
||
char spell; //1 kdyz postava ma na sobe aspon 1 kouzlo.
|
||
uint8_t groupnum; //cislo skupiny 0-6
|
||
int8_t xicht; //cislo obliceje 0-5
|
||
uint8_t direction; //smer otoceni
|
||
short sektor; //sektor postaveni
|
||
short vlastnosti[VLS_MAX]; //mapa aktualnich vlastnosti po korekcich
|
||
short bonus_zbrani[TPW_MAX]; //bonusy za zbrane
|
||
short lives; //pocet zraneni
|
||
short mana; //mnozstvi many
|
||
short kondice; //kondice postavy
|
||
short actions; //aktualni pocet AP
|
||
short mana_battery; //udaj po nabyti nakouzlene many
|
||
short stare_vls[VLS_MAX]; //mapa vlastnosti pred korekcemi
|
||
short wearing[HUMAN_PLACES]; //nosene predmety
|
||
short prsteny[HUMAN_RINGS]; //nosene prsteny
|
||
short sipy; //pocet sipu v toulci
|
||
short inv_size; //velikost inventare 6-30
|
||
short inv[MAX_INV]; //inventar
|
||
short level; //uroven
|
||
short weapon_expy[TPW_MAX]; //zkusenosti za zbrane
|
||
int32_t exp; //zkusenost
|
||
char female; //1 kdyz zena
|
||
char utek; //hodnota udavajici pocet kroku pri uteku
|
||
HUM_ACTION *zvolene_akce; //ukazatel na tabulku zvolenych akci
|
||
HUM_ACTION *provadena_akce; //ukazatel na aktualni akci
|
||
char programovano; //pocet programovanych akci
|
||
char jmeno[15]; //jmeno
|
||
short zasah; //posledni zasah postavy ???
|
||
short dostal; //cislo ktere se ukazuje na obrazku s postavou jako zasah
|
||
short bonus; //bonus pro rozdeleni vlastnosti
|
||
int jidlo; //max 25000 //pocet kol o hladu zbyvajicich
|
||
int voda; //max 20000 //pocet kol o zizny zbyvajicich
|
||
struct thuman *demon_save; //ukazatel na postavu ulozenou behem kouzla demon
|
||
uint32_t inmaphash; //hash nazvu mapy, kde se postavy nachazi
|
||
}THUMAN;
|
||
|
||
|
||
extern TITEM *glob_items; //tabulka predmetu
|
||
extern int ikon_libs;
|
||
extern short *picked_item; //retezec sebranych predmetu
|
||
extern int item_in_cursor;
|
||
extern THUMAN postavy[POCET_POSTAV]; //postavy
|
||
extern THUMAN postavy_2[]; //postavy
|
||
extern THUMAN *human_selected; //vybrana postava v invetorari
|
||
extern int sleep_ticks;
|
||
extern int face_arr[IT_FACES];
|
||
char pick_item_(int id,int xa,int ya,int xr,int yr);
|
||
void wire_inv_mode(THUMAN *select);
|
||
void init_inventory(void);
|
||
void init_items(void);
|
||
void push_item(int sect,int pos,short *picked_item);
|
||
void pop_item(int sect,int pos,int mask,short **picked_item);
|
||
int count_items_inside(short *place);
|
||
int count_items_total(short *place);
|
||
char put_item_to_inv(THUMAN *p,short *picked_items); //funkce vklada predmet(y) do batohu postavy
|
||
void pick_set_cursor(void); //nastavuje kurzor podle vlozeneho predmetu;
|
||
void calc_fly(THE_TIMER *t);
|
||
void zmen_skupinu(THUMAN *p);
|
||
void add_to_group(int num);
|
||
void group_all(void);
|
||
const void *build_items_called(const void *p, int32_t *s, int h);
|
||
void real_regeneration(THE_TIMER *t); //regenerace postav behem hry v realu (pouze kondice a mana)
|
||
char sleep_regenerace(THUMAN *p); //regenerace postav behem spani
|
||
char check_jidlo_voda(THUMAN *p);
|
||
void prepocitat_postavu(THUMAN *human_selected);
|
||
void sleep_players(va_list args); //Pozor !!! TASK
|
||
void item_sound_event(int item,int sector);
|
||
short create_item_money(int obnos); //vytvori predmet penize s urcitym obnosem
|
||
char check_map_specials(THUMAN *p);
|
||
void destroy_items(short *items); //nici predmety v mysi
|
||
void do_items_specs(void); //vola specialni akci predmetu v mysi
|
||
short duplic_item(short item); //duplikuje vec a vraci id cislo klonu
|
||
int advance_vls(int id);
|
||
short create_unique_item(const TITEM *it);//vytvari jedinecnou vec pro hru (jako duplikat niceho :-))
|
||
int calculate_weight(THUMAN *p);
|
||
int weigth_defect(THUMAN *p);
|
||
|
||
|
||
|
||
#define SHP_SELL 0x1 //objekt lze prodat
|
||
#define SHP_BUY 0x2 //objekt lze koupit
|
||
#define SHP_AUTOADD 0x4 //objekt pribyva casem
|
||
#define SHP_SPECIAL 0x8 //objekt se objevi jen obcas
|
||
#define SHP_TYPE 0x80 //objekt je popis typu
|
||
#define SHP_NOEDIT 0x40 //objekt se nenahrava do editoru.
|
||
|
||
typedef struct tproduct
|
||
{
|
||
short item; //cislo predmetu ktere nabizi
|
||
int cena; //cena za jeden
|
||
short trade_flags; //vlajky
|
||
int pocet; //pocet predmetu na sklade
|
||
int max_pocet;
|
||
}TPRODUCT;
|
||
|
||
typedef struct tshop
|
||
{
|
||
char keeper[16];
|
||
char picture[13];
|
||
int koef;
|
||
int products;
|
||
int shop_id;
|
||
int list_size;
|
||
short spec_max; //maximalni pocet specialnich predmetu
|
||
const TPRODUCT *list;
|
||
}TSHOP;
|
||
|
||
|
||
typedef struct tshop_product_state_tag {
|
||
uint16_t count;
|
||
uint16_t previous_price;
|
||
} TSHOP_PRODUCT_STATE;
|
||
|
||
typedef struct tshop_all_state {
|
||
const TPRODUCT *first_product;
|
||
TSHOP_PRODUCT_STATE *first_state;
|
||
size_t count_states;
|
||
} TSHOP_ALL_STATE;
|
||
|
||
void enter_shop(int shopid);
|
||
void load_shops(void);
|
||
void reroll_all_shops(void);
|
||
char save_shops(void);
|
||
char load_saved_shops(void);
|
||
|
||
//macros
|
||
|
||
#define MAX_ACTIONS 40
|
||
#define MA_GEN 0
|
||
#define MA_SOUND 1
|
||
#define MA_TEXTG 2
|
||
#define MA_TEXTL 3
|
||
#define MA_SENDA 4
|
||
#define MA_FIREB 5
|
||
#define MA_DESTI 6
|
||
#define MA_LOADL 7
|
||
#define MA_DROPI 8
|
||
#define MA_DIALG 9
|
||
#define MA_SSHOP 10
|
||
#define MA_CLOCK 11
|
||
#define MA_CACTN 12
|
||
#define MA_LOCK 13
|
||
#define MA_SWAPS 14
|
||
#define MA_WOUND 15
|
||
#define MA_IFJMP 16
|
||
#define MA_CALLS 17
|
||
#define MA_HAVIT 18
|
||
#define MA_STORY 19
|
||
#define MA_IFACT 20
|
||
#define MA_SNDEX 21
|
||
#define MA_MOVEG 22
|
||
#define MA_PLAYA 23
|
||
#define MA_CREAT 24
|
||
#define MA_ISFLG 25
|
||
#define MA_CHFLG 26
|
||
#define MA_CUNIQ 27
|
||
#define MA_MONEY 28
|
||
#define MA_GUNIQ 29
|
||
#define MA_PICKI 30
|
||
#define MA_WBOOK 31
|
||
#define MA_RANDJ 32
|
||
#define MA_ENDGM 33
|
||
#define MA_GOMOB 34
|
||
#define MA_SHRMA 35
|
||
#define MA_MUSIC 36
|
||
#define MA_GLOBE 37 //global events
|
||
#define MA_IFSEC 38 //if sector num
|
||
#define MA_IFSTP 39 //if sector type
|
||
|
||
#define MAGLOB_LEAVEMAP 0 // v urcitou nastavenou hodinu a minutu dene
|
||
#define MAGLOB_STARTSLEEP 1 // postavy maji jit spat.
|
||
#define MAGLOB_ENDSLEEP 2 // postavy se probouzi
|
||
#define MAGLOB_CLICKSAVE 3 // p<>ed otev<65>en<65>m SAVE dialogu
|
||
#define MAGLOB_AFTERSAVE 4 // po ulo<6C>en<65> hry
|
||
#define MAGLOB_BEFOREMAGIC 5 // p<>ed vyvol<6F>n<EFBFBD>m kouzla
|
||
#define MAGLOB_AFTERMAGIC 6 //po vyvol<6F>n<EFBFBD> kouzla
|
||
#define MAGLOB_BEFOREMAPOPEN 7 //p<>ed otev<65>en<65>m mapy
|
||
#define MAGLOB_AFTERMAPOPEN 8 //po uzav<61>en<65> mapy
|
||
#define MAGLOB_BEFOREBATTLE 9 //p<>ed spu<70>t<EFBFBD>n<EFBFBD>m souboje
|
||
#define MAGLOB_AFTERBATTLE 10 //po ukon<6F>en<65> souboje
|
||
#define MAGLOB_BEFOREBOOK 11 //pred otev<65>en<65>m knihy
|
||
#define MAGLOB_AFTERBOOK 12 //po uzav<61>en<65> knihy
|
||
#define MAGLOB_ONROUND 13 //p<>i ka<6B>d<EFBFBD>m kole nebo po 10s
|
||
#define MAGLOB_ONDEADMAN 14 //p<>i umrt<72> mu<6D>e
|
||
#define MAGLOB_ONDEADWOMAN 15 //p<>i umrt<72> <20>eny
|
||
#define MAGLOB_ONDEADALL 16 //p<>i umrt<72> v<>ech postav
|
||
#define MAGLOB_ONHITMAN 17 //p<>i z<>sahu mu<6D>e
|
||
#define MAGLOB_ONHITWOMAN 18 //p<>i z<>sahu <20>eny
|
||
#define MAGLOB_ONNEWRUNE 19 //p<>i nalezen<65> nov<6F> runy
|
||
#define MAGLOB_ONPICKITEM 20 //p<>i sebr<62>n<EFBFBD> p<>edm<64>tu (pro speci<63>ln<6C> p<>edm<64>ty)
|
||
#define MAGLOB_ONSTEP 21 //p<>i kroku (p<>ed animaci)
|
||
#define MAGLOB_ONTURN 22 //p<>i oto<74>en<65> (p<>ed animaci)
|
||
#define MAGLOB_ALARM 23 //p<>i spu<70>t<EFBFBD>n<EFBFBD> alarmu
|
||
#define MAGLOB_ONFIREMAGIC 24
|
||
#define MAGLOB_ONWATERMAGIC 25
|
||
#define MAGLOB_ONGROUNDMAGIC 26
|
||
#define MAGLOB_ONAIRMAGIC 27
|
||
#define MAGLOB_ONMINDMAGIC 28
|
||
#define MAGLOB_ONSPELLID1 29 //p<>i jednom konr<6E>tn<74>m kouzle
|
||
#define MAGLOB_ONSPELLID2 30 //p<>i jednom konr<6E>tn<74>m kouzle
|
||
#define MAGLOB_ONSPELLID3 31 //p<>i jednom konr<6E>tn<74>m kouzle
|
||
#define MAGLOB_ONSPELLID4 32 //p<>i jednom konr<6E>tn<74>m kouzle
|
||
#define MAGLOB_ONSPELLID5 33 //p<>i jednom konr<6E>tn<74>m kouzle
|
||
#define MAGLOB_ONSPELLID6 34 //p<>i jednom konr<6E>tn<74>m kouzle
|
||
#define MAGLOB_ONSPELLID7 35 //p<>i jednom konr<6E>tn<74>m kouzle
|
||
#define MAGLOB_ONSPELLID8 36 //p<>i jednom konr<6E>tn<74>m kouzle
|
||
#define MAGLOB_ONSPELLID9 37 //p<>i jednom konr<6E>tn<74>m kouzle
|
||
#define MAGLOB_ONTIMER1 38 //cas - pocet hernich sekund od nastaveni
|
||
#define MAGLOB_ONTIMER2 39 //cas - pocet hernich sekund od nastaveni
|
||
#define MAGLOB_ONTIMER3 40 //cas - pocet hernich sekund od nastaveni
|
||
#define MAGLOB_ONTIMER4 41 //cas - pocet hernich sekund od nastaveni
|
||
#define MAGLOB_ONFLUTE1 42 //zahrani urcite melodie
|
||
#define MAGLOB_ONFLUTE2 43 //zahrani urcite melodie
|
||
#define MAGLOB_ONFLUTE3 44 //zahrani urcite melodie
|
||
#define MAGLOB_ONFLUTE4 45 //zahrani urcite melodie
|
||
#define MAGLOB_ONFLUTE5 46 //zahrani urcite melodie
|
||
#define MAGLOB_ONFLUTE6 47 //zahrani urcite melodie
|
||
#define MAGLOB_ONFLUTE7 48 //zahrani urcite melodie
|
||
#define MAGLOB_ONFLUTE8 49 //zahrani urcite melodie
|
||
|
||
#define MAGLOB_NEXTID 50 //mus<75> b<>t posledn<64>
|
||
|
||
|
||
|
||
|
||
#define MC_PASSSUC 0x1
|
||
#define MC_PASSFAIL 0x2
|
||
#define MC_TOUCHSUC 0x4
|
||
#define MC_TOUCHFAIL 0x8
|
||
#define MC_LOCKINFO 0x10
|
||
#define MC_EXIT 0x20
|
||
#define MC_INCOMING 0x40
|
||
#define MC_STARTLEV 0x80
|
||
#define MC_CLOSEDOOR 0x100
|
||
#define MC_ANIM 0x200
|
||
#define MC_ANIM2 0x400
|
||
#define MC_SUCC_DONE 0x800
|
||
#define MC_SPEC_SUCC 0x1000
|
||
#define MC_OPENDOOR 0x2000
|
||
#define MC_VYKEVENT 0x4000
|
||
#define MC_WALLATTACK 0x8000
|
||
|
||
typedef struct tma_gen
|
||
{
|
||
unsigned action : 6;
|
||
unsigned cancel : 1;
|
||
unsigned once : 1;
|
||
unsigned flags : 16;
|
||
}TMA_GEN;
|
||
|
||
typedef struct tma_sound
|
||
{
|
||
uint8_t action,flags,eflags; //3
|
||
uint8_t bit16;
|
||
uint8_t volume; //5
|
||
uint8_t soundid; //6
|
||
unsigned short freq; //8
|
||
int32_t start_loop,end_loop,offset;//20
|
||
char filename[12]; //32
|
||
}TMA_SOUND;
|
||
|
||
|
||
typedef struct tma_text
|
||
{
|
||
uint8_t action,flags,eflags,pflags; //4
|
||
int32_t textindex; //8
|
||
}TMA_TEXT;
|
||
|
||
typedef struct tma_send_action
|
||
{
|
||
uint8_t action,flags,eflags,change_bits; //4
|
||
unsigned short sector,side,s_action; //10
|
||
char delay; //11
|
||
}TMA_SEND_ACTION;
|
||
|
||
typedef struct tma_fireball
|
||
{
|
||
uint8_t action,flags,eflags; //3 + padding = 4
|
||
short xpos,ypos,zpos,speed,item; //14
|
||
}TMA_FIREBALL;
|
||
|
||
typedef struct tma_loadlev
|
||
{
|
||
uint8_t action,flags,eflags; //3+padding
|
||
short start_pos; //6
|
||
char dir; //7
|
||
char name[13];
|
||
}TMA_LOADLEV;
|
||
|
||
|
||
|
||
typedef struct tma_dropitm
|
||
{
|
||
uint8_t action,flags,eflags; //3+padding
|
||
short item;
|
||
}TMA_DROPITM;
|
||
|
||
typedef struct tma_codelock
|
||
{
|
||
uint8_t action,flags,eflags;
|
||
char znak;
|
||
char string[8];
|
||
char codenum;
|
||
}TMA_CODELOCK;
|
||
|
||
typedef struct tma_cancelaction
|
||
{
|
||
uint8_t action,flags,eflags,pflags; //4
|
||
short sector,dir;
|
||
}TMA_ACTN;
|
||
|
||
typedef struct tma_swapsectors
|
||
{
|
||
uint8_t action,flags,eflags,pflags; //4
|
||
short sector1,sector2;
|
||
}TMA_SWAPS;
|
||
|
||
typedef struct tma_wound
|
||
{
|
||
uint8_t action,flags,eflags,pflags; //4
|
||
short minor,major;
|
||
}TMA_WOUND;
|
||
|
||
|
||
|
||
typedef struct tma_lock
|
||
{
|
||
uint8_t action,flags,eflags; //3+padding
|
||
short key_id;
|
||
short thieflevel;
|
||
}TMA_LOCK;
|
||
|
||
typedef struct tma_two_parms
|
||
{
|
||
uint8_t action,flags,eflags; //3+padding
|
||
short parm1,parm2;
|
||
}TMA_TWOP;
|
||
|
||
typedef struct tma_create_unique
|
||
{
|
||
uint8_t action,flags,eflags; //3+padding
|
||
TITEM item;
|
||
}TMA_UNIQUE;
|
||
|
||
typedef struct tma_globe
|
||
{
|
||
uint8_t action,flags,eflags,event; //event - MAGLOB_XXXX
|
||
unsigned short sector; //sektor of action target, when event occured
|
||
unsigned char side; //side of action target, when event occured
|
||
unsigned char cancel; //1 - cancel event
|
||
uint32_t param; //event depend param - zero is default
|
||
}TMA_GLOBE;
|
||
|
||
|
||
typedef struct tma_ifsec
|
||
{
|
||
char action,flags,eflags;
|
||
unsigned char side; //side of action target, when event occured
|
||
unsigned short sector; //sektor of action target, when event occured
|
||
short line; //jump line
|
||
char invert; //invert condition
|
||
}TMA_IFSEC;
|
||
|
||
|
||
|
||
extern TMA_LOADLEV loadlevel;
|
||
|
||
typedef union tmulti_action
|
||
{
|
||
struct tma_gen general;
|
||
struct tma_sound sound;
|
||
struct tma_text text;
|
||
struct tma_send_action send_a;
|
||
struct tma_fireball fireball; //p
|
||
struct tma_loadlev loadlev; //p
|
||
struct tma_dropitm dropi; //p
|
||
struct tma_codelock clock;
|
||
struct tma_cancelaction cactn;
|
||
struct tma_lock lock; //p
|
||
struct tma_swapsectors swaps;
|
||
struct tma_wound wound;
|
||
struct tma_two_parms twop; //p
|
||
struct tma_create_unique uniq; //p
|
||
struct tma_globe globe;
|
||
struct tma_ifsec ifsec;
|
||
}TMULTI_ACTION;
|
||
|
||
typedef struct tmulti_action_record_t {
|
||
const TMULTI_ACTION *action_list;
|
||
size_t count;
|
||
} TMULTI_ACTION_RECORD;
|
||
|
||
typedef struct tmulti_action_states_t {
|
||
uint8_t *states;
|
||
size_t count;
|
||
} TMULTI_ACTION_STATE;
|
||
|
||
extern TMULTI_ACTION_RECORD *macros; //tabulka maker
|
||
extern TMULTI_ACTION_STATE macro_state_block;
|
||
extern void *macro_block; //alokovany blok maker (pri unloadu free!)
|
||
extern int macro_block_size; //velikost bloku;
|
||
|
||
void load_macros(int size,void *data);
|
||
void call_macro(int side,int flags);
|
||
void call_macro_ex(int side,int flags, int runatsect);
|
||
char get_player_triggered(int p); //zjistuje zda hrac s cislem p byl makrem zasazen;
|
||
char save_load_trigger(short load); //uklada/obnovuje trigger vlajky. -1 uklada, jinak hodnota ulozeneho triggeru
|
||
char save_codelocks(TMPFILE_WR *fsta); //uklada do savegame nastaveni kodovych zamku (128 bytu);
|
||
char load_codelocks(TMPFILE_RD *fsta); //obnovuje ze savegame nastaveni kodovych zamku (128 bytu);
|
||
|
||
typedef struct letici_vec
|
||
{
|
||
struct letici_vec *next;
|
||
int sector,smer;
|
||
int xpos,ypos,zpos;
|
||
short item;
|
||
short *items;
|
||
int counter;
|
||
char anim_pos;
|
||
char flags;
|
||
short owner;
|
||
int speed;
|
||
int velocity;
|
||
short hit_bonus;
|
||
short damage;
|
||
short lives;
|
||
}LETICI_VEC;
|
||
|
||
|
||
extern LETICI_VEC *letici_veci; //spojovy seznam leticich veci
|
||
extern LETICI_VEC *letici_veci2; //spojovy seznam leticich veci aktualni pred zahajenim renderace
|
||
#define FLY_NEHMOTNA 1 //leti rovne
|
||
#define FLY_DESTROY 2 //znici se
|
||
#define FLY_DESTROY_SEQ 4 //bezi nicici sekvence
|
||
#define FLY_NEDULEZITA 8 //nema vliv na souboj
|
||
#define FLY_IN_FLY 16 //Nastaveno, pokud fly ma vliv na okoli (v letu)
|
||
#define FLY_BURNT 32 //vyhorela - bude uvolnena
|
||
#define FLY_UNUSED 64 //nevyuzita - muze byt uvolnena
|
||
#define TFLY LETICI_VEC
|
||
LETICI_VEC *throw_fly(int x,int y, char rovne);
|
||
|
||
/* postup pri niceni fly
|
||
|
||
Pri triggeru zniceni
|
||
1) Je Destroy? - > nastav DESTROY_SEQ
|
||
2) Po zniceni -> nastav BURNT
|
||
3) Pokud je pri zpracovani BURNT -> nastav UNUSED
|
||
4) Pokud je unused -> vymaz ji
|
||
|
||
Tento slozity postup je zaveden, z duvodu viceulohoveho zpracovani, aby mel
|
||
system jistotu ze vsechny pripadne kopie fly jsou znicene a neukazuji
|
||
na neplatne objekty
|
||
|
||
Zkratka - pokud je fly znicena, musi ji system potvrdit jeste vlajkou UNUSED, aby
|
||
ji mohl uvolnit
|
||
*/
|
||
|
||
LETICI_VEC *create_fly(void); //vytvari fly - optimalizuje tim ze hleda nevyuzity fly nosice, a teprve pokud neuspeje alokuje novy prostor.
|
||
void draw_fly_items(int celx,int cely,int sector,int side);
|
||
void add_fly(LETICI_VEC *p);
|
||
void build_fly_map(void);
|
||
void destroy_fly_map(void);
|
||
void destroy_all_fly();
|
||
void stop_fly(LETICI_VEC *p,char zvuk);
|
||
void herni_cas(char *s);
|
||
|
||
|
||
|
||
//gamesaver
|
||
void leave_current_map(void);
|
||
int save_map_state(void); //uklada stav mapy pro savegame (neuklada aktualni pozici);
|
||
int load_map_state(void); //obnovuje stav mapy; nutno volat po zavolani load_map;
|
||
void restore_current_map(void); //pouze obnovuje ulozeny stav aktualni mapy
|
||
uint32_t fnv1a_hash(const char *str);
|
||
int load_game(const char *fname);
|
||
int save_game(long game_time,char *gamename, char is_autosave);
|
||
void save_map_description(TMPFILE_WR *f);
|
||
void load_map_description(TMPFILE_RD *f);
|
||
void free_map_description();
|
||
void wire_save_load(char save);
|
||
void do_save_dialog();
|
||
char ask_save_dialog(char *name_buffer, size_t name_size, char allow_remove);
|
||
void do_autosave();
|
||
#define autosave() if (autosave_enabled) do_autosave();
|
||
extern char autosave_enabled;
|
||
extern char autosave_on_enter;
|
||
int load_map_automap(char *mapfile);
|
||
/* ^^^ Tato funkce zmeni mapu, bez zmeny grafiky a stavu cele hry.
|
||
Jeji vyuziti je pro zobrazeni automapingu jineho levelu nez aktualniho
|
||
Pred navratem do hry je treba udelat load_map_automap(level_fname);!!!*/
|
||
|
||
//setup
|
||
char q_runsetup(char *);
|
||
void user_setup(void);
|
||
void setup_dialoge(void);
|
||
char game_setup(int id,int xa,int ya,int xr,int yr);
|
||
void GamePause(void);
|
||
typedef struct ctl3d CTL3D;
|
||
void show_textured_button(int x,int y,int xs,int ys,int texture,CTL3D *border3d);
|
||
|
||
//sounder & music
|
||
|
||
extern short sample_volume; //hlastitost samplu
|
||
extern char **sound_table;
|
||
|
||
void init_tracks(void);
|
||
void recalc_volumes(int sector,int side);
|
||
void play_effekt(int x,int y,int xd,int yd,int sector, int side,const TMA_SOUND *p);
|
||
void create_playlist(char *playlist);
|
||
const char *get_next_music_from_playlist(void);
|
||
const char * end_of_song_callback(void *ctx);
|
||
void purge_playlist(void);
|
||
void play_sample_at_sector(int sample,int listener,int source,int track, char loop);
|
||
void play_sample_at_channel(int sample,int channel,int vol);
|
||
void stop_track(int track);
|
||
char test_playing(int track);
|
||
void stop_track_free(int track);
|
||
void mute_all_tracks(char all);
|
||
void kill_all_sounds(void);
|
||
void create_sound_table(char *template,int32_t size);
|
||
void create_sound_table_old(void);
|
||
void start_play_flute(char );
|
||
void stop_play_flute(void);
|
||
void pc_speak_play_sample(char *sample,int size,char step,int freq);
|
||
char enable_sound(char enbl);
|
||
void wire_main_functs(void);
|
||
void unwire_main_functs(void);
|
||
|
||
//enemy
|
||
#define MOBS_INV 16
|
||
#define MOB_POSIT 0
|
||
#define MOB_ATTACK 1
|
||
#define MOB_TOHIT 2
|
||
|
||
#define MAX_MOBS 255
|
||
|
||
|
||
#define MOB_ATTACKING 0x2
|
||
#define MOB_TO_HIT 0x4
|
||
#define MOB_DEATH 0x5
|
||
#define MOB_START 1
|
||
|
||
#define MOB_WALK 0x1
|
||
#define MOB_WATCH 0x2
|
||
#define MOB_LISTEN 0x4
|
||
#define MOB_BIG 0x8
|
||
#define MOB_GUARD 0x10
|
||
#define MOB_PICK 0x20
|
||
#define MOB_PICKING 0x40
|
||
#define MOB_ROGUE 0x80
|
||
//vlajky
|
||
#define MOB_IN_BATTLE 0x1
|
||
#define MOB_PASSABLE 0x2
|
||
#define MOB_SENSE 0x4
|
||
#define MOB_MOBILE 0x8
|
||
#define MOB_RELOAD 0x10
|
||
#define MOB_CASTING 0x20
|
||
#define MOB_SAMPLE_LOOP 0x40
|
||
#define MOB_LIVE 0x80 //potvora zije
|
||
|
||
//vlajky2
|
||
#define MOB_F2_DONT_SAVE 0x1
|
||
|
||
typedef struct tmob
|
||
{
|
||
char name[30]; //jmeno moba
|
||
short casting;
|
||
short adjusting[6*16]; //volba stredu pro animace
|
||
unsigned short sector,dir; //pozice
|
||
char locx,locy; //presna pozice
|
||
char headx,heady; //pozice kam mob miri
|
||
short anim_counter; //citac animaci
|
||
short vlastnosti[24]; //zakladni vlastnosti potvory
|
||
short inv[MOBS_INV]; //batoh potvory
|
||
short lives; //pocet zivotu potvory
|
||
short cislo_vzoru; //informace urcujici ze ktereho vzoru byl mob vytvoren
|
||
short speed; //rychlost pohybu
|
||
short dohled; //kam dohl<68>dne
|
||
short dosah; //okam<61>ik za<7A><61>tku souboje
|
||
char stay_strategy; //chovani moba ve statickem modu (nepronasleduje)
|
||
char walk_data; //cislo potrebne pro pohyb moba v bludisti
|
||
unsigned short bonus; //bonus za zabiti
|
||
char flee_num; //pravdepodobnost uteku
|
||
char anim_counts[6]; //pocet animacnich policek pro kazdy pohyb
|
||
char mobs_name[7]; //zaklad jmena souboru pro moba
|
||
char vlajky2; //vlajky pro summon z konzoli (BIT0 - neukladat)
|
||
int32_t experience; //zkusenost
|
||
char vlajky; //BIT0 - 1 v boji
|
||
char anim_phase; //cinnost kterou mob dela
|
||
short csektor; //Cilovy sektor
|
||
short home_pos; //domaci pozice
|
||
short next; //Cislo dalsiho moba, ktery stoji na jeho pozici
|
||
char actions; //pocet akci ktere muze potvora provest v kole
|
||
char hit_pos; //animacni pozice, kdy potvora zasahne
|
||
unsigned short sounds[4]; //zvuky z listu
|
||
signed char palette; // pocet pouzitelnych palet / cislo palety
|
||
char mode; //akce potvory
|
||
short dialog; //cislo dialogu, -1 kdyz neni;
|
||
char dialog_flags; //vlajky mapovane do dialogu;
|
||
unsigned short money; //penize
|
||
unsigned short specproc; //specproc
|
||
unsigned short dostal; //pocet zivotu, ktere mu byly ubrany poslednim zasahem
|
||
char user_data; //data uzivatelem definovane - treba pro spec.
|
||
}TMOB;
|
||
|
||
|
||
extern TMOB mobs[MAX_MOBS];
|
||
extern char *mob_map;
|
||
|
||
void draw_mob(int num,int curdir,int celx,int cely,char shiftup);
|
||
void calc_mobs(void);
|
||
void najdi_cestu(word start,word konec,int flag,word **cesta, int aimbig);
|
||
void sirit_zvuk(word start);
|
||
void check_all_mobs(void);
|
||
void build_all_players(void);
|
||
void init_mobs(void);
|
||
void refresh_mob_map(void);
|
||
char akce_moba_zac(TMOB *m);
|
||
void mob_animuj(void); //animuje prave bojovou akci potvor na sektoru
|
||
void sleep_enemy(char regen);
|
||
int vyber_potvoru(int sect,int dir,int *z);
|
||
void mob_hit(TMOB *mm,int dostal);
|
||
int mob_alter(int sect);
|
||
void check_all_mobs_battle(void); //kontroluje zda je nekdo v battle
|
||
void manashield_check(short *vls,short *lives,short *mana,int dostal);
|
||
char track_mob(int sect,int dir);//trackuje pritomnost potvory v urcitem smeru
|
||
void stop_all_mobs(void);
|
||
int utok_na_sektor(THUMAN *p,TMOB *m,int chaos,int bonus, int ruka);
|
||
int vyber_potvoru(int sect,int dir,int *chaos); //vybere potvoru ze sektoru a smeru. Vraci take pocet potvor v promenne *chaos
|
||
void load_enemies(short *data,int size,int *grptr,const TMOB *template,int32_t tsize);
|
||
char mob_test_na_bitvu(TMOB *p); //nastavi p->vlajky|MOB_INBATTLE pokud potvora muze vstoupit do bitvy;
|
||
void send_mob_to(int m,word *path);
|
||
void save_enemy_paths(TMPFILE_WR *f);
|
||
int load_enemy_paths(TMPFILE_RD *f);
|
||
void regen_all_mobs(void);
|
||
|
||
|
||
//souboje
|
||
extern int mob_dostal; // ikona pro zasah moba
|
||
extern int mob_dostal_pocet; // ciselna hodnota toho kolik mob dostal;
|
||
extern short vybrana_zbran; //zbran_kterou utoci select_player;
|
||
extern char mute_hit_sound; //nastavit, pokud je nutne zabranit zvuku vzdechy, automaticky se resetuje
|
||
extern int hromadny_utek; //1 postavy utikaji hromadne.
|
||
|
||
extern char running_battle;
|
||
|
||
#define MAX_WEAPON_SKILL 10
|
||
|
||
void zacni_souboj(TMOB *p,int delka,short sector);
|
||
char q_zacit_souboj(TMOB *p,int d,short sector);
|
||
void stop_mob(TMOB *p);
|
||
void start_battle(void);
|
||
int vypocet_zasahu(const short *utocnik,const short *obrance, int chaos,int zbran,int bonusplus, char enable_finesse_rule);
|
||
void rozhodni_o_smeru(TMOB *p);
|
||
void krok_moba(TMOB *p);
|
||
void pomala_regenerace_postavy(THUMAN *p);
|
||
char zasah_veci(int sector,TFLY *fl);
|
||
void vymaz_zasahy(THE_TIMER *q);
|
||
char check_end_game(void);
|
||
void wire_end_game(void);
|
||
void auto_group(void);
|
||
void wire_fly_casting(int i);
|
||
void konec_kola(void);
|
||
void send_experience(TMOB *p,int dostal);
|
||
void send_weapon_skill(int druh);
|
||
void check_player_new_level(THUMAN *p);
|
||
void poloz_vsechny_predmety(void);
|
||
char player_check_death(THUMAN *p, char afterround); //pokud je battle, nezabije postavu, ale az po skonceni kola (afterround==1)
|
||
char player_hit(THUMAN *p,int zraneni,char manashield);
|
||
void enforce_start_battle(void);
|
||
void pozdrz_akci(void);
|
||
void uprav_podle_kondice(THUMAN *p,int *chaos); //upravi parametr chaos podle kondice pro obranu
|
||
THUMAN *isplayer(int sector,THUMAN *h,char death);
|
||
/* Vraci nasledujiciho hrace na sektoru. Pokud je h==NULL vraci prvniho.
|
||
pokud je vysledek NULL neni dalsiho hrace
|
||
Death=1 pocita i mrtvoly
|
||
*/
|
||
int trace_path(int sector,int dir); //zjistuje zda je mozne strilet
|
||
void wzprintf(const char *text,...) __attribute__((format(printf, 1, 2)));
|
||
|
||
|
||
int numplayers(int sector,char death);
|
||
/* Vraci pocet hracu na sektoru, death=1 pocita i mrtvoly */
|
||
TMOB *ismonster(int sector,TMOB *m);
|
||
/* Vraci dalsi nestvuru na sektoru, pokud je m==NULL vraci prvni.
|
||
Pokud je vysledek NULL neni nestvura na sektoru*/
|
||
|
||
void correct_level(void);
|
||
|
||
|
||
|
||
//kouzla
|
||
extern char running_anm;
|
||
extern short teleport_target;
|
||
extern char hlubina_level;
|
||
extern word *anim_render_buffer;
|
||
extern char spell_cast; //0=neni rezim vyberu kouzla;
|
||
|
||
#define isdemon(p) ((p)->stare_vls[VLS_KOUZLA] & SPL_DEMON)
|
||
|
||
|
||
void kouzla_init(void);
|
||
void test_play(int handle);
|
||
void cast(int num,THUMAN *p,int owner,char backfire);
|
||
int add_spell(int num,int cil,int owner,char noanim);
|
||
void klicovani_anm(void *target,void *source,char mirror);
|
||
//#pragma aux klicovani_anm parm [edi][esi][eax] modify [ecx edx ebx]
|
||
int get_spell_color(THUMAN *p,int num);
|
||
int get_spell_info(int num, char *txt, size_t sz);
|
||
int get_spell_mana(int num);
|
||
int get_spell_um(int num);
|
||
char ask_who(int num);
|
||
void display_spell_in_icone(int handle,int xicht);
|
||
void reinit_kouzla_full(void);
|
||
char get_rune_enable(THUMAN *p,int strnum);
|
||
void remove_all_mob_spells(void);
|
||
int save_spells(TMPFILE_WR *f);
|
||
int load_spells(TMPFILE_RD *f);
|
||
char get_spell_track(int num);
|
||
void mob_cast(int num,TMOB *m,int mob_num);
|
||
void thing_cast(int num,int postava,int sector,TMOB *victim,char noanim);//vyvolavaji veci
|
||
void area_cast(int num,int sector,int owner,char noanim);
|
||
int select_teleport_target(char nolimit);
|
||
char get_spell_teleport(int num);
|
||
void spell_throw(int cil,int what); //to je procedura ktera umoznuje potvoram strilet
|
||
void play_big_mgif_animation(int block);
|
||
void unaffect_demon(int cil); //ukonci demona pri jeho smrti
|
||
char *get_rune_name(int strnum);
|
||
void spell_sound(char *name);
|
||
void spell_teleport(int cil,int owner, int teleport_target);
|
||
|
||
|
||
//interface
|
||
#define WINCOLOR RGB555(24,24,24) // 11000 11000 0 11000
|
||
#define BAR_COLOR RGB555(15,13,11)
|
||
#define SETUP_COL1 RGB555(20,31,20)
|
||
#define SETUP_COL2 (RGB555(31,31,16) | FONT_TSHADOW)
|
||
#define S_WINPOS_X 100
|
||
#define S_WINPOS_Y 100
|
||
#define S_WINPOS_XS 320
|
||
#define S_WINPOS_YS 300
|
||
|
||
typedef struct objrec OBJREC;
|
||
typedef struct enc_file
|
||
{
|
||
FILE *f;
|
||
char *to_delete;
|
||
}ENCFILE;
|
||
|
||
void add_window(int x,int y,int xs,int ys,int texture,int border,int txtx,int txty);
|
||
int message(int butts,char def,char canc,char *keys,...);
|
||
void type_text(EVENT_MSG *msg,void **data); //event procedura (parms: X,Y,TEXT,MAX_SPACE,MAX_CHARS);
|
||
void type_text_v2(va_list args);//char *text_buffer,int x,int y,int max_size,int max_chars,int font,int color,void (*exit_proc)(char));
|
||
void zalamovani(const char *source,char *target,int maxxs,int *xs,int *ys);
|
||
const void *col_load(const void *data, int32_t *size, int h);
|
||
void open_story_file(void);
|
||
void write_story_text(char *text);
|
||
void close_story_file(void);
|
||
char labyrinth_find_path(word start,word konec,int flag,char (*proc)(word, void *),word **cesta, void *ctx);
|
||
//tato procedura je obecne hledani cesty. Start - startovni cislo sektoru
|
||
//Konec - cilove cislo sektoru
|
||
//flag - je podminkovy flag pro nepruchozi steny
|
||
//proc - je procedura volana pro kazdy sektor
|
||
//cesta - je ukazatel na ukazatel na vyslednou cestu
|
||
//pokud je cesta=NULL pak vraci pouze zda cesta existuje ci nikoliv
|
||
void radio_butts_gr(OBJREC *o);
|
||
void start_check(void); //testuje stav pocitace a rozhodne zda lze program spustit
|
||
void check_number_1phase(char *exename); //check serial number! Task!//
|
||
void animate_checkbox(int first_id,int last_id,int step);
|
||
void fletna_pridej_notu(char note);
|
||
void check_fletna(THE_TIMER *t);
|
||
char fletna_get_buffer_pos(void);
|
||
char fletna_can_add_timer();
|
||
void check_global_fletna(THE_TIMER *t);
|
||
void fletna_glob_add_note(uint8_t note);
|
||
|
||
|
||
TMPFILE_RD *enc_open(const char *filename); //dekoduje a otevira TXT soubor (ENC)
|
||
void enc_close(TMPFILE_RD *fil);
|
||
int load_string_list_ex(char ***list,const char *filename);
|
||
|
||
typedef struct {
|
||
int hprice;
|
||
const char *message;
|
||
char canceled;
|
||
} THAGGLERESULT;
|
||
|
||
int smlouvat_nakup(int cena,int ponuka,int posledni,int puvod,int pocet);
|
||
int smlouvat_prodej(int cena,int ponuka,int posledni,int puvod,int pocet);
|
||
THAGGLERESULT smlouvat_dlg(int cena,int puvod,int pocet,int posledni, int money,char mode);
|
||
|
||
void disable_intro(void);
|
||
//void show_jrc_logo(char *filename);
|
||
|
||
|
||
//dialogy
|
||
void call_dialog(int entr,int mob);
|
||
char save_dialog_info(TMPFILE_WR *f);
|
||
char load_dialog_info(TMPFILE_RD *f);
|
||
short *q_item_one(int i,int itnum); //test zda postava i ma vec itnum
|
||
short *q_item(int itnum,int sector); //test zda-li aspon jeden na sectoru ma vec itnum
|
||
void change_flag(int flag,char mode); //meni vlajku = 0 - reset, 1 - set, 2 - neg
|
||
char test_flag(int flag); //vraci stav vlajky;
|
||
char dialog_is_paragraph(int id); //vraci zda-li je id dialogem
|
||
char dialog_set_notvisited(int pgf); //nastavi ze stranka nebyla navstivena
|
||
extern char trace_dialogs;
|
||
|
||
|
||
//generator
|
||
char enter_generator(void);
|
||
|
||
//kniha
|
||
#define add_to_book(odst) add_text_to_book(texty_knihy,odst)
|
||
void add_text_to_book(const char *filename,int odst);
|
||
void write_book(int page);
|
||
int count_pages(void);
|
||
void save_book(void);
|
||
void load_book(void);
|
||
void prekodovat(char *c);
|
||
char clk_enter(int id,int xa,int ya,int xr,int yr);
|
||
|
||
//menu
|
||
int enter_menu(char open); //task!
|
||
void titles(va_list args); //task!
|
||
void run_titles(va_list args); //task!
|
||
void effect_show(va_list args); //effektni zobrazeni // task!
|
||
void konec_hry(void);
|
||
|
||
|
||
//globmap
|
||
void wire_global_map(void);
|
||
void wire_automap_file(char *mapfile);
|
||
char set_select_mode(char mode);
|
||
|
||
void macro_load_another_map(const TMA_LOADLEV *);
|
||
|
||
void PodporaStitu(THUMAN *h, short *vlastnosti);
|
||
|
||
typedef struct _tag_globalEventDef
|
||
{
|
||
unsigned short sector; //sektor of action target, when event occured
|
||
unsigned char side; //side of action target, when event occured
|
||
unsigned char cancel; //
|
||
int32_t param; //event depend param - zero is default
|
||
}SGlobalEventDef;
|
||
|
||
extern SGlobalEventDef GlobEventList[MAGLOB_NEXTID];
|
||
|
||
static __inline char GlobEvent(int event, int sector, int side)
|
||
{
|
||
if (GlobEventList[event].sector || GlobEventList[event].side)
|
||
call_macro_ex(sector*4+side,MC_INCOMING,GlobEventList[event].sector*4+GlobEventList[event].side);
|
||
return !GlobEventList[event].cancel;
|
||
}
|
||
|
||
|
||
static __inline char GlobEvents(int firstevid, int lastevid, int sector, int side, int32_t param)
|
||
{
|
||
int i;
|
||
for (i=firstevid;i<=lastevid;i++) if (GlobEventList[i].param==param)
|
||
{
|
||
return GlobEvent(i,sector,side);
|
||
}
|
||
return 1;
|
||
}
|
||
|
||
|
||
static __inline char TimerEvents(int sector, int side, int32_t time)
|
||
{
|
||
int i;
|
||
for (i=MAGLOB_ONTIMER1;i<=MAGLOB_ONTIMER4;i++) if (GlobEventList[i].param && GlobEventList[i].param<=time)
|
||
{
|
||
GlobEventList[i].param=0;
|
||
return GlobEvent(i,sector,side);
|
||
}
|
||
return 1;
|
||
}
|
||
|
||
static __inline int quit_request_as_escape(int c) {
|
||
if (c == E_QUIT_GAME_KEY) return 0x011B;else return c;
|
||
}
|
||
|
||
void draw_console_window(void);
|
||
void console_show(char show);
|
||
char console_is_visible(void);
|
||
|
||
char *map_hash_to_string_impl(char *c, uint32_t h, int sz);
|
||
#define map_hash_to_string(h) (map_hash_to_string_impl((char *)alloca(31), h, 30))
|
||
const char *find_map_from_hash_impl(char *c, uint32_t h, int sz);
|
||
#define find_map_from_hash(h) (find_map_from_hash_impl((char *)alloca(31), h, 30))
|
||
char can_select_player(THUMAN *p, char select_dead, char select_far);
|
||
char generate_string_tables(const char *path);
|
||
|
||
char *change_extension_support(char *buffer, const char *filename,char *new_extension);
|
||
#define set_file_extension(filename, extension) change_extension_support((char *)alloca(strlen(filename)+strlen(extension)+1), (filename), (extension))
|
||
void load_enemy_to_map(int i, int sector, int dir, const TMOB *t);
|
||
|
||
void hide_boat();
|
||
|
||
//extras
|
||
#include "extras.h"
|