Skip to content

Commit

Permalink
Level1000 - v0.1
Browse files Browse the repository at this point in the history
Must Have:

    Start/End cinematic
    Back to jail (when touched by a enemy)
    Web Exe

Should Have:

    UI for the Tablet
    Vision Feature
        Tile per Tile
        Can only interact with seen entities.
        Entities can be seen by camera, any mindControled entity (including the player)
    Music
    SFX
    Start Menu
  • Loading branch information
Wabtey authored Feb 12, 2023
2 parents ebae954 + e1c6f2b commit 7e09606
Show file tree
Hide file tree
Showing 27 changed files with 2,261 additions and 155 deletions.
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -8,3 +8,6 @@ Cargo.lock

# These are backup files generated by rustfmt
**/*.rs.bk

# Assets are now in cloud
assets/**
1 change: 1 addition & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ edition = "2021"
bevy = { version = "0.9", features = ["dynamic"] }
bevy-inspector-egui = "0.15"
# bevy_tweening = "0.6"
bevy_rapier2d = { version = "0.19", features = ["simd-stable", "debug-render"] }

image = "0.23"

Expand Down
74 changes: 73 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,75 @@
# Cats Destroyer 2000

CreaJeu Edition 2023
CreaJeu Edition 2023 - Theme: ***One Object Many Use***

![fast_blue_cat](https://user-images.githubusercontent.com/73140258/216720606-6e8f7768-3170-4956-a5d1-5124741783aa.gif)

## Assets are excluded from git storage

Due to the inefficiency to store image in git,
all asset can be download here (from the latest version):
[Latest Assets - Google Drive](https://drive.google.com/drive/folders/1qk5_bIUzAUFTuI2A_C0CLmAFGyPDFsMR?usp=share_link)

or in the correct release note (if from other version):
[Releases - Github](https://github.com/Wabtey/cats_destroyer_2000/releases)

## Rules

***But du jeu*** : Arriver à s’enfuir du Labo

### Binding

- `M` to mindcontrol a cat
- `ESC` to return to the player body
- `Left Click` on the button *Hack* to hack doors
- `Z Q S D` or `W A S D` or `Up Left Down Right` to move

### Level Design

#### Tutorial

Un long couloir, avec des compartiments à gauche et à droite.
Un chat normal marche dans le couloir.
La sortie est au bout du couloir, bloquée par le chaton.

Lae player devra:

- accéder à un terminal afin d’ouvrir une des portes sur les côtés (p’etre qu’une porte pour la clarté)
- mind control le chaton afin de le déplacer dans le placard
- refermer la porte
- avoir un délai après le mind control peut permettre d'enchaîner des actions comme ça
- rehack avant que le daze du chaton se dissipe
- slide jusqu’à l’exit

### Mécaniques

#### Tablette

- Appuyer une touche pour entrer dans l’overlay tablette qui permet de sélectionner les entités repérées/vues et de les mind control.
- Permet de prendre le contrôle d’une entité qui a été vu par lae player
- Appuyer esc pour sortir de la tablette de re-contrôler son personnage
- Permet de prendre le contrôle de caméra dispo pour voir qq entités.

Petit à petit, on dévoile le niveau + les entités dedans.

### Idées

vv———————————————————————————————————————vv

Principe du gameplay :
Utiliser la tablette de contrôle pour contrôler les autres chats et les objets → One Object Many Use
Tablette servira aussi d’inventaire et d’interface.

Différents types de chats qui représentent différents ennemis ?

Types de chats :

- Chat Normal → Peut juste être déplacé
- Chat Savant → Peut hacker des ordis/ouvrir des portes
- Chat Espion → A une vision sous forme de cône ou bien de ligne droite (genre laser qui si détecte fonce sur le joueur)
- Chat Costaud → Peut casser différents objets

Nombre de croquettes max qui peut être reset que si on reset le level
(ou le même style que la gestion des barrettes de RAM dans cyberpunk)

Des collectibles style des clés pour déverrouiller des portes
Binary file removed assets/textures/character/blue_cat.png
Binary file not shown.
17 changes: 17 additions & 0 deletions src/characters/effects/mod.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
use crate::characters::effects::style::{add_dazed_effect, animate_dazed_effect};
use bevy::prelude::*;

pub mod style;

pub struct EffectsPlugin;

impl Plugin for EffectsPlugin {
#[rustfmt::skip]
fn build(&self, app: &mut App) {
app
// -- Style --
.add_system(add_dazed_effect)
.add_system(animate_dazed_effect)
;
}
}
77 changes: 77 additions & 0 deletions src/characters/effects/style.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
//! Particules and polished stuffs
// DOC: Rename Style module ?

use bevy::prelude::*;

use crate::{
characters::movement::Dazed,
constants::character::effects::{DAZE_STARTING_ANIM, DAZE_Y_OFFSET},
spritesheet::{AnimationTimer, DazeSheet},
};

#[derive(Component)]
pub struct DazeAnimation;

/// Polish - floating Stars above their head
pub fn add_dazed_effect(
mut commands: Commands,
dazed_character_query: Query<Entity, Added<Dazed>>,
effects_spritesheet: Res<DazeSheet>,
) {
for entity in dazed_character_query.iter() {
// TODO: polish - floating Stars above their head

// whatever the entity
commands.entity(entity).add_children(|parent| {
parent.spawn((
SpriteSheetBundle {
sprite: TextureAtlasSprite {
index: DAZE_STARTING_ANIM,
..default()
},
texture_atlas: effects_spritesheet.0.clone(),
transform: Transform {
translation: Vec3::from(DAZE_Y_OFFSET),
scale: Vec3::splat(0.5),
..default()
},
..default()
},
Name::new("Daze Anim"),
DazeAnimation,
// -- Animation --
AnimationTimer(Timer::from_seconds(0.1, TimerMode::Repeating)),
// AnimState {
// initial: DAZE_STARTING_ANIM,
// current: DAZE_STARTING_ANIM,
// },
));
});
}
}

// pub fn remove_daze_effect(daze_removal: RemovedComponents<Dazed>) {}

pub fn animate_dazed_effect(
time: Res<Time>,
texture_atlases: Res<Assets<TextureAtlas>>,
mut daze_effect_query: Query<
(
Entity,
&mut AnimationTimer,
&mut TextureAtlasSprite,
&Handle<TextureAtlas>,
),
With<DazeAnimation>,
>,
) {
for (_daze_id, mut timer, mut sprite, texture_atlas_handle) in &mut daze_effect_query {
timer.tick(time.delta());
if timer.just_finished() {
let texture_atlas = texture_atlases.get(texture_atlas_handle).unwrap();

sprite.index = (sprite.index + 1) % texture_atlas.textures.len();
}
}
}
21 changes: 21 additions & 0 deletions src/characters/mod.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
use bevy::prelude::*;

use self::{effects::EffectsPlugin, npcs::NPCsPlugin, player::PlayerPlugin};

pub mod effects;
pub mod movement;
pub mod npcs;
pub mod player;

pub struct CharactersPlugin;

impl Plugin for CharactersPlugin {
#[rustfmt::skip]
fn build(&self, app: &mut App) {
app
.add_plugin(NPCsPlugin)
.add_plugin(PlayerPlugin)
.add_plugin(EffectsPlugin)
;
}
}
40 changes: 40 additions & 0 deletions src/characters/movement.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
use bevy::prelude::*;
use bevy_rapier2d::prelude::Velocity;
// use bevy_retrograde::prelude::Velocity;

use crate::TILE_SIZE;

// find the right place to put this component (indicator)
#[derive(Component)]
pub struct CharacterHitbox;

/// Is it a good habit to seperate
/// - Dazed
/// - DazeTimer
/// ?
#[derive(Component)]
pub struct Dazed {
/// should be a non-repeating timer
pub timer: Timer,
}

// #[derive(Component)]
// pub struct DazeTimer {
// /// should be a non-repeating timer
// pub timer: Timer,
// }

#[derive(Component, Deref, DerefMut)]
pub struct Speed(pub f32);

impl Default for Speed {
fn default() -> Self {
Speed(50. * TILE_SIZE)
}
}

#[derive(Bundle)]
pub struct MovementBundle {
pub speed: Speed,
pub velocity: Velocity,
}
Loading

0 comments on commit 7e09606

Please sign in to comment.