aboutsummaryrefslogtreecommitdiff
path: root/engines/cge/snail.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/cge/snail.cpp')
-rw-r--r--engines/cge/snail.cpp1998
1 files changed, 908 insertions, 1090 deletions
diff --git a/engines/cge/snail.cpp b/engines/cge/snail.cpp
index 82ec4c596d..952e032222 100644
--- a/engines/cge/snail.cpp
+++ b/engines/cge/snail.cpp
@@ -25,1290 +25,1108 @@
* Copyright (c) 1994-1995 Janus B. Wisniewski and L.K. Avalon
*/
-#include "cge/general.h"
-#include "cge/sound.h"
-#include "cge/snail.h"
-#include "cge/vga13h.h"
-#include "cge/bitmaps.h"
-#include "cge/text.h"
-#include "cge/mouse.h"
-#include "cge/cge_main.h"
-#include <dos.h>
-//#include <alloc.h>
-//#include <mem.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include "cge/keybd.h"
+#include "cge/general.h"
+#include "cge/sound.h"
+#include "cge/snail.h"
+#include "cge/vga13h.h"
+#include "cge/bitmaps.h"
+#include "cge/text.h"
+#include "cge/mouse.h"
+#include "cge/cge_main.h"
+#include <dos.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include "cge/keybd.h"
namespace CGE {
- int MaxCave = 0;
+int MaxCave = 0;
- SCB Scb = { NULL, 0, NULL };
- bool Flag[4];
- bool Dark = false;
- bool Game = false;
- int Now = 1;
- int Lev = -1;
- SNAIL Snail = false;
- SNAIL Snail_ = true;
+SCB Scb = { NULL, 0, NULL };
+bool Flag[4];
+bool Dark = false;
+bool Game = false;
+int Now = 1;
+int Lev = -1;
+SNAIL Snail = false;
+SNAIL Snail_ = true;
-extern SPRITE PocLight;
+extern SPRITE PocLight;
//-------------------------------------------------------------------------
-// SPRITE * Pocket[POCKET_NX]={ NULL, NULL, NULL, NULL,
+// SPRITE * Pocket[POCKET_NX]={ NULL, NULL, NULL, NULL,
// NULL, NULL, NULL, NULL, };
-// int PocPtr = 0;
+// int PocPtr = 0;
//-------------------------------------------------------------------------
-extern SPRITE * Pocket[];
-extern int PocPtr;
-//-------------------------------------------------------------------------
-
-extern DAC * SysPal;
-extern MOUSE Mouse;
-
-
-
-//-------------------------------------------------------------------------
-
-
-static void SNGame (SPRITE * spr, int num)
-{
- switch (num)
- {
- //--------------------------------------------------------------------
- case 1 :
- {
- #define STAGES 8
- #define DRESSED 3
- static SPRITE * dup[3] = { NULL, NULL, NULL };
- int buref = 0;
- int Stage = 0;
-
- for (dup[0] = VGA::ShowQ.First(); dup[0]; dup[0] = dup[0]->Next)
- {
- buref = dup[0]->Ref;
- if (buref / 1000 == 16 && buref % 100 == 6)
- {
- Stage = (buref / 100) % 10;
- break;
- }
- }
- if (dup[1] == NULL)
- {
- dup[1] = VGA::ShowQ.Locate(16003); // pan
- dup[2] = VGA::ShowQ.Locate(16004); // pani
- }
-
- if (Game) // continue game
- {
- int i = new_random(3), hand = (dup[0]->ShpCnt == 6);
- ++ Stage;
- if (hand && Stage > DRESSED) ++ hand;
- if (
- Debug( i >= 0 || )
- dup[i] == spr && new_random(3) == 0)
- {
- SNPOST(SNSEQ, -1, 3, dup[0]); // yes
- SNPOST(SNSEQ, -1, 3, dup[1]); // yes
- SNPOST(SNSEQ, -1, 3, dup[2]); // yes
- SNPOST(SNTNEXT, -1, 0, dup[0]); // reset Take
- SNPOST(SNTNEXT, -1, 0, dup[1]); // reset Take
- SNPOST(SNTNEXT, -1, 0, dup[2]); // reset Take
- SNPOST(SNNNEXT, -1, 0, dup[0]); // reset Near
- SNPOST(SNPAUSE, -1, 72, NULL); // little rest
- SNPOST(SNSAY, 1, 16009, NULL); // hura
- SNPOST(SNSAY, buref, 16010, NULL); // siadaj
- SNPOST(SNSAY, 1, 16011, NULL); // postoj‘
-
- if (hand)
- {
- SNPOST(SNSEND, 16060+hand, 16, NULL); // dawaj r‘k‘
- SNPOST(SNSEQ, buref, 4, NULL); // zdejmowanie
- SNPOST(SNSEQ, 16060+hand, 1, NULL); // ruch
- SNPOST(SNSOUND, 16060+hand, 16002, NULL); // szelest
- SNPOST(SNWAIT, 16060+hand, 3, NULL); // podniesie
- SNPOST(SNSWAP, buref, buref+100, NULL); // rozdziana
- SNPOST(SNSEQ, 16016, Stage, NULL); // rožnie kupa
- SNPOST(SNSEND, 16060+hand, -1, NULL); // chowaj r‘k‘
- SNPOST(SNWAIT, 16060+hand, -1, NULL); // r‘ka zamar’a
- }
- else
- {
- SNPOST(SNSEQ, buref, 4, NULL); // zdejmowanie
- SNPOST(SNSOUND, 16060+hand, 16002, NULL); // szelest
- SNPOST(SNWAIT, buref, -1, NULL); // zdejmie
- SNPOST(SNSWAP, buref, buref+100, NULL); // rozdziana
- SNPOST(SNSEQ, 16016, Stage, NULL); // rožnie kupa
- }
- //SNPOST(SNSEQ, buref+100, 0, NULL); // reset
- SNPOST(SNPAUSE, -1, 72, NULL); // chwilk‘...
-
- SNPOST(SNSEQ, -1, 0, dup[1]); // odstaw Go
- SNPOST(SNSETXY, -1, 203 + SCR_WID * 49, dup[1]);
- SNPOST(SNSETZ, -1, 7, dup[1]);
-
- SNPOST(SNSEQ, -1, 0, dup[2]); // odstaw J†
- SNPOST(SNSETXY, -1, 182 + SCR_WID * 62, dup[2]);
- SNPOST(SNSETZ, -1, 9, dup[2]);
- Game = 0;
- return;
- }
- else
- {
- SNPOST(SNSEQ, -1, 2, dup[0]); // no
- SNPOST(SNSEQ, -1, 2, dup[1]); // no
- SNPOST(SNSEQ, -1, 2, dup[2]); // no
- SNPOST(SNPAUSE, -1, 72, NULL); // 1 sec
+extern SPRITE *Pocket[];
+extern int PocPtr;
+extern DAC *SysPal;
+extern MOUSE Mouse;
+
+
+static void SNGame(SPRITE *spr, int num) {
+ switch (num) {
+ case 1 : {
+#define STAGES 8
+#define DRESSED 3
+ static SPRITE *dup[3] = { NULL, NULL, NULL };
+ int buref = 0;
+ int Stage = 0;
+
+ for (dup[0] = VGA::ShowQ.First(); dup[0]; dup[0] = dup[0]->Next) {
+ buref = dup[0]->Ref;
+ if (buref / 1000 == 16 && buref % 100 == 6) {
+ Stage = (buref / 100) % 10;
+ break;
+ }
}
- }
- SNPOST(SNWALK, 198, 134, NULL); // na miejsce
- SNPOST(SNWAIT, 1, -1, NULL); // stoi
- SNPOST(SNCOVER, 1, 16101, NULL); // ch’op do bicia
- SNPOST(SNSEQ, 16101, 1, NULL); // wystaw
- SNPOST(SNWAIT, 16101, 5, NULL); // czekaj
- SNPOST(SNPAUSE, 16101, 24, NULL); // czekaj chwil‘
- SNPOST(SNSEQ, 16040, 1, NULL); // plask
- SNPOST(SNSOUND, 16101, 16001, NULL); // plask!
- SNPOST(SNPAUSE, 16101, 24, NULL); // czekaj chwil‘
- SNPOST(SNSEQ, 16040, 0, NULL); // schowaj plask
- SNPOST(SNWAIT, 16101, -1, NULL); // stoi
- SNPOST(SNUNCOVER, 1, 16101, NULL); // SDS
- if (! Game)
- {
- SNPOST(SNSAY, buref, 16008, NULL); // zgadnij!
- Game = true;
- }
- #undef STEPS
- #undef DRESSED
- } break;
- //--------------------------------------------------------------------
- case 2 :
- {
- static SPRITE * k = NULL, * k1, * k2, * k3;
- static int count = 0;
- bool hit;
-
- if (k == NULL)
- {
- k = VGA::ShowQ.Locate(20700);
- k1 = VGA::ShowQ.Locate(20701);
- k2 = VGA::ShowQ.Locate(20702);
- k3 = VGA::ShowQ.Locate(20703);
- }
-
- if (! Game) // init
- {
- SNPOST(SNGAME, 20002, 2, NULL);
- Game = true;
- }
- else // cont
- {
- k1->Step(new_random(6));
- k2->Step(new_random(6));
- k3->Step(new_random(6));
- ///--------------------
- if (spr->Ref == 1 && KEYBOARD::Key[ALT])
- {
- k1->Step(5);
- k2->Step(5);
- k3->Step(5);
+ if (dup[1] == NULL) {
+ dup[1] = VGA::ShowQ.Locate(16003); // pan
+ dup[2] = VGA::ShowQ.Locate(16004); // pani
}
- ///--------------------
- SNPOST(SNSETZ, 20700, 0, NULL);
- hit = (k1->SeqPtr + k2->SeqPtr + k3->SeqPtr == 15);
- if (hit)
- {
- if (spr->Ref == 1)
- {
- SNPOST(SNSAY, 1, 20003, NULL); // hura!
- SNPOST(SNSEQ, 20011, 2, NULL); // kamera won
- SNPOST(SNSEND, 20701, -1, NULL); // k1 won
- SNPOST(SNSEND, 20702, -1, NULL); // k2 won
- SNPOST(SNSEND, 20703, -1, NULL); // k3 won
- SNPOST(SNSEND, 20700, -1, NULL); // tv won
- SNPOST(SNKEEP, 20007, 0, NULL); // do kieszeni
- SNPOST(SNSEND, 20006, 20, NULL); // bilon
- SNPOST(SNSOUND,20006, 20002, NULL); // bilon!
- SNPOST(SNSAY, 20002, 20004, NULL);
- SNPOST(SNSEND, 20010, 20, NULL); // papier
- SNPOST(SNSOUND,20010, 20003, NULL); // papier!
- SNPOST(SNSAY, 20001, 20005, NULL);
- Game = false;
- return;
- }
- else k3->Step(new_random(5));
+
+ if (Game) { // continue game
+ int i = new_random(3), hand = (dup[0]->ShpCnt == 6);
+ ++ Stage;
+ if (hand && Stage > DRESSED)
+ ++hand;
+ if (Debug(i >= 0 ||)
+ dup[i] == spr && new_random(3) == 0) {
+ SNPOST(SNSEQ, -1, 3, dup[0]); // yes
+ SNPOST(SNSEQ, -1, 3, dup[1]); // yes
+ SNPOST(SNSEQ, -1, 3, dup[2]); // yes
+ SNPOST(SNTNEXT, -1, 0, dup[0]); // reset Take
+ SNPOST(SNTNEXT, -1, 0, dup[1]); // reset Take
+ SNPOST(SNTNEXT, -1, 0, dup[2]); // reset Take
+ SNPOST(SNNNEXT, -1, 0, dup[0]); // reset Near
+ SNPOST(SNPAUSE, -1, 72, NULL); // little rest
+ SNPOST(SNSAY, 1, 16009, NULL); // hura
+ SNPOST(SNSAY, buref, 16010, NULL); // siadaj
+ SNPOST(SNSAY, 1, 16011, NULL); // postoj‘
+
+ if (hand) {
+ SNPOST(SNSEND, 16060 + hand, 16, NULL); // dawaj r‘k‘
+ SNPOST(SNSEQ, buref, 4, NULL); // zdejmowanie
+ SNPOST(SNSEQ, 16060 + hand, 1, NULL); // ruch
+ SNPOST(SNSOUND, 16060 + hand, 16002, NULL); // szelest
+ SNPOST(SNWAIT, 16060 + hand, 3, NULL); // podniesie
+ SNPOST(SNSWAP, buref, buref + 100, NULL); // rozdziana
+ SNPOST(SNSEQ, 16016, Stage, NULL); // rožnie kupa
+ SNPOST(SNSEND, 16060 + hand, -1, NULL); // chowaj r‘k‘
+ SNPOST(SNWAIT, 16060 + hand, -1, NULL); // r‘ka zamar’a
+ } else {
+ SNPOST(SNSEQ, buref, 4, NULL); // zdejmowanie
+ SNPOST(SNSOUND, 16060 + hand, 16002, NULL); // szelest
+ SNPOST(SNWAIT, buref, -1, NULL); // zdejmie
+ SNPOST(SNSWAP, buref, buref + 100, NULL); // rozdziana
+ SNPOST(SNSEQ, 16016, Stage, NULL); // rožnie kupa
+ }
+ //SNPOST(SNSEQ, buref+100, 0, NULL); // reset
+ SNPOST(SNPAUSE, -1, 72, NULL); // chwilk‘...
+
+ SNPOST(SNSEQ, -1, 0, dup[1]); // odstaw Go
+ SNPOST(SNSETXY, -1, 203 + SCR_WID * 49, dup[1]);
+ SNPOST(SNSETZ, -1, 7, dup[1]);
+
+ SNPOST(SNSEQ, -1, 0, dup[2]); // odstaw J†
+ SNPOST(SNSETXY, -1, 182 + SCR_WID * 62, dup[2]);
+ SNPOST(SNSETZ, -1, 9, dup[2]);
+ Game = 0;
+ return;
+ } else {
+ SNPOST(SNSEQ, -1, 2, dup[0]); // no
+ SNPOST(SNSEQ, -1, 2, dup[1]); // no
+ SNPOST(SNSEQ, -1, 2, dup[2]); // no
+ SNPOST(SNPAUSE, -1, 72, NULL); // 1 sec
+ }
+ }
+ SNPOST(SNWALK, 198, 134, NULL); // na miejsce
+ SNPOST(SNWAIT, 1, -1, NULL); // stoi
+ SNPOST(SNCOVER, 1, 16101, NULL); // ch’op do bicia
+ SNPOST(SNSEQ, 16101, 1, NULL); // wystaw
+ SNPOST(SNWAIT, 16101, 5, NULL); // czekaj
+ SNPOST(SNPAUSE, 16101, 24, NULL); // czekaj chwil‘
+ SNPOST(SNSEQ, 16040, 1, NULL); // plask
+ SNPOST(SNSOUND, 16101, 16001, NULL); // plask!
+ SNPOST(SNPAUSE, 16101, 24, NULL); // czekaj chwil‘
+ SNPOST(SNSEQ, 16040, 0, NULL); // schowaj plask
+ SNPOST(SNWAIT, 16101, -1, NULL); // stoi
+ SNPOST(SNUNCOVER, 1, 16101, NULL); // SDS
+ if (! Game) {
+ SNPOST(SNSAY, buref, 16008, NULL); // zgadnij!
+ Game = true;
}
- if (count < 100)
- {
- switch (count)
- {
- case 15 : SNPOST(SNSAY, 20003, 20021, NULL); break;
- case 30 :
- case 45 :
- case 60 :
- case 75 : SNPOST(SNSAY, 20003, 20022, NULL); break;
- }
- ++ count;
+#undef STEPS
+#undef DRESSED
+ }
+ break;
+ //--------------------------------------------------------------------
+ case 2 : {
+ static SPRITE *k = NULL, * k1, * k2, * k3;
+ static int count = 0;
+ bool hit;
+
+ if (k == NULL) {
+ k = VGA::ShowQ.Locate(20700);
+ k1 = VGA::ShowQ.Locate(20701);
+ k2 = VGA::ShowQ.Locate(20702);
+ k3 = VGA::ShowQ.Locate(20703);
}
- switch (spr->Ref)
- {
- case 1 : SNPOST(SNSAY, 20001, 20011, NULL); // zapro
- SNPOST(SNSEQ, 20001, 1, NULL); // rzuŤ
- SNPOST(SNWAIT, 20001, 1, NULL); // czekaj
- SNPOST(SNSETZ, 20700, 2, NULL); // skryj k
- SNPOST(SNHIDE, 20007, 1, NULL); // skryj k
- SNPOST(SNWAIT, 20001, 16, NULL); // czekaj
- SNPOST(SNSEQ, 20007, 1, NULL); // lec†
- SNPOST(SNHIDE, 20007, 0, NULL); // poka§
- SNPOST(SNSOUND,20007, 20001, NULL); // grzech
- SNPOST(SNWAIT, 20007, -1, NULL); // koniec
- SNPOST(SNGAME, 20001, 2, NULL); // again!
- break;
- case 20001 : SNPOST(SNSAY, 20002, 20012, NULL); // zapro
- SNPOST(SNSEQ, 20002, 1, NULL); // rzuŤ
- SNPOST(SNWAIT, 20002, 3, NULL); // czekaj
- SNPOST(SNSETZ, 20700, 2, NULL); // skryj k
- SNPOST(SNHIDE, 20007, 1, NULL); // skryj k
- SNPOST(SNWAIT, 20002, 10, NULL); // czekaj
- SNPOST(SNSEQ, 20007, 2, NULL); // lec†
- SNPOST(SNHIDE, 20007, 0, NULL); // poka§
- SNPOST(SNSOUND,20007, 20001, NULL); // grzech
- SNPOST(SNWAIT, 20007, -1, NULL); // koniec
- SNPOST(SNGAME, 20002, 2, NULL); // again!
- break;
- case 20002 : SNPOST(SNSAY, 20002, 20010, NULL); // zapro
- SNPOST(SNWALK, 20005, -1, NULL); // do stol
- SNPOST(SNWAIT, 1, -1, NULL); // stoi
- SNPOST(SNCOVER, 1, 20101, NULL); // grasol
- SNPOST(SNSEQ, 20101, 1, NULL); // rzuŤ
- SNPOST(SNWAIT, 20101, 5, NULL); // czekaj
- SNPOST(SNSETZ, 20700, 2, NULL); // skryj k
- SNPOST(SNHIDE, 20007, 1, NULL); // skryj k
- SNPOST(SNWAIT, 20101, 15, NULL); // czekaj
- SNPOST(SNSEQ, 20007, 1, NULL); // lec†
- SNPOST(SNHIDE, 20007, 0, NULL); // poka§
- SNPOST(SNSOUND,20007, 20001, NULL); // grzech
- SNPOST(SNWAIT, 20101, -1, NULL); // koniec
- SNPOST(SNUNCOVER, 1, 20101, NULL); // SDS
- SNPOST(SNGAME, 1, 2, NULL); // again!
- break;
+
+ if (! Game) { // init
+ SNPOST(SNGAME, 20002, 2, NULL);
+ Game = true;
+ } else { // cont
+ k1->Step(new_random(6));
+ k2->Step(new_random(6));
+ k3->Step(new_random(6));
+ ///--------------------
+ if (spr->Ref == 1 && KEYBOARD::Key[ALT]) {
+ k1->Step(5);
+ k2->Step(5);
+ k3->Step(5);
+ }
+ ///--------------------
+ SNPOST(SNSETZ, 20700, 0, NULL);
+ hit = (k1->SeqPtr + k2->SeqPtr + k3->SeqPtr == 15);
+ if (hit) {
+ if (spr->Ref == 1) {
+ SNPOST(SNSAY, 1, 20003, NULL); // hura!
+ SNPOST(SNSEQ, 20011, 2, NULL); // kamera won
+ SNPOST(SNSEND, 20701, -1, NULL); // k1 won
+ SNPOST(SNSEND, 20702, -1, NULL); // k2 won
+ SNPOST(SNSEND, 20703, -1, NULL); // k3 won
+ SNPOST(SNSEND, 20700, -1, NULL); // tv won
+ SNPOST(SNKEEP, 20007, 0, NULL); // do kieszeni
+ SNPOST(SNSEND, 20006, 20, NULL); // bilon
+ SNPOST(SNSOUND, 20006, 20002, NULL); // bilon!
+ SNPOST(SNSAY, 20002, 20004, NULL);
+ SNPOST(SNSEND, 20010, 20, NULL); // papier
+ SNPOST(SNSOUND, 20010, 20003, NULL); // papier!
+ SNPOST(SNSAY, 20001, 20005, NULL);
+ Game = false;
+ return;
+ } else
+ k3->Step(new_random(5));
+ }
+ if (count < 100) {
+ switch (count) {
+ case 15 :
+ SNPOST(SNSAY, 20003, 20021, NULL);
+ break;
+ case 30 :
+ case 45 :
+ case 60 :
+ case 75 :
+ SNPOST(SNSAY, 20003, 20022, NULL);
+ break;
+ }
+ ++ count;
+ }
+ switch (spr->Ref) {
+ case 1 :
+ SNPOST(SNSAY, 20001, 20011, NULL); // zapro
+ SNPOST(SNSEQ, 20001, 1, NULL); // rzuŤ
+ SNPOST(SNWAIT, 20001, 1, NULL); // czekaj
+ SNPOST(SNSETZ, 20700, 2, NULL); // skryj k
+ SNPOST(SNHIDE, 20007, 1, NULL); // skryj k
+ SNPOST(SNWAIT, 20001, 16, NULL); // czekaj
+ SNPOST(SNSEQ, 20007, 1, NULL); // lec†
+ SNPOST(SNHIDE, 20007, 0, NULL); // poka§
+ SNPOST(SNSOUND, 20007, 20001, NULL); // grzech
+ SNPOST(SNWAIT, 20007, -1, NULL); // koniec
+ SNPOST(SNGAME, 20001, 2, NULL); // again!
+ break;
+ case 20001 :
+ SNPOST(SNSAY, 20002, 20012, NULL); // zapro
+ SNPOST(SNSEQ, 20002, 1, NULL); // rzuŤ
+ SNPOST(SNWAIT, 20002, 3, NULL); // czekaj
+ SNPOST(SNSETZ, 20700, 2, NULL); // skryj k
+ SNPOST(SNHIDE, 20007, 1, NULL); // skryj k
+ SNPOST(SNWAIT, 20002, 10, NULL); // czekaj
+ SNPOST(SNSEQ, 20007, 2, NULL); // lec†
+ SNPOST(SNHIDE, 20007, 0, NULL); // poka§
+ SNPOST(SNSOUND, 20007, 20001, NULL); // grzech
+ SNPOST(SNWAIT, 20007, -1, NULL); // koniec
+ SNPOST(SNGAME, 20002, 2, NULL); // again!
+ break;
+ case 20002 :
+ SNPOST(SNSAY, 20002, 20010, NULL); // zapro
+ SNPOST(SNWALK, 20005, -1, NULL); // do stol
+ SNPOST(SNWAIT, 1, -1, NULL); // stoi
+ SNPOST(SNCOVER, 1, 20101, NULL); // grasol
+ SNPOST(SNSEQ, 20101, 1, NULL); // rzuŤ
+ SNPOST(SNWAIT, 20101, 5, NULL); // czekaj
+ SNPOST(SNSETZ, 20700, 2, NULL); // skryj k
+ SNPOST(SNHIDE, 20007, 1, NULL); // skryj k
+ SNPOST(SNWAIT, 20101, 15, NULL); // czekaj
+ SNPOST(SNSEQ, 20007, 1, NULL); // lec†
+ SNPOST(SNHIDE, 20007, 0, NULL); // poka§
+ SNPOST(SNSOUND, 20007, 20001, NULL); // grzech
+ SNPOST(SNWAIT, 20101, -1, NULL); // koniec
+ SNPOST(SNUNCOVER, 1, 20101, NULL); // SDS
+ SNPOST(SNGAME, 1, 2, NULL); // again!
+ break;
+ }
}
- }
- } break;
- //--------------------------------------------------------------------
- }
+ }
+ break;
+ }
}
-//-------------------------------------------------------------------------
-
-
-
-
-void ExpandSprite (SPRITE * spr)
-{
- if (spr) VGA::ShowQ.Insert(VGA::SpareQ.Remove(spr));
+void ExpandSprite(SPRITE *spr) {
+ if (spr)
+ VGA::ShowQ.Insert(VGA::SpareQ.Remove(spr));
}
-
-
-
-void ContractSprite (SPRITE * spr)
-{
- if (spr) VGA::SpareQ.Append(VGA::ShowQ.Remove(spr));
+void ContractSprite(SPRITE *spr) {
+ if (spr)
+ VGA::SpareQ.Append(VGA::ShowQ.Remove(spr));
}
-
-
-
-
-
-
-int FindPocket (SPRITE * spr)
-{
- int i;
- for (i = 0; i < POCKET_NX; i ++) if (Pocket[i] == spr) return i;
- return -1;
+int FindPocket(SPRITE *spr) {
+ for (int i = 0; i < POCKET_NX; i ++)
+ if (Pocket[i] == spr)
+ return i;
+ return -1;
}
-
-
-
-void SelectPocket (int n)
-{
- if (n < 0 || (PocLight.SeqPtr && PocPtr == n))
- {
- PocLight.Step(0);
- n = FindPocket(NULL);
- if (n >= 0) PocPtr = n;
- }
- else
- {
- if (Pocket[n] != NULL)
- {
- PocPtr = n;
- PocLight.Step(1);
+void SelectPocket(int n) {
+ if (n < 0 || (PocLight.SeqPtr && PocPtr == n)) {
+ PocLight.Step(0);
+ n = FindPocket(NULL);
+ if (n >= 0)
+ PocPtr = n;
+ } else {
+ if (Pocket[n] != NULL) {
+ PocPtr = n;
+ PocLight.Step(1);
+ }
}
- }
- PocLight.Goto(POCKET_X+PocPtr*POCKET_DX+POCKET_SX, POCKET_Y+POCKET_SY);
+ PocLight.Goto(POCKET_X + PocPtr * POCKET_DX + POCKET_SX, POCKET_Y + POCKET_SY);
}
-
-
-
-void PocFul (void)
-{
- Hero->Park();
- SNPOST(SNWAIT, -1, -1, Hero);
- SNPOST(SNSEQ, -1, POC_FUL, Hero);
- SNPOST(SNSOUND, -1, 2, Hero);
- SNPOST(SNWAIT, -1, -1, Hero);
- SNPOST(SNSAY, 1, POC_FUL_TEXT, Hero);
+void PocFul(void) {
+ Hero->Park();
+ SNPOST(SNWAIT, -1, -1, Hero);
+ SNPOST(SNSEQ, -1, POC_FUL, Hero);
+ SNPOST(SNSOUND, -1, 2, Hero);
+ SNPOST(SNWAIT, -1, -1, Hero);
+ SNPOST(SNSAY, 1, POC_FUL_TEXT, Hero);
}
-
-
-void Hide1 (SPRITE * spr)
-{
- SNPOST_(SNGHOST, -1, 0, spr->Ghost());
+void Hide1(SPRITE *spr) {
+ SNPOST_(SNGHOST, -1, 0, spr->Ghost());
}
-
-
-void SNGhost (BITMAP * bmp)
-{
- // TODO : Get x and y from M but not using segment / offset
- //bmp->Hide(FP_OFF(bmp->M), FP_SEG(bmp->M));
- bmp->M = NULL;
- delete bmp;
- warning("STUB: SNGhost");
+void SNGhost(BITMAP *bmp) {
+ // TODO : Get x and y from M but not using segment / offset
+ //bmp->Hide(FP_OFF(bmp->M), FP_SEG(bmp->M));
+ bmp->M = NULL;
+ delete bmp;
+ warning("STUB: SNGhost");
}
-
-
-void FeedSnail (SPRITE * spr, SNLIST snq)
-{
- if (spr) if (spr->Active())
- {
- uint8 ptr = (snq == TAKE) ? spr->TakePtr : spr->NearPtr;
-
- if (ptr != NO_PTR)
- {
- SNAIL::COM * comtab = spr->SnList(snq);
- SNAIL::COM * c = comtab + ptr;
-
- if (FindPocket(NULL) < 0) // no empty pockets?
- {
- SNAIL::COM * p;
- for (p = c; p->Com != SNNEXT; p ++) // find KEEP command
- {
- if (p->Com == SNKEEP)
- {
- PocFul();
- return;
- }
- if (p->Ptr) break;
- }
- }
- while (true)
- {
- if (c->Com == SNTALK)
- {
- if ((Snail.TalkEnable = (c->Val != 0)) == false) KillText();
- }
- if (c->Com == SNNEXT)
- {
- SPRITE * s = (c->Ref < 0) ? spr : Locate(c->Ref);
- if (s)
- {
- uint8 * idx = (snq == TAKE) ? &s->TakePtr : &s->NearPtr;
- if (*idx != NO_PTR)
- {
- int v;
- switch (c->Val)
- {
- case -1 : v = c - comtab + 1; break;
- case -2 : v = c - comtab; break;
- case -3 : v = -1; break;
- default : v = c->Val; break;
- }
- if (v >= 0) *idx = v;
+void FeedSnail(SPRITE *spr, SNLIST snq) {
+ if (spr)
+ if (spr->Active()) {
+ uint8 ptr = (snq == TAKE) ? spr->TakePtr : spr->NearPtr;
+
+ if (ptr != NO_PTR) {
+ SNAIL::COM *comtab = spr->SnList(snq);
+ SNAIL::COM *c = comtab + ptr;
+
+ if (FindPocket(NULL) < 0) { // no empty pockets?
+ SNAIL::COM *p;
+ for (p = c; p->Com != SNNEXT; p ++) { // find KEEP command
+ if (p->Com == SNKEEP) {
+ PocFul();
+ return;
+ }
+ if (p->Ptr)
+ break;
+ }
+ }
+ while (true) {
+ if (c->Com == SNTALK) {
+ if ((Snail.TalkEnable = (c->Val != 0)) == false)
+ KillText();
+ }
+ if (c->Com == SNNEXT) {
+ SPRITE *s = (c->Ref < 0) ? spr : Locate(c->Ref);
+ if (s) {
+ uint8 *idx = (snq == TAKE) ? &s->TakePtr : &s->NearPtr;
+ if (*idx != NO_PTR) {
+ int v;
+ switch (c->Val) {
+ case -1 :
+ v = c - comtab + 1;
+ break;
+ case -2 :
+ v = c - comtab;
+ break;
+ case -3 :
+ v = -1;
+ break;
+ default :
+ v = c->Val;
+ break;
+ }
+ if (v >= 0)
+ *idx = v;
+ }
+ }
+ if (s == spr)
+ break;
+ }
+ if (c->Com == SNIF) {
+ SPRITE *s = (c->Ref < 0) ? spr : Locate(c->Ref);
+ if (s) { // sprite extsts
+ if (! s->SeqTest(-1))
+ c = comtab + c->Val; // not parked
+ else
+ ++c;
+ } else
+ ++c;
+ } else {
+ SNPOST(c->Com, c->Ref, c->Val, spr);
+ if (c->Ptr)
+ break;
+ else
+ ++c;
+ }
+ }
}
- }
- if (s == spr) break;
- }
- if (c->Com == SNIF)
- {
- SPRITE * s = (c->Ref < 0) ? spr : Locate(c->Ref);
- if (s) // sprite extsts
- {
- if (! s->SeqTest(-1)) c = comtab + c->Val; // not parked
- else ++ c;
- }
- else ++ c;
- }
- else
- {
- SNPOST(c->Com, c->Ref, c->Val, spr);
- if (c->Ptr) break;
- else ++ c;
}
- }
- }
- }
}
-
-
-
-
-//--------------------------------------------------------------------------
-
-const char * SNAIL::ComTxt[] = { "LABEL", "PAUSE", "WAIT", "LEVEL",
- "HIDE", "SAY", "INF", "TIME",
- "CAVE", "KILL", "RSEQ",
- "SEQ", "SEND", "SWAP", "KEEP", "GIVE",
- "IF", "GAME", "SETX0", "SETY0", "SLAVE",
- "SETXY", "RELX", "RELY", "RELZ",
- "SETX", "SETY", "SETZ", "TRANS", "PORT",
- "NEXT","NNEXT", "TNEXT", "RNNEXT", "RTNEXT",
- "RMNEAR", "RMTAKE", "FLAG", "SETREF",
- "BACKPT", "FLASH", "LIGHT",
- "SETHB", "SETVB",
- "WALK", "REACH", "COVER", "UNCOVER",
- "CLEAR", "TALK", "MOUSE",
- "SOUND", "COUNT",
- NULL };
-
-
-
-SNAIL::SNAIL (bool turbo)
-: Turbo(turbo), Busy(false), TextDelay(false),
- Pause(0), TalkEnable(true),
- Head(0), Tail(0), SNList(farnew(COM, 256))
-{
+const char *SNAIL::ComTxt[] = {
+ "LABEL", "PAUSE", "WAIT", "LEVEL", "HIDE",
+ "SAY", "INF", "TIME", "CAVE", "KILL",
+ "RSEQ", "SEQ", "SEND", "SWAP", "KEEP",
+ "GIVE", "IF", "GAME", "SETX0", "SETY0",
+ "SLAVE", "SETXY", "RELX", "RELY", "RELZ",
+ "SETX", "SETY", "SETZ", "TRANS", "PORT",
+ "NEXT", "NNEXT", "TNEXT", "RNNEXT", "RTNEXT",
+ "RMNEAR", "RMTAKE", "FLAG", "SETREF", "BACKPT",
+ "FLASH", "LIGHT", "SETHB", "SETVB", "WALK",
+ "REACH", "COVER", "UNCOVER", "CLEAR", "TALK",
+ "MOUSE", "SOUND", "COUNT", NULL
+};
+
+
+SNAIL::SNAIL(bool turbo)
+ : Turbo(turbo), Busy(false), TextDelay(false),
+ Pause(0), TalkEnable(true),
+ Head(0), Tail(0), SNList(farnew(COM, 256)) {
}
-
-
-
-
-SNAIL::~SNAIL (void)
-{
- if (SNList) free(SNList);
+SNAIL::~SNAIL(void) {
+ if (SNList)
+ free(SNList);
}
-
-
-
-
-void SNAIL::AddCom (SNCOM com, int ref, int val, void * ptr)
-{
- _disable();
- COM * snc = &SNList[Head ++];
- snc->Com = com;
- snc->Ref = ref;
- snc->Val = val;
- snc->Ptr = ptr;
- if (com == SNCLEAR)
- {
- Tail = Head;
- KillText();
- Pause = 0;
- }
- _enable();
+void SNAIL::AddCom(SNCOM com, int ref, int val, void *ptr) {
+ _disable();
+ COM *snc = &SNList[Head ++];
+ snc->Com = com;
+ snc->Ref = ref;
+ snc->Val = val;
+ snc->Ptr = ptr;
+ if (com == SNCLEAR) {
+ Tail = Head;
+ KillText();
+ Pause = 0;
+ }
+ _enable();
}
-
-
-void SNAIL::InsCom (SNCOM com, int ref, int val, void * ptr)
-{
- COM * snc;
-
- _disable();
- if (Busy)
- {
- SNList[(Tail-1)&0xFF] = SNList[Tail];
- snc = &SNList[Tail];
- }
- else snc = &SNList[(Tail-1)&0xFF];
- -- Tail;
- snc->Com = com;
- snc->Ref = ref;
- snc->Val = val;
- snc->Ptr = ptr;
- if (com == SNCLEAR)
- {
- Tail = Head;
- KillText();
- Pause = 0;
- }
- _enable();
+void SNAIL::InsCom(SNCOM com, int ref, int val, void *ptr) {
+ COM *snc;
+
+ _disable();
+ if (Busy) {
+ SNList[(Tail - 1) & 0xFF] = SNList[Tail];
+ snc = &SNList[Tail];
+ } else
+ snc = &SNList[(Tail - 1) & 0xFF];
+ --Tail;
+ snc->Com = com;
+ snc->Ref = ref;
+ snc->Val = val;
+ snc->Ptr = ptr;
+ if (com == SNCLEAR) {
+ Tail = Head;
+ KillText();
+ Pause = 0;
+ }
+ _enable();
}
-
-
-
-
-
-static void SNNNext(SPRITE * sprel, int p)
-{
- if (sprel) if (sprel->NearPtr != NO_PTR) sprel->NearPtr = p;
+static void SNNNext(SPRITE *sprel, int p) {
+ if (sprel)
+ if (sprel->NearPtr != NO_PTR)
+ sprel->NearPtr = p;
}
-
-
-
-
-static void SNTNext(SPRITE * sprel, int p)
-{
- if (sprel) if (sprel->TakePtr != NO_PTR) sprel->TakePtr = p;
+static void SNTNext(SPRITE *sprel, int p) {
+ if (sprel)
+ if (sprel->TakePtr != NO_PTR)
+ sprel->TakePtr = p;
}
-
-
-
-
-static void SNRNNext(SPRITE * sprel, int p)
-{
- if (sprel) if (sprel->NearPtr != NO_PTR) sprel->NearPtr += p;
+static void SNRNNext(SPRITE *sprel, int p) {
+ if (sprel)
+ if (sprel->NearPtr != NO_PTR)
+ sprel->NearPtr += p;
}
-
-
-
-
-static void SNRTNext(SPRITE * sprel, int p)
-{
- if (sprel) if (sprel->TakePtr != NO_PTR) sprel->TakePtr += p;
+static void SNRTNext(SPRITE *sprel, int p) {
+ if (sprel)
+ if (sprel->TakePtr != NO_PTR)
+ sprel->TakePtr += p;
}
-
-
-
-
-static void SNZTrim (SPRITE * spr)
-{
- if (spr) if (spr->Active())
- {
- bool en = HEART::Enable;
- SPRITE * s;
- HEART::Enable = false;
- s = (spr->Flags.Shad) ? spr->Prev : NULL;
- VGA::ShowQ.Insert(VGA::ShowQ.Remove(spr));
- if (s)
- {
- s->Z = spr->Z;
- VGA::ShowQ.Insert(VGA::ShowQ.Remove(s), spr);
- }
- HEART::Enable = en;
- }
+static void SNZTrim(SPRITE *spr) {
+ if (spr)
+ if (spr->Active()) {
+ bool en = HEART::Enable;
+ SPRITE *s;
+ HEART::Enable = false;
+ s = (spr->Flags.Shad) ? spr->Prev : NULL;
+ VGA::ShowQ.Insert(VGA::ShowQ.Remove(spr));
+ if (s) {
+ s->Z = spr->Z;
+ VGA::ShowQ.Insert(VGA::ShowQ.Remove(s), spr);
+ }
+ HEART::Enable = en;
+ }
}
-
-
-
-
-static void SNHide (SPRITE * spr, int val)
-{
- if (spr)
- {
- spr->Flags.Hide = (val >= 0) ? (val != 0) : (! spr->Flags.Hide);
- if (spr->Flags.Shad) spr->Prev->Flags.Hide = spr->Flags.Hide;
- }
+static void SNHide(SPRITE *spr, int val) {
+ if (spr) {
+ spr->Flags.Hide = (val >= 0) ? (val != 0) : (! spr->Flags.Hide);
+ if (spr->Flags.Shad)
+ spr->Prev->Flags.Hide = spr->Flags.Hide;
+ }
}
-
-
-
-static void SNRmNear (SPRITE * spr)
-{
- if (spr) spr->NearPtr = NO_PTR;
+static void SNRmNear(SPRITE *spr) {
+ if (spr)
+ spr->NearPtr = NO_PTR;
}
-
-
-
-static void SNRmTake (SPRITE * spr)
-{
- if (spr) spr->TakePtr = NO_PTR;
+static void SNRmTake(SPRITE *spr) {
+ if (spr)
+ spr->TakePtr = NO_PTR;
}
-
-
-
-void SNSeq (SPRITE * spr, int val)
-{
- if (spr)
- {
- if (spr == Hero && val == 0) Hero->Park();
- else spr->Step(val);
- }
+void SNSeq(SPRITE *spr, int val) {
+ if (spr) {
+ if (spr == Hero && val == 0)
+ Hero->Park();
+ else
+ spr->Step(val);
+ }
}
-
-
-
-void SNRSeq (SPRITE * spr, int val)
-{
- if (spr) SNSeq(spr, spr->SeqPtr + val);
+void SNRSeq(SPRITE *spr, int val) {
+ if (spr)
+ SNSeq(spr, spr->SeqPtr + val);
}
-
-
-
-void SNSend (SPRITE * spr, int val)
-{
- if (spr)
- {
- int was = spr->Cave;
- bool was1 = (was == 0 || was == Now);
- bool val1 = (val == 0 || val == Now);
- spr->Cave = val;
- if (val1 != was1)
- {
- if (was1)
- {
- if (spr->Flags.Kept)
- {
- int n = FindPocket(spr);
- if (n >= 0) Pocket[n] = NULL;
+void SNSend(SPRITE *spr, int val) {
+ if (spr) {
+ int was = spr->Cave;
+ bool was1 = (was == 0 || was == Now);
+ bool val1 = (val == 0 || val == Now);
+ spr->Cave = val;
+ if (val1 != was1) {
+ if (was1) {
+ if (spr->Flags.Kept) {
+ int n = FindPocket(spr);
+ if (n >= 0)
+ Pocket[n] = NULL;
+ }
+ Hide1(spr);
+ ContractSprite(spr);
+ spr->Flags.Slav = false;
+ } else {
+ if (spr->Ref % 1000 == 0)
+ BITMAP::Pal = SysPal;
+ if (spr->Flags.Back)
+ spr->BackShow(true);
+ else
+ ExpandSprite(spr);
+ BITMAP::Pal = NULL;
+ }
}
- Hide1(spr);
- ContractSprite(spr);
- spr->Flags.Slav = false;
- }
- else
- {
- if (spr->Ref % 1000 == 0) BITMAP::Pal = SysPal;
- if (spr->Flags.Back) spr->BackShow(true);
- else ExpandSprite(spr);
- BITMAP::Pal = NULL;
- }
}
- }
}
-
-
-
-void SNSwap (SPRITE * spr, int xref)
-{
- SPRITE * xspr = Locate(xref);
- if (spr && xspr)
- {
- int was = spr->Cave;
- int xwas = xspr->Cave;
- bool was1 = (was == 0 || was == Now);
- bool xwas1 = (xwas == 0 || xwas == Now);
-
- Swap(spr->Cave, xspr->Cave);
- Swap(spr->X, xspr->X);
- Swap(spr->Y, xspr->Y);
- Swap(spr->Z, xspr->Z);
- if (spr->Flags.Kept)
- {
- int n = FindPocket(spr);
- if (n >= 0) Pocket[n] = xspr;
- xspr->Flags.Kept = true;
- xspr->Flags.Port = false;
- }
- if (xwas1 != was1)
- {
- if (was1)
- {
- Hide1(spr);
- ContractSprite(spr);
- }
- else ExpandSprite(spr);
- if (xwas1)
- {
- Hide1(xspr);
- ContractSprite(xspr);
- }
- else ExpandSprite(xspr);
+void SNSwap(SPRITE *spr, int xref) {
+ SPRITE *xspr = Locate(xref);
+ if (spr && xspr) {
+ int was = spr->Cave;
+ int xwas = xspr->Cave;
+ bool was1 = (was == 0 || was == Now);
+ bool xwas1 = (xwas == 0 || xwas == Now);
+
+ Swap(spr->Cave, xspr->Cave);
+ Swap(spr->X, xspr->X);
+ Swap(spr->Y, xspr->Y);
+ Swap(spr->Z, xspr->Z);
+ if (spr->Flags.Kept) {
+ int n = FindPocket(spr);
+ if (n >= 0)
+ Pocket[n] = xspr;
+ xspr->Flags.Kept = true;
+ xspr->Flags.Port = false;
+ }
+ if (xwas1 != was1) {
+ if (was1) {
+ Hide1(spr);
+ ContractSprite(spr);
+ } else
+ ExpandSprite(spr);
+ if (xwas1) {
+ Hide1(xspr);
+ ContractSprite(xspr);
+ } else
+ ExpandSprite(xspr);
+ }
}
- }
}
-
-
-
-void SNCover (SPRITE * spr, int xref)
-{
- SPRITE * xspr = Locate(xref);
- if (spr && xspr)
- {
- spr->Flags.Hide = true;
- xspr->Z = spr->Z;
- xspr->Cave = spr->Cave;
- xspr->Goto(spr->X, spr->Y);
- ExpandSprite(xspr);
- if ((xspr->Flags.Shad = spr->Flags.Shad) == TRUE)
- {
- VGA::ShowQ.Insert(VGA::ShowQ.Remove(spr->Prev), xspr);
- spr->Flags.Shad = false;
+void SNCover(SPRITE *spr, int xref) {
+ SPRITE *xspr = Locate(xref);
+ if (spr && xspr) {
+ spr->Flags.Hide = true;
+ xspr->Z = spr->Z;
+ xspr->Cave = spr->Cave;
+ xspr->Goto(spr->X, spr->Y);
+ ExpandSprite(xspr);
+ if ((xspr->Flags.Shad = spr->Flags.Shad) == TRUE) {
+ VGA::ShowQ.Insert(VGA::ShowQ.Remove(spr->Prev), xspr);
+ spr->Flags.Shad = false;
+ }
+ FeedSnail(xspr, NEAR);
}
- FeedSnail(xspr, NEAR);
- }
}
-
-
-
-void SNUncover (SPRITE * spr, SPRITE * xspr)
-{
- if (spr && xspr)
- {
- spr->Flags.Hide = false;
- spr->Cave = xspr->Cave;
- spr->Goto(xspr->X, xspr->Y);
- if ((spr->Flags.Shad = xspr->Flags.Shad) == TRUE)
- {
- VGA::ShowQ.Insert(VGA::ShowQ.Remove(xspr->Prev), spr);
- xspr->Flags.Shad = false;
+void SNUncover(SPRITE *spr, SPRITE *xspr) {
+ if (spr && xspr) {
+ spr->Flags.Hide = false;
+ spr->Cave = xspr->Cave;
+ spr->Goto(xspr->X, xspr->Y);
+ if ((spr->Flags.Shad = xspr->Flags.Shad) == TRUE) {
+ VGA::ShowQ.Insert(VGA::ShowQ.Remove(xspr->Prev), spr);
+ xspr->Flags.Shad = false;
+ }
+ spr->Z = xspr->Z;
+ SNSend(xspr, -1);
+ if (spr->Time == 0)
+ ++spr->Time;
}
- spr->Z = xspr->Z;
- SNSend(xspr, -1);
- if (spr->Time == 0) ++ spr->Time;
- }
}
-
-
-
-void SNSetX0 (int cav, int x0)
-{
- HeroXY[cav-1].X = x0;
+void SNSetX0(int cav, int x0) {
+ HeroXY[cav - 1].X = x0;
}
-
-
-
-void SNSetY0 (int cav, int y0)
-{
- HeroXY[cav-1].Y = y0;
+void SNSetY0(int cav, int y0) {
+ HeroXY[cav - 1].Y = y0;
}
-
-
-
-void SNSetXY (SPRITE * spr, uint16 xy)
-{
- if (spr)
- {
- spr->Goto(xy % SCR_WID, xy / SCR_WID);
- }
+void SNSetXY(SPRITE *spr, uint16 xy) {
+ if (spr)
+ spr->Goto(xy % SCR_WID, xy / SCR_WID);
}
-
-
-
-void SNRelX (SPRITE * spr, int x)
-{
- if (spr && Hero)
- {
- spr->Goto(Hero->X + x, spr->Y);
- }
+void SNRelX(SPRITE *spr, int x) {
+ if (spr && Hero)
+ spr->Goto(Hero->X + x, spr->Y);
}
-
-
-
-void SNRelY (SPRITE * spr, int y)
-{
- if (spr && Hero)
- {
- spr->Goto(spr->X, Hero->Y + y);
- }
+void SNRelY(SPRITE *spr, int y) {
+ if (spr && Hero)
+ spr->Goto(spr->X, Hero->Y + y);
}
-
-
-
-void SNRelZ (SPRITE * spr, int z)
-{
- if (spr && Hero)
- {
- spr->Z = Hero->Z + z;
- SNZTrim(spr);
- }
+void SNRelZ(SPRITE *spr, int z) {
+ if (spr && Hero) {
+ spr->Z = Hero->Z + z;
+ SNZTrim(spr);
+ }
}
-
-
-
-void SNSetX (SPRITE * spr, int x)
-{
- if (spr)
- {
- spr->Goto(x, spr->Y);
- }
+void SNSetX(SPRITE *spr, int x) {
+ if (spr)
+ spr->Goto(x, spr->Y);
}
-
-
-
-void SNSetY (SPRITE * spr, int y)
-{
- if (spr)
- {
- spr->Goto(spr->X, y);
- }
+void SNSetY(SPRITE *spr, int y) {
+ if (spr)
+ spr->Goto(spr->X, y);
}
-
-
-
-void SNSetZ (SPRITE * spr, int z)
-{
- if (spr)
- {
- spr->Z = z;
- //SNPOST_(SNZTRIM, -1, 0, spr);
- SNZTrim(spr);
- }
+void SNSetZ(SPRITE *spr, int z) {
+ if (spr) {
+ spr->Z = z;
+ //SNPOST_(SNZTRIM, -1, 0, spr);
+ SNZTrim(spr);
+ }
}
-
-
-
-void SNSlave (SPRITE * spr, int ref)
-{
- SPRITE * slv = Locate(ref);
- if (spr && slv)
- {
- if (spr->Active())
- {
- SNSend(slv, spr->Cave);
- slv->Flags.Slav = true;
- slv->Z = spr->Z;
- VGA::ShowQ.Insert(VGA::ShowQ.Remove(slv), spr->Next);
+void SNSlave(SPRITE *spr, int ref) {
+ SPRITE *slv = Locate(ref);
+ if (spr && slv) {
+ if (spr->Active()) {
+ SNSend(slv, spr->Cave);
+ slv->Flags.Slav = true;
+ slv->Z = spr->Z;
+ VGA::ShowQ.Insert(VGA::ShowQ.Remove(slv), spr->Next);
+ }
}
- }
}
-
-
-
-void SNTrans (SPRITE * spr, int trans)
-{
- if (spr)
- {
- spr->Flags.Tran = (trans < 0) ? !spr->Flags.Tran : (trans != 0);
- }
+void SNTrans(SPRITE *spr, int trans) {
+ if (spr)
+ spr->Flags.Tran = (trans < 0) ? !spr->Flags.Tran : (trans != 0);
}
-
-
-
-void SNPort (SPRITE * spr, int port)
-{
- if (spr)
- {
- spr->Flags.Port = (port < 0) ? !spr->Flags.Port : (port != 0);
- }
+void SNPort(SPRITE *spr, int port) {
+ if (spr)
+ spr->Flags.Port = (port < 0) ? !spr->Flags.Port : (port != 0);
}
-
-
-
-void SNKill (SPRITE * spr)
-{
- if (spr)
- {
- if (spr->Flags.Kept)
- {
- int n = FindPocket(spr);
- if (n >= 0) Pocket[n] = NULL;
- }
- SPRITE * nx = spr->Next;
- Hide1(spr);
- VGA::ShowQ.Remove(spr);
- MOUSE::ClrEvt(spr);
- if (spr->Flags.Kill) delete spr;
- else
- {
- spr->Cave = -1;
- VGA::SpareQ.Append(spr);
+void SNKill(SPRITE *spr) {
+ if (spr) {
+ if (spr->Flags.Kept) {
+ int n = FindPocket(spr);
+ if (n >= 0)
+ Pocket[n] = NULL;
+ }
+ SPRITE *nx = spr->Next;
+ Hide1(spr);
+ VGA::ShowQ.Remove(spr);
+ MOUSE::ClrEvt(spr);
+ if (spr->Flags.Kill)
+ delete spr;
+ else {
+ spr->Cave = -1;
+ VGA::SpareQ.Append(spr);
+ }
+ if (nx)
+ if (nx->Flags.Slav)
+ SNKill(nx);
}
- if (nx) if (nx->Flags.Slav) SNKill(nx);
- }
}
-
-
-
-static void SNSound (SPRITE * spr, int wav, int cnt)
-{
- if (SNDDrvInfo.DDEV)
- {
- if (wav == -1) Sound.Stop();
- else
- Sound.Play(Fx[wav], (spr) ? ((spr->X+spr->W/2)/(SCR_WID/16)) : 8, cnt);
- }
+static void SNSound(SPRITE *spr, int wav, int cnt) {
+ if (SNDDrvInfo.DDEV) {
+ if (wav == -1)
+ Sound.Stop();
+ else
+ Sound.Play(Fx[wav], (spr) ? ((spr->X + spr->W / 2) / (SCR_WID / 16)) : 8, cnt);
+ }
}
-
-
-
-void SNKeep (SPRITE * spr, int stp)
-{
- SelectPocket(-1);
- if (spr && ! spr->Flags.Kept && Pocket[PocPtr] == NULL)
- {
- SNSound(spr, 3, 1);
- Pocket[PocPtr] = spr;
- spr->Cave = 0;
- spr->Flags.Kept = true;
- spr->Goto(POCKET_X + POCKET_DX*PocPtr + POCKET_DX/2 - spr->W/2,
- POCKET_Y + POCKET_DY/2 - spr->H/2);
- if (stp >= 0) spr->Step(stp);
- }
- SelectPocket(-1);
+void SNKeep(SPRITE *spr, int stp) {
+ SelectPocket(-1);
+ if (spr && ! spr->Flags.Kept && Pocket[PocPtr] == NULL) {
+ SNSound(spr, 3, 1);
+ Pocket[PocPtr] = spr;
+ spr->Cave = 0;
+ spr->Flags.Kept = true;
+ spr->Goto(POCKET_X + POCKET_DX * PocPtr + POCKET_DX / 2 - spr->W / 2,
+ POCKET_Y + POCKET_DY / 2 - spr->H / 2);
+ if (stp >= 0)
+ spr->Step(stp);
+ }
+ SelectPocket(-1);
}
-
-
-
-
-void SNGive (SPRITE * spr, int stp)
-{
- if (spr)
- {
- int p = FindPocket(spr);
- if (p >= 0)
- {
- Pocket[p] = NULL;
- spr->Cave = Now;
- spr->Flags.Kept = false;
- if (stp >= 0) spr->Step(stp);
+void SNGive(SPRITE *spr, int stp) {
+ if (spr) {
+ int p = FindPocket(spr);
+ if (p >= 0) {
+ Pocket[p] = NULL;
+ spr->Cave = Now;
+ spr->Flags.Kept = false;
+ if (stp >= 0)
+ spr->Step(stp);
+ }
}
- }
- SelectPocket(-1);
+ SelectPocket(-1);
}
-
-
-static void SNBackPt (SPRITE * spr, int stp)
-{
- if (spr)
- {
- if (stp >= 0) spr->Step(stp);
- spr->BackShow(true);
- }
+static void SNBackPt(SPRITE *spr, int stp) {
+ if (spr) {
+ if (stp >= 0)
+ spr->Step(stp);
+ spr->BackShow(true);
+ }
}
-
-
-
-static void SNLevel (SPRITE * spr, int lev)
-{
- #ifdef DEMO
- static int maxcav[] = { CAVE_MAX };
- #else
- static int maxcav[] = { 1, 8, 16, 23, 24 };
- #endif
- while (Lev < lev)
- {
- SPRITE * spr;
- ++ Lev;
- spr = VGA::SpareQ.Locate(100+Lev);
- if (spr)
- {
- spr->BackShow(true);
- spr->Cave = 0;
+static void SNLevel(SPRITE *spr, int lev) {
+#ifdef DEMO
+ static int maxcav[] = { CAVE_MAX };
+#else
+ static int maxcav[] = { 1, 8, 16, 23, 24 };
+#endif
+ while (Lev < lev) {
+ SPRITE *spr;
+ ++Lev;
+ spr = VGA::SpareQ.Locate(100 + Lev);
+ if (spr) {
+ spr->BackShow(true);
+ spr->Cave = 0;
+ }
}
- }
- MaxCave = maxcav[Lev];
- if (spr) spr->Flags.Hide = false;
+ MaxCave = maxcav[Lev];
+ if (spr)
+ spr->Flags.Hide = false;
}
-
-
-
-
-static void SNFlag (int fn, bool v)
-{
- Flag[fn] = v;
+static void SNFlag(int fn, bool v) {
+ Flag[fn] = v;
}
-
-
-
-
-static void SNSetRef (SPRITE * spr, int nr)
-{
- if (spr)
- {
- spr->Ref = nr;
- }
+static void SNSetRef(SPRITE *spr, int nr) {
+ if (spr)
+ spr->Ref = nr;
}
-
-
-void SNFlash (bool on)
-{
- if (on)
- {
- DAC * pal = farnew(DAC, PAL_CNT);
- if (pal)
- {
- int i;
- memcpy(pal, SysPal, PAL_SIZ);
- for (i = 0; i < PAL_CNT; i ++)
- {
- register int c;
- c = pal[i].R << 1; pal[i].R = (c < 64) ? c : 63;
- c = pal[i].G << 1; pal[i].G = (c < 64) ? c : 63;
- c = pal[i].B << 1; pal[i].B = (c < 64) ? c : 63;
- }
- VGA::SetColors(pal, 64);
- }
- }
- else VGA::SetColors(SysPal, 64);
- Dark = false;
+void SNFlash(bool on) {
+ if (on) {
+ DAC *pal = farnew(DAC, PAL_CNT);
+ if (pal) {
+ memcpy(pal, SysPal, PAL_SIZ);
+ for (int i = 0; i < PAL_CNT; i ++) {
+ register int c;
+ c = pal[i].R << 1;
+ pal[i].R = (c < 64) ? c : 63;
+ c = pal[i].G << 1;
+ pal[i].G = (c < 64) ? c : 63;
+ c = pal[i].B << 1;
+ pal[i].B = (c < 64) ? c : 63;
+ }
+ VGA::SetColors(pal, 64);
+ }
+ } else
+ VGA::SetColors(SysPal, 64);
+ Dark = false;
}
-
-
-
-static void SNLight (bool in)
-{
- if (in) VGA::Sunrise(SysPal);
- else VGA::Sunset();
- Dark = ! in;
+static void SNLight(bool in) {
+ if (in)
+ VGA::Sunrise(SysPal);
+ else
+ VGA::Sunset();
+ Dark = ! in;
}
-
-
-
-static void SNBarrier (int cav, int bar, bool horz)
-{
- ((uint8 *) (Barriers + ((cav > 0) ? cav : Now)))[horz] = bar;
+static void SNBarrier(int cav, int bar, bool horz) {
+ ((uint8 *)(Barriers + ((cav > 0) ? cav : Now)))[horz] = bar;
}
-
-
-
-static void SNWalk (SPRITE * spr, int x, int y)
-{
- if (Hero)
- {
- if (spr && y < 0) Hero->FindWay(spr);
- else Hero->FindWay(XZ(x, y));
- }
+static void SNWalk(SPRITE *spr, int x, int y) {
+ if (Hero) {
+ if (spr && y < 0)
+ Hero->FindWay(spr);
+ else
+ Hero->FindWay(XZ(x, y));
+ }
}
-
-
-
-static void SNReach (SPRITE * spr, int mode)
-{
- if (Hero) Hero->Reach(spr, mode);
+static void SNReach(SPRITE *spr, int mode) {
+ if (Hero)
+ Hero->Reach(spr, mode);
}
-
-
-
-
-static void SNMouse (bool on)
-{
- if (on) Mouse.On();
- else Mouse.Off();
+static void SNMouse(bool on) {
+ if (on)
+ Mouse.On();
+ else
+ Mouse.Off();
}
+void SNAIL::RunCom(void) {
+ static int count = 1;
+ extern void SwitchCave(int);
+ if (! Busy) {
+ Busy = true;
+ uint8 tmphea = Head;
+ while (Tail != tmphea) {
+ COM *snc = &SNList[Tail];
+
+ if (! Turbo) { // only for the slower one
+ if (Pause)
+ break;
+ else {
+ if (TextDelay) {
+ KillText();
+ TextDelay = false;
+ }
+ }
+ if (Talk && snc->Com != SNPAUSE)
+ break;
+ }
-
-
-
-void SNAIL::RunCom (void)
-{
- static int count = 1;
- extern void SwitchCave(int);
- if (! Busy)
- {
- Busy = true;
- uint8 tmphea = Head;
- while (Tail != tmphea)
- {
- COM * snc = &SNList[Tail];
-
- if (! Turbo) // only for the slower one
- {
- if (Pause) break;
- else
- {
- if (TextDelay)
- {
- KillText();
- TextDelay = false;
- }
- }
- if (Talk && snc->Com != SNPAUSE) break;
- }
-
- SPRITE * sprel = ((snc->Ref >= 0) ? Locate(snc->Ref)
- : ((SPRITE *) snc->Ptr));
- switch (snc->Com)
- {
- case SNLABEL : break;
- case SNPAUSE : HEART::SetXTimer(&Pause, snc->Val);
- if (Talk) TextDelay = true; break;
- case SNWAIT : if (sprel)
- {
- if (sprel->SeqTest(snc->Val) &&
- (snc->Val >= 0 || sprel != Hero || Hero->TracePtr < 0))
- {
- HEART::SetXTimer(&Pause, sprel->Time);
- }
- else goto xit;
- }
+ SPRITE *sprel = ((snc->Ref >= 0) ? Locate(snc->Ref) : ((SPRITE *) snc->Ptr));
+ switch (snc->Com) {
+ case SNLABEL :
+ break;
+ case SNPAUSE :
+ HEART::SetXTimer(&Pause, snc->Val);
+ if (Talk)
+ TextDelay = true;
+ break;
+ case SNWAIT :
+ if (sprel) {
+ if (sprel->SeqTest(snc->Val) &&
+ (snc->Val >= 0 || sprel != Hero || Hero->TracePtr < 0)) {
+ HEART::SetXTimer(&Pause, sprel->Time);
+ } else
+ goto xit;
+ }
+ break;
+ case SNLEVEL :
+ SNLevel(sprel, snc->Val);
+ break;
+ case SNHIDE :
+ SNHide(sprel, snc->Val);
+ break;
+ case SNSAY :
+ if (sprel && TalkEnable) {
+ if (sprel == Hero && sprel->SeqTest(-1))
+ sprel->Step(HTALK);
+ Say(Text[snc->Val], sprel);
+ SYSTEM::FunDel = HEROFUN0;
+ }
+ break;
+ case SNINF :
+ if (TalkEnable) {
+ Inf(Text[snc->Val]);
+ SYSTEM::FunDel = HEROFUN0;
+ }
+ break;
+ case SNTIME :
+ if (sprel && TalkEnable) {
+ if (sprel == Hero && sprel->SeqTest(-1))
+ sprel->Step(HTALK);
+ SayTime(sprel);
+ }
+ break;
+ case SNCAVE :
+ SwitchCave(snc->Val);
+ break;
+ case SNKILL :
+ SNKill(sprel);
+ break;
+ case SNSEQ :
+ SNSeq(sprel, snc->Val);
+ break;
+ case SNRSEQ :
+ SNRSeq(sprel, snc->Val);
+ break;
+ case SNSEND :
+ SNSend(sprel, snc->Val);
+ break;
+ case SNSWAP :
+ SNSwap(sprel, snc->Val);
+ break;
+ case SNCOVER :
+ SNCover(sprel, snc->Val);
+ break;
+ case SNUNCOVER :
+ SNUncover(sprel, (snc->Val >= 0) ? Locate(snc->Val) : ((SPRITE *) snc->Ptr));
+ break;
+ case SNKEEP :
+ SNKeep(sprel, snc->Val);
+ break;
+ case SNGIVE :
+ SNGive(sprel, snc->Val);
+ break;
+ case SNGAME :
+ SNGame(sprel, snc->Val);
+ break;
+ case SNSETX0 :
+ SNSetX0(snc->Ref, snc->Val);
+ break;
+ case SNSETY0 :
+ SNSetY0(snc->Ref, snc->Val);
break;
- case SNLEVEL : SNLevel(sprel, snc->Val); break;
- case SNHIDE : SNHide(sprel, snc->Val); break;
- case SNSAY : if (sprel && TalkEnable)
- {
- if (sprel == Hero && sprel->SeqTest(-1))
- sprel->Step(HTALK);
- Say(Text[snc->Val], sprel);
- SYSTEM::FunDel = HEROFUN0;
- }
+ case SNSETXY :
+ SNSetXY(sprel, snc->Val);
break;
- case SNINF : if (TalkEnable)
- {
- Inf(Text[snc->Val]);
- SYSTEM::FunDel = HEROFUN0;
- }
+ case SNRELX :
+ SNRelX(sprel, snc->Val);
break;
- case SNTIME : if (sprel && TalkEnable)
- {
- if (sprel == Hero && sprel->SeqTest(-1))
- sprel->Step(HTALK);
- SayTime(sprel);
- }
+ case SNRELY :
+ SNRelY(sprel, snc->Val);
break;
- case SNCAVE : SwitchCave(snc->Val); break;
- case SNKILL : SNKill(sprel); break;
- case SNSEQ : SNSeq(sprel, snc->Val); break;
- case SNRSEQ : SNRSeq(sprel, snc->Val); break;
- case SNSEND : SNSend(sprel, snc->Val); break;
- case SNSWAP : SNSwap(sprel, snc->Val); break;
- case SNCOVER : SNCover(sprel, snc->Val); break;
- case SNUNCOVER : SNUncover(sprel, (snc->Val >= 0) ? Locate(snc->Val)
- : ((SPRITE *) snc->Ptr));
+ case SNRELZ :
+ SNRelZ(sprel, snc->Val);
break;
- case SNKEEP : SNKeep(sprel, snc->Val); break;
- case SNGIVE : SNGive(sprel, snc->Val); break;
- case SNGAME : SNGame(sprel, snc->Val); break;
- case SNSETX0 : SNSetX0(snc->Ref, snc->Val); break;
- case SNSETY0 : SNSetY0(snc->Ref, snc->Val); break;
- case SNSETXY : SNSetXY(sprel, snc->Val); break;
- case SNRELX : SNRelX(sprel, snc->Val); break;
- case SNRELY : SNRelY(sprel, snc->Val); break;
- case SNRELZ : SNRelZ(sprel, snc->Val); break;
- case SNSETX : SNSetX(sprel, snc->Val); break;
- case SNSETY : SNSetY(sprel, snc->Val); break;
- case SNSETZ : SNSetZ(sprel, snc->Val); break;
- case SNSLAVE : SNSlave(sprel, snc->Val); break;
- case SNTRANS : SNTrans(sprel, snc->Val); break;
- case SNPORT : SNPort(sprel, snc->Val); break;
- case SNNEXT : break;
- case SNIF : break;
- case SNTALK : break;
- case SNMOUSE : SNMouse(snc->Val != 0); break;
- case SNNNEXT : SNNNext(sprel, snc->Val); break;
- case SNTNEXT : SNTNext(sprel, snc->Val); break;
- case SNRNNEXT : SNRNNext(sprel, snc->Val); break;
- case SNRTNEXT : SNRTNext(sprel, snc->Val); break;
- case SNRMNEAR : SNRmNear(sprel); break;
- case SNRMTAKE : SNRmTake(sprel); break;
- case SNFLAG : SNFlag(snc->Ref & 3, snc->Val != 0); break;
- case SNSETREF : SNSetRef(sprel, snc->Val); break;
- case SNBACKPT : SNBackPt(sprel, snc->Val); break;
- case SNFLASH : SNFlash(snc->Val != 0); break;
- case SNLIGHT : SNLight(snc->Val != 0); break;
- case SNSETHB : SNBarrier(snc->Ref, snc->Val, true); break;
- case SNSETVB : SNBarrier(snc->Ref, snc->Val, false); break;
- case SNWALK : SNWalk(sprel, snc->Ref, snc->Val); break;
- case SNREACH : SNReach(sprel, snc->Val); break;
- case SNSOUND : SNSound(sprel, snc->Val, count); count = 1; break;
- case SNCOUNT : count = snc->Val; break;
-
- // TODO: Handle correctly the execution of function pointer coming from Message send SNPOST
- //case SNEXEC : ((void(*)(int)) (snc->Ptr))(snc->Val); break;
- case SNEXEC : warning("STUB: SNEXEC code");
- case SNSTEP : sprel->Step(); break;
- case SNZTRIM : SNZTrim(sprel); break;
- case SNGHOST : SNGhost((BITMAP *) snc->Ptr); break;
- }
- ++ Tail;
- if (! Turbo) break;
+ case SNSETX :
+ SNSetX(sprel, snc->Val);
+ break;
+ case SNSETY :
+ SNSetY(sprel, snc->Val);
+ break;
+ case SNSETZ :
+ SNSetZ(sprel, snc->Val);
+ break;
+ case SNSLAVE :
+ SNSlave(sprel, snc->Val);
+ break;
+ case SNTRANS :
+ SNTrans(sprel, snc->Val);
+ break;
+ case SNPORT :
+ SNPort(sprel, snc->Val);
+ break;
+ case SNNEXT :
+ break;
+ case SNIF :
+ break;
+ case SNTALK :
+ break;
+ case SNMOUSE :
+ SNMouse(snc->Val != 0);
+ break;
+ case SNNNEXT :
+ SNNNext(sprel, snc->Val);
+ break;
+ case SNTNEXT :
+ SNTNext(sprel, snc->Val);
+ break;
+ case SNRNNEXT :
+ SNRNNext(sprel, snc->Val);
+ break;
+ case SNRTNEXT :
+ SNRTNext(sprel, snc->Val);
+ break;
+ case SNRMNEAR :
+ SNRmNear(sprel);
+ break;
+ case SNRMTAKE :
+ SNRmTake(sprel);
+ break;
+ case SNFLAG :
+ SNFlag(snc->Ref & 3, snc->Val != 0);
+ break;
+ case SNSETREF :
+ SNSetRef(sprel, snc->Val);
+ break;
+ case SNBACKPT :
+ SNBackPt(sprel, snc->Val);
+ break;
+ case SNFLASH :
+ SNFlash(snc->Val != 0);
+ break;
+ case SNLIGHT :
+ SNLight(snc->Val != 0);
+ break;
+ case SNSETHB :
+ SNBarrier(snc->Ref, snc->Val, true);
+ break;
+ case SNSETVB :
+ SNBarrier(snc->Ref, snc->Val, false);
+ break;
+ case SNWALK :
+ SNWalk(sprel, snc->Ref, snc->Val);
+ break;
+ case SNREACH :
+ SNReach(sprel, snc->Val);
+ break;
+ case SNSOUND :
+ SNSound(sprel, snc->Val, count);
+ count = 1;
+ break;
+ case SNCOUNT :
+ count = snc->Val;
+ break;
+ case SNEXEC :
+ // TODO: Handle correctly the execution of function pointer coming from Message send SNPOST
+ // ((void(*)(int)) (snc->Ptr))(snc->Val); break;
+ warning("STUB: SNEXEC code");
+ case SNSTEP :
+ sprel->Step();
+ break;
+ case SNZTRIM :
+ SNZTrim(sprel);
+ break;
+ case SNGHOST :
+ SNGhost((BITMAP *) snc->Ptr);
+ break;
+ }
+ ++Tail;
+ if (!Turbo)
+ break;
+ }
+xit:
+ Busy = false;
}
- xit:
- Busy = false;
- }
}
-
-
-
-bool SNAIL::Idle (void)
-{
- return (Head == Tail);
+bool SNAIL::Idle(void) {
+ return (Head == Tail);
}
} // End of namespace CGE