2023-02-19 23:51:30 +01:00

246 lines
7.0 KiB
C++

/* ScummVM - Graphic Adventure Engine
*
* ScummVM is the legal property of its developers, whose names
* are too numerous to list here. Please refer to the COPYRIGHT
* file distributed with this source distribution.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
#ifndef CHAMBER_SCRIPT_H
#define CHAMBER_SCRIPT_H
#include "chamber/common.h"
#include "chamber/room.h"
namespace Chamber {
enum ScriptPools {
kScrPool0_WordVars0,
kScrPool1_WordVars1,
kScrPool2_ByteVars,
kScrPool3_CurrentItem,
kScrPool4_ZoneSpots,
kScrPool5_Persons,
kScrPool6_Inventory,
kScrPool7_Zapstiks,
kScrPool8_CurrentPers,
kScrPools_MAX
};
/*Byte-packed, members accessed from script code by hardcoded offsets*/
typedef struct script_byte_vars_t {
byte zone_index; /* 0 */
byte zone_room; /* 1 */
byte last_door; /* 2 */
byte cur_spot_idx; /* 3 */
byte the_wall_phase; /* 4 */
byte prev_zone_index; /* 5 */
byte bvar_06; /* 6 */
byte bvar_07; /* 7 */
byte bvar_08; /* 8 */
byte bvar_09; /* 9 */
byte bvar_0A; /* A */
byte bvar_0B; /* B */
byte zone_area; /* C */
byte dead_flag; /* D */
volatile byte timer_ticks; /* E */
byte gauss_phase; /* F */
byte bvar_10; /* 10 */
byte rand_value; /* 11 */
byte load_flag; /* 12 */
byte spot_m; /* 13 */
byte spot_v; /* 14 */
byte bvar_15; /* 15 */
byte bvar_16; /* 16 */
byte bvar_17; /* 17 */
byte bvar_18; /* 18 */
byte bvar_19; /* 19 */
byte bvar_1A; /* 1A */
byte bvar_1B; /* 1B */
byte bvar_1C; /* 1C */
byte bvar_1D; /* 1D */
byte bvar_1E; /* 1E */
byte bvar_1F; /* 1F */
byte cur_pers; /* 20 */
byte used_commands; /* 21 */
byte tries_left; /* 22 */
byte inv_item_index; /* 23 */
byte bvar_24; /* 24 */
byte bvar_25; /* 25 */
byte bvar_26; /* 26 */
byte bvar_27; /* 27 */
byte bvar_28; /* 28 */
byte bvar_29; /* 29 */
byte bvar_2A; /* 2A */
byte hands; /* 2B */
byte check_used_commands; /* 2C */
byte bvar_2D; /* 2D */
byte palette_index; /* 2E */
byte bvar_2F; /* 2F */
byte bvar_30; /* 30 */
byte zapstiks_owned; /* 31 */
byte bvar_32; /* 32 */
byte bvar_33; /* 33 */
byte bvar_34; /* 34 */
byte skulls_submitted; /* 35 */
byte bvar_36; /* 36 */
byte bvar_37; /* 37 */
byte zone_area_copy; /* 38 */
byte aspirant_flags; /* 39 */
byte aspirant_pers_ofs;/* 3A */
byte steals_count; /* 3B */
byte fight_status; /* 3C */
byte extreme_violence; /* 3D */
byte trade_accepted; /* 3E */
byte bvar_3F; /* 3F */
byte bvar_40; /* 40 */
byte bvar_41; /* 41 */
byte bvar_42; /* 42 */
byte bvar_43; /* 43 */
byte dirty_rect_kind; /* 44 */
byte bvar_45; /* 45 */
byte bvar_46; /* 46 */
byte game_paused; /* 47 */
byte skull_trader_status;/* 48 */
byte cur_spot_flags; /* 49 */
byte bvar_4A; /* 4A */
byte bvar_4B; /* 4B */
byte bvar_4C; /* 4C */
byte bvar_4D; /* 4D */
byte bvar_4E; /* 4E */
byte bvar_4F; /* 4F */
byte bvar_50; /* 50 */
byte bvar_51; /* 51 */
byte bvar_52; /* 52 */
byte bvar_53; /* 53 */
byte bvar_54; /* 54 */
byte bvar_55; /* 55 */
byte bvar_56; /* 56 */
byte need_draw_spots; /* 57 */
byte bvar_58; /* 58 */
byte bvar_59; /* 59 */
byte psy_energy; /* 5A */
byte bvar_5B; /* 5B */
byte bvar_5C; /* 5C */
byte bvar_5D; /* 5D */
byte bvar_5E; /* 5E */
byte bvar_5F; /* 5F */
byte bvar_60; /* 60 */
byte bvar_61; /* 61 */
byte bvar_62; /* 62 */
byte bvar_63; /* 63 */
byte bvar_64; /* 64 */
byte bvar_65; /* 65 */
byte bvar_66; /* 66 */
byte bvar_67; /* 67 */
byte zapstik_stolen; /* 68 */
byte bvar_69; /* 69 */
byte bvar_6A; /* 6A */
byte bvar_6B; /* 6B */
byte bvar_6C; /* 6C */
byte bvar_6D[4]; /* 6D */
} script_byte_vars_t;
/*2-byte long vars, in BIG-endian order*/
typedef struct script_word_vars_t {
uint16 psi_cmds[6]; /* 0 */
uint16 wvar_0C; /* C */
uint16 wvar_0E; /* E */
uint16 timer_ticks2; /* 10 */
uint16 zone_obj_cmds[15 * 5]; /* 12 */
uint16 next_aspirant_cmd; /* A8 */
uint16 wvar_AA; /* AA */
uint16 wvar_AC; /* AC */
uint16 wvar_AE; /* AE */
uint16 wvar_B0; /* B0 */
uint16 wvar_B2; /* B2 */
uint16 wvar_B4; /* B4 */
uint16 next_protozorqs_cmd; /* B6 */
uint16 wvar_B8; /* B8 */
} script_word_vars_t;
extern void *script_vars[kScrPools_MAX];
extern script_word_vars_t script_word_vars;
extern script_byte_vars_t script_byte_vars;
/*Don't trade this item*/
#define ITEMFLG_DONTWANT 1
#define ITEMFLG_04 0x04
#define ITEMFLG_08 0x08
/*Skull Trader's item*/
#define ITEMFLG_TRADER 0x10
/*Aspirant's item*/
#define ITEMFLG_ASPIR 0x20
/*In a room?*/
#define ITEMFLG_ROOM 0x40
/*In pocket?*/
#define ITEMFLG_OWNED 0x80
/*TODO: manipulated from script, do not change*/
#include "common/pack-start.h"
typedef struct item_t {
byte flags;
byte area; /*item location*/
byte sprite; /*item sprite index*/
byte name; /*item name index (relative)*/
uint16 command; /*TODO: warning! in native format, check if never accessed from scripts*/
} item_t;
#include "common/pack-end.h"
#define MAX_INV_ITEMS 63
extern item_t inventory_items[MAX_INV_ITEMS];
#define PERS_MAX 41
extern pers_t pers_list[PERS_MAX];
extern byte *script_stack[5 * 2];
extern byte **script_stack_ptr;
extern pers_t *vort_ptr;
#define SPECIAL_COMMANDS_MAX 20
extern uint16 menu_commands_12[SPECIAL_COMMANDS_MAX];
extern uint16 menu_commands_22[SPECIAL_COMMANDS_MAX];
extern uint16 menu_commands_24[SPECIAL_COMMANDS_MAX];
extern uint16 menu_commands_23[SPECIAL_COMMANDS_MAX];
extern uint16 fight_pers_ofs;
extern byte wait_delta;
extern byte rand_seed;
byte getRand(void);
uint16 getRandW(void);
extern uint16 the_command;
byte *getScriptSubroutine(uint16 index);
uint16 runCommand(void);
uint16 runCommandKeepSp(void);
uint16 Swap16(uint16 x);
} // End of namespace Chamber
#endif