mirror of
https://github.com/libretro/scummvm.git
synced 2024-12-13 04:28:37 +00:00
771 lines
14 KiB
C++
771 lines
14 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 HYPNO_GRAMMAR_H
|
|
#define HYPNO_GRAMMAR_H
|
|
|
|
#include "common/array.h"
|
|
#include "common/hash-ptr.h"
|
|
#include "common/hash-str.h"
|
|
#include "common/list.h"
|
|
#include "common/queue.h"
|
|
#include "common/rect.h"
|
|
#include "common/str.h"
|
|
|
|
#include "video/smk_decoder.h"
|
|
|
|
namespace Hypno {
|
|
|
|
typedef Common::String Filename;
|
|
typedef Common::List<Filename> Filenames;
|
|
|
|
class HypnoSmackerDecoder : public Video::SmackerDecoder {
|
|
public:
|
|
bool loadStream(Common::SeekableReadStream *stream) override;
|
|
|
|
protected:
|
|
uint32 getSignatureVersion(uint32 signature) const override;
|
|
};
|
|
|
|
class MVideo {
|
|
public:
|
|
MVideo(Filename, Common::Point, bool, bool, bool);
|
|
Filename path;
|
|
Common::Point position;
|
|
bool scaled;
|
|
bool transparent;
|
|
bool loop;
|
|
HypnoSmackerDecoder *decoder;
|
|
};
|
|
|
|
typedef Common::Array<MVideo> Videos;
|
|
|
|
enum HotspotType {
|
|
MakeMenu,
|
|
MakeHotspot
|
|
};
|
|
|
|
enum ActionType {
|
|
MiceAction,
|
|
TimerAction,
|
|
PaletteAction,
|
|
BackgroundAction,
|
|
HighlightAction,
|
|
OverlayAction,
|
|
EscapeAction,
|
|
SaveAction,
|
|
LoadAction,
|
|
LoadCheckpointAction,
|
|
QuitAction,
|
|
CutsceneAction,
|
|
PlayAction,
|
|
IntroAction,
|
|
AmbientAction,
|
|
WalNAction,
|
|
GlobalAction,
|
|
TalkAction,
|
|
SwapPointerAction,
|
|
SoundAction,
|
|
ChangeLevelAction
|
|
};
|
|
|
|
class Action {
|
|
public:
|
|
virtual ~Action() {} // needed to make Action polymorphic
|
|
ActionType type;
|
|
};
|
|
|
|
typedef Common::Array<Action *> Actions;
|
|
|
|
class Hotspot;
|
|
|
|
typedef Common::Array<Hotspot> Hotspots;
|
|
typedef Common::Array<Hotspots *> HotspotsStack;
|
|
typedef Common::Array<Graphics::Surface *> Frames;
|
|
|
|
class Hotspot {
|
|
public:
|
|
Hotspot(HotspotType type_, Common::Rect rect_ = Common::Rect(0, 0, 0, 0)) {
|
|
type = type_;
|
|
rect = rect_;
|
|
smenu = nullptr;
|
|
}
|
|
HotspotType type;
|
|
Common::String flags[3];
|
|
Common::Rect rect;
|
|
Common::String setting;
|
|
Filename background;
|
|
Frames backgroundFrames;
|
|
Actions actions;
|
|
Hotspots *smenu;
|
|
};
|
|
|
|
class Mice : public Action {
|
|
public:
|
|
Mice(Filename path_, uint32 index_) {
|
|
type = MiceAction;
|
|
path = path_;
|
|
index = index_;
|
|
}
|
|
Filename path;
|
|
uint32 index;
|
|
};
|
|
|
|
class SwapPointer : public Action {
|
|
public:
|
|
SwapPointer(uint32 index_) {
|
|
type = SwapPointerAction;
|
|
index = index_;
|
|
}
|
|
uint32 index;
|
|
};
|
|
|
|
class Timer : public Action {
|
|
public:
|
|
Timer(uint32 delay_, Common::String flag_) {
|
|
type = TimerAction;
|
|
delay = delay_;
|
|
flag = flag_;
|
|
}
|
|
uint32 delay;
|
|
Common::String flag;
|
|
};
|
|
|
|
class Palette : public Action {
|
|
public:
|
|
Palette(Filename path_) {
|
|
type = PaletteAction;
|
|
path = path_;
|
|
}
|
|
Filename path;
|
|
};
|
|
|
|
class Highlight : public Action {
|
|
public:
|
|
Highlight(Common::String condition_) {
|
|
type = HighlightAction;
|
|
condition = condition_;
|
|
}
|
|
Common::String condition;
|
|
};
|
|
|
|
class Background : public Action {
|
|
public:
|
|
Background(Filename path_, Common::Point origin_, Common::String condition_, Common::String flag1_, Common::String flag2_) {
|
|
type = BackgroundAction;
|
|
path = path_;
|
|
origin = origin_;
|
|
condition = condition_;
|
|
flag1 = flag1_;
|
|
flag2 = flag2_;
|
|
}
|
|
Filename path;
|
|
Common::Point origin;
|
|
Common::String condition;
|
|
Common::String flag1;
|
|
Common::String flag2;
|
|
};
|
|
|
|
class Overlay : public Action {
|
|
public:
|
|
Overlay(Filename path_, Common::Point origin_, Common::String flag_) {
|
|
type = OverlayAction;
|
|
path = path_;
|
|
origin = origin_;
|
|
flag = flag_;
|
|
}
|
|
Filename path;
|
|
Common::Point origin;
|
|
Common::String flag;
|
|
};
|
|
|
|
class Escape : public Action {
|
|
public:
|
|
Escape() {
|
|
type = EscapeAction;
|
|
}
|
|
};
|
|
|
|
class Save : public Action {
|
|
public:
|
|
Save() {
|
|
type = SaveAction;
|
|
}
|
|
};
|
|
|
|
class Load : public Action {
|
|
public:
|
|
Load() {
|
|
type = LoadAction;
|
|
}
|
|
};
|
|
|
|
class LoadCheckpoint : public Action {
|
|
public:
|
|
LoadCheckpoint() {
|
|
type = LoadCheckpointAction;
|
|
}
|
|
};
|
|
|
|
class Quit : public Action {
|
|
public:
|
|
Quit() {
|
|
type = QuitAction;
|
|
}
|
|
};
|
|
|
|
class Cutscene : public Action {
|
|
public:
|
|
Cutscene(Filename path_) {
|
|
type = CutsceneAction;
|
|
path = path_;
|
|
}
|
|
Filename path;
|
|
};
|
|
|
|
class Sound : public Action {
|
|
public:
|
|
Sound(Filename path_) {
|
|
type = SoundAction;
|
|
path = path_;
|
|
}
|
|
Filename path;
|
|
};
|
|
|
|
class Intro : public Action {
|
|
public:
|
|
Intro(Filename path_) {
|
|
type = IntroAction;
|
|
path = path_;
|
|
}
|
|
Filename path;
|
|
};
|
|
|
|
class Play : public Action {
|
|
public:
|
|
Play(Filename path_, Common::Point origin_, Common::String condition_, Common::String flag_) {
|
|
type = PlayAction;
|
|
path = path_;
|
|
origin = origin_;
|
|
condition = condition_;
|
|
flag = flag_;
|
|
}
|
|
Filename path;
|
|
Common::Point origin;
|
|
Common::String condition;
|
|
Common::String flag;
|
|
};
|
|
|
|
class Ambient : public Action {
|
|
public:
|
|
Ambient(Filename path_, Common::Point origin_, Common::String flag_) {
|
|
type = AmbientAction;
|
|
path = path_;
|
|
origin = origin_;
|
|
flag = flag_;
|
|
fullscreen = false;
|
|
frameNumber = 0;
|
|
}
|
|
Filename path;
|
|
Common::Point origin;
|
|
Common::String flag;
|
|
uint32 frameNumber;
|
|
bool fullscreen;
|
|
};
|
|
|
|
class WalN : public Action {
|
|
public:
|
|
WalN(Common::String wn_, Filename path_, Common::Point origin_, Common::String condition_, Common::String flag_) {
|
|
wn = wn_;
|
|
type = WalNAction;
|
|
path = path_;
|
|
origin = origin_;
|
|
condition = condition_;
|
|
flag = flag_;
|
|
}
|
|
Common::String wn;
|
|
Filename path;
|
|
Common::Point origin;
|
|
Common::String condition;
|
|
Common::String flag;
|
|
};
|
|
|
|
class Global : public Action {
|
|
public:
|
|
Global(Common::String variable_, Common::String command_) {
|
|
type = GlobalAction;
|
|
variable = variable_;
|
|
command = command_;
|
|
}
|
|
Common::String variable;
|
|
Common::String command;
|
|
};
|
|
|
|
class TalkCommand {
|
|
public:
|
|
Common::String command;
|
|
Common::String variable;
|
|
Filename path;
|
|
uint32 num;
|
|
Common::Point position;
|
|
};
|
|
|
|
typedef Common::Array<TalkCommand> TalkCommands;
|
|
|
|
class Talk : public Action {
|
|
public:
|
|
Talk() {
|
|
type = TalkAction;
|
|
boxPos = Common::Point(0, 0);
|
|
escape = false;
|
|
active = true;
|
|
}
|
|
|
|
Talk(Talk *t) {
|
|
*this = *t;
|
|
}
|
|
|
|
TalkCommands commands;
|
|
bool active;
|
|
bool escape;
|
|
Common::Point introPos;
|
|
Filename intro;
|
|
Common::Point boxPos;
|
|
Filename background;
|
|
Common::Point backgroundPos;
|
|
Common::Rect rect;
|
|
Filename second;
|
|
Common::Point secondPos;
|
|
};
|
|
|
|
class ChangeLevel : public Action {
|
|
public:
|
|
ChangeLevel(Filename level_) {
|
|
type = ChangeLevelAction;
|
|
level = level_;
|
|
}
|
|
Filename level;
|
|
};
|
|
|
|
enum LevelType {
|
|
TransitionLevel,
|
|
SceneLevel,
|
|
ArcadeLevel,
|
|
CodeLevel
|
|
};
|
|
|
|
class Level {
|
|
public:
|
|
Level() {
|
|
type = CodeLevel;
|
|
musicRate = 22050;
|
|
playMusicDuringIntro = false;
|
|
musicStereo = false;
|
|
}
|
|
virtual ~Level() {} // needed to make Level polymorphic
|
|
LevelType type;
|
|
Filenames intros;
|
|
Filename prefix;
|
|
Filename levelIfWin;
|
|
Filename levelIfLose;
|
|
bool playMusicDuringIntro;
|
|
Filename music;
|
|
uint32 musicRate;
|
|
bool musicStereo;
|
|
};
|
|
|
|
class Scene : public Level {
|
|
public:
|
|
Scene() {
|
|
type = SceneLevel;
|
|
resolution = "640x480";
|
|
}
|
|
Common::String resolution;
|
|
Hotspots hots;
|
|
};
|
|
|
|
class FrameInfo {
|
|
public:
|
|
FrameInfo(uint32 start_, uint32 length_) {
|
|
start = start_;
|
|
length = length_;
|
|
}
|
|
|
|
uint32 lastFrame() {
|
|
return start + length;
|
|
}
|
|
uint32 start;
|
|
uint32 length;
|
|
};
|
|
|
|
enum ScriptMode {
|
|
Interactive = 1,
|
|
NonInteractive,
|
|
};
|
|
|
|
class ScriptInfo {
|
|
public:
|
|
ScriptInfo(uint32 time_, uint32 mode_, uint32 actor_, uint32 cursor_) {
|
|
time = time_;
|
|
mode = ScriptMode(mode_);
|
|
actor = actor_;
|
|
cursor = cursor_;
|
|
}
|
|
uint32 time;
|
|
ScriptMode mode;
|
|
uint32 actor;
|
|
uint32 cursor;
|
|
};
|
|
|
|
typedef Common::List<ScriptInfo> Script;
|
|
|
|
class Shoot {
|
|
public:
|
|
Shoot() {
|
|
destroyed = false;
|
|
video = nullptr;
|
|
timesToShoot = 1;
|
|
pointsToShoot = 0;
|
|
attackWeight = 0;
|
|
paletteOffset = 0;
|
|
paletteSize = 0;
|
|
missedAnimation = 0;
|
|
objKillsCount = 0;
|
|
objMissesCount = 0;
|
|
animation = "NONE";
|
|
explosionAnimation = "";
|
|
startFrame = 0;
|
|
lastFrame = 1024;
|
|
interactionFrame = 0;
|
|
noEnemySound = false;
|
|
enemySoundRate = 22050;
|
|
isAnimal = false;
|
|
nonHostile = false;
|
|
playInteractionAudio = false;
|
|
animalSound = "";
|
|
jumpToTimeAfterKilled = 0;
|
|
warningVideoIdx = 0;
|
|
waitForClickAfterInteraction = 0;
|
|
direction = 0;
|
|
}
|
|
Common::String name;
|
|
Filename animation;
|
|
Filename startSound;
|
|
Common::Point position;
|
|
Common::Point deathPosition;
|
|
|
|
|
|
uint32 timesToShoot;
|
|
uint32 pointsToShoot;
|
|
uint32 attackWeight;
|
|
|
|
// Objectives
|
|
uint32 objKillsCount;
|
|
uint32 objMissesCount;
|
|
|
|
// Palette
|
|
uint32 paletteOffset;
|
|
uint32 paletteSize;
|
|
|
|
// Missed animation
|
|
uint32 missedAnimation;
|
|
|
|
// Sounds
|
|
Filename enemySound;
|
|
uint32 enemySoundRate;
|
|
Filename deathSound;
|
|
Filename hitSound;
|
|
Filename animalSound;
|
|
|
|
MVideo *video;
|
|
Common::List<uint32> attackFrames;
|
|
Common::Array<FrameInfo> bodyFrames;
|
|
Common::Array<FrameInfo> explosionFrames;
|
|
uint32 startFrame;
|
|
uint32 lastFrame;
|
|
uint32 interactionFrame;
|
|
Filename explosionAnimation;
|
|
Filename additionalVideo;
|
|
bool playInteractionAudio;
|
|
bool destroyed;
|
|
bool noEnemySound;
|
|
|
|
// Soldier Boyz specific
|
|
bool nonHostile;
|
|
bool isAnimal;
|
|
Common::String checkIfDestroyed;
|
|
int jumpToTimeAfterKilled;
|
|
char direction;
|
|
uint32 waitForClickAfterInteraction;
|
|
uint32 warningVideoIdx;
|
|
};
|
|
|
|
typedef Common::Array<Shoot> Shoots;
|
|
|
|
class ShootInfo {
|
|
public:
|
|
Common::String name;
|
|
uint32 timestamp;
|
|
};
|
|
|
|
typedef Common::List<ShootInfo> ShootSequence;
|
|
|
|
class SegmentShoots {
|
|
public:
|
|
SegmentShoots() {
|
|
segmentRepetition = 0;
|
|
}
|
|
ShootSequence shootSequence;
|
|
uint32 segmentRepetition;
|
|
};
|
|
|
|
typedef Common::Array<SegmentShoots> SegmentShootsSequence;
|
|
typedef Common::Array<Common::String> Sounds;
|
|
|
|
enum SegmentType {
|
|
Straight,
|
|
Select3,
|
|
TurnLeft3,
|
|
Straight3,
|
|
TurnRight3,
|
|
Select2,
|
|
TurnLeft2,
|
|
TurnRight2,
|
|
};
|
|
|
|
class Segment {
|
|
public:
|
|
Segment(byte type_, uint32 start_, uint32 size_) {
|
|
type = type_;
|
|
start = start_;
|
|
size = size_;
|
|
end = false;
|
|
}
|
|
|
|
byte type;
|
|
uint32 start;
|
|
uint32 size;
|
|
bool end;
|
|
};
|
|
|
|
typedef Common::Array<Segment> Segments;
|
|
|
|
class ArcadeTransition {
|
|
public:
|
|
ArcadeTransition(Filename video_, Filename palette_, Filename sound_, uint32 soundRate_, uint32 time_) {
|
|
video = video_;
|
|
palette = palette_;
|
|
sound = sound_;
|
|
soundRate = soundRate_;
|
|
soundStereo = false;
|
|
loseLevel = false;
|
|
winLevel = false;
|
|
selection = false;
|
|
jumpToTime = 0;
|
|
time = time_;
|
|
}
|
|
|
|
Filename video;
|
|
Filename palette;
|
|
Filename sound;
|
|
uint32 soundRate;
|
|
bool soundStereo;
|
|
bool loseLevel;
|
|
bool winLevel;
|
|
bool selection;
|
|
uint32 jumpToTime;
|
|
uint32 time;
|
|
};
|
|
|
|
typedef Common::List<ArcadeTransition> ArcadeTransitions;
|
|
|
|
class ArcadeShooting : public Level {
|
|
public:
|
|
ArcadeShooting() {
|
|
type = ArcadeLevel;
|
|
health = 100;
|
|
id = 0;
|
|
objKillsRequired[0] = 0;
|
|
objKillsRequired[1] = 0;
|
|
objMissesAllowed[0] = 0;
|
|
objMissesAllowed[1] = 0;
|
|
mouseBox = Common::Rect(0, 0, 320, 200);
|
|
frameDelay = 0;
|
|
targetSoundRate = 0; // TODO: unused
|
|
shootSoundRate = 0;
|
|
enemySoundRate = 0;
|
|
hitSoundRate = 0;
|
|
additionalSoundRate = 0;
|
|
noAmmoSoundRate = 0;
|
|
}
|
|
void clear() {
|
|
nextLevelVideo.clear();
|
|
postStatsVideo.clear();
|
|
backgroundVideo.clear();
|
|
transitions.clear();
|
|
maskVideo.clear();
|
|
player.clear();
|
|
shoots.clear();
|
|
intros.clear();
|
|
defeatNoEnergyFirstVideo.clear();
|
|
defeatMissBossVideo.clear();
|
|
defeatNoEnergySecondVideo.clear();
|
|
missBoss1Video.clear();
|
|
missBoss2Video.clear();
|
|
hitBoss1Video.clear();
|
|
hitBoss2Video.clear();
|
|
beforeVideo.clear();
|
|
briefingVideo.clear();
|
|
additionalVideo.clear();
|
|
additionalSound.clear();
|
|
noAmmoSound.clear();
|
|
segments.clear();
|
|
script.clear();
|
|
objKillsRequired[0] = 0;
|
|
objKillsRequired[1] = 0;
|
|
objMissesAllowed[0] = 0;
|
|
objMissesAllowed[1] = 0;
|
|
mouseBox = Common::Rect(0, 0, 320, 200);
|
|
anchor = Common::Point(0, 0);
|
|
targetSoundRate = 0;
|
|
shootSoundRate = 0;
|
|
enemySoundRate = 0;
|
|
hitSoundRate = 0;
|
|
noAmmoSoundRate = 0;
|
|
}
|
|
|
|
uint32 id;
|
|
uint32 frameDelay;
|
|
Common::String mode;
|
|
Common::Rect mouseBox;
|
|
Common::Point anchor;
|
|
ArcadeTransitions transitions;
|
|
Segments segments;
|
|
|
|
// Objectives
|
|
uint32 objKillsRequired [2];
|
|
uint32 objMissesAllowed [2];
|
|
|
|
// Script
|
|
Script script;
|
|
|
|
// Videos
|
|
Filename nextLevelVideo;
|
|
Filename postStatsVideo;
|
|
Filename defeatNoEnergyFirstVideo;
|
|
Filename defeatNoEnergySecondVideo;
|
|
Filename defeatMissBossVideo;
|
|
Filename hitBoss1Video;
|
|
Filename missBoss1Video;
|
|
Filename hitBoss2Video;
|
|
Filename missBoss2Video;
|
|
Filename beforeVideo;
|
|
Filename additionalVideo;
|
|
Filename briefingVideo;
|
|
|
|
Filename backgroundVideo;
|
|
Filename backgroundPalette;
|
|
Filename maskVideo;
|
|
Filename player;
|
|
int health;
|
|
Shoots shoots;
|
|
SegmentShootsSequence shootSequence;
|
|
|
|
// Sounds
|
|
Filename targetSound;
|
|
uint32 targetSoundRate;
|
|
Filename shootSound;
|
|
uint32 shootSoundRate;
|
|
Filename enemySound;
|
|
uint32 enemySoundRate;
|
|
Filename hitSound;
|
|
uint32 hitSoundRate;
|
|
Filename additionalSound;
|
|
uint32 additionalSoundRate;
|
|
Filename noAmmoSound;
|
|
uint32 noAmmoSoundRate;
|
|
};
|
|
|
|
class Transition : public Level {
|
|
public:
|
|
Transition(Common::String level) {
|
|
type = TransitionLevel;
|
|
nextLevel = level;
|
|
levelEasy = "";
|
|
levelHard = "";
|
|
frameNumber = 0;
|
|
frameImage = "";
|
|
}
|
|
|
|
Transition(Common::String easy, Common::String hard) {
|
|
type = TransitionLevel;
|
|
levelEasy = easy;
|
|
levelHard = hard;
|
|
frameNumber = 0;
|
|
frameImage = "";
|
|
}
|
|
Common::String nextLevel;
|
|
Common::String levelEasy;
|
|
Common::String levelHard;
|
|
Filename frameImage;
|
|
uint32 frameNumber;
|
|
};
|
|
|
|
class Code : public Level {
|
|
public:
|
|
Code(Common::String name_) {
|
|
type = CodeLevel;
|
|
name = name_;
|
|
}
|
|
Common::String name;
|
|
};
|
|
|
|
typedef Common::HashMap<Filename, Level*> Levels;
|
|
extern Hotspots *g_parsedHots;
|
|
extern ArcadeShooting *g_parsedArc;
|
|
|
|
class ArcadeStats {
|
|
public:
|
|
ArcadeStats() {
|
|
livesUsed = 0;
|
|
shootsFired = 0;
|
|
enemyHits = 0;
|
|
enemyTargets = 0;
|
|
targetsDestroyed = 0;
|
|
targetsMissed = 0;
|
|
friendliesEncountered = 0;
|
|
infoReceived = 0;
|
|
}
|
|
uint32 livesUsed;
|
|
uint32 shootsFired;
|
|
uint32 enemyHits;
|
|
uint32 enemyTargets;
|
|
uint32 targetsDestroyed;
|
|
uint32 targetsMissed;
|
|
uint32 friendliesEncountered;
|
|
uint32 infoReceived;
|
|
};
|
|
|
|
} // End of namespace Hypno
|
|
|
|
#endif
|
|
|