From 7ad05172b0f67b218ee53b6253b3033775793673 Mon Sep 17 00:00:00 2001 From: Ben Frankel Date: Fri, 8 Dec 2023 02:39:44 -0800 Subject: [PATCH] Support sprite packs --- assets/image/entity/1-bit/Clothing.png | Bin 0 -> 2209 bytes assets/image/entity/1-bit/Creatures.png | Bin 0 -> 5094 bytes assets/image/entity/1-bit/Food.png | Bin 0 -> 1770 bytes .../entity/1-bit/Gems-Jewels-and-Money.png | Bin 0 -> 687 bytes assets/image/entity/1-bit/Instruments.png | Bin 0 -> 491 bytes assets/image/entity/1-bit/Jewelry.png | Bin 0 -> 1169 bytes assets/image/entity/1-bit/Misc-Future.png | Bin 0 -> 736 bytes assets/image/entity/1-bit/Misc.png | Bin 0 -> 1018 bytes assets/image/entity/1-bit/People.png | Bin 0 -> 5212 bytes assets/image/entity/1-bit/Potions.png | Bin 0 -> 502 bytes assets/image/entity/1-bit/Tools.png | Bin 0 -> 1333 bytes assets/image/entity/1-bit/UI.png | Bin 0 -> 4433 bytes assets/image/entity/1-bit/Weapons.png | Bin 0 -> 2622 bytes src/simulation.rs | 38 +++++--- src/simulation/sprite_pack.rs | 89 ++++++++++++++++++ src/state/loading_screen.rs | 2 + src/state/title_screen.rs | 2 + src/upgrade.rs | 59 ++++++------ 18 files changed, 144 insertions(+), 46 deletions(-) create mode 100644 assets/image/entity/1-bit/Clothing.png create mode 100644 assets/image/entity/1-bit/Creatures.png create mode 100644 assets/image/entity/1-bit/Food.png create mode 100644 assets/image/entity/1-bit/Gems-Jewels-and-Money.png create mode 100644 assets/image/entity/1-bit/Instruments.png create mode 100644 assets/image/entity/1-bit/Jewelry.png create mode 100644 assets/image/entity/1-bit/Misc-Future.png create mode 100644 assets/image/entity/1-bit/Misc.png create mode 100644 assets/image/entity/1-bit/People.png create mode 100644 assets/image/entity/1-bit/Potions.png create mode 100644 assets/image/entity/1-bit/Tools.png create mode 100644 assets/image/entity/1-bit/UI.png create mode 100644 assets/image/entity/1-bit/Weapons.png create mode 100644 src/simulation/sprite_pack.rs diff --git a/assets/image/entity/1-bit/Clothing.png b/assets/image/entity/1-bit/Clothing.png new file mode 100644 index 0000000000000000000000000000000000000000..355894349cd7e841ddcd5cb5e01c5598fb4a58ad GIT binary patch literal 2209 zcmV;S2wwMzP) z*_PuV3`FCc{Qoa|UYZ=WT1$z=!IQc#oj_TLMc{ywJ|6!e=Xsv(^>G}>ZuVxdg%dM5 z&+|NvO zK7cokcCs=RWw*zbk?Luz4%P$B8tGOY^k=WE?2K%^i*!=^>=|)r2Uo6(^1M;o8%byc zw=|jW**$*Hud5)}z1O%_0gX4xwNB<$blTZ$lxdx3tI~kTfbsrDc1C87$me(734l}* zohp!PW;Q~vZ&fP3AQ7CA?m_m3{QrcUQb*cD&m3MFxe#l1S{do-x!7(uML$kv12(Vdm&A@97=J7UBq zq}-QwATw$iUaixWj~4j|WMPWR|!qeN5c z=#-{4*7T;)ZIjhEicT4US)Jb3XOR@W&#upCgTs3tX|E#kr^lAZ%5upjl-HzLb2%9! zy`9c(TcdQc4(Kioy_;jlU5EM1N%Wb;GsI52mOmXAp>I{KX_Q<;spH5#u;XqDJMN~u zJI=bf7)c|95JCtcgb+dqA%u_u@MFhF5SgDd%GRBR zoTPZZWgWcqJPvufSZa}c{Wl_u_KH13heRAo*1_ga`_3Nu2w9ohH^j#*;?TiR(Pa@= zu@~V+oD9*(0IEZ^kw$i!rL)!|E8?Ub&8RMlxT?Jf^V>RTm{+GlWDty&E7Os+Eu*4C zBCcxh@vtMa^d$2Poz`Ae?j3d30PUGp$wq`D9}RU+hm06YH&X7Zx_m;X^^7(`2qA3WWYuJmt5-OzIpGeIlzZFq;q%f18t z>$KK5!L@YnX<(r*BmQ0KOXEE4pPhVVXFOiMj*v(vM+|zVG^(5J-<9={WqIYg55#6^ za-qz0(KNU!ZKi*%@s1xNU3)*O^YriQJcoaYlF_Tv^$0<3fKVOcUo~yizo-q+wz6zR z<#zq6&B_gg9I-uR^@5f+LnrgJ&WdPjD)b`DYrk!tw#wF!nIpQYiy|wkv$wt>x~yHe zb8=^03svhvJq=K|hi;3V6YA=^ZFWu~qMI9Qp}$%;QlDO5p5FYb4M<(|I(na_Te`<1 z_$;F;BXzQjNGHqb(aAK=f7F+fPG&@nr*%4nJ)PD@x~SZY%rDQ+%rD(Wkv(tO@qCSR zS-W(7j;n-vX}s&va-xCN(mb6`v!bNZE}1Ty>TfZkt2%Vbs@TiYW}@pLeOp~NA%qY@ z2qAf`H)5E!XPWt+KD-O5+ecUa;A-6fv^1^#7JHx2apz=$Jx@Eb zc4g&q=VXGt^9QYy>GJ)duyoCav?rsGJ0}yU`e&_OT4xP3*`eGy*|@$IEsr}Vj%Jlk zPM41dcTUPWZz@`?dpzdsoDf0?A%qY@2qAYkZE?{0g? z57sXDH`%*d2OTL$Bc9gNSjQHYHaef0ZEuCHbMnr(Y97 zu7*1&ch`AyG}HD>$;D~9^P&ij;LeFEXSELTPv_~^gb+dqA%qY@2qAv>4SppBR5T1WLfui~9N ze*^E1LmCim_H=+hlw5_x-;bmL`O7Qi-P+1O)U91&_=oU jx9QLhL8E5HpxKpwNyqFN4Y}gv00000NkvXXu0mjfEkbB= literal 0 HcmV?d00001 diff --git a/assets/image/entity/1-bit/Creatures.png b/assets/image/entity/1-bit/Creatures.png new file mode 100644 index 0000000000000000000000000000000000000000..97d64e730e9020d0330922a86b2b5fc40444d930 GIT binary patch literal 5094 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 IM6N<$f|&zLC;$Ke literal 0 HcmV?d00001 diff --git a/assets/image/entity/1-bit/Food.png b/assets/image/entity/1-bit/Food.png new file mode 100644 index 0000000000000000000000000000000000000000..a682f393355cc16b57fb34dd4d5dca87b1f6eced GIT binary patch literal 1770 zcmV+9KItAaV(hHPZ#Q+-x;bp1*XCM$Ow zmk-wEjsyhabOP3u$>v;Lqk-y-uk`OK`$pwu-WQs@-|zS5^ZC5r?{~Iw7n_Vt9+I2& zW*KoTbC9fUOxch0D1O%$aZjCfdm#FxI%70G!yCmneNjm?ATLmkM{_KgRG=bbohns1 zC)=lFI<_eevRNe)`aZ%_`XVP6j?80wn&GY3FAS^*Cs2`K7C$1ygaWs4v!@XI`Hl-;`+*tgJFCGyUkw;rfUr59+lY z9^%fnF=xCj<@>gorhDc+6p!nAJ~vhnS*#vl|zZKp=v9#-l((kom*X1fLFRZ^3H&-JP7bkMyyRt4Cnt7yclqQ;QcTfnWV)-0IvVWVEn3CNDE zqo{6!is#BZ1780!6$dLPqeH0_%{V~ySEIp@uV*H!n~X;vG_u(pbLE`@ZxwZA73er? zwCbX&fszPS81z}$;UunVbv|9yszxjkZ(UCnR7di9?i4-};N zdp;<{S@D`kJ@IZj+)C;MDSKLHypDeKndx5nw&l0t+YA4g-RxTG9NwyHE!u)~qWP+l zqDooaE-0X)FXGSq8QE~b!?!?a6U}_GVexrmK>A zXjc&xbgXi*dBus<(UphRAgBOVZ30_|u5zW@vGKw?WDqc?RuxTgJHguF%-E#Xp^ECr zbp!i?hoPX^3#e!8u5~NhUUpqUc;Ui@{qYPK;W=v~cg9v_k9z1Dv1O&LzZtt<{hhwe z<*mHZod=(2)Am{Mx;Big``_^P8~(`Qtg<0w;q0JCc$PoMw5DNyS(}AjtOfUN$$Jv#R zf*je9_iuP9@L$D+oV;s$V=7qJY|!6=p7!@kH#ziRCY4o zA>EyQbxvF{^1Wf$YF;LYOg zpHSll)%!!&s9a%Y+J#)v7(d&Oc+r+@Bh#<^5p~9&`E%6a9B|x&@}I*)`keEv&e`S7 z;*pi*Y)6~PJ&RlNnXEj|4wsFiF;oTBTBo;D^Qf;wG7-;_yE0&^qH#vNDryeSYU5SK zjXX7yfmS6H`lIeIEtu1?o>*XGKX zU3qccY^6j#aoU8)ALXsUl2;0&2QaGZ$VxPlxQgGAw>n@}6^&2e53wZ3t99013jhEB M07*qoM6N<$f`blzR{#J2 literal 0 HcmV?d00001 diff --git a/assets/image/entity/1-bit/Gems-Jewels-and-Money.png b/assets/image/entity/1-bit/Gems-Jewels-and-Money.png new file mode 100644 index 0000000000000000000000000000000000000000..b3e43ceaac6861cfcb77838c78794388a5049598 GIT binary patch literal 687 zcmV;g0#N;lP)3^cC%|I6eOQkq5^Sj0p{Upxb?4L4gR*LCm+g?_2E*58g&O0Bh)Qc7>u^P7$4 zPfMh6E#6-NYeTd=Z)!l3Z{H
9b>B}8Ley!LF6OO#O!G+xVzKG}LPF{vLDKwGO{ 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 literal 0 HcmV?d00001 diff --git a/assets/image/entity/1-bit/People.png b/assets/image/entity/1-bit/People.png new file mode 100644 index 0000000000000000000000000000000000000000..33e6b855529204708130b07790da6238565dac9a GIT binary patch literal 5212 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 literal 0 HcmV?d00001 diff --git a/assets/image/entity/1-bit/Tools.png b/assets/image/entity/1-bit/Tools.png new file mode 100644 index 0000000000000000000000000000000000000000..f0319e86c87d1b64cd48282348b35bd12ed96be5 GIT binary patch literal 1333 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 .register_type::() + .add_plugins(sprite_pack::SpritePackPlugin) .add_event::() .init_resource::() .init_resource::() @@ -46,10 +49,9 @@ pub struct Simulation { pub lines: f64, pub entities: f64, pub tech_debt: f64, - - /// Fun factor, determines the score. + /// Fun score, affects the submission's results. pub fun_score: f64, - /// Presentation factor, determines the score. + /// Presentation factor, affects the submissions' results. pub presentation_score: f64, /// Minimum size for new entities. @@ -58,6 +60,8 @@ pub struct Simulation { pub entity_size_max: f32, /// List of colors that the new entities can have. pub entity_colors: Vec, + /// The sprite pack to use. + pub sprite_pack: SpritePack, /// Minimum offset distance for entities on spawn. pub spawn_offset_min: f32, @@ -74,12 +78,15 @@ impl Default for Simulation { tech_debt: 0.0, fun_score: 0.0, presentation_score: 0.0, + entity_size_min: 8.0, entity_size_max: 8.0, entity_colors: vec![ Color::rgba(0.0, 0.0, 0.0, 1.0), Color::rgba(1.0, 1.0, 1.0, 1.0), ], + sprite_pack: default(), + spawn_offset_min: 0.0, spawn_offset_max: 2.0, } @@ -99,8 +106,9 @@ fn spawn_entities( mut commands: Commands, mut events: EventReader, root: Res, - mut entity_cap_query: Query<&mut OverflowDespawnQueue, With>, mut simulation: ResMut, + sprite_pack_assets: Res, + mut entity_cap_query: Query<&mut OverflowDespawnQueue, With>, ) { let mut rng = rand::thread_rng(); for event in events.read() { @@ -119,24 +127,24 @@ fn spawn_entities( let position = (event.position + offset).extend(0.0); let size = rng.gen_range(simulation.entity_size_min..=simulation.entity_size_max); + let size = Vec2::splat(size); let entity = commands .spawn(( Name::new("Entity"), - SpriteBundle { - sprite: Sprite { - color: *simulation.entity_colors.choose(&mut rng).unwrap(), - custom_size: Some(vec2(size, size)), - ..default() - }, - transform: Transform::from_translation(position), - ..default() - }, + SpatialBundle::from_transform(Transform::from_translation(position)), Velocity(velocity), WrapWithinSceneView, )) .set_parent(root.world) .id(); + simulation.sprite_pack.apply( + &mut commands, + entity, + &sprite_pack_assets, + size, + &mut rng, + ); for mut despawn_queue in &mut entity_cap_query { despawn_queue.push(entity); diff --git a/src/simulation/sprite_pack.rs b/src/simulation/sprite_pack.rs new file mode 100644 index 0000000..9695494 --- /dev/null +++ b/src/simulation/sprite_pack.rs @@ -0,0 +1,89 @@ +use bevy::prelude::*; +use bevy_asset_loader::prelude::*; +use rand::seq::SliceRandom; +use rand::Rng; + +pub struct SpritePackPlugin; + +impl Plugin for SpritePackPlugin { + fn build(&self, app: &mut App) { + app.register_type::() + .init_collection::(); + } +} + +pub enum SpritePack { + None(Vec), + OneBit(Vec<(Color, usize)>), +} + +impl Default for SpritePack { + fn default() -> Self { + Self::None(vec![Color::BLACK, Color::WHITE]) + } +} + +impl SpritePack { + pub fn add_skin(&mut self, mut rng: impl Rng) { + let color = Color::Rgba { + red: rng.gen_range(0.0..1.0), + green: rng.gen_range(0.0..1.0), + blue: rng.gen_range(0.0..1.0), + alpha: 1.0, + }; + match self { + Self::None(colors) => { + colors.push(color); + }, + // TODO: Curate the tiles. + // FIXME: Prevent duplicates. + Self::OneBit(tiles) => tiles.push((color, rng.gen_range(0..=5))), + } + } + + pub fn apply( + &self, + commands: &mut Commands, + entity: Entity, + assets: &SpritePackAssets, + size: Vec2, + mut rng: impl Rng, + ) { + let (color, index) = match self { + Self::None(colors) => { + commands.entity(entity).insert(Sprite { + color: *colors.choose(&mut rng).unwrap(), + custom_size: Some(size), + ..default() + }); + return; + }, + Self::OneBit(tiles) => *tiles.choose(&mut rng).unwrap(), + }; + let handle = match self { + Self::None(..) => unreachable!(), + Self::OneBit(..) => assets.one_bit_food.clone(), + }; + + commands.entity(entity).insert(( + TextureAtlasSprite { + color, + index, + custom_size: Some(size), + ..default() + }, + handle, + )); + } +} + +#[derive(AssetCollection, Resource, Reflect, Default)] +#[reflect(Resource)] +pub struct SpritePackAssets { + #[asset(texture_atlas(tile_size_x = 10.0, tile_size_y = 10.0, rows = 5, columns = 17))] + #[asset(path = "image/entity/1-bit/Food.png")] + pub one_bit_food: Handle, + #[asset(texture_atlas(tile_size_x = 10.0, tile_size_y = 10.0, rows = 11, columns = 13))] + #[asset(path = "image/entity/1-bit/Weapons.png")] + pub one_bit_weapons: Handle, +} diff --git a/src/state/loading_screen.rs b/src/state/loading_screen.rs index 1bc9399..59d79d7 100644 --- a/src/state/loading_screen.rs +++ b/src/state/loading_screen.rs @@ -7,6 +7,7 @@ use serde::Deserialize; use serde::Serialize; use crate::config::Config; +use crate::simulation::SpritePackAssets; use crate::state::editor_screen::EditorScreenAssets; use crate::state::AppState::*; use crate::ui::FontSize; @@ -20,6 +21,7 @@ impl Plugin for LoadingScreenStatePlugin { app.register_type::() .add_loading_state(LoadingState::new(LoadingScreen)) .add_collection_to_loading_state::<_, EditorScreenAssets>(LoadingScreen) + .add_collection_to_loading_state::<_, SpritePackAssets>(LoadingScreen) .add_plugins(ProgressPlugin::new(LoadingScreen).continue_to(EditorScreen)) .add_systems(OnEnter(LoadingScreen), enter_loading) .add_systems(OnExit(LoadingScreen), exit_loading) diff --git a/src/state/title_screen.rs b/src/state/title_screen.rs index 0be0e3b..82436a8 100644 --- a/src/state/title_screen.rs +++ b/src/state/title_screen.rs @@ -7,6 +7,7 @@ use serde::Deserialize; use serde::Serialize; use crate::config::Config; +use crate::simulation::SpritePackAssets; use crate::state::editor_screen::EditorScreenAssets; use crate::state::AppState::*; use crate::ui::FontSize; @@ -24,6 +25,7 @@ impl Plugin for TitleScreenStatePlugin { .init_collection::() .add_loading_state(LoadingState::new(TitleScreen)) .add_collection_to_loading_state::<_, EditorScreenAssets>(TitleScreen) + .add_collection_to_loading_state::<_, SpritePackAssets>(TitleScreen) .add_plugins(ProgressPlugin::new(TitleScreen)) .add_systems(OnEnter(TitleScreen), enter_title_screen) .add_systems(OnExit(TitleScreen), exit_title_screen); diff --git a/src/upgrade.rs b/src/upgrade.rs index 82c5dcd..e413415 100644 --- a/src/upgrade.rs +++ b/src/upgrade.rs @@ -6,7 +6,6 @@ use bevy::ecs::system::SystemId; use bevy::prelude::*; use rand::seq::SliceRandom; use rand::thread_rng; -use rand::Rng; use strum::EnumCount; use crate::config::Config; @@ -16,6 +15,7 @@ use crate::simulation::PassiveCodeTyper; use crate::simulation::PassiveEntitySpawner; use crate::simulation::Simulation; use crate::simulation::SpawnEvent; +use crate::simulation::SpritePack; use crate::state::editor_screen::spawn_editor_screen; use crate::state::editor_screen::SceneView; use crate::state::editor_screen::SceneViewBounds; @@ -293,7 +293,7 @@ fn load_upgrade_sequence(mut commands: Commands) { vec![Inspiration], vec![VelocityPlugin], vec![ImportLibrary, SplashOfLifePlugin], - vec![Coffee], + vec![Coffee, OneBitSpritePack], vec![Brainstorm], ])); } @@ -339,27 +339,30 @@ generate_upgrade_list!( // Presentation score + OneBitSpritePack: Upgrade { + name: "1-bit Sprite Pack".to_string(), + desc: "Downloads a 1-bit sprite pack for your entities. Makes your game prettier.".to_string(), + presentation_score: 10.0, + base_cost: 25.0, + install: Some(world.register_system(| + mut simulation: ResMut + | { + simulation.sprite_pack = SpritePack::OneBit(vec![]); + simulation.sprite_pack.add_skin(&mut thread_rng()); + })), + ..default() + }, EntitySkinPlugin: Upgrade { name: "EntitySkinPlugin".to_string(), desc: "Introduces a new entity skin with a random color. Makes your game prettier.".to_string(), - presentation_score: 5.0, + presentation_score: 4.0, base_cost: 10.0, cost_scale_factor: 1.2, weight: 1.0, remaining: 5, - install: Some( - world.register_system(|mut simulation: ResMut| { - let mut rng = rand::thread_rng(); - simulation.entity_colors.push( - Color::Rgba { - red: rng.gen_range(0.0..1.0), - green: rng.gen_range(0.0..1.0), - blue: rng.gen_range(0.0..1.0), - alpha: 1.0, - } - ); - }), - ), + install: Some(world.register_system(|mut simulation: ResMut| { + simulation.sprite_pack.add_skin(&mut thread_rng()); + })), ..default() }, EntitySizePlugin: Upgrade { @@ -370,11 +373,9 @@ generate_upgrade_list!( cost_scale_factor: 1.2, weight: 1.0, remaining: 2, - install: Some( - world.register_system(|mut simulation: ResMut| { - simulation.entity_size_max += 4.0; - }), - ), + install: Some(world.register_system(|mut simulation: ResMut| { + simulation.entity_size_max += 4.0; + })), ..default() }, @@ -674,11 +675,9 @@ generate_upgrade_list!( name: "Brainstorm".to_string(), desc: "Adds 1 extra upgrade slot.".to_string(), tech_debt: 0.0, - install: Some( - world.register_system(|mut sequence: ResMut| { - sequence.slots += 1; - }), - ), + install: Some(world.register_system(|mut sequence: ResMut| { + sequence.slots += 1; + })), ..default() }, DesignDocument: Upgrade { @@ -688,11 +687,9 @@ generate_upgrade_list!( base_cost: 20.0, upgrade_min: 7, weight: 2.5, - install: Some( - world.register_system(|mut sequence: ResMut| { - sequence.slots += 1; - }), - ), + install: Some(world.register_system(|mut sequence: ResMut| { + sequence.slots += 1; + })), ..default() }, );