fallout2-ce/src/mapper/mapper.cc

1599 lines
32 KiB
C++
Raw Normal View History

2023-07-22 23:25:56 -07:00
#include "mapper/mapper.h"
2023-07-23 00:01:58 -07:00
#include <ctype.h>
2023-07-22 23:44:09 -07:00
#include "animation.h"
#include "art.h"
2023-07-23 00:01:58 -07:00
#include "color.h"
2023-07-23 20:50:07 -07:00
#include "debug.h"
2023-07-23 00:01:58 -07:00
#include "draw.h"
2023-07-23 20:50:07 -07:00
#include "game.h"
2023-07-22 23:39:13 -07:00
#include "game_mouse.h"
2023-07-23 20:50:07 -07:00
#include "graph_lib.h"
2023-07-22 23:44:09 -07:00
#include "inventory.h"
2023-07-23 00:35:16 -07:00
#include "kb.h"
2023-07-23 21:17:21 -07:00
#include "loadsave.h"
2023-07-23 20:50:07 -07:00
#include "mapper/map_func.h"
2023-07-23 00:10:09 -07:00
#include "mapper/mp_proto.h"
2023-07-23 20:50:07 -07:00
#include "mapper/mp_targt.h"
#include "mapper/mp_text.h"
2023-07-23 01:01:03 -07:00
#include "memory.h"
2023-07-23 20:50:07 -07:00
#include "mouse.h"
2023-07-22 23:25:56 -07:00
#include "object.h"
#include "proto.h"
2023-07-23 00:10:09 -07:00
#include "settings.h"
2023-07-22 23:49:22 -07:00
#include "svga.h"
2023-07-23 20:50:07 -07:00
#include "tile.h"
2023-07-22 23:49:22 -07:00
#include "window_manager.h"
2023-07-23 20:50:07 -07:00
#include "window_manager_private.h"
2023-07-22 23:25:56 -07:00
namespace fallout {
2023-07-23 00:35:16 -07:00
static void MapperInit();
2023-07-23 01:01:03 -07:00
static int mapper_edit_init(int argc, char** argv);
static void mapper_edit_exit();
2023-07-23 00:26:43 -07:00
static int bookmarkInit();
2023-07-23 00:25:58 -07:00
static int bookmarkExit();
2023-07-23 00:23:55 -07:00
static void bookmarkHide();
2023-07-23 00:22:42 -07:00
static void bookmarkUnHide();
2023-07-23 00:20:54 -07:00
static int categoryInit();
2023-07-23 00:19:02 -07:00
static int categoryExit();
2023-07-23 00:16:59 -07:00
static int categoryHide();
2023-07-23 00:17:52 -07:00
static int categoryToggleState();
2023-07-23 00:15:51 -07:00
static int categoryUnhide();
2023-07-23 00:10:09 -07:00
static bool proto_user_is_librarian();
2023-07-23 01:01:03 -07:00
static void edit_mapper();
2023-07-23 20:50:07 -07:00
static void mapper_load_toolbar(int a1, int a2);
2023-07-22 23:49:22 -07:00
static void redraw_toolname();
2023-07-22 23:52:59 -07:00
static void clear_toolname();
2023-09-03 10:48:23 -07:00
static void update_toolname(int* pid, int type, int id);
2023-07-22 23:55:58 -07:00
static void update_high_obj_name(Object* obj);
2023-09-03 11:30:59 -07:00
static void mapper_destroy_highlight_obj(Object** a1, Object** a2);
2023-07-22 23:39:13 -07:00
static int mapper_mark_exit_grid();
2023-07-22 23:25:56 -07:00
static void mapper_mark_all_exit_grids();
2023-07-23 20:50:07 -07:00
// TODO: Underlying menu/pulldown interface wants menu items to be non-const,
// needs some refactoring.
static char kSeparator[] = "";
static char kNew[] = " New ";
static char kOpen[] = " Open ";
static char kSave[] = " Save ";
static char kSaveAs[] = " Save As... ";
static char kInfo[] = " Info ";
static char kOpenFromText[] = " Open From Text ";
static char kQuit[] = " Quit ";
static char kCreatePattern[] = " Create Pattern ";
static char kUsePattern[] = " Use Pattern ";
static char kMoveMap[] = " Move Map ";
static char kMoveMapElev[] = " Move Map Elev ";
static char kCopyMapElev[] = " Copy Map Elev ";
static char kEditObjDude[] = " Edit Obj_dude ";
static char kFlushCache[] = " Flush Cache ";
static char kToggleAnimStepping[] = " Toggle Anim Stepping ";
static char kFixMapObjectsToPids[] = " Fix map-objects to pids ";
static char kSetBookmark[] = " Set Bookmark ";
static char kToggleBlockObjView[] = " Toggle Block Obj View ";
static char kToggleClickToScroll[] = " Toggle Click-To-Scroll ";
static char kSetExitGridData[] = " Set Exit-Grid Data ";
static char kMarkExitGrids[] = " Mark Exit-Grids ";
static char kMarkAllExitGrids[] = " Mark *ALL* Exit Grids ";
static char kClearMapLevel[] = " *Clear Map Level* ";
static char kCreateAllMapTexts[] = " Create ALL MAP TEXTS ";
static char kRebuildAllMaps[] = " Rebuild ALL MAPS ";
static char kListAllScripts[] = " List all Scripts ";
static char kSetStartHex[] = " Set Start Hex ";
static char kPlaceSpatialScript[] = " Place Spatial Script ";
static char kDeleteSpatialScript[] = " Delete Spatial Script ";
static char kDeleteAllSpatialScripts[] = " Delete *ALL* Spatial SCRIPTS! ";
static char kCreateScript[] = " Create Script ";
static char kSetMapScript[] = " Set Map Script ";
static char kShowMapScript[] = " Show Map Script ";
static char kRebuildWeapons[] = " Rebuild Weapons ";
static char kRebuildProtoList[] = " Rebuild Proto List ";
static char kRebuildAll[] = " Rebuild ALL ";
static char kRebuildBinary[] = " Rebuild Binary ";
static char kArtToProtos[] = " Art => New Protos ";
static char kSwapPrototypse[] = " Swap Prototypes ";
2023-07-23 21:17:21 -07:00
static char kTmpMapName[] = "TMP$MAP#.MAP";
2023-07-23 20:50:07 -07:00
// 0x559648
char* menu_0[] = {
kNew,
kOpen,
kSave,
kSaveAs,
kSeparator,
kInfo,
kOpenFromText,
kQuit,
};
// 0x559668
char* menu_1[] = {
kCreatePattern,
kUsePattern,
kSeparator,
kMoveMap,
kMoveMapElev,
kCopyMapElev,
kSeparator,
kEditObjDude,
kFlushCache,
kToggleAnimStepping,
kFixMapObjectsToPids,
kSetBookmark,
kToggleBlockObjView,
kToggleClickToScroll,
kSetExitGridData,
kMarkExitGrids,
kMarkAllExitGrids,
kClearMapLevel,
kSeparator,
kCreateAllMapTexts,
kRebuildAllMaps,
};
// 0x5596BC
char* menu_2[] = {
kListAllScripts,
kSetStartHex,
kPlaceSpatialScript,
kDeleteSpatialScript,
kDeleteAllSpatialScripts,
kCreateScript,
kSetMapScript,
kShowMapScript,
};
// 0x5596DC
char* menu_3[] = {
kRebuildWeapons,
kRebuildProtoList,
kRebuildAll,
kRebuildBinary,
kSeparator,
kArtToProtos,
kSwapPrototypse,
};
// 0x5596F8
char** menu_names[] = {
menu_0,
menu_1,
menu_2,
menu_3,
};
2023-07-22 23:25:56 -07:00
// 0x559748
MapTransition mapInfo = { -1, -1, 0, 0 };
2023-07-23 20:50:07 -07:00
// 0x559880
int max_art_buttons = 7;
// 0x559884
int art_scale_width = 49;
// 0x559888
int art_scale_height = 48;
2023-07-23 21:17:21 -07:00
// 0x5598A4
static char* tmp_map_name = kTmpMapName;
2023-07-23 00:22:42 -07:00
// 0x5598A8
static int bookmarkWin = -1;
2023-07-23 00:15:51 -07:00
// 0x5598AC
static int categoryWin = -1;
// 0x5598B0
static bool categoryIsHidden = false;
2023-07-23 00:35:16 -07:00
// 0x6EAA40
int menu_val_0[8];
// 0x6EAA60
int menu_val_2[8];
2023-07-23 20:50:07 -07:00
// 0x6EAA80
unsigned char e_num[4][19 * 26];
2023-07-23 00:35:16 -07:00
// 0x6EC408
int menu_val_1[21];
2023-07-23 20:50:07 -07:00
// 0x6EC468
unsigned char* art_shape;
// 0x6EC46C
int to_paint_bid;
// 0x6EC470
int edit_bid;
// 0x6EC474
int paste_bid;
// 0x6EC478
int misc_bid;
// 0x6EC47C
int tile_bid;
// 0x6EC480
int copy_bid;
// 0x6EC484
int delete_bid;
// 0x6EC488
int wall_bid;
// 0x6EC48C
int obj_bid;
// 0x6EC490
int to_topdown_bid;
// 0x6EC494
int roof_bid;
// 0x6EC498
int hex_bid;
// 0x6EC49C
int to_iso_bid;
// 0x6EC4A0
int scen_bid;
// 0x6EC4A4
int crit_bid;
2023-07-23 00:01:58 -07:00
// 0x6EC4A8
unsigned char* tool;
2023-07-22 23:49:22 -07:00
// 0x6EC4AC
int tool_win;
2023-07-23 20:50:07 -07:00
// 0x6EC4B0
int menu_bar;
// 0x6EC4B4
unsigned char* lbm_buf;
// 0x6EC4B8
unsigned char height_inc_up[18 * 23];
// 0x6EC656
unsigned char height_dec_up[18 * 23];
// 0x6EC7F4
unsigned char height_dec_down[18 * 23];
// 0x6EC992
unsigned char height_inc_down[18 * 23];
// 0x6ECB30
unsigned char obj_down[66 * 13];
// 0x6ECE8A
unsigned char to_iso_down[58 * 13];
// 0x6ED17C
unsigned char scen_up[66 * 13];
// 0x6ED4D6
unsigned char roof_up[58 * 13];
// 0x6ED7C8
unsigned char crit_down[66 * 13];
// 0x6EDB22
unsigned char obj_up[66 * 13];
// 0x6EDE7C
unsigned char crit_up[66 * 13];
// 0x6EE1D6
unsigned char to_topdown_down[58 * 13];
// 0x6EE4C8
unsigned char hex_up[58 * 13];
// 0x6EE7BA
unsigned char hex_down[58 * 13];
// 0x6EEAAC
unsigned char to_topdown_up[58 * 13];
// 0x6EED9E
unsigned char scen_down[66 * 13];
// 0x6EF0F8
unsigned char edec_down[18 * 23];
// 0x6EF296
unsigned char to_iso_up[58 * 13];
// 0x6EF588
unsigned char roof_down[58 * 13];
// 0x6EF87A
unsigned char r_up[18 * 23];
// 0x6EFA18
unsigned char einc_down[18 * 23];
// 0x6EFBB6
unsigned char shift_l_up[18 * 23];
// 0x6EFD54
unsigned char edec_up[18 * 23];
// 0x6EFEF2
unsigned char shift_r_up[18 * 23];
// 0x6F0090
unsigned char shift_r_down[18 * 23];
// 0x6F022E
unsigned char r_down[18 * 23];
// 0x6F03CC
unsigned char einc_up[18 * 23];
// 0x6F056A
unsigned char l_down[18 * 23];
// 0x6F0708
unsigned char shift_l_down[18 * 23];
// 0x6F08A6
unsigned char l_up[18 * 23];
// 0x6F0A44
unsigned char to_edit_up[45 * 43];
// 0x6F11D3
unsigned char erase_up[45 * 43];
// 0x6F1962
unsigned char copy_group_up[45 * 43];
// 0x6F20F1
unsigned char to_paint_down[45 * 43];
// 0x6F2880
unsigned char erase_down[45 * 43];
// 0x6F300F
unsigned char copy_group_down[45 * 43];
// 0x6F379E
unsigned char to_edit_down[45 * 43];
// 0x6F3F2D
unsigned char copy_up[49 * 19];
// 0x6F42D0
unsigned char misc_down[53 * 18];
// 0x6F4581
unsigned char wall_down[53 * 18];
// 0x6F4832
unsigned char delete_up[49 * 19];
// 0x6F4BD5
unsigned char edit_up[49 * 19];
// 0x6F4F78
unsigned char tile_up[53 * 18];
// 0x6F5229
unsigned char edit_down[49 * 19];
// 0x6F55CC
unsigned char paste_down[49 * 19];
// 0x6F596F
unsigned char delete_down[49 * 19];
// 0x6F5D12
unsigned char tile_down[53 * 18];
// 0x6F5FC3
unsigned char copy_down[49 * 19];
// 0x6F6366
unsigned char misc_up[53 * 18];
// 0x6F6617
unsigned char paste_up[49 * 19];
// 0x6F69BA
unsigned char to_paint_up[1935];
// 0x6F7149
unsigned char wall_up[53 * 18];
// 0x6F73FA
bool draw_mode;
// 0x6F73FB
bool view_mode;
2023-07-23 01:01:03 -07:00
// gnw_main
// 0x485DD0
int mapper_main(int argc, char** argv)
{
MapperInit();
if (mapper_edit_init(argc, argv) == -1) {
mem_check();
return 0;
}
edit_mapper();
mapper_edit_exit();
mem_check();
return 0;
}
2023-07-23 00:35:16 -07:00
// 0x485E00
void MapperInit()
{
menu_val_0[0] = KEY_ALT_N;
menu_val_0[1] = KEY_ALT_O;
menu_val_0[2] = KEY_ALT_S;
menu_val_0[3] = KEY_ALT_A;
menu_val_0[4] = KEY_ESCAPE;
menu_val_0[5] = KEY_ALT_K;
menu_val_0[6] = KEY_ALT_I;
menu_val_0[7] = KEY_ESCAPE;
menu_val_1[0] = KEY_ALT_U;
menu_val_1[1] = KEY_ALT_Y;
menu_val_1[2] = KEY_ESCAPE;
menu_val_1[3] = KEY_ALT_G;
menu_val_1[4] = 4186;
menu_val_1[5] = 4188;
menu_val_1[6] = KEY_ESCAPE;
menu_val_1[7] = KEY_ALT_B;
menu_val_1[8] = KEY_ALT_E;
menu_val_1[9] = KEY_ALT_D;
menu_val_1[10] = KEY_LOWERCASE_B;
menu_val_1[11] = 2165;
menu_val_1[12] = 3123;
menu_val_1[13] = KEY_ALT_Z;
menu_val_1[14] = 5677;
menu_val_1[15] = 5678;
menu_val_1[16] = 5679;
menu_val_1[17] = 5666;
menu_val_1[18] = KEY_ESCAPE;
menu_val_1[19] = 5406;
menu_val_1[20] = 5405;
menu_val_2[0] = KEY_LOWERCASE_I;
menu_val_2[1] = 5400;
menu_val_2[2] = KEY_LOWERCASE_S;
menu_val_2[3] = KEY_CTRL_F8;
menu_val_2[4] = 5410;
menu_val_2[5] = KEY_GRAVE;
menu_val_2[6] = KEY_ALT_W;
menu_val_2[7] = 5544;
}
2023-07-23 01:01:03 -07:00
// 0x485F94
int mapper_edit_init(int argc, char** argv)
{
2023-07-23 20:50:07 -07:00
int index;
if (gameInitWithOptions("FALLOUT Mapper", true, 2, 0, argc, argv) == -1) {
return -1;
}
tileEnable();
gmouse_set_mapper_mode(true);
settings.system.executable = "mapper";
if (settings.mapper.override_librarian) {
can_modify_protos = true;
target_override_protection();
}
setup_map_dirs();
mapper_load_toolbar(4, 0);
max_art_buttons = (_scr_size.right - _scr_size.left - 136) / 50;
art_shape = (unsigned char*)internal_malloc(art_scale_height * art_scale_width);
if (art_shape == NULL) {
printf("Can't malloc memory!!\n");
exit(1);
}
menu_bar = windowCreate(0,
0,
rectGetWidth(&_scr_size),
16,
_colorTable[0],
WINDOW_HIDDEN);
_win_register_menu_bar(menu_bar,
0,
0,
rectGetWidth(&_scr_size),
16,
260,
_colorTable[8456]);
_win_register_menu_pulldown(menu_bar,
8,
"FILE",
289,
8,
menu_names[0],
260,
_colorTable[8456]);
_win_register_menu_pulldown(menu_bar,
40,
"TOOLS",
303,
21,
menu_names[1],
260,
_colorTable[8456]);
_win_register_menu_pulldown(menu_bar,
80,
"SCRIPTS",
276,
8,
menu_names[2],
260,
_colorTable[8456]);
if (can_modify_protos) {
_win_register_menu_pulldown(menu_bar,
130,
"LIBRARIAN",
292,
6,
&(menu_1[14]),
260,
_colorTable[8456]);
}
tool_win = windowCreate(0,
_scr_size.bottom - 99,
rectGetWidth(&_scr_size),
100,
256,
0);
tool = windowGetBuffer(tool_win);
lbm_buf = (unsigned char*)internal_malloc(640 * 480);
load_lbm_to_buf("data\\mapper2.lbm",
lbm_buf,
rectGetWidth(&_scr_size),
0,
0,
_scr_size.right - _scr_size.left,
479);
//
blitBufferToBuffer(lbm_buf + 380 * rectGetWidth(&_scr_size),
rectGetWidth(&_scr_size),
100,
rectGetWidth(&_scr_size),
tool,
rectGetWidth(&_scr_size));
//
blitBufferToBuffer(lbm_buf + 406 * (rectGetWidth(&_scr_size)) + 101,
18,
23,
rectGetWidth(&_scr_size),
l_up,
18);
blitBufferToBuffer(lbm_buf + 253 * (rectGetWidth(&_scr_size)) + 101,
18,
23,
rectGetWidth(&_scr_size),
l_down,
18);
buttonCreate(tool_win,
101,
26,
18,
23,
-1,
-1,
45,
-1,
l_up,
l_down,
NULL,
0);
//
blitBufferToBuffer(lbm_buf + 406 * (rectGetWidth(&_scr_size)) + 622,
18,
23,
rectGetWidth(&_scr_size),
r_up,
18);
blitBufferToBuffer(lbm_buf + 253 * (rectGetWidth(&_scr_size)) + 622,
18,
23,
rectGetWidth(&_scr_size),
r_down,
18);
buttonCreate(tool_win,
_scr_size.right - 18,
1,
18,
23,
-1,
-1,
61,
-1,
r_up,
r_down,
NULL,
0);
//
blitBufferToBuffer(lbm_buf + 381 * (rectGetWidth(&_scr_size)) + 101,
18,
23,
rectGetWidth(&_scr_size),
shift_l_up,
18);
blitBufferToBuffer(lbm_buf + 228 * (rectGetWidth(&_scr_size)) + 101,
18,
23,
rectGetWidth(&_scr_size),
shift_l_down,
18);
buttonCreate(tool_win,
101,
1,
18,
23,
-1,
-1,
95,
-1,
shift_l_up,
shift_l_down,
NULL,
0);
//
blitBufferToBuffer(lbm_buf + 381 * (rectGetWidth(&_scr_size)) + 622,
18,
23,
rectGetWidth(&_scr_size),
shift_r_up,
18);
blitBufferToBuffer(lbm_buf + 228 * (rectGetWidth(&_scr_size)) + 622,
18,
23,
rectGetWidth(&_scr_size),
shift_r_down,
18);
buttonCreate(tool_win,
_scr_size.right - 18,
1,
18,
23,
-1,
-1,
43,
-1,
shift_r_up,
shift_r_down,
NULL,
0);
//
for (index = 0; index < max_art_buttons; index++) {
int btn = buttonCreate(tool_win,
index * (art_scale_width + 1) + 121,
1,
art_scale_width,
art_scale_height,
index + max_art_buttons + 161,
58,
160 + index,
-1,
NULL,
NULL,
NULL,
0);
buttonSetRightMouseCallbacks(btn, 160 + index, -1, NULL, NULL);
}
// ELEVATION INC
blitBufferToBuffer(lbm_buf + 431 * (rectGetWidth(&_scr_size)) + 1,
18,
23,
rectGetWidth(&_scr_size),
einc_up,
18);
blitBufferToBuffer(lbm_buf + 325 * (rectGetWidth(&_scr_size)) + 1,
18,
23,
rectGetWidth(&_scr_size),
einc_down,
18);
buttonCreate(tool_win,
1,
51,
18,
23,
-1,
-1,
329,
-1,
einc_up,
einc_down,
NULL,
0);
// ELEVATION DEC
blitBufferToBuffer(lbm_buf + 456 * (rectGetWidth(&_scr_size)) + 1,
18,
23,
rectGetWidth(&_scr_size),
edec_up,
18);
blitBufferToBuffer(lbm_buf + 350 * (rectGetWidth(&_scr_size)) + 1,
18,
23,
rectGetWidth(&_scr_size),
edec_down,
18);
buttonCreate(tool_win,
1,
76,
18,
23,
-1,
-1,
337,
-1,
edec_up,
edec_down,
NULL,
0);
// ELEVATION
for (index = 0; index < 4; index++) {
blitBufferToBuffer(lbm_buf + 293 * rectGetWidth(&_scr_size) + 19 * index,
19,
26,
rectGetWidth(&_scr_size),
e_num[1],
19);
}
view_mode = false;
//
blitBufferToBuffer(lbm_buf + 169 * (rectGetWidth(&_scr_size)) + 64,
58,
13,
rectGetWidth(&_scr_size),
to_iso_up,
58);
blitBufferToBuffer(lbm_buf + 108 * (rectGetWidth(&_scr_size)) + 64,
58,
13,
rectGetWidth(&_scr_size),
to_iso_down,
58);
// ROOF
blitBufferToBuffer(lbm_buf + 464 * (rectGetWidth(&_scr_size)) + 64,
58,
13,
rectGetWidth(&_scr_size),
roof_up,
58);
blitBufferToBuffer(lbm_buf + 358 * (rectGetWidth(&_scr_size)) + 64,
58,
13,
rectGetWidth(&_scr_size),
roof_down,
58);
roof_bid = buttonCreate(tool_win,
64,
69,
58,
13,
-1,
-1,
'r',
'r',
roof_up,
roof_down,
NULL,
BUTTON_FLAG_0x01);
if (tileRoofIsVisible()) {
tile_toggle_roof(false);
}
// HEX
blitBufferToBuffer(lbm_buf + 464 * (rectGetWidth(&_scr_size)) + 64,
58,
13,
rectGetWidth(&_scr_size),
hex_up,
58);
blitBufferToBuffer(lbm_buf + 358 * (rectGetWidth(&_scr_size)) + 64,
58,
13,
rectGetWidth(&_scr_size),
hex_down,
58);
hex_bid = buttonCreate(tool_win,
64,
84,
58,
13,
-1,
-1,
350,
350,
hex_up,
hex_down,
NULL,
BUTTON_FLAG_0x01);
// OBJ
blitBufferToBuffer(lbm_buf + 434 * (rectGetWidth(&_scr_size)) + 125,
66,
13,
rectGetWidth(&_scr_size),
obj_up,
66);
blitBufferToBuffer(lbm_buf + 328 * (rectGetWidth(&_scr_size)) + 125,
66,
13,
rectGetWidth(&_scr_size),
obj_down,
66);
obj_bid = buttonCreate(tool_win,
125,
54,
66,
13,
-1,
-1,
350,
350,
obj_up,
obj_down,
NULL,
BUTTON_FLAG_0x01);
// CRIT
blitBufferToBuffer(lbm_buf + 449 * (rectGetWidth(&_scr_size)) + 125,
66,
13,
rectGetWidth(&_scr_size),
crit_up,
66);
blitBufferToBuffer(lbm_buf + 343 * (rectGetWidth(&_scr_size)) + 125,
66,
13,
rectGetWidth(&_scr_size),
crit_down,
66);
crit_bid = buttonCreate(tool_win,
125,
69,
66,
13,
-1,
-1,
351,
351,
crit_up,
crit_down,
NULL,
BUTTON_FLAG_0x01);
// SCEN
blitBufferToBuffer(lbm_buf + 434 * (rectGetWidth(&_scr_size)) + 194,
53,
13,
rectGetWidth(&_scr_size),
scen_up,
53);
blitBufferToBuffer(lbm_buf + 328 * (rectGetWidth(&_scr_size)) + 194,
53,
13,
rectGetWidth(&_scr_size),
scen_down,
53);
scen_bid = buttonCreate(tool_win,
125,
84,
66,
13,
-1,
-1,
352,
352,
scen_up,
scen_down,
NULL,
BUTTON_FLAG_0x01);
// WALL
blitBufferToBuffer(lbm_buf + 434 * (rectGetWidth(&_scr_size)) + 194,
53,
13,
rectGetWidth(&_scr_size),
wall_up,
53);
blitBufferToBuffer(lbm_buf + 328 * (rectGetWidth(&_scr_size)) + 194,
53,
13,
rectGetWidth(&_scr_size),
wall_down,
53);
wall_bid = buttonCreate(tool_win,
194,
54,
53,
13,
-1,
-1,
355,
355,
wall_up,
wall_down,
NULL,
BUTTON_FLAG_0x01);
// MISC
blitBufferToBuffer(lbm_buf + 464 * (rectGetWidth(&_scr_size)) + 194,
53,
13,
rectGetWidth(&_scr_size),
misc_up,
53);
blitBufferToBuffer(lbm_buf + 358 * (rectGetWidth(&_scr_size)) + 194,
53,
13,
rectGetWidth(&_scr_size),
misc_down,
53);
misc_bid = buttonCreate(tool_win,
194,
84,
53,
13,
-1,
-1,
355,
355,
misc_up,
misc_down,
NULL,
BUTTON_FLAG_0x01);
// HEIGHT INC
blitBufferToBuffer(lbm_buf + 431 * rectGetWidth(&_scr_size) + 251,
18,
23,
rectGetWidth(&_scr_size),
height_inc_up,
18);
blitBufferToBuffer(lbm_buf + 325 * rectGetWidth(&_scr_size) + 251,
18,
23,
rectGetWidth(&_scr_size),
height_inc_down,
18);
buttonCreate(tool_win,
251,
51,
18,
23,
-1,
-1,
371,
-1,
height_dec_up,
height_dec_down,
NULL,
0);
// HEIGHT DEC
blitBufferToBuffer(lbm_buf + 456 * rectGetWidth(&_scr_size) + 251,
18,
23,
rectGetWidth(&_scr_size),
height_dec_up,
18);
blitBufferToBuffer(lbm_buf + 350 * rectGetWidth(&_scr_size) + 251,
18,
23,
rectGetWidth(&_scr_size),
height_dec_down,
18);
buttonCreate(tool_win,
251,
76,
18,
23,
-1,
-1,
371,
-1,
height_dec_up,
height_dec_down,
NULL,
0);
// ARROWS
for (index = 0; index < ROTATION_COUNT; index++) {
}
// COPY
blitBufferToBuffer(lbm_buf + 435 * (rectGetWidth(&_scr_size)) + 325,
49,
19,
rectGetWidth(&_scr_size),
copy_up,
49);
blitBufferToBuffer(lbm_buf + 329 * (rectGetWidth(&_scr_size)) + 325,
49,
19,
rectGetWidth(&_scr_size),
copy_down,
49);
copy_bid = buttonCreate(tool_win,
325,
55,
49,
19,
-1,
-1,
99,
-1,
copy_up,
copy_down,
0,
0);
// PASTE
blitBufferToBuffer(lbm_buf + 457 * (rectGetWidth(&_scr_size)) + 325,
49,
19,
rectGetWidth(&_scr_size),
paste_up,
49);
blitBufferToBuffer(lbm_buf + 351 * (rectGetWidth(&_scr_size)) + 325,
49,
19,
rectGetWidth(&_scr_size),
paste_down,
49);
paste_bid = buttonCreate(tool_win,
325,
77,
49,
19,
-1,
-1,
67,
-1,
paste_up,
paste_down,
NULL,
0);
// EDIT
blitBufferToBuffer(lbm_buf + 435 * (rectGetWidth(&_scr_size)) + 378,
49,
19,
rectGetWidth(&_scr_size),
edit_up,
49);
blitBufferToBuffer(lbm_buf + 329 * (rectGetWidth(&_scr_size)) + 378,
49,
19,
rectGetWidth(&_scr_size),
edit_down,
49);
edit_bid = buttonCreate(tool_win,
378,
55,
49,
19,
-1,
-1,
101,
-1,
edit_up,
edit_down,
NULL,
0);
// DELETE
blitBufferToBuffer(lbm_buf + 457 * rectGetWidth(&_scr_size) + 378,
49,
19,
rectGetWidth(&_scr_size),
delete_up,
49);
blitBufferToBuffer(lbm_buf + 351 * rectGetWidth(&_scr_size) + 378,
49,
19,
rectGetWidth(&_scr_size),
delete_down,
49);
delete_bid = buttonCreate(tool_win,
378,
77,
49,
19,
-1,
-1,
339,
-1,
delete_up,
delete_down,
NULL,
0);
draw_mode = false;
blitBufferToBuffer(lbm_buf + 169 * rectGetWidth(&_scr_size) + 430,
45,
43,
rectGetWidth(&_scr_size),
to_edit_up,
45);
blitBufferToBuffer(lbm_buf + 108 * rectGetWidth(&_scr_size) + 430,
45,
43,
rectGetWidth(&_scr_size),
to_edit_down,
45);
blitBufferToBuffer(lbm_buf + 169 * rectGetWidth(&_scr_size) + 327,
45,
43,
rectGetWidth(&_scr_size),
copy_group_up,
45);
blitBufferToBuffer(lbm_buf + 108 * rectGetWidth(&_scr_size) + 327,
45,
43,
rectGetWidth(&_scr_size),
copy_group_down,
45);
blitBufferToBuffer(lbm_buf + 169 * rectGetWidth(&_scr_size) + 379,
45,
43,
rectGetWidth(&_scr_size),
erase_up,
45);
blitBufferToBuffer(lbm_buf + 108 * rectGetWidth(&_scr_size) + 379,
45,
43,
rectGetWidth(&_scr_size),
erase_down,
45);
internal_free(lbm_buf);
windowRefresh(tool_win);
if (bookmarkInit() == -1) {
debugPrint("\nbookmarkInit() Failed!");
}
if (categoryInit() == -1) {
debugPrint("\ncategoryInit() Failed!");
}
tileScrollBlockingDisable();
tileScrollLimitingDisable();
init_mapper_protos();
_map_init();
target_init();
mouseShowCursor();
if (settings.mapper.rebuild_protos) {
proto_build_all_texts();
settings.mapper.rebuild_protos = false;
}
2023-07-23 01:01:03 -07:00
return 0;
}
// 0x48752C
void mapper_edit_exit()
{
2023-07-23 21:17:21 -07:00
remove(tmp_map_name);
remove("\\fallout\\cd\\data\\maps\\TMP$MAP#.MAP");
remove("\\fallout\\cd\\data\\maps\\TMP$MAP#.CFG");
MapDirErase("MAPS\\", "SAV");
if (can_modify_protos) {
copy_proto_lists();
// NOTE: There is a call to an ambiguous function at `0x4B9ACC`, likely
// `proto_save`.
}
target_exit();
_map_exit();
bookmarkExit();
categoryExit();
windowDestroy(tool_win);
tool = NULL;
windowDestroy(menu_bar);
internal_free(art_shape);
gameExit();
2023-07-23 01:01:03 -07:00
}
2023-07-23 00:26:43 -07:00
// 0x4875B4
int bookmarkInit()
{
return 0;
}
2023-07-23 00:25:58 -07:00
// 0x4875B8
int bookmarkExit()
{
if (bookmarkWin == -1) {
return -1;
}
windowDestroy(bookmarkWin);
bookmarkWin = -1;
return 0;
}
2023-07-23 00:23:55 -07:00
// 0x4875E0
void bookmarkHide()
{
if (bookmarkWin != -1) {
windowHide(bookmarkWin);
}
}
2023-07-23 00:22:42 -07:00
// 0x4875F8
void bookmarkUnHide()
{
if (bookmarkWin != -1) {
windowShow(bookmarkWin);
}
}
2023-07-23 00:20:54 -07:00
// 0x4875B4
int categoryInit()
{
return 0;
}
2023-07-23 00:19:02 -07:00
// 0x487700
int categoryExit()
{
if (categoryWin == -1) {
return -1;
}
windowDestroy(categoryWin);
categoryWin = -1;
return 0;
}
2023-07-23 00:16:59 -07:00
// 0x487728
int categoryHide()
{
if (categoryWin == -1) {
return -1;
}
windowHide(categoryWin);
categoryIsHidden = true;
return 0;
}
2023-07-23 00:17:52 -07:00
// 0x487768
int categoryToggleState()
{
if (categoryIsHidden) {
return categoryUnhide();
} else {
return categoryHide();
}
}
2023-07-23 00:15:51 -07:00
// 0x487774
int categoryUnhide()
{
if (categoryWin == -1) {
return -1;
}
windowShow(categoryWin);
categoryIsHidden = false;
return 0;
}
2023-07-23 00:10:09 -07:00
// 0x487784
bool proto_user_is_librarian()
{
if (!settings.mapper.librarian) {
return false;
}
can_modify_protos = true;
return true;
}
2023-07-23 01:01:03 -07:00
// 0x4877D0
void edit_mapper()
{
// TODO: Incomplete.
}
2023-07-23 20:50:07 -07:00
// 0x48AFFC
void mapper_load_toolbar(int a1, int a2)
{
// TODO: Incomplete.
}
2023-07-23 00:01:58 -07:00
// 0x48B16C
void print_toolbar_name(int object_type)
{
Rect rect;
char name[80];
rect.left = 0;
rect.top = 0;
rect.right = 0;
rect.bottom = 22;
bufferFill(tool + 2 + 2 * (_scr_size.right - _scr_size.left) + 2,
96,
_scr_size.right - _scr_size.left + 1,
19,
_colorTable[21140]);
sprintf(name, "%s", artGetObjectTypeName(object_type));
name[0] = toupper(name[0]);
windowDrawText(tool_win, name, 0, 7, 7, _colorTable[32747] | 0x2000000);
windowRefreshRect(tool_win, &rect);
}
2023-07-22 23:49:22 -07:00
// 0x48B230
void redraw_toolname()
{
Rect rect;
rect.left = _scr_size.right - _scr_size.left - 149;
rect.top = 60;
rect.right = _scr_size.right - _scr_size.left + 1;
rect.bottom = 95;
windowRefreshRect(tool_win, &rect);
}
2023-07-22 23:52:59 -07:00
// 0x48B278
void clear_toolname()
{
windowDrawText(tool_win, "", 120, _scr_size.right - _scr_size.left - 149, 60, 260);
windowDrawText(tool_win, "", 120, _scr_size.right - _scr_size.left - 149, 70, 260);
windowDrawText(tool_win, "", 120, _scr_size.right - _scr_size.left - 149, 80, 260);
redraw_toolname();
}
2023-09-03 10:48:23 -07:00
// 0x48B328
void update_toolname(int* pid, int type, int id)
{
Proto* proto;
*pid = toolbar_proto(type, id);
if (protoGetProto(*pid, &proto) == -1) {
return;
}
windowDrawText(tool_win,
protoGetName(proto->pid),
120,
_scr_size.right - _scr_size.left - 149,
60,
260);
switch (PID_TYPE(proto->pid)) {
case OBJ_TYPE_ITEM:
windowDrawText(tool_win,
gItemTypeNames[proto->item.type],
120,
_scr_size.right - _scr_size.left - 149,
70,
260);
break;
case OBJ_TYPE_CRITTER:
windowDrawText(tool_win,
"",
120,
_scr_size.right - _scr_size.left - 149,
70,
260);
break;
case OBJ_TYPE_WALL:
windowDrawText(tool_win,
proto_wall_light_str(proto->wall.flags),
120,
_scr_size.right - _scr_size.left - 149,
70,
260);
break;
case OBJ_TYPE_TILE:
windowDrawText(tool_win,
"",
120,
_scr_size.right - _scr_size.left - 149,
70,
260);
break;
case OBJ_TYPE_MISC:
windowDrawText(tool_win,
"",
120,
_scr_size.right - _scr_size.left - 149,
70,
260);
break;
default:
windowDrawText(tool_win,
"",
120,
_scr_size.right - _scr_size.left - 149,
70,
260);
break;
}
windowDrawText(tool_win,
"",
120,
_scr_size.right - _scr_size.left - 149,
80,
260);
redraw_toolname();
}
2023-07-22 23:55:58 -07:00
// 0x48B5BC
void update_high_obj_name(Object* obj)
{
Proto* proto;
if (protoGetProto(obj->pid, &proto) != -1) {
windowDrawText(tool_win, protoGetName(obj->pid), 120, _scr_size.right - _scr_size.left - 149, 60, 260);
windowDrawText(tool_win, "", 120, _scr_size.right - _scr_size.left - 149, 70, 260);
windowDrawText(tool_win, "", 120, _scr_size.right - _scr_size.left - 149, 80, 260);
redraw_toolname();
}
}
2023-09-03 11:30:59 -07:00
// 0x48B680
void mapper_destroy_highlight_obj(Object** a1, Object** a2)
{
Rect rect;
int elevation;
if (a2 != NULL && *a2 != NULL) {
elevation = (*a2)->elevation;
reg_anim_clear(*a2);
objectDestroy(*a2, &rect);
tileWindowRefreshRect(&rect, elevation);
*a2 = NULL;
}
if (a1 != NULL && *a1 != NULL) {
elevation = (*a1)->elevation;
objectDestroy(*a1, &rect);
tileWindowRefreshRect(&rect, elevation);
*a1 = NULL;
}
}
2023-07-22 23:44:09 -07:00
// 0x48C604
int mapper_inven_unwield(Object* obj, int right_hand)
{
Object* item;
int fid;
reg_anim_begin(ANIMATION_REQUEST_RESERVED);
if (right_hand) {
item = critterGetItem2(obj);
} else {
item = critterGetItem1(obj);
}
if (item != NULL) {
item->flags &= ~OBJECT_IN_ANY_HAND;
}
animationRegisterAnimate(obj, ANIM_PUT_AWAY, 0);
fid = buildFid(OBJ_TYPE_CRITTER, obj->fid & 0xFFF, 0, 0, (obj->fid & 0x70000000) >> 28);
animationRegisterSetFid(obj, fid, 0);
return reg_anim_end();
}
2023-07-22 23:39:13 -07:00
// 0x48C678
int mapper_mark_exit_grid()
{
int y;
int x;
int tile;
Object* obj;
for (y = -2000; y != 2000; y += 200) {
for (x = -10; x < 10; x++) {
tile = gGameMouseBouncingCursor->tile + y + x;
obj = objectFindFirstAtElevation(gElevation);
while (obj != NULL) {
if (isExitGridPid(obj->pid)) {
obj->data.misc.map = mapInfo.map;
obj->data.misc.tile = mapInfo.tile;
obj->data.misc.elevation = mapInfo.elevation;
obj->data.misc.rotation = mapInfo.rotation;
}
obj = objectFindNextAtElevation();
}
}
}
return 0;
}
2023-07-22 23:25:56 -07:00
// 0x48C704
void mapper_mark_all_exit_grids()
{
Object* obj;
obj = objectFindFirstAtElevation(gElevation);
while (obj != NULL) {
if (isExitGridPid(obj->pid)) {
obj->data.misc.map = mapInfo.map;
obj->data.misc.tile = mapInfo.tile;
obj->data.misc.elevation = mapInfo.elevation;
obj->data.misc.rotation = mapInfo.rotation;
}
obj = objectFindNextAtElevation();
}
}
} // namespace fallout