annotate python/src/main.rs @ 796:d876ac2ccfe1 default tip

Pass audio only once to GameRunner This prevents it being recreated every stage change, and playing music over the previous stages’ music.
author Link Mauve <linkmauve@linkmauve.fr>
date Sun, 28 Jun 2026 14:27:03 +0200
parents 2d60a14f4816
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
795
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
1 //! Main entrypoint for PyTouhou, now in Rust.
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
2
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
3 // Copyright (C) 2011 Thibaut Girka <thib@sitedethib.com>
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
4 // Copyright (C) 2026 Link Mauve <linkmauve@linkmauve.fr>
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
5 //
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
6 // This program is free software; you can redistribute it and/or modify
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
7 // it under the terms of the GNU General Public License as published
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
8 // by the Free Software Foundation; version 3 only.
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
9 //
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
10 // This program is distributed in the hope that it will be useful,
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
13 // GNU General Public License for more details.
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
14
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
15 use clap::{Parser, ValueEnum};
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
16 use pyo3::{prelude::*, types::PyDict};
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
17 use std::{fs::File, path::PathBuf};
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
18 use touhou_formats::th06::t6rp::{T6rp, Level};
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
19
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
20 #[derive(Debug, Clone, ValueEnum)]
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
21 enum Verbosity {
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
22 Debug,
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
23 Info,
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
24 Warning,
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
25 Error,
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
26 Critical,
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
27 }
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
28
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
29 #[derive(Debug, Clone, ValueEnum)]
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
30 enum Game {
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
31 EoSD,
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
32 Sample,
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
33 }
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
34
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
35 #[derive(Debug, Clone, ValueEnum)]
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
36 enum Frontend {
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
37 Sdl,
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
38 Glfw,
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
39 }
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
40
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
41 impl Frontend {
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
42 const fn to_str(&self) -> &'static str {
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
43 match self {
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
44 Frontend::Sdl => "sdl",
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
45 Frontend::Glfw => "glfw",
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
46 }
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
47 }
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
48 }
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
49
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
50 #[derive(Debug, Clone, ValueEnum)]
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
51 enum Backend {
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
52 OpenGL,
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
53 Glide,
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
54 Sdl,
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
55 }
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
56
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
57 #[derive(Debug, Clone, ValueEnum)]
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
58 enum GlFlavor {
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
59 Core,
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
60 Es,
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
61 Compatibility,
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
62 Legacy,
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
63 }
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
64
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
65 impl GlFlavor {
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
66 const fn to_str(&self) -> &'static str {
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
67 match self {
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
68 GlFlavor::Core => "core",
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
69 GlFlavor::Es => "es",
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
70 GlFlavor::Compatibility => "compatibility",
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
71 GlFlavor::Legacy => "legacy",
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
72 }
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
73 }
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
74 }
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
75
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
76 /// Libre reimplementation of the Touhou 6 engine.
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
77 #[derive(Parser, Debug)]
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
78 #[command(version, about, long_about = None)]
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
79 struct Options {
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
80 /// Game’s data files.
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
81 #[arg(short, long/*, default_value_t = vec!["CM.DAT", "ST.DAT", "IN.DAT", "MD.DAT", "102h.exe"]*/)]
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
82 data: Vec<PathBuf>,
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
83
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
84 /// Game directory path.
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
85 #[arg(short, long/*, default_value_t = PathBuf::from(".")*/)]
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
86 path: Option<PathBuf>,
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
87
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
88 /// Set unlimited continues, and perhaps other debug features.
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
89 #[arg(long)]
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
90 debug: bool,
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
91
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
92 /// Select the wanted logging level.
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
93 #[arg(long, value_enum, default_value_t = Verbosity::Warning)]
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
94 verbosity: Verbosity,
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
95
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
96 /// Stage, 1 to 7 (Extra), nothing means story mode.
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
97 #[arg(short, long)]
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
98 stage: Option<u8>,
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
99
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
100 /// Rank, from 0 (Easy, default) to 3 (Lunatic).
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
101 #[arg(short, long, default_value_t = 0)]
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
102 rank: u8,
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
103
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
104 /// Select the character to use, from 0 (ReimuA, default) to 3 (MarisaB).
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
105 #[arg(short, long, default_value_t = 0)]
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
106 character: u8,
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
107
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
108 /// Fight only bosses.
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
109 #[arg(short, long)]
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
110 boss_rush: bool,
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
111
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
112 /// Select the game engine to use.
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
113 #[arg(long, value_enum, default_value_t = Game::EoSD)]
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
114 game: Game,
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
115
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
116 /// Select the interface to use.
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
117 #[arg(long, value_enum, default_value_t = Game::EoSD)]
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
118 interface: Game,
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
119
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
120 /// Hints file, to display text while playing.
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
121 #[arg(long)]
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
122 hints: Option<String>,
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
123
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
124 /// Select a file to replay.
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
125 #[arg(long)]
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
126 replay: Option<String>,
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
127
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
128 /// Save the upcoming game into a replay file.
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
129 #[arg(long)]
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
130 save_replay: Option<String>,
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
131
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
132 /// Skip the replay and start to play when it’s finished.
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
133 #[arg(long)]
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
134 skip_replay: bool,
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
135
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
136 /// Local port to use.
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
137 #[arg(long, default_value_t = 0)]
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
138 port: u16,
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
139
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
140 /// Remote address.
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
141 #[arg(long)]
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
142 remote: Option<String>,
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
143
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
144 /// Allow friendly-fire during netplay.
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
145 #[arg(long)]
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
146 friendly_fire: bool,
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
147
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
148 /// Which windowing library to use (glfw or sdl).
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
149 #[arg(long, value_enum, default_value_t = Frontend::Glfw)]
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
150 frontend: Frontend,
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
151
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
152 /// Which backend to use (opengl, glide or sdl).
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
153 #[arg(long, value_enum, default_value_t = Backend::OpenGL)]
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
154 backend: Backend,
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
155
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
156 /// Set fps limit. A value of 0 disables fps limiting, while a negative value limits to 60 fps if and only if vsync doesn’t work.
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
157 #[arg(long, default_value_t = -1)]
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
158 fps_limit: i16,
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
159
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
160 /// Set the frameskip, as 1/FRAMESKIP, or disabled if 0.
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
161 #[arg(long, default_value_t = 1)]
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
162 frameskip: i8,
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
163
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
164 /// Disable background display (huge performance boost on slow systems).
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
165 #[arg(long)]
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
166 no_background: bool,
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
167
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
168 /// Disable particles handling (huge performance boost on slow systems).
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
169 #[arg(long)]
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
170 no_particles: bool,
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
171
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
172 /// Disable music and sound effects.
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
173 #[arg(long)]
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
174 no_sound: bool,
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
175
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
176 /// OpenGL profile to use.
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
177 #[arg(long, value_enum, default_value_t = GlFlavor::Compatibility)]
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
178 gl_flavor: GlFlavor,
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
179
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
180 /// OpenGL version to use.
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
181 #[arg(long, default_value_t = 2.1)]
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
182 gl_version: f32,
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
183
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
184 /// Enable double buffering.
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
185 #[arg(long)]
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
186 double_buffer: Option<bool>,
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
187 }
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
188
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
189 fn main() -> PyResult<()> {
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
190 let mut args = Options::parse();
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
191 if args.data.is_empty() {
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
192 args.data = vec!["CM.DAT".into(), "ST.DAT".into(), "IN.DAT".into(), "MD.DAT".into(), "102h.exe".into()];
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
193 }
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
194 if args.path.is_none() {
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
195 args.path = Some(".".into());
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
196 }
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
197
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
198 Python::initialize();
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
199
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
200 Python::attach(|py| {
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
201 let game = PyModule::import(py, "pytouhou.games.eosd.game").unwrap();
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
202 let Common = game.getattr("Common").unwrap();
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
203 let Game = game.getattr("Game").unwrap();
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
204
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
205 let interface = PyModule::import(py, "pytouhou.games.eosd.interface").unwrap();
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
206 let Interface = interface.getattr("Interface").unwrap();
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
207 let width: usize = Interface.getattr("width").unwrap().extract().unwrap();
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
208 let height: usize = Interface.getattr("height").unwrap().extract().unwrap();
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
209
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
210 let backend = PyModule::import(py, "pytouhou.ui.opengl.backend").unwrap();
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
211 let backend_init = backend.getattr("init").unwrap();
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
212 let options = PyDict::new(py);
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
213 options.set_item("flavor", args.gl_flavor.to_str()).unwrap();
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
214 options.set_item("version", args.gl_version.to_string()).unwrap();
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
215 options.set_item("double-buffer", args.double_buffer).unwrap();
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
216 options.set_item("frontend", args.frontend.to_str()).unwrap();
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
217 backend_init.call1((options,)).unwrap();
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
218 let GameRenderer = backend.getattr("GameRenderer").unwrap();
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
219
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
220 let window = PyModule::import(py, "pytouhou.ui.window").unwrap();
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
221 let Window = window.getattr("Window").unwrap();
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
222 let window = Window.call1((backend, width, height, args.fps_limit, args.frameskip)).unwrap();
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
223
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
224 let gamerunner = PyModule::import(py, "pytouhou.ui.gamerunner").unwrap();
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
225 let GameRunner = gamerunner.getattr("GameRunner").unwrap();
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
226
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
227 let loader = PyModule::import(py, "pytouhou.resource.loader").unwrap();
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
228 let Loader = loader.getattr("Loader").unwrap();
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
229 let resource_loader = Loader.call1((args.path,)).unwrap();
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
230
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
231 let scan_archives = resource_loader.getattr("scan_archives").unwrap();
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
232 let data: Vec<_> = args.data.into_iter().map(|x| x.display().to_string()).collect();
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
233 if let Err(err) = scan_archives.call1((data,)) {
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
234 eprintln!("Some data files were not found, did you forget the -p option?");
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
235 eprintln!("{err}");
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
236 std::process::exit(1);
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
237 }
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
238
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
239 let libtouhou = PyModule::import(py, "libtouhou").unwrap();
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
240 let Prng = libtouhou.getattr("Prng").unwrap();
796
d876ac2ccfe1 Pass audio only once to GameRunner
Link Mauve <linkmauve@linkmauve.fr>
parents: 795
diff changeset
241 let Audio = libtouhou.getattr("Audio").unwrap();
d876ac2ccfe1 Pass audio only once to GameRunner
Link Mauve <linkmauve@linkmauve.fr>
parents: 795
diff changeset
242 let DummyAudio = libtouhou.getattr("DummyAudio").unwrap();
d876ac2ccfe1 Pass audio only once to GameRunner
Link Mauve <linkmauve@linkmauve.fr>
parents: 795
diff changeset
243
d876ac2ccfe1 Pass audio only once to GameRunner
Link Mauve <linkmauve@linkmauve.fr>
parents: 795
diff changeset
244 let audio;
d876ac2ccfe1 Pass audio only once to GameRunner
Link Mauve <linkmauve@linkmauve.fr>
parents: 795
diff changeset
245 if !args.no_sound {
d876ac2ccfe1 Pass audio only once to GameRunner
Link Mauve <linkmauve@linkmauve.fr>
parents: 795
diff changeset
246 let bgms = [Some(("赤より紅い夢", "th06_01.mid")), None, None, None];
d876ac2ccfe1 Pass audio only once to GameRunner
Link Mauve <linkmauve@linkmauve.fr>
parents: 795
diff changeset
247 audio = Audio.call1((resource_loader.clone(), bgms)).unwrap();
d876ac2ccfe1 Pass audio only once to GameRunner
Link Mauve <linkmauve@linkmauve.fr>
parents: 795
diff changeset
248 } else {
d876ac2ccfe1 Pass audio only once to GameRunner
Link Mauve <linkmauve@linkmauve.fr>
parents: 795
diff changeset
249 audio = DummyAudio.call0().unwrap();
d876ac2ccfe1 Pass audio only once to GameRunner
Link Mauve <linkmauve@linkmauve.fr>
parents: 795
diff changeset
250 }
795
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
251
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
252 let mut stage_num;
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
253 let story;
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
254 let mut continues;
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
255 if let Some(stage) = args.stage {
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
256 stage_num = stage as usize;
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
257 story = false;
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
258 continues = 0;
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
259 } else {
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
260 stage_num = 1;
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
261 story = true;
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
262 continues = 3;
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
263 }
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
264
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
265 if args.debug {
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
266 continues = -1; // Infinite lives
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
267 }
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
268
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
269 let mut replay = None;
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
270 let rank;
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
271 let character;
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
272 if let Some(replay_path) = args.replay {
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
273 let data = std::fs::read(replay_path).unwrap();
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
274 let (encrypted, header) = T6rp::parse_header(&data).unwrap();
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
275 let decrypted = T6rp::decrypt(header.key, encrypted);
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
276 assert!(T6rp::verify(header.key, header.checksum, &decrypted));
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
277 let (_, replay2) = T6rp::from_slice(&decrypted).unwrap();
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
278 replay = Some(replay2);
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
279 rank = header.rank;
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
280 character = header.character;
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
281 } else {
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
282 rank = args.rank;
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
283 character = args.character;
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
284 }
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
285
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
286 let mut save_keystates: Option<Vec<u8>> = None;
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
287 /*
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
288 if let Some(save_filename) = args.save_replay {
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
289 let save_replay = T6RP();
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
290 save_replay.rank = rank;
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
291 save_replay.character = character;
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
292 }
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
293 */
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
294
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
295 let mut difficulty = 16;
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
296
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
297 let selected_player;
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
298 let characters;
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
299 let con;
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
300 /*
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
301 let addr;
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
302 let prng;
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
303 if args.port != 0 {
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
304 if let Some(remote) = args.remote {
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
305 let (remote_addr, remote_port) = remote.split_once(':').unwrap();
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
306 addr = Some((remote_addr, u16::from_str_radix(remote_port, 10)));
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
307 selected_player = 0;
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
308 } else {
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
309 addr = None;
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
310 selected_player = 1;
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
311 }
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
312
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
313 prng = Prng::new(0);
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
314 con = Network(args.port, addr, selected_player);
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
315 characters = [1, 3];
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
316 } else {
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
317 */
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
318 con = None::<u32>;
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
319 selected_player = 0;
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
320 characters = [character];
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
321 /*
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
322 }
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
323 */
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
324
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
325 if let Some(hints_filename) = args.hints {
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
326 let data = std::fs::read(hints_filename).unwrap();
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
327 //let hints = Hint.read(data);
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
328 }
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
329
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
330 let game_class = Game/*if args.boss_rush { GameBossRush } else { Game }*/;
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
331
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
332 let common = Common.call1((resource_loader.clone(), characters, continues)).unwrap();
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
333 let first_player = common.getattr("players").unwrap().get_item(0).unwrap();
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
334 let interface = Interface.call1((resource_loader.clone(), first_player.clone())).unwrap();
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
335 common.setattr("interface", interface).unwrap();
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
336 let renderer = if !GameRenderer.is_none() {
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
337 Some(GameRenderer.call1((resource_loader.clone(), window.clone())).unwrap())
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
338 } else {
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
339 None
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
340 };
796
d876ac2ccfe1 Pass audio only once to GameRunner
Link Mauve <linkmauve@linkmauve.fr>
parents: 795
diff changeset
341 let runner = GameRunner.call1((window.clone(), renderer, common.clone(), resource_loader.clone(), audio, args.skip_replay, con)).unwrap();
795
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
342 let window_set_runner = window.getattr("set_runner").unwrap();
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
343 window_set_runner.call1((runner.clone(),)).unwrap();
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
344
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
345 loop {
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
346 let prng;
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
347 if let Some(replay) = &replay {
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
348 let Some(level) = &replay.levels[stage_num - 1] else {
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
349 break;
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
350 };
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
351
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
352 prng = Prng.call1((level.random_seed,)).unwrap();
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
353
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
354 // TODO: apply the replay to the other players.
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
355 // TODO: see if the stored score is used or if it’s the one from the previous stage.
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
356 if stage_num != 1 && replay.levels[stage_num - 2].is_some() {
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
357 if let Some(previous_level) = &replay.levels[stage_num - 1] {
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
358 first_player.setattr("score", previous_level.score).unwrap();
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
359 first_player.setattr("effective_score", previous_level.score).unwrap();
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
360 }
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
361 }
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
362 first_player.setattr("points", level.point_items).unwrap();
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
363 first_player.setattr("power", level.power).unwrap();
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
364 first_player.setattr("lives", level.lives).unwrap();
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
365 first_player.setattr("bombs", level.bombs).unwrap();
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
366 difficulty = level.difficulty;
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
367 } else if args.port == 0 {
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
368 prng = Prng.call0().unwrap();
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
369 } else {
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
370 panic!("TODO: Remove that branch!");
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
371 }
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
372
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
373 if args.save_replay.is_some() {
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
374 if replay.is_none() {
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
375 let keys = Vec::new();
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
376 let level = Level {
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
377 score: first_player.getattr("score").unwrap().extract().unwrap(),
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
378 random_seed: prng.getattr("seed").unwrap().extract().unwrap(),
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
379 point_items: first_player.getattr("points").unwrap().extract().unwrap(),
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
380 power: first_player.getattr("power").unwrap().extract().unwrap(),
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
381 lives: first_player.getattr("lives").unwrap().extract().unwrap(),
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
382 bombs: first_player.getattr("bombs").unwrap().extract().unwrap(),
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
383 difficulty,
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
384 unknown: 0,
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
385 keys,
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
386 };
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
387 //save_replay.levels[stage_num - 1] = level;
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
388 }
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
389 save_keystates = Some(Vec::new());
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
390 }
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
391
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
392 let hints_stage = if false/*hints*/ {
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
393 Some(true) // hints.stages[stage_num - 1]
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
394 } else {
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
395 None
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
396 };
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
397
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
398 let game = game_class.call1((resource_loader.clone(), stage_num, args.rank, difficulty,
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
399 common.clone(), prng.clone(), hints_stage, args.friendly_fire)).unwrap();
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
400
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
401 if args.no_particles {
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
402 let new_particle = pyo3::types::PyCFunction::new_closure(py, Some(c"new_particle"), None, |_, _| ()).unwrap();
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
403 game.setattr("new_particle", new_particle).unwrap();
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
404 }
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
405
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
406 let background = if args.no_background {
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
407 None
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
408 } else {
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
409 Some(game.getattr("background").unwrap())
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
410 };
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
411 let runner_load_game = runner.getattr("load_game").unwrap();
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
412 let game_std = game.getattr("std").unwrap();
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
413 let game_std_bgms = game_std.getattr("bgms").unwrap();
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
414 runner_load_game.call1((game, background, game_std_bgms, None::<u32>/*replay*/, save_keystates.clone())).unwrap();
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
415
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
416 // Main loop
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
417 let window_run = window.getattr("run").unwrap();
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
418 match window_run.call0() {
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
419 Ok(_) => break,
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
420 ref orig_err @ Err(ref err) => {
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
421 match err.get_type(py).to_string().as_str() {
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
422 "<class 'pytouhou.game.NextStage'>" => {
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
423 if !story || stage_num == (if false/*boss_rush*/ { 7 } else if rank > 0 { 6 } else { 5 }) {
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
424 break;
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
425 }
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
426 stage_num += 1;
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
427 }
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
428 "<class 'pytouhou.game.GameOver'>" => {
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
429 println!("Game over!");
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
430 break;
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
431 }
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
432 err => {
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
433 eprintln!("Got unexpected exception {err:?}!");
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
434 orig_err.as_ref().unwrap();
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
435 }
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
436
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
437 }
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
438 }
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
439 /*
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
440 finally:
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
441 if save_filename:
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
442 last_key = -1
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
443 for time, key in enumerate(save_keystates):
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
444 if key != last_key:
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
445 level.keys.append((time, key, 0))
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
446 last_key = key
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
447 */
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
448 }
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
449 }
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
450
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
451 window_set_runner.call1((None::<u32>,)).unwrap();
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
452
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
453 if let Some(save_filename) = args.save_replay {
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
454 let file = File::create(save_filename).unwrap();
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
455 //save_replay.write(file);
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
456 }
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
457 });
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
458 Ok(())
2d60a14f4816 python: Rewrite the main entrypoint in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
459 }