even more rust
sprites by @RedCoder09 and @Krunchy0920
Before Width: | Height: | Size: 943 B |
BIN
src/builtin/builtin_data/headband/ogph/Casts.png
Normal file
After Width: | Height: | Size: 447 B |
BIN
src/builtin/builtin_data/headband/ogph/Npc/NpcGuest.png
Normal file
After Width: | Height: | Size: 456 B |
BIN
src/builtin/builtin_data/headband/ogph/Npc/NpcMiza.png
Normal file
After Width: | Height: | Size: 562 B |
BIN
src/builtin/builtin_data/headband/ogph/Npc/NpcRegu.png
Normal file
After Width: | Height: | Size: 621 B |
BIN
src/builtin/builtin_data/headband/plus/casts.png
Normal file
After Width: | Height: | Size: 1.6 KiB |
BIN
src/builtin/builtin_data/headband/plus/npc/npcguest.png
Normal file
After Width: | Height: | Size: 1.5 KiB |
BIN
src/builtin/builtin_data/headband/plus/npc/npcmiza.png
Normal file
After Width: | Height: | Size: 4.1 KiB |
BIN
src/builtin/builtin_data/headband/plus/npc/npcregu.png
Normal file
After Width: | Height: | Size: 3.9 KiB |
|
@ -111,8 +111,76 @@ impl BuiltinFS {
|
||||||
"builtin_data",
|
"builtin_data",
|
||||||
vec![
|
vec![
|
||||||
FSNode::File("buttons.png", include_bytes!("builtin/builtin_data/buttons.png")),
|
FSNode::File("buttons.png", include_bytes!("builtin/builtin_data/buttons.png")),
|
||||||
FSNode::File("crab_band.png", include_bytes!("builtin/builtin_data/crab_band.png")),
|
|
||||||
FSNode::File("triangles.png", include_bytes!("builtin/builtin_data/triangles.png")),
|
FSNode::File("triangles.png", include_bytes!("builtin/builtin_data/triangles.png")),
|
||||||
|
FSNode::Directory(
|
||||||
|
"headband",
|
||||||
|
vec![
|
||||||
|
FSNode::Directory(
|
||||||
|
"ogph",
|
||||||
|
vec![
|
||||||
|
FSNode::File(
|
||||||
|
"Casts.png",
|
||||||
|
include_bytes!("builtin/builtin_data/headband/ogph/Casts.png"),
|
||||||
|
),
|
||||||
|
FSNode::Directory(
|
||||||
|
"Npc",
|
||||||
|
vec![
|
||||||
|
FSNode::File(
|
||||||
|
"NpcGuest.png",
|
||||||
|
include_bytes!(
|
||||||
|
"builtin/builtin_data/headband/ogph/Npc/NpcGuest.png"
|
||||||
|
),
|
||||||
|
),
|
||||||
|
FSNode::File(
|
||||||
|
"NpcMiza.png",
|
||||||
|
include_bytes!(
|
||||||
|
"builtin/builtin_data/headband/ogph/Npc/NpcMiza.png"
|
||||||
|
),
|
||||||
|
),
|
||||||
|
FSNode::File(
|
||||||
|
"NpcRegu.png",
|
||||||
|
include_bytes!(
|
||||||
|
"builtin/builtin_data/headband/ogph/Npc/NpcRegu.png"
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
FSNode::Directory(
|
||||||
|
"plus",
|
||||||
|
vec![
|
||||||
|
FSNode::File(
|
||||||
|
"Casts.png",
|
||||||
|
include_bytes!("builtin/builtin_data/headband/plus/casts.png"),
|
||||||
|
),
|
||||||
|
FSNode::Directory(
|
||||||
|
"Npc",
|
||||||
|
vec![
|
||||||
|
FSNode::File(
|
||||||
|
"NpcGuest.png",
|
||||||
|
include_bytes!(
|
||||||
|
"builtin/builtin_data/headband/plus/npc/npcguest.png"
|
||||||
|
),
|
||||||
|
),
|
||||||
|
FSNode::File(
|
||||||
|
"NpcMiza.png",
|
||||||
|
include_bytes!(
|
||||||
|
"builtin/builtin_data/headband/plus/npc/npcmiza.png"
|
||||||
|
),
|
||||||
|
),
|
||||||
|
FSNode::File(
|
||||||
|
"NpcRegu.png",
|
||||||
|
include_bytes!(
|
||||||
|
"builtin/builtin_data/headband/plus/npc/npcregu.png"
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
FSNode::Directory(
|
FSNode::Directory(
|
||||||
|
|
|
@ -65,13 +65,48 @@ impl GameEntity<()> for Credits {
|
||||||
let y = ((line.cast_id / 13) & 0xff) * 24;
|
let y = ((line.cast_id / 13) & 0xff) * 24;
|
||||||
let rect = Rect::new_size(x, y, 24, 24);
|
let rect = Rect::new_size(x, y, 24, 24);
|
||||||
|
|
||||||
|
if state.more_rust && line.cast_id == 1 {
|
||||||
|
// sue with more rust
|
||||||
|
batch.add_rect_tinted(line.pos_x - 24.0, line.pos_y - 8.0, (200, 200, 255, 255), &rect);
|
||||||
|
} else {
|
||||||
batch.add_rect(line.pos_x - 24.0, line.pos_y - 8.0, &rect);
|
batch.add_rect(line.pos_x - 24.0, line.pos_y - 8.0, &rect);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
batch.draw(ctx)?;
|
batch.draw(ctx)?;
|
||||||
|
|
||||||
|
if state.more_rust {
|
||||||
|
// draw sue's headband separately because rust doesn't let me mutate the texture set multiple times at once
|
||||||
|
|
||||||
|
let headband_spritesheet = {
|
||||||
|
let base = if state.settings.original_textures { "ogph" } else { "plus" };
|
||||||
|
format!("headband/{}/Casts", base)
|
||||||
|
};
|
||||||
|
|
||||||
|
let batch = state.texture_set.get_or_load_batch(ctx, &state.constants, headband_spritesheet.as_str())?;
|
||||||
|
|
||||||
for line in &state.creditscript_vm.lines {
|
for line in &state.creditscript_vm.lines {
|
||||||
|
if line.cast_id != 1 {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
let x = (line.cast_id % 13) * 24;
|
||||||
|
let y = ((line.cast_id / 13) & 0xff) * 24;
|
||||||
|
let rect = Rect::new_size(x, y, 24, 24);
|
||||||
|
|
||||||
|
batch.add_rect(line.pos_x - 24.0, line.pos_y - 8.0, &rect);
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
batch.draw(ctx)?;
|
||||||
|
}
|
||||||
|
|
||||||
|
for line in &state.creditscript_vm.lines {
|
||||||
|
let text =
|
||||||
|
if state.more_rust { line.text.replace("Sue Sakamoto", "Crabby Sue") } else { line.text.clone() };
|
||||||
|
|
||||||
state.font.draw_text_with_shadow(
|
state.font.draw_text_with_shadow(
|
||||||
line.text.chars(),
|
text.chars(),
|
||||||
line.pos_x,
|
line.pos_x,
|
||||||
line.pos_y,
|
line.pos_y,
|
||||||
&state.constants,
|
&state.constants,
|
||||||
|
|
|
@ -1424,6 +1424,14 @@ impl EngineConstants {
|
||||||
"Face4" => (288, 240), // switch
|
"Face4" => (288, 240), // switch
|
||||||
"Face5" => (288, 240), // switch
|
"Face5" => (288, 240), // switch
|
||||||
"Fade" => (256, 32),
|
"Fade" => (256, 32),
|
||||||
|
"headband/ogph/Casts" => (320, 240),
|
||||||
|
"headband/ogph/Npc/NpcGuest" => (320, 184),
|
||||||
|
"headband/ogph/Npc/NpcMiza" => (320, 240),
|
||||||
|
"headband/ogph/Npc/NpcRegu" => (320, 240),
|
||||||
|
"headband/plus/Casts" => (320, 240),
|
||||||
|
"headband/plus/Npc/NpcGuest" => (320, 184),
|
||||||
|
"headband/plus/Npc/NpcMiza" => (320, 240),
|
||||||
|
"headband/plus/Npc/NpcRegu" => (320, 240),
|
||||||
"ItemImage" => (256, 128),
|
"ItemImage" => (256, 128),
|
||||||
"Loading" => (64, 8),
|
"Loading" => (64, 8),
|
||||||
"MyChar" => (200, 64),
|
"MyChar" => (200, 64),
|
||||||
|
|
|
@ -222,6 +222,11 @@ impl NPC {
|
||||||
fn is_sue(&self) -> bool {
|
fn is_sue(&self) -> bool {
|
||||||
[42, 92, 280, 284].contains(&self.npc_type)
|
[42, 92, 280, 284].contains(&self.npc_type)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn get_headband_spritesheet(&self, state: &SharedGameState, texture_name: &str) -> String {
|
||||||
|
let base_dir = if state.settings.original_textures { "ogph" } else { "plus" };
|
||||||
|
format!("headband/{}/{}", base_dir, texture_name)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl GameEntity<([&mut Player; 2], &NPCList, &mut Stage, &mut BulletManager, &mut Flash, &mut BossNPC)> for NPC {
|
impl GameEntity<([&mut Player; 2], &NPCList, &mut Stage, &mut BulletManager, &mut Flash, &mut BossNPC)> for NPC {
|
||||||
|
@ -650,11 +655,9 @@ impl GameEntity<([&mut Player; 2], &NPCList, &mut Stage, &mut BulletManager, &mu
|
||||||
return Ok(());
|
return Ok(());
|
||||||
}
|
}
|
||||||
|
|
||||||
let batch = state.texture_set.get_or_load_batch(
|
let texture_ref = state.npc_table.get_texture_ref(self.spritesheet_id);
|
||||||
ctx,
|
|
||||||
&state.constants,
|
let batch = state.texture_set.get_or_load_batch(ctx, &state.constants, &*texture_ref)?;
|
||||||
&*state.npc_table.get_texture_ref(self.spritesheet_id),
|
|
||||||
)?;
|
|
||||||
|
|
||||||
let off_x =
|
let off_x =
|
||||||
if self.direction == Direction::Left { self.display_bounds.left } else { self.display_bounds.right } as i32;
|
if self.direction == Direction::Left { self.display_bounds.left } else { self.display_bounds.right } as i32;
|
||||||
|
@ -678,9 +681,10 @@ impl GameEntity<([&mut Player; 2], &NPCList, &mut Stage, &mut BulletManager, &mu
|
||||||
batch.draw(ctx)?;
|
batch.draw(ctx)?;
|
||||||
}
|
}
|
||||||
|
|
||||||
if self.npc_type == 42 && state.more_rust {
|
if self.is_sue() && state.more_rust {
|
||||||
// draw crab headband
|
// draw crab headband
|
||||||
let batch = state.texture_set.get_or_load_batch(ctx, &state.constants, "crab_band")?;
|
let headband_spritesheet = self.get_headband_spritesheet(state, &*texture_ref);
|
||||||
|
let batch = state.texture_set.get_or_load_batch(ctx, &state.constants, headband_spritesheet.as_str())?;
|
||||||
batch.add_rect(final_x, final_y, &self.anim_rect);
|
batch.add_rect(final_x, final_y, &self.anim_rect);
|
||||||
batch.draw(ctx)?;
|
batch.draw(ctx)?;
|
||||||
}
|
}
|
||||||
|
|