MuckyFoot-UrbanChaos/fallen/Source/startscr.cpp
2017-05-20 11:14:17 +10:00

1857 lines
44 KiB
C++
Raw Blame History

// most of this file is obsolete
// just a few torn scraps remain...
#ifndef EDITOR
#include "MFStdLib.h"
CBYTE STARTSCR_mission[_MAX_PATH] = {0};
#else
#include "Game.h"
#include "startscr.h"
#ifndef PSX
#include "c:\fallen\ddengine\headers\poly.h"
#include "c:\fallen\ddengine\headers\text.h"
#include "c:\fallen\ddengine\headers\flamengine.h"
#include "c:\fallen\ddengine\headers\font3d.h"
#include "C:\fallen\DDLibrary\headers\D3DTexture.h"
#include "C:\fallen\DDLibrary\headers\GDisplay.h"
#include "sound.h"
#include "menufont.h"
#include "texture.h"
#include "drawxtra.h"
#include "night.h"
#include "io.h"
#include "ob.h"
#include "C:\fallen\DDEngine\headers\vertexbuffer.h"
#include "C:\fallen\DDEngine\headers\polypoint.h"
#include "C:\fallen\DDEngine\headers\renderstate.h"
#include "C:\fallen\DDEngine\headers\polypage.h"
#include "password.h"
#include "interfac.h"
#include "env.h"
//#include "Shlwapi.h"
#include "MFx.h"
#endif
#include "widget.h"
// editor stuff being roped in for background view
#include "gi.h"
#include "engwind.h"
#include "mapview.h"
#include "xlat_str.h"
#define MISSION_SCRIPT "data\\urban.sty"
//#define USE_WIDGETS
//#define USE_PASSWORD
//#define USE_TIMEOUT
//#define E3_BODGE
#define TIMEOUT_YEAR 1999
#define TIMEOUT_MONTH 5
#define TIMEOUT_DAY 30
#define FORCE_FIRST_MISSION (0)
#if defined(USE_PASSWORD)
CBYTE magic_key[] = MAGIC_ARRAY;
#endif
CBYTE STARTSCR_mission[_MAX_PATH] = {0};
UBYTE STARTSCR_miss_id=0;
UBYTE STARTSCR_miss_autoadvance=0;
//CBYTE* STARTSCR_mission=0;
struct StartMenuItemSimple startmenu_special[]=
{
{"INNER CITY",0,1,0,0},
{"RESCUE ROPER",0,2,0,0},
{"AIRBASE",0,3,0,0},
{"HOTEL",0,4,0,0},
{"DOCKS",0,5,0,0},
{"WAREHOUSE",0,6,0,0},
{"ROOFTOP",0,7,0,0},
{"TESTBIKE",0,8,0,0},
{"EXIT",0,9,0,0}
};
struct StartMenuItemSimple startmenu[]=
{
{"START",0,STARTS_START,0,0},
{"PLAYBACK ",0,STARTS_PLAYBACK,0,0},
{"EDITOR",0,STARTS_EDITOR,0,0},
{"REAL MENU",0,STARTS_LOAD,0,0},
{"OPTIONS",2,0,0,0},
{"MULTIPLAYER",0,STARTS_MULTI,0,0},
{"EXIT",0,STARTS_EXIT,0,0},
{"SOUND",4,0,0,0},
{"GRAPHICS",5,0,0,0},
{"INPUT",0,0,0,0},
{"BACK",1,0,0,0,},
{"HOST A GAME",0,STARTS_HOST,0,0},
{"JOIN A GAME",0,STARTS_JOIN,0,0},
{"BACK",1,0,0,0,}
};
struct StartMenuItemComplex startmenu2[]=
{
{"SHADOWS",{"HIGH","MEDIUM","LOW"},0,0,0,0},
{"DRAW DIST",{"FAR","MEDIUM","NEAR"},0,0,0,0},
{"DIRT",{"RANCID","MUCKY","CLEAN"},0,0,0,0},
{"REFLECTIONS",{"ON","OFF",0},0,0,0,0},
{"RESOLUTION",{"HIGH","LOW",0},0,0,0,0},
{"BACK",{0,0,0},2,0,0,0},
{"SOUND QUALITY",{"HIGH","MEDIUM","LOW"},0,0,0,0},
{"SOUND VOLUME",{"HIGH","MEDIUM","OFF"},0,0,0,0},
{"MUSIC VOLUME",{"HIGH","MEDIUM","OFF"},0,0,0,0},
{"BACK",{0,0,0},2,0,0,0}
};
struct MissionData {
SLONG ObjID, GroupID, ParentID, ParentIsGroup;
SLONG District;
SLONG Type, Flags;
CBYTE fn[255], ttl[255];
};
struct StartMenu start_menu[]=
{
{0,0,0,0}, // dummy
{0,7,0,0}, // Main Menu
{6,4,0,0}, // Options
{10,3,0,0}, // multiplayer
{6,4,0,1}, // sfx
{0,6,0,1}, // graphics
};
static UBYTE mission_num;
static CHAR mission_name[_MAX_PATH]; // this is getting kinda skanky now
extern BOOL text_fudge;
extern ULONG text_colour;
BOOL show_game = 1;
void STARTSCR_plonk_logo(void) {
POLY_Point pp[4];
POLY_Point *quad[4] = { &pp[0], &pp[1], &pp[2], &pp[3] };
pp[0].specular=pp[1].specular=pp[2].specular=pp[3].specular=0xff000000;
pp[0].colour=pp[1].colour=pp[2].colour=pp[3].colour=0xFFFFFFFF;
pp[0].Z=pp[1].Z=pp[2].Z=pp[3].Z=0.5f;
/* pp[0].u=0.0; pp[0].v=0.0;
pp[1].u=1.0; pp[1].v=0.0;
pp[2].u=0.0; pp[2].v=1.0;
pp[3].u=1.0; pp[3].v=1.0;*/
pp[0].u=0.0; pp[0].v=0.0;
pp[1].u=0.628; pp[1].v=0.0;
pp[2].u=0.0; pp[2].v=0.363;
pp[3].u=0.628; pp[3].v=0.363;
pp[0].X=0; pp[0].Y=0;
pp[1].X=161; pp[1].Y=0;
pp[2].X=0; pp[2].Y=93;
pp[3].X=161; pp[3].Y=93;
POLY_add_quad(quad,POLY_PAGE_MENULOGO,FALSE,TRUE);
}
void draw_a_menu(SLONG menu)
{
SLONG c0;
SLONG y;
SLONG complex;
text_fudge = FALSE;
y=200-20*start_menu[menu].Count;
complex=start_menu[menu].Type;
for(c0=0;c0<start_menu[menu].Count;c0++)
{
CBYTE *str;
if(c0==start_menu[menu].Current)
text_colour = 0x00eeee00;
else
text_colour = 0x00eeeeff;
if(!complex)
{
str=startmenu[c0+start_menu[menu].StartIndex].Str;
if(str)
draw_centre_text_at(320, y,str,0,0);
}
else
{
SLONG item;
CBYTE *str;
item=startmenu2[c0+start_menu[menu].StartIndex].Item;
draw_text_at(150, y,startmenu2[c0+start_menu[menu].StartIndex].Str,0);
str=startmenu2[c0+start_menu[menu].StartIndex].Strb[item];
if(str)
draw_text_at(350, y,str,0);
}
y+=20;
}
}
#ifndef PSX
#if 0
void draw_a_3d_menu(Font3D &font, SLONG menu)
{
SLONG c0;
SLONG y;
SLONG complex;
UBYTE isthis;
text_fudge = FALSE;
y=240-(25*start_menu[menu].Count);
complex=start_menu[menu].Type;
for(c0=0;c0<start_menu[menu].Count;c0++)
{
CBYTE *str;
isthis=(c0==start_menu[menu].Current);
if(isthis)
text_colour = 0xffffff;
else
text_colour = 0xff9f9f;
if(!complex)
{
str=startmenu[c0+start_menu[menu].StartIndex].Str;
if(str) font.DrawString(str,320,y,text_colour,2.5+(isthis*0.5f),isthis);
}
else
{
SLONG item;
CBYTE *str;
item=startmenu2[c0+start_menu[menu].StartIndex].Item;
// draw_text_at(150, y,startmenu2[c0+start_menu[menu].StartIndex].Str,0);
font.DrawString(startmenu2[c0+start_menu[menu].StartIndex].Str,200,y,text_colour,2.0+(isthis*0.5f),isthis);
str=startmenu2[c0+start_menu[menu].StartIndex].Strb[item];
if(str) font.DrawString(str,500,y,text_colour,2.0+(isthis*0.5f),isthis);
}
y+=50;
}
}
#endif
//void MENUFONT_Draw_floats(float x, float y, UWORD scale, CBYTE *msg, SLONG rgb, UBYTE flags, UBYTE haloscale);
void draw_a_new_menu(SLONG menu, SLONG localctr)
{
SLONG c0;
SLONG y,rgb;
SLONG complex;
UBYTE isthis;
UWORD flags;
SLONG gap=20;
y=255-(gap*start_menu[menu].Count);
complex=start_menu[menu].Type;
for(c0=0;c0<start_menu[menu].Count;c0++)
{
CBYTE *str;
isthis=(c0==start_menu[menu].Current);
rgb=(localctr<0xff) ? localctr : 0xff;
rgb<<=24;
rgb|=0x7fffcf;
if(!complex)
{
str=startmenu[c0+start_menu[menu].StartIndex].Str;
flags = MENUFONT_HSCALEONLY|MENUFONT_CENTRED | ( isthis ? MENUFONT_SHAKE : 0);
if (localctr<0xff)
{
if (str)
MENUFONT_Draw(436,y,256,str,rgb,flags);
// I don't like these MikeD
// MENUFONT_Draw_floats(388,y,localctr,str,rgb,flags);
}
else
{
if (str)
{
MENUFONT_Draw(388,y,256,str,rgb,flags);
// I don't like these MikeD
/*
if (localctr<0x1ff)
{
rgb=((0x1ff-localctr)>>1)<<24;
rgb|=0x7fffcf;
MENUFONT_Draw_floats(388,y,localctr,str,rgb,flags);
}
*/
}
}
}
else
{
SLONG item;
CBYTE *str;
item=startmenu2[c0+start_menu[menu].StartIndex].Item;
// font.DrawString(startmenu2[c0+start_menu[menu].StartIndex].Str,200,y,text_colour,2.0+(isthis*0.5f),isthis);
flags = MENUFONT_RIGHTALIGN | ( isthis ? MENUFONT_SHAKE : 0);
MENUFONT_Draw(420,y,256,startmenu2[c0+start_menu[menu].StartIndex].Str,rgb,flags);
flags = ( isthis ? MENUFONT_SHAKE : 0);
str=startmenu2[c0+start_menu[menu].StartIndex].Strb[item];
if (str)MENUFONT_Draw(436,y,256,str,rgb,flags);
// if(str) font.DrawString(str,500,y,text_colour,2.0+(isthis*0.5f),isthis);
}
y+=gap+gap;
}
}
#endif
#ifndef PSX
CBYTE* LoadAString(MFFileHandle &file, CBYTE *txt) {
CBYTE *ptr=txt;
*ptr=0;
while (1) {
if (FileRead(file,ptr,1)==FILE_READ_ERROR) {
*ptr=0; return txt;
};
if (*ptr==10) break;
ptr++;
}
*(++ptr)=0;
return txt;
}
void SaveAString(MFFileHandle &file, CBYTE *txt) {
CBYTE *ptr=txt;
CBYTE crlf[] = { 13, 10};
FileWrite(file,txt,strlen(txt));
FileWrite(file,crlf,2);
}
#endif
void LoadFont_CRT(void)
{
// MENUFONT_Load("font2.tga",POLY_PAGE_NEWFONT,"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz$%&()+-\"?,.;:/#0123456789<38><39><EFBFBD>_|}{<7B>");
// MENUFONT_Load("data\\textures\\extras\\olyfont2.tga",POLY_PAGE_NEWFONT_INVERSE,"abcdefghijklmnopqrstuvwxyz0123456789.,!\":;'#$*-()[]\\/?");
#ifdef TARGET_DC
MENUFONT_Load("olyfont2dc.tga",POLY_PAGE_NEWFONT_INVERSE,"ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.,!\":;'#$*-()[]\\/?");
#else
MENUFONT_Load("olyfont2.tga",POLY_PAGE_NEWFONT_INVERSE,"ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.,!\":;'#$*-()[]\\/?");
#endif
void MENUFONT_MergeLower(void);
MENUFONT_MergeLower();
}
void LoadFont_LCD(void) {
// MENUFONT_Load("data\\textures\\extras\\font3.tga",POLY_PAGE_NEWFONT_INVERSE,"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz$%&()+-\"?,.;:/#0123456789<38><39><EFBFBD>_|}{<7B>");
}
SLONG MainWidgetLoop(void);
extern SLONG FONT_TICK;
//extern ULONG get_hardware_input(UWORD type);
//#define INPUT_TYPE_JOY (1<<1)
#ifndef TARGET_DC
SLONG MainE3BodgeLoop() {
static int input = 0;
static int ticker=0;
int lastinput;
static int screen=0;
static int dont_play_movie=ENV_get_value_number("prevent_movie", 0);
static int movie_delay=INFINITY;
if (movie_delay==INFINITY)
{
movie_delay = ENV_get_value_number("delay_movie", 60) * 60;
}
lastinput=input;
input=get_hardware_input(INPUT_TYPE_JOY);
if ((input&&(input!=lastinput)&&(ticker<1))||(Keys[KB_SPACE])) {
if ((input&(INPUT_MASK_JUMP|INPUT_MASK_KICK|INPUT_MASK_PUNCH|INPUT_MASK_ACTION|INPUT_MASK_START))||Keys[KB_SPACE]) {
Keys[KB_SPACE]=0;
MFX_play_xyz(0,S_FOOTS_RUNG_START,MFX_OVERLAP,-150,0,1);
MFX_play_xyz(0,S_FOOTS_RUNG_END,MFX_OVERLAP, 150,0,1);
if (!screen) {
InitBackImage("e3miss.tga");
screen++;
return 0;
} else {
InitBackImage("e3miss.tga");
screen=0;
strcpy(STARTSCR_mission,"levels\\e3.ucm");
return STARTS_START;
}
}
ticker=10;
}
if (((abs(ticker)&0xff)<128)&&!screen) {
POLY_Point pp[4];
POLY_Point *quad[4] = { &pp[0], &pp[1], &pp[2], &pp[3] };
pp[0].specular=pp[1].specular=pp[2].specular=pp[3].specular=0xff000000;
pp[0].colour=pp[1].colour=pp[2].colour=pp[3].colour=0xFF000000;
pp[0].Z=pp[1].Z=pp[2].Z=pp[3].Z=0.5f;
pp[0].u=0.0; pp[0].v=0.0;
pp[1].u=0.628; pp[1].v=0.0;
pp[2].u=0.0; pp[2].v=0.363;
pp[3].u=0.628; pp[3].v=0.363;
pp[0].X=406; pp[0].Y=385;
pp[1].X=406+144; pp[1].Y=385;
pp[2].X=406; pp[2].Y=385+43;
pp[3].X=406+144; pp[3].Y=385+43;
POLY_add_quad(quad,POLY_PAGE_MENULOGO,FALSE,TRUE);
}
ticker--;
if (ticker==-movie_delay) { // approx every 2 mins or so
extern int _CRTAPI1 do_only_game_intro(void);
if (dont_play_movie!=1) do_only_game_intro();
ticker=0;
}
return 0;
}
#endif //#ifndef TARGET_DC
SLONG do_start_menu(void)
{
SLONG res;
#ifdef PSX
return(STARTS_START);
#else
static menu=1;
static Flamengine fire("data\\testfire3.phy");
// static Font3D font("data\\font3d\\");
// static Font3D font("data\\font3d\\urban\\");
// static Font3D font("data\\font3d\\all\\",0.2);
static float i=1;
static SLONG tune_id=0;
static SLONG localctr = 0;
static BOOL realmenu=0;
static BOOL doneload=0;
if (!doneload) {
CBYTE *lang=ENV_get_value_string("language");
doneload=1;
if (!lang) lang="text\\lang_english.txt";
XLAT_load(lang);
XLAT_init();
LoadFont_CRT();
#define NO_MAP 1
#ifdef NO_MAP
InitBackImage("TITLE LEAVES1.TGA");
show_game=0;
#else
GI_load_map("data\\gang1.iam");
NIGHT_load_ed_file("data\\lighting\\gang1.lgt");
#endif
}
// tune_id=play_quick_wave_xyz(0,0,-5,S_TUNE_SEWER,tune_id,WAVE_PLAY_NO_INTERRUPT);
fire.params.randomize=1;
// Do this outside POLY_xxx block because it needs to, well, fuck things
// up royally.
// fire.Run();
POLY_frame_init(FALSE, FALSE);
// draw_a_menu(menu);
// the_display.blit_background_surface();
// ShowBackImage();
extern void GI_render_view_into_backbuffer(
SLONG cam_x,
SLONG cam_y,
SLONG cam_z,
SLONG cam_yaw,
SLONG cam_pitch,
SLONG cam_roll);
extern void calc_camera_pos(void);
if (show_game)
{
cam_focus_x = 64 << 8;
cam_focus_z = 64 << 8;
cam_focus_dist = 12 << 8;
cam_pitch = 1800;
cam_yaw = 256+(SIN(FONT_TICK & 2047)>>8);
calc_camera_pos();
GI_render_view_into_backbuffer (
cam_x,
cam_y,
cam_z,
cam_yaw,
cam_pitch,
0
);
} else {
ShowBackImage();
}
the_display.lp_D3D_Viewport->Clear(1, &the_display.ViewportRect, D3DCLEAR_ZBUFFER);
#ifndef E3_BODGE
//STARTSCR_plonk_logo();
#else
res=MainE3BodgeLoop();
POLY_frame_draw(FALSE,TRUE);
return res;
#endif
#ifdef USE_WIDGETS
//void test_the_widgets(void);
// test_the_widgets();
res=MainWidgetLoop();
#else
if (realmenu) {
res=MainWidgetLoop();
POLY_frame_draw(FALSE,TRUE);
MFX_set_listener(0,0,0,0,0,0);
MFX_render();
return res;
} else
draw_a_new_menu(menu, localctr+=6);
#endif
FONT_TICK++;
// fire.Blit();
// draw_a_3d_menu(font,menu);
POLY_frame_draw(FALSE,TRUE);
MFX_set_listener(0,0,0,0,0,0);
MFX_render();
#ifndef USE_WIDGETS
if (realmenu)
return res;
if(Keys[KB_ENTER])
{
Keys[KB_ENTER]=0;
localctr=0;
// play_quick_wave_xyz(-300,0,300,S_MANHOLE_COVER,0,0);
// play_quick_wave_xyz( 300,1,300,S_MANHOLE_COVER,0,0);
MFX_play_xyz(0,S_MANHOLE_COVER,MFX_OVERLAP,-300,0,300);
MFX_play_xyz(0,S_MANHOLE_COVER,MFX_OVERLAP, 300,1,300);
if(start_menu[menu].Type)
{
if(startmenu2[start_menu[menu].Current+start_menu[menu].StartIndex].NextMenu)
{
menu=startmenu2[start_menu[menu].Current+start_menu[menu].StartIndex].NextMenu;
start_menu[menu].Current=0;
}
else
if(startmenu2[start_menu[menu].Current+start_menu[menu].StartIndex].Action)
{
return(startmenu2[start_menu[menu].Current+start_menu[menu].StartIndex].Action);
}
}
else
{
if(startmenu[start_menu[menu].Current+start_menu[menu].StartIndex].NextMenu)
{
menu=startmenu[start_menu[menu].Current+start_menu[menu].StartIndex].NextMenu;
start_menu[menu].Current=0;
}
else
if(startmenu[start_menu[menu].Current+start_menu[menu].StartIndex].Action)
{
if (startmenu[start_menu[menu].Current+start_menu[menu].StartIndex].Action==STARTS_LOAD)
{
realmenu=1;
}
else
{
return(startmenu[start_menu[menu].Current+start_menu[menu].StartIndex].Action);
}
}
}
}
if(start_menu[menu].Type)
{
if(Keys[KB_LEFT])
{
Keys[KB_LEFT]=0;
if(startmenu2[start_menu[menu].Current+start_menu[menu].StartIndex].Item)
startmenu2[start_menu[menu].Current+start_menu[menu].StartIndex].Item--;
}
else
if(Keys[KB_RIGHT])
{
SLONG item;
Keys[KB_RIGHT]=0;
item=startmenu2[start_menu[menu].Current+start_menu[menu].StartIndex].Item;
if(item<2 && startmenu2[start_menu[menu].Current+start_menu[menu].StartIndex].Strb[item+1])
startmenu2[start_menu[menu].Current+start_menu[menu].StartIndex].Item++;
}
}
if(Keys[KB_UP])
{
Keys[KB_UP]=0;
if(start_menu[menu].Current)
start_menu[menu].Current--;
// play_quicker_wave(S_FOOTS_RUNG_START);
// play_quick_wave_xyz(-150,0,1,S_FOOTS_RUNG_START,0,0);
// play_quick_wave_xyz( 150,0,1,S_FOOTS_RUNG_END,0,0);
MFX_play_xyz(0,S_FOOTS_RUNG_START,MFX_OVERLAP,-150,0,1);
MFX_play_xyz(0,S_FOOTS_RUNG_END,MFX_OVERLAP, 150,0,1);
}
if(Keys[KB_DOWN])
{
Keys[KB_DOWN]=0;
start_menu[menu].Current++;
if(start_menu[menu].Current>=start_menu[menu].Count)
start_menu[menu].Current--;
// play_quick_wave_xyz(-150,0,-(30+(rand()&0x7f)),S_FOOTS_RUNG_START,0,0);
// play_quick_wave_xyz( 150,0,-(30+(rand()&0x7f)),S_FOOTS_RUNG_START+1,0,0);
// play_quicker_wave(S_FOOTS_RUNG_START);
MFX_play_xyz(0,S_FOOTS_RUNG_START,MFX_OVERLAP,-150,0,1);
MFX_play_xyz(0,S_FOOTS_RUNG_END,MFX_OVERLAP, 150,0,1);
}
#else
return res;
#endif
return(0);
#endif
}
void test_the_widgets(void) {
static Form* form=NULL;
Widget* widget;
if (!form) {
form=FORM_Create("main menu",NULL,205,105,570,385,0xff7fffcf);
FORM_AddWidget(form,WIDGET_Create(&BUTTON_Methods,20,30,300,50,"option 1"));
/* FORM_AddWidget(form,WIDGET_Create(&BUTTON_Methods,20,50,300,70,"option 2"))->state=WIDGET_STATE_DISABLED;
FORM_AddWidget(form,WIDGET_Create(&BUTTON_Methods,20,70,300,90,"option 3"));
FORM_AddWidget(form,WIDGET_Create(&STATIC_Methods,20,90,300,110,"label 1"));
FORM_AddWidget(form,WIDGET_Create(&BUTTON_Methods,20,110,300,130,"option 4"));
FORM_AddWidget(form,WIDGET_Create(&CHECK_Methods ,20,130,300,150,"checkbox 1"));
FORM_AddWidget(form,WIDGET_Create(&RADIO_Methods ,20,150,300,170,"radio 1"));
FORM_AddWidget(form,WIDGET_Create(&RADIO_Methods ,20,170,300,190,"radio 2"));
FORM_AddWidget(form,WIDGET_Create(&INPUT_Methods ,14,190,300,220,"input box 1"));*/
FORM_AddWidget(form,WIDGET_Create(&INPUT_Methods ,14,55,300,95,"input box 1"));
widget=FORM_AddWidget(form,WIDGET_Create(&LISTS_Methods ,20,100,300,260,"listbox"));
widget->methods->Data(widget,WLM_ADDSTRING,0,(SLONG)"Test Item");
widget->methods->Data(widget,WLM_ADDSTRING,0,(SLONG)"Another Item");
widget->methods->Data(widget,WLM_ADDSTRING,0,(SLONG)"A Third Item");
widget->methods->Data(widget,WLM_ADDSTRING,0,(SLONG)"Moo");
widget->methods->Data(widget,WLM_ADDSTRING,0,(SLONG)"Wibble");
widget->methods->Data(widget,WLM_ADDSTRING,0,(SLONG)"Flirble");
widget->methods->Data(widget,WLM_ADDSTRING,0,(SLONG)"Tweet");
widget->methods->Data(widget,WLM_ADDSTRING,0,(SLONG)"baaa");
widget->methods->Data(widget,WLM_ADDSTRING,0,(SLONG)"meep");
widget->methods->Data(widget,WLM_ADDSTRING,0,(SLONG)"arf");
widget->methods->Data(widget,WLM_ADDSTRING,0,(SLONG)"Arooooo");
widget->methods->Data(widget,WLM_ADDSTRING,0,(SLONG)"Oink");
}
FORM_Draw(form);
FORM_Process(form);
}
CBYTE export_pw[] = EXPORT_PW;
CBYTE export_name[] = EXPORT_NAME;
CBYTE export_co[] = EXPORT_CO;
BOOL pass_dlg(Form *form, Widget *widget, SLONG message) {
/* CBYTE pw[] = {25, 22, 1, 3, 10, 0, 6, 20, 6, 7, 27, 0 };
CBYTE match[] = "mandelbrots";*/
CBYTE *pt;
// CBYTE *str,*pw2;
SLONG i;
static BOOL firstpass=1;
if (!widget) {
if (message==WFN_PAINT) {
if (firstpass) {
for (i=0,pt=export_name;*pt;i++,pt++) {
*pt^=(i+1);
}
for (i=0,pt=export_co;*pt;i++,pt++) {
*pt^=(i+1);
}
for (i=0,pt=export_pw;*pt;i++,pt++) {
*pt^=(i+1);
}
firstpass=0;
}
MENUFONT_Draw(10,445,128,export_name,0xffFFFFFF,0);
MENUFONT_Draw(10,460,128,export_co,0xffFFFFFF,0);
}
return 0;
}
if (widget->methods==&INPUT_Methods) {
switch(message) {
case WIN_ENTER:
/* str=match; pw2=pw;
while (*str) {
*str^=*pw2;
str++; pw2++;
}
i=strcmp(match,widget->caption);*/
i=strcmp(export_pw,widget->caption);
if (!i) {
WIDGET_snd(WS_OK);
form->returncode=1;
} else WIDGET_snd(WS_FAIL);
break;
}
}
return 0;
}
BOOL menu_dlg(Form *form, Widget *widget, SLONG message) {
if (widget) form->returncode=widget->tag;
return 0;
}
SLONG LoadMissionList(Form *form, CBYTE *script, SLONG district=-1, UBYTE firstonly=FORCE_FIRST_MISSION);
BOOL game_dlg(Form *form, Widget *widget, SLONG message) {
Widget *wig,*nxt;
SLONG dist;
if (widget) {
if (widget->tag) {
if (widget->tag==999) {
form->returncode=-1;
return 0;
}
// form->returncode=widget->tag;
if (widget->tag<100) {
dist=widget->tag-1;
for (wig=form->children;wig;wig=nxt) {
nxt=wig->next;
if ((wig->tag>99)&&(wig->tag<999)&&wig->methods->Free) wig->methods->Free(wig);
}
wig=FORM_AddWidget(form,WIDGET_Create(&SHADE_Methods,10,100,320,200,"-"));
dist=LoadMissionList(form,MISSION_SCRIPT,dist);
if (!dist)
wig->methods->Free(wig);
else {
wig->data[0]=3;
wig->data[1]=255;
wig->data[2]=0x7f000000;
wig->data[3]=1;
wig->tag=900;
wig->oy=(dist*20)+140;
}
} else {
mission_num=widget->tag-101;
strcpy(mission_name,widget->caption);
form->returncode=2;
}
} else {
if (message==WLN_ENTER) {
mission_num=widget->data[4];
FORM_Focus(form,widget,1);
}
}
}
else {
if ((message==WFN_CHAR)&&(LastKey==1)) form->returncode=-1;
if (message==WFN_PAINT) {
if (form->focus->tag<100)
MENUFONT_Draw(170,20,192,form->focus->caption,0xffFFFFFF,0);
}
}
return 0;
}
void DrawPolaroid() {
POLY_Point pp[4];
POLY_Point *quad[4] = { &pp[0], &pp[1], &pp[2], &pp[3] };
pp[0].colour=0xFFFFFF; pp[0].specular=0;
pp[0].Z=0.5f;
pp[1]=pp[2]=pp[3]=pp[0];
pp[0].X=388; pp[0].Y=200;
pp[1].X=640; pp[1].Y=218;
pp[2].X=378; pp[2].Y=462;
pp[3].X=630; pp[3].Y=480;
POLY_add_quad(quad,POLY_PAGE_COLOUR,FALSE,TRUE);
pp[0].colour=0xFFFFFF; pp[0].specular=0;
pp[0].Z=0.5f;
pp[1]=pp[2]=pp[3]=pp[0];
pp[0].X=398; pp[0].Y=210;
pp[1].X=630; pp[1].Y=228;
pp[2].X=391; pp[2].Y=402;
pp[3].X=622; pp[3].Y=420;
pp[0].u=0; pp[0].v=0;
pp[1].u=1; pp[1].v=0;
pp[2].u=0; pp[2].v=1;
pp[3].u=1; pp[3].v=1;
POLY_add_quad(quad,POLY_PAGE_POLAROID,FALSE,TRUE);
}
UWORD save_slot;
BOOL save_dlg(Form *form, Widget *widget, SLONG message) {
if (widget) {
switch(widget->tag) {
case 1:
save_slot=form->children->data[4];
form->returncode=1; break;
case 2: form->returncode=-1; break;
}
} else
if ((message==WFN_CHAR)&&(LastKey==1)) form->returncode=-1;
return 0;
}
BOOL brief_dlg(Form *form, Widget *widget, SLONG message) {
ULONG c,t;
if (!widget) {
if ((message==WFN_CHAR)&&(LastKey==1)) form->returncode=-1;
if (message==WFN_PAINT) {
t=form->age*6;
if (t>255) MENUFONT_Draw(10,120,256,mission_name,0xffFFFFFF,0);
if (t<512) {
c=(t>255) ? 511-t : t;
MENUFONT_Draw_floats(10,120,t,mission_name,0xFFFFFF|(c<<24),MENUFONT_HSCALEONLY);
}
DrawPolaroid();
}
} else {
if (widget->tag) form->returncode=widget->tag;
}
return 0;
}
BOOL load_dlg(Form *form, Widget *widget, SLONG message) {
if (widget) {
switch(widget->tag) {
case 1: form->returncode=-1; break;
case 2:
save_slot=form->children->data[4];
form->returncode=2; break;
}
} else
if ((message==WFN_CHAR)&&(LastKey==1)) form->returncode=-1;
return 0;
}
BOOL esc_dlg(Form *form, Widget *widget, SLONG message) {
if (!widget) {
if ((message==WFN_CHAR)&&(LastKey==1)) form->returncode=-1;
}
return 0;
}
void SaveQuickGame(Form* form) {
Widget* widget;
SLONG slot;
CBYTE fn[_MAX_PATH];
MFFileHandle file;
/* widget=form->children;
ASSERT(!stricmp(widget->caption,"listbox"));
slot=widget->data[4];
slot++; // it was 0 based*/
slot=save_slot+1;
// if (!PathIsDirectory("saves"))
{ // sod it...
CreateDirectory("saves",NULL);
};
sprintf(fn,"saves\\slot%d.wag",slot);
file=FileCreate(fn,1);
SaveAString(file,mission_name);
FileWrite(file,&STARTSCR_miss_id,1);
FileWrite(file,&mission_num,1);
FileClose(file);
}
void LoadQuickGame() {
CBYTE fn[_MAX_PATH];
MFFileHandle file;
SLONG slot=save_slot+1;
sprintf(fn,"saves\\slot%d.wag",slot);
file=FileOpen(fn);
LoadAString(file,mission_name);
FileRead(file,&STARTSCR_miss_id,1);
FileRead(file,&mission_num,1);
FileClose(file);
}
void TemporaryMissionList(Widget *list) {
#ifndef PSX
CBYTE dir[_MAX_PATH];
WIN32_FIND_DATA data;
HANDLE handle;
BOOL ok;
strcpy(dir,"levels\\*.ucm");
handle=FindFirstFile(dir,&data);
if (handle!=INVALID_HANDLE_VALUE) {
ok=1;
while (ok) {
list->methods->Data(list,WLM_ADDSTRING,0,(SLONG)data.cFileName);
ok=FindNextFile(handle,&data);
}
FindClose(handle);
}
#endif
}
/*
void LoadMissionList(Widget *list, CBYTE *script) {
#ifndef PSX
MFFileHandle file;
CBYTE *text;
CBYTE title[256];
SLONG a,b,c,d,e;
SLONG ver, mapx, mapy;
text = (CBYTE*)MemAlloc(4096);
memset(text,0,4096);
file = FileOpen(script);
while (1) {
LoadAString(file,text);
if (*text==0) break;
if ((text[0]=='/')&&(text[1]=='/')) {
if (strstr(text,"Version")) sscanf(text,"%*s Version %d",&ver);
} else {
if (ver<2)
sscanf(text,"%d : %d : %d : %d : %d : %*s : %[^:] : %*s",&a,&b,&c,&d,&e,title);
else
sscanf(text,"%d : %d : %d : %d : %d : %*s : %d : %d : %[^:] : %*s",&a,&b,&c,&d,&e,&mapx,&mapy,title);
list->methods->Data(list,WLM_ADDSTRING,0,(SLONG)title);
}
}
FileClose(file);
MemFree(text);
#endif
}
*/
void ParseMissionData(CBYTE *text, CBYTE version, MissionData *mdata) {
int debug;
switch(version) {
case 2:
sscanf(text,"%d : %d : %d : %d : %d : %s : *%d : %*d : %[^:] : %*s",
&mdata->ObjID, &mdata->GroupID, &mdata->ParentID, &mdata->ParentIsGroup,
&mdata->Type, mdata->fn, mdata->ttl);
mdata->Flags=0; mdata->District=-1;
break;
case 3:
sscanf(text,"%d : %d : %d : %d : %d : %d : %s : %[^:] : %*s",
&mdata->ObjID, &mdata->GroupID, &mdata->ParentID, &mdata->ParentIsGroup,
&mdata->Type, &mdata->District, mdata->fn, mdata->ttl);
mdata->Flags=0;
break;
case 4:
debug=sscanf(text,"%d : %d : %d : %d : %d : %d : %d : %s : %[^:] : %*s",
&mdata->ObjID, &mdata->GroupID, &mdata->ParentID, &mdata->ParentIsGroup,
&mdata->Type, &mdata->Flags, &mdata->District, mdata->fn, mdata->ttl);
break;
default:
sscanf(text,"%d : %d : %d : %d : %d : %s : %[^:] : %*s",
&mdata->ObjID, &mdata->GroupID, &mdata->ParentID, &mdata->ParentIsGroup,
&mdata->Type, mdata->fn, mdata->ttl);
mdata->Flags=0; mdata->District=-1;
}
}
void MissionListCallback(CBYTE *script, MISSION_callback cb) {
MFFileHandle file;
CBYTE *text;
SLONG ver=0;
MissionData *mdata = MFnew<MissionData>();
text = (CBYTE*)MemAlloc(4096);
memset(text,0,4096);
file = FileOpen(script);
while (1) {
LoadAString(file,text);
if (*text==0) break;
if (text[0]=='[') { // we've hit the districts
break; // ignore them for the moment.
}
if ((text[0]=='/')&&(text[1]=='/')) {
if (strstr(text,"Version")) sscanf(text,"%*s Version %d",&ver);
} else {
ParseMissionData(text,ver,mdata);
cb(mdata->fn);
}
}
MFdelete(mdata);
MemFree(text);
}
/*
void testy2(CBYTE *filename) {
TRACE("returned %s\n",filename);
}
void testy() {
MissionListCallback(MISSION_SCRIPT,testy2);
}
*/
SLONG LoadMissionList(Form *form, CBYTE *script, SLONG district, UBYTE firstonly) {
#ifndef PSX
MFFileHandle file;
CBYTE *text;
SLONG i,ver, mapx, mapy, dumpy=100, ct=0;
MissionData *mdata = MFnew<MissionData>();
text = (CBYTE*)MemAlloc(4096);
memset(text,0,4096);
i=100;
file = FileOpen(script);
while (1) {
LoadAString(file,text);
if (*text==0) break;
if (text[0]=='[') { // we've hit the districts
break; // ignore them for the moment.
}
if ((text[0]=='/')&&(text[1]=='/')) {
if (strstr(text,"Version")) sscanf(text,"%*s Version %d",&ver);
} else {
ParseMissionData(text,ver,mdata);
mapx=mapy=0;
// list->methods->Data(list,WLM_ADDSTRING,0,(SLONG)title);
// quick uppercase force
for(script=mdata->ttl;*script;script++)
if (*script>96) *script^=32;
// if (mapx&&mapy) FORM_AddWidget(form,WIDGET_Create(&BUTTON_Methods,mapx,mapy,640,mapy+20,title))->tag=++i;
Widget *widget;
i++;
// if ((dist==-1)||(district==dist)) {
if (firstonly&&(mdata->ParentID!=1)) mdata->District=-9; // heh... force disabled
if (mdata->District==district) {
if ((!mapx)&&(!mapy)) {
mapx=10; mapy=(dumpy+=20);
}
// widget=FORM_AddWidget(form,WIDGET_Create(&GLYPH_Methods,mapx,mapy,mapx+18,mapy+18,title));
widget=FORM_AddWidget(form,WIDGET_Create(&BUTTON_Methods,mapx,mapy,320,mapy+18,mdata->ttl));
widget->tag=i;
widget->data[0]=1;
ct++;
/* widget->data[0]=POLY_PAGE_MENULOGO;
widget->data[1]=0; widget->data[2]=128;
widget->data[3]=17; widget->data[4]=128+17;*/
}
}
}
FileClose(file);
MemFree(text);
MFdelete(mdata);
return ct;
#endif
}
void LoadDistrictList(Form *form, CBYTE *script) {
#ifndef PSX
MFFileHandle file;
CBYTE *text;
CBYTE title[256];
SLONG ver, mapx, mapy, i=0;
text = (CBYTE*)MemAlloc(2048);
memset(text,0,2048);
file = FileOpen(script);
while (*text!='[') {
LoadAString(file,text);
if (*text==0) break;
}
if (*text==0) {
FileClose(script);
MemFree(text);
return;
}
while (1) {
LoadAString(file,text);
if (*text==0) break;
if ((text[0]=='/')&&(text[1]=='/')) {
// if (strstr(text,"Version")) sscanf(text,"%*s Version %d",&ver);
} else {
sscanf(text,"%[^=]=%d,%d",title,&mapx,&mapy);
// quick uppercase force
for(script=title;*script;script++)
if (*script>96) *script^=32;
Widget *widget;
widget=FORM_AddWidget(form,WIDGET_Create(&GLYPH_Methods,mapx,mapy,mapx+18,mapy+18,title));
widget->tag=++i;
widget->data[0]=POLY_PAGE_MENULOGO;
widget->data[1]=0; widget->data[2]=128;
widget->data[3]=17; widget->data[4]=128+17;
}
}
FileClose(file);
MemFree(text);
#endif
}
void LoadSpecificDistrict(Form *form, CBYTE *script, UWORD district) {
#ifndef PSX
MFFileHandle file;
CBYTE *text;
CBYTE title[256];
SLONG ver, mapx, mapy, i=0;
text = (CBYTE*)MemAlloc(2048);
memset(text,0,2048);
district++; // blah blah
file = FileOpen(script);
while (*text!='[') {
LoadAString(file,text);
if (*text==0) break;
}
if (*text==0) {
FileClose(script);
MemFree(text);
return;
}
while (1) {
LoadAString(file,text);
if (*text==0) break;
if ((text[0]=='/')&&(text[1]=='/')) {
// if (strstr(text,"Version")) sscanf(text,"%*s Version %d",&ver);
} else {
sscanf(text,"%[^=]=%d,%d",title,&mapx,&mapy);
i++;
if (i==district) {
// quick uppercase force
for(script=title;*script;script++)
if (*script>96) *script^=32;
Widget *widget;
widget=FORM_AddWidget(form,WIDGET_Create(&GLYPH_Methods,mapx,mapy,mapx+18,mapy+18,title));
widget->tag=i;
widget->data[0]=POLY_PAGE_MENULOGO;
widget->data[1]=0; widget->data[2]=128;
widget->data[3]=17; widget->data[4]=128+17;
}
}
}
FileClose(file);
MemFree(text);
#endif
}
void QuickDistrictList(Form *form, CBYTE *script) {
#ifndef PSX
MFFileHandle file;
CBYTE *text;
SLONG ver=0;
UBYTE index=0;
MissionData *mdata = MFnew<MissionData>();
text = (CBYTE*)MemAlloc(4096);
memset(text,0,4096);
file = FileOpen(script);
while (1) {
LoadAString(file,text);
if (*text==0) break;
if ((text[0]=='/')&&(text[1]=='/')) {
if (strstr(text,"Version")) sscanf(text,"%*s Version %d",&ver);
} else {
ParseMissionData(text,ver,mdata);
if (mdata->ParentID==1) break;
index++;
}
}
FileClose(file);
LoadSpecificDistrict(form,script,mdata->District);
MemFree(text);
MFdelete(mdata);
#endif
}
UBYTE LoadMissionNumFromId(CBYTE *script, UBYTE id) {
#ifndef PSX
MFFileHandle file;
CBYTE *text;
SLONG ver=0;
UBYTE index=0;
MissionData *mdata = MFnew<MissionData>();
text = (CBYTE*)MemAlloc(4096);
memset(text,0,4096);
file = FileOpen(script);
while (1) {
LoadAString(file,text);
if (*text==0) break;
if ((text[0]=='/')&&(text[1]=='/')) {
if (strstr(text,"Version")) sscanf(text,"%*s Version %d",&ver);
} else {
ParseMissionData(text,ver,mdata);
if (mdata->ObjID==id) break;
index++;
}
}
FileClose(file);
STARTSCR_miss_autoadvance=mdata->Flags&1;
MemFree(text);
MFdelete(mdata);
return index;
#else
return 0;
#endif
}
void LoadMissionFilename(CBYTE *script, UBYTE index, CBYTE* fn, UBYTE *id) {
#ifndef PSX
MFFileHandle file;
CBYTE *text;
MissionData *mdata = MFnew<MissionData>();
SLONG ver=0;
text = (CBYTE*)MemAlloc(4096);
memset(text,0,4096);
index++;
file = FileOpen(script);
while (index) {
LoadAString(file,text);
if (*text==0) break;
if ((text[0]=='/')&&(text[1]=='/')) {
if (strstr(text,"Version")) sscanf(text,"%*s Version %d",&ver);
} else index--;
}
FileClose(file);
if (*text==0) { MemFree(text); MFdelete(mdata); return; }
ParseMissionData(text,ver,mdata);
*id=mdata->ObjID;
STARTSCR_miss_autoadvance=mdata->Flags&1;
memset(fn,0,strlen(mdata->fn)+1);
if (!strchr(mdata->fn,'\\')) {
strcpy(fn,"levels\\");
strcat(fn,mdata->fn);
} else strcpy(fn,mdata->fn);
MFdelete(mdata);
MemFree(text);
#endif
}
void LoadNextMissionFilename(UBYTE &current_index, CBYTE *fn, CBYTE *mtitle, CBYTE *script) {
#ifndef PSX
MFFileHandle file;
CBYTE *text, *pt;
SLONG ver=0, ndx=0;
MissionData *mdata = MFnew<MissionData>();
text = (CBYTE*)MemAlloc(8192);
memset(text,0,8192);
file = FileOpen(script);
while (1) {
LoadAString(file,text);
if (*text==0) break;
if ((text[0]=='/')&&(text[1]=='/')) {
if (strstr(text,"Version")) sscanf(text,"%*s Version %d",&ver);
} else {
if (!strncmp(text,"[districts]",11)) break;
ParseMissionData(text,ver,mdata);
if (current_index==mdata->ParentID) {
ndx=mdata->ObjID;
break;
}
}
}
FileClose(file);
if ((*text==0)||!ndx) { MemFree(text); MFdelete(mdata); return; }
memset(fn,0,strlen(mdata->fn)+1);
if (!strchr(mdata->fn,'\\')) {
strcpy(fn,"levels\\");
strcat(fn,mdata->fn);
} else strcpy(fn,mdata->fn);
current_index=ndx;
if (mtitle) strcpy(mtitle,mdata->ttl);
MemFree(text);
MFdelete(mdata);
#endif
}
CBYTE* LoadMissionBriefing(CBYTE *script, UBYTE index) {
#ifndef PSX
MFFileHandle file;
CBYTE *text, *pt;
CBYTE fn[_MAX_PATH],mfn[_MAX_PATH];
SLONG a,b,c,d,e,n,ver;
text = (CBYTE*)MemAlloc(8192);
memset(text,0,8192);
index++;
file = FileOpen(script);
while (index) {
LoadAString(file,text);
if (*text==0) break;
if ((text[0]=='/')&&(text[1]=='/')) {
if (strstr(text,"Version")) sscanf(text,"%*s Version %d",&ver);
} else index--;
}
FileClose(file);
if (*text==0) { MemFree(text); return 0; }
switch(ver) {
case 2:
sscanf(text,"%*d : %*d : %*d : %*d : %*d : %s : %*d : %*d : %*s : %*s",mfn);
n=9;
break;
case 3:
sscanf(text,"%*d : %*d : %*d : %*d : %*d : %*d : %s : %*s : %*s",mfn);
n=8;
break;
case 4:
sscanf(text,"%*d : %*d : %*d : %*d : %*d : %*d : %*d : %s : %*s : %*s",mfn);
n=9;
break;
default:
n=7;
sscanf(text,"%*d : %*d : %*d : %*d : %*d : %s : %*s : %*s",mfn);
}
// text=strrchr(text,':');
for (a=0;a<n;a++)
text=strchr(text,':')+1;
text++;
// quick uppercase force
for(script=text;*script;script++)
if (*script>96) *script^=32;
#ifndef PSX
// let's see if there's a polaroid photo of this mission
pt=strchr(mfn,'.'); if (pt) *pt=0;
sprintf(fn,"photos\\%s.tga",mfn);
TEXTURE_set_tga(TEXTURE_page_polaroid,fn);
#endif
return text;
#else
return 0;
#endif
}
void ScanSavedGames(Widget *list) {
#ifndef PSX
CBYTE dir[_MAX_PATH],ttl[_MAX_PATH];
WIN32_FIND_DATA data;
HANDLE handle;
BOOL ok;
SLONG c0;
/* strcpy(dir,"saves\\*.wag");
handle=FindFirstFile(dir,&data);
if (handle!=INVALID_HANDLE_VALUE) {
ok=1;
while (ok) {
list->methods->Data(list,WLM_ADDSTRING,0,(SLONG)data.cFileName);
ok=FindNextFile(handle,&data);
}
FindClose(handle);
}*/
for (c0=1;c0<11;c0++) {
MFFileHandle file;
sprintf(dir,"saves\\slot%d.wag",c0);
file = FileOpen(dir);
if (file!=FILE_OPEN_ERROR) {
LoadAString(file,ttl);
FileClose(file);
// STARTSCR_miss_id
} else {
strcpy(ttl,"(empty)");
}
sprintf(dir,"Slot %d: %s",c0,ttl);
list->methods->Data(list,WLM_ADDSTRING,0,(SLONG)dir);
}
#endif
}
BOOL won_the_game;
void STARTSCR_notify_gameover(BOOL won) {
won_the_game=won;
if (won) {
LoadNextMissionFilename(STARTSCR_miss_id, STARTSCR_mission, mission_name, MISSION_SCRIPT);
}
}
//--- time out stuff ---
// #define WIDGET_COLOUR (0xff7fffcf)
#define WIDGET_COLOUR (0x7FFFFFFF)
#define CUNNING_FILE "c:\\windows\\system\\a3duc149.dl_"
BOOL TimeoutCheck() {
#ifndef PSX
SYSTEMTIME time;
FILETIME ftime1,ftime2,ftime3;
HANDLE handle;
BOOL arse=0;
GetSystemTime(&time);
SystemTimeToFileTime(&time,&ftime1);
if (FileExists(CUNNING_FILE)) {
handle=CreateFile(CUNNING_FILE,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
GetFileTime(handle,&ftime2,NULL,&ftime3);
CloseHandle(handle);
// ftime2 is when the file was created
// ftime3 is when it was modified
// first, check these make sense, otherwise the file has been dicked with
if (CompareFileTime(&ftime2,&ftime3)>0) arse=1;
// now, ensure the file modified time is older than the current time, otherwise
// the system clock has been dicked with
if (CompareFileTime(&ftime3,&ftime1)>0) arse=1;
// finally, update the time, for the next loop round
if (!arse) {
handle=CreateFile(CUNNING_FILE,GENERIC_WRITE,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
SetFileTime(handle,NULL,NULL,&ftime1);
CloseHandle(handle);
}
} else {
handle=CreateFile(CUNNING_FILE,GENERIC_WRITE,0,NULL,CREATE_NEW,FILE_ATTRIBUTE_NORMAL,NULL);
if (handle!=INVALID_HANDLE_VALUE) {
// SetFileTime(handle,NULL,NULL,&ftime1);
CloseHandle(handle);
}
}
if (!arse) {
time.wDay=TIMEOUT_DAY; time.wMonth=TIMEOUT_MONTH; time.wYear=TIMEOUT_YEAR;
SystemTimeToFileTime(&time,&ftime2);
if (CompareFileTime(&ftime1,&ftime2)<0) return 0;
}
MessageBox(0,"The time limit on this game has expired.","Error",MB_ICONEXCLAMATION|MB_OK);
return 1;
#else
return 0;
#endif
}
// --- widgety core stuff ---
SLONG MainWidgetLoop(void) {
static Form* form=NULL;
Widget* widget;
SLONG result;
CBYTE *txt,*tmp;
#ifdef USE_PASSWORD
static SLONG mode=0;
#else
static SLONG mode=1;
#endif
if (!form) {
#ifdef USE_TIMEOUT
if (TimeoutCheck()) return STARTS_EXIT;
#endif
// STARTSCR_mission[0]=0;
// STARTSCR_mission=0;
PolyPage::EnableAlphaSort();
switch(mode) {
case 0:
form=FORM_Create("urban chaOS 0.1",pass_dlg,205,105,570,385,WIDGET_COLOUR);
FORM_AddWidget(form,WIDGET_Create(&STATIC_Methods,20,30,300,50,"LOGIN:"));
widget=FORM_AddWidget(form,WIDGET_Create(&INPUT_Methods,30,60,335,90,""));
widget->methods->Data(widget,WIM_SETMODE,1,0);
widget->methods->Char(widget,13);
break;
case 1:
#ifndef NO_MAP
show_game=1;
#endif
form=FORM_Create("main menu",menu_dlg,0,105,640,385,WIDGET_COLOUR);
/* FORM_AddWidget(form,WIDGET_Create(&BUTTON_Methods,30,65, 335,85,"START"))->tag=1;
FORM_AddWidget(form,WIDGET_Create(&BUTTON_Methods,30,95, 335,115,"EDITOR"))->tag=2;
FORM_AddWidget(form,WIDGET_Create(&BUTTON_Methods,30,125, 335,145,"LOAD GAME"))->tag=3;
FORM_AddWidget(form,WIDGET_Create(&BUTTON_Methods,30,155, 335,175,"MULTIPLAYER"))->tag=4;
FORM_AddWidget(form,WIDGET_Create(&BUTTON_Methods,30,185,335,205,"OPTIONS"))->tag=5;
FORM_AddWidget(form,WIDGET_Create(&BUTTON_Methods,30,215,335,225,"EXIT"))->tag=6;*/
/* FORM_AddWidget(form,WIDGET_Create(&BUTTON_Methods,30,70, 335,90,"START"))->tag=1;
FORM_AddWidget(form,WIDGET_Create(&BUTTON_Methods,30,100, 335,120,"LOAD GAME"))->tag=3;
FORM_AddWidget(form,WIDGET_Create(&BUTTON_Methods,30,130, 335,150,"MULTIPLAYER"))->tag=4;
FORM_AddWidget(form,WIDGET_Create(&BUTTON_Methods,30,160,335,180,"OPTIONS"))->tag=5;
FORM_AddWidget(form,WIDGET_Create(&BUTTON_Methods,30,190,335,200,"EXIT"))->tag=6;
*/
WIDGET_menu(form,"START","LOAD GAME","MULTIPLAYER","OPTIONS","EXIT",0);
break;
case 2:
// InitBackImage("handhold.tga");
InitBackImage("main_map.tga");
show_game=0;
PolyPage::DisableAlphaSort();
LoadFont_LCD();
// form=FORM_Create("select mission",game_dlg,82,82,472,402,WIDGET_COLOUR);
form=FORM_Create("select mission",game_dlg,0,0,640,480,WIDGET_COLOUR);
// form->inverse=1;
// widget=FORM_AddWidget(form,WIDGET_Create(&LISTS_Methods ,30,50,335,180,"listbox"));
// LoadMissionList(widget,MISSION_SCRIPT);
//LoadMissionList(form,MISSION_SCRIPT);
if (FORCE_FIRST_MISSION)
QuickDistrictList(form,MISSION_SCRIPT);
else
LoadDistrictList(form,MISSION_SCRIPT);
FORM_AddWidget(form,WIDGET_Create(&BUTTON_Methods,530,450,620,470,"BACK"))->tag=999;
// widget->methods->Char(widget,13);
// FORM_AddWidget(form,WIDGET_Create(&BUTTON_Methods,30,195,335,225,"view briefing"))->tag=2;
// FORM_AddWidget(form,WIDGET_Create(&BUTTON_Methods,30,235,335,255,"start mission"))->tag=1;
break;
case 3:
form=FORM_Create("load a saved game",load_dlg,105,105,570,385,WIDGET_COLOUR);
widget=FORM_AddWidget(form,WIDGET_Create(&LISTS_Methods ,30,50,435,180,"listbox"));
ScanSavedGames(widget);
widget->state|=WIDGET_STATE_SHRINKTEXT;
widget->methods->Char(widget,13);
FORM_AddWidget(form,WIDGET_Create(&BUTTON_Methods,30,195,335,225,"load"))->tag=2;
FORM_AddWidget(form,WIDGET_Create(&BUTTON_Methods,30,235,335,255,"cancel"))->tag=1;
break;
case 10:
// form=FORM_Create("mission briefing",brief_dlg,82,82,472,402,WIDGET_COLOUR);
form=FORM_Create("mission briefing",brief_dlg,0,0,640,480,WIDGET_COLOUR);
#ifndef NO_MAP
show_game=1;
#endif
/* widget=FORM_AddWidget(form,WIDGET_Create(&SHADE_Methods,10,100,320,200,"-"));
widget->data[0]=3;
widget->data[1]=255;
widget->data[2]=0x7f000000;
widget->data[3]=1;
widget->tag=900;*/
// form->inverse=1;
// FORM_AddWidget(form,WIDGET_Create(&STATIC_Methods,10,60,335,180,mission_name));
widget=FORM_AddWidget(form,WIDGET_Create(&TEXTS_Methods ,10,140,335,380,"textbox"));
txt=LoadMissionBriefing(MISSION_SCRIPT,mission_num);
if (txt) widget->methods->Data(widget,WTM_ADDBLOCK,0,(SLONG)txt);
widget->methods->Char(widget,13);
// FORM_AddWidget(form,WIDGET_Create(&BUTTON_Methods,30,195,335,225,"change mission"))->tag=1;
// FORM_AddWidget(form,WIDGET_Create(&BUTTON_Methods,30,235,335,255,"start mission"))->tag=2;
FORM_AddWidget(form,WIDGET_Create(&BUTTON_Methods,10,400,165,420,"BACK"))->tag=1;
FORM_AddWidget(form,WIDGET_Create(&BUTTON_Methods,165,400,330,420,"START"))->tag=2;
FORM_AddWidget(form,WIDGET_Create(&BUTTON_Methods,10,430,165,450,"SAVE"))->tag=3;
break;
case 20:
// mode = 1+(UBYTE)won_the_game;
if (won_the_game&&STARTSCR_mission[0]&&STARTSCR_miss_id) {
if (STARTSCR_miss_autoadvance)
return STARTS_START;
else {
mission_num=LoadMissionNumFromId(MISSION_SCRIPT,STARTSCR_miss_id);
mode=10;
// GI_load_map("data\\gang1.iam");
// NIGHT_load_ed_file("data\\lighting\\gang1.lgt");
}
} else mode=1;
return MainWidgetLoop();
break;
case 40:
form=FORM_Create("save game",save_dlg,0,0,640,480,WIDGET_COLOUR);
widget=FORM_AddWidget(form,WIDGET_Create(&LISTS_Methods ,30,110,335,300,"listbox"));
widget->state|=WIDGET_STATE_SHRINKTEXT;
ScanSavedGames(widget);
FORM_AddWidget(form,WIDGET_Create(&BUTTON_Methods,10,400,165,420,"SAVE"))->tag=1;
FORM_AddWidget(form,WIDGET_Create(&BUTTON_Methods,165,400,330,420,"CANCEL"))->tag=2;
/* for (c0=0;c0<10;c0++) {
CBYTE msg[30],ttl[_MAX_PATH];
if (FileExists(
sprintf(msg,"Slot %d: %s",c0,ttl);
widget->methods->Data(list,WLM_ADDSTRING,0,(SLONG)data.cFileName);
}*/
break;
default:
form=FORM_Create("missing form",esc_dlg,0,0,640,480,WIDGET_COLOUR);
// FORM_AddWidget(form,WIDGET_Create(&BUTTON_Methods,0,220,640,260,"missing form"));
FORM_AddWidget(form,WIDGET_Create(&BUTTON_Methods,0,220,640,260,"MISSING FORM"));
}
}
FORM_Draw(form);
// draw mouse pointer...
extern volatile HWND hDDLibWindow;
POINT pt;
if(the_display.IsFullScreen()) {
GetCursorPos(&pt);
DRAW2D_Sprite(pt.x,pt.y,pt.x+17,pt.y+17,0.5,0.5, 0.5625, 0.5625,POLY_PAGE_MENULOGO,0xFFFFFFFF);
}
result=FORM_Process(form);
if (result) {
FORM_Free(form); form=0;
switch(mode) {
case 0: // password screen
mode=1; break;
case 1: // main menu
switch(result) {
case -69: // E3 bodge
mode=2; return 0;
case 5: return STARTS_EXIT;
default:
mode=1+result;
}
break;
case 2:
switch (result) {
case 1:
LoadFont_CRT();
// InitBackImage("gamelogo.tga");
LoadMissionFilename(MISSION_SCRIPT,mission_num,STARTSCR_mission,&STARTSCR_miss_id);
mode=20;
return STARTS_START;
case -69: // E3 bodge
case 2:
mode=10;
break;
default:
// MENUFONT_Page(POLY_PAGE_NEWFONT);
LoadFont_CRT();
// InitBackImage("gamelogo.tga");
mode=1;
break;
}
break;
case 3:
if (result==-1)
mode=1;
else {
LoadQuickGame();
mode=10;
}
break;
case 10:
if ((result==-1)||(result==1)) mode=2;
if (result==3) mode=40; // savegame
if ((result==2)||(result==-69)) {
LoadFont_CRT();
// InitBackImage("gamelogo.tga");
LoadMissionFilename(MISSION_SCRIPT,mission_num,STARTSCR_mission,&STARTSCR_miss_id);
mode=20;
return STARTS_START;
}
break;
case 40:
if (result==1) SaveQuickGame(form);
mode=10;
break;
default:
if (result==-1) mode=1; break;
break;
}
}
return 0;
}
extern SLONG ELEV_load_user(SLONG mission);
extern CBYTE ELEV_fname_level [];
extern void save_whole_game(CBYTE *gamename);
extern SLONG quick_load;
//MissionListCallback
void make_all_wads(void)
{
SLONG c0;
CBYTE save_wad[100];
quick_load=1;
for(c0=0;c0<25;c0++)
{
LoadMissionFilename(MISSION_SCRIPT,c0,STARTSCR_mission,&STARTSCR_miss_id);
ELEV_load_user(1);
ASSERT(OB_ob_upto<3000);
process_things(0);
change_extension(ELEV_fname_level,"wad",save_wad);
save_whole_game(save_wad);
}
}
#endif