Initial commit

This commit is contained in:
2026-02-02 04:50:13 +01:00
commit 5b11698731
22592 changed files with 7677434 additions and 0 deletions

View File

@@ -0,0 +1,378 @@
/* 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/>.
*
*/
#include "qdengine/qd_fwd.h"
#include "qdengine/parser/qdscr_parser.h"
#include "qdengine/parser/xml_parser.h"
namespace QDEngine {
xml::parser *parser = nullptr;
void cleanup_XML_Parser() {
delete parser;
parser = nullptr;
}
xml::parser &qdscr_XML_Parser() {
if (!parser)
parser = new xml::parser;
if (!parser->num_tag_formats()) {
parser->register_tag_format("qd_script", xml::tag(QDSCR_ROOT, xml::tag::TAG_DATA_VOID, 1));
parser->register_tag_format("ID", xml::tag(QDSCR_ID, xml::tag::TAG_DATA_INT, 1));
parser->register_tag_format("x", xml::tag(QDSCR_X, xml::tag::TAG_DATA_INT, 1));
parser->register_tag_format("y", xml::tag(QDSCR_Y, xml::tag::TAG_DATA_INT, 1));
parser->register_tag_format("sx", xml::tag(QDSCR_SX, xml::tag::TAG_DATA_INT, 1));
parser->register_tag_format("sy", xml::tag(QDSCR_SY, xml::tag::TAG_DATA_INT, 1));
parser->register_tag_format("pos_2d", xml::tag(QDSCR_POS2D, xml::tag::TAG_DATA_FLOAT, 2));
parser->register_tag_format("pos_3d", xml::tag(QDSCR_POS3D, xml::tag::TAG_DATA_FLOAT, 3));
parser->register_tag_format("src_pos", xml::tag(QDSCR_SRC_POS, xml::tag::TAG_DATA_FLOAT, 3));
parser->register_tag_format("dest_pos", xml::tag(QDSCR_DEST_POS, xml::tag::TAG_DATA_FLOAT, 3));
parser->register_tag_format("file", xml::tag(QDSCR_FILE, xml::tag::TAG_DATA_STRING, -1));
parser->register_tag_format("start_time", xml::tag(QDSCR_START_TIME, xml::tag::TAG_DATA_FLOAT, 1));
parser->register_tag_format("period", xml::tag(QDSCR_PERIOD, xml::tag::TAG_DATA_FLOAT, 1));
parser->register_tag_format("length", xml::tag(QDSCR_LENGTH, xml::tag::TAG_DATA_FLOAT, 1));
parser->register_tag_format("speed", xml::tag(QDSCR_SPEED, xml::tag::TAG_DATA_FLOAT, 1));
parser->register_tag_format("animation_speed", xml::tag(QDSCR_ANIMATION_SPEED, xml::tag::TAG_DATA_FLOAT, 1));
parser->register_tag_format("interpolation_time", xml::tag(QDSCR_INTERPOLATION_TIME, xml::tag::TAG_DATA_FLOAT, 1));
parser->register_tag_format("scale", xml::tag(QDSCR_SCALE, xml::tag::TAG_DATA_FLOAT, 1));
parser->register_tag_format("name", xml::tag(QDSCR_NAME, xml::tag::TAG_DATA_STRING, -1));
parser->register_tag_format("flag", xml::tag(QDSCR_FLAG, xml::tag::TAG_DATA_INT, 1));
parser->register_tag_format("flags", xml::tag(QDSCR_FLAG, xml::tag::TAG_DATA_INT, 1));
parser->register_tag_format("rnd", xml::tag(QDSCR_RND, xml::tag::TAG_DATA_INT, 1));
parser->register_tag_format("mask_size", xml::tag(QDSCR_MASK_SIZE, xml::tag::TAG_DATA_INT, 2));
parser->register_tag_format("mask_attributes", xml::tag(QDSCR_MASK_ATTRIBUTES, xml::tag::TAG_DATA_INT, -1));
parser->register_tag_format("mask_heights", xml::tag(QDSCR_MASK_HEIGHTS, xml::tag::TAG_DATA_INT, -1));
parser->register_tag_format("bound", xml::tag(QDSCR_BOUND, xml::tag::TAG_DATA_FLOAT, 3));
parser->register_tag_format("type", xml::tag(QDSCR_TYPE, xml::tag::TAG_DATA_INT, 1));
parser->register_tag_format("size", xml::tag(QDSCR_SIZE, xml::tag::TAG_DATA_INT, 1));
parser->register_tag_format("state", xml::tag(QDSCR_STATE, xml::tag::TAG_DATA_INT, 1));
parser->register_tag_format("text", xml::tag(QDSCR_TEXT, xml::tag::TAG_DATA_STRING, -1));
parser->register_tag_format("short_text", xml::tag(QDSCR_SHORT_TEXT, xml::tag::TAG_DATA_STRING, -1));
parser->register_tag_format("value", xml::tag(QDSCR_VALUE, xml::tag::TAG_DATA_INT, 1));
parser->register_tag_format("time", xml::tag(QDSCR_TIME, xml::tag::TAG_DATA_FLOAT, 1));
parser->register_tag_format("cd", xml::tag(QDSCR_CD, xml::tag::TAG_DATA_UNSIGNED_INT, 1));
parser->register_tag_format("align", xml::tag(QDSCR_ALIGN, xml::tag::TAG_DATA_INT, 1));
parser->register_tag_format("valign", xml::tag(QDSCR_VALIGN, xml::tag::TAG_DATA_INT, 1));
parser->register_tag_format("orientation", xml::tag(QDSCR_ORIENTATION, xml::tag::TAG_DATA_INT, 1));
parser->register_tag_format("color", xml::tag(QDSCR_COLOR, xml::tag::TAG_DATA_UNSIGNED_INT, 1));
parser->register_tag_format("comment", xml::tag(QDSCR_COMMENT, xml::tag::TAG_DATA_STRING, -1));
parser->register_tag_format("font_info", xml::tag(QDSCR_FONT_INFO, xml::tag::TAG_DATA_VOID, -1));
parser->register_tag_format("screen_size", xml::tag(QDSCR_SCREEN_SIZE, xml::tag::TAG_DATA_INT, 2));
parser->register_tag_format("text_set", xml::tag(QDSCR_TEXT_SET, xml::tag::TAG_DATA_VOID, 1));
parser->register_tag_format("text_color", xml::tag(QDSCR_TEXT_COLOR, xml::tag::TAG_DATA_INT, 1));
parser->register_tag_format("text_hover_color", xml::tag(QDSCR_TEXT_HOVER_COLOR, xml::tag::TAG_DATA_INT, 1));
parser->register_tag_format("text_align", xml::tag(QDSCR_TEXT_ALIGN, xml::tag::TAG_DATA_INT, 1));
parser->register_tag_format("contour_rect", xml::tag(QDSCR_CONTOUR_RECTANGLE, xml::tag::TAG_DATA_SHORT, 2));
parser->register_tag_format("contour_circle", xml::tag(QDSCR_CONTOUR_CIRCLE, xml::tag::TAG_DATA_SHORT, 1));
parser->register_tag_format("contour_polygon", xml::tag(QDSCR_CONTOUR_POLYGON, xml::tag::TAG_DATA_SHORT, -1));
parser->register_tag_format("named_object", xml::tag(QDSCR_NAMED_OBJECT, xml::tag::TAG_DATA_VOID, 1));
parser->register_tag_format("types", xml::tag(QDSCR_NAMED_OBJECT_TYPES, xml::tag::TAG_DATA_INT, -1));
parser->register_tag_format("grid_zone", xml::tag(QDSCR_GRID_ZONE, xml::tag::TAG_DATA_STRING, -1));
parser->register_tag_format("grid_zone_cells", xml::tag(QDSCR_GRID_ZONE_CELLS, xml::tag::TAG_DATA_SHORT, -1));
parser->register_tag_format("grid_zone_height", xml::tag(QDSCR_GRID_ZONE_HEIGHT, xml::tag::TAG_DATA_UNSIGNED_INT, 1));
parser->register_tag_format("grid_zone_contour", xml::tag(QDSCR_GRID_ZONE_CONTOUR, xml::tag::TAG_DATA_SHORT, -1));
parser->register_tag_format("grid_zone_state", xml::tag(QDSCR_GRID_ZONE_STATE, xml::tag::TAG_DATA_VOID, -1));
parser->register_tag_format("shadow_color", xml::tag(QDSCR_GRID_ZONE_SHADOW_COLOR, xml::tag::TAG_DATA_UNSIGNED_INT, 1));
parser->register_tag_format("shadow_alpha", xml::tag(QDSCR_GRID_ZONE_SHADOW_ALPHA, xml::tag::TAG_DATA_INT, 1));
parser->register_tag_format("trigger_element", xml::tag(QDSCR_TRIGGER_ELEMENT, xml::tag::TAG_DATA_VOID, 1));
parser->register_tag_format("trigger_element_link", xml::tag(QDSCR_TRIGGER_ELEMENT_LINK, xml::tag::TAG_DATA_INT, 3));
parser->register_tag_format("parent_links", xml::tag(QDSCR_TRIGGER_ELEMENT_PARENT_LINKS, xml::tag::TAG_DATA_VOID, 1));
parser->register_tag_format("child_links", xml::tag(QDSCR_TRIGGER_ELEMENT_CHILD_LINKS, xml::tag::TAG_DATA_VOID, 1));
parser->register_tag_format("link", xml::tag(QDSCR_TRIGGER_ELEMENT_LINK, xml::tag::TAG_DATA_VOID, 1));
parser->register_tag_format("auto_restart", xml::tag(QDSCR_TRIGGER_ELEMENT_LINK_AUTO_RESTART, xml::tag::TAG_DATA_INT, 1));
parser->register_tag_format("start_element", xml::tag(QDSCR_TRIGGER_START_ELEMENT, xml::tag::TAG_DATA_INT, 1));
parser->register_tag_format("trigger_chain", xml::tag(QDSCR_TRIGGER_CHAIN, xml::tag::TAG_DATA_STRING, -1));
parser->register_tag_format("trigger_chain_root", xml::tag(QDSCR_TRIGGER_CHAIN_ROOT, xml::tag::TAG_DATA_VOID, 1));
parser->register_tag_format("sound", xml::tag(QDSCR_SOUND, xml::tag::TAG_DATA_STRING, -1));
parser->register_tag_format("volume", xml::tag(QDSCR_SOUND_VOLUME, xml::tag::TAG_DATA_INT, 1));
parser->register_tag_format("music_track", xml::tag(QDSCR_MUSIC_TRACK, xml::tag::TAG_DATA_STRING, -1));
parser->register_tag_format("cycled", xml::tag(QDSCR_MUSIC_TRACK_CYCLED, xml::tag::TAG_DATA_INT, 1));
parser->register_tag_format("video", xml::tag(QDSCR_VIDEO, xml::tag::TAG_DATA_STRING, -1));
parser->register_tag_format("video_position", xml::tag(QDSCR_VIDEO_POSITION, xml::tag::TAG_DATA_SHORT, 2));
parser->register_tag_format("video_background", xml::tag(QDSCR_VIDEO_BACKGROUND, xml::tag::TAG_DATA_STRING, -1));
parser->register_tag_format("minigame", xml::tag(QDSCR_MINIGAME, xml::tag::TAG_DATA_VOID, 1));
parser->register_tag_format("dll_name", xml::tag(QDSCR_MINIGAME_DLL_NAME, xml::tag::TAG_DATA_STRING, -1));
parser->register_tag_format("game_name", xml::tag(QDSCR_MINIGAME_GAME_NAME, xml::tag::TAG_DATA_STRING, -1));
parser->register_tag_format("config_file", xml::tag(QDSCR_MINIGAME_CONFIG_FILE, xml::tag::TAG_DATA_STRING, -1));
parser->register_tag_format("minigame_state", xml::tag(QDSCR_MINIGAME_STATE, xml::tag::TAG_DATA_VOID, 1));
parser->register_tag_format("score", xml::tag(QDSCR_MINIGAME_SCORE, xml::tag::TAG_DATA_INT, 1));
parser->register_tag_format("minigame_config_prm", xml::tag(QDSCR_MINIGAME_CONFIG_PARAMETER, xml::tag::TAG_DATA_STRING, -1));
parser->register_tag_format("animation_frame", xml::tag(QDSCR_ANIMATION_FRAME, xml::tag::TAG_DATA_VOID, 1));
parser->register_tag_format("animation_info", xml::tag(QDSCR_ANIMATION_INFO, xml::tag::TAG_DATA_VOID, 1));
parser->register_tag_format("animation_file", xml::tag(QDSCR_ANIMATION_FILE, xml::tag::TAG_DATA_STRING, -1));
parser->register_tag_format("animation", xml::tag(QDSCR_ANIMATION, xml::tag::TAG_DATA_STRING, -1));
parser->register_tag_format("animation_set", xml::tag(QDSCR_ANIMATION_SET, xml::tag::TAG_DATA_STRING, -1));
parser->register_tag_format("start_angle", xml::tag(QDSCR_ANIMATION_SET_START_ANGLE, xml::tag::TAG_DATA_FLOAT, 1));
parser->register_tag_format("animation_turn", xml::tag(QDSCR_ANIMATION_SET_TURN, xml::tag::TAG_DATA_STRING, -1));
parser->register_tag_format("walk_sound_frequency", xml::tag(QDSCR_OBJECT_STATE_WALK_SOUND_FREQUENCY, xml::tag::TAG_DATA_FLOAT, -1));
parser->register_tag_format("center_offsets", xml::tag(QDSCR_STATE_CENTER_OFFSETS, xml::tag::TAG_DATA_INT, -1));
parser->register_tag_format("static_center_offsets", xml::tag(QDSCR_STATE_STATIC_CENTER_OFFSETS, xml::tag::TAG_DATA_INT, -1));
parser->register_tag_format("start_center_offsets", xml::tag(QDSCR_STATE_START_CENTER_OFFSETS, xml::tag::TAG_DATA_INT, -1));
parser->register_tag_format("stop_center_offsets", xml::tag(QDSCR_STATE_STOP_CENTER_OFFSETS, xml::tag::TAG_DATA_INT, -1));
parser->register_tag_format("coords_animation_point", xml::tag(QDSCR_COORDS_ANIMATION_POINT, xml::tag::TAG_DATA_VOID, 1));
parser->register_tag_format("coords_animation", xml::tag(QDSCR_COORDS_ANIMATION, xml::tag::TAG_DATA_STRING, -1));
parser->register_tag_format("animation_phase", xml::tag(QDSCR_ANIMATION_PHASE, xml::tag::TAG_DATA_FLOAT, 1));
parser->register_tag_format("parallax_offset", xml::tag(QDSCR_PARALLAX_OFFSET, xml::tag::TAG_DATA_INT, 2));
parser->register_tag_format("static_object", xml::tag(QDSCR_STATIC_OBJECT, xml::tag::TAG_DATA_STRING, -1));
parser->register_tag_format("animated_object", xml::tag(QDSCR_ANIMATED_OBJECT, xml::tag::TAG_DATA_STRING, -1));
parser->register_tag_format("object_state", xml::tag(QDSCR_OBJECT_STATE, xml::tag::TAG_DATA_VOID, 1));
parser->register_tag_format("movement_states", xml::tag(QDSCR_OBJECT_MOVEMENT_STATES, xml::tag::TAG_DATA_VOID, 1));
parser->register_tag_format("object_movement_state", xml::tag(QDSCR_OBJECT_MOVEMENT_STATE, xml::tag::TAG_DATA_VOID, 1));
parser->register_tag_format("object_direction", xml::tag(QDSCR_OBJECT_DIRECTION, xml::tag::TAG_DATA_FLOAT, 1));
parser->register_tag_format("default_pos", xml::tag(QDSCR_OBJECT_DEFAULT_POS, xml::tag::TAG_DATA_FLOAT, 3));
parser->register_tag_format("default_direction", xml::tag(QDSCR_OBJECT_DEFAULT_DIRECTION, xml::tag::TAG_DATA_FLOAT, 1));
parser->register_tag_format("object_state_static", xml::tag(QDSCR_OBJECT_STATE_STATIC, xml::tag::TAG_DATA_VOID, 1));
parser->register_tag_format("object_state_walk", xml::tag(QDSCR_OBJECT_STATE_WALK, xml::tag::TAG_DATA_VOID, 1));
parser->register_tag_format("object_state_mask", xml::tag(QDSCR_OBJECT_STATE_MASK, xml::tag::TAG_DATA_VOID, 1));
parser->register_tag_format("state_mask_pos", xml::tag(QDSCR_OBJECT_STATE_MASK_POS, xml::tag::TAG_DATA_INT, 2));
parser->register_tag_format("state_mask_size", xml::tag(QDSCR_OBJECT_STATE_MASK_SIZE, xml::tag::TAG_DATA_INT, 2));
parser->register_tag_format("state_mask_data", xml::tag(QDSCR_OBJECT_STATE_MASK_DATA, xml::tag::TAG_DATA_INT, -1));
parser->register_tag_format("state_mask_parent", xml::tag(QDSCR_OBJECT_STATE_MASK_PARENT, xml::tag::TAG_DATA_STRING, -1));
parser->register_tag_format("state_mask_contour", xml::tag(QDSCR_OBJECT_STATE_MASK_CONTOUR, xml::tag::TAG_DATA_SHORT, -1));
parser->register_tag_format("center_offset", xml::tag(QDSCR_OBJECT_STATE_CENTER_OFFSET, xml::tag::TAG_DATA_SHORT, 2));
parser->register_tag_format("state_activation_delay", xml::tag(QDSCR_OBJECT_STATE_DELAY, xml::tag::TAG_DATA_FLOAT, 1));
parser->register_tag_format("sound_delay", xml::tag(QDSCR_OBJECT_STATE_SOUND_DELAY, xml::tag::TAG_DATA_FLOAT, 1));
parser->register_tag_format("text_delay", xml::tag(QDSCR_OBJECT_STATE_TEXT_DELAY, xml::tag::TAG_DATA_FLOAT, 1));
parser->register_tag_format("cursor_id", xml::tag(QDSCR_OBJECT_STATE_CURSOR_ID, xml::tag::TAG_DATA_INT, 1));
parser->register_tag_format("acceleration", xml::tag(QDSCR_OBJECT_STATE_ACCELERATION, xml::tag::TAG_DATA_FLOAT, 2));
parser->register_tag_format("rnd_move", xml::tag(QDSCR_OBJECT_STATE_RND_MOVE, xml::tag::TAG_DATA_FLOAT, 2));
parser->register_tag_format("condition", xml::tag(QDSCR_CONDITION, xml::tag::TAG_DATA_INT, 1));
parser->register_tag_format("condition_data_int", xml::tag(QDSCR_CONDITION_DATA_INT, xml::tag::TAG_DATA_INT, -1));
parser->register_tag_format("condition_data_float", xml::tag(QDSCR_CONDITION_DATA_FLOAT, xml::tag::TAG_DATA_FLOAT, -1));
parser->register_tag_format("condition_data_string", xml::tag(QDSCR_CONDITION_DATA_STRING, xml::tag::TAG_DATA_STRING, -1));
parser->register_tag_format("condition_inverse", xml::tag(QDSCR_CONDITION_INVERSE, xml::tag::TAG_DATA_INT, 1));
parser->register_tag_format("conditions_mode", xml::tag(QDSCR_CONDITIONS_MODE, xml::tag::TAG_DATA_INT, 1));
parser->register_tag_format("condition_group", xml::tag(QDSCR_CONDITION_GROUP, xml::tag::TAG_DATA_INT, -1));
parser->register_tag_format("condition_object", xml::tag(QDSCR_CONDITION_OBJECT, xml::tag::TAG_DATA_VOID, 1));
parser->register_tag_format("counter", xml::tag(QDSCR_COUNTER, xml::tag::TAG_DATA_VOID, 1));
parser->register_tag_format("counter_element", xml::tag(QDSCR_COUNTER_ELEMENT, xml::tag::TAG_DATA_VOID, 1));
parser->register_tag_format("inc_value", xml::tag(QDSCR_COUNTER_INC_VALUE, xml::tag::TAG_DATA_INT, 1));
parser->register_tag_format("limit", xml::tag(QDSCR_COUNTER_LIMIT, xml::tag::TAG_DATA_INT, 1));
parser->register_tag_format("digits", xml::tag(QDSCR_COUNTER_DIGITS, xml::tag::TAG_DATA_INT, 1));
parser->register_tag_format("counter_name", xml::tag(QDSCR_COUNTER_NAME, xml::tag::TAG_DATA_STRING, -1));
parser->register_tag_format("object_scale", xml::tag(QDSCR_OBJ_SCALE_INFO, xml::tag::TAG_DATA_STRING, -1));
parser->register_tag_format("mouse_object", xml::tag(QDSCR_MOUSE_OBJECT, xml::tag::TAG_DATA_STRING, -1));
parser->register_tag_format("default_cursors", xml::tag(QDSCR_MOUSE_DEFAULT_CURSORS, xml::tag::TAG_DATA_INT, 6));
parser->register_tag_format("movement_animation_num", xml::tag(QDSCR_MOVEMENT_ANIMATION_NUMBER, xml::tag::TAG_DATA_INT, 1));
parser->register_tag_format("movement_animations", xml::tag(QDSCR_MOVEMENT_ANIMATIONS, xml::tag::TAG_DATA_VOID, 1));
parser->register_tag_format("static_animations", xml::tag(QDSCR_STATIC_ANIMATIONS, xml::tag::TAG_DATA_VOID, 1));
parser->register_tag_format("moving_object", xml::tag(QDSCR_MOVING_OBJECT, xml::tag::TAG_DATA_STRING, -1));
parser->register_tag_format("collision_radius", xml::tag(QDSCR_COLLISION_RADIUS, xml::tag::TAG_DATA_FLOAT, 1));
parser->register_tag_format("collision_delay", xml::tag(QDSCR_COLLISION_DELAY, xml::tag::TAG_DATA_FLOAT, 1));
parser->register_tag_format("collision_path", xml::tag(QDSCR_COLLISION_PATH, xml::tag::TAG_DATA_FLOAT, 1));
parser->register_tag_format("follow_min_radius", xml::tag(QDSCR_FOLLOW_MIN_RADIUS, xml::tag::TAG_DATA_FLOAT, 1));
parser->register_tag_format("follow_max_radius", xml::tag(QDSCR_FOLLOW_MAX_RADIUS, xml::tag::TAG_DATA_FLOAT, 1));
parser->register_tag_format("attach_shift", xml::tag(QDSCR_ATTACH_SHIFT, xml::tag::TAG_DATA_SHORT, 2));
parser->register_tag_format("control", xml::tag(QDSCR_PERSONAGE_CONTROL, xml::tag::TAG_DATA_INT, 1));
parser->register_tag_format("movement", xml::tag(QDSCR_PERSONAGE_MOVEMENT_TYPE, xml::tag::TAG_DATA_INT, 1));
parser->register_tag_format("rotation_angle_per_quant", xml::tag(QDSCR_ROTATION_ANGLE_PER_QUANT, xml::tag::TAG_DATA_FLOAT, 1));
parser->register_tag_format("inventory_cell_type", xml::tag(QDSCR_INVENTORY_CELL_TYPE, xml::tag::TAG_DATA_INT, 1));
parser->register_tag_format("inventory_cell_set", xml::tag(QDSCR_INVENTORY_CELL_SET, xml::tag::TAG_DATA_INT, 1));
parser->register_tag_format("inventory_cell_set_size", xml::tag(QDSCR_INVENTORY_CELL_SET_SIZE, xml::tag::TAG_DATA_SHORT, 2));
parser->register_tag_format("inventory_cell_set_additional_cells", xml::tag(QDSCR_INVENTORY_CELL_SET_ADDITIONAL_CELLS, xml::tag::TAG_DATA_SHORT, 2));
parser->register_tag_format("inventory_cell_set_pos", xml::tag(QDSCR_INVENTORY_CELL_SET_POS, xml::tag::TAG_DATA_SHORT, 2));
parser->register_tag_format("inventory", xml::tag(QDSCR_INVENTORY, xml::tag::TAG_DATA_STRING, -1));
parser->register_tag_format("camera", xml::tag(QDSCR_CAMERA, xml::tag::TAG_DATA_VOID, 1));
parser->register_tag_format("camera_grid_size", xml::tag(QDSCR_CAMERA_GRID_SIZE, xml::tag::TAG_DATA_INT, 2));
parser->register_tag_format("camera_grid_height", xml::tag(QDSCR_CAMERA_GRID_HEIGHT, xml::tag::TAG_DATA_INT, -1));
parser->register_tag_format("camera_grid_attributes", xml::tag(QDSCR_CAMERA_GRID_ATTRIBUTES, xml::tag::TAG_DATA_INT, -1));
parser->register_tag_format("camera_grid_center", xml::tag(QDSCR_CAMERA_GRID_CENTER, xml::tag::TAG_DATA_FLOAT, 3));
parser->register_tag_format("camera_cell_size", xml::tag(QDSCR_CAMERA_CELL_SIZE, xml::tag::TAG_DATA_INT, 2));
parser->register_tag_format("camera_focus", xml::tag(QDSCR_CAMERA_FOCUS, xml::tag::TAG_DATA_FLOAT, 1));
parser->register_tag_format("camera_angles", xml::tag(QDSCR_CAMERA_ANGLES, xml::tag::TAG_DATA_FLOAT, 3));
parser->register_tag_format("camera_screen_size", xml::tag(QDSCR_CAMERA_SCREEN_SIZE, xml::tag::TAG_DATA_INT, 2));
parser->register_tag_format("camera_screen_offset", xml::tag(QDSCR_CAMERA_SCREEN_OFFSET, xml::tag::TAG_DATA_INT, 2));
parser->register_tag_format("camera_screen_center", xml::tag(QDSCR_CAMERA_SCREEN_CENTER, xml::tag::TAG_DATA_INT, 2));
parser->register_tag_format("camera_mode", xml::tag(QDSCR_CAMERA_MODE, xml::tag::TAG_DATA_VOID, 1));
parser->register_tag_format("scrolling_speed", xml::tag(QDSCR_CAMERA_SCROLLING_SPEED, xml::tag::TAG_DATA_FLOAT, 1));
parser->register_tag_format("scrolling_dist", xml::tag(QDSCR_CAMERA_SCROLLING_DIST, xml::tag::TAG_DATA_INT, 1));
parser->register_tag_format("smooth_switch", xml::tag(QDSCR_CAMERA_SMOOTH_SWITCH, xml::tag::TAG_DATA_INT, 1));
parser->register_tag_format("camera_scale_pow", xml::tag(QDSCR_CAMERA_SCALE_POW, xml::tag::TAG_DATA_FLOAT, 1));
parser->register_tag_format("camera_scale_z_offset", xml::tag(QDSCR_CAMERA_SCALE_Z_OFFSET, xml::tag::TAG_DATA_FLOAT, 1));
parser->register_tag_format("game_end", xml::tag(QDSCR_GAME_END, xml::tag::TAG_DATA_VOID, 1));
parser->register_tag_format("end_screen", xml::tag(QDSCR_GAME_END_SCREEN, xml::tag::TAG_DATA_STRING, -1));
parser->register_tag_format("interface", xml::tag(QDSCR_INTERFACE, xml::tag::TAG_DATA_VOID, 1));
parser->register_tag_format("draw_scene", xml::tag(QDSCR_INTERFACE_SCENE_REDRAW, xml::tag::TAG_DATA_INT, 1));
parser->register_tag_format("main_menu", xml::tag(QDSCR_INTERFACE_MAIN_MENU, xml::tag::TAG_DATA_STRING, -1));
parser->register_tag_format("ingame_screen0", xml::tag(QDSCR_INTERFACE_INGAME_SCREEN0, xml::tag::TAG_DATA_STRING, -1));
parser->register_tag_format("ingame_screen1", xml::tag(QDSCR_INTERFACE_INGAME_SCREEN1, xml::tag::TAG_DATA_STRING, -1));
parser->register_tag_format("save_prompt_screen", xml::tag(QDSCR_INTERFACE_SAVE_PROMPT_SCREEN, xml::tag::TAG_DATA_STRING, -1));
parser->register_tag_format("save_title_screen", xml::tag(QDSCR_INTERFACE_SAVE_NAME_SCREEN, xml::tag::TAG_DATA_STRING, -1));
parser->register_tag_format("highscore_name_screen", xml::tag(QDSCR_INTERFACE_HIGHSCORE_NAME_SCREEN, xml::tag::TAG_DATA_STRING, -1));
parser->register_tag_format("need_save_screenshot", xml::tag(QDSCR_INTERFACE_NEED_SAVE_SCREENSHOT, xml::tag::TAG_DATA_INT, 1));
parser->register_tag_format("need_show_save_name", xml::tag(QDSCR_INTERFACE_NEED_SHOW_SAVE_NAME, xml::tag::TAG_DATA_INT, 1));
parser->register_tag_format("need_show_save_time", xml::tag(QDSCR_INTERFACE_NEED_SHOW_SAVE_TIME, xml::tag::TAG_DATA_INT, 1));
parser->register_tag_format("save_font_type", xml::tag(QDSCR_INTERFACE_SAVE_FONT_TYPE, xml::tag::TAG_DATA_INT, 1));
parser->register_tag_format("save_font_color", xml::tag(QDSCR_INTERFACE_SAVE_FONT_COLOR, xml::tag::TAG_DATA_INT, 1));
parser->register_tag_format("is_autosave", xml::tag(QDSCR_INTERFACE_SAVE_IS_AUTOSAVE, xml::tag::TAG_DATA_INT, 1));
parser->register_tag_format("interface_screen", xml::tag(QDSCR_INTERFACE_SCREEN, xml::tag::TAG_DATA_VOID, 1));
parser->register_tag_format("hide_time", xml::tag(QDSCR_INTERFACE_SCREEN_HIDE_TIME, xml::tag::TAG_DATA_FLOAT, 1));
parser->register_tag_format("hide_offset", xml::tag(QDSCR_INTERFACE_SCREEN_HIDE_OFFSET, xml::tag::TAG_DATA_INT, 2));
parser->register_tag_format("interface_element", xml::tag(QDSCR_INTERFACE_ELEMENT, xml::tag::TAG_DATA_VOID, 1));
parser->register_tag_format("interface_element_state", xml::tag(QDSCR_INTERFACE_ELEMENT_STATE, xml::tag::TAG_DATA_VOID, 1));
parser->register_tag_format("state_mode", xml::tag(QDSCR_INTERFACE_ELEMENT_STATE_MODE, xml::tag::TAG_DATA_VOID, 1));
parser->register_tag_format("pos", xml::tag(QDSCR_INTERFACE_ELEMENT_POS, xml::tag::TAG_DATA_INT, 3));
parser->register_tag_format("option_id", xml::tag(QDSCR_INTERFACE_OPTION_ID, xml::tag::TAG_DATA_INT, 1));
parser->register_tag_format("event", xml::tag(QDSCR_INTERFACE_EVENT, xml::tag::TAG_DATA_VOID, 1));
parser->register_tag_format("event_data", xml::tag(QDSCR_INTERFACE_EVENT_DATA, xml::tag::TAG_DATA_STRING, -1));
parser->register_tag_format("before_animation", xml::tag(QDSCR_INTERFACE_EVENT_BEFORE_ANIMATION, xml::tag::TAG_DATA_INT, 1));
parser->register_tag_format("activation_type", xml::tag(QDSCR_INTERFACE_EVENT_ACTIVATION_TYPE, xml::tag::TAG_DATA_INT, 1));
parser->register_tag_format("action", xml::tag(QDSCR_INTERFACE_ACTION, xml::tag::TAG_DATA_INT, 1));
parser->register_tag_format("action_data", xml::tag(QDSCR_INTERFACE_ACTION_DATA, xml::tag::TAG_DATA_STRING, -1));
parser->register_tag_format("animation_flags", xml::tag(QDSCR_INTERFACE_ANIMATION_FLAGS, xml::tag::TAG_DATA_INT, 1));
parser->register_tag_format("slider_rect", xml::tag(QDSCR_INTERFACE_SLIDER_RECTANGLE, xml::tag::TAG_DATA_INT, 2));
parser->register_tag_format("slider_orientation", xml::tag(QDSCR_INTERFACE_SLIDER_ORIENTATION, xml::tag::TAG_DATA_INT, 1));
parser->register_tag_format("background_offset", xml::tag(QDSCR_INTERFACE_BACKGROUND_OFFSET, xml::tag::TAG_DATA_INT, 2));
parser->register_tag_format("thumbnail_size", xml::tag(QDSCR_INTERFACE_THUMBNAIL_SIZE, xml::tag::TAG_DATA_INT, 2));
parser->register_tag_format("text_shift", xml::tag(QDSCR_INTERFACE_TEXT_SHIFT, xml::tag::TAG_DATA_INT, 2));
parser->register_tag_format("border_corner", xml::tag(QDSCR_TEXT_WINDOW_BORDER_CORNER, xml::tag::TAG_DATA_STRING, -1));
parser->register_tag_format("border_line", xml::tag(QDSCR_TEXT_WINDOW_BORDER_LINE_H, xml::tag::TAG_DATA_STRING, -1));
parser->register_tag_format("border_vline", xml::tag(QDSCR_TEXT_WINDOW_BORDER_LINE_V, xml::tag::TAG_DATA_STRING, -1));
parser->register_tag_format("border_back", xml::tag(QDSCR_TEXT_WINDOW_BORDER_BACK, xml::tag::TAG_DATA_STRING, -1));
parser->register_tag_format("window_slider", xml::tag(QDSCR_TEXT_WINDOW_SLIDER, xml::tag::TAG_DATA_STRING, -1));
parser->register_tag_format("window_type", xml::tag(QDSCR_TEXT_WINDOW_TYPE, xml::tag::TAG_DATA_INT, 1));
parser->register_tag_format("string_length", xml::tag(QDSCR_TEXT_WINDOW_MAX_STRING_LENGTH, xml::tag::TAG_DATA_INT, 1));
parser->register_tag_format("info_type", xml::tag(QDSCR_TEXT_WINDOW_INFO_TYPE, xml::tag::TAG_DATA_INT, 1));
parser->register_tag_format("player_id", xml::tag(QDSCR_TEXT_WINDOW_PLAYER_ID, xml::tag::TAG_DATA_INT, 1));
parser->register_tag_format("scene", xml::tag(QDSCR_SCENE, xml::tag::TAG_DATA_STRING, -1));
parser->register_tag_format("save_slot", xml::tag(QDSCR_SCENE_SAVE_SLOT, xml::tag::TAG_DATA_INT, 1));
parser->register_tag_format("startup_scene", xml::tag(QDSCR_STARTUP_SCENE, xml::tag::TAG_DATA_STRING, -1));
parser->register_tag_format("restart_minigame", xml::tag(QDSCR_SCENE_RESTART_MINIGAME, xml::tag::TAG_DATA_INT, 1));
parser->register_tag_format("location", xml::tag(QDSCR_LOCATION, xml::tag::TAG_DATA_STRING, -1));
parser->register_tag_format("game_title", xml::tag(QDSCR_GAME_TITLE, xml::tag::TAG_DATA_STRING, -1));
parser->register_tag_format("text_db", xml::tag(QDSCR_TEXT_DB, xml::tag::TAG_DATA_STRING, -1));
parser->register_tag_format("cd_key", xml::tag(QDSCR_CD_KEY, xml::tag::TAG_DATA_STRING, -1));
// For qdScreenTextFormat
parser->register_tag_format("screen_text_format", xml::tag(QDSCR_SCREEN_TEXT_FORMAT, xml::tag::TAG_DATA_VOID, -1));
parser->register_tag_format("font_type", xml::tag(QDSCR_FONT_TYPE, xml::tag::TAG_DATA_INT, 1));
parser->register_tag_format("default_font", xml::tag(QDSCR_DEFAULT_FONT, xml::tag::TAG_DATA_INT, 1));
parser->register_tag_format("global_depend", xml::tag(QDSCR_GLOBAL_DEPEND, xml::tag::TAG_DATA_INT, 1));
parser->register_tag_format("inverse_direction", xml::tag(QDSCR_INVERSE_DIRECTION, xml::tag::TAG_DATA_INT, 1));
parser->register_tag_format("alpha", xml::tag(QDSCR_ALPHA, xml::tag::TAG_DATA_INT, 1));
parser->register_tag_format("enable_background", xml::tag(QDSCR_ENABLE_BACKGROUND, xml::tag::TAG_DATA_INT, 1));
parser->register_tag_format("fade_time", xml::tag(QDSCR_FADE_TIME, xml::tag::TAG_DATA_FLOAT, 1));
parser->register_tag_format("hof_size", xml::tag(QDSCR_HALL_OF_FAME_SIZE, xml::tag::TAG_DATA_INT, 1));
parser->register_tag_format("screen_transform", xml::tag(QDSCR_SCREEN_TRANSFORM, xml::tag::TAG_DATA_FLOAT, 6));
parser->register_tag_format("compression", xml::tag(QDSCR_RESOURCE_COMPRESSION, xml::tag::TAG_DATA_INT, 1));
}
return *parser;
}
const char *qdscr_XML_string(const char *p) {
static Common::String conv_str;
conv_str = p;
uint32 pos = conv_str.find("&");;
while (pos != Common::String::npos) {
conv_str.replace(pos, 1, "&amp;");
pos = conv_str.find("&", pos + 1);
}
pos = conv_str.find("<");
while (pos != Common::String::npos) {
conv_str.replace(pos, 1, "&lt;");
pos = conv_str.find("<", pos + 1);
}
pos = conv_str.find(">");
while (pos != Common::String::npos) {
conv_str.replace(pos, 1, "&gt;");
pos = conv_str.find(">", pos + 1);
}
pos = conv_str.find("\"");
while (pos != Common::String::npos) {
conv_str.replace(pos, 1, "&quot;");
pos = conv_str.find("\"", pos + 1);
}
pos = conv_str.find("'");
while (pos != Common::String::npos) {
conv_str.replace(pos, 1, "&#039;");
pos = conv_str.find("'", pos + 1);
}
return (const char *)transCyrillic(conv_str.c_str());
}
const char *qdscr_XML_string(const Common::String &s) {
return qdscr_XML_string(s.c_str());
}
} // namespace QDEngine

View File

@@ -0,0 +1,715 @@
/* 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 QDENGINE_PARSER_QDSCR_PARSER_H
#define QDENGINE_PARSER_QDSCR_PARSER_H
#include "qdengine/parser/xml_fwd.h"
namespace QDEngine {
/*
qda_version = 100: 20020404
qda_version = 101: 20020730
qda_version = 102: 20020822
qda_version = 103: 20030829
qda_version = 104: < 20060129
*/
/* Version 20050101 is artificial and used by mng between
20040601 and 20060129
*/
//! Идентификаторы тэгов скрипта.
enum qdscrTagID {
QDSCR_ROOT = 1,
// Common
QDSCR_ID,
QDSCR_X,
QDSCR_Y,
QDSCR_SX, // 5
QDSCR_SY,
QDSCR_POS2D,
QDSCR_POS3D,
QDSCR_SRC_POS,
QDSCR_DEST_POS, // 10
QDSCR_FILE,
QDSCR_START_TIME,
QDSCR_PERIOD,
QDSCR_LENGTH,
QDSCR_SPEED, // 15
QDSCR_ANIMATION_SPEED,
QDSCR_INTERPOLATION_TIME,
QDSCR_SCALE,
QDSCR_NAME,
QDSCR_FLAG, // 20
QDSCR_RND,
QDSCR_MASK_SIZE,
QDSCR_MASK_ATTRIBUTES,
QDSCR_MASK_HEIGHTS,
QDSCR_BOUND, // 25
QDSCR_TYPE,
QDSCR_SIZE,
QDSCR_STATE,
QDSCR_TEXT,
QDSCR_SHORT_TEXT, // 30
QDSCR_VALUE,
QDSCR_TIME,
QDSCR_CD,
QDSCR_ALIGN,
QDSCR_VALIGN, // 35
QDSCR_ORIENTATION,
QDSCR_COLOR,
QDSCR_COMMENT,
QDSCR_SCREEN_SIZE,
QDSCR_TEXT_SET, // 40
// Text
QDSCR_TEXT_COLOR,
QDSCR_TEXT_HOVER_COLOR,
QDSCR_TEXT_ALIGN,
// Fonts
QDSCR_FONT_INFO,
// Contours
QDSCR_CONTOUR_RECTANGLE, // 45
QDSCR_CONTOUR_CIRCLE,
QDSCR_CONTOUR_POLYGON,
// Named Object Reference
QDSCR_NAMED_OBJECT,
QDSCR_NAMED_OBJECT_TYPES,
// Grid zone
QDSCR_GRID_ZONE, // 50
QDSCR_GRID_ZONE_CELLS,
QDSCR_GRID_ZONE_HEIGHT,
QDSCR_GRID_ZONE_CONTOUR,
QDSCR_GRID_ZONE_STATE,
QDSCR_GRID_ZONE_SHADOW_COLOR, // 55
QDSCR_GRID_ZONE_SHADOW_ALPHA,
// Trigger Element
QDSCR_TRIGGER_ELEMENT,
QDSCR_TRIGGER_ELEMENT_LINK,
QDSCR_TRIGGER_ELEMENT_PARENT_LINKS,
QDSCR_TRIGGER_ELEMENT_CHILD_LINKS, // 60
QDSCR_TRIGGER_ELEMENT_LINK_AUTO_RESTART,
QDSCR_TRIGGER_ELEMENT_LINK_OFFSETS,
QDSCR_TRIGGER_ELEMENT_TITLE,
QDSCR_TRIGGER_ELEMENT_CELL_NUMBER,
QDSCR_TRIGGER_PARENT_LINK_OWNER_OFFSET, // 65
QDSCR_TRIGGER_PARENT_LINK_CHILD_OFFSET,
QDSCR_TRIGGER_CHILD_LINK_OWNER_OFFSET,
QDSCR_TRIGGER_CHILD_LINK_CHILD_OFFSET,
QDSCR_TRIGGER_START_ELEMENT,
// Trigger Chain
QDSCR_TRIGGER_CHAIN, // 70
QDSCR_TRIGGER_CHAIN_ROOT,
QDSCR_TRIGGER_CHAIN_WORK_AREA,
QDSCR_TRIGGER_CHAIN_LAYOUT,
QDSCR_TRIGGER_BOUND,
// Sound
QDSCR_SOUND, // 75
QDSCR_SOUND_VOLUME,
// Music
QDSCR_MUSIC_TRACK,
QDSCR_MUSIC_TRACK_CYCLED,
// Video
QDSCR_VIDEO,
QDSCR_VIDEO_POSITION, // 80
QDSCR_VIDEO_BACKGROUND,
// Minigame
QDSCR_MINIGAME,
QDSCR_MINIGAME_DLL_NAME,
QDSCR_MINIGAME_GAME_NAME,
QDSCR_MINIGAME_CONFIG_FILE, // 85
QDSCR_MINIGAME_STATE,
QDSCR_MINIGAME_SCORE,
QDSCR_MINIGAME_CONFIG_PARAMETER,
// Animation
QDSCR_ANIMATION_FRAME,
QDSCR_ANIMATION_INFO, // 90
QDSCR_ANIMATION_FILE,
QDSCR_ANIMATION,
// AnimationSet
QDSCR_ANIMATION_SET,
QDSCR_ANIMATION_SET_START_ANGLE,
QDSCR_ANIMATION_SET_TURN, // 95
// Coords Animation
QDSCR_COORDS_ANIMATION_POINT,
QDSCR_COORDS_ANIMATION,
QDSCR_ANIMATION_PHASE,
// Game Object
QDSCR_PARALLAX_OFFSET,
// Static Object
QDSCR_STATIC_OBJECT, // 100
// Animated Object
QDSCR_ANIMATED_OBJECT,
QDSCR_OBJECT_STATE,
QDSCR_OBJECT_MOVEMENT_STATES,
QDSCR_OBJECT_MOVEMENT_STATE,
QDSCR_OBJECT_DIRECTION, // 105
QDSCR_OBJECT_DEFAULT_POS,
QDSCR_OBJECT_DEFAULT_DIRECTION,
QDSCR_OBJECT_STATE_STATIC,
QDSCR_OBJECT_STATE_WALK,
QDSCR_OBJECT_STATE_MASK, // 110
QDSCR_OBJECT_STATE_MASK_POS,
QDSCR_OBJECT_STATE_MASK_SIZE,
QDSCR_OBJECT_STATE_MASK_DATA,
QDSCR_OBJECT_STATE_MASK_PARENT,
QDSCR_OBJECT_STATE_MASK_CONTOUR, // 115
QDSCR_OBJECT_STATE_CENTER_OFFSET,
QDSCR_OBJECT_STATE_DELAY,
QDSCR_OBJECT_STATE_SOUND_DELAY,
QDSCR_OBJECT_STATE_TEXT_DELAY,
QDSCR_OBJECT_STATE_CURSOR_ID, // 120
QDSCR_OBJECT_STATE_ACCELERATION,
QDSCR_OBJECT_STATE_RND_MOVE,
QDSCR_OBJECT_STATE_WALK_SOUND_FREQUENCY,
QDSCR_STATE_CENTER_OFFSETS,
QDSCR_STATE_STATIC_CENTER_OFFSETS, // 125
QDSCR_STATE_START_CENTER_OFFSETS,
QDSCR_STATE_STOP_CENTER_OFFSETS,
// State conditions
QDSCR_CONDITION,
QDSCR_CONDITION_DATA_INT,
QDSCR_CONDITION_DATA_FLOAT, // 130
QDSCR_CONDITION_DATA_STRING,
QDSCR_CONDITION_INVERSE,
QDSCR_CONDITIONS_MODE,
QDSCR_CONDITION_GROUP,
QDSCR_CONDITION_OBJECT, // 135
// Counter
QDSCR_COUNTER,
QDSCR_COUNTER_ELEMENT,
QDSCR_COUNTER_INC_VALUE,
QDSCR_COUNTER_LIMIT,
QDSCR_COUNTER_DIGITS, // 140
QDSCR_COUNTER_NAME,
// Object Scale
QDSCR_OBJ_SCALE_INFO,
// Mouse object
QDSCR_MOUSE_OBJECT,
QDSCR_MOUSE_DEFAULT_CURSORS,
// Moving Object
QDSCR_MOVEMENT_ANIMATION_NUMBER, // 145
QDSCR_MOVEMENT_ANIMATIONS,
QDSCR_STATIC_ANIMATIONS,
QDSCR_MOVING_OBJECT,
QDSCR_COLLISION_RADIUS,
QDSCR_COLLISION_DELAY, // 150
QDSCR_COLLISION_PATH,
QDSCR_FOLLOW_MIN_RADIUS,
QDSCR_FOLLOW_MAX_RADIUS,
QDSCR_ATTACH_SHIFT,
QDSCR_PERSONAGE_CONTROL, // 155
QDSCR_PERSONAGE_MOVEMENT_TYPE,
QDSCR_ROTATION_ANGLE_PER_QUANT,
// Inventory
QDSCR_INVENTORY_CELL_TYPE,
QDSCR_INVENTORY_CELL_SET,
QDSCR_INVENTORY_CELL_SET_SIZE, // 160
QDSCR_INVENTORY_CELL_SET_ADDITIONAL_CELLS,
QDSCR_INVENTORY_CELL_SET_POS,
QDSCR_INVENTORY,
// Camera & grid
QDSCR_CAMERA,
QDSCR_CAMERA_GRID_SIZE, // 165
QDSCR_CAMERA_GRID_HEIGHT,
QDSCR_CAMERA_GRID_ATTRIBUTES,
QDSCR_CAMERA_GRID_CENTER,
QDSCR_CAMERA_CELL_SIZE,
QDSCR_CAMERA_FOCUS, // 170
QDSCR_CAMERA_ANGLES,
QDSCR_CAMERA_SCREEN_SIZE,
QDSCR_CAMERA_SCREEN_OFFSET,
QDSCR_CAMERA_SCREEN_CENTER,
QDSCR_CAMERA_MODE, // 175
QDSCR_CAMERA_SCROLLING_SPEED,
QDSCR_CAMERA_SCROLLING_DIST,
QDSCR_CAMERA_SMOOTH_SWITCH,
QDSCR_CAMERA_SCALE_POW,
QDSCR_CAMERA_SCALE_Z_OFFSET, // 180
// Game end
QDSCR_GAME_END,
QDSCR_GAME_END_SCREEN,
// Interface
QDSCR_INTERFACE,
QDSCR_INTERFACE_SCENE_REDRAW,
QDSCR_INTERFACE_MAIN_MENU, // 185
QDSCR_INTERFACE_INGAME_SCREEN0,
QDSCR_INTERFACE_INGAME_SCREEN1,
QDSCR_INTERFACE_HIGHSCORE_NAME_SCREEN,
QDSCR_INTERFACE_SAVE_PROMPT_SCREEN,
QDSCR_INTERFACE_SAVE_NAME_SCREEN, // 190
QDSCR_INTERFACE_NEED_SAVE_SCREENSHOT,
QDSCR_INTERFACE_NEED_SHOW_SAVE_NAME,
QDSCR_INTERFACE_NEED_SHOW_SAVE_TIME,
QDSCR_INTERFACE_SAVE_FONT_TYPE,
QDSCR_INTERFACE_SAVE_FONT_COLOR, // 195
QDSCR_INTERFACE_SAVE_IS_AUTOSAVE,
QDSCR_INTERFACE_SCREEN,
QDSCR_INTERFACE_SCREEN_HIDE_TIME,
QDSCR_INTERFACE_SCREEN_HIDE_OFFSET,
QDSCR_INTERFACE_ELEMENT, // 200
QDSCR_INTERFACE_ELEMENT_STATE,
QDSCR_INTERFACE_ELEMENT_STATE_MODE,
QDSCR_INTERFACE_ELEMENT_POS,
QDSCR_INTERFACE_OPTION_ID,
QDSCR_INTERFACE_EVENT, // 205
QDSCR_INTERFACE_EVENT_DATA,
QDSCR_INTERFACE_EVENT_BEFORE_ANIMATION,
QDSCR_INTERFACE_EVENT_ACTIVATION_TYPE,
QDSCR_INTERFACE_ACTION,
QDSCR_INTERFACE_ACTION_DATA, // 210
QDSCR_INTERFACE_ANIMATION_FLAGS,
QDSCR_INTERFACE_SLIDER_RECTANGLE,
QDSCR_INTERFACE_SLIDER_ORIENTATION,
QDSCR_INTERFACE_BACKGROUND_OFFSET,
QDSCR_INTERFACE_THUMBNAIL_SIZE, // 215
QDSCR_INTERFACE_TEXT_SHIFT,
QDSCR_TEXT_WINDOW_BORDER_CORNER,
QDSCR_TEXT_WINDOW_BORDER_LINE_H,
QDSCR_TEXT_WINDOW_BORDER_LINE_V,
QDSCR_TEXT_WINDOW_BORDER_BACK, // 220
QDSCR_TEXT_WINDOW_SLIDER,
QDSCR_TEXT_WINDOW_TYPE,
QDSCR_TEXT_WINDOW_MAX_STRING_LENGTH,
QDSCR_TEXT_WINDOW_INFO_TYPE,
QDSCR_TEXT_WINDOW_PLAYER_ID, // 225
// Scene
QDSCR_SCENE,
QDSCR_SCENE_SAVE_SLOT,
QDSCR_STARTUP_SCENE,
QDSCR_SCENE_RESTART_MINIGAME,
// Location
QDSCR_LOCATION, // 230
QDSCR_GAME_TITLE,
QDSCR_TEXT_DB,
QDSCR_CD_KEY,
// For qdScreenTextFormat
QDSCR_SCREEN_TEXT_FORMAT,
QDSCR_FONT_TYPE, // 235
QDSCR_DEFAULT_FONT,
QDSCR_GLOBAL_DEPEND,
QDSCR_INVERSE_DIRECTION,
QDSCR_ALPHA,
QDSCR_ENABLE_BACKGROUND, // 240
QDSCR_FADE_TIME,
QDSCR_HALL_OF_FAME_SIZE,
QDSCR_RESOURCE_COMPRESSION,
QDSCR_SCREEN_TRANSFORM,
QDSCR_MAX_KEYWORD_ID // 245
};
const int idTagVersionAll[490] = {
20021114, QDSCR_ROOT,
// Common
20021114, QDSCR_ID,
20021114, QDSCR_X,
20021114, QDSCR_Y,
20021114, QDSCR_SX, // 5
20021114, QDSCR_SY,
20021114, QDSCR_POS2D,
20021114, QDSCR_POS3D,
20021114, QDSCR_SRC_POS,
20021114, QDSCR_DEST_POS, // 10
20021114, QDSCR_FILE,
20021114, QDSCR_START_TIME,
20021114, QDSCR_PERIOD,
20021114, QDSCR_LENGTH,
20021114, QDSCR_SPEED, // 15
20030422, QDSCR_ANIMATION_SPEED,
20021114, QDSCR_INTERPOLATION_TIME,
20021114, QDSCR_SCALE,
20021114, QDSCR_NAME,
20021114, QDSCR_FLAG, // 20
20021114, QDSCR_RND,
20021114, QDSCR_MASK_SIZE,
20021114, QDSCR_MASK_ATTRIBUTES,
20021114, QDSCR_MASK_HEIGHTS,
20021114, QDSCR_BOUND, // 25
20021114, QDSCR_TYPE,
20021114, QDSCR_SIZE,
20021114, QDSCR_STATE,
20021114, QDSCR_TEXT,
20021114, QDSCR_SHORT_TEXT, // 30
20021202, QDSCR_VALUE,
20030125, QDSCR_TIME,
20030822, QDSCR_CD,
20030918, QDSCR_ALIGN,
20070503, QDSCR_VALIGN, // 35
20030918, QDSCR_ORIENTATION,
20031007, QDSCR_COLOR,
20040601, QDSCR_COMMENT,
20021114, QDSCR_SCREEN_SIZE,
20030918, QDSCR_TEXT_SET, // 40
// Text
20040123, QDSCR_TEXT_COLOR,
20040210, QDSCR_TEXT_HOVER_COLOR,
20040123, QDSCR_TEXT_ALIGN,
// Fonts
20040308, QDSCR_FONT_INFO,
// Contours
20021114, QDSCR_CONTOUR_RECTANGLE, // 45
20021114, QDSCR_CONTOUR_CIRCLE,
20021114, QDSCR_CONTOUR_POLYGON,
// Named Object Reference
20021114, QDSCR_NAMED_OBJECT,
20030430, QDSCR_NAMED_OBJECT_TYPES,
// Grid zone
20021114, QDSCR_GRID_ZONE, // 50
20021114, QDSCR_GRID_ZONE_CELLS,
20021114, QDSCR_GRID_ZONE_HEIGHT,
20021114, QDSCR_GRID_ZONE_CONTOUR,
20021216, QDSCR_GRID_ZONE_STATE,
20040315, QDSCR_GRID_ZONE_SHADOW_COLOR, // 55
20040315, QDSCR_GRID_ZONE_SHADOW_ALPHA,
// Trigger Element
20021114, QDSCR_TRIGGER_ELEMENT,
20021114, QDSCR_TRIGGER_ELEMENT_LINK,
20030429, QDSCR_TRIGGER_ELEMENT_PARENT_LINKS,
20030429, QDSCR_TRIGGER_ELEMENT_CHILD_LINKS, // 60
20030227, QDSCR_TRIGGER_ELEMENT_LINK_AUTO_RESTART,
20030429, QDSCR_TRIGGER_ELEMENT_LINK_OFFSETS,
20021114, QDSCR_TRIGGER_ELEMENT_TITLE,
20021114, QDSCR_TRIGGER_ELEMENT_CELL_NUMBER,
20021114, QDSCR_TRIGGER_PARENT_LINK_OWNER_OFFSET, // 65
20021114, QDSCR_TRIGGER_PARENT_LINK_CHILD_OFFSET,
20021114, QDSCR_TRIGGER_CHILD_LINK_OWNER_OFFSET,
20021114, QDSCR_TRIGGER_CHILD_LINK_CHILD_OFFSET,
20021204, QDSCR_TRIGGER_START_ELEMENT,
// Trigger Chain
20021114, QDSCR_TRIGGER_CHAIN, // 70
20021114, QDSCR_TRIGGER_CHAIN_ROOT,
20021114, QDSCR_TRIGGER_CHAIN_WORK_AREA,
20021114, QDSCR_TRIGGER_CHAIN_LAYOUT,
20021114, QDSCR_TRIGGER_BOUND,
// Sound
20021114, QDSCR_SOUND, // 75
20030512, QDSCR_SOUND_VOLUME,
// Music
20021213, QDSCR_MUSIC_TRACK,
20021213, QDSCR_MUSIC_TRACK_CYCLED,
// Video
20021114, QDSCR_VIDEO,
20021114, QDSCR_VIDEO_POSITION, // 80
20021114, QDSCR_VIDEO_BACKGROUND,
// Minigame
20021114, QDSCR_MINIGAME,
20021114, QDSCR_MINIGAME_DLL_NAME,
20040601, QDSCR_MINIGAME_GAME_NAME,
20021114, QDSCR_MINIGAME_CONFIG_FILE, // 85
20021114, QDSCR_MINIGAME_STATE,
20021114, QDSCR_MINIGAME_SCORE,
20040601, QDSCR_MINIGAME_CONFIG_PARAMETER,
// Animation
20021114, QDSCR_ANIMATION_FRAME,
20021114, QDSCR_ANIMATION_INFO, // 90
20021114, QDSCR_ANIMATION_FILE,
20021114, QDSCR_ANIMATION,
// AnimationSet
20021114, QDSCR_ANIMATION_SET,
20030716, QDSCR_ANIMATION_SET_START_ANGLE,
20060414, QDSCR_ANIMATION_SET_TURN, // 95
// Coords Animation
20021114, QDSCR_COORDS_ANIMATION_POINT,
20021114, QDSCR_COORDS_ANIMATION,
20021114, QDSCR_ANIMATION_PHASE,
// Game Object
20021114, QDSCR_PARALLAX_OFFSET,
// Static Object
20021114, QDSCR_STATIC_OBJECT, // 100
// Animated Object
20021114, QDSCR_ANIMATED_OBJECT,
20021114, QDSCR_OBJECT_STATE,
20021114, QDSCR_OBJECT_MOVEMENT_STATES,
20021114, QDSCR_OBJECT_MOVEMENT_STATE,
20021114, QDSCR_OBJECT_DIRECTION, // 105
20021114, QDSCR_OBJECT_DEFAULT_POS,
20021114, QDSCR_OBJECT_DEFAULT_DIRECTION,
20021114, QDSCR_OBJECT_STATE_STATIC,
20021114, QDSCR_OBJECT_STATE_WALK,
20021114, QDSCR_OBJECT_STATE_MASK, // 110
20021114, QDSCR_OBJECT_STATE_MASK_POS,
20021114, QDSCR_OBJECT_STATE_MASK_SIZE,
20021114, QDSCR_OBJECT_STATE_MASK_DATA,
20021114, QDSCR_OBJECT_STATE_MASK_PARENT,
20021114, QDSCR_OBJECT_STATE_MASK_CONTOUR, // 115
20021114, QDSCR_OBJECT_STATE_CENTER_OFFSET,
20021114, QDSCR_OBJECT_STATE_DELAY,
20030723, QDSCR_OBJECT_STATE_SOUND_DELAY,
20040123, QDSCR_OBJECT_STATE_TEXT_DELAY,
20030131, QDSCR_OBJECT_STATE_CURSOR_ID, // 120
20030716, QDSCR_OBJECT_STATE_ACCELERATION,
20031206, QDSCR_OBJECT_STATE_RND_MOVE,
20040519, QDSCR_OBJECT_STATE_WALK_SOUND_FREQUENCY,
20030416, QDSCR_STATE_CENTER_OFFSETS,
20030416, QDSCR_STATE_STATIC_CENTER_OFFSETS, // 125
20060623, QDSCR_STATE_START_CENTER_OFFSETS,
20060623, QDSCR_STATE_STOP_CENTER_OFFSETS,
// State conditions
20021114, QDSCR_CONDITION,
20021114, QDSCR_CONDITION_DATA_INT,
20021114, QDSCR_CONDITION_DATA_FLOAT, // 130
20021114, QDSCR_CONDITION_DATA_STRING,
20030203, QDSCR_CONDITION_INVERSE,
20021114, QDSCR_CONDITIONS_MODE,
20030219, QDSCR_CONDITION_GROUP,
20030226, QDSCR_CONDITION_OBJECT, // 135
// Counter
20030530, QDSCR_COUNTER,
20030530, QDSCR_COUNTER_ELEMENT,
20030530, QDSCR_COUNTER_INC_VALUE,
20030530, QDSCR_COUNTER_LIMIT,
20060420, QDSCR_COUNTER_DIGITS, // 140
20060423, QDSCR_COUNTER_NAME,
// Object Scale
20021114, QDSCR_OBJ_SCALE_INFO,
// Mouse object
20021114, QDSCR_MOUSE_OBJECT,
20030131, QDSCR_MOUSE_DEFAULT_CURSORS,
// Moving Object
20021114, QDSCR_MOVEMENT_ANIMATION_NUMBER, // 145
20021114, QDSCR_MOVEMENT_ANIMATIONS,
20021114, QDSCR_STATIC_ANIMATIONS,
20021114, QDSCR_MOVING_OBJECT,
20030704, QDSCR_COLLISION_RADIUS,
20030704, QDSCR_COLLISION_DELAY, // 150
20030704, QDSCR_COLLISION_PATH,
20040406, QDSCR_FOLLOW_MIN_RADIUS,
20040406, QDSCR_FOLLOW_MAX_RADIUS,
20040428, QDSCR_ATTACH_SHIFT,
20030704, QDSCR_PERSONAGE_CONTROL, // 155
20030716, QDSCR_PERSONAGE_MOVEMENT_TYPE,
20041201, QDSCR_ROTATION_ANGLE_PER_QUANT,
// Inventory
20021114, QDSCR_INVENTORY_CELL_TYPE,
20021114, QDSCR_INVENTORY_CELL_SET,
20021114, QDSCR_INVENTORY_CELL_SET_SIZE, // 160
20050101, QDSCR_INVENTORY_CELL_SET_ADDITIONAL_CELLS,
20021114, QDSCR_INVENTORY_CELL_SET_POS,
20021114, QDSCR_INVENTORY,
// Camera & grid
20021114, QDSCR_CAMERA,
20021114, QDSCR_CAMERA_GRID_SIZE, // 165
20021114, QDSCR_CAMERA_GRID_HEIGHT,
20021114, QDSCR_CAMERA_GRID_ATTRIBUTES,
20021114, QDSCR_CAMERA_GRID_CENTER,
20021114, QDSCR_CAMERA_CELL_SIZE,
20021114, QDSCR_CAMERA_FOCUS, // 170
20021114, QDSCR_CAMERA_ANGLES,
20021114, QDSCR_CAMERA_SCREEN_SIZE,
20021114, QDSCR_CAMERA_SCREEN_OFFSET,
20021114, QDSCR_CAMERA_SCREEN_CENTER,
20030125, QDSCR_CAMERA_MODE, // 175
20030125, QDSCR_CAMERA_SCROLLING_SPEED,
20030125, QDSCR_CAMERA_SCROLLING_DIST,
20030530, QDSCR_CAMERA_SMOOTH_SWITCH,
20040406, QDSCR_CAMERA_SCALE_POW,
20040406, QDSCR_CAMERA_SCALE_Z_OFFSET, // 180
// Game end
20030508, QDSCR_GAME_END,
20030508, QDSCR_GAME_END_SCREEN,
// Interface
20030109, QDSCR_INTERFACE,
20040506, QDSCR_INTERFACE_SCENE_REDRAW,
20030110, QDSCR_INTERFACE_MAIN_MENU, // 185
20030317, QDSCR_INTERFACE_INGAME_SCREEN0,
20030317, QDSCR_INTERFACE_INGAME_SCREEN1,
20070329, QDSCR_INTERFACE_HIGHSCORE_NAME_SCREEN,
20060129, QDSCR_INTERFACE_SAVE_PROMPT_SCREEN,
20070329, QDSCR_INTERFACE_SAVE_NAME_SCREEN, // 190
20060129, QDSCR_INTERFACE_NEED_SAVE_SCREENSHOT,
20070329, QDSCR_INTERFACE_NEED_SHOW_SAVE_NAME,
20060129, QDSCR_INTERFACE_NEED_SHOW_SAVE_TIME,
20060129, QDSCR_INTERFACE_SAVE_FONT_TYPE,
20060129, QDSCR_INTERFACE_SAVE_FONT_COLOR, // 195
20070315, QDSCR_INTERFACE_SAVE_IS_AUTOSAVE,
20030109, QDSCR_INTERFACE_SCREEN,
20030609, QDSCR_INTERFACE_SCREEN_HIDE_TIME,
20030609, QDSCR_INTERFACE_SCREEN_HIDE_OFFSET,
20030109, QDSCR_INTERFACE_ELEMENT, // 200
20021128, QDSCR_INTERFACE_ELEMENT_STATE,
20030121, QDSCR_INTERFACE_ELEMENT_STATE_MODE,
20030109, QDSCR_INTERFACE_ELEMENT_POS,
20030414, QDSCR_INTERFACE_OPTION_ID,
20030121, QDSCR_INTERFACE_EVENT, // 205
20030121, QDSCR_INTERFACE_EVENT_DATA,
20030121, QDSCR_INTERFACE_EVENT_BEFORE_ANIMATION,
20061128, QDSCR_INTERFACE_EVENT_ACTIVATION_TYPE,
20021128, QDSCR_INTERFACE_ACTION,
20021128, QDSCR_INTERFACE_ACTION_DATA, // 210
20030116, QDSCR_INTERFACE_ANIMATION_FLAGS,
20030203, QDSCR_INTERFACE_SLIDER_RECTANGLE,
20030203, QDSCR_INTERFACE_SLIDER_ORIENTATION,
20070115, QDSCR_INTERFACE_BACKGROUND_OFFSET,
20030226, QDSCR_INTERFACE_THUMBNAIL_SIZE, // 215
20060129, QDSCR_INTERFACE_TEXT_SHIFT,
20040123, QDSCR_TEXT_WINDOW_BORDER_CORNER,
20040123, QDSCR_TEXT_WINDOW_BORDER_LINE_H,
20040123, QDSCR_TEXT_WINDOW_BORDER_LINE_V,
20040123, QDSCR_TEXT_WINDOW_BORDER_BACK, // 220
20040123, QDSCR_TEXT_WINDOW_SLIDER,
20070321, QDSCR_TEXT_WINDOW_TYPE,
20070329, QDSCR_TEXT_WINDOW_MAX_STRING_LENGTH,
20070404, QDSCR_TEXT_WINDOW_INFO_TYPE,
20070404, QDSCR_TEXT_WINDOW_PLAYER_ID, // 225
// Scene
20021114, QDSCR_SCENE,
20030613, QDSCR_SCENE_SAVE_SLOT,
20030226, QDSCR_STARTUP_SCENE,
20060630, QDSCR_SCENE_RESTART_MINIGAME,
// Location
20021114, QDSCR_LOCATION, // 230
20030919, QDSCR_GAME_TITLE,
20031014, QDSCR_TEXT_DB,
20031014, QDSCR_CD_KEY,
// For qdScreenTextFormat
20040308, QDSCR_SCREEN_TEXT_FORMAT,
20040308, QDSCR_FONT_TYPE, // 235
20040517, QDSCR_DEFAULT_FONT,
20050101, QDSCR_GLOBAL_DEPEND,
20060129, QDSCR_INVERSE_DIRECTION,
20060129, QDSCR_ALPHA,
20060129, QDSCR_ENABLE_BACKGROUND, // 240
20060129, QDSCR_FADE_TIME,
20070404, QDSCR_HALL_OF_FAME_SIZE,
20060626, QDSCR_RESOURCE_COMPRESSION,
20060715, QDSCR_SCREEN_TRANSFORM,
20021114, QDSCR_MAX_KEYWORD_ID // 245
};
void cleanup_XML_Parser();
xml::parser &qdscr_XML_Parser();
const char *qdscr_XML_string(const char *p);
const char *qdscr_XML_string(const Common::String &s);
} // namespace QDEngine
#endif // QDENGINE_PARSER_QDSCR_PARSER_H

View File

@@ -0,0 +1,36 @@
/* 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 QDENGINE_PARSER_XML_FWD_H
#define QDENGINE_PARSER_XML_FWD_H
namespace QDEngine {
// forward declarations
namespace xml {
class tag;
class tag_buffer;
class parser;
} /* namespace xml */
} // namespace QDEngine
#endif // QDENGINE_PARSER_XML_FWD_H

View File

@@ -0,0 +1,115 @@
/* 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/>.
*
*/
#include "common/file.h"
#include "common/textconsole.h"
#include "qdengine/qd_fwd.h"
#include "qdengine/parser/xml_parser.h"
namespace QDEngine {
namespace xml {
parser::parser() : _cur_level(0), _skip_mode(false), _binary_script(false) {
_root_tag.set_data(&_data_pool);
}
parser::~parser() {
}
void parser::clear() {
_root_tag.clear();
while (!_tag_stack.empty()) _tag_stack.pop();
_cur_level = 0;
_skip_mode = false;
_data_pool.clear();
Std::vector<char>(_data_pool).swap(_data_pool);
}
bool parser::parse_file(const char *fname) {
if (is_script_binary(fname))
return read_binary_script(fname);
return false;
}
bool tag::readTag(Common::SeekableReadStream *ff, tag &tg) {
uint32 id = ff->readUint32LE();
uint32 data_format = ff->readUint32LE();
uint32 data_size = ff->readUint32LE();
uint32 data_offset = ff->readUint32LE();
tg = tag(tag(id, tag::tag_data_format(data_format), data_size, data_offset));
uint32 num_subtags = ff->readUint32LE();
for (uint32 i = 0; i < num_subtags; i++) {
tag stg;
readTag(ff, stg);
tg.add_subtag(stg);
}
return true;
}
bool parser::read_binary_script(const char *fname) {
Common::File ff;
ff.open(fname);
_binary_script = true;
/* uint32 v = */ff.readUint32LE();
uint32 size = ff.readUint32LE();
if (_data_pool.size() < size)
_data_pool.resize(size);
ff.read(&*_data_pool.begin(), size);
_root_tag.clear();
_root_tag.readTag(&ff, _root_tag);
_root_tag.set_data(&_data_pool);
ff.close();
return true;
}
bool parser::is_script_binary(const char *fname) const {
Common::File ff;
ff.open(fname);
uint32 v = ff.readUint32LE();
if (v == 8383) return true;
return false;
}
} /* namespace xml */
} // namespace QDEngine

View File

@@ -0,0 +1,100 @@
/* 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 QDENGINE_PARSER_XML_PARSER_H
#define QDENGINE_PARSER_XML_PARSER_H
#include "common/system.h"
#include "common/hashmap.h"
#include "common/stack.h"
#include "qdengine/parser/xml_tag_buffer.h"
namespace QDEngine {
namespace xml {
class parser {
public:
typedef Common::HashMap<Common::String, tag> tag_format_t;
typedef Common::Stack<tag *> tag_stack_t;
parser();
virtual ~parser();
bool parse_file(const char *fname);
bool read_binary_script(const char *fname);
bool is_script_binary(const char *fname) const;
bool is_script_binary() const {
return _binary_script;
}
const tag &root_tag() const {
return _root_tag;
}
void clear();
void resize_data_pool(uint32 pool_sz) {
_data_pool.resize(pool_sz);
}
bool register_tag_format(const char *tag_name, const tag &tg) {
tag_format_t::iterator it = _tag_format.find(tag_name);
if (it != _tag_format.end())
return false;
_tag_format[tag_name] = tg;
return true;
}
const tag *get_tag_format(const char *tag_name) const {
tag_format_t::const_iterator it = _tag_format.find(tag_name);
if (it != _tag_format.end())
return &it->_value;
return NULL;
}
int num_tag_formats() const {
return _tag_format.size();
}
private:
tag _root_tag;
Std::vector<char> _data_pool;
Common::String _data_buffer;
bool _binary_script;
tag_stack_t _tag_stack;
tag_format_t _tag_format;
int _cur_level;
bool _skip_mode;
};
} /* namespace xml */
} // namespace QDEngine
#endif // QDENGINE_PARSER_XML_PARSER_H

View File

@@ -0,0 +1,200 @@
/* 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 QDENGINE_PARSER_XML_TAG_H
#define QDENGINE_PARSER_XML_TAG_H
#include "qdengine/qdengine.h"
namespace QDEngine {
//! Парсер XML на базе expat.
namespace xml {
//! XML тег.
class tag {
public:
typedef Std::list<tag> subtags_t;
typedef subtags_t::const_iterator subtag_iterator;
//! Формат данных тега.
enum tag_data_format {
//! данные отсутствуют
TAG_DATA_VOID,
//! данные типа int16 int
TAG_DATA_SHORT,
//! данные типа uint16 int
TAG_DATA_UNSIGNED_SHORT,
//! данные типа int
TAG_DATA_INT,
//! данные типа uint32
TAG_DATA_UNSIGNED_INT,
//! данные типа float
TAG_DATA_FLOAT,
//! строковые данные
TAG_DATA_STRING
};
tag(int id = 0, tag_data_format data_fmt = TAG_DATA_VOID, int data_sz = 0, int data_offs = 0) : _ID(id), _data_format(data_fmt), _data_size(data_sz), _data_offset(data_offs), _data(NULL) { }
tag(const tag &tg) : _ID(tg._ID), _data_format(tg._data_format), _data_size(tg._data_size), _data_offset(tg._data_offset), _data(tg._data), _subtags(tg._subtags) { }
~tag() { }
bool readTag(Common::SeekableReadStream *ff, tag &tg);
tag &operator = (const tag &tg) {
if (this == &tg) return *this;
_ID = tg._ID;
_data_format = tg._data_format;
_data_size = tg._data_size;
_data_offset = tg._data_offset;
_subtags = tg._subtags;
return *this;
}
//! Возвращает идентификатор тега.
int ID() const {
return g_engine->_tagMap[_ID - 1];
}
int origID() const {
return _ID;
}
//! Возвращает формат данных тега.
tag_data_format data_format() const {
return _data_format;
}
//! Возвращает количество элеметов данных тега.
/**
Чтобы получить размер данных в байтах, надо это число
умножить на размер элемента данных в байтах - data_elemet_size().
*/
int data_size() const {
return _data_size;
}
//! Возвращает размер элемента данных тега в байтах.
int data_element_size() const {
switch (_data_format) {
case TAG_DATA_VOID:
return 0;
case TAG_DATA_SHORT:
case TAG_DATA_UNSIGNED_SHORT:
return sizeof(uint16);
case TAG_DATA_INT:
return sizeof(int32);
case TAG_DATA_UNSIGNED_INT:
return sizeof(uint32);
case TAG_DATA_FLOAT:
return sizeof(float);
case TAG_DATA_STRING:
return sizeof(byte);
}
return 0;
}
//! Устанавливает количество элементов данных тега.
void set_data_size(int sz) {
_data_size = sz;
}
//! Возвращает смещение до данных тега в данных парсера.
int data_offset() const {
return _data_offset;
}
//! Устанавливает смещение до данных тега в данных парсера.
void set_data_offset(int off) {
_data_offset = off;
}
//! Возвращает указатель на данные тега.
const char *data() const {
return &*(_data->begin() + _data_offset);
}
//! Устанавливает указатель на общие данные.
void set_data(const Std::vector<char> *p) {
_data = p;
for (subtags_t::iterator it = _subtags.begin(); it != _subtags.end(); ++it)
it->set_data(p);
}
//! Очистка вложенных тегов.
void clear() {
_subtags.clear();
}
//! Добавляет вложенный тег.
/**
Возвращает ссылку на последний вложенный тег.
*/
tag &add_subtag(const tag &tg) {
_subtags.push_back(tg);
return _subtags.back();
}
//! Возвращает true, если список вложенных тегов не пустой .
bool has_subtags() const {
return !_subtags.empty();
}
//! Возвращает количество вложенных тэгов.
int num_subtags() const {
return _subtags.size();
}
//! Возвращает итератор начала списка вложенных тегов.
subtag_iterator subtags_begin() const {
return _subtags.begin();
}
//! Возвращает итератор конца списка вложенных тегов.
subtag_iterator subtags_end() const {
return _subtags.end();
}
//! Поиск вложенного тега по его идентификатору.
const tag *search_subtag(int subtag_id) const {
for (subtag_iterator it = subtags_begin(); it != subtags_end(); ++it)
if (it->ID() == subtag_id) return &*it;
return NULL;
}
private:
//! Идентификатор (тип) тега.
int _ID;
//! Формат данных тега.
tag_data_format _data_format;
//! Количество элементов данных тега.
int _data_size;
//! Смещение до данных тега в общих данных.
int _data_offset;
//! Указатель на данные.
const Std::vector<char> *_data;
//! Список вложенных тегов.
subtags_t _subtags;
};
} /* namespace xml */
} // namespace QDEngine
#endif // QDENGINE_PARSER_XML_TAG_H

View File

@@ -0,0 +1,112 @@
/* 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/>.
*
*/
#include "qdengine/qd_fwd.h"
#include "qdengine/parser/xml_tag_buffer.h"
namespace QDEngine {
namespace xml {
tag_buffer::tag_buffer(const tag &tg) : _data_size(tg.data_size() * tg.data_element_size()),
_data_offset(0),
#ifdef _DEBUG
data_format_(tg.data_format()),
#endif
_data(tg.data()) {
}
tag_buffer::tag_buffer(const char *dp, int len) : _data_size(len),
_data_offset(0),
#ifdef _DEBUG
data_format_(tag::TAG_DATA_VOID),
#endif
_data(dp) {
}
tag_buffer::tag_buffer(const tag_buffer &tb) : _data_size(tb._data_size),
_data_offset(tb._data_offset),
#ifdef _DEBUG
data_format_(tb.data_format_),
#endif
_data(tb._data) {
}
tag_buffer &tag_buffer::operator = (const tag_buffer &tb) {
if (this == &tb) return *this;
_data_size = tb._data_size;
_data_offset = tb._data_offset;
#ifdef _DEBUG
data_format_ = tb.data_format_;
#endif
_data = tb._data;
return *this;
}
tag_buffer::~tag_buffer() {
}
tag_buffer &tag_buffer::operator >= (int16 &var) {
char *p;
var = (short)strtol(_data + _data_offset, &p, 0);
_data_offset += p - (_data + _data_offset);
return *this;
}
tag_buffer &tag_buffer::operator >= (uint16 &var) {
char *p;
var = (uint16)strtoul(_data + _data_offset, &p, 0);
_data_offset += p - (_data + _data_offset);
return *this;
}
tag_buffer &tag_buffer::operator >= (int &var) {
char *p;
var = (int)strtol(_data + _data_offset, &p, 0);
_data_offset += p - (_data + _data_offset);
return *this;
}
tag_buffer &tag_buffer::operator >= (uint32 &var) {
char *p;
var = (uint32)strtoul(_data + _data_offset, &p, 0);
_data_offset += p - (_data + _data_offset);
return *this;
}
tag_buffer &tag_buffer::operator >= (float &var) {
char *p;
var = (float)strtod(_data + _data_offset, &p);
_data_offset += p - (_data + _data_offset);
return *this;
}
} /* namespace xml */
} // namespace QDEngine

View File

@@ -0,0 +1,142 @@
/* 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 QDENGINE_PARSER_XML_TAG_BUFFER_H
#define QDENGINE_PARSER_XML_TAG_BUFFER_H
#include "common/endian.h"
#include "qdengine/parser/xml_tag.h"
#ifdef _DEBUG
#define XML_ASSERT(a) assert(a)
#else
#define XML_ASSERT(a)
#endif
namespace QDEngine {
namespace xml {
class tag_buffer {
public:
tag_buffer(const tag &tg);
tag_buffer(const char *dp, int len);
tag_buffer(const tag_buffer &tb);
~tag_buffer();
tag_buffer &operator = (const tag_buffer &tb);
tag_buffer &operator >= (int16 &var);
tag_buffer &operator >= (uint16 &var);
tag_buffer &operator >= (int &var);
tag_buffer &operator >= (uint32 &var);
tag_buffer &operator >= (float &var);
tag_buffer &operator > (int16 &var) {
XML_ASSERT(data_format_ == tag::TAG_DATA_VOID || data_format_ == tag::TAG_DATA_SHORT);
var = (int16)READ_LE_UINT16(_data + _data_offset);
_data_offset += sizeof(int16);
return *this;
}
tag_buffer &operator > (uint16 &var) {
XML_ASSERT(data_format_ == tag::TAG_DATA_VOID || data_format_ == tag::TAG_DATA_UNSIGNED_SHORT);
var = READ_LE_UINT16(_data + _data_offset);
_data_offset += sizeof(uint16);
return *this;
}
tag_buffer &operator > (int &var) {
XML_ASSERT(data_format_ == tag::TAG_DATA_VOID || data_format_ == tag::TAG_DATA_INT);
var = (int32)READ_LE_UINT32(_data + _data_offset);
_data_offset += sizeof(int32);
return *this;
}
tag_buffer &operator > (uint32 &var) {
XML_ASSERT(data_format_ == tag::TAG_DATA_VOID || data_format_ == tag::TAG_DATA_UNSIGNED_INT);
var = READ_LE_UINT32(_data + _data_offset);
_data_offset += sizeof(uint32);
return *this;
}
tag_buffer &operator > (float &var) {
XML_ASSERT(data_format_ == tag::TAG_DATA_VOID || data_format_ == tag::TAG_DATA_FLOAT);
var = READ_LE_FLOAT32(_data + _data_offset);
_data_offset += 4;
return *this;
}
int16 get_short() {
XML_ASSERT(data_format_ == tag::TAG_DATA_VOID || data_format_ == tag::TAG_DATA_SHORT);
int16 v;
*this > v;
return v;
}
uint16 get_ushort() {
XML_ASSERT(data_format_ == tag::TAG_DATA_VOID || data_format_ == tag::TAG_DATA_UNSIGNED_SHORT);
uint16 v;
*this > v;
return v;
}
int get_int() {
XML_ASSERT(data_format_ == tag::TAG_DATA_VOID || data_format_ == tag::TAG_DATA_INT);
int v;
*this > v;
return v;
}
uint32 get_uint() {
XML_ASSERT(data_format_ == tag::TAG_DATA_VOID || data_format_ == tag::TAG_DATA_UNSIGNED_INT);
uint32 v;
*this > v;
return v;
}
float get_float() {
XML_ASSERT(data_format_ == tag::TAG_DATA_VOID || data_format_ == tag::TAG_DATA_FLOAT);
float v;
*this > v;
return v;
}
bool end_of_storage() const {
return _data_size > _data_offset;
}
void reset() {
_data_offset = 0;
}
private:
int _data_size;
int _data_offset;
#ifdef _DEBUG
tag::tag_data_format data_format_;
#endif
const char *_data;
};
} /* namespace xml */
} // namespace QDEngine
#endif // QDENGINE_PARSER_XML_TAG_BUFFER_H