Mercurial > touhou
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 |
| 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 } |
