diff options
Diffstat (limited to 'engines/cge/cge_main.cpp')
-rw-r--r-- | engines/cge/cge_main.cpp | 3377 |
1 files changed, 1514 insertions, 1863 deletions
diff --git a/engines/cge/cge_main.cpp b/engines/cge/cge_main.cpp index cdbb94f785..62936e8c9c 100644 --- a/engines/cge/cge_main.cpp +++ b/engines/cge/cge_main.cpp @@ -25,57 +25,57 @@ * Copyright (c) 1994-1995 Janus B. Wisniewski and L.K. Avalon */ -#include "cge/general.h" -#include "cge/boot.h" -#include "cge/ident.h" -#include "cge/sound.h" -#include "cge/startup.h" -#include "cge/config.h" -#include "cge/vga13h.h" -#include "cge/snail.h" -#include "cge/text.h" -#include "cge/game.h" -#include "cge/mouse.h" -#include "cge/keybd.h" -#include "cge/cfile.h" -#include "cge/vol.h" -#include "cge/talk.h" -#include "cge/vmenu.h" -#include "cge/gettext.h" -#include "cge/mixer.h" -#include "cge/cge_main.h" -#include <conio.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <dos.h> -#include <fcntl.h> -#include <io.h> +#include "cge/general.h" +#include "cge/boot.h" +#include "cge/ident.h" +#include "cge/sound.h" +#include "cge/startup.h" +#include "cge/config.h" +#include "cge/vga13h.h" +#include "cge/snail.h" +#include "cge/text.h" +#include "cge/game.h" +#include "cge/mouse.h" +#include "cge/keybd.h" +#include "cge/cfile.h" +#include "cge/vol.h" +#include "cge/talk.h" +#include "cge/vmenu.h" +#include "cge/gettext.h" +#include "cge/mixer.h" +#include "cge/cge_main.h" +#include <conio.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <dos.h> +#include <fcntl.h> +#include <io.h> #include "common/str.h" namespace CGE { -#define STACK_SIZ (K(2)) -#define SVGCHKSUM (1956+Now+OldLev+Game+Music+DemoText) +#define STACK_SIZ (K(2)) +#define SVGCHKSUM (1956+Now+OldLev+Game+Music+DemoText) -#ifdef DEMO - #ifdef DEBUG - #define SVG0NAME ("{{INIT}}" SVG_EXT) - #else - #define SVG0NAME (ProgName(SVG_EXT)) - #endif +#ifdef DEMO +#ifdef DEBUG +#define SVG0NAME ("{{INIT}}" SVG_EXT) +#else +#define SVG0NAME (ProgName(SVG_EXT)) +#endif #else - #define SVG0NAME ("{{INIT}}" SVG_EXT) +#define SVG0NAME ("{{INIT}}" SVG_EXT) #endif -#ifdef DEBUG - #define SVG0FILE CFILE +#ifdef DEBUG +#define SVG0FILE CFILE #else - #define SVG0FILE INI_FILE +#define SVG0FILE INI_FILE #endif -extern uint16 _stklen = (STACK_SIZ * 2); +extern uint16 _stklen = (STACK_SIZ * 2); // 0.75 - 17II95 - full sound support // 0.76 - 18II95 - small MiniEMS in DEMO, @@ -86,1715 +86,1398 @@ extern uint16 _stklen = (STACK_SIZ * 2); // coditionals EVA for 2-month evaluation version /* - char Copr[] = "Common Game Engine " - #ifdef EVA - "ú" - #else - #ifdef CD - "ù" - #else - " " - #endif - #endif - " version 1.05 [" - #if sizeof(INI_FILE) == sizeof(VFILE) - "I" - #else - "i" - #endif - #if sizeof(PIC_FILE) == sizeof(VFILE) - "B" - #else - "b" - #endif - "]\n" - "Copyright (c) 1994 by Janusz B. Wi$niewski"; + char Copr[] = "Common Game Engine " + #ifdef EVA + "ú" + #else + #ifdef CD + "ù" + #else + " " + #endif + #endif + " version 1.05 [" + #if sizeof(INI_FILE) == sizeof(VFILE) + "I" + #else + "i" + #endif + #if sizeof(PIC_FILE) == sizeof(VFILE) + "B" + #else + "b" + #endif + "]\n" + "Copyright (c) 1994 by Janusz B. Wi$niewski"; */ - char Copr[] = "To be fixed - Copr[]"; +char Copr[] = "To be fixed - Copr[]"; -static char UsrFnam[15] = "\0ɱ%^þúȼ´ ÇÉ"; -static int OldLev = 0; -static int DemoText = DEMO_TEXT; +static char UsrFnam[15] = "\0ɱ%^þúȼ´ ÇÉ"; +static int OldLev = 0; +static int DemoText = DEMO_TEXT; //-------------------------------------------------------------------------- - bool JBW = false; - DAC *SysPal = farnew(DAC, PAL_CNT); +bool JBW = false; +DAC *SysPal = farnew(DAC, PAL_CNT); //------------------------------------------------------------------------- - SPRITE PocLight = LI; - SPRITE * Pocket[POCKET_NX]={ NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, }; - int PocPtr = 0; -//------------------------------------------------------------------------- -//extern SPRITE * PocLight; -//extern SPRITE * Pocket[]; -//extern int PocPtr; -//------------------------------------------------------------------------- +SPRITE PocLight = LI; +SPRITE *Pocket[POCKET_NX] = { NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, + }; +int PocPtr = 0; - MOUSE Mouse; -static SPRITE * Sprite = NULL; -static SPRITE * MiniCave = NULL; -static SPRITE * Shadow = NULL; +MOUSE Mouse; +static SPRITE *Sprite = NULL; +static SPRITE *MiniCave = NULL; +static SPRITE *Shadow = NULL; -static VGA Vga = M13H; -static EMS * Mini = MiniEmm.Alloc((uint16)MINI_EMM_SIZE); -static BMP_PTR * MiniShpList = NULL; -static BMP_PTR MiniShp[] = { NULL, NULL }; -static KEYBOARD Keyboard; -static bool Finis = false; -static int Startup = 1; -static int OffUseCount = atoi(Text[OFF_USE_COUNT]); - uint16 *intStackPtr = false; +static VGA Vga = M13H; +static EMS *Mini = MiniEmm.Alloc((uint16)MINI_EMM_SIZE); +static BMP_PTR *MiniShpList = NULL; +static BMP_PTR MiniShp[] = { NULL, NULL }; +static KEYBOARD Keyboard; +static bool Finis = false; +static int Startup = 1; +static int OffUseCount = atoi(Text[OFF_USE_COUNT]); +uint16 *intStackPtr = false; - HXY HeroXY[CAVE_MAX] = {{0,0}}; - BAR Barriers[1+CAVE_MAX] = { { 0xFF, 0xFF } }; +HXY HeroXY[CAVE_MAX] = {{0, 0}}; +BAR Barriers[1 + CAVE_MAX] = { { 0xFF, 0xFF } }; -extern int FindPocket (SPRITE *); +extern int FindPocket(SPRITE *); -extern DAC StdPal[58]; +extern DAC StdPal[58]; -#ifdef DEBUG -static SPRITE HorzLine = HL; +#ifdef DEBUG +static SPRITE HorzLine = HL; #endif +void FeedSnail(SPRITE *spr, SNLIST snq); // defined in SNAIL +uint8 CLUSTER::Map[MAP_ZCNT][MAP_XCNT]; -void FeedSnail (SPRITE * spr, SNLIST snq); // defined in SNAIL - -//-------------------------------------------------------------------------- - - - - -uint8 CLUSTER::Map[MAP_ZCNT][MAP_XCNT]; - - - -uint8 & CLUSTER::Cell (void) -{ - return Map[B][A]; +uint8 &CLUSTER::Cell(void) { + return Map[B][A]; } +bool CLUSTER::Protected(void) { +/* + if (A == Barriers[Now].Vert || B == Barriers[Now].Horz) + return true; + _DX = (MAP_ZCNT << 8) + MAP_XCNT; + _BX = (uint16) this; + asm mov ax,1 + asm mov cl,[bx].(COUPLE)A + asm mov ch,[bx].(COUPLE)B + asm test cx,0x8080 // (A < 0) || (B < 0) + asm jnz xit + asm cmp cl,dl + asm jge xit + asm cmp ch,dh + asm jge xit + // if (A < 0 || A >= MAP_XCNT || B < 0 || B >= MAP_ZCNT) return true; + asm mov al,dl + asm mul ch + asm xor ch,ch + asm add ax,cx + asm mov bx,ax + _BX += (uint16) Map; + //asm add bx,offset CLUSTER::Map + asm mov al,[bx] + asm and ax,0xFF + asm jz xit + asm mov ax,1 -bool CLUSTER::Protected (void) -{ - if (A == Barriers[Now].Vert || B == Barriers[Now].Horz) return true; - warning("STUB: CLUSTER::Protected()"); - /* - _DX = (MAP_ZCNT << 8) + MAP_XCNT; - _BX = (uint16) this; - - asm mov ax,1 - asm mov cl,[bx].(COUPLE)A - asm mov ch,[bx].(COUPLE)B - asm test cx,0x8080 // (A < 0) || (B < 0) - asm jnz xit - - asm cmp cl,dl - asm jge xit - asm cmp ch,dh - asm jge xit - -// if (A < 0 || A >= MAP_XCNT || B < 0 || B >= MAP_ZCNT) return true; - - asm mov al,dl - asm mul ch - asm xor ch,ch - asm add ax,cx - asm mov bx,ax - _BX += (uint16) Map; - //asm add bx,offset CLUSTER::Map - asm mov al,[bx] - asm and ax,0xFF - asm jz xit - asm mov ax,1 + // return Map[B][A] != 0; -// return Map[B][A] != 0; + xit: return _AX; + */ - xit: return _AX; - */ - return TRUE; + warning("STUB: CLUSTER::Protected()"); + return TRUE; } +CLUSTER XZ(int x, int y) { + if (y < MAP_TOP) + y = MAP_TOP; + if (y > MAP_TOP + MAP_HIG - MAP_ZGRID) + y = MAP_TOP + MAP_HIG - MAP_ZGRID; - -CLUSTER XZ (int x, int y) -{ - if (y < MAP_TOP) y = MAP_TOP; - if (y > MAP_TOP + MAP_HIG - MAP_ZGRID) y = MAP_TOP + MAP_HIG - MAP_ZGRID; - return CLUSTER(x / MAP_XGRID, (y-MAP_TOP) / MAP_ZGRID); + return CLUSTER(x / MAP_XGRID, (y - MAP_TOP) / MAP_ZGRID); } - - -CLUSTER XZ (COUPLE xy) -{ - signed char x, y; - xy.Split(x, y); - return XZ(x, y); +CLUSTER XZ(COUPLE xy) { + signed char x, y; + xy.Split(x, y); + return XZ(x, y); } +int pocref[POCKET_NX]; +uint8 volume[2]; +struct SAVTAB { + void *Ptr; + int Len; + uint8 Flg; +} SavTab[] = { + { &Now, sizeof(Now), 1 }, + { &OldLev, sizeof(OldLev), 1 }, + { &DemoText, sizeof(DemoText), 1 }, + { &Game, sizeof(Game), 1 }, + { &Game, sizeof(Game), 1 }, // spare 1 + { &Game, sizeof(Game), 1 }, // spare 2 + { &Game, sizeof(Game), 1 }, // spare 3 + { &Game, sizeof(Game), 1 }, // spare 4 + { &VGA::Mono, sizeof(VGA::Mono), 0 }, + { &Music, sizeof(Music), 1 }, + { volume, sizeof(volume), 1 }, + { Flag, sizeof(Flag), 1 }, + { HeroXY, sizeof(HeroXY), 1 }, + { Barriers, sizeof(Barriers), 1 }, + { pocref, sizeof(pocref), 1 }, + { NULL, 0, 0 } +}; +static void LoadGame(XFILE &file, bool tiny = false) { + SAVTAB *st; + SPRITE *spr; + int i; + for (st = SavTab; st->Ptr; st ++) { + if (file.Error) + error("Bad SVG"); + file.Read((uint8 *)((tiny || st->Flg) ? st->Ptr : &i), st->Len); + } -//-------------------------------------------------------------------------- - - - int pocref[POCKET_NX]; - uint8 volume[2]; - struct SAVTAB { void * Ptr; int Len; uint8 Flg; } SavTab[] = - {{ &Now, sizeof(Now), 1 }, - { &OldLev, sizeof(OldLev), 1 }, - { &DemoText, sizeof(DemoText), 1 }, - { &Game, sizeof(Game), 1 }, - { &Game, sizeof(Game), 1 }, // spare 1 - { &Game, sizeof(Game), 1 }, // spare 2 - { &Game, sizeof(Game), 1 }, // spare 3 - { &Game, sizeof(Game), 1 }, // spare 4 - { &VGA::Mono, sizeof(VGA::Mono), 0 }, - { &Music, sizeof(Music), 1 }, - { volume, sizeof(volume), 1 }, - - { Flag, sizeof(Flag), 1 }, - { HeroXY, sizeof(HeroXY), 1 }, - { Barriers, sizeof(Barriers), 1 }, - { pocref, sizeof(pocref), 1 }, - { NULL, 0, 0 } }; - - - + file.Read((uint8 *) &i, sizeof(i)); + if (i != SVGCHKSUM) + error(Text[BADSVG_TEXT]); + if (STARTUP::Core < CORE_HIG) + Music = false; -static void LoadGame (XFILE& file, bool tiny = false) -{ - SAVTAB * st; - SPRITE * spr; - int i; - - for (st = SavTab; st->Ptr; st ++) - { - if (file.Error) - error("Bad SVG"); - file.Read((uint8 *) ((tiny || st->Flg) ? st->Ptr : &i), st->Len); - } - - file.Read((uint8 *) &i, sizeof(i)); - if (i != SVGCHKSUM) - error(Text[BADSVG_TEXT]); - if (STARTUP::Core < CORE_HIG) Music = false; - if (STARTUP::SoundOk == 1 && STARTUP::Mode == 0) { - SNDDrvInfo.VOL2.D = volume[0]; - SNDDrvInfo.VOL2.M = volume[1]; - SNDSetVolume(); - } - - if (! tiny) // load sprites & pocket - { - while (! file.Error) - { - SPRITE S(NULL); - uint16 n = file.Read((uint8 *) &S, sizeof(S)); - - if (n != sizeof(S)) break; - S.Prev = S.Next = NULL; - spr = (scumm_stricmp(S.File+2, "MUCHA") == 0) ? new FLY(NULL) - : new SPRITE(NULL); - if (spr == NULL) - error("No core"); - *spr = S; - VGA::SpareQ.Append(spr); + if (STARTUP::SoundOk == 1 && STARTUP::Mode == 0) { + SNDDrvInfo.VOL2.D = volume[0]; + SNDDrvInfo.VOL2.M = volume[1]; + SNDSetVolume(); } - for (i = 0; i < POCKET_NX; i ++) - { - register int r = pocref[i]; - Pocket[i] = (r < 0) ? NULL : VGA::SpareQ.Locate(r); + if (! tiny) { // load sprites & pocket + while (! file.Error) { + SPRITE S(NULL); + uint16 n = file.Read((uint8 *) &S, sizeof(S)); + + if (n != sizeof(S)) + break; + + S.Prev = S.Next = NULL; + spr = (scumm_stricmp(S.File + 2, "MUCHA") == 0) ? new FLY(NULL) + : new SPRITE(NULL); + if (spr == NULL) + error("No core"); + *spr = S; + VGA::SpareQ.Append(spr); + } + + for (i = 0; i < POCKET_NX; i ++) { + register int r = pocref[i]; + Pocket[i] = (r < 0) ? NULL : VGA::SpareQ.Locate(r); + } } - } } - - -static void SaveSound (void) -{ - CFILE cfg(UsrPath(ProgName(CFG_EXT)), WRI); - if (! cfg.Error) cfg.Write(&SNDDrvInfo,sizeof(SNDDrvInfo)-sizeof(SNDDrvInfo.VOL2)); +static void SaveSound(void) { + CFILE cfg(UsrPath(ProgName(CFG_EXT)), WRI); + if (! cfg.Error) cfg.Write(&SNDDrvInfo, sizeof(SNDDrvInfo) - sizeof(SNDDrvInfo.VOL2)); } +static void SaveGame(XFILE &file) { + SAVTAB *st; + SPRITE *spr; + int i; + for (i = 0; i < POCKET_NX; i ++) { + register SPRITE *s = Pocket[i]; + pocref[i] = (s) ? s->Ref : -1; + } + volume[0] = SNDDrvInfo.VOL2.D; + volume[1] = SNDDrvInfo.VOL2.M; + for (st = SavTab; st->Ptr; st ++) { + if (file.Error) + error("Bad SVG"); + file.Write((uint8 *) st->Ptr, st->Len); + } -static void SaveGame (XFILE& file) -{ - SAVTAB * st; - SPRITE * spr; - int i; - - for (i = 0; i < POCKET_NX; i ++) - { - register SPRITE * s = Pocket[i]; - pocref[i] = (s) ? s->Ref : -1; - } - - volume[0] = SNDDrvInfo.VOL2.D; - volume[1] = SNDDrvInfo.VOL2.M; - - for (st = SavTab; st->Ptr; st ++) - { - if (file.Error) - error("Bad SVG"); - file.Write((uint8 *) st->Ptr, st->Len); - } - - file.Write((uint8 *) &(i = SVGCHKSUM), sizeof(i)); + file.Write((uint8 *) & (i = SVGCHKSUM), sizeof(i)); - for (spr = VGA::SpareQ.First(); spr; spr = spr->Next) - if (spr->Ref >= 1000) - if (!file.Error) file.Write((uint8 *)spr, sizeof(*spr)); + for (spr = VGA::SpareQ.First(); spr; spr = spr->Next) + if (spr->Ref >= 1000) + if (!file.Error) + file.Write((uint8 *)spr, sizeof(*spr)); } - - - - - -static void HeroCover (int cvr) -{ - SNPOST(SNCOVER, 1, cvr, NULL); +static void HeroCover(int cvr) { + SNPOST(SNCOVER, 1, cvr, NULL); } - - -static void Trouble (int seq, int txt) -{ - Hero->Park(); - SNPOST(SNWAIT, -1, -1, Hero); - SNPOST(SNSEQ, -1, seq, Hero); - SNPOST(SNSOUND, -1, 2, Hero); - SNPOST(SNWAIT, -1, -1, Hero); - SNPOST(SNSAY, 1, txt, Hero); +static void Trouble(int seq, int txt) { + Hero->Park(); + SNPOST(SNWAIT, -1, -1, Hero); + SNPOST(SNSEQ, -1, seq, Hero); + SNPOST(SNSOUND, -1, 2, Hero); + SNPOST(SNWAIT, -1, -1, Hero); + SNPOST(SNSAY, 1, txt, Hero); } - -static void OffUse (void) -{ - Trouble(OFF_USE, OFF_USE_TEXT+new_random(OffUseCount)); +static void OffUse(void) { + Trouble(OFF_USE, OFF_USE_TEXT + new_random(OffUseCount)); } - - -static void TooFar (void) -{ - Trouble(TOO_FAR, TOO_FAR_TEXT); +static void TooFar(void) { + Trouble(TOO_FAR, TOO_FAR_TEXT); } - - -static void NoWay (void) -{ - Trouble(NO_WAY, NO_WAY_TEXT); +static void NoWay(void) { + Trouble(NO_WAY, NO_WAY_TEXT); } - - - -static void LoadHeroXY (void) -{ - INI_FILE cf(ProgName(".HXY")); - memset(HeroXY, 0, sizeof(HeroXY)); - if (! cf.Error) cf.CFREAD(&HeroXY); +static void LoadHeroXY(void) { + INI_FILE cf(ProgName(".HXY")); + memset(HeroXY, 0, sizeof(HeroXY)); + if (! cf.Error) + cf.CFREAD(&HeroXY); } - - - -static void LoadMapping (void) -{ - if (Now <= CAVE_MAX) - { - INI_FILE cf(ProgName(".TAB")); - if (! cf.Error) - { - memset(CLUSTER::Map, 0, sizeof(CLUSTER::Map)); - cf.Seek((Now - 1) * sizeof(CLUSTER::Map)); - cf.Read((uint8 *) CLUSTER::Map, sizeof(CLUSTER::Map)); +static void LoadMapping(void) { + if (Now <= CAVE_MAX) { + INI_FILE cf(ProgName(".TAB")); + if (! cf.Error) { + memset(CLUSTER::Map, 0, sizeof(CLUSTER::Map)); + cf.Seek((Now - 1) * sizeof(CLUSTER::Map)); + cf.Read((uint8 *) CLUSTER::Map, sizeof(CLUSTER::Map)); + } } - } } +CLUSTER Trace[MAX_FIND_LEVEL]; +int FindLevel; - - -//-------------------------------------------------------------------------- - -CLUSTER Trace[MAX_FIND_LEVEL]; -int FindLevel; - - - - - - - - -WALK::WALK (BMP_PTR * shpl) -: SPRITE(shpl), Dir(NO_DIR), TracePtr(-1) -{ +WALK::WALK(BMP_PTR *shpl) + : SPRITE(shpl), Dir(NO_DIR), TracePtr(-1) { } +void WALK::Tick(void) { + if (Flags.Hide) + return; + Here = XZ(X + W / 2, Y + H); - -void WALK::Tick (void) -{ - if (Flags.Hide) return; - - Here = XZ(X+W/2, Y+H); - - if (Dir != NO_DIR) - { - SPRITE * spr; - SYSTEM::FunTouch(); - for (spr = VGA::ShowQ.First(); spr; spr = spr->Next) - { - if (Distance(spr) < 2) - { - if (! spr->Flags.Near) - { - FeedSnail(spr, NEAR); - spr->Flags.Near = true; + if (Dir != NO_DIR) { + SPRITE *spr; + SYSTEM::FunTouch(); + for (spr = VGA::ShowQ.First(); spr; spr = spr->Next) { + if (Distance(spr) < 2) { + if (! spr->Flags.Near) { + FeedSnail(spr, NEAR); + spr->Flags.Near = true; + } + } else spr->Flags.Near = false; } - } - else spr->Flags.Near = false; } - } - if (Flags.Hold || TracePtr < 0) Park(); - else - { - if (Here == Trace[TracePtr]) - { - if (-- TracePtr < 0) Park(); + if (Flags.Hold || TracePtr < 0) + Park(); + else { + if (Here == Trace[TracePtr]) { + if (-- TracePtr < 0) + Park(); + } else { + signed char dx, dz; + (Trace[TracePtr] - Here).Split(dx, dz); + DIR d = (dx) ? ((dx > 0) ? EE : WW) : ((dz > 0) ? SS : NN); + Turn(d); + } } - else - { - signed char dx, dz; - (Trace[TracePtr] - Here).Split(dx, dz); - DIR d = (dx) ? ((dx > 0) ? EE : WW) : ((dz > 0) ? SS : NN); - Turn(d); + Step(); + if ((Dir == WW && X <= 0) || + (Dir == EE && X + W >= SCR_WID) || + (Dir == SS && Y + W >= WORLD_HIG - 2)) + Park(); + else { + signed char x; // dummy var + Here.Split(x, Z); // take current Z position + SNPOST_(SNZTRIM, -1, 0, this); // update Hero's pos in show queue } - } - Step(); - if ((Dir == WW && X <= 0) || - (Dir == EE && X + W >= SCR_WID) || - (Dir == SS && Y + W >= WORLD_HIG-2)) Park(); - else - { - signed char x; // dummy var - Here.Split(x, Z); // take current Z position - SNPOST_(SNZTRIM, -1, 0, this); // update Hero's pos in show queue - } } +int WALK::Distance(SPRITE *spr) { + int dx, dz; + dx = spr->X - (X + W - WALKSIDE); + if (dx < 0) + dx = (X + WALKSIDE) - (spr->X + spr->W); + if (dx < 0) + dx = 0; + dx /= MAP_XGRID; + dz = spr->Z - Z; + if (dz < 0) + dz = - dz; + dx = dx * dx + dz * dz; + for (dz = 1; dz * dz < dx; dz ++) + ; -int WALK::Distance (SPRITE * spr) -{ - int dx, dz; - dx = spr->X - (X+W-WALKSIDE); - if (dx < 0) dx = (X+WALKSIDE) - (spr->X+spr->W); - if (dx < 0) dx = 0; - dx /= MAP_XGRID; - dz = spr->Z - Z; - if (dz < 0) dz = - dz; - dx = dx * dx + dz * dz; - for (dz = 1; dz * dz < dx; dz ++) ; - return dz-1; + return dz - 1; } - - - - - - - - -void WALK::Turn (DIR d) -{ - DIR dir = (Dir == NO_DIR) ? SS : Dir; - if (d != Dir) - { - Step((d == dir) ? (1 + dir + dir) : (9 + 4 * dir + d)); - Dir = d; - } +void WALK::Turn(DIR d) { + DIR dir = (Dir == NO_DIR) ? SS : Dir; + if (d != Dir) { + Step((d == dir) ? (1 + dir + dir) : (9 + 4 * dir + d)); + Dir = d; + } } +void WALK::Park(void) { + if (Time == 0) + ++Time; - - -void WALK::Park (void) -{ - if (Time == 0) ++ Time; - if (Dir != NO_DIR) - { - Step(9 + 4 * Dir + Dir); - Dir = NO_DIR; - TracePtr = -1; - } + if (Dir != NO_DIR) { + Step(9 + 4 * Dir + Dir); + Dir = NO_DIR; + TracePtr = -1; + } } - - - - - -void WALK::FindWay (CLUSTER c) -{ +void WALK::FindWay(CLUSTER c) { warning("STUB: Find1Way"); -/* - bool Find1Way(void); - extern uint16 Target; - - if (c != Here) - { - for (FindLevel = 1; FindLevel <= MAX_FIND_LEVEL; FindLevel ++) - { - signed char x, z; - Here.Split(x, z); - Target = (z << 8) | x; - c.Split(x, z); - _CX = (z << 8) | x; - if (Find1Way()) break; + /* + bool Find1Way(void); + extern uint16 Target; + + if (c != Here) { + for (FindLevel = 1; FindLevel <= MAX_FIND_LEVEL; FindLevel ++) { + signed char x, z; + Here.Split(x, z); + Target = (z << 8) | x; + c.Split(x, z); + _CX = (z << 8) | x; + if (Find1Way()) + break; + } + TracePtr = (FindLevel > MAX_FIND_LEVEL) ? -1 : (FindLevel - 1); + if (TracePtr < 0) + NoWay(); + Time = 1; } - TracePtr = (FindLevel > MAX_FIND_LEVEL) ? -1 : (FindLevel - 1); - if (TracePtr < 0) NoWay(); - Time = 1; - } */ } - - - - -void WALK::FindWay (SPRITE * spr) -{ - if (spr && spr != this) - { - int x = spr->X, z = spr->Z; - if (spr->Flags.East) x += spr->W + W/2 - WALKSIDE; - else x -= W/2 - WALKSIDE; - FindWay(CLUSTER((x/MAP_XGRID), - ((z < MAP_ZCNT-MAX_DISTANCE) ? (z+1) - : (z-1)))); - } +void WALK::FindWay(SPRITE *spr) { + if (spr && spr != this) { + int x = spr->X, z = spr->Z; + if (spr->Flags.East) + x += spr->W + W / 2 - WALKSIDE; + else + x -= W / 2 - WALKSIDE; + FindWay(CLUSTER((x / MAP_XGRID), + ((z < MAP_ZCNT - MAX_DISTANCE) ? (z + 1) + : (z - 1)))); + } } - - - - -bool WALK::Lower (SPRITE * spr) -{ - return (spr->Y > Y + (H * 3) / 5); +bool WALK::Lower(SPRITE *spr) { + return (spr->Y > Y + (H * 3) / 5); } - - - - -void WALK::Reach (SPRITE * spr, int mode) -{ - if (spr) - { - Hero->FindWay(spr); - if (mode < 0) - { - mode = spr->Flags.East; - if (Lower(spr)) mode += 2; +void WALK::Reach(SPRITE *spr, int mode) { + if (spr) { + Hero->FindWay(spr); + if (mode < 0) { + mode = spr->Flags.East; + if (Lower(spr)) + mode += 2; + } + } + // note: insert SNAIL commands in reverse order + SNINSERT(SNPAUSE, -1, 64, NULL); + SNINSERT(SNSEQ, -1, TSEQ + mode, this); + if (spr) { + SNINSERT(SNWAIT, -1, -1, Hero); /////--------$$$$$$$ + //SNINSERT(SNWALK, -1, -1, spr); } - } - // note: insert SNAIL commands in reverse order - SNINSERT(SNPAUSE, -1, 64, NULL); - SNINSERT(SNSEQ, -1, TSEQ + mode, this); - if (spr) - { - SNINSERT(SNWAIT, -1, -1, Hero); /////--------$$$$$$$ - //SNINSERT(SNWALK, -1, -1, spr); - } - // sequence is not finished, - // now it is just at sprite appear (disappear) point + // sequence is not finished, + // now it is just at sprite appear (disappear) point } - - - - -//-------------------------------------------------------------------------- - - - #ifdef DEBUG - -class SQUARE : public SPRITE -{ +class SQUARE : public SPRITE { public: - SQUARE (void); - void Touch (uint16 mask, int x, int y); + SQUARE(void); + void Touch(uint16 mask, int x, int y); }; - - - - -SQUARE::SQUARE (void) -: SPRITE(MB) -{ - Flags.Kill = true; - Flags.BDel = false; +SQUARE::SQUARE(void) + : SPRITE(MB) { + Flags.Kill = true; + Flags.BDel = false; } - - - - - - -void SQUARE::Touch (uint16 mask, int x, int y) -{ - SPRITE::Touch(mask, x, y); - if (mask & L_UP) - { - XZ(X+x, Y+y).Cell() = 0; - SNPOST_(SNKILL, -1, 0, this); - } +void SQUARE::Touch(uint16 mask, int x, int y) { + SPRITE::Touch(mask, x, y); + if (mask & L_UP) { + XZ(X + x, Y + y).Cell() = 0; + SNPOST_(SNKILL, -1, 0, this); + } } - - - - -static void SetMapBrick (int x, int z) -{ - SQUARE * s = new SQUARE; - if (s) - { - static char n[] = "00:00"; - s->Goto(x * MAP_XGRID, MAP_TOP + z * MAP_ZGRID); - wtom(x, n+0, 10, 2); - wtom(z, n+3, 10, 2); - CLUSTER::Map[z][x] = 1; - s->SetName(n); - VGA::ShowQ.Insert(s, VGA::ShowQ.First()); - } +static void SetMapBrick(int x, int z) { + SQUARE *s = new SQUARE; + if (s) { + static char n[] = "00:00"; + s->Goto(x * MAP_XGRID, MAP_TOP + z * MAP_ZGRID); + wtom(x, n + 0, 10, 2); + wtom(z, n + 3, 10, 2); + CLUSTER::Map[z][x] = 1; + s->SetName(n); + VGA::ShowQ.Insert(s, VGA::ShowQ.First()); + } } - #endif +void dummy(void) {} +static void SwitchMapping(void); +static void SwitchColorMode(void); +static void StartCountDown(void); +Debug(static void SwitchDebug(void);) +static void SwitchMusic(void); +static void KillSprite(void); +static void PushSprite(void); +static void PullSprite(void); +static void BackPaint(void); +static void NextStep(void); +static void SaveMapping(void); -//-------------------------------------------------------------------------- - -void dummy (void) { } -static void SwitchMapping (void); -static void SwitchColorMode (void); -static void StartCountDown (void); -Debug(static void SwitchDebug (void); ) -static void SwitchMusic (void); -static void KillSprite (void); -static void PushSprite (void); -static void PullSprite (void); -static void BackPaint (void); -static void NextStep (void); -static void SaveMapping (void); - - - WALK * Hero = NULL; -static INFO_LINE InfoLine = INFO_W; - -static HEART Heart; -static SPRITE CavLight = PR; +WALK *Hero = NULL; +static INFO_LINE InfoLine = INFO_W; +static HEART Heart; +static SPRITE CavLight = PR; - - - -static void KeyClick (void) -{ - SNPOST_(SNSOUND, -1, 5, NULL); +static void KeyClick(void) { + SNPOST_(SNSOUND, -1, 5, NULL); } - -static void ResetQSwitch (void) -{ - SNPOST_(SNSEQ, 123, 0, NULL); - KeyClick(); +static void ResetQSwitch(void) { + SNPOST_(SNSEQ, 123, 0, NULL); + KeyClick(); } +static void Quit(void) { + static CHOICE QuitMenu[] = { { NULL, StartCountDown }, + { NULL, ResetQSwitch }, + { NULL, dummy } + }; - -static void Quit (void) -{ - static CHOICE QuitMenu[]={ { NULL, StartCountDown }, - { NULL, ResetQSwitch }, - { NULL, dummy } }; - - if (Snail.Idle() && ! Hero->Flags.Hide) - { - if (VMENU::Addr) - { - SNPOST_(SNKILL, -1, 0, VMENU::Addr); - ResetQSwitch(); - } - else - { - QuitMenu[0].Text = Text[QUIT_TEXT]; - QuitMenu[1].Text = Text[NOQUIT_TEXT]; - (new VMENU(QuitMenu, -1, -1))->SetName(Text[QUIT_TITLE]); - SNPOST_(SNSEQ, 123, 1, NULL); - KeyClick(); + if (Snail.Idle() && ! Hero->Flags.Hide) { + if (VMENU::Addr) { + SNPOST_(SNKILL, -1, 0, VMENU::Addr); + ResetQSwitch(); + } else { + QuitMenu[0].Text = Text[QUIT_TEXT]; + QuitMenu[1].Text = Text[NOQUIT_TEXT]; + (new VMENU(QuitMenu, -1, -1))->SetName(Text[QUIT_TITLE]); + SNPOST_(SNSEQ, 123, 1, NULL); + KeyClick(); + } } - } } - - -static void AltCtrlDel (void) -{ - #if 0 - //def DEBUG - if (KEYBOARD::Key[LSHIFT] || KEYBOARD::Key[RSHIFT]) - { - PostFlag = 0x1234; - POST(); - } - else - #endif - SNPOST_(SNSAY, -1, A_C_D_TEXT, Hero); +static void AltCtrlDel(void) { +#if 0 + //def DEBUG + if (KEYBOARD::Key[LSHIFT] || KEYBOARD::Key[RSHIFT]) { + PostFlag = 0x1234; + POST(); + } else +#endif + SNPOST_(SNSAY, -1, A_C_D_TEXT, Hero); } +static void MiniStep(int stp) { + if (stp < 0) + MiniCave->Flags.Hide = true; + else { + &*Mini; + *MiniShp[0] = *MiniShpList[stp]; + if (Fx.Current) + &*(Fx.Current->EAddr()); - -static void MiniStep (int stp) -{ - if (stp < 0) MiniCave->Flags.Hide = true; - else - { - &*Mini; - *MiniShp[0] = *MiniShpList[stp]; - if (Fx.Current) &*(Fx.Current->EAddr()); - MiniCave->Flags.Hide = false; - } + MiniCave->Flags.Hide = false; + } } - - - -static void PostMiniStep (int stp) -{ - static int recent = -2; - //TODO Change the SNPOST message send to a special way to send function pointer - //if (MiniCave && stp != recent) SNPOST_(SNEXEC, -1, recent = stp, (void *)&MiniStep); - warning("STUB: PostMiniStep()"); +static void PostMiniStep(int stp) { + static int recent = -2; + //TODO Change the SNPOST message send to a special way to send function pointer + //if (MiniCave && stp != recent) SNPOST_(SNEXEC, -1, recent = stp, (void *)&MiniStep); + warning("STUB: PostMiniStep()"); } +int SYSTEM::FunDel = HEROFUN0; -//-------------------------------------------------------------------------- - - - -int SYSTEM::FunDel = HEROFUN0; - - - -void SYSTEM::SetPal (void) -{ - int i; - DAC * p = SysPal + 256-ArrayCount(StdPal); - for (i = 0; i < ArrayCount(StdPal); i ++) - { - p[i].R = StdPal[i].R >> 2; - p[i].G = StdPal[i].G >> 2; - p[i].B = StdPal[i].B >> 2; - } +void SYSTEM::SetPal(void) { + int i; + DAC *p = SysPal + 256 - ArrayCount(StdPal); + for (i = 0; i < ArrayCount(StdPal); i ++) { + p[i].R = StdPal[i].R >> 2; + p[i].G = StdPal[i].G >> 2; + p[i].B = StdPal[i].B >> 2; + } } - - - -void SYSTEM::FunTouch (void) -{ - uint16 n = (PAIN) ? HEROFUN1 : HEROFUN0; - if (Talk == NULL || n > FunDel) FunDel = n; +void SYSTEM::FunTouch(void) { + uint16 n = (PAIN) ? HEROFUN1 : HEROFUN0; + if (Talk == NULL || n > FunDel) + FunDel = n; } - - - - -static void ShowBak (int ref) -{ - SPRITE * spr = VGA::SpareQ.Locate(ref); - if (spr) - { - BITMAP::Pal = SysPal; - spr->Expand(); - BITMAP::Pal = NULL; - spr->Show(2); - VGA::CopyPage(1, 2); - SYSTEM::SetPal(); - spr->Contract(); - } +static void ShowBak(int ref) { + SPRITE *spr = VGA::SpareQ.Locate(ref); + if (spr) { + BITMAP::Pal = SysPal; + spr->Expand(); + BITMAP::Pal = NULL; + spr->Show(2); + VGA::CopyPage(1, 2); + SYSTEM::SetPal(); + spr->Contract(); + } } +static void CaveUp(void) { + int BakRef = 1000 * Now; + if (Music) + LoadMIDI(Now); + + ShowBak(BakRef); + LoadMapping(); + Text.Preload(BakRef, BakRef + 1000); + SPRITE *spr = VGA::SpareQ.First(); + while (spr) { + SPRITE *n = spr->Next; + if (spr->Cave == Now || spr->Cave == 0) + if (spr->Ref != BakRef) { + if (spr->Flags.Back) + spr->BackShow(); + else + ExpandSprite(spr); + } + spr = n; + } + if (SNDDrvInfo.DDEV) { + Sound.Stop(); + Fx.Clear(); + Fx.Preload(0); + Fx.Preload(BakRef); + } + if (Hero) { + Hero->Goto(HeroXY[Now - 1].X, HeroXY[Now - 1].Y); + // following 2 lines trims Hero's Z position! + Hero->Tick(); + Hero->Time = 1; + Hero->Flags.Hide = false; + } + if (! Dark) + Vga.Sunset(); + VGA::CopyPage(0, 1); + SelectPocket(-1); + if (Hero) + VGA::ShowQ.Insert(VGA::ShowQ.Remove(Hero)); -static void CaveUp (void) -{ - int BakRef = 1000 * Now; - if (Music) LoadMIDI(Now); - ShowBak(BakRef); - LoadMapping(); - Text.Preload(BakRef, BakRef+1000); - SPRITE * spr = VGA::SpareQ.First(); - while (spr) - { - SPRITE * n = spr->Next; - if (spr->Cave == Now || spr->Cave == 0) - if (spr->Ref != BakRef) - { - if (spr->Flags.Back) spr->BackShow(); - else ExpandSprite(spr); - } - spr = n; - } - if (SNDDrvInfo.DDEV) - { - Sound.Stop(); - Fx.Clear(); - Fx.Preload(0); - Fx.Preload(BakRef); - } - - if (Hero) - { - Hero->Goto(HeroXY[Now-1].X, HeroXY[Now-1].Y); - // following 2 lines trims Hero's Z position! - Hero->Tick(); - Hero->Time = 1; - Hero->Flags.Hide = false; - } - - if (! Dark) Vga.Sunset(); - VGA::CopyPage(0, 1); - SelectPocket(-1); - if (Hero) VGA::ShowQ.Insert(VGA::ShowQ.Remove(Hero)); - if (Shadow) - { - VGA::ShowQ.Remove(Shadow); - Shadow->MakeXlat(Glass(SysPal, 204, 204, 204)); - VGA::ShowQ.Insert(Shadow, Hero); - Shadow->Z = Hero->Z; - } - FeedSnail(VGA::ShowQ.Locate(BakRef+999), TAKE); - Vga.Show(); - Vga.CopyPage(1, 0); - Vga.Show(); - Vga.Sunrise(SysPal); - Dark = false; - if (! Startup) Mouse.On(); - HEART::Enable = true; -} - - - - - -static void CaveDown (void) -{ - SPRITE * spr; - Debug( if (! HorzLine.Flags.Hide) SwitchMapping(); ) - - for (spr = VGA::ShowQ.First(); spr; ) - { - SPRITE * n = spr->Next; - if (spr->Ref >= 1000 /*&& spr->Cave*/) - { - if (spr->Ref % 1000 == 999) FeedSnail(spr, TAKE); - VGA::SpareQ.Append(VGA::ShowQ.Remove(spr)); + if (Shadow) { + VGA::ShowQ.Remove(Shadow); + Shadow->MakeXlat(Glass(SysPal, 204, 204, 204)); + VGA::ShowQ.Insert(Shadow, Hero); + Shadow->Z = Hero->Z; } - spr = n; - } - Text.Clear(1000); -} + FeedSnail(VGA::ShowQ.Locate(BakRef + 999), TAKE); + Vga.Show(); + Vga.CopyPage(1, 0); + Vga.Show(); + Vga.Sunrise(SysPal); + Dark = false; + if (! Startup) + Mouse.On(); + HEART::Enable = true; +} +static void CaveDown(void) { + SPRITE *spr; + Debug(if (! HorzLine.Flags.Hide) SwitchMapping();) + for (spr = VGA::ShowQ.First(); spr;) { + SPRITE *n = spr->Next; + if (spr->Ref >= 1000 /*&& spr->Cave*/) { + if (spr->Ref % 1000 == 999) + FeedSnail(spr, TAKE); -static void XCave (void) -{ - CaveDown(); - CaveUp(); + VGA::SpareQ.Append(VGA::ShowQ.Remove(spr)); + } + spr = n; + } + Text.Clear(1000); } - - -static void QGame (void) -{ - CaveDown(); - OldLev = Lev; - SaveSound(); - CFILE file = CFILE(UsrPath(UsrFnam), WRI, RCrypt); - SaveGame(file); - Vga.Sunset(); - Finis = true; +static void XCave(void) { + CaveDown(); + CaveUp(); } +static void QGame(void) { + CaveDown(); + OldLev = Lev; + SaveSound(); + CFILE file = CFILE(UsrPath(UsrFnam), WRI, RCrypt); + SaveGame(file); + Vga.Sunset(); + Finis = true; +} -void SwitchCave (int cav) -{ - if (cav != Now) - { - HEART::Enable = false; - if (cav < 0) - { - SNPOST(SNLABEL, -1, 0, NULL); // wait for repaint - //TODO Change the SNPOST message send to a special way to send function pointer - //SNPOST(SNEXEC, -1, 0, (void *)&QGame); // switch cave - warning("SwitchCave() - SNPOST"); - } - else - { - Now = cav; - Mouse.Off(); - if (Hero) - { - Hero->Park(); - Hero->Step(0); - #ifndef DEMO - ///// protection: auto-destruction on! ---------------------- - VGA::SpareQ.Show = STARTUP::Summa * (cav <= CAVE_MAX); - /////-------------------------------------------------------- - #endif - } - CavLight.Goto(CAVE_X + ((Now-1) % CAVE_NX) * CAVE_DX + CAVE_SX, - CAVE_Y + ((Now-1) / CAVE_NX) * CAVE_DY + CAVE_SY); - KillText(); - if (! Startup) KeyClick(); - SNPOST(SNLABEL, -1, 0, NULL); // wait for repaint - //TODO Change the SNPOST message send to a special way to send function pointer - //SNPOST(SNEXEC, 0, 0, (void *)&XCave); // switch cave - warning("SwitchCave() - SNPOST"); +void SwitchCave(int cav) { + if (cav != Now) { + HEART::Enable = false; + if (cav < 0) { + SNPOST(SNLABEL, -1, 0, NULL); // wait for repaint + //TODO Change the SNPOST message send to a special way to send function pointer + //SNPOST(SNEXEC, -1, 0, (void *)&QGame); // switch cave + warning("SwitchCave() - SNPOST"); + } else { + Now = cav; + Mouse.Off(); + if (Hero) { + Hero->Park(); + Hero->Step(0); +#ifndef DEMO + ///// protection: auto-destruction on! ---------------------- + VGA::SpareQ.Show = STARTUP::Summa * (cav <= CAVE_MAX); + /////-------------------------------------------------------- +#endif + } + CavLight.Goto(CAVE_X + ((Now - 1) % CAVE_NX) * CAVE_DX + CAVE_SX, + CAVE_Y + ((Now - 1) / CAVE_NX) * CAVE_DY + CAVE_SY); + KillText(); + if (! Startup) KeyClick(); + SNPOST(SNLABEL, -1, 0, NULL); // wait for repaint + //TODO Change the SNPOST message send to a special way to send function pointer + //SNPOST(SNEXEC, 0, 0, (void *)&XCave); // switch cave + warning("SwitchCave() - SNPOST"); + } } - } } +void SYSTEM::Touch(uint16 mask, int x, int y) { + static int pp = 0; + void SwitchCave(int cav); + int cav = 0; + FunTouch(); + if (mask & KEYB) { + int pp0; + KeyClick(); + KillText(); + if (Startup == 1) { + SNPOST(SNCLEAR, -1, 0, NULL); + return; + } + pp0 = pp; + switch (x) { + case Del: + if (KEYBOARD::Key[ALT] && + KEYBOARD::Key[CTRL]) AltCtrlDel(); + Debug(else KillSprite();) + break; + case 'F': + if (KEYBOARD::Key[ALT]) { + SPRITE *m = VGA::ShowQ.Locate(17001); + if (m) { + m->Step(1); + m->Time = 216; // 3s + } + } + break; +#ifdef DEBUG + case PgUp: + PushSprite(); + break; + case PgDn: + PullSprite(); + break; + case '+': + NextStep(); + break; + case '`': + if (KEYBOARD::Key[ALT]) + SaveMapping(); + else + SwitchMapping(); + break; + case F1: + SwitchDebug(); + break; + case F3: + Hero->Step(TSEQ + 4); + break; + case F4: + Hero->Step(TSEQ + 5); + break; + case F5: + Hero->Step(TSEQ + 0); + break; + case F6: + Hero->Step(TSEQ + 1); + break; + case F7: + Hero->Step(TSEQ + 2); + break; + case F8: + Hero->Step(TSEQ + 3); + break; + case F9: + SYSTEM::FunDel = 1; + break; + case 'X': + if (KEYBOARD::Key[ALT]) + Finis = true; + break; + case '0': + case '1': + case '2': + case '3': + case '4': + if (KEYBOARD::Key[ALT]) { + SNPOST(SNLEVEL, -1, x - '0', NULL); + break; + } + case '5': + case '6': + case '7': + case '8': + case '9': + if (Sprite) + Sprite->Step(x - '0'); + break; +#else + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + SelectPocket(x - '1'); + break; +#endif -void SYSTEM::Touch (uint16 mask, int x, int y) -{ - static int pp = 0; - void SwitchCave (int cav); - int cav = 0; - - FunTouch(); - - if (mask & KEYB) - { - int pp0; - KeyClick(); - KillText(); - if (Startup == 1) - { - SNPOST(SNCLEAR, -1, 0, NULL); - return; - } - pp0 = pp; - switch (x) - { - case Del : if (KEYBOARD::Key[ALT] && - KEYBOARD::Key[CTRL]) AltCtrlDel(); - Debug ( else KillSprite(); ) - break; - case 'F' : if (KEYBOARD::Key[ALT]) - { - SPRITE * m = VGA::ShowQ.Locate(17001); - if (m) - { - m->Step(1); - m->Time = 216; // 3s - } - } - break; - - #ifdef DEBUG - case PgUp : PushSprite(); break; - case PgDn : PullSprite(); break; - case '+' : NextStep(); break; - case '`' : if (KEYBOARD::Key[ALT]) SaveMapping(); else SwitchMapping(); break; - case F1 : SwitchDebug(); break; - case F3 : Hero->Step(TSEQ + 4); break; - case F4 : Hero->Step(TSEQ + 5); break; - case F5 : Hero->Step(TSEQ + 0); break; - case F6 : Hero->Step(TSEQ + 1); break; - case F7 : Hero->Step(TSEQ + 2); break; - case F8 : Hero->Step(TSEQ + 3); break; - case F9 : SYSTEM::FunDel = 1; break; - case 'X' : if (KEYBOARD::Key[ALT]) Finis = true; break; - case '0' : - case '1' : - case '2' : - case '3' : - case '4' : if (KEYBOARD::Key[ALT]) { SNPOST(SNLEVEL, -1, x - '0', NULL); break; } - case '5' : - case '6' : - case '7' : - case '8' : - case '9' : if (Sprite) Sprite->Step(x - '0'); break; - #else - case '1' : - case '2' : - case '3' : - case '4' : - case '5' : - case '6' : - case '7' : - case '8' : SelectPocket(x - '1'); break; - #endif - - case F10 : if (Snail.Idle() && ! Hero->Flags.Hide) + case F10 : + if (Snail.Idle() && ! Hero->Flags.Hide) StartCountDown(); - break; - case 'J' : if (pp == 0) ++ pp; break; - case 'B' : if (pp == 1) ++ pp; break; - case 'W' : if (pp == 2) JBW = !JBW; break; - } - if (pp == pp0) pp = 0; - } - else - { - if (Startup) return; - InfoLine.Update(NULL); - if (y >= WORLD_HIG) - { - if (x < BUTTON_X) // select cave? - { - if (y >= CAVE_Y && y < CAVE_Y + CAVE_NY * CAVE_DY && - x >= CAVE_X && x < CAVE_X + CAVE_NX * CAVE_DX && ! Game) - { - cav = ((y-CAVE_Y) / CAVE_DY) * CAVE_NX + (x-CAVE_X) / CAVE_DX + 1; - if (cav > MaxCave) cav = 0; - } - else - { - cav = 0; + break; + case 'J': + if (pp == 0) + ++pp; + break; + case 'B': + if (pp == 1) + ++pp; + break; + case 'W': + if (pp == 2) + JBW = !JBW; + break; } - } - else if (mask & L_UP) - { - if (y >= POCKET_Y && y < POCKET_Y + POCKET_NY * POCKET_DY && - x >= POCKET_X && x < POCKET_X + POCKET_NX * POCKET_DX) - { - int n = ((y-POCKET_Y) / POCKET_DY) * POCKET_NX + (x-POCKET_X) / POCKET_DX; - SelectPocket(n); + if (pp == pp0) + pp = 0; + } else { + if (Startup) + return; + + InfoLine.Update(NULL); + if (y >= WORLD_HIG) { + if (x < BUTTON_X) { // select cave? + if (y >= CAVE_Y && y < CAVE_Y + CAVE_NY * CAVE_DY && + x >= CAVE_X && x < CAVE_X + CAVE_NX * CAVE_DX && ! Game) { + cav = ((y - CAVE_Y) / CAVE_DY) * CAVE_NX + (x - CAVE_X) / CAVE_DX + 1; + if (cav > MaxCave) + cav = 0; + } else { + cav = 0; + } + } else if (mask & L_UP) { + if (y >= POCKET_Y && y < POCKET_Y + POCKET_NY * POCKET_DY && + x >= POCKET_X && x < POCKET_X + POCKET_NX * POCKET_DX) { + int n = ((y - POCKET_Y) / POCKET_DY) * POCKET_NX + (x - POCKET_X) / POCKET_DX; + SelectPocket(n); + } + } } - } - } - PostMiniStep(cav-1); + PostMiniStep(cav - 1); - if (mask & L_UP) - { - if (cav && Snail.Idle() && Hero->TracePtr < 0) - { - SwitchCave(cav); - } - #ifdef DEBUG - if (! HorzLine.Flags.Hide) - { - if (y >= MAP_TOP && y < MAP_TOP+MAP_HIG) - { - signed char x1, z1; - XZ(x, y).Split(x1, z1); - CLUSTER::Map[z1][x1] = 1; - SetMapBrick(x1, z1); - } - } - else - #endif - { - if (! Talk && Snail.Idle() && Hero - && y >= MAP_TOP && y < MAP_TOP+MAP_HIG && ! Game) - { - Hero->FindWay(XZ(x, y)); + if (mask & L_UP) { + if (cav && Snail.Idle() && Hero->TracePtr < 0) + SwitchCave(cav); + +#ifdef DEBUG + if (!HorzLine.Flags.Hide) { + if (y >= MAP_TOP && y < MAP_TOP + MAP_HIG) { + signed char x1, z1; + XZ(x, y).Split(x1, z1); + CLUSTER::Map[z1][x1] = 1; + SetMapBrick(x1, z1); + } + } else +#endif + { + if (! Talk && Snail.Idle() && Hero + && y >= MAP_TOP && y < MAP_TOP + MAP_HIG && ! Game) { + Hero->FindWay(XZ(x, y)); + } + } } - } } - } } - - - - - -void SYSTEM::Tick (void) -{ - if (! Startup) if (-- FunDel == 0) - { - KillText(); - if (Snail.Idle()) - { - if (PAIN) HeroCover(9); - else if (STARTUP::Core >= CORE_MID) - { - int n = new_random(100); - if (n > 96) HeroCover(6+(Hero->X+Hero->W/2 < SCR_WID/2)); - else - { - if (n > 90) HeroCover(5); - else - { - if (n > 60) HeroCover(4); - else HeroCover(3); - } +void SYSTEM::Tick(void) { + if (! Startup) if (-- FunDel == 0) { + KillText(); + if (Snail.Idle()) { + if (PAIN) + HeroCover(9); + else if (STARTUP::Core >= CORE_MID) { + int n = new_random(100); + if (n > 96) + HeroCover(6 + (Hero->X + Hero->W / 2 < SCR_WID / 2)); + else { + if (n > 90) + HeroCover(5); + else { + if (n > 60) + HeroCover(4); + else + HeroCover(3); + } + } + } + } + FunTouch(); } - } - } - FunTouch(); - } - Time = SYSTIMERATE; + Time = SYSTIMERATE; } - - - - - - - - -//-------------------------------------------------------------------------- - - - /* -static void SpkOpen (void) -{ - asm in al,0x61 - asm or al,0x03 - asm out 0x61,al - asm mov al,0x90 - asm out 0x43,al +static void SpkOpen(void) { + asm in al,0x61 + asm or al,0x03 + asm out 0x61,al + asm mov al,0x90 + asm out 0x43,al } - - - -static void SpkClose (void) -{ - asm in al,0x61 - asm and al,0xFC - asm out 0x61,al +static void SpkClose(void) { + asm in al,0x61 + asm and al,0xFC + asm out 0x61,al } */ - -static void SwitchColorMode (void) -{ - SNPOST_(SNSEQ, 121, VGA::Mono = ! VGA::Mono, NULL); - KeyClick(); - VGA::SetColors(SysPal, 64); +static void SwitchColorMode(void) { + SNPOST_(SNSEQ, 121, VGA::Mono = ! VGA::Mono, NULL); + KeyClick(); + VGA::SetColors(SysPal, 64); } -static void SwitchMusic (void) -{ - if (KEYBOARD::Key[ALT]) - { - if (VMENU::Addr) SNPOST_(SNKILL, -1, 0, VMENU::Addr); - else - { - SNPOST_(SNSEQ, 122, (Music = false), NULL); - //TODO Change the SNPOST message send to a special way to send function pointer - // SNPOST(SNEXEC, -1, 0, (void *)&SelectSound); - warning("SwitchMusic() - SNPOST"); - } - } - else - { - if (STARTUP::Core < CORE_HIG) SNPOST(SNINF, -1, NOMUSIC_TEXT, NULL); - else - { - SNPOST_(SNSEQ, 122, (Music = ! Music), NULL); - KeyClick(); +static void SwitchMusic(void) { + if (KEYBOARD::Key[ALT]) { + if (VMENU::Addr) + SNPOST_(SNKILL, -1, 0, VMENU::Addr); + else { + SNPOST_(SNSEQ, 122, (Music = false), NULL); + //TODO Change the SNPOST message send to a special way to send function pointer + // SNPOST(SNEXEC, -1, 0, (void *)&SelectSound); + warning("SwitchMusic() - SNPOST"); + } + } else { + if (STARTUP::Core < CORE_HIG) + SNPOST(SNINF, -1, NOMUSIC_TEXT, NULL); + else { + SNPOST_(SNSEQ, 122, (Music = ! Music), NULL); + KeyClick(); + } } - } - if (Music) LoadMIDI(Now); - else KillMIDI(); + if (Music) + LoadMIDI(Now); + else + KillMIDI(); } - - - -static void StartCountDown (void) -{ - //SNPOST(SNSEQ, 123, 0, NULL); - SwitchCave(-1); +static void StartCountDown(void) { + //SNPOST(SNSEQ, 123, 0, NULL); + SwitchCave(-1); } - - -#ifndef DEMO -static void TakeName (void) -{ - if (GET_TEXT::Ptr) SNPOST_(SNKILL, -1, 0, GET_TEXT::Ptr); - else - { - GET_TEXT * tn = new GET_TEXT(Text[GETNAME_PROMPT], UsrFnam, 8, KeyClick); - if (tn) - { - tn->SetName(Text[GETNAME_TITLE]); - tn->Center(); - tn->Goto(tn->X, tn->Y - 10); - tn->Z = 126; - VGA::ShowQ.Insert(tn); +#ifndef DEMO +static void TakeName(void) { + if (GET_TEXT::Ptr) + SNPOST_(SNKILL, -1, 0, GET_TEXT::Ptr); + else { + GET_TEXT *tn = new GET_TEXT(Text[GETNAME_PROMPT], UsrFnam, 8, KeyClick); + if (tn) { + tn->SetName(Text[GETNAME_TITLE]); + tn->Center(); + tn->Goto(tn->X, tn->Y - 10); + tn->Z = 126; + VGA::ShowQ.Insert(tn); + } } - } } #endif - - - #ifdef DEBUG - - -static void SwitchMapping (void) -{ - if (HorzLine.Flags.Hide) - { - int i; - for (i = 0; i < MAP_ZCNT; i ++) - { - int j; - for (j = 0; j < MAP_XCNT; j ++) - { - if (CLUSTER::Map[i][j]) - SetMapBrick(j, i); - } +static void SwitchMapping(void) { + if (HorzLine.Flags.Hide) { + int i; + for (i = 0; i < MAP_ZCNT; i ++) { + int j; + for (j = 0; j < MAP_XCNT; j ++) { + if (CLUSTER::Map[i][j]) + SetMapBrick(j, i); + } + } + } else { + SPRITE *s; + for (s = VGA::ShowQ.First(); s; s = s->Next) + if (s->W == MAP_XGRID && s->H == MAP_ZGRID) + SNPOST_(SNKILL, -1, 0, s); } - } - else - { - SPRITE * s; - for (s = VGA::ShowQ.First(); s; s = s->Next) - if (s->W == MAP_XGRID && s->H == MAP_ZGRID) - SNPOST_(SNKILL, -1, 0, s); - } - HorzLine.Flags.Hide = ! HorzLine.Flags.Hide; + HorzLine.Flags.Hide = ! HorzLine.Flags.Hide; } - - - -static void KillSprite (void) -{ - Sprite->Flags.Kill = true; - Sprite->Flags.BDel = true; - SNPOST_(SNKILL, -1, 0, Sprite); - Sprite = NULL; +static void KillSprite(void) { + Sprite->Flags.Kill = true; + Sprite->Flags.BDel = true; + SNPOST_(SNKILL, -1, 0, Sprite); + Sprite = NULL; } - - - -static void PushSprite (void) -{ - SPRITE * spr = Sprite->Prev; - if (spr) - { - VGA::ShowQ.Insert(VGA::ShowQ.Remove(Sprite), spr); - while (Sprite->Z > Sprite->Next->Z) -- Sprite->Z; - } - else SNPOST_(SNSOUND, -1, 2, NULL); +static void PushSprite(void) { + SPRITE *spr = Sprite->Prev; + if (spr) { + VGA::ShowQ.Insert(VGA::ShowQ.Remove(Sprite), spr); + while (Sprite->Z > Sprite->Next->Z) + --Sprite->Z; + } else + SNPOST_(SNSOUND, -1, 2, NULL); } - - - -static void PullSprite (void) -{ - bool ok = false; - SPRITE * spr = Sprite->Next; - if (spr) - { - spr = spr->Next; - if (spr) - { - ok = (! spr->Flags.Slav); +static void PullSprite(void) { + bool ok = false; + SPRITE *spr = Sprite->Next; + if (spr) { + spr = spr->Next; + if (spr) + ok = (!spr->Flags.Slav); } - } - if (ok) - { - VGA::ShowQ.Insert(VGA::ShowQ.Remove(Sprite), spr); - if (Sprite->Prev) - while (Sprite->Z < Sprite->Prev->Z) ++ Sprite->Z; - } - else SNPOST_(SNSOUND, -1, 2, NULL); + if (ok) { + VGA::ShowQ.Insert(VGA::ShowQ.Remove(Sprite), spr); + if (Sprite->Prev) + while (Sprite->Z < Sprite->Prev->Z) + ++Sprite->Z; + } else + SNPOST_(SNSOUND, -1, 2, NULL); } - - - - -static void NextStep (void) -{ - SNPOST_(SNSTEP, 0, 0, Sprite); +static void NextStep(void) { + SNPOST_(SNSTEP, 0, 0, Sprite); } - - - - - - - -static void SaveMapping (void) -{ - { - IOHAND cf(ProgName(".TAB"), UPD); - if (! cf.Error) - { - cf.Seek((Now-1) * sizeof(CLUSTER::Map)); - cf.Write((uint8 *) CLUSTER::Map, sizeof(CLUSTER::Map)); - } - } - { - IOHAND cf(ProgName(".HXY"), WRI); - if (! cf.Error) - { - HeroXY[Now-1].X = Hero->X; - HeroXY[Now-1].Y = Hero->Y; - cf.Write((uint8 *) HeroXY, sizeof(HeroXY)); - } - } +static void SaveMapping(void) { + { + IOHAND cf(ProgName(".TAB"), UPD); + if (!cf.Error) { + cf.Seek((Now - 1) * sizeof(CLUSTER::Map)); + cf.Write((uint8 *) CLUSTER::Map, sizeof(CLUSTER::Map)); + } + } + { + IOHAND cf(ProgName(".HXY"), WRI); + if (!cf.Error) { + HeroXY[Now - 1].X = Hero->X; + HeroXY[Now - 1].Y = Hero->Y; + cf.Write((uint8 *) HeroXY, sizeof(HeroXY)); + } + } } #endif - -//-------------------------------------------------------------------------- - - - - - - - - - -#ifdef DEBUG - - - - // 1111111111222222222233333333 334444444444555555555566666666667777777777 - // 01234567890123456789012345678901234567 890123456789012345678901234567890123456789 -static char DebugText[] = " N=00000 F=000000 X=000 Y=000 FPS=0000\0S=00:00 000:000:000 000:000 00 "; - -#define NFRE (DebugText + 3) -#define FFRE (DebugText + 11) -#define ABSX (DebugText + 20) -#define ABSY (DebugText + 26) -#define FRPS (DebugText + 34) -#define XSPR (DebugText + 38) -#define SP_N (DebugText + 41) -#define SP_S (DebugText + 44) - -#define SP_X (DebugText + 47) -#define SP_Y (DebugText + 51) -#define SP_Z (DebugText + 55) -#define SP_W (DebugText + 59) -#define SP_H (DebugText + 63) -#define SP_F (DebugText + 67) +#ifdef DEBUG +// 1111111111222222222233333333 334444444444555555555566666666667777777777 +// 01234567890123456789012345678901234567 890123456789012345678901234567890123456789 +static char DebugText[] = " N=00000 F=000000 X=000 Y=000 FPS=0000\0S=00:00 000:000:000 000:000 00 "; + +#define NFRE (DebugText + 3) +#define FFRE (DebugText + 11) +#define ABSX (DebugText + 20) +#define ABSY (DebugText + 26) +#define FRPS (DebugText + 34) +#define XSPR (DebugText + 38) +#define SP_N (DebugText + 41) +#define SP_S (DebugText + 44) + +#define SP_X (DebugText + 47) +#define SP_Y (DebugText + 51) +#define SP_Z (DebugText + 55) +#define SP_W (DebugText + 59) +#define SP_H (DebugText + 63) +#define SP_F (DebugText + 67) #define SP__ (DebugText + 70) -INFO_LINE DebugLine(SCR_WID); - -static void SayDebug (void) -{ - if (! DebugLine.Flags.Hide) - { - static long t = -1L; - long t1 = Timer(); +INFO_LINE DebugLine(SCR_WID); - if (t1 - t >= 18) - { - static uint32 old = 0L; - uint32 now = Vga.FrmCnt; - dwtom(now - old, FRPS, 10, 4); - old = now; - t = t1; - } +static void SayDebug(void) { + if (!DebugLine.Flags.Hide) { + static long t = -1L; + long t1 = Timer(); - dwtom(Mouse.X, ABSX, 10, 3); - dwtom(Mouse.Y, ABSY, 10, 3); - dwtom(coreleft(), NFRE, 10, 5); - dwtom(farcoreleft(), FFRE, 10, 6); + if (t1 - t >= 18) { + static uint32 old = 0L; + uint32 now = Vga.FrmCnt; + dwtom(now - old, FRPS, 10, 4); + old = now; + t = t1; + } - // sprite queue size - uint16 n = 0; - SPRITE * spr; - for (spr = VGA::ShowQ.First(); spr; spr = spr->Next) - { - ++ n; - if (spr == Sprite) - { - *XSPR = ' '; - dwtom(n, SP_N, 10, 2); - dwtom(Sprite->X, SP_X, 10, 3); - dwtom(Sprite->Y, SP_Y, 10, 3); - dwtom(Sprite->Z, SP_Z, 10, 3); - dwtom(Sprite->W, SP_W, 10, 3); - dwtom(Sprite->H, SP_H, 10, 3); - dwtom(*(uint16 *) (&Sprite->Flags), SP_F, 16, 2); - } + dwtom(Mouse.X, ABSX, 10, 3); + dwtom(Mouse.Y, ABSY, 10, 3); +// dwtom(coreleft(), NFRE, 10, 5); +// dwtom(farcoreleft(), FFRE, 10, 6); + + // sprite queue size + uint16 n = 0; + SPRITE *spr; + for (spr = VGA::ShowQ.First(); spr; spr = spr->Next) { + ++ n; + if (spr == Sprite) { + *XSPR = ' '; + dwtom(n, SP_N, 10, 2); + dwtom(Sprite->X, SP_X, 10, 3); + dwtom(Sprite->Y, SP_Y, 10, 3); + dwtom(Sprite->Z, SP_Z, 10, 3); + dwtom(Sprite->W, SP_W, 10, 3); + dwtom(Sprite->H, SP_H, 10, 3); + dwtom(*(uint16 *)(&Sprite->Flags), SP_F, 16, 2); + } + } + dwtom(n, SP_S, 10, 2); +// *SP__ = (heapcheck() < 0) ? '!' : ' '; + DebugLine.Update(DebugText); } - dwtom(n, SP_S, 10, 2); - *SP__ = (heapcheck() < 0) ? '!' : ' '; - DebugLine.Update(DebugText); - } } - - - -static void SwitchDebug (void) -{ - DebugLine.Flags.Hide = ! DebugLine.Flags.Hide; +static void SwitchDebug(void) { + DebugLine.Flags.Hide = ! DebugLine.Flags.Hide; } - - #endif - - - - -static void OptionTouch (int opt, uint16 mask) -{ - switch (opt) - { - case 1 : if (mask & L_UP) SwitchColorMode(); break; - case 2 : if (mask & L_UP) SwitchMusic(); - else - if (mask & R_UP) - if (! MIXER::Appear) - { - MIXER::Appear = true; - new MIXER(BUTTON_X, BUTTON_Y); - } - break; - case 3 : if (mask & L_UP) Quit(); break; - } +static void OptionTouch(int opt, uint16 mask) { + switch (opt) { + case 1 : + if (mask & L_UP) + SwitchColorMode(); + break; + case 2 : + if (mask & L_UP) + SwitchMusic(); + else if (mask & R_UP) + if (! MIXER::Appear) { + MIXER::Appear = true; + new MIXER(BUTTON_X, BUTTON_Y); + } + break; + case 3 : + if (mask & L_UP) + Quit(); + break; + } } - - - #pragma argsused -void SPRITE::Touch (uint16 mask, int x, int y) -{ - SYSTEM::FunTouch(); - if ((mask & ATTN) == 0) - { - InfoLine.Update(Name()); - if (mask & (R_DN | L_DN)) Sprite = this; // DEBUG mode only? - if (Ref/10 == 12) - { - OptionTouch(Ref % 10, mask); - return; - } - if (Flags.Syst) return; // cannot access system sprites - if (Game) if (mask & L_UP) { mask &= ~L_UP; mask |= R_UP; } - if ((mask & R_UP) && Snail.Idle()) - { - SPRITE * ps = (PocLight.SeqPtr) ? Pocket[PocPtr] : NULL; - if (ps) - { - if (Flags.Kept || Hero->Distance(this) < MAX_DISTANCE) - { - if (Works(ps)) - { - FeedSnail(ps, TAKE); - } - else OffUse(); - SelectPocket(-1); +void SPRITE::Touch(uint16 mask, int x, int y) { + SYSTEM::FunTouch(); + if ((mask & ATTN) == 0) { + InfoLine.Update(Name()); + if (mask & (R_DN | L_DN)) + Sprite = this; // DEBUG mode only? + if (Ref / 10 == 12) { + OptionTouch(Ref % 10, mask); + return; } - else TooFar(); - } - else - { - if (Flags.Kept) mask |= L_UP; - else - { - if (Hero->Distance(this) < MAX_DISTANCE) - {/// - if (Flags.Port) - { - if (FindPocket(NULL) < 0) PocFul(); - else - { - SNPOST(SNREACH, -1, -1, this); - SNPOST(SNKEEP, -1, -1, this); - Flags.Port = false; - } + if (Flags.Syst) + return; // cannot access system sprites + if (Game) if (mask & L_UP) { + mask &= ~L_UP; + mask |= R_UP; } - else - { - if (TakePtr != NO_PTR) - { - if (SnList(TAKE)[TakePtr].Com == SNNEXT) OffUse(); - else FeedSnail(this, TAKE); - } - else OffUse(); + if ((mask & R_UP) && Snail.Idle()) { + SPRITE *ps = (PocLight.SeqPtr) ? Pocket[PocPtr] : NULL; + if (ps) { + if (Flags.Kept || Hero->Distance(this) < MAX_DISTANCE) { + if (Works(ps)) { + FeedSnail(ps, TAKE); + } else + OffUse(); + SelectPocket(-1); + } else + TooFar(); + } else { + if (Flags.Kept) + mask |= L_UP; + else { + if (Hero->Distance(this) < MAX_DISTANCE) { + /// + if (Flags.Port) { + if (FindPocket(NULL) < 0) + PocFul(); + else { + SNPOST(SNREACH, -1, -1, this); + SNPOST(SNKEEP, -1, -1, this); + Flags.Port = false; + } + } else { + if (TakePtr != NO_PTR) { + if (SnList(TAKE)[TakePtr].Com == SNNEXT) + OffUse(); + else + FeedSnail(this, TAKE); + } else + OffUse(); + } + }/// + else + TooFar(); + } } - }/// - else TooFar(); } - } - } - if ((mask & L_UP) && Snail.Idle()) - { - if (Flags.Kept) - { - int n; - for (n = 0; n < POCKET_NX; n ++) - { - if (Pocket[n] == this) - { - SelectPocket(n); - break; - } + if ((mask & L_UP) && Snail.Idle()) { + if (Flags.Kept) { + int n; + for (n = 0; n < POCKET_NX; n ++) { + if (Pocket[n] == this) { + SelectPocket(n); + break; + } + } + } else + SNPOST(SNWALK, -1, -1, this); // Hero->FindWay(this); } - } - else SNPOST(SNWALK, -1, -1, this); // Hero->FindWay(this); } - } } - - - - - -//-------------------------------------------------------------------------- -//-------------------------------------------------------------------------- - - - - - - -static void LoadSprite (const char *fname, int ref, int cav, int col = 0, int row = 0, int pos = 0) -{ - static const char * Comd[] = { "Name", "Type", "Phase", "East", - "Left", "Right", "Top", "Bottom", - "Seq", "Near", "Take", - "Portable", "Transparent", - NULL }; - static const char * Type[] = { "DEAD", "AUTO", "WALK", "NEWTON", "LISSAJOUS", - "FLY", NULL }; - char line[LINE_MAX]; - - int shpcnt = 0; - int type = 0; // DEAD - bool east = false; - bool port = false; - bool tran = false; - int i, lcnt = 0; - uint16 len; - - MergeExt(line, fname, SPR_EXT); - if (INI_FILE::Exist(line)) // sprite description file exist - { - INI_FILE sprf(line); - if (sprf.Error) { - error("Bad SPR [%s]", line); +static void LoadSprite(const char *fname, int ref, int cav, int col = 0, int row = 0, int pos = 0) { + static const char *Comd[] = { "Name", "Type", "Phase", "East", + "Left", "Right", "Top", "Bottom", + "Seq", "Near", "Take", + "Portable", "Transparent", + NULL + }; + static const char *Type[] = { "DEAD", "AUTO", "WALK", "NEWTON", "LISSAJOUS", + "FLY", NULL + }; + char line[LINE_MAX]; + + int shpcnt = 0; + int type = 0; // DEAD + bool east = false; + bool port = false; + bool tran = false; + int i, lcnt = 0; + uint16 len; + + MergeExt(line, fname, SPR_EXT); + if (INI_FILE::Exist(line)) { // sprite description file exist + INI_FILE sprf(line); + if (sprf.Error) + error("Bad SPR [%s]", line); + + while ((len = sprf.Read((uint8 *)line)) != 0) { + ++ lcnt; + if (len && line[len - 1] == '\n') + line[-- len] = '\0'; + if (len == 0 || *line == '.') + continue; + + if ((i = TakeEnum(Comd, strtok(line, " =\t"))) < 0) + error("%s [%s]", NumStr("Bad line ######", lcnt), fname); + + + switch (i) { + case 0 : // Name - will be taken in Expand routine + break; + case 1 : // Type + if ((type = TakeEnum(Type, strtok(NULL, " \t,;/"))) < 0) + error("%s [%s]", NumStr("Bad line ######", lcnt), fname); + break; + case 2 : // Phase + ++ shpcnt; + break; + case 3 : // East + east = (atoi(strtok(NULL, " \t,;/")) != 0); + break; + case 11 : // Portable + port = (atoi(strtok(NULL, " \t,;/")) != 0); + break; + case 12 : // Transparent + tran = (atoi(strtok(NULL, " \t,;/")) != 0); + break; + } + } + if (! shpcnt) + error("No shapes [%s]", fname); + } else { // no sprite description: mono-shaped sprite with only .BMP file + ++shpcnt; } - while ((len = sprf.Read((uint8*)line)) != 0) - { - ++ lcnt; - if (len && line[len-1] == '\n') line[-- len] = '\0'; - if (len == 0 || *line == '.') continue; - - if ((i = TakeEnum(Comd, strtok(line, " =\t"))) < 0) { - error("%s [%s]", NumStr("Bad line ######", lcnt), fname); - } - - switch (i) - { - case 0 : // Name - will be taken in Expand routine - break; - case 1 : // Type - if ((type = TakeEnum(Type, strtok(NULL, " \t,;/"))) < 0) - error("%s [%s]", NumStr("Bad line ######", lcnt), fname); - break; - case 2 : // Phase - ++ shpcnt; - break; - case 3 : // East - east = (atoi(strtok(NULL, " \t,;/")) != 0); - break; - case 11 : // Portable - port = (atoi(strtok(NULL, " \t,;/")) != 0); - break; - case 12 : // Transparent - tran = (atoi(strtok(NULL, " \t,;/")) != 0); - break; - } + // make sprite of choosen type + switch (type) { + case 1 : { // AUTO + Sprite = new SPRITE(NULL); + if (Sprite) { + Sprite->Goto(col, row); + //Sprite->Time = 1;//-----------$$$$$$$$$$$$$$$$ + } + break; } - if (! shpcnt) - error("No shapes [%s]", fname); - } - else // no sprite description: mono-shaped sprite with only .BMP file - { - ++ shpcnt; - } - - // make sprite of choosen type - switch (type) - { - case 1 : // AUTO - { - Sprite = new SPRITE(NULL); - if (Sprite) - { - Sprite->Goto(col, row); - //Sprite->Time = 1;//-----------$$$$$$$$$$$$$$$$ - } - break; - } - case 2 : // WALK - { - WALK * w = new WALK(NULL); - if (w && ref == 1) - { - w->Goto(col, row); - if (Hero) - error("2nd HERO [%s]", fname); - Hero = w; - } - Sprite = w; - break; - } - /* - case 3 : // NEWTON - NEWTON * n = new NEWTON(NULL); - if (n) - { - n->Ay = (bottom-n->H); - n->By = 90; - n->Cy = 3; - n->Bx = 99; - n->Cx = 3; - n->Goto(col, row); - } - Sprite = n; - break; - */ - case 4 : // LISSAJOUS - { - error("Bad type [%s]", fname); - /* - LISSAJOUS * l = new LISSAJOUS(NULL); - if (l) - { + case 2 : { // WALK + WALK *w = new WALK(NULL); + if (w && ref == 1) { + w->Goto(col, row); + if (Hero) + error("2nd HERO [%s]", fname); + Hero = w; + } + Sprite = w; + break; + } + /* + case 3 : // NEWTON + NEWTON * n = new NEWTON(NULL); + if (n) + { + n->Ay = (bottom-n->H); + n->By = 90; + n->Cy = 3; + n->Bx = 99; + n->Cx = 3; + n->Goto(col, row); + } + Sprite = n; + break; + */ + case 4 : { // LISSAJOUS + error("Bad type [%s]", fname); + /* + LISSAJOUS * l = new LISSAJOUS(NULL); + if (l) + { l->Ax = SCR_WID/2; l->Ay = SCR_HIG/2; l->Bx = 7; @@ -1804,448 +1487,416 @@ static void LoadSprite (const char *fname, int ref, int cav, int col = 0, int ro * (long *) &l->Dx = 0; // movex * cnt l->Goto(col, row); } - Sprite = l; - */ - break; - } - case 5 : // FLY - { - FLY * f = new FLY(NULL); - Sprite = f; - //////Sprite->Time = 1;//-----------$$$$$$$$$$$$$$ - break; - } - default: // DEAD - { - Sprite = new SPRITE(NULL); - if (Sprite) Sprite->Goto(col, row); - break; - } - } - if (Sprite) - { - Sprite->Ref = ref; - Sprite->Cave = cav; - Sprite->Z = pos; - Sprite->Flags.East = east; - Sprite->Flags.Port = port; - Sprite->Flags.Tran = tran; - Sprite->Flags.Kill = true; - Sprite->Flags.BDel = true; - //fnsplit(fname, NULL, NULL, Sprite->File, NULL); - warning("LoadSprite: use of fnsplit"); - - Sprite->ShpCnt = shpcnt; - VGA::SpareQ.Append(Sprite); - } -} - - - - - - -static void LoadScript (const char *fname) -{ - char line[LINE_MAX]; - char * SpN; - int SpI, SpA, SpX, SpY, SpZ; - bool BkG = false; - INI_FILE scrf(fname); - int lcnt = 0; - bool ok = true; - - if (scrf.Error) return; - - while (scrf.Read((uint8*)line) != 0) - { - char *p; - - ++ lcnt; - if (*line == 0 || *line == '\n' || *line == '.') continue; - - ok = false; // not OK if break - // sprite ident number - if ((p = strtok(line, " \t\n")) == NULL) break; - SpI = atoi(p); - // sprite file name - if ((SpN = strtok(NULL, " ,;/\t\n")) == NULL) break; - // sprite cave - if ((p = strtok(NULL, " ,;/\t\n")) == NULL) break; - SpA = atoi(p); - // sprite column - if ((p = strtok(NULL, " ,;/\t\n")) == NULL) break; - SpX = atoi(p); - // sprite row - if ((p = strtok(NULL, " ,;/\t\n")) == NULL) break; - SpY = atoi(p); - // sprite Z pos - if ((p = strtok(NULL, " ,;/\t\n")) == NULL) break; - SpZ = atoi(p); - // sprite life - if ((p = strtok(NULL, " ,;/\t\n")) == NULL) break; - BkG = atoi(p) == 0; - - ok = true; // no break: OK - - Sprite = NULL; - LoadSprite(SpN, SpI, SpA, SpX, SpY, SpZ); - if (Sprite && BkG) Sprite->Flags.Back = true; - } - if (! ok) - error("%s [%s]", NumStr("Bad INI line ######", lcnt), fname); -} - - - - -static void MainLoop (void) -{ -#if 0 -//def DEBUG - static VgaRegBlk Mode[] = { + Sprite = l; + */ + break; + } + case 5 : { // FLY + FLY *f = new FLY(NULL); + Sprite = f; + //////Sprite->Time = 1;//-----------$$$$$$$$$$$$$$ + break; + } + default: { // DEAD + Sprite = new SPRITE(NULL); + if (Sprite) + Sprite->Goto(col, row); + break; + } + } + if (Sprite) { + Sprite->Ref = ref; + Sprite->Cave = cav; + Sprite->Z = pos; + Sprite->Flags.East = east; + Sprite->Flags.Port = port; + Sprite->Flags.Tran = tran; + Sprite->Flags.Kill = true; + Sprite->Flags.BDel = true; + //fnsplit(fname, NULL, NULL, Sprite->File, NULL); + warning("LoadSprite: use of fnsplit"); + + Sprite->ShpCnt = shpcnt; + VGA::SpareQ.Append(Sprite); + } +} - { 0x04, VGASEQ, 0x08, 0x04 }, // memory mode - { 0x03, VGAGRA, 0xFF, 0x00 }, // data rotate = 0 - { 0x05, VGAGRA, 0x03, 0x00 }, // R/W mode = 0 - { 0x06, VGAGRA, 0x02, 0x00 }, // misc +static void LoadScript(const char *fname) { + char line[LINE_MAX]; + char *SpN; + int SpI, SpA, SpX, SpY, SpZ; + bool BkG = false; + INI_FILE scrf(fname); + int lcnt = 0; + bool ok = true; - { 0x14, VGACRT, 0x40, 0x00 }, // underline - { 0x13, VGACRT, 0xFF, 0x28 }, // screen width - { 0x17, VGACRT, 0xFF, 0xC3 }, // mode control + if (scrf.Error) + return; - { 0x11, VGACRT, 0x80, 0x00 }, // vert retrace end - { 0x09, VGACRT, 0xEF, 0x01 }, // max scan line + while (scrf.Read((uint8 *)line) != 0) { + char *p; - { 0x30, VGAATR, 0x00, 0x20 }, // 256 color mode + ++lcnt; + if (*line == 0 || *line == '\n' || *line == '.') + continue; -// { 0x12, VGACRT, 0xFF, 0x6E }, // vert display end -// { 0x15, VGACRT, 0xFF, 0x7F }, // start vb -// { 0x10, VGACRT, 0xFF, 0x94 }, // start vr + ok = false; // not OK if break + // sprite ident number + if ((p = strtok(line, " \t\n")) == NULL) + break; + SpI = atoi(p); + // sprite file name + if ((SpN = strtok(NULL, " ,;/\t\n")) == NULL) + break; + // sprite cave + if ((p = strtok(NULL, " ,;/\t\n")) == NULL) + break; + SpA = atoi(p); + // sprite column + if ((p = strtok(NULL, " ,;/\t\n")) == NULL) + break; + SpX = atoi(p); + // sprite row + if ((p = strtok(NULL, " ,;/\t\n")) == NULL) + break; + SpY = atoi(p); + // sprite Z pos + if ((p = strtok(NULL, " ,;/\t\n")) == NULL) + break; + SpZ = atoi(p); + // sprite life + if ((p = strtok(NULL, " ,;/\t\n")) == NULL) + break; + BkG = atoi(p) == 0; - { 0x00 } }; + ok = true; // no break: OK - Vga.Setup(Mode); -#endif + Sprite = NULL; + LoadSprite(SpN, SpI, SpA, SpX, SpY, SpZ); + if (Sprite && BkG) + Sprite->Flags.Back = true; + } + if (! ok) + error("%s [%s]", NumStr("Bad INI line ######", lcnt), fname); +} - Debug( SayDebug(); ) - #ifdef DEMO - #define TIM ((182L*6L) * 5L) - static uint32 tc = 0; - if (TimerCount - tc >= TIM && Talk == NULL && Snail.Idle()) - { - if (Text[DemoText]) - { - SNPOST(SNSOUND, -1, 4, NULL); // drumla - SNPOST(SNINF, -1, DemoText, NULL); - SNPOST(SNLABEL, -1, -1, NULL); - if (Text[++ DemoText] == NULL) DemoText = DEMO_TEXT + 1; - } - tc = TimerCount; - } - #undef TIM - #endif +static void MainLoop(void) { +#if 0 +//def DEBUG + static VgaRegBlk Mode[] = { - Vga.Show(); - Snail_.RunCom(); - Snail.RunCom(); -} + { 0x04, VGASEQ, 0x08, 0x04 }, // memory mode + { 0x03, VGAGRA, 0xFF, 0x00 }, // data rotate = 0 + { 0x05, VGAGRA, 0x03, 0x00 }, // R/W mode = 0 + { 0x06, VGAGRA, 0x02, 0x00 }, // misc + { 0x14, VGACRT, 0x40, 0x00 }, // underline + { 0x13, VGACRT, 0xFF, 0x28 }, // screen width + { 0x17, VGACRT, 0xFF, 0xC3 }, // mode control + { 0x11, VGACRT, 0x80, 0x00 }, // vert retrace end + { 0x09, VGACRT, 0xEF, 0x01 }, // max scan line + { 0x30, VGAATR, 0x00, 0x20 }, // 256 color mode -void LoadUser (void) -{ - // set scene - if (STARTUP::Mode == 0) // user .SVG file found - { - CFILE cfile = CFILE(UsrPath(UsrFnam), REA, RCrypt); - LoadGame(cfile); - } - else - { - if (STARTUP::Mode == 1) - { - SVG0FILE file = SVG0FILE(SVG0NAME); - LoadGame(file); - } - else - { - LoadScript(ProgName(INI_EXT)); - Music = true; - CFILE file = CFILE(SVG0NAME, WRI); - SaveGame(file); - error("Ok [%s]", SVG0NAME); +// { 0x12, VGACRT, 0xFF, 0x6E }, // vert display end +// { 0x15, VGACRT, 0xFF, 0x7F }, // start vb +// { 0x10, VGACRT, 0xFF, 0x94 }, // start vr + + { 0x00 } + }; + + Vga.Setup(Mode); +#endif + + Debug(SayDebug();) + +#ifdef DEMO +#define TIM ((182L*6L) * 5L) + static uint32 tc = 0; + if (TimerCount - tc >= TIM && Talk == NULL && Snail.Idle()) { + if (Text[DemoText]) { + SNPOST(SNSOUND, -1, 4, NULL); // drumla + SNPOST(SNINF, -1, DemoText, NULL); + SNPOST(SNLABEL, -1, -1, NULL); + if (Text[++ DemoText] == NULL) DemoText = DEMO_TEXT + 1; + } + tc = TimerCount; } - } - LoadScript(ProgName(IN0_EXT)); +#undef TIM +#endif + + Vga.Show(); + Snail_.RunCom(); + Snail.RunCom(); +} + + +void LoadUser(void) { + // set scene + if (STARTUP::Mode == 0) { // user .SVG file found + CFILE cfile = CFILE(UsrPath(UsrFnam), REA, RCrypt); + LoadGame(cfile); + } else { + if (STARTUP::Mode == 1) { + SVG0FILE file = SVG0FILE(SVG0NAME); + LoadGame(file); + } else { + LoadScript(ProgName(INI_EXT)); + Music = true; + CFILE file = CFILE(SVG0NAME, WRI); + SaveGame(file); + error("Ok [%s]", SVG0NAME); + } + } + LoadScript(ProgName(IN0_EXT)); } +static void RunGame(void) { + Text.Clear(); + Text.Preload(100, 1000); + LoadHeroXY(); + CavLight.Flags.Tran = true; + VGA::ShowQ.Append(&CavLight); + CavLight.Flags.Hide = true; + static SEQ PocSeq[] = { { 0, 0, 0, 0, 20 }, + { 1, 2, 0, 0, 4 }, + { 2, 3, 0, 0, 4 }, + { 3, 4, 0, 0, 16 }, + { 2, 5, 0, 0, 4 }, + { 1, 6, 0, 0, 4 }, + { 0, 1, 0, 0, 16 }, + }; + PocLight.SetSeq(PocSeq); + PocLight.Flags.Tran = true; + PocLight.Time = 1; + PocLight.Z = 120; + VGA::ShowQ.Append(&PocLight); + SelectPocket(-1); -static void RunGame (void) -{ - Text.Clear(); - Text.Preload(100, 1000); - LoadHeroXY(); - - CavLight.Flags.Tran = true; - VGA::ShowQ.Append(&CavLight); - CavLight.Flags.Hide = true; - - static SEQ PocSeq[] = { { 0, 0, 0, 0, 20 }, - { 1, 2, 0, 0, 4 }, - { 2, 3, 0, 0, 4 }, - { 3, 4, 0, 0, 16 }, - { 2, 5, 0, 0, 4 }, - { 1, 6, 0, 0, 4 }, - { 0, 1, 0, 0, 16 }, - }; - PocLight.SetSeq(PocSeq); - PocLight.Flags.Tran = true; - PocLight.Time = 1; - PocLight.Z = 120; - VGA::ShowQ.Append(&PocLight); - SelectPocket(-1); - - VGA::ShowQ.Append(&Mouse); + VGA::ShowQ.Append(&Mouse); // ___________ - LoadUser(); + LoadUser(); // ~~~~~~~~~~~ - if ((Sprite = VGA::SpareQ.Locate(121)) != NULL) - SNPOST_(SNSEQ, -1, VGA::Mono, Sprite); - if ((Sprite = VGA::SpareQ.Locate(122)) != NULL) Sprite->Step(Music); - SNPOST_(SNSEQ, -1, Music, Sprite); - if (! Music) KillMIDI(); - - if (Mini && INI_FILE::Exist("MINI.SPR")) - { - uint8 * ptr = (uint8 *) &*Mini; - if (ptr != NULL) - { - LoadSprite("MINI", -1, 0, MINI_X, MINI_Y); - ExpandSprite(MiniCave = Sprite); // NULL is ok - if (MiniCave) - { - MiniCave->Flags.Hide = true; - MiniCave->MoveShapes(ptr); - MiniShp[0] = new BITMAP(*MiniCave->Shp()); - MiniShpList = MiniCave->SetShapeList(MiniShp); - PostMiniStep(-1); - } + if ((Sprite = VGA::SpareQ.Locate(121)) != NULL) + SNPOST_(SNSEQ, -1, VGA::Mono, Sprite); + if ((Sprite = VGA::SpareQ.Locate(122)) != NULL) + Sprite->Step(Music); + SNPOST_(SNSEQ, -1, Music, Sprite); + if (! Music) + KillMIDI(); + + if (Mini && INI_FILE::Exist("MINI.SPR")) { + uint8 *ptr = (uint8 *) &*Mini; + if (ptr != NULL) { + LoadSprite("MINI", -1, 0, MINI_X, MINI_Y); + ExpandSprite(MiniCave = Sprite); // NULL is ok + if (MiniCave) { + MiniCave->Flags.Hide = true; + MiniCave->MoveShapes(ptr); + MiniShp[0] = new BITMAP(*MiniCave->Shp()); + MiniShpList = MiniCave->SetShapeList(MiniShp); + PostMiniStep(-1); + } + } } - } - if (Hero) - { - ExpandSprite(Hero); - Hero->Goto(HeroXY[Now-1].X, HeroXY[Now-1].Y); - if (INI_FILE::Exist("00SHADOW.SPR")) - { - LoadSprite("00SHADOW", -1, 0, Hero->X + 14, Hero->Y + 51); - if ((Shadow = Sprite) != NULL) - { - Shadow->Ref = 2; - Shadow->Flags.Tran = true; - Hero->Flags.Shad = true; - VGA::ShowQ.Insert(VGA::SpareQ.Remove(Shadow), Hero); - } + if (Hero) { + ExpandSprite(Hero); + Hero->Goto(HeroXY[Now - 1].X, HeroXY[Now - 1].Y); + if (INI_FILE::Exist("00SHADOW.SPR")) { + LoadSprite("00SHADOW", -1, 0, Hero->X + 14, Hero->Y + 51); + if ((Shadow = Sprite) != NULL) { + Shadow->Ref = 2; + Shadow->Flags.Tran = true; + Hero->Flags.Shad = true; + VGA::ShowQ.Insert(VGA::SpareQ.Remove(Shadow), Hero); + } + } } - } - - InfoLine.Goto(INFO_X, INFO_Y); - InfoLine.Flags.Tran = true; - InfoLine.Update(NULL); - VGA::ShowQ.Insert(&InfoLine); - - #ifdef DEBUG - DebugLine.Z = 126; - VGA::ShowQ.Insert(&DebugLine); - - HorzLine.Y = MAP_TOP - (MAP_TOP > 0); - HorzLine.Z = 126; - VGA::ShowQ.Insert(&HorzLine); - #endif - Mouse.Busy = VGA::SpareQ.Locate(BUSY_REF); - if (Mouse.Busy) ExpandSprite(Mouse.Busy); + InfoLine.Goto(INFO_X, INFO_Y); + InfoLine.Flags.Tran = true; + InfoLine.Update(NULL); + VGA::ShowQ.Insert(&InfoLine); - Startup = 0; +#ifdef DEBUG + DebugLine.Z = 126; + VGA::ShowQ.Insert(&DebugLine); - SNPOST(SNLEVEL, -1, OldLev, &CavLight); - CavLight.Goto(CAVE_X + ((Now-1) % CAVE_NX) * CAVE_DX + CAVE_SX, - CAVE_Y + ((Now-1) / CAVE_NX) * CAVE_DY + CAVE_SY); - CaveUp(); + HorzLine.Y = MAP_TOP - (MAP_TOP > 0); + HorzLine.Z = 126; + VGA::ShowQ.Insert(&HorzLine); +#endif - KEYBOARD::SetClient(Sys); - // main loop - while (! Finis) - { - //TODO Change the SNPOST message send to a special way to send function pointer - // if (FINIS) SNPOST(SNEXEC, -1, 0, (void *)&QGame); - warning("RunGame: problematic use of SNPOST"); - MainLoop(); - } - - KEYBOARD::SetClient(NULL); - HEART::Enable = false; - SNPOST(SNCLEAR, -1, 0, NULL); - SNPOST_(SNCLEAR, -1, 0, NULL); - Mouse.Off(); - VGA::ShowQ.Clear(); - VGA::SpareQ.Clear(); - Hero = NULL; - Shadow = NULL; -} + Mouse.Busy = VGA::SpareQ.Locate(BUSY_REF); + if (Mouse.Busy) + ExpandSprite(Mouse.Busy); + Startup = 0; + SNPOST(SNLEVEL, -1, OldLev, &CavLight); + CavLight.Goto(CAVE_X + ((Now - 1) % CAVE_NX) * CAVE_DX + CAVE_SX, + CAVE_Y + ((Now - 1) / CAVE_NX) * CAVE_DY + CAVE_SY); + CaveUp(); + KEYBOARD::SetClient(Sys); + // main loop + while (! Finis) { + //TODO Change the SNPOST message send to a special way to send function pointer + // if (FINIS) SNPOST(SNEXEC, -1, 0, (void *)&QGame); + warning("RunGame: problematic use of SNPOST"); + MainLoop(); + } -void Movie (const char * ext) -{ - const char * fn = ProgName(ext); - if (INI_FILE::Exist(fn)) - { - LoadScript(fn); - ExpandSprite(VGA::SpareQ.Locate(999)); - FeedSnail(VGA::ShowQ.Locate(999), TAKE); - VGA::ShowQ.Append(&Mouse); - HEART::Enable = true; - KEYBOARD::SetClient(Sys); - while (! Snail.Idle()) - { - MainLoop(); + KEYBOARD::SetClient(NULL); + HEART::Enable = false; + SNPOST(SNCLEAR, -1, 0, NULL); + SNPOST_(SNCLEAR, -1, 0, NULL); + Mouse.Off(); + VGA::ShowQ.Clear(); + VGA::SpareQ.Clear(); + Hero = NULL; + Shadow = NULL; +} + + +void Movie(const char *ext) { + const char *fn = ProgName(ext); + if (INI_FILE::Exist(fn)) { + LoadScript(fn); + ExpandSprite(VGA::SpareQ.Locate(999)); + FeedSnail(VGA::ShowQ.Locate(999), TAKE); + VGA::ShowQ.Append(&Mouse); + HEART::Enable = true; + KEYBOARD::SetClient(Sys); + while (! Snail.Idle()) { + MainLoop(); + } + KEYBOARD::SetClient(NULL); + HEART::Enable = false; + SNPOST(SNCLEAR, -1, 0, NULL); + SNPOST_(SNCLEAR, -1, 0, NULL); + VGA::ShowQ.Clear(); + VGA::SpareQ.Clear(); } - KEYBOARD::SetClient(NULL); - HEART::Enable = false; - SNPOST(SNCLEAR, -1, 0, NULL); - SNPOST_(SNCLEAR, -1, 0, NULL); - VGA::ShowQ.Clear(); - VGA::SpareQ.Clear(); - } } +bool ShowTitle(const char *name) { + BITMAP::Pal = SysPal; + BMP_PTR LB[] = { new BITMAP(name), NULL }; + BITMAP::Pal = NULL; + bool usr_ok = false; + SPRITE D(LB); + D.Flags.Kill = true; + D.Flags.BDel = true; + D.Center(); + D.Show(2); + if (STARTUP::Mode == 2) { + Inf(SVG0NAME); + Talk->Show(2); + } + Vga.Sunset(); + VGA::CopyPage(1, 2); + VGA::CopyPage(0, 1); + SelectPocket(-1); + Vga.Sunrise(SysPal); + + if (STARTUP::Mode < 2 && ! STARTUP::SoundOk) { + VGA::CopyPage(1, 2); + VGA::CopyPage(0, 1); + VGA::ShowQ.Append(&Mouse); + HEART::Enable = true; + Mouse.On(); + for (SelectSound(); ! Snail.Idle() || VMENU::Addr;) + MainLoop(); + Mouse.Off(); + HEART::Enable = false; + VGA::ShowQ.Clear(); + VGA::CopyPage(0, 2); + STARTUP::SoundOk = 2; + if (Music) + LoadMIDI(0); + } -bool ShowTitle (const char * name) -{ - BITMAP::Pal = SysPal; - BMP_PTR LB[] = { new BITMAP(name), NULL }; - BITMAP::Pal = NULL; - bool usr_ok = false; - - SPRITE D(LB); - D.Flags.Kill = true; - D.Flags.BDel = true; - D.Center(); - D.Show(2); - - if (STARTUP::Mode == 2) - { - Inf(SVG0NAME); - Talk->Show(2); - } - - Vga.Sunset(); - VGA::CopyPage(1, 2); - VGA::CopyPage(0, 1); - SelectPocket(-1); - Vga.Sunrise(SysPal); - - if (STARTUP::Mode < 2 && ! STARTUP::SoundOk) - { - VGA::CopyPage(1, 2); - VGA::CopyPage(0, 1); - VGA::ShowQ.Append(&Mouse); - HEART::Enable = true; - Mouse.On(); - for (SelectSound(); ! Snail.Idle() || VMENU::Addr; ) MainLoop(); - Mouse.Off(); - HEART::Enable = false; - VGA::ShowQ.Clear(); - VGA::CopyPage(0, 2); - STARTUP::SoundOk = 2; - if (Music) LoadMIDI(0); - } - - if (STARTUP::Mode < 2) - { - #ifdef DEMO - strcpy(UsrFnam, ProgName(SVG_EXT)); - usr_ok = true; - #else - //----------------------------------------- - #ifndef EVA - #ifdef CD - STARTUP::Summa |= (0xC0 + (DriveCD(0) << 6)) & 0xFF; - #else + if (STARTUP::Mode < 2) { +#ifdef DEMO + strcpy(UsrFnam, ProgName(SVG_EXT)); + usr_ok = true; +#else + //----------------------------------------- +#ifndef EVA +#ifdef CD + STARTUP::Summa |= (0xC0 + (DriveCD(0) << 6)) & 0xFF; +#else // Boot * b = ReadBoot(getdisk()); warning("ShowTitle: FIXME ReadBoot"); - Boot * b = ReadBoot(0); - uint32 sn = (b->XSign == 0x29) ? b->Serial : b->lTotSecs; - free(b); - sn -= ((IDENT *)Copr)->disk; - STARTUP::Summa |= Lo(sn) | Hi(sn); - #endif - #endif - //----------------------------------------- - Movie("X00"); // paylist - VGA::CopyPage(1, 2); - VGA::CopyPage(0, 1); - VGA::ShowQ.Append(&Mouse); - //Mouse.On(); - HEART::Enable = true; - for (TakeName(); GET_TEXT::Ptr; ) MainLoop(); - HEART::Enable = false; - if (KEYBOARD::Last() == Enter && *UsrFnam) usr_ok = true; - if (usr_ok) strcat(UsrFnam, SVG_EXT); - //Mouse.Off(); - VGA::ShowQ.Clear(); - VGA::CopyPage(0, 2); - #endif - if (usr_ok && STARTUP::Mode == 0) - { - const char *n = UsrPath(UsrFnam); - if (CFILE::Exist(n)) - { - CFILE file = CFILE(n, REA, RCrypt); - LoadGame(file, true); // only system vars - VGA::SetColors(SysPal, 64); - Vga.Update(); - if (FINIS) - { - ++ STARTUP::Mode; - FINIS = false; + Boot *b = ReadBoot(0); + uint32 sn = (b->XSign == 0x29) ? b->Serial : b->lTotSecs; + free(b); + sn -= ((IDENT *)Copr)->disk; + STARTUP::Summa |= Lo(sn) | Hi(sn); +#endif +#endif + //----------------------------------------- + Movie("X00"); // paylist + VGA::CopyPage(1, 2); + VGA::CopyPage(0, 1); + VGA::ShowQ.Append(&Mouse); + //Mouse.On(); + HEART::Enable = true; + for (TakeName(); GET_TEXT::Ptr;) + MainLoop(); + HEART::Enable = false; + if (KEYBOARD::Last() == Enter && *UsrFnam) + usr_ok = true; + if (usr_ok) + strcat(UsrFnam, SVG_EXT); + //Mouse.Off(); + VGA::ShowQ.Clear(); + VGA::CopyPage(0, 2); +#endif + if (usr_ok && STARTUP::Mode == 0) { + const char *n = UsrPath(UsrFnam); + if (CFILE::Exist(n)) { + CFILE file = CFILE(n, REA, RCrypt); + LoadGame(file, true); // only system vars + VGA::SetColors(SysPal, 64); + Vga.Update(); + if (FINIS) { + ++ STARTUP::Mode; + FINIS = false; + } + } else + ++STARTUP::Mode; } - } - else ++ STARTUP::Mode; } - } - if (STARTUP::Mode < 2) Movie("X01"); // wink + if (STARTUP::Mode < 2) + Movie("X01"); // wink - VGA::CopyPage(0, 2); + VGA::CopyPage(0, 2); - #ifdef DEMO - return true; - #else - return (STARTUP::Mode == 2 || usr_ok); - #endif +#ifdef DEMO + return true; +#else + return (STARTUP::Mode == 2 || usr_ok); +#endif } - - /* #ifdef DEBUG void StkDump (void) @@ -2257,40 +1908,40 @@ void StkDump (void) */ +void cge_main(void) { + uint16 intStack[STACK_SIZ / 2]; + intStackPtr = intStack; + //Debug( memset((void *) (-K(2)), 0, K(1)); ) + //Debug( memset((void *) (-K(4)), 0, K(1)); ) + memset(Barriers, 0xFF, sizeof(Barriers)); -void cge_main (void) -{ - uint16 intStack[STACK_SIZ/2]; - intStackPtr = intStack; - - //Debug( memset((void *) (-K(2)), 0, K(1)); ) - //Debug( memset((void *) (-K(4)), 0, K(1)); ) - memset(Barriers, 0xFF, sizeof(Barriers)); - - if (! Mouse.Exist) - error("%s", Text[NO_MOUSE_TEXT]); - if (! SVG0FILE::Exist(SVG0NAME)) STARTUP::Mode = 2; - - Debug( DebugLine.Flags.Hide = true; ) - Debug( HorzLine.Flags.Hide = true; ) - - //srand((uint16) Timer()); - Sys = new SYSTEM; - - if (Music && STARTUP::SoundOk) LoadMIDI(0); - if (STARTUP::Mode < 2) Movie(LGO_EXT); - if (ShowTitle("WELCOME")) - { - #ifndef DEMO - if (STARTUP::Mode == 1) Movie("X02"); // intro - #endif - RunGame(); - Startup = 2; - if (FINIS) Movie("X03"); - } - else Vga.Sunset(); - error("%s", Text[EXIT_OK_TEXT+FINIS]); + if (! Mouse.Exist) + error("%s", Text[NO_MOUSE_TEXT]); + if (! SVG0FILE::Exist(SVG0NAME)) + STARTUP::Mode = 2; + + Debug(DebugLine.Flags.Hide = true;) + Debug(HorzLine.Flags.Hide = true;) + + //srand((uint16) Timer()); + Sys = new SYSTEM; + + if (Music && STARTUP::SoundOk) + LoadMIDI(0); + if (STARTUP::Mode < 2) + Movie(LGO_EXT); + if (ShowTitle("WELCOME")) { +#ifndef DEMO + if (STARTUP::Mode == 1) Movie("X02"); // intro +#endif + RunGame(); + Startup = 2; + if (FINIS) + Movie("X03"); + } else + Vga.Sunset(); + error("%s", Text[EXIT_OK_TEXT + FINIS]); } } // End of namespace CGE |