M README.md => README.md +10 -14
@@ 9,17 9,6 @@ with this 2D game
## Screenshot
![img](./screenshot.png)
-To try out the example world on your device,
-copy the `example.world` to the applications data dir.
-
-On Linux, this is `~/.local/share/little_town/`,
-if you are not running Linux,
-have a look at the [ProjectDir Value Table](https://github.com/xdg-rs/dirs/tree/master/directories#projectdirs).
-
-After copying the file,
-launch the game and the world should appear in the world list
-
-
## Roadmap
- [x] Placing & Removing blocks
- [x] Basic Welcome Screen
@@ 32,17 21,24 @@ launch the game and the world should appear in the world list
- [x] World creation screen
- [ ] (MAYBE) campaign mode (build & expand a city with limited ressources)
- [ ] Touch control
+ - [ ] Move screen with 2 fingers
+ - [ ] zoom camera with pinch gesture
+ - [ ] place block with single click
+ - [ ] destroy block with long click
- [ ] Settings menu (i.e for Keybindings)
-- [ ] Game music?
+- [ ] Background music (ambient)
- [ ] Add more assets
- [x] SketchTown Expansion pack
- [ ] (MAYBE) [Sketch Desert](https://kenney.nl/assets/sketch-desert)
+- [x] Placing blocks on the other side of a block (Shift+Mouse)
+ - [x] (requires) rotate block using Ctrl+Mouse
## Keymap
### in-Game
| Action | Key(s) / MouseButton |
|--------|----------------------|
| place Block | Left mouse button |
+| place Block on inverted face | `<Shift>` and left mouse button |
| destroy Block | right mouse button |
| Save Game | `S` |
| Save & Quit | `Q` or `<Escape>` |
@@ 54,8 50,8 @@ launch the game and the world should appear in the world list
| South | `J` |
| West | `H` |
| East | `L` |
-| rotate CCW | `<Shift>` and left mouse button |
-| rotate CW | `<Shift>` and right mouse button |
+| rotate CCW | `<Ctrl>` and left mouse button |
+| rotate CW | `<Ctrl>` and right mouse button |
#### Camera movement
| Action | Key(s) / MouseButton |
M src/game/world.rs => src/game/world.rs +5 -0
@@ 81,6 81,11 @@ impl World {
/// can be used to remove items
/// or place items
pub fn place_block(&mut self, pos: &Pos3, block: Block, dir: Direction) -> bool {
+ // dont place block if there is a block here
+ if self.grid.contains_key(pos) {
+ return false;
+ }
+
if let Some(count) = self.inventory.contents.get_mut(&block) {
// player has block
if *count > 0 {
M src/screens/build.rs => src/screens/build.rs +12 -5
@@ 293,7 293,6 @@ impl GameComponent for BuildScreen {
}
fn ev_loop(&mut self) -> GameEvent {
if let Some(world) = &mut self.world {
-
if self.inventory_widgets.shown {
// process input
match self.inventory_widgets.widget_back.ev_loop() {
@@ 414,7 413,7 @@ impl GameComponent for BuildScreen {
// for a given pixel
let mut pos = Pos3::new(pos.x, pos.y, pos.z);
- if is_key_down(KeyCode::LeftShift) {
+ if is_key_down(KeyCode::LeftControl) {
if let Some(block) = world.grid.get_mut(&pos) {
if is_mouse_button_pressed(MouseButton::Left) {
// rotate block CCW
@@ 448,15 447,23 @@ impl GameComponent for BuildScreen {
let (x,y) = get_screen_coords(&pos, world.cam.scale, world.cam.center);
let face = Face::from_xy(mx-x, my-y, world.cam.scale);
+ // invert coordinate when left shift is pressed
+ // allows placing blocks below & behind other block
+ let factor = if is_key_down(KeyCode::LeftShift) {
+ -1
+ } else {
+ 1
+ };
+
match face.unwrap() {
Face::Top => {
- pos.z+=1;
+ pos.z+=factor;
},
Face::Left => {
- pos.x+=1;
+ pos.x+=factor;
},
Face::Right => {
- pos.y+=1;
+ pos.y+=factor;
}
}