2157 lines
No EOL
48 KiB
C++
2157 lines
No EOL
48 KiB
C++
#include <conio.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <alloc.h>
|
|
#include <string.h>
|
|
#include <dos.h>
|
|
#include <bios.h>
|
|
#include "xlib_all.h"
|
|
|
|
#define PROGRAM_GRAPHIX "GRAPHIX.LBM"
|
|
#define INTERFACE_SCREEN "INTRFACE.LBM"
|
|
#define DATA_FILE "TODD3D.TOD"
|
|
|
|
#define UP_KEY 72 + 256
|
|
#define DOWN_KEY 80 + 256
|
|
#define LEFT_KEY 75 + 256
|
|
#define RIGHT_KEY 77 + 256
|
|
|
|
#define GRID_MARK_COLOR 80
|
|
|
|
#define MAP_VIEW_SIZE 16
|
|
#define MAP_SIZE 64
|
|
#define MAX_TILES 64
|
|
#define MAP_LAYERS 5
|
|
#define TILE_SIZE 12
|
|
|
|
#define WEST_LAYER 0
|
|
#define NORTH_LAYER 1
|
|
#define FLOOR_LAYER 2
|
|
#define CEILING_LAYER 3
|
|
#define SPRITE_LAYER 4
|
|
|
|
#define PIC_BASEX 227
|
|
#define PIC_BASEY 133
|
|
|
|
#define AA_BASEX 4
|
|
#define AA_BASEY 4
|
|
#define AA_MAXX 195
|
|
#define AA_MAXY 195
|
|
|
|
#define MC_BASEX 254
|
|
#define MC_BASEY 100
|
|
#define MC_MAXX 303
|
|
#define MC_MAXY 108
|
|
#define MC_BGCOLOR 101
|
|
#define MC_FGCOLOR 0
|
|
|
|
#define DM_BASEX 214
|
|
#define DM_BASEY 10
|
|
#define DM_MAXX 304
|
|
#define DM_MAXY 18
|
|
#define DM_BGCOLOR 101
|
|
#define DM_FGCOLOR 0
|
|
|
|
#define IN_BASEX 214
|
|
#define IN_BASEY 120
|
|
#define IN_MAXX 304
|
|
#define IN_MAXY 128
|
|
#define IN_BGCOLOR 101
|
|
#define IN_FGCOLOR 0
|
|
|
|
#define LEFT_MOUSE_CLICK 1
|
|
#define RIGHT_MOUSE_CLICK 2
|
|
|
|
#define DM_NONE 0
|
|
#define DM_WESTWALL 1
|
|
#define DM_NORTHWALL 2
|
|
#define DM_FLOOR 3
|
|
#define DM_CEILING 4
|
|
#define DM_SPRITE 5
|
|
#define DM_DOOR 6
|
|
|
|
#define TT_WESTWALL 0
|
|
#define TT_NORTHWALL 1
|
|
#define TT_FLAT 2
|
|
#define TT_ACTOR 3
|
|
|
|
#define CC_NONE 0
|
|
#define CC_WESTWALL 1
|
|
#define CC_NORTHWALL 2
|
|
#define CC_FLAT 3
|
|
#define CC_FILL 4
|
|
#define CC_DOOR 5
|
|
#define CC_ACTOR 6
|
|
#define CC_PLAYER 7
|
|
|
|
#define DLG_OKAY 0
|
|
#define DLG_CANCEL 1
|
|
#define DLG_YES 2
|
|
#define DLG_NO 3
|
|
|
|
#define ID_OK 1
|
|
#define ID_CANCEL 2
|
|
#define ID_YES 4
|
|
#define ID_NO 8
|
|
#define ID_NOBUTTONS 16
|
|
#define ID_NOTITLE 32
|
|
#define ID_DEFAULT 1
|
|
#define ID_OKAYCANCEL 3
|
|
#define ID_YESNO 12
|
|
|
|
#define FILL_BUTTON 0
|
|
#define NEW_BUTTON 1
|
|
#define LOAD_BUTTON 2
|
|
#define SAVE_BUTTON 3
|
|
#define EXIT_BUTTON 4
|
|
#define EXTRA_BUTTON 5
|
|
#define PIC_LEFT_BUTTON 6
|
|
#define PIC_RIGHT_BUTTON 7
|
|
|
|
#define WALL_BUTTON 8
|
|
#define FLOOR_BUTTON 9
|
|
#define CEILING_BUTTON 10
|
|
#define TT4_BUTTON 11
|
|
#define TT5_BUTTON 12
|
|
#define PLAYER_BUTTON 13
|
|
#define TT7_BUTTON 14
|
|
#define SPRITE_BUTTON 15
|
|
#define TT9_BUTTON 16
|
|
#define TT10_BUTTON 17
|
|
|
|
#define OKAY_BUTTON 18
|
|
#define CANCEL_BUTTON 19
|
|
#define YES_BUTTON 20
|
|
#define NO_BUTTON 21
|
|
|
|
#define END_OF_BUTTONS 22
|
|
#define END_OF_MAIN_BUT 17
|
|
#define END_OF_DLG_BUT 22
|
|
|
|
#define START_MAIN_BUT 0
|
|
#define START_DLG_BUT 18
|
|
|
|
|
|
extern void showLBM(int,int,char*,long);
|
|
|
|
void load_user_fonts(void);
|
|
void exitfunc(void);
|
|
|
|
void setUpInterface(void);
|
|
void drawLoop(void);
|
|
void handleUserActions(void);
|
|
char MouseOnButton(char);
|
|
void handleButton(char);
|
|
void pushButton(char);
|
|
void handleKeystroke(int);
|
|
|
|
char MessageBox(int, int, long, char *, char *, int);
|
|
void deactivateMainButtons(void);
|
|
void activateMainButtons(void);
|
|
void deactivateDlgButtons(void);
|
|
void activateDlgButtons(void);
|
|
|
|
void showDrawMode(void);
|
|
void showItemName(void);
|
|
void showCurrentPic(void);
|
|
void showMouseCoords(int, int);
|
|
|
|
void handleMouseCursor(void);
|
|
void DrawGridTile(char xpos, char ypos);
|
|
void RedrawMap();
|
|
void RedrawRow(char whichRow);
|
|
void RedrawCol(char whichCol);
|
|
|
|
int SaveMapToTOD(void);
|
|
int LoadMapFromTOD(void);
|
|
int SaveMapToFile(char *);
|
|
int LoadMapFromFile(char *);
|
|
|
|
void ScaleTiles();
|
|
|
|
void FillAnArea(char, char, char, char);
|
|
|
|
typedef struct picStruct
|
|
{
|
|
char *pbm;
|
|
} picType;
|
|
|
|
typedef struct mapStruct
|
|
{
|
|
char *layer;
|
|
} mapType;
|
|
|
|
typedef struct scriptStruct
|
|
{
|
|
char picFile[30];
|
|
char picName[20];
|
|
char Xoffset;
|
|
char Yoffset;
|
|
} scriptType;
|
|
|
|
scriptStruct scripts[75] =
|
|
{
|
|
"WALLS1.LBM",
|
|
"W1_1",
|
|
2,
|
|
2,
|
|
"WALLS1.LBM",
|
|
"W1_2",
|
|
10,
|
|
2,
|
|
"WALLS1.LBM",
|
|
"W1_3",
|
|
18,
|
|
2,
|
|
"WALLS1.LBM",
|
|
"W1_4",
|
|
26,
|
|
2,
|
|
"WALLS1.LBM",
|
|
"W1_5",
|
|
2,
|
|
10,
|
|
"WALLS1.LBM",
|
|
"W1_6",
|
|
10,
|
|
10,
|
|
"WALLS1.LBM",
|
|
"W1_7",
|
|
18,
|
|
10,
|
|
"WALLS1.LBM",
|
|
"W1_8",
|
|
26,
|
|
10,
|
|
"WALLS2.LBM",
|
|
"W2_1",
|
|
2,
|
|
2,
|
|
"WALLS2.LBM",
|
|
"W2_2",
|
|
10,
|
|
2,
|
|
"WALLS2.LBM",
|
|
"W2_3",
|
|
18,
|
|
2,
|
|
"WALLS2.LBM",
|
|
"W2_4",
|
|
26,
|
|
2,
|
|
"WALLS2.LBM",
|
|
"W2_5",
|
|
2,
|
|
10,
|
|
"WALLS2.LBM",
|
|
"W2_6",
|
|
10,
|
|
10,
|
|
"WALLS2.LBM",
|
|
"W2_7",
|
|
18,
|
|
10,
|
|
"WALLS2.LBM",
|
|
"W2_8",
|
|
26,
|
|
10,
|
|
"WALLS3.LBM",
|
|
"W3_1",
|
|
2,
|
|
2,
|
|
"WALLS3.LBM",
|
|
"W3_2",
|
|
11,
|
|
2,
|
|
"WALLS3.LBM",
|
|
"W3_3",
|
|
20,
|
|
2,
|
|
"WALLS3.LBM",
|
|
"W3_4",
|
|
29,
|
|
2,
|
|
"WALLS3.LBM",
|
|
"W3_5",
|
|
2,
|
|
11,
|
|
"WALLS3.LBM",
|
|
"W3_6",
|
|
11,
|
|
11,
|
|
"WALLS3.LBM",
|
|
"W3_7",
|
|
20,
|
|
11,
|
|
"WALLS3.LBM",
|
|
"W3_8",
|
|
29,
|
|
11,
|
|
"WALLS4.LBM",
|
|
"W4_1",
|
|
2,
|
|
2,
|
|
"WALLS4.LBM",
|
|
"W4_2",
|
|
11,
|
|
2,
|
|
"WALLS4.LBM",
|
|
"W4_3",
|
|
20,
|
|
2,
|
|
"WALLS4.LBM",
|
|
"W4_4",
|
|
29,
|
|
2,
|
|
"WALLS4.LBM",
|
|
"W4_5",
|
|
2,
|
|
11,
|
|
"WALLS4.LBM",
|
|
"W4_6",
|
|
11,
|
|
11,
|
|
"WALLS4.LBM",
|
|
"W4_7",
|
|
20,
|
|
11,
|
|
"WALLS4.LBM",
|
|
"W4_8",
|
|
29,
|
|
11,
|
|
"WALLS5.LBM",
|
|
"W5_1",
|
|
2,
|
|
2,
|
|
"WALLS5.LBM",
|
|
"W5_2",
|
|
11,
|
|
2,
|
|
"WALLS5.LBM",
|
|
"W5_3",
|
|
20,
|
|
2,
|
|
"WALLS5.LBM",
|
|
"W5_4",
|
|
29,
|
|
2,
|
|
"WALLS5.LBM",
|
|
"W5_5",
|
|
2,
|
|
11,
|
|
"WALLS5.LBM",
|
|
"W5_6",
|
|
11,
|
|
11,
|
|
"WALLS5.LBM",
|
|
"W5_7",
|
|
20,
|
|
11,
|
|
"WALLS5.LBM",
|
|
"W5_8",
|
|
29,
|
|
11,
|
|
"WALLS6.LBM",
|
|
"W6_1",
|
|
2,
|
|
2,
|
|
"WALLS6.LBM",
|
|
"W5_2",
|
|
11,
|
|
2,
|
|
"WALLS6.LBM",
|
|
"W5_3",
|
|
20,
|
|
2,
|
|
"WALLS6.LBM",
|
|
"W5_4",
|
|
29,
|
|
2,
|
|
"WALLS6.LBM",
|
|
"W5_5",
|
|
2,
|
|
11,
|
|
"WALLS6.LBM",
|
|
"W5_6",
|
|
11,
|
|
11,
|
|
"WALLS6.LBM",
|
|
"W5_7",
|
|
20,
|
|
11,
|
|
"WALLS6.LBM",
|
|
"W5_8",
|
|
29,
|
|
11,
|
|
"FLATS1.LBM",
|
|
"F1_1",
|
|
2,
|
|
2,
|
|
"FLATS1.LBM",
|
|
"F1_2",
|
|
11,
|
|
2,
|
|
"FLATS1.LBM",
|
|
"F1_3",
|
|
20,
|
|
2,
|
|
"FLATS1.LBM",
|
|
"F1_4",
|
|
29,
|
|
2,
|
|
"FLATS1.LBM",
|
|
"F1_5",
|
|
2,
|
|
11,
|
|
"FLATS1.LBM",
|
|
"F1_6",
|
|
11,
|
|
11,
|
|
"FLATS1.LBM",
|
|
"F1_7",
|
|
20,
|
|
11,
|
|
"FLATS1.LBM",
|
|
"F1_8",
|
|
29,
|
|
11,
|
|
"FLATS2.LBM",
|
|
"F2_1",
|
|
2,
|
|
2,
|
|
"FLATS2.LBM",
|
|
"F2_2",
|
|
11,
|
|
2,
|
|
"FLATS2.LBM",
|
|
"F2_3",
|
|
2,
|
|
11,
|
|
"FLATS2.LBM",
|
|
"F2_4",
|
|
11,
|
|
11,
|
|
"ACTORS1.LBM",
|
|
"A1_1",
|
|
2,
|
|
2,
|
|
"ACTORS1.LBM",
|
|
"A1_2",
|
|
11,
|
|
2,
|
|
"ACTORS1.LBM",
|
|
"P1_1",
|
|
20,
|
|
2,
|
|
"ACTORS1.LBM",
|
|
"W1_1",
|
|
29,
|
|
2,
|
|
"ACTORS1.LBM",
|
|
"A1_3",
|
|
11,
|
|
11,
|
|
"ACTORS1.LBM",
|
|
"W1_1",
|
|
2,
|
|
11,
|
|
"ACTORS1.LBM",
|
|
"W1_1",
|
|
20,
|
|
11,
|
|
"ACTORS1.LBM",
|
|
"W1_1",
|
|
29,
|
|
11,
|
|
"ACTORS2.LBM",
|
|
"U1_1",
|
|
2,
|
|
2,
|
|
"ACTORS2.LBM",
|
|
"U1_1",
|
|
11,
|
|
2,
|
|
"ACTORS2.LBM",
|
|
"B1_1",
|
|
20,
|
|
2,
|
|
"ACTORS2.LBM",
|
|
"C1_1",
|
|
29,
|
|
2,
|
|
"ACTORS2.LBM",
|
|
"J1_1",
|
|
2,
|
|
11,
|
|
"ACTORS1.LBM",
|
|
"VERTICAL DOOR",
|
|
29,
|
|
2,
|
|
"ACTORS2.LBM",
|
|
"A1_1",
|
|
11,
|
|
11,
|
|
};
|
|
|
|
char far *FillCursor[] =
|
|
{ "THISISATEST!!!"};
|
|
|
|
char far *userfnt1;
|
|
char *FillPic = NULL;
|
|
|
|
char IN_ACTIVE_AREA = 0;
|
|
char DONE_DRAWING = 0;
|
|
char FILL_ACTIVE = 0;
|
|
char UPDATE_PIC_LBM = 1;
|
|
char DRAW_FROM_PIC = 1;
|
|
char GRAPHIC_CURSOR = 0;
|
|
char CurrentDrawMode = DM_WESTWALL;
|
|
char CurrentCursor = CC_WESTWALL;
|
|
char OldCursor = CurrentCursor;
|
|
char CurrentPic = 0;
|
|
char MinPic = 0;
|
|
char StartWallPic = 0;
|
|
char MaxWallPic = 47;
|
|
char MaxPic = MaxWallPic;
|
|
char StartFlatPic = MaxWallPic + 1;
|
|
char MaxFlatPic = StartFlatPic + 11;
|
|
char StartActorPic = MaxFlatPic + 1;
|
|
char MaxActorPic = StartActorPic + 14;
|
|
char MaxScriptPic = MaxActorPic;
|
|
|
|
int OldMouseX;
|
|
int OldMouseY;
|
|
int NewMouseX;
|
|
int NewMouseY;
|
|
char GRIDX;
|
|
char GRIDY;
|
|
char FillStartX;
|
|
char FillStartY;
|
|
char GridBaseX = 0;
|
|
char GridBaseY = 0;
|
|
|
|
int buttons[] =
|
|
{
|
|
214, 73, 241, 81, 1,
|
|
214, 85, 241, 93, 1,
|
|
246, 73, 273, 81, 1,
|
|
246, 85, 273, 93, 1,
|
|
278, 73, 305, 81, 1,
|
|
278, 85, 305, 93, 1,
|
|
212, 133, 223, 144, 1,
|
|
294, 133, 305, 144, 1,
|
|
|
|
215, 32, 230, 47, 1,
|
|
233, 32, 248, 47, 1,
|
|
251, 32, 266, 47, 1,
|
|
269, 32, 284, 47, 1,
|
|
287, 32, 302, 47, 1,
|
|
215, 50, 230, 65, 1,
|
|
233, 50, 248, 65, 1,
|
|
251, 50, 266, 65, 1,
|
|
269, 50, 284, 65, 1,
|
|
287, 50, 302, 65, 1,
|
|
|
|
0, 0, 27, 8, 0, // DIALOG BUTTONS
|
|
0, 9, 27, 17, 0, // Start out at grab position in graphix file
|
|
0, 18, 27, 26, 0, // Are filled in on the fly leter based on where
|
|
0, 27, 27, 35, 0, // dialog is to be shown
|
|
|
|
0, 0, 0, 0, 0
|
|
};
|
|
|
|
char *DrawModes[] =
|
|
{
|
|
"DRAW INACTIVE",
|
|
"WEST WALL",
|
|
"NORTH WALL",
|
|
"FLOOR",
|
|
"CEILING",
|
|
"SPRITE PLACEMENT",
|
|
"",
|
|
};
|
|
|
|
char DialogButtons[4][300];
|
|
char DrawCursors[7][146];
|
|
char DrawBuffer[TILE_SIZE*TILE_SIZE+2];
|
|
//char Pics[4][MAX_TILES][TILE_SIZE*TILE_SIZE+2];
|
|
picStruct Pics[4][MAX_TILES];
|
|
|
|
char map[MAP_LAYERS][MAP_SIZE*MAP_SIZE];
|
|
|
|
void main(void)
|
|
{
|
|
int i;
|
|
int j;
|
|
|
|
userfnt1 = (char far *) farmalloc(256*16+4);
|
|
|
|
x_text_mode();
|
|
x_set_mode(X_MODE_320x200,340);
|
|
x_text_init();
|
|
NonVisual_Offs += ScrnLogicalByteWidth * 14; // Fixes mouse droppings prob.
|
|
x_mouse_init();
|
|
MouseColor=103;
|
|
atexit(exitfunc);
|
|
load_user_fonts();
|
|
x_set_doublebuffer(200);
|
|
|
|
for (i=0; i < 4; i++)
|
|
for (j=0; j < MAX_TILES; j++)
|
|
Pics[i][j].pbm = (char *) malloc (TILE_SIZE*TILE_SIZE+2);
|
|
|
|
setUpInterface();
|
|
|
|
drawLoop();
|
|
|
|
for (i=0; i < 4; i++)
|
|
for (j=0; j < MAX_TILES; j++)
|
|
free(Pics[i][j].pbm);
|
|
|
|
} // main
|
|
|
|
void drawLoop(void)
|
|
{
|
|
x_mouse_window(0, 0, 319, 199);
|
|
|
|
x_show_mouse();
|
|
|
|
while (!DONE_DRAWING)
|
|
{
|
|
handleUserActions();
|
|
handleMouseCursor();
|
|
} // while
|
|
|
|
x_hide_mouse();
|
|
} // drawLoop
|
|
|
|
void handleUserActions(void)
|
|
{
|
|
char BUTTON_FOUND = 0;
|
|
char currentButton;
|
|
int currentKey;
|
|
|
|
if (MouseButtonStatus & LEFT_MOUSE_CLICK)
|
|
{
|
|
currentButton = 0;
|
|
while ((!BUTTON_FOUND) && (currentButton != END_OF_BUTTONS))
|
|
{
|
|
if ((MouseOnButton(currentButton)) &&
|
|
(buttons[currentButton*5+4]))
|
|
{
|
|
handleButton(currentButton);
|
|
BUTTON_FOUND = 1;
|
|
} // if
|
|
|
|
currentButton++;
|
|
} // while
|
|
} // if
|
|
else if (bioskey(1))
|
|
{
|
|
currentKey = bioskey(0);
|
|
if (!(currentKey & 0xFF))
|
|
currentKey = (currentKey >> 8) + 256;
|
|
else
|
|
currentKey = currentKey & 0xFF;
|
|
|
|
handleKeystroke(currentKey);
|
|
} // else
|
|
} // handleUserActions
|
|
|
|
void handleKeystroke(int whichKey)
|
|
{
|
|
switch (whichKey)
|
|
{
|
|
case UP_KEY :
|
|
if (GridBaseY > 0)
|
|
{
|
|
if (IN_ACTIVE_AREA)
|
|
x_put_pbm(OldMouseX, OldMouseY, Page0_Offs, DrawCursors[0]);
|
|
else
|
|
x_hide_mouse();
|
|
|
|
x_shift_rect(AA_BASEX, AA_BASEY,
|
|
AA_MAXX-3, AA_MAXY-TILE_SIZE,
|
|
AA_BASEX, AA_BASEY+TILE_SIZE, Page0_Offs);
|
|
GridBaseY--;
|
|
RedrawRow(0);
|
|
x_get_pbm(OldMouseX, OldMouseY, TILE_SIZE/4, TILE_SIZE, Page0_Offs, DrawCursors[0]);
|
|
|
|
if (IN_ACTIVE_AREA)
|
|
x_put_masked_pbm(OldMouseX, OldMouseY, Page0_Offs,
|
|
DrawCursors[CurrentCursor]);
|
|
else
|
|
x_show_mouse();
|
|
|
|
showMouseCoords((OldMouseX-4)/TILE_SIZE,(OldMouseY-4)/TILE_SIZE);
|
|
} // if
|
|
break;
|
|
|
|
case DOWN_KEY :
|
|
if (GridBaseY + MAP_VIEW_SIZE -1 < MAP_SIZE-1)
|
|
{
|
|
if (IN_ACTIVE_AREA)
|
|
x_put_pbm(OldMouseX, OldMouseY, Page0_Offs, DrawCursors[0]);
|
|
else
|
|
x_hide_mouse();
|
|
|
|
x_shift_rect(AA_BASEX, AA_BASEY+TILE_SIZE,
|
|
AA_MAXX-3, AA_MAXY,
|
|
AA_BASEX, AA_BASEY, Page0_Offs);
|
|
GridBaseY++;
|
|
RedrawRow(MAP_VIEW_SIZE-1);
|
|
x_get_pbm(OldMouseX, OldMouseY, TILE_SIZE/4, TILE_SIZE, Page0_Offs, DrawCursors[0]);
|
|
|
|
if (IN_ACTIVE_AREA)
|
|
x_put_masked_pbm(OldMouseX, OldMouseY, Page0_Offs,
|
|
DrawCursors[CurrentCursor]);
|
|
else
|
|
x_show_mouse();
|
|
|
|
showMouseCoords((OldMouseX-4)/TILE_SIZE,(OldMouseY-4)/TILE_SIZE);
|
|
} // if
|
|
break;
|
|
|
|
case LEFT_KEY :
|
|
|
|
if (GridBaseX > 0)
|
|
{
|
|
if (IN_ACTIVE_AREA)
|
|
x_put_pbm(OldMouseX, OldMouseY, Page0_Offs, DrawCursors[0]);
|
|
else
|
|
x_hide_mouse();
|
|
x_shift_rect(AA_BASEX, AA_BASEY, AA_MAXX-TILE_SIZE-3,
|
|
AA_MAXY, AA_BASEX+TILE_SIZE, AA_BASEY, Page0_Offs);
|
|
GridBaseX--;
|
|
RedrawCol(0);
|
|
x_get_pbm(OldMouseX, OldMouseY, TILE_SIZE/4, TILE_SIZE, Page0_Offs, DrawCursors[0]);
|
|
|
|
if (IN_ACTIVE_AREA)
|
|
x_put_masked_pbm(OldMouseX, OldMouseY, Page0_Offs,
|
|
DrawCursors[CurrentCursor]);
|
|
else
|
|
x_show_mouse();
|
|
|
|
showMouseCoords((OldMouseX-4)/TILE_SIZE,(OldMouseY-4)/TILE_SIZE);
|
|
} // if
|
|
break;
|
|
|
|
case RIGHT_KEY :
|
|
|
|
if (GridBaseX + MAP_VIEW_SIZE - 1 < MAP_SIZE-1)
|
|
{
|
|
if (IN_ACTIVE_AREA)
|
|
x_put_pbm(OldMouseX, OldMouseY, Page0_Offs, DrawCursors[0]);
|
|
else
|
|
x_hide_mouse();
|
|
x_shift_rect(AA_BASEX+TILE_SIZE, AA_BASEY, AA_MAXX-3,
|
|
AA_MAXY, AA_BASEX, AA_BASEY, Page0_Offs);
|
|
GridBaseX++;
|
|
RedrawCol(MAP_VIEW_SIZE-1);
|
|
x_get_pbm(OldMouseX, OldMouseY, TILE_SIZE/4, TILE_SIZE, Page0_Offs, DrawCursors[0]);
|
|
|
|
if (IN_ACTIVE_AREA)
|
|
x_put_masked_pbm(OldMouseX, OldMouseY, Page0_Offs,
|
|
DrawCursors[CurrentCursor]);
|
|
else
|
|
x_show_mouse();
|
|
|
|
showMouseCoords((OldMouseX-4)/TILE_SIZE,(OldMouseY-4)/TILE_SIZE);
|
|
} // if
|
|
|
|
// break;
|
|
} // switch
|
|
} // handleKeyStroke
|
|
|
|
void handleButton(char whichButton)
|
|
{
|
|
pushButton(whichButton);
|
|
|
|
if (!MouseOnButton(whichButton)) // check if still modal to button
|
|
return;
|
|
|
|
switch (whichButton)
|
|
{
|
|
case EXIT_BUTTON :
|
|
|
|
if (MessageBox(160, 100, Page0_Offs, "Are you sure you want to exit?",
|
|
"Last Chance", ID_YESNO) == ID_YES)
|
|
DONE_DRAWING = 1;
|
|
|
|
break;
|
|
|
|
case SAVE_BUTTON :
|
|
if (MessageBox(160, 100, Page0_Offs,
|
|
"Do you want to save?",
|
|
"", ID_YESNO | ID_NOTITLE) == ID_YES)
|
|
{
|
|
if (MessageBox(160, 100, Page0_Offs,
|
|
"Do you want to insert\ninto .TOD file?",
|
|
"", ID_YESNO | ID_NOTITLE) == ID_YES)
|
|
SaveMapToTOD();
|
|
else
|
|
SaveMapToFile("TODD.MAP");
|
|
} // if
|
|
break;
|
|
|
|
case LOAD_BUTTON :
|
|
if (MessageBox(160, 100, Page0_Offs,
|
|
"Do you want to load?",
|
|
"", ID_YESNO | ID_NOTITLE) == ID_YES)
|
|
{
|
|
if (MessageBox(160, 100, Page0_Offs,
|
|
"Do you want to extract\nfrom .TOD file?",
|
|
"", ID_YESNO | ID_NOTITLE) == ID_YES)
|
|
LoadMapFromTOD();
|
|
else
|
|
LoadMapFromFile("TODD.MAP");
|
|
|
|
RedrawMap();
|
|
} // if
|
|
break;
|
|
|
|
case EXTRA_BUTTON :
|
|
|
|
MessageBox(160, 100, Page0_Offs,
|
|
"This button has no\nmeaning as of yet.", "", ID_OK | ID_NOTITLE);
|
|
|
|
break;
|
|
|
|
case FILL_BUTTON :
|
|
|
|
if (CurrentCursor == CC_FILL)
|
|
CurrentCursor = OldCursor;
|
|
else
|
|
{
|
|
OldCursor = CurrentCursor;
|
|
CurrentCursor = CC_FILL;
|
|
} // else
|
|
|
|
if (IN_ACTIVE_AREA)
|
|
{
|
|
x_put_masked_pbm(OldMouseX, OldMouseY, Page0_Offs,DrawCursors[0]);
|
|
x_put_masked_pbm(OldMouseX, OldMouseY, Page0_Offs,
|
|
DrawCursors[CurrentCursor]);
|
|
} // if
|
|
|
|
break;
|
|
|
|
case NEW_BUTTON :
|
|
|
|
if (MessageBox(160, 100, Page0_Offs,
|
|
"Do you wish to start a\nnew map from scratch?",
|
|
"Last Chance", ID_YESNO) == ID_YES)
|
|
{
|
|
memset(map, 0, MAP_LAYERS*MAP_SIZE*MAP_SIZE);
|
|
RedrawMap();
|
|
} // if
|
|
|
|
break;
|
|
|
|
case WALL_BUTTON :
|
|
if ((CurrentDrawMode != DM_WESTWALL) &&
|
|
(CurrentDrawMode != DM_NORTHWALL))
|
|
{
|
|
MinPic = StartWallPic;
|
|
CurrentPic = StartWallPic;
|
|
MaxPic = MaxWallPic;
|
|
|
|
UPDATE_PIC_LBM = 1;
|
|
|
|
showCurrentPic();
|
|
showItemName();
|
|
} // if
|
|
|
|
if (CurrentDrawMode == DM_WESTWALL)
|
|
{
|
|
CurrentDrawMode = DM_NORTHWALL;
|
|
CurrentCursor = CC_NORTHWALL;
|
|
} // if
|
|
else
|
|
{
|
|
CurrentDrawMode = DM_WESTWALL;
|
|
CurrentCursor = CC_WESTWALL;
|
|
} // else
|
|
showDrawMode();
|
|
|
|
break;
|
|
|
|
case FLOOR_BUTTON :
|
|
CurrentDrawMode = DM_FLOOR;
|
|
CurrentCursor = CC_FLAT;
|
|
showDrawMode();
|
|
|
|
MinPic = StartFlatPic;
|
|
CurrentPic = StartFlatPic;
|
|
MaxPic = MaxFlatPic;
|
|
|
|
UPDATE_PIC_LBM = 1;
|
|
|
|
showCurrentPic();
|
|
showItemName();
|
|
|
|
break;
|
|
|
|
case CEILING_BUTTON :
|
|
CurrentDrawMode = DM_CEILING;
|
|
CurrentCursor = CC_FLAT;
|
|
showDrawMode();
|
|
|
|
MinPic = StartFlatPic;
|
|
CurrentPic = StartFlatPic;
|
|
MaxPic = MaxFlatPic;
|
|
|
|
UPDATE_PIC_LBM = 1;
|
|
|
|
showCurrentPic();
|
|
showItemName();
|
|
break;
|
|
|
|
case SPRITE_BUTTON :
|
|
CurrentDrawMode = DM_SPRITE;
|
|
CurrentCursor = CC_ACTOR;
|
|
showDrawMode();
|
|
|
|
MinPic = StartActorPic;
|
|
CurrentPic = StartActorPic;
|
|
MaxPic = MaxActorPic;
|
|
|
|
UPDATE_PIC_LBM = 1;
|
|
|
|
showCurrentPic();
|
|
showItemName();
|
|
break;
|
|
|
|
case TT4_BUTTON :
|
|
case TT5_BUTTON :
|
|
case TT7_BUTTON :
|
|
case TT9_BUTTON :
|
|
case TT10_BUTTON :
|
|
|
|
break;
|
|
|
|
case PIC_LEFT_BUTTON :
|
|
if (CurrentPic > MinPic)
|
|
{
|
|
if (stricmp(scripts[CurrentPic].picFile,scripts[CurrentPic-1].picFile))
|
|
UPDATE_PIC_LBM = 1;
|
|
CurrentPic--;
|
|
showCurrentPic();
|
|
showItemName();
|
|
} // if
|
|
break;
|
|
|
|
case PIC_RIGHT_BUTTON :
|
|
if (CurrentPic < MaxPic)
|
|
{
|
|
if (stricmp(scripts[CurrentPic].picFile,scripts[CurrentPic+1].picFile))
|
|
UPDATE_PIC_LBM = 1;
|
|
CurrentPic++;
|
|
showCurrentPic();
|
|
showItemName();
|
|
} // if
|
|
break;
|
|
|
|
} // switch
|
|
} // handleButton
|
|
|
|
void pushButton(char whichButton)
|
|
{
|
|
char buttonBuffer[1000];
|
|
char BUTTON_DOWN = 1;
|
|
|
|
x_hide_mouse();
|
|
|
|
x_get_pbm(buttons[whichButton*5], buttons[whichButton*5+1],
|
|
(buttons[whichButton*5+2] - buttons[whichButton*5] + 1) / 4,
|
|
buttons[whichButton*5+3] - buttons[whichButton*5+1] + 1,
|
|
Page0_Offs, buttonBuffer);
|
|
x_rect_fill(buttons[whichButton*5] - 1, buttons[whichButton*5+1] - 1,
|
|
buttons[whichButton*5+2] + 2, buttons[whichButton*5+3] + 2,
|
|
Page0_Offs, 0);
|
|
x_put_pbm(buttons[whichButton*5] + 1, buttons[whichButton*5+1] + 1,
|
|
Page0_Offs, buttonBuffer);
|
|
|
|
x_show_mouse();
|
|
|
|
while (MouseButtonStatus & LEFT_MOUSE_CLICK)
|
|
{
|
|
if (BUTTON_DOWN)
|
|
{
|
|
if (!MouseOnButton(whichButton))
|
|
{
|
|
x_hide_mouse();
|
|
x_rect_fill(buttons[whichButton*5] - 1, buttons[whichButton*5+1] - 1,
|
|
buttons[whichButton*5+2] + 2, buttons[whichButton*5+3] + 2,
|
|
Page0_Offs, 0);
|
|
x_put_pbm(buttons[whichButton*5], buttons[whichButton*5+1],
|
|
Page0_Offs, buttonBuffer);
|
|
x_show_mouse();
|
|
|
|
BUTTON_DOWN = 0;
|
|
} // if
|
|
} // if
|
|
else
|
|
{
|
|
if (MouseOnButton(whichButton))
|
|
{
|
|
x_hide_mouse();
|
|
x_rect_fill(buttons[whichButton*5] - 1, buttons[whichButton*5+1] - 1,
|
|
buttons[whichButton*5+2] + 2, buttons[whichButton*5+3] + 2,
|
|
Page0_Offs, 0);
|
|
x_put_pbm(buttons[whichButton*5] + 1, buttons[whichButton*5+1] + 1,
|
|
Page0_Offs, buttonBuffer);
|
|
x_show_mouse();
|
|
|
|
BUTTON_DOWN = 1;
|
|
} // if
|
|
} // else
|
|
};
|
|
|
|
x_hide_mouse();
|
|
|
|
x_rect_fill(buttons[whichButton*5] - 1, buttons[whichButton*5+1] - 1,
|
|
buttons[whichButton*5+2] + 2, buttons[whichButton*5+3] + 2,
|
|
Page0_Offs, 0);
|
|
x_put_pbm(buttons[whichButton*5], buttons[whichButton*5+1],
|
|
Page0_Offs, buttonBuffer);
|
|
|
|
x_show_mouse();
|
|
} // pushButton
|
|
|
|
char MouseOnButton(char whichButton)
|
|
{
|
|
if ((MouseX >= buttons[whichButton*5]) &&
|
|
(MouseX <= buttons[whichButton*5+2]) &&
|
|
(MouseY >= buttons[whichButton*5+1]) &&
|
|
(MouseY <= buttons[whichButton*5+3]))
|
|
return 1;
|
|
|
|
return 0;
|
|
} // MouseOnButton
|
|
|
|
void handleOptionButtons(void)
|
|
{
|
|
} // handleOptionButtons
|
|
|
|
void setUpInterface(void)
|
|
{
|
|
memset(map, 0, MAP_LAYERS*MAP_SIZE*MAP_SIZE);
|
|
// memset(Pics, 0, 4*MAX_TILES);
|
|
|
|
x_set_font(2);
|
|
|
|
x_page_flip(0, 0);
|
|
|
|
x_rect_fill(110, 80, 210, 120, Page1_Offs, 1);
|
|
x_printf(115, 95, Page1_Offs, 10, "Initializing MAZER...");
|
|
|
|
showLBM(0, 0, PROGRAM_GRAPHIX, Page0_Offs);
|
|
x_get_pbm(buttons[OKAY_BUTTON*5], buttons[OKAY_BUTTON*5+1],
|
|
(buttons[OKAY_BUTTON*5+2] - buttons[OKAY_BUTTON*5] + 1) / 4,
|
|
buttons[OKAY_BUTTON*5+3] - buttons[OKAY_BUTTON*5+1] + 1,
|
|
Page0_Offs, DialogButtons[DLG_OKAY]);
|
|
x_get_pbm(buttons[CANCEL_BUTTON*5], buttons[CANCEL_BUTTON*5+1],
|
|
(buttons[CANCEL_BUTTON*5+2] - buttons[CANCEL_BUTTON*5] + 1) / 4,
|
|
buttons[CANCEL_BUTTON*5+3] - buttons[CANCEL_BUTTON*5+1] + 1,
|
|
Page0_Offs, DialogButtons[DLG_CANCEL]);
|
|
x_get_pbm(buttons[YES_BUTTON*5], buttons[YES_BUTTON*5+1],
|
|
(buttons[YES_BUTTON*5+2] - buttons[YES_BUTTON*5] + 1) / 4,
|
|
buttons[YES_BUTTON*5+3] - buttons[YES_BUTTON*5+1] + 1,
|
|
Page0_Offs, DialogButtons[DLG_YES]);
|
|
x_get_pbm(buttons[NO_BUTTON*5], buttons[NO_BUTTON*5+1],
|
|
(buttons[NO_BUTTON*5+2] - buttons[NO_BUTTON*5] + 1) / 4,
|
|
buttons[NO_BUTTON*5+3] - buttons[NO_BUTTON*5+1] + 1,
|
|
Page0_Offs, DialogButtons[DLG_NO]);
|
|
x_get_pbm(0,45,TILE_SIZE/4,TILE_SIZE,Page0_Offs, DrawCursors[1]);
|
|
x_get_pbm(13,45,TILE_SIZE/4,TILE_SIZE,Page0_Offs, DrawCursors[2]);
|
|
x_get_pbm(26,45,TILE_SIZE/4,TILE_SIZE,Page0_Offs, DrawCursors[3]);
|
|
x_get_pbm(39,45,TILE_SIZE/4,TILE_SIZE,Page0_Offs, DrawCursors[4]);
|
|
x_get_pbm(52,45,TILE_SIZE/4,TILE_SIZE,Page0_Offs, DrawCursors[5]);
|
|
x_get_pbm(65,45, TILE_SIZE/4, TILE_SIZE, Page0_Offs, DrawCursors[6]);
|
|
|
|
ScaleTiles();
|
|
|
|
showLBM(0, 0, INTERFACE_SCREEN, Page0_Offs);
|
|
|
|
showDrawMode();
|
|
showItemName();
|
|
|
|
x_page_flip(0, 0);
|
|
|
|
showCurrentPic();
|
|
} // setUpInterface
|
|
|
|
void load_user_fonts(void)
|
|
{
|
|
FILE *f;
|
|
f=fopen("smalthin.fnt","rb");
|
|
/* read char by char as fread wont read to far pointers in small model */
|
|
{ int i; char c;
|
|
for (i=0;i<256*8+4;i++){
|
|
fread(&c,1,1,f);
|
|
*(userfnt1+i)=c;
|
|
}
|
|
}
|
|
|
|
fclose(f);
|
|
|
|
x_register_userfont(userfnt1);
|
|
}
|
|
|
|
void exitfunc(void){
|
|
x_mouse_remove();
|
|
x_text_mode();
|
|
printf("Ta-da\n");
|
|
}
|
|
|
|
char MessageBox(int baseX, int baseY,
|
|
long pageOffset, char * textMsg, char * titleMsg,
|
|
int buttonFlag)
|
|
{
|
|
char Xoffset = 5;
|
|
char Yoffset = 5;
|
|
char TitleHeight = 10;
|
|
char TitleYoffset = 8;
|
|
char TextYoffset = 10;
|
|
char ButtonHeight = 9;
|
|
char ButtonWidth = 28;
|
|
int ButtonStart = 0;
|
|
int width = 100;
|
|
int height = 50;
|
|
char showButtons;
|
|
char ActiveButton = 0;
|
|
char AlterButton = 0;
|
|
|
|
char *boxBG = NULL;
|
|
|
|
int defaultColors[] =
|
|
{
|
|
139, // basic color
|
|
154, // hilite color
|
|
144, // lolite color
|
|
79, // title bar color
|
|
255, // text color
|
|
103 // title text color
|
|
};
|
|
|
|
int stringWidth;
|
|
int stringHeight;
|
|
|
|
char numButtons = 0;
|
|
char currentButton = 0;
|
|
char BUTTON_FOUND = 0;
|
|
char return_value = 0;
|
|
|
|
|
|
if ((x_strlen(textMsg) > x_strlen(titleMsg)) ||
|
|
(buttonFlag & ID_NOTITLE))
|
|
width = x_strlen(textMsg) + Xoffset * 2;
|
|
else
|
|
width = x_strlen(titleMsg) + Xoffset * 4;
|
|
|
|
height = x_strheight(textMsg) + Yoffset * 2;
|
|
if (!(buttonFlag & ID_NOTITLE))
|
|
height += TitleHeight + TextYoffset + Yoffset;
|
|
|
|
if (!(buttonFlag & ID_NOBUTTONS))
|
|
height += ButtonHeight + Yoffset;
|
|
|
|
if (buttonFlag & ID_OK)
|
|
{
|
|
buttons[OKAY_BUTTON*5+4] = 1;
|
|
numButtons++;
|
|
}
|
|
if (buttonFlag & ID_CANCEL)
|
|
{
|
|
buttons[CANCEL_BUTTON*5+4] = 1;
|
|
numButtons++;
|
|
}
|
|
if (buttonFlag & ID_YES)
|
|
{
|
|
buttons[YES_BUTTON*5+4] = 1;
|
|
numButtons++;
|
|
}
|
|
if (buttonFlag & ID_NO)
|
|
{
|
|
buttons[NO_BUTTON*5+4] = 1;
|
|
numButtons++;
|
|
}
|
|
|
|
if ((numButtons * (ButtonWidth+2)) + ((numButtons-1) * Xoffset) +
|
|
(Xoffset * 2) > width)
|
|
width = (numButtons * ButtonWidth) + ((numButtons-1) * Xoffset) +
|
|
(Xoffset * 2);
|
|
|
|
// to account for 4 pixel byte boundary
|
|
width += 4 - (width % 4);
|
|
|
|
baseX -= width / 2;
|
|
baseY -= height / 2;
|
|
|
|
deactivateMainButtons();
|
|
|
|
x_hide_mouse();
|
|
|
|
boxBG = (char *) malloc(width*height+2);
|
|
x_get_pbm(baseX, baseY, width/4, height, pageOffset, boxBG);
|
|
|
|
x_rect_fill(baseX, baseY, baseX+width-1, baseY+height-1,
|
|
pageOffset, defaultColors[0]);
|
|
x_line(baseX, baseY, baseX+width-1, baseY,
|
|
defaultColors[1], pageOffset);
|
|
x_line(baseX, baseY, baseX, baseY+height-1,
|
|
defaultColors[1], pageOffset);
|
|
x_line(baseX, baseY+height-1, baseX+width-1, baseY+height-1,
|
|
defaultColors[2], pageOffset);
|
|
x_line(baseX+width-1, baseY, baseX+width-1, baseY+height-1,
|
|
defaultColors[2], pageOffset);
|
|
|
|
if (!(buttonFlag & ID_NOTITLE))
|
|
{
|
|
x_rect_fill(baseX+Xoffset, baseY+Yoffset,
|
|
baseX+width-1-Xoffset, baseY+Yoffset+TitleHeight,
|
|
pageOffset, defaultColors[3]);
|
|
x_line(baseX+Xoffset, baseY+Yoffset,
|
|
baseX+width-1-Xoffset, baseY+Yoffset,
|
|
defaultColors[2], pageOffset);
|
|
x_line(baseX+Xoffset, baseY+Yoffset,
|
|
baseX+Xoffset, baseY+Yoffset+TitleHeight,
|
|
defaultColors[2], pageOffset);
|
|
x_line(baseX+Xoffset, baseY+Yoffset+TitleHeight,
|
|
baseX+width-1-Xoffset, baseY+Yoffset+TitleHeight,
|
|
defaultColors[1], pageOffset);
|
|
x_line(baseX+width-1-Xoffset, baseY+Yoffset,
|
|
baseX+width-1-Xoffset, baseY+Yoffset+TitleHeight,
|
|
defaultColors[1], pageOffset);
|
|
|
|
stringWidth = x_strlen(titleMsg);
|
|
x_printf(baseX+(width/2)-(stringWidth/2), baseY+TitleYoffset,
|
|
pageOffset, defaultColors[5], titleMsg);
|
|
} // if
|
|
else
|
|
{
|
|
TitleHeight = 0;
|
|
TextYoffset = 0;
|
|
} // else
|
|
|
|
stringWidth = x_strlen(textMsg);
|
|
x_printf(baseX+(width/2)-(stringWidth/2),
|
|
baseY+Yoffset+TitleHeight+TextYoffset,
|
|
pageOffset, defaultColors[4], textMsg);
|
|
|
|
if (!(buttonFlag & ID_NOBUTTONS))
|
|
{
|
|
ButtonStart = baseX + (width / 2) -
|
|
((numButtons * (ButtonWidth+2) +
|
|
(numButtons-1) * Xoffset) / 2);
|
|
for (showButtons = 0; showButtons < numButtons; showButtons++)
|
|
{
|
|
switch (showButtons)
|
|
{
|
|
case 0:
|
|
if (buttonFlag & ID_OK)
|
|
{
|
|
ActiveButton = DLG_OKAY;
|
|
AlterButton = OKAY_BUTTON;
|
|
} // if
|
|
else if (buttonFlag & ID_YES)
|
|
{
|
|
ActiveButton = DLG_YES;
|
|
AlterButton = YES_BUTTON;
|
|
} // else
|
|
break;
|
|
case 1:
|
|
if (buttonFlag & ID_CANCEL)
|
|
{
|
|
ActiveButton = DLG_CANCEL;
|
|
AlterButton = CANCEL_BUTTON;
|
|
} // if
|
|
else if (buttonFlag & ID_NO)
|
|
{
|
|
ActiveButton = DLG_NO;
|
|
AlterButton = NO_BUTTON;
|
|
} // else
|
|
break;
|
|
} // switch
|
|
|
|
buttons[AlterButton*5] = ButtonStart+1;
|
|
buttons[AlterButton*5+1] = baseY+height-1-Yoffset-ButtonHeight+1;
|
|
buttons[AlterButton*5+2] = buttons[AlterButton*5] + ButtonWidth - 1;
|
|
buttons[AlterButton*5+3] = buttons[AlterButton*5+1] + ButtonHeight - 1;
|
|
|
|
x_rect_fill(ButtonStart, baseY+height-1-Yoffset-ButtonHeight,
|
|
ButtonStart+ButtonWidth-1+3,
|
|
baseY+height-1-Yoffset-1+3,pageOffset,0);
|
|
x_put_pbm(ButtonStart+1, baseY+height-1-Yoffset-ButtonHeight+1,
|
|
pageOffset, DialogButtons[ActiveButton]);
|
|
|
|
ButtonStart += ButtonWidth + 2 + Xoffset;
|
|
|
|
} // for
|
|
} // if
|
|
|
|
x_show_mouse();
|
|
|
|
|
|
BUTTON_FOUND = 0;
|
|
|
|
while (!return_value)
|
|
{
|
|
if (MouseButtonStatus & LEFT_MOUSE_CLICK)
|
|
{
|
|
if (buttonFlag & ID_NOBUTTONS)
|
|
return_value = ID_OK;
|
|
|
|
currentButton = 0;
|
|
while ((!BUTTON_FOUND) && (currentButton != END_OF_BUTTONS))
|
|
{
|
|
if ((MouseOnButton(currentButton)) &&
|
|
(buttons[currentButton*5+4]))
|
|
{
|
|
|
|
pushButton(currentButton);
|
|
|
|
if (MouseOnButton(currentButton)) // check if still modal to button
|
|
{
|
|
|
|
switch (currentButton)
|
|
{
|
|
case OKAY_BUTTON:
|
|
return_value = ID_OK;
|
|
BUTTON_FOUND = 1;
|
|
break;
|
|
|
|
case CANCEL_BUTTON:
|
|
return_value = ID_CANCEL;
|
|
BUTTON_FOUND = 1;
|
|
break;
|
|
|
|
case YES_BUTTON:
|
|
return_value = ID_YES;
|
|
BUTTON_FOUND = 1;
|
|
break;
|
|
|
|
case NO_BUTTON:
|
|
return_value = ID_NO;
|
|
BUTTON_FOUND = 1;
|
|
break;
|
|
} // switch
|
|
} // if
|
|
} // if
|
|
|
|
currentButton++;
|
|
} // while
|
|
} // if
|
|
} // while
|
|
|
|
x_hide_mouse();
|
|
|
|
x_put_pbm(baseX, baseY, pageOffset, boxBG);
|
|
|
|
x_show_mouse();
|
|
|
|
deactivateDlgButtons();
|
|
activateMainButtons();
|
|
|
|
if (boxBG)
|
|
free(boxBG);
|
|
|
|
return return_value;
|
|
} // char
|
|
|
|
void deactivateMainButtons(void)
|
|
{
|
|
char runButtons = START_MAIN_BUT;
|
|
|
|
while ((runButtons < END_OF_MAIN_BUT) &&
|
|
(runButtons < END_OF_BUTTONS))
|
|
{
|
|
buttons[runButtons*5+4] = 0;
|
|
|
|
runButtons++;
|
|
} // while
|
|
} // deactivateMainButtons
|
|
|
|
void activateMainButtons(void)
|
|
{
|
|
char runButtons = START_MAIN_BUT;
|
|
|
|
while ((runButtons < END_OF_MAIN_BUT) &&
|
|
(runButtons < END_OF_BUTTONS))
|
|
{
|
|
buttons[runButtons*5+4] = 1;
|
|
|
|
runButtons++;
|
|
} // while
|
|
} // activateMainButtons
|
|
|
|
void deactivateDlgButtons(void)
|
|
{
|
|
char runButtons = START_DLG_BUT;
|
|
|
|
while ((runButtons < END_OF_DLG_BUT) &&
|
|
(runButtons < END_OF_BUTTONS))
|
|
{
|
|
buttons[runButtons*5+4] = 0;
|
|
|
|
runButtons++;
|
|
} // while
|
|
} // deactivateDlgButtons
|
|
|
|
void activateDlgButtons(void)
|
|
{
|
|
char runButtons = START_DLG_BUT;
|
|
|
|
while ((runButtons < END_OF_DLG_BUT) &&
|
|
(runButtons < END_OF_BUTTONS))
|
|
{
|
|
buttons[runButtons*5+4] = 1;
|
|
|
|
runButtons++;
|
|
} // while
|
|
} // activateDlgButtons
|
|
|
|
void showDrawMode(void)
|
|
{
|
|
x_rect_fill(DM_BASEX, DM_BASEY, DM_MAXX, DM_MAXY, Page0_Offs, DM_BGCOLOR);
|
|
x_printf(DM_BASEX+((DM_MAXX-DM_BASEX)/2)-
|
|
(x_strlen(DrawModes[CurrentDrawMode])/2),
|
|
DM_BASEY + 2,
|
|
Page0_Offs, DM_FGCOLOR, DrawModes[CurrentDrawMode]);
|
|
} // showDrawMode
|
|
|
|
void showItemName(void)
|
|
{
|
|
x_rect_fill(IN_BASEX, IN_BASEY, IN_MAXX, IN_MAXY, Page0_Offs, IN_BGCOLOR);
|
|
x_printf(IN_BASEX+((IN_MAXX-IN_BASEX)/2)-
|
|
(x_strlen(scripts[CurrentPic].picName)/2),
|
|
IN_BASEY + 2,
|
|
Page0_Offs, IN_FGCOLOR, scripts[CurrentPic].picName);
|
|
} // showItemName
|
|
|
|
void showMouseCoords(int posX, int posY)
|
|
{
|
|
char buffer[20];
|
|
|
|
sprintf(buffer, "%d, %d", GridBaseX+posX, GridBaseY+posY);
|
|
|
|
if (!IN_ACTIVE_AREA)
|
|
x_hide_mouse();
|
|
|
|
x_rect_fill(MC_BASEX, MC_BASEY, MC_MAXX, MC_MAXY, Page0_Offs, MC_BGCOLOR);
|
|
x_printf(MC_BASEX+2,
|
|
MC_BASEY + 2,
|
|
Page0_Offs, MC_FGCOLOR, buffer);
|
|
|
|
if (!IN_ACTIVE_AREA)
|
|
x_show_mouse();
|
|
|
|
} // showMouseCoords
|
|
|
|
void showCurrentPic(void)
|
|
{
|
|
char picBuf[4100];
|
|
|
|
x_hide_mouse();
|
|
|
|
if (UPDATE_PIC_LBM)
|
|
{
|
|
showLBM(0, 0, scripts[CurrentPic].picFile, Page1_Offs);
|
|
UPDATE_PIC_LBM = 0;
|
|
} // if
|
|
|
|
x_get_pbm(scripts[CurrentPic].Xoffset*8,
|
|
scripts[CurrentPic].Yoffset*8, 16, 64, Page1_Offs, picBuf);
|
|
x_put_pbm(PIC_BASEX, PIC_BASEY, Page0_Offs, picBuf);
|
|
|
|
x_show_mouse();
|
|
} // showCurrentPic
|
|
|
|
void handleMouseCursor(void)
|
|
{
|
|
NewMouseX = MouseX;
|
|
NewMouseY = MouseY;
|
|
|
|
|
|
if ((FILL_ACTIVE) &&
|
|
(!(MouseButtonStatus & LEFT_MOUSE_CLICK)))
|
|
{
|
|
|
|
FillAnArea(FillStartX, FillStartY,
|
|
(OldMouseX - 4)/TILE_SIZE,
|
|
(OldMouseY - 4)/TILE_SIZE);
|
|
RedrawMap();
|
|
FILL_ACTIVE = 0;
|
|
// CurrentCursor = OldCursor;
|
|
|
|
if ((NewMouseX < AA_BASEX) || (NewMouseX > AA_MAXX) ||
|
|
(NewMouseY < AA_BASEY) || (NewMouseY > AA_MAXY))
|
|
x_hide_mouse();
|
|
else
|
|
{
|
|
x_get_pbm(OldMouseX, OldMouseY, TILE_SIZE/4, TILE_SIZE,
|
|
Page0_Offs, DrawCursors[0]);
|
|
x_put_masked_pbm(OldMouseX, OldMouseY, Page0_Offs,
|
|
DrawCursors[CurrentCursor]);
|
|
} // else
|
|
|
|
if ((NewMouseX < AA_BASEX) || (NewMouseX > AA_MAXX) ||
|
|
(NewMouseY < AA_BASEY) || (NewMouseY > AA_MAXY))
|
|
x_show_mouse();
|
|
|
|
return;
|
|
} // if
|
|
|
|
|
|
if ((NewMouseX >= AA_BASEX) && (NewMouseX <= AA_MAXX) &&
|
|
(NewMouseY >= AA_BASEY) && (NewMouseY <= AA_MAXY))
|
|
{
|
|
if (!IN_ACTIVE_AREA)
|
|
{
|
|
x_hide_mouse();
|
|
OldMouseX = 4 + ((NewMouseX-4)/TILE_SIZE)*TILE_SIZE;
|
|
OldMouseY = 4 + ((NewMouseY-4)/TILE_SIZE)*TILE_SIZE;
|
|
x_get_pbm(OldMouseX, OldMouseY, TILE_SIZE/4, TILE_SIZE,
|
|
Page0_Offs, DrawCursors[0]);
|
|
x_put_masked_pbm(OldMouseX, OldMouseY, Page0_Offs,
|
|
DrawCursors[CurrentCursor]);
|
|
|
|
IN_ACTIVE_AREA = 1;
|
|
} // if
|
|
} // if
|
|
else
|
|
{
|
|
if (IN_ACTIVE_AREA)
|
|
{
|
|
x_put_pbm(OldMouseX, OldMouseY, Page0_Offs, DrawCursors[0]);
|
|
|
|
x_show_mouse();
|
|
IN_ACTIVE_AREA = 0;
|
|
} // if
|
|
} // else
|
|
|
|
if (IN_ACTIVE_AREA)
|
|
{
|
|
NewMouseX = 4 + ((NewMouseX-4)/TILE_SIZE)*TILE_SIZE;
|
|
NewMouseY = 4 + ((NewMouseY-4)/TILE_SIZE)*TILE_SIZE;
|
|
|
|
if ((NewMouseX != OldMouseX) || (NewMouseY != OldMouseY) ||
|
|
(MouseButtonStatus & LEFT_MOUSE_CLICK) ||
|
|
(MouseButtonStatus & RIGHT_MOUSE_CLICK))
|
|
{
|
|
if (!(MouseButtonStatus & LEFT_MOUSE_CLICK) &&
|
|
!(MouseButtonStatus & RIGHT_MOUSE_CLICK))
|
|
showMouseCoords((NewMouseX-4)/TILE_SIZE,(NewMouseY-4)/TILE_SIZE);
|
|
|
|
x_put_pbm(OldMouseX, OldMouseY, Page0_Offs, DrawCursors[0]);
|
|
OldMouseX = NewMouseX;
|
|
OldMouseY = NewMouseY;
|
|
|
|
GRIDX = (OldMouseX - 4)/TILE_SIZE;
|
|
GRIDY = (OldMouseY - 4)/TILE_SIZE;
|
|
|
|
if (MouseButtonStatus & LEFT_MOUSE_CLICK)
|
|
{
|
|
if (CurrentCursor == CC_FILL)
|
|
{
|
|
if (FILL_ACTIVE)
|
|
{
|
|
RedrawMap();
|
|
//x_put_pbm(4, 4, Page0_Offs, FillPic);
|
|
if ((FillStartX <= GRIDX) && (FillStartY <= GRIDY))
|
|
{
|
|
x_line(4+FillStartX*TILE_SIZE, 4+FillStartY*TILE_SIZE,
|
|
4+GRIDX*TILE_SIZE+TILE_SIZE-1, 4+FillStartY*TILE_SIZE,
|
|
255, Page0_Offs);
|
|
x_line(4+FillStartX*TILE_SIZE, 4+GRIDY*TILE_SIZE+TILE_SIZE-1,
|
|
4+GRIDX*TILE_SIZE+TILE_SIZE-1, 4+GRIDY*TILE_SIZE+TILE_SIZE-1,
|
|
255, Page0_Offs);
|
|
x_line(4+FillStartX*TILE_SIZE, 4+FillStartY*TILE_SIZE,
|
|
4+FillStartX*TILE_SIZE, 4+GRIDY*TILE_SIZE+TILE_SIZE-1,
|
|
255, Page0_Offs);
|
|
x_line(4+GRIDX*TILE_SIZE+TILE_SIZE-1, 4+FillStartY*TILE_SIZE,
|
|
4+GRIDX*TILE_SIZE+TILE_SIZE-1, 4+GRIDY*TILE_SIZE+TILE_SIZE-1,
|
|
255, Page0_Offs);
|
|
} // if
|
|
|
|
} // if
|
|
else
|
|
{
|
|
FILL_ACTIVE = 1;
|
|
FillStartX = GRIDX;
|
|
FillStartY = GRIDY;
|
|
//FillPic = (char *) malloc(MAP_VIEW_SIZE*TILE_SIZE*TILE_SIZE);
|
|
//x_get_pbm(4, 4, (MAP_VIEW_SIZE*TILE_SIZE)/4,
|
|
// MAP_VIEW_SIZE*TILE_SIZE, Page0_Offs, FillPic);
|
|
} // else
|
|
} // if
|
|
else
|
|
{
|
|
switch (CurrentCursor)
|
|
{
|
|
case CC_WESTWALL :
|
|
map[WEST_LAYER][(GridBaseY+GRIDY)*MAP_SIZE + (GridBaseX+GRIDX)] = CurrentPic-MinPic+1;
|
|
|
|
if (DRAW_FROM_PIC)
|
|
{
|
|
x_get_pbm(PIC_BASEX, PIC_BASEY, TILE_SIZE/4, TILE_SIZE,
|
|
Page0_Offs, DrawBuffer);
|
|
x_rect_fill(0, 0, TILE_SIZE, TILE_SIZE, Page1_Offs, 0);
|
|
x_put_pbm(0, 0, Page1_Offs, DrawBuffer);
|
|
x_line(0, 0, TILE_SIZE, 0, 0, Page0_Offs);
|
|
x_line(0, TILE_SIZE-1, TILE_SIZE, TILE_SIZE-1, 0, Page1_Offs);
|
|
x_line(0, 0, 0, TILE_SIZE, 0, Page1_Offs);
|
|
x_line(3, 0, 3, TILE_SIZE, 0, Page1_Offs);
|
|
|
|
if (!Pics[TT_WESTWALL][CurrentPic-MinPic].pbm)
|
|
{
|
|
x_get_pbm(0, 0, 1, TILE_SIZE,
|
|
Page1_Offs, Pics[TT_WESTWALL][CurrentPic-MinPic].pbm);
|
|
} // if
|
|
|
|
DrawGridTile(GRIDX, GRIDY);
|
|
} // if
|
|
else
|
|
x_line(OldMouseX-1, OldMouseY, OldMouseX, OldMouseY + TILE_SIZE-1,
|
|
103, Page0_Offs);
|
|
break;
|
|
|
|
case CC_NORTHWALL :
|
|
map[NORTH_LAYER][(GridBaseY+GRIDY)*MAP_SIZE + (GridBaseX+GRIDX)] = CurrentPic-MinPic+1;
|
|
|
|
if (DRAW_FROM_PIC)
|
|
{
|
|
x_get_pbm(PIC_BASEX, PIC_BASEY, TILE_SIZE/4, 4,
|
|
Page0_Offs, DrawBuffer);
|
|
x_rect_fill(0, 0, TILE_SIZE, TILE_SIZE, Page1_Offs, 0);
|
|
x_put_pbm(0, 0, Page1_Offs, DrawBuffer);
|
|
x_line(0, 0, TILE_SIZE, 0, 0, Page1_Offs);
|
|
x_line(0, 3, TILE_SIZE, 3, 0, Page1_Offs);
|
|
x_line(0, 0, 0, TILE_SIZE, 0, Page1_Offs);
|
|
x_line(TILE_SIZE-1, 0, TILE_SIZE-1, TILE_SIZE, 0, Page1_Offs);
|
|
|
|
if (!Pics[TT_NORTHWALL][CurrentPic-MinPic].pbm)
|
|
{
|
|
x_get_pbm(0, 0, TILE_SIZE/4, 4,
|
|
Page1_Offs, Pics[TT_NORTHWALL][CurrentPic-MinPic].pbm);
|
|
} // if
|
|
|
|
DrawGridTile(GRIDX, GRIDY);
|
|
} // if
|
|
else
|
|
x_line(OldMouseX + 1, OldMouseY, OldMouseX + 5, OldMouseY,
|
|
103, Page0_Offs);
|
|
break;
|
|
|
|
case CC_FLAT :
|
|
if (CurrentDrawMode == DM_FLOOR)
|
|
map[FLOOR_LAYER][(GridBaseY+GRIDY)*MAP_SIZE + (GridBaseX+GRIDX)] = CurrentPic-MinPic+1;
|
|
else
|
|
map[CEILING_LAYER][(GridBaseY+GRIDY)*MAP_SIZE + (GridBaseX+GRIDX)] = CurrentPic-MinPic+1;
|
|
|
|
if (DRAW_FROM_PIC)
|
|
{
|
|
// if (!Pics[TT_FLAT][CurrentPic-MinPic][0])
|
|
// {
|
|
// x_get_pbm(0, 0, TILE_SIZE/4, TILE_SIZE,
|
|
// Page0_Offs, Pics[TT_FLAT][CurrentPic-MinPic]);
|
|
// } // if
|
|
|
|
DrawGridTile(GRIDX, GRIDY);
|
|
} // if
|
|
else
|
|
x_rect_fill(OldMouseX + 2, OldMouseY + 2,
|
|
OldMouseX + 5, OldMouseY + 5,
|
|
Page0_Offs, 103);
|
|
break;
|
|
|
|
case CC_ACTOR :
|
|
map[SPRITE_LAYER][(GridBaseY+GRIDY)*MAP_SIZE + (GridBaseX+GRIDX)] = CurrentPic-MinPic+1;
|
|
|
|
if (DRAW_FROM_PIC)
|
|
{
|
|
DrawGridTile(GRIDX, GRIDY);
|
|
} // if
|
|
|
|
break;
|
|
} // if
|
|
} // else
|
|
} // if
|
|
else if (MouseButtonStatus & RIGHT_MOUSE_CLICK)
|
|
{
|
|
switch (CurrentCursor)
|
|
{
|
|
case CC_WESTWALL :
|
|
map[WEST_LAYER][(GridBaseY+GRIDY)*MAP_SIZE + (GridBaseX+GRIDX)] = 0;
|
|
|
|
DrawGridTile(GRIDX, GRIDY);
|
|
break;
|
|
|
|
case CC_NORTHWALL :
|
|
map[NORTH_LAYER][(GridBaseY+GRIDY)*MAP_SIZE + (GridBaseX+GRIDX)] = 0;
|
|
|
|
DrawGridTile(GRIDX, GRIDY);
|
|
break;
|
|
|
|
case CC_FLAT :
|
|
if (CurrentDrawMode == DM_FLOOR)
|
|
map[FLOOR_LAYER][(GridBaseY+GRIDY)*MAP_SIZE + (GridBaseX+GRIDX)] = 0;
|
|
else
|
|
map[CEILING_LAYER][(GridBaseY+GRIDY)*MAP_SIZE + (GridBaseX+GRIDX)] = 0;
|
|
|
|
DrawGridTile(GRIDX, GRIDY);
|
|
break;
|
|
|
|
case CC_ACTOR :
|
|
map[SPRITE_LAYER][(GridBaseY+GRIDY)*MAP_SIZE + (GridBaseX+GRIDX)] = 0;
|
|
|
|
if (DRAW_FROM_PIC)
|
|
{
|
|
DrawGridTile(GRIDX, GRIDY);
|
|
} // if
|
|
|
|
break;
|
|
} // if
|
|
} // if
|
|
else
|
|
{
|
|
if (FILL_ACTIVE)
|
|
{
|
|
//x_put_pbm(4, 4, Page0_Offs, FillPic);
|
|
//free(FillPic);
|
|
//FillPic = NULL;
|
|
//RedrawMap();
|
|
//FILL_ACTIVE = 0;
|
|
//CurrentCursor = OldCursor;
|
|
} // if
|
|
} // else
|
|
|
|
|
|
x_get_pbm(OldMouseX, OldMouseY, TILE_SIZE/4, TILE_SIZE, Page0_Offs, DrawCursors[0]);
|
|
|
|
x_put_masked_pbm(OldMouseX, OldMouseY, Page0_Offs,
|
|
DrawCursors[CurrentCursor]);
|
|
} // if
|
|
} // if
|
|
} // handleMouseCursor
|
|
|
|
void DrawGridTile(char xpos, char ypos)
|
|
{
|
|
char TileBuffer[146];
|
|
|
|
x_rect_fill(0, 0, TILE_SIZE, TILE_SIZE, Page1_Offs, 0);
|
|
x_put_pix(0, 0, Page1_Offs, GRID_MARK_COLOR);
|
|
|
|
if (map[FLOOR_LAYER][(GridBaseY+ypos)*MAP_SIZE+(GridBaseX+xpos)])
|
|
{
|
|
x_put_pbm(0, 0, Page1_Offs,
|
|
Pics[TT_FLAT][map[FLOOR_LAYER][(GridBaseY+ypos)*MAP_SIZE+(GridBaseX+xpos)]-1].pbm);
|
|
} // if
|
|
if (map[WEST_LAYER][(GridBaseY+ypos)*MAP_SIZE+(GridBaseX+xpos)])
|
|
{
|
|
x_put_pbm(0, 0, Page1_Offs,
|
|
Pics[TT_WESTWALL][map[WEST_LAYER][(GridBaseY+ypos)*MAP_SIZE+(GridBaseX+xpos)]-1].pbm);
|
|
} // if
|
|
if (map[NORTH_LAYER][(GridBaseY+ypos)*MAP_SIZE+(GridBaseX+xpos)])
|
|
{
|
|
x_put_pbm(0, 0, Page1_Offs,
|
|
Pics[TT_NORTHWALL][map[NORTH_LAYER][(GridBaseY+ypos)*MAP_SIZE+(GridBaseX+xpos)]-1].pbm);
|
|
} // if
|
|
if (map[SPRITE_LAYER][(GridBaseY+ypos)*MAP_SIZE+(GridBaseX+xpos)])
|
|
{
|
|
x_put_masked_pbm(0, 0, Page1_Offs,
|
|
Pics[TT_ACTOR][map[SPRITE_LAYER][(GridBaseY+ypos)*MAP_SIZE+(GridBaseX+xpos)]-1].pbm);
|
|
} // if
|
|
|
|
x_get_pbm(0, 0, TILE_SIZE/4, TILE_SIZE, Page1_Offs, TileBuffer);
|
|
|
|
x_put_pbm(4+xpos*TILE_SIZE, 4+ypos*TILE_SIZE, Page0_Offs, TileBuffer);
|
|
|
|
} // DrawGridTile
|
|
|
|
void RedrawMap(void)
|
|
{
|
|
char row;
|
|
char col;
|
|
|
|
|
|
if (CurrentCursor != CC_FILL)
|
|
{
|
|
if (IN_ACTIVE_AREA)
|
|
x_put_masked_pbm(OldMouseX, OldMouseY, Page0_Offs,DrawCursors[0]);
|
|
else
|
|
x_hide_mouse();
|
|
} // if
|
|
|
|
for (row = 0; row < MAP_VIEW_SIZE; row++)
|
|
{
|
|
for (col = 0; col < MAP_VIEW_SIZE; col++)
|
|
{
|
|
DrawGridTile(col, row);
|
|
} // for
|
|
} // for
|
|
|
|
if (CurrentCursor != CC_FILL)
|
|
{
|
|
if (IN_ACTIVE_AREA)
|
|
x_put_masked_pbm(OldMouseX, OldMouseY, Page0_Offs,
|
|
DrawCursors[CurrentCursor]);
|
|
else
|
|
x_show_mouse();
|
|
} // if
|
|
} // RedrawMap
|
|
|
|
void RedrawCol(char whichCol)
|
|
{
|
|
char row;
|
|
|
|
for (row = 0; row < MAP_VIEW_SIZE; row++)
|
|
{
|
|
DrawGridTile(whichCol, row);
|
|
} // for
|
|
} // RedrawRow
|
|
|
|
void RedrawRow(char whichRow)
|
|
{
|
|
char col;
|
|
|
|
for (col = 0; col < MAP_VIEW_SIZE; col++)
|
|
{
|
|
DrawGridTile(col, whichRow);
|
|
} // for
|
|
} // RedrawRow
|
|
|
|
int SaveMapToFile(char *filename)
|
|
{
|
|
int MapFile;
|
|
|
|
if ((MapFile = f_open(filename, F_RDWR)) == FILE_ERR)
|
|
return 0;
|
|
|
|
if (f_write(MapFile, map[FLOOR_LAYER], MAP_SIZE*MAP_SIZE) == FILE_ERR)
|
|
return 0;
|
|
|
|
if (f_write(MapFile, map[CEILING_LAYER], MAP_SIZE*MAP_SIZE) == FILE_ERR)
|
|
return 0;
|
|
|
|
if (f_write(MapFile, map[NORTH_LAYER], MAP_SIZE*MAP_SIZE) == FILE_ERR)
|
|
return 0;
|
|
|
|
if (f_write(MapFile, map[WEST_LAYER], MAP_SIZE*MAP_SIZE) == FILE_ERR)
|
|
return 0;
|
|
|
|
if (f_write(MapFile, map[SPRITE_LAYER], MAP_SIZE*MAP_SIZE) == FILE_ERR)
|
|
return 0;
|
|
|
|
if (f_close(MapFile) == FILE_ERR)
|
|
return 0;
|
|
|
|
MessageBox(160, 100, Page0_Offs, "New saved okay.", "", ID_OK | ID_NOTITLE);
|
|
|
|
return 1;
|
|
} // SaveMapToFile
|
|
|
|
int SaveMapToTOD(void)
|
|
{
|
|
int MapFile;
|
|
|
|
if ((MapFile = f_open(DATA_FILE, F_RDWR)) == FILE_ERR)
|
|
return 0;
|
|
|
|
if (f_seek(MapFile, 0x3E0A, SEEK_START) == FILE_ERR)
|
|
return 0;
|
|
|
|
if (f_write(MapFile, map[FLOOR_LAYER], MAP_SIZE*MAP_SIZE) == FILE_ERR)
|
|
return 0;
|
|
|
|
if (f_seek(MapFile, 0x4E0A, SEEK_START) == FILE_ERR)
|
|
return 0;
|
|
|
|
if (f_write(MapFile, map[CEILING_LAYER], MAP_SIZE*MAP_SIZE) == FILE_ERR)
|
|
return 0;
|
|
|
|
if (f_seek(MapFile, 0x5E0A, SEEK_START) == FILE_ERR)
|
|
return 0;
|
|
|
|
if (f_write(MapFile, map[NORTH_LAYER], MAP_SIZE*MAP_SIZE) == FILE_ERR)
|
|
return 0;
|
|
|
|
if (f_seek(MapFile, 0x6E0A, SEEK_START) == FILE_ERR)
|
|
return 0;
|
|
|
|
if (f_write(MapFile, map[WEST_LAYER], MAP_SIZE*MAP_SIZE) == FILE_ERR)
|
|
return 0;
|
|
|
|
if (f_seek(MapFile, 0xCE0A, SEEK_START) == FILE_ERR)
|
|
return 0;
|
|
|
|
if (f_write(MapFile, map[SPRITE_LAYER], MAP_SIZE*MAP_SIZE) == FILE_ERR)
|
|
return 0;
|
|
|
|
if (f_close(MapFile) == FILE_ERR)
|
|
return 0;
|
|
|
|
MessageBox(160, 100, Page0_Offs, "New map inserted okay.", "", ID_OK | ID_NOTITLE);
|
|
|
|
return 1;
|
|
} // SaveMapToTOD
|
|
|
|
int LoadMapFromFile(char *filename)
|
|
{
|
|
int MapFile;
|
|
long numRead;
|
|
|
|
if ((MapFile = f_open(filename, F_RDWR)) == FILE_ERR)
|
|
return 0;
|
|
|
|
if (f_seek(MapFile, 0, SEEK_START) == FILE_ERR)
|
|
return 0;
|
|
|
|
if (f_read(MapFile, map[FLOOR_LAYER], MAP_SIZE*MAP_SIZE) == FILE_ERR)
|
|
return 0;
|
|
|
|
if (f_read(MapFile, map[CEILING_LAYER], MAP_SIZE*MAP_SIZE) == FILE_ERR)
|
|
return 0;
|
|
|
|
if (f_read(MapFile, map[NORTH_LAYER], MAP_SIZE*MAP_SIZE) == FILE_ERR)
|
|
return 0;
|
|
|
|
if (f_read(MapFile, map[WEST_LAYER], MAP_SIZE*MAP_SIZE) == FILE_ERR)
|
|
return 0;
|
|
|
|
if (f_read(MapFile, map[SPRITE_LAYER], MAP_SIZE*MAP_SIZE) == FILE_ERR)
|
|
return 0;
|
|
|
|
if (f_close(MapFile) == FILE_ERR)
|
|
return 0;
|
|
|
|
MessageBox(160, 100, Page0_Offs, "Old map loaded okay.", "", ID_OK | ID_NOTITLE);
|
|
|
|
return 1;
|
|
} // LoadMapFromFile
|
|
|
|
int LoadMapFromTOD(void)
|
|
{
|
|
int MapFile;
|
|
long numRead;
|
|
|
|
if ((MapFile = f_open(DATA_FILE, F_RDWR)) == FILE_ERR)
|
|
return 0;
|
|
|
|
if (f_seek(MapFile, 0x3E0A, SEEK_START) == FILE_ERR)
|
|
return 0;
|
|
|
|
if (f_read(MapFile, map[FLOOR_LAYER], MAP_SIZE*MAP_SIZE) == FILE_ERR)
|
|
return 0;
|
|
|
|
if (f_seek(MapFile, 0x4E0A, SEEK_START) == FILE_ERR)
|
|
return 0;
|
|
|
|
if (f_read(MapFile, map[CEILING_LAYER], MAP_SIZE*MAP_SIZE) == FILE_ERR)
|
|
return 0;
|
|
|
|
if (f_seek(MapFile, 0x5E0A, SEEK_START) == FILE_ERR)
|
|
return 0;
|
|
|
|
if (f_read(MapFile, map[NORTH_LAYER], MAP_SIZE*MAP_SIZE) == FILE_ERR)
|
|
return 0;
|
|
|
|
if (f_seek(MapFile, 0x6E0A, SEEK_START) == FILE_ERR)
|
|
return 0;
|
|
|
|
if (f_read(MapFile, map[WEST_LAYER], MAP_SIZE*MAP_SIZE) == FILE_ERR)
|
|
return 0;
|
|
|
|
if (f_seek(MapFile, 0xCE0A, SEEK_START) == FILE_ERR)
|
|
return 0;
|
|
|
|
if (f_read(MapFile, map[SPRITE_LAYER], MAP_SIZE*MAP_SIZE) == FILE_ERR)
|
|
return 0;
|
|
|
|
if (f_close(MapFile) == FILE_ERR)
|
|
return 0;
|
|
|
|
MessageBox(160, 100, Page0_Offs, "Old map extracted okay.", "", ID_OK | ID_NOTITLE);
|
|
|
|
return 1;
|
|
} // LoadMapFromTOD
|
|
|
|
void ScaleTiles()
|
|
{
|
|
char i;
|
|
char j;
|
|
WORD color;
|
|
char scaleX = TILE_SIZE;
|
|
char scaleY = TILE_SIZE;
|
|
char picToScale = 0;
|
|
|
|
|
|
|
|
scaleX = 4;
|
|
scaleY = TILE_SIZE;
|
|
|
|
picToScale = StartWallPic;
|
|
|
|
while (picToScale <= MaxWallPic)
|
|
{
|
|
if ((picToScale == StartWallPic) ||
|
|
(strcmpi(scripts[picToScale].picFile, scripts[picToScale-1].picFile)))
|
|
showLBM(0, 0, scripts[picToScale].picFile, Page0_Offs);
|
|
|
|
x_rect_fill(0, 0, TILE_SIZE, TILE_SIZE, Page0_Offs, 0);
|
|
|
|
for (i=0; i<scaleX; i++)
|
|
for (j=0; j<scaleY; j++)
|
|
{
|
|
color = x_get_pix(scripts[picToScale].Xoffset*8 +
|
|
(((float)i/(scaleX-1))*63),
|
|
scripts[picToScale].Yoffset*8 +
|
|
(((float)j/(scaleY-1))*63),
|
|
Page0_Offs);
|
|
x_put_pix(i, j, Page0_Offs, color);
|
|
} // for
|
|
|
|
x_line(0, 0, TILE_SIZE, 0, 0, Page0_Offs);
|
|
x_line(0, TILE_SIZE-1, TILE_SIZE, TILE_SIZE-1, 0, Page0_Offs);
|
|
x_line(0, 0, 0, TILE_SIZE, 0, Page0_Offs);
|
|
x_line(3, 0, 3, TILE_SIZE, 0, Page0_Offs);
|
|
|
|
x_get_pbm(0, 0, 1, TILE_SIZE,
|
|
Page0_Offs, Pics[TT_WESTWALL][picToScale-StartWallPic].pbm);
|
|
|
|
picToScale ++;
|
|
} // while
|
|
|
|
scaleX = TILE_SIZE;
|
|
scaleY = 4;
|
|
|
|
picToScale = StartWallPic;
|
|
|
|
while (picToScale <= MaxWallPic)
|
|
{
|
|
if ((picToScale == StartWallPic) ||
|
|
(strcmpi(scripts[picToScale].picFile, scripts[picToScale-1].picFile)))
|
|
showLBM(0, 0, scripts[picToScale].picFile, Page0_Offs);
|
|
|
|
x_rect_fill(0, 0, TILE_SIZE, TILE_SIZE, Page0_Offs, 0);
|
|
|
|
for (i=0; i<scaleX; i++)
|
|
for (j=0; j<scaleY; j++)
|
|
{
|
|
color = x_get_pix(scripts[picToScale].Xoffset*8 +
|
|
(((float)i/(scaleX-1))*63),
|
|
scripts[picToScale].Yoffset*8 +
|
|
(((float)j/(scaleY-1))*63),
|
|
Page0_Offs);
|
|
x_put_pix(i, j, Page0_Offs, color);
|
|
} // for
|
|
|
|
x_line(0, 0, TILE_SIZE, 0, 0, Page0_Offs);
|
|
x_line(0, 3, TILE_SIZE, 3, 0, Page0_Offs);
|
|
x_line(0, 0, 0, TILE_SIZE, 0, Page0_Offs);
|
|
x_line(TILE_SIZE-1, 0, TILE_SIZE-1, TILE_SIZE, 0, Page0_Offs);
|
|
|
|
x_get_pbm(0, 0, 3, 4,
|
|
Page0_Offs, Pics[TT_NORTHWALL][picToScale-StartWallPic].pbm);
|
|
|
|
picToScale ++;
|
|
} // while
|
|
|
|
scaleX = TILE_SIZE;
|
|
scaleY = TILE_SIZE;
|
|
|
|
picToScale = StartFlatPic;
|
|
|
|
while (picToScale <= MaxFlatPic)
|
|
{
|
|
if ((picToScale == StartFlatPic) ||
|
|
(strcmpi(scripts[picToScale].picFile, scripts[picToScale-1].picFile)))
|
|
showLBM(0, 0, scripts[picToScale].picFile, Page0_Offs);
|
|
|
|
x_rect_fill(0, 0, TILE_SIZE, TILE_SIZE, Page0_Offs, 0);
|
|
|
|
for (i=0; i<scaleX; i++)
|
|
for (j=0; j<scaleY; j++)
|
|
{
|
|
color = x_get_pix(scripts[picToScale].Xoffset*8 +
|
|
(((float)i/(scaleX-1))*63),
|
|
scripts[picToScale].Yoffset*8 +
|
|
(((float)j/(scaleY-1))*63),
|
|
Page0_Offs);
|
|
x_put_pix(i, j, Page0_Offs, color);
|
|
} // for
|
|
|
|
x_get_pbm(0, 0, 3, TILE_SIZE,
|
|
Page0_Offs, Pics[TT_FLAT][picToScale-StartFlatPic].pbm);
|
|
|
|
picToScale ++;
|
|
} // while
|
|
|
|
scaleX = TILE_SIZE;
|
|
scaleY = TILE_SIZE;
|
|
|
|
picToScale = StartActorPic;
|
|
|
|
while (picToScale <= MaxActorPic)
|
|
{
|
|
if ((picToScale == StartActorPic) ||
|
|
(strcmpi(scripts[picToScale].picFile, scripts[picToScale-1].picFile)))
|
|
showLBM(0, 0, scripts[picToScale].picFile, Page0_Offs);
|
|
|
|
x_rect_fill(0, 0, TILE_SIZE, TILE_SIZE, Page0_Offs, 0);
|
|
|
|
for (i=0; i<scaleX; i++)
|
|
for (j=0; j<scaleY; j++)
|
|
{
|
|
color = x_get_pix(scripts[picToScale].Xoffset*8 +
|
|
(((float)i/(scaleX-1))*63),
|
|
scripts[picToScale].Yoffset*8 +
|
|
(((float)j/(scaleY-1))*63),
|
|
Page0_Offs);
|
|
x_put_pix(i, j, Page0_Offs, color);
|
|
} // for
|
|
|
|
x_get_pbm(0, 0, 3, TILE_SIZE,
|
|
Page0_Offs, Pics[TT_ACTOR][picToScale-StartActorPic].pbm);
|
|
|
|
picToScale ++;
|
|
} // while
|
|
|
|
} // ScaleTiles
|
|
|
|
void FillAnArea(char baseX, char baseY, char endX, char endY)
|
|
{
|
|
char i;
|
|
char j;
|
|
|
|
for (i = baseX; i < endX+1; i++)
|
|
for (j = baseY; j < endY+1; j++)
|
|
switch (CurrentDrawMode)
|
|
{
|
|
case DM_WESTWALL :
|
|
map[WEST_LAYER][(GridBaseY+j)*MAP_SIZE + (GridBaseX+i)] =
|
|
CurrentPic-MinPic+1;
|
|
break;
|
|
|
|
case DM_NORTHWALL :
|
|
map[NORTH_LAYER][(GridBaseY+j)*MAP_SIZE + (GridBaseX+i)] =
|
|
CurrentPic-MinPic+1;
|
|
break;
|
|
|
|
case DM_FLOOR :
|
|
map[FLOOR_LAYER][(GridBaseY+j)*MAP_SIZE + (GridBaseX+i)] =
|
|
CurrentPic-MinPic+1;
|
|
break;
|
|
|
|
case DM_CEILING :
|
|
map[CEILING_LAYER][(GridBaseY+j)*MAP_SIZE + (GridBaseX+i)] =
|
|
CurrentPic-MinPic+1;
|
|
break;
|
|
|
|
case DM_SPRITE :
|
|
map[SPRITE_LAYER][(GridBaseY+j)*MAP_SIZE + (GridBaseX+i)] =
|
|
CurrentPic-MinPic+1;
|
|
break;
|
|
} // switch
|
|
} // FillAnArea
|