hiraku-engine 0.1.0

Hiraku visual-novel engine
use prost::Message;

#[derive(Clone, PartialEq, Message)]
pub struct SaveGameData {
    #[prost(uint32, tag = "1")]
    pub version: u32,
    #[prost(string, tag = "2")]
    pub resume_script: String,
    #[prost(uint64, tag = "3")]
    pub random_seed: u64,
    #[prost(int64, tag = "4")]
    pub time_seed: i64,
    #[prost(message, optional, tag = "5")]
    pub checkpoint: Option<SaveCheckpoint>,
    #[prost(string, repeated, tag = "6")]
    pub script_stack: Vec<String>,
    #[prost(message, repeated, tag = "7")]
    pub globals: Vec<StoredEntry>,
    #[prost(message, repeated, tag = "8")]
    pub scope: Vec<StoredEntry>,
    #[prost(message, repeated, tag = "9")]
    pub input_log: Vec<SavedInput>,
    #[prost(message, optional, tag = "10")]
    pub scene: Option<SceneSnapshot>,
    #[prost(message, optional, tag = "11")]
    pub rng_state: Option<RngState>,
    #[prost(bytes = "vec", tag = "12")]
    pub vm_snapshot_hson: Vec<u8>,
    #[prost(string, optional, tag = "14")]
    pub pending_ui_screen: Option<String>,
    #[prost(bytes = "vec", tag = "15")]
    pub script_call_stack_hson: Vec<u8>,
    #[prost(bytes = "vec", tag = "16")]
    pub ui_registry_hson: Vec<u8>,
    #[prost(bytes = "vec", tag = "17")]
    pub mounted_ui_overlays_hson: Vec<u8>,
    #[prost(bytes = "vec", tag = "18")]
    pub pending_ui_arguments_hson: Vec<u8>,
}

#[derive(Clone, PartialEq, Message)]
pub struct RngState {
    #[prost(uint64, tag = "1")]
    pub state: u64,
    #[prost(uint64, tag = "2")]
    pub stream: u64,
}

#[derive(Clone, PartialEq, Message)]
pub struct SaveCheckpoint {
    #[prost(string, tag = "1")]
    pub script: String,
    #[prost(uint64, tag = "2")]
    pub ordinal: u64,
    #[prost(string, tag = "3")]
    pub kind: String,
    #[prost(string, optional, tag = "4")]
    pub label: Option<String>,
    #[prost(message, optional, tag = "5")]
    pub position: Option<ScriptPosition>,
}

#[derive(Clone, PartialEq, Message)]
pub struct ScriptPosition {
    #[prost(uint64, optional, tag = "1")]
    pub line: Option<u64>,
    #[prost(uint64, optional, tag = "2")]
    pub column: Option<u64>,
}

#[derive(Clone, PartialEq, Message)]
pub struct SavedInput {
    #[prost(message, optional, tag = "1")]
    pub checkpoint: Option<SaveCheckpoint>,
    #[prost(message, optional, tag = "2")]
    pub value: Option<StoredValue>,
}

#[derive(Clone, PartialEq, Message)]
pub struct StoredEntry {
    #[prost(string, tag = "1")]
    pub key: String,
    #[prost(message, optional, tag = "2")]
    pub value: Option<StoredValue>,
}

#[derive(Clone, PartialEq, Message)]
pub struct StoredArray {
    #[prost(message, repeated, tag = "1")]
    pub values: Vec<StoredValue>,
}

#[derive(Clone, PartialEq, Message)]
pub struct StoredMap {
    #[prost(message, repeated, tag = "1")]
    pub entries: Vec<StoredEntry>,
}

#[derive(Clone, PartialEq, Message)]
pub struct StoredValue {
    #[prost(oneof = "stored_value::Kind", tags = "1, 2, 3, 4, 5, 6")]
    pub kind: Option<stored_value::Kind>,
}

pub mod stored_value {
    use prost::Oneof;

    use super::{StoredArray, StoredMap};

    #[derive(Clone, PartialEq, Oneof)]
    pub enum Kind {
        #[prost(bool, tag = "1")]
        Bool(bool),
        #[prost(int64, tag = "2")]
        Int(i64),
        #[prost(double, tag = "3")]
        Float(f64),
        #[prost(string, tag = "4")]
        String(String),
        #[prost(message, tag = "5")]
        Array(StoredArray),
        #[prost(message, tag = "6")]
        Map(StoredMap),
    }
}

#[derive(Clone, PartialEq, Message)]
pub struct SceneSnapshot {
    #[prost(message, optional, tag = "1")]
    pub background: Option<ImageLayerSnapshot>,
    #[prost(message, repeated, tag = "2")]
    pub sprites: Vec<SpriteSnapshot>,
    #[prost(message, repeated, tag = "3")]
    pub character_positions: Vec<CharacterPosition>,
    #[prost(float, tag = "4")]
    pub overlay_alpha: f32,
    #[prost(message, optional, tag = "5")]
    pub bgm: Option<AudioSnapshot>,
    #[prost(message, optional, tag = "6")]
    pub dialogue: Option<DialogueSnapshot>,
    #[prost(message, optional, tag = "7")]
    pub text_effect: Option<TextEffectSnapshot>,
    #[prost(message, optional, tag = "8")]
    pub camera: Option<CameraSnapshot>,
}

#[derive(Clone, PartialEq, Message)]
pub struct CameraSnapshot {
    #[prost(float, tag = "1")]
    pub blur: f32,
    #[prost(float, tag = "2")]
    pub zoom: f32,
    #[prost(float, repeated, tag = "3")]
    pub offset: Vec<f32>,
    #[prost(float, repeated, tag = "4")]
    pub rotation: Vec<f32>,
    #[prost(string, tag = "5")]
    pub projection: String,
    #[prost(string, tag = "6")]
    pub scope: String,
}

#[derive(Clone, PartialEq, Message)]
pub struct ImageLayerSnapshot {
    #[prost(string, tag = "1")]
    pub path: String,
}

#[derive(Clone, PartialEq, Message)]
pub struct SpriteSnapshot {
    #[prost(string, tag = "1")]
    pub id: String,
    #[prost(string, tag = "2")]
    pub path: String,
    #[prost(float, tag = "3")]
    pub x: f32,
    #[prost(float, tag = "4")]
    pub y: f32,
    #[prost(float, tag = "5")]
    pub layer: f32,
    #[prost(float, tag = "6")]
    pub scale: f32,
    #[prost(float, tag = "7")]
    pub alpha: f32,
    #[prost(float, repeated, tag = "8")]
    pub rect: Vec<f32>,
    #[prost(bool, tag = "9")]
    pub focused: bool,
}

#[derive(Clone, PartialEq, Message)]
pub struct CharacterPosition {
    #[prost(string, tag = "1")]
    pub actor_id: String,
    #[prost(float, tag = "2")]
    pub x: f32,
    #[prost(float, tag = "3")]
    pub y: f32,
}

#[derive(Clone, PartialEq, Message)]
pub struct AudioSnapshot {
    #[prost(string, tag = "1")]
    pub path: String,
    #[prost(float, tag = "2")]
    pub volume: f32,
}

#[derive(Clone, PartialEq, Message)]
pub struct DialogueSnapshot {
    #[prost(string, tag = "1")]
    pub speaker: String,
    #[prost(string, tag = "2")]
    pub text: String,
}

#[derive(Clone, PartialEq, Message)]
pub struct TextEffectSnapshot {
    #[prost(string, tag = "1")]
    pub mode: String,
    #[prost(float, tag = "2")]
    pub cps: f32,
    #[prost(float, tag = "3")]
    pub fade_seconds: f32,
}