Skip to content

Commit 6dfa115

Browse files
Add the .end text on win()
1 parent 4b1dbc5 commit 6dfa115

File tree

4 files changed

+178
-72
lines changed

4 files changed

+178
-72
lines changed

resources/maps/01.map

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,3 @@
1-
[-4------]_[--8---8---*-]
1+
[-4------]_[--8---8---*-]
2+
3+
.end We **rustaceans** love all animals and we do not want to disappoint them like the gophers. \nWe also have animals in our language too like Cow<>. \nWe just love the correct animals ⌐■_■

src/game.rs

Lines changed: 84 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,12 @@
11
use std::{collections::HashMap, io::Read, sync::Mutex};
22

3-
use ggez::{
4-
audio::{SoundSource, Source},
5-
event::KeyCode,
6-
graphics::{self, Color, DrawParam, Shader},
7-
mint,
8-
nalgebra::Point2,
9-
timer, Context, GameResult,
10-
};
3+
use ggez::{Context, GameResult, audio::{SoundSource, Source}, event::KeyCode, graphics::{self, Color, DrawParam, Shader, Text}, mint, nalgebra::Point2, timer};
114
use ggez_goodies::{
125
camera::{Camera, CameraDraw},
136
nalgebra_glm::Vec2,
147
particle::{EmissionShape, ParticleSystem, ParticleSystemBuilder, Transition},
158
};
16-
use graphics::{Font, GlBackendSpec, Image, ShaderGeneric};
9+
use graphics::{Font, GlBackendSpec, Image, Scale, ShaderGeneric, TextFragment};
1710
use mint::Vector2;
1811
use rand::Rng;
1912

@@ -24,9 +17,10 @@ use crate::{
2417
cloud::Cloud,
2518
enemy::Enemy,
2619
player::{Direction, Player},
27-
tile::{Tile, TileType},
20+
tile::Tile,
2821
},
2922
utils::{lerp, remap},
23+
map::Map,
3024
Screen, HEIGHT, WIDTH,
3125
};
3226

@@ -56,7 +50,6 @@ pub struct Game {
5650
barrel_resources: Vec<Image>,
5751
cloud_resources: Vec<Image>,
5852

59-
#[allow(dead_code)]
6053
consolas: Font,
6154

6255
camera: Camera,
@@ -68,6 +61,10 @@ pub struct Game {
6861

6962
dim_shader: ShaderGeneric<GlBackendSpec, Dim>,
7063
dim_constant: Dim,
64+
65+
end: Option<String>,
66+
67+
draw_end_text: (bool, Option<usize>, bool, bool) // Thread Sleeped?, Current Iters, Done?, Win?
7168
}
7269

7370
impl Game {
@@ -80,15 +77,16 @@ impl Game {
8077
let mut buffer = String::new();
8178
map.read_to_string(&mut buffer).unwrap();
8279

83-
let mut ground = vec![];
84-
let mut enemies = vec![];
85-
let mut barrels = vec![];
86-
let mut clouds = vec![];
80+
let mut map_1 = Map::new();
8781

88-
let mut player = None;
82+
map_1.parse(buffer);
8983

90-
let mut draw_pos = 0.;
91-
let draw_inc = 64.;
84+
let ground = map_1.ground;
85+
let enemies = map_1.enemies;
86+
let barrels = map_1.barrels;
87+
let mut clouds = vec![];
88+
89+
let player = map_1.player;
9290

9391
let dim_constant = Dim { rate: 1.0 };
9492

@@ -102,55 +100,6 @@ impl Game {
102100
)
103101
.unwrap();
104102

105-
for id in buffer.chars() {
106-
match id {
107-
'[' => {
108-
ground.push(Tile::new(draw_pos, TileType::LEFT));
109-
110-
draw_pos += draw_inc;
111-
}
112-
113-
'-' => {
114-
ground.push(Tile::new(draw_pos, TileType::CENTER));
115-
116-
draw_pos += draw_inc;
117-
}
118-
119-
']' => {
120-
ground.push(Tile::new(draw_pos, TileType::RIGHT));
121-
122-
draw_pos += draw_inc;
123-
}
124-
125-
'_' => {
126-
draw_pos += draw_inc;
127-
}
128-
129-
'8' => {
130-
ground.push(Tile::new(draw_pos, TileType::CENTER));
131-
enemies.push(Enemy::new(draw_pos));
132-
133-
draw_pos += draw_inc;
134-
}
135-
136-
'4' => {
137-
ground.push(Tile::new(draw_pos, TileType::CENTER));
138-
player = Some(Player::new(draw_pos));
139-
140-
draw_pos += draw_inc;
141-
}
142-
143-
'*' => {
144-
ground.push(Tile::new(draw_pos, TileType::CENTER));
145-
barrels.push(Barrel::new(draw_pos));
146-
147-
draw_pos += draw_inc;
148-
}
149-
150-
_ => {}
151-
}
152-
}
153-
154103
let mut player = player.expect("No player found!");
155104
let mut ui_lerp = HashMap::new();
156105

@@ -223,17 +172,55 @@ impl Game {
223172

224173
dim_shader,
225174
dim_constant,
175+
draw_end_text: (false, None, false, false),
176+
177+
end: map_1.end,
226178
})
227179
}
228180

229181
pub fn draw(&mut self, ctx: &mut Context) -> GameResult<()> {
230182
if let Some(_t) = self.tics {
231-
let _lock = graphics::use_shader(ctx, &self.dim_shader);
183+
{
184+
let _lock = graphics::use_shader(ctx, &self.dim_shader);
185+
186+
self.inner_draw(ctx)?;
187+
}
232188

233-
self.inner_draw(ctx)
189+
if self.draw_end_text.0 && self.draw_end_text.3 {
190+
let mut draw_pos = 0.;
191+
192+
// You Win
193+
let end_frag = &Text::new(TextFragment::new("You Win!")
194+
.font(self.consolas)
195+
.scale(Scale::uniform(50.))
196+
);
197+
198+
let end_dimensions = end_frag.dimensions(ctx);
199+
200+
graphics::draw(ctx, end_frag, DrawParam::default()
201+
.dest(Point2::new((WIDTH / 2.0) - (end_dimensions.0 / 2) as f32, 50.0))
202+
)?;
203+
204+
// End quote
205+
for line in self.end.as_ref().unwrap().split("\\n").collect::<Vec<_>>() {
206+
let end_frag = &Text::new(TextFragment::new(line)
207+
.font(self.consolas)
208+
);
209+
210+
let end_dimensions = end_frag.dimensions(ctx);
211+
212+
graphics::draw(ctx, end_frag, DrawParam::default()
213+
.dest(Point2::new((WIDTH / 2.0) - (end_dimensions.0 / 2) as f32, HEIGHT / 2. + draw_pos))
214+
)?;
215+
216+
draw_pos += 20.0;
217+
}
218+
}
234219
} else {
235-
self.inner_draw(ctx)
220+
self.inner_draw(ctx)?;
236221
}
222+
223+
graphics::present(ctx)
237224
}
238225

239226
fn inner_draw(&mut self, ctx: &mut Context) -> GameResult<()> {
@@ -277,7 +264,7 @@ impl Game {
277264
// User Profile, etc..
278265
self.draw_ui(ctx)?;
279266

280-
graphics::present(ctx)
267+
Ok(())
281268
}
282269

283270
fn draw_ui(&mut self, ctx: &mut Context) -> GameResult<()> {
@@ -379,6 +366,30 @@ impl Game {
379366
}
380367

381368
pub fn inner_update(&mut self, ctx: &mut Context) -> GameResult<Option<crate::Screen>> {
369+
if self.enemies.len() == 0 {
370+
self.draw_end_text.3 = true;
371+
372+
if self.draw_end_text.1.is_none() {
373+
self.draw_end_text.1 = Some(timer::ticks(ctx));
374+
}
375+
376+
else if !self.draw_end_text.2 {
377+
if timer::ticks(ctx) - self.draw_end_text.1.unwrap() > 30 {
378+
self.draw_end_text.0 = true;
379+
self.draw_end_text.2 = true;
380+
}
381+
}
382+
383+
else {
384+
self.tics = Some(1);
385+
386+
if self.dim_constant.rate != 0.0 {
387+
self.dim_constant.rate = lerp(self.dim_constant.rate, 0.0, 0.1);
388+
self.dim_shader.send(ctx, self.dim_constant)?;
389+
}
390+
}
391+
}
392+
382393
let ferris_pos_x = self.player.pos_x;
383394
let ferris_pos_y = self.player.pos_y;
384395

@@ -556,6 +567,8 @@ impl Game {
556567

557568
if sys.3 > 6 {
558569
self.particles.remove(i);
570+
571+
break;
559572
}
560573
}
561574

src/main.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ mod dead;
1212
mod game;
1313
mod menu;
1414
mod utils;
15+
mod map;
1516

1617
mod components {
1718
pub mod barrel;

src/map.rs

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
use crate::components::{barrel::Barrel, enemy::Enemy, player::Player, tile::{Tile, TileType}};
2+
3+
pub struct Map {
4+
draw_pos: f32,
5+
draw_inc: f32,
6+
7+
pub ground: Vec<Tile>,
8+
pub enemies: Vec<Enemy>,
9+
pub barrels: Vec<Barrel>,
10+
11+
pub player: Option<Player>,
12+
pub end: Option<String>
13+
}
14+
15+
impl Map {
16+
pub fn new() -> Self {
17+
Self {
18+
draw_pos: 0.,
19+
draw_inc: 64.,
20+
21+
ground: vec![],
22+
enemies: vec![],
23+
barrels: vec![],
24+
25+
player: None,
26+
end: None
27+
}
28+
}
29+
30+
pub fn parse(&mut self, map: String) {
31+
for line in map.split("\n").collect::<Vec<_>>() {
32+
let exp = line.split(" ").collect::<Vec<_>>();
33+
34+
if exp[0].starts_with(".end") {
35+
self.end = Some(exp[1..].join(" "));
36+
}
37+
38+
else {
39+
for id in line.chars() {
40+
match id {
41+
'[' => {
42+
self.ground.push(Tile::new(self.draw_pos, TileType::LEFT));
43+
44+
self.draw_pos += self.draw_inc;
45+
}
46+
47+
'-' => {
48+
self.ground.push(Tile::new(self.draw_pos, TileType::CENTER));
49+
50+
self.draw_pos += self.draw_inc;
51+
}
52+
53+
']' => {
54+
self.ground.push(Tile::new(self.draw_pos, TileType::RIGHT));
55+
56+
self.draw_pos += self.draw_inc;
57+
}
58+
59+
'_' => {
60+
self.draw_pos += self.draw_inc;
61+
}
62+
63+
'8' => {
64+
self.ground.push(Tile::new(self.draw_pos, TileType::CENTER));
65+
self.enemies.push(Enemy::new(self.draw_pos));
66+
67+
self.draw_pos += self.draw_inc;
68+
}
69+
70+
'4' => {
71+
self.ground.push(Tile::new(self.draw_pos, TileType::CENTER));
72+
self.player = Some(Player::new(self.draw_pos));
73+
74+
self.draw_pos += self.draw_inc;
75+
}
76+
77+
'*' => {
78+
self.ground.push(Tile::new(self.draw_pos, TileType::CENTER));
79+
self.barrels.push(Barrel::new(self.draw_pos));
80+
81+
self.draw_pos += self.draw_inc;
82+
}
83+
84+
_ => {}
85+
}
86+
}
87+
}
88+
}
89+
}
90+
}

0 commit comments

Comments
 (0)