📄 main.c
字号:
/* Digger Remastered
Copyright (c) Andrew Jenner 1998-2004 */
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include "def.h"
#include "hardware.h"
#include "sound.h"
#include "sprite.h"
#include "input.h"
#include "scores.h"
#include "drawing.h"
#include "digger.h"
#include "monster.h"
#include "bags.h"
#include "record.h"
#include "main.h"
#include "newsnd.h"
#include "ini.h"
#ifdef _WINDOWS
#include "win_dig.h"
#include "win_snd.h"
#include "win_vid.h"
#endif
struct game
{
Sint4 level;
bool levdone;
} gamedat[2];
char pldispbuf[14];
Sint4 curplayer=0,nplayers=1,penalty=0,diggers=1,startlev=5;
bool levnotdrawn=FALSE,alldead=FALSE,unlimlives=FALSE,started;
char levfname[FILENAME_BUFFER_SIZE];
bool levfflag=FALSE;
bool biosflag=FALSE;
Sint5 delaytime=0;
int gtime=0;
bool gauntlet=FALSE,timeout=FALSE,synchvid=FALSE;
void shownplayers(void);
void switchnplayers(void);
void drawscreen(void);
void initchars(void);
void checklevdone(void);
Sint4 levno(void);
void testpause(void);
void calibrate(void);
void parsecmd(int argc,char *argv[]);
void patchcga(void);
void initlevel(void);
void finish(void);
void inir(void);
void redefkeyb(bool allf);
int getalllives(void);
Sint3 leveldat[8][MHEIGHT][MWIDTH]=
{{"S B HHHHS",
"V CC C V B ",
"VB CC C V ",
"V CCB CB V CCC",
"V CC C V CCC",
"HH CC C V CCC",
" V B B V ",
" HHHH V ",
"C V V C",
"CC HHHHHHH CC"},
{"SHHHHH B B HS",
" CC V V ",
" CC V CCCCC V ",
"BCCB V CCCCC V ",
"CCCC V V ",
"CCCC V B HHHH ",
" CC V CC V ",
" BB VCCCCV CC ",
"C V CC V CC ",
"CC HHHHHH "},
{"SHHHHB B BHHHHS",
"CC V C C V BB ",
"C V C C V CC ",
" BB V C C VCCCC",
"CCCCV C C VCCCC",
"CCCCHHHHHHH CC ",
" CC C V C CC ",
" CC C V C ",
"C C V C C",
"CC C H C CC"},
{"SHBCCCCBCCCCBHS",
"CV CCCCCCC VC",
"CHHH CCCCC HHHC",
"C V CCC V C",
" HHH C HHH ",
" B V B V B ",
" C VCCCV C ",
" CCC HHHHH CCC ",
"CCCCC CVC CCCCC",
"CCCCC CHC CCCCC"},
{"SHHHHHHHHHHHHHS",
"VBCCCCBVCCCCCCV",
"VCCCCCCV CCBC V",
"V CCCC VCCBCCCV",
"VCCCCCCV CCCC V",
"V CCCC VBCCCCCV",
"VCCBCCCV CCCC V",
"V CCBC VCCCCCCV",
"VCCCCCCVCCCCCCV",
"HHHHHHHHHHHHHHH"},
{"SHHHHHHHHHHHHHS",
"VCBCCV V VCCBCV",
"VCCC VBVBV CCCV",
"VCCCHH V HHCCCV",
"VCC V CVC V CCV",
"VCCHH CVC HHCCV",
"VC V CCVCC V CV",
"VCHHBCCVCCBHHCV",
"VCVCCCCVCCCCVCV",
"HHHHHHHHHHHHHHH"},
{"SHCCCCCVCCCCCHS",
" VCBCBCVCBCBCV ",
"BVCCCCCVCCCCCVB",
"CHHCCCCVCCCCHHC",
"CCV CCCVCCC VCC",
"CCHHHCCVCCHHHCC",
"CCCCV CVC VCCCC",
"CCCCHH V HHCCCC",
"CCCCCV V VCCCCC",
"CCCCCHHHHHCCCCC"},
{"HHHHHHHHHHHHHHS",
"V CCBCCCCCBCC V",
"HHHCCCCBCCCCHHH",
"VBV CCCCCCC VBV",
"VCHHHCCCCCHHHCV",
"VCCBV CCC VBCCV",
"VCCCHHHCHHHCCCV",
"VCCCC V V CCCCV",
"VCCCCCV VCCCCCV",
"HHHHHHHHHHHHHHH"}};
Sint4 getlevch(Sint4 x,Sint4 y,Sint4 l)
{
if ((l==3 || l==4) && !levfflag && diggers==2 && y==9 && (x==6 || x==8))
return 'H';
return leveldat[l-1][y][x];
}
#ifdef INTDRF
extern FILE *info;
#endif
void game(void)
{
Sint4 t,c,i;
bool flashplayer=FALSE;
#ifdef _WINDOWS
show_game_menu();
#endif
if (gauntlet) {
cgtime=gtime*1193181l;
timeout=FALSE;
}
initlives();
gamedat[0].level=6;//startlev;
if (nplayers==2)
gamedat[1].level=startlev;
alldead=FALSE;
gclear();
curplayer=0;
initlevel();
curplayer=1;
initlevel();
zeroscores();
bonusvisible=TRUE;
if (nplayers==2)
flashplayer=TRUE;
curplayer=0;
while (getalllives()!=0 && !escape && !timeout) {
while (!alldead && !escape && !timeout) {
initmbspr();
if (playing)
randv=playgetrand();
else
randv=getlrt();
#ifdef INTDRF
fprintf(info,"%lu\n",randv);
frame=0;
#endif
recputrand(randv);
if (levnotdrawn) {
levnotdrawn=FALSE;
drawscreen();
if (flashplayer) {
flashplayer=FALSE;
strcpy(pldispbuf,"PLAYER ");
if (curplayer==0)
strcat(pldispbuf,"1");
else
strcat(pldispbuf,"2");
cleartopline();
for (t=0;t<15;t++)
for (c=1;c<=3;c++) {
outtext(pldispbuf,108,0,c);
writecurscore(c);
newframe();
if (escape)
return;
}
drawscores();
for (i=0;i<diggers;i++)
addscore(i,0);
}
}
else
initchars();
outtext(" ",108,0,3);
initscores();
drawlives();
music(1);
flushkeybuf();
for (i=0;i<diggers;i++)
readdir(i);
while (!alldead && !gamedat[curplayer].levdone && !escape && !timeout) {
penalty=0;
dodigger();
domonsters();
dobags();
if (penalty>8)
incmont(penalty-8);
testpause();
checklevdone();
}
erasediggers();
musicoff();
t=20;
while ((getnmovingbags()!=0 || t!=0) && !escape && !timeout) {
if (t!=0)
t--;
penalty=0;
dobags();
dodigger();
domonsters();
if (penalty<8)
t=0;
}
soundstop();
for (i=0;i<diggers;i++)
killfire(i);
erasebonus();
cleanupbags();
savefield();
erasemonsters();
recputeol();
if (playing)
playskipeol();
if (escape)
recputeog();
if (gamedat[curplayer].levdone)
soundlevdone();
if (countem()==0 || gamedat[curplayer].levdone) {
#ifdef INTDRF
fprintf(info,"%i\n",frame);
#endif
for (i=curplayer;i<diggers+curplayer;i++)
if (getlives(i)>0 && !digalive(i))
declife(i);
drawlives();
gamedat[curplayer].level++;
if (gamedat[curplayer].level>1000)
gamedat[curplayer].level=1000;
initlevel();
}
else
if (alldead) {
#ifdef INTDRF
fprintf(info,"%i\n",frame);
#endif
for (i=curplayer;i<curplayer+diggers;i++)
if (getlives(i)>0)
declife(i);
drawlives();
}
if ((alldead && getalllives()==0 && !gauntlet && !escape) || timeout)
endofgame();
}
alldead=FALSE;
if (nplayers==2 && getlives(1-curplayer)!=0) {
curplayer=1-curplayer;
flashplayer=levnotdrawn=TRUE;
}
}
#ifdef INTDRF
fprintf(info,"-1\n%lu\n%i",getscore0(),gamedat[0].level);
#endif
}
void maininit(void)
{
calibrate();
ginit();
gpal(0);
setretr(TRUE);
initkeyb();
detectjoy();
inir();
initsound();
recstart();
}
#ifndef _WINDOWS
int main(int argc,char *argv[])
{
maininit();
parsecmd(argc,argv);
return mainprog();
}
#endif
#ifdef _WINDOWS
Sint4 frame;
#endif
int mainprog(void)
{
Sint4 t,x;
#ifndef _WINDOWS
Sint4 frame;
#endif
loadscores();
escape=FALSE;
do {
#ifdef _WINDOWS
show_main_menu();
#endif
soundstop();
creatembspr();
detectjoy();
gclear();
gtitle();
outtext("D I G G E R",100,0,3);
shownplayers();
showtable();
started=FALSE;
frame=0;
newframe();
teststart();
#ifdef _WINDOWS
reset_main_menu_screen=FALSE;
#endif
while (!started) {
started=teststart();
#ifdef _WINDOWS
if ((getcommand()==19) &&
#else
if ((akeypressed==27 || akeypressed=='n' || akeypressed=='N') &&
#endif
!gauntlet && diggers==1) {
switchnplayers();
shownplayers();
akeypressed=0;
}
if (frame==0)
for (t=54;t<174;t+=12)
outtext(" ",164,t,0);
if (frame==50) {
movedrawspr(FIRSTMONSTER,292,63);
x=292;
}
if (frame>50 && frame<=77) {
x-=4;
drawmon(0,1,DIR_LEFT,x,63);
}
if (frame>77)
drawmon(0,1,DIR_RIGHT,184,63);
if (frame==83)
outtext("NOBBIN",216,64,2);
if (frame==90) {
movedrawspr(FIRSTMONSTER+1,292,82);
drawmon(1,0,DIR_LEFT,292,82);
x=292;
}
if (frame>90 && frame<=117) {
x-=4;
drawmon(1,0,DIR_LEFT,x,82);
}
if (frame>117)
drawmon(1,0,DIR_RIGHT,184,82);
if (frame==123)
outtext("HOBBIN",216,83,2);
if (frame==130) {
movedrawspr(FIRSTDIGGER,292,101);
drawdigger(0,DIR_LEFT,292,101,1);
x=292;
}
if (frame>130 && frame<=157) {
x-=4;
drawdigger(0,DIR_LEFT,x,101,1);
}
if (frame>157)
drawdigger(0,DIR_RIGHT,184,101,1);
if (frame==163)
outtext("DIGGER",216,102,2);
if (frame==178) {
movedrawspr(FIRSTBAG,184,120);
drawgold(0,0,184,120);
}
if (frame==183)
outtext("GOLD",216,121,2);
if (frame==198)
drawemerald(184,141);
if (frame==203)
outtext("EMERALD",216,140,2);
if (frame==218)
drawbonus(184,158);
if (frame==223)
outtext("BONUS",216,159,2);
newframe();
frame++;
if (frame>250)
frame=0;
#ifdef _WINDOWS
if (reset_main_menu_screen) {
escape=FALSE;
break;
}
#endif
}
if (savedrf) {
if (gotgame)
recsavedrf();
savedrf=FALSE;
continue;
}
#ifdef _WINDOWS
if (reset_main_menu_screen)
continue;
#endif
if (escape)
break;
recinit();
game();
gotgame=TRUE;
if (gotname)
recsavedrf();
savedrf=FALSE;
escape=FALSE;
} while (!escape);
finish();
return 0;
}
void finish(void)
{
killsound();
soundoff();
soundkillglob();
restorekeyb();
graphicsoff();
#ifdef _WINDOWS
windows_finish();
#endif
}
void shownplayers(void)
{
if (diggers==2)
if (gauntlet) {
outtext("TWO PLAYER",180,25,3);
outtext("GAUNTLET",192,39,3);
}
else {
outtext("TWO PLAYER",180,25,3);
outtext("SIMULTANEOUS",170,39,3);
}
else
if (gauntlet) {
outtext("GAUNTLET",192,25,3);
outtext("MODE",216,39,3);
}
else
if (nplayers==1) {
outtext("ONE",220,25,3);
outtext(" PLAYER ",192,39,3);
}
else {
outtext("TWO",220,25,3);
outtext(" PLAYERS",184,39,3);
}
}
int getalllives(void)
{
int t=0,i;
for (i=curplayer;i<diggers+curplayer;i++)
t+=getlives(i);
return t;
}
void switchnplayers(void)
{
nplayers=3-nplayers;
}
void initlevel(void)
{
gamedat[curplayer].levdone=FALSE;
makefield();
makeemfield();
initbags();
levnotdrawn=TRUE;
}
void drawscreen(void)
{
creatembspr();
drawstatics();
drawbags();
drawemeralds();
initdigger();
initmonsters();
}
void initchars(void)
{
initmbspr();
initdigger();
initmonsters();
}
void checklevdone(void)
{
if ((countem()==0 || monleft()==0) && isalive())
gamedat[curplayer].levdone=TRUE;
else
gamedat[curplayer].levdone=FALSE;
}
void incpenalty(void)
{
penalty++;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -