From 2423976797c8c76d90e641dc28599460cc8e511e Mon Sep 17 00:00:00 2001 From: aratama <16192627+aratama@users.noreply.github.com> Date: Sun, 12 Jan 2025 02:40:10 +0900 Subject: [PATCH] flying witch animation --- assets/entity/witch.aseprite | Bin 7407 -> 8266 bytes assets/image/opening.aseprite | Bin 3429 -> 34955 bytes ...ening.aseprite => opening_sketch.aseprite} | Bin src/asset_credit.rs | 14 ++- src/level/entities.rs | 6 +- src/message.rs | 70 +++++++----- src/page/opening.rs | 106 +++++++----------- 7 files changed, 96 insertions(+), 100 deletions(-) rename misc/{opening.aseprite => opening_sketch.aseprite} (100%) diff --git a/assets/entity/witch.aseprite b/assets/entity/witch.aseprite index 0697c1660fe92ef3691f897dbcfc90f06a637766..fa05752d9addfd880a987ea52314e67c93288794 100644 GIT binary patch delta 860 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 P7gnuA(I0N8UHN|iKlJ${ delta 716 zcmeC4$n;c-DV293QyuS99tMVA9|agv7#J7?CidRlyqHmhh5ZJQ$Ev_MIjizweFGDS z&BPGLAkOd~$cBJ+hIWREIdAWH7cFrRaB;l*|I(zdNj{qdBeQmKFS2`QuJB2>vA@5z zrffnT+r7(+8PBd!ym%=7((E@nwZDxoMZZ<3eJpoLdYxMBdF>_Ub7Ozim3!pd%>J@h z=+f+dz1sPLOY#k7eX(_$vajAVs_MVwlKd$X?$xNhjJ~V6_iN83^W9NZ_eGcFSG0av zrtNuu)ABFVw7u?siGBIEY{I^e+Lva(RjGXqvPPr!bNUkVTamxM>AuXB*xdg`t;T!% zhu|viI&brj6Ye$4GF$PYNi6olBJQXyj;`WcARJz;T?<^LLrNUG%~sR{g>nNfvg+Pi z08^CF+y&MK6lN0z>gCk}%0cx2O_2@(6D5qWuzLKdj^BNcum?AgSoUcT$g+25wzD^h(K9jCbWCD$eMJ-|qj zT$*3D{L3|C&-+@6dw=p=GWYU+Z@=h^uiNB($2l&UOT_-N<9vBGee%BRvX`XK>(%ZD zMt`jDuX(mh%) -> AssetCredit { if let Some(path) = handle.path() { - match path + let name = path .path() .file_stem() .and_then(|s| s.to_str()) - .unwrap_or("") - { + .unwrap_or(""); + + match name { // 拠点 "茫漠たる庭" => AssetCredit { authoer: "のる", @@ -36,6 +37,13 @@ pub fn asset_to_credit(handle: &Handle) -> AssetCredit { appendix: "", }, + // オープニング + "風が吹く1" => AssetCredit { + authoer: "", + title: "", + appendix: "", + }, + // 通常 "荒れ地の先へ" => AssetCredit { authoer: "松浦洋介", diff --git a/src/level/entities.rs b/src/level/entities.rs index e5ea2340..b70ca3e0 100644 --- a/src/level/entities.rs +++ b/src/level/entities.rs @@ -35,9 +35,10 @@ use crate::entity::shop::spawn_shop_door; use crate::entity::stone_lantern::spawn_stone_lantern; use crate::entity::web::spawn_web; use crate::hud::life_bar::LifeBarResource; -use crate::message::HELLO; +use crate::message::HELLO_RABBIT_0; use crate::message::HELLO_RABBIT_1; use crate::message::HELLO_RABBIT_2; +use crate::message::HELLO_RABBIT_3; use crate::message::MULTIPLAY; use crate::message::RESERCH_RABBIT_0; use crate::message::RESERCH_RABBIT_1; @@ -366,9 +367,10 @@ pub fn spawn_entity( MessageRabbit { messages: vec![ Act::BGM(Some(assets.saihate.clone())), - Act::Speech(HELLO.to_string()), + Act::Speech(HELLO_RABBIT_0.to_string()), Act::Speech(HELLO_RABBIT_1.to_string()), Act::Speech(HELLO_RABBIT_2.to_string()), + Act::Speech(HELLO_RABBIT_3.to_string()), ], }, MessageRabbitInnerSensor, diff --git a/src/message.rs b/src/message.rs index e8865c03..ef88dd51 100644 --- a/src/message.rs +++ b/src/message.rs @@ -185,44 +185,56 @@ pub const SORT: Dict<&'static str> = Dict { ru: "Сортировать", }; -pub const HELLO: Dict<&'static str> = Dict { +pub const HELLO_RABBIT_0: Dict<&'static str> = Dict { ja: "おや、きみは魔法使いだね。ここはぼくらの商人キャンプだよ。来客は歓迎さ。", - en: "Oh, you are a wizard. This is our merchant camp. Visitors are welcome.", - zh_cn: "哦,你是个巫师。这是我们的商人营地。欢迎来访。", - zh_tw: "哦,你是個巫師。這是我們的商人營地。歡迎來訪。", + en: "Oh, you are a mage. This is our merchant camp. Visitors are welcome.", + zh_cn: "哦,你是一个法师。这是我们的商人营地。欢迎来访。", + zh_tw: "哦,你是一個法師。這是我們的商人營地。歡迎來訪。", es: "Oh, eres un mago. Este es nuestro campamento de comerciantes. Los visitantes son bienvenidos.", - fr: "Oh, vous êtes un sorcier. C'est notre camp de marchands. Les visiteurs sont les bienvenus.", + fr: "Oh, vous êtes un mage. C'est notre camp de marchands. Les visiteurs sont les bienvenus.", pt: "Oh, você é um mago. Este é o nosso acampamento de comerciantes. Visitantes são bem-vindos.", - de: "Oh, du bist ein Zauberer. Dies ist unser Händlerlager. Besucher sind willkommen.", - ko: "오, 당신은 마법사군요. 여기는 우리 상인 캠프입니다. 방문객을 환영합니다.", - ru: "О, вы волшебник. Это наш лагерь торговцев. Посетители приветствуются.", - + de: "Oh, du bist ein Magier. Dies ist unser Händlerlager. Besucher sind willkommen.", + ko: "오, 당신은 마법사군요. 여기는 우리의 상인 캠프입니다. 방문객을 환영합니다.", + ru: "О, вы маг. Это наш лагерь торговцев. Посетители приветствуются.", }; pub const HELLO_RABBIT_1: Dict<&'static str> = Dict { - ja: "きみも古代の呪文を探しに来たんだろう?この島に来る魔法使いはみんなそうさ。迷宮に行きたいなら入り口はこの奥だよ。", - en: "You came to find ancient spells too, didn't you? Every wizard who comes to this island does. If you want to go to the labyrinth, the entrance is further in.", - zh_cn: "你也是来寻找古代咒语的吧?每个来到这个岛的巫师都是。如果你想去迷宫,入口在里面。", - zh_tw: "你也是來尋找古代咒語的吧?每個來到這個島的巫師都是。如果你想去迷宮,入口在裡面。", - es: "¿También viniste a buscar hechizos antiguos, verdad? Todos los magos que vienen a esta isla lo hacen. Si quieres ir al laberinto, la entrada está más adentro.", - fr: "Vous êtes venu chercher des sorts anciens, n'est-ce pas ? Tous les sorciers qui viennent sur cette île le font. Si vous voulez aller dans le labyrinthe, l'entrée est plus loin.", - pt: "Você também veio procurar feitiços antigos, não é? Todo mago que vem a esta ilha faz isso. Se você quiser ir ao labirinto, a entrada está mais adiante.", - de: "Du bist auch hier, um alte Zauber zu finden, nicht wahr? Jeder Zauberer, der auf diese Insel kommt, tut das. Wenn du in das Labyrinth gehen willst, ist der Eingang weiter drinnen.", - ko: "너도 고대 주문을 찾으러 온 거지? 이 섬에 오는 마법사들은 모두 그래. 미로에 가고 싶다면 입구는 더 안쪽에 있어.", - ru: "Ты тоже пришел искать древние заклинания, не так ли? Каждый волшебник, который приходит на этот остров, делает это. Если хочешь попасть в лабиринт, вход дальше." + ja: "通りすがりに大鴉に襲われた?それは災難だったね。おそらくはこの島に住む『漆黒の魔女』の使い魔のしわざだろう。", + en: "You were attacked by a large raven on the way? That's unfortunate. It was probably the work of the 'Black Witch' who lives on this island.", + zh_cn: "你在路上被一只大乌鸦袭击了?那真是不幸。可能是住在这个岛上的“黑女巫”的使魔干的。", + zh_tw: "你在路上被一隻大烏鴉襲擊了?那真是不幸。可能是住在這個島上的“黑女巫”的使魔幹的。", + es: "¿Fuiste atacado por un gran cuervo en el camino aquí? Eso es desafortunado. Probablemente fue obra de la 'Bruja Negra' que vive en esta isla.", + fr: "Vous avez été attaqué par un grand corbeau en venant ici ? C'est malheureux. C'était probablement l'œuvre de la 'Sorcière Noire' qui vit sur cette île.", + pt: "Você foi atacado por um grande corvo no caminho para cá? Isso é lamentável. Provavelmente foi obra da 'Bruxa Negra' que vive nesta ilha.", + de: "Wurden Sie auf dem Weg hierher von einem großen Raben angegriffen? Das ist bedauerlich. Es war wahrscheinlich das Werk der 'Schwarzen Hexe', die auf dieser Insel lebt.", + ko: "여기 오는 길에 큰 까마귀에게 공격당했어? 그것 참 불운하군. 아마도 이 섬에 사는 '검은 마녀'의 소행일 거야.", + ru: "Тебя по пути сюда атаковал большой ворон? Это неудача. Вероятно, это дело рук 'Черной Ведьмы', которая живет на этом острове." }; pub const HELLO_RABBIT_2: Dict<&'static str> = Dict { - ja: "でもその前に、ぼくらの店に立ち寄るといい。迷宮で拾った呪文を売っているんだ。", - en: "But before that, you should stop by our shop. We sell spells picked up in the labyrinth.", - zh_cn: "但在那之前,你应该先去我们的商店看看。我们卖的是在迷宫里捡到的咒语。", - zh_tw: "但在那之前,你應該先去我們的商店看看。我們賣的是在迷宮裡撿到的咒語。", - es: "Pero antes de eso, deberías pasar por nuestra tienda. Vendemos hechizos recogidos en el laberinto.", - fr: "Mais avant cela, vous devriez passer par notre boutique. Nous vendons des sorts ramassés dans le labyrinthe.", - pt: "Mas antes disso, você deve passar pela nossa loja. Vendemos feitiços encontrados no labirinto.", - de: "Aber vorher solltest du in unserem Laden vorbeischauen. Wir verkaufen Zauber, die im Labyrinth gefunden wurden.", - ko: "하지만 그 전에 우리 가게에 들러봐. 우리는 미로에서 주운 주문을 팔고 있어.", - ru: "Но прежде чем идти, загляни в наш магазин. Мы продаем заклинания, найденные в лабиринте.", + ja: "我々では折れた箒の修理はできないな。この島の迷宮に行けば、修理の役に立つ呪文があるかもしれない。迷宮の入り口はこの奥だよ。", + en: "We can't repair a broken broom. If you go to the labyrinth on this island, you might find a spell that can help with the repair. The entrance to the labyrinth is further in.", + zh_cn: "我们无法修理破损的扫帚。如果你去这个岛上的迷宫,你可能会找到有助于修理的咒语。迷宫的入口在里面。", + zh_tw: "我們無法修理破損的掃帚。如果你去這個島上的迷宮,你可能會找到有助於修理的咒語。迷宮的入口在裡面。", + es: "No podemos reparar una escoba rota. Si vas al laberinto en esta isla, podrías encontrar un hechizo que pueda ayudar con la reparación. La entrada al laberinto está más adentro.", + fr: "Nous ne pouvons pas réparer un balai cassé. Si vous allez dans le labyrinthe de cette île, vous pourriez trouver un sort qui peut aider à la réparation. L'entrée du labyrinthe est plus loin.", + pt: "Não podemos consertar uma vassoura quebrada. Se você for ao labirinto nesta ilha, pode encontrar um feitiço que pode ajudar no conserto. A entrada do labirinto está mais adiante.", + de: "Wir können keinen kaputten Besen reparieren. Wenn du in das Labyrinth auf dieser Insel gehst, findest du vielleicht einen Zauber, der bei der Reparatur hilft. Der Eingang zum Labyrinth ist weiter drinnen.", + ko: "우리는 부러진 빗자루를 고칠 수 없어. 이 섬의 미로에 가면 수리에 도움이 되는 주문을 찾을 수 있을 거야. 미로의 입구는 더 안쪽에 있어.", + ru: "Мы не можем починить сломанное метлу. Если ты пойдешь в лабиринт на этом острове, возможно, найдешь заклинание, которое поможет с ремонтом. Вход в лабиринт дальше." +}; + +pub const HELLO_RABBIT_3: Dict<&'static str> = Dict { + ja: "迷宮に行く前に、ぼくらの店に立ち寄るといい。迷宮で拾った呪文を売っているんだ。", + en: "Before going to the labyrinth, you should stop by our shop. We sell spells that we found in the labyrinth.", + zh_cn: "在去迷宫之前,你应该先去我们的商店。我们出售在迷宫中找到的咒语。", + zh_tw: "在去迷宮之前,你應該先去我們的商店。我們出售在迷宮中找到的咒語。", + es: "Antes de ir al laberinto, deberías pasar por nuestra tienda. Vendemos hechizos que encontramos en el laberinto.", + fr: "Avant d'aller dans le labyrinthe, vous devriez passer par notre boutique. Nous vendons des sorts que nous avons trouvés dans le labyrinthe.", + pt: "Antes de ir ao labirinto, você deve passar pela nossa loja. Vendemos feitiços que encontramos no labirinto.", + de: "Bevor du in das Labyrinth gehst, solltest du in unserem Laden vorbeischauen. Wir verkaufen Zauber, die wir im Labyrinth gefunden haben.", + ko: "미로에 가기 전에 우리 가게에 들르는 것이 좋아. 우리는 미로에서 발견한 주문을 팔고 있어.", + ru: "Перед тем как идти в лабиринт, тебе стоит заглянуть в наш магазин. Мы продаем заклинания, которые нашли в лабиринте.", }; pub const SINGLEPLAY_RABBIT_1: Dict<&'static str> = Dict { diff --git a/src/page/opening.rs b/src/page/opening.rs index a64107be..3af92d96 100644 --- a/src/page/opening.rs +++ b/src/page/opening.rs @@ -9,10 +9,10 @@ use bevy::animation::{animated_field, AnimationTarget, AnimationTargetId}; use bevy::prelude::*; use bevy_aseprite_ultra::prelude::{AnimationState, AseSpriteAnimation}; -const FADE_IN: f32 = 5.0; +const FADE_IN: f32 = 3.0; const CRY: f32 = FADE_IN + 5.0; const APPEAR: f32 = CRY + 2.0; -const TURN: f32 = APPEAR + 2.0; +const TURN: f32 = APPEAR + 1.0; const ATTACK: f32 = TURN + 2.0; const HIT: f32 = ATTACK + 0.2; const FADE_OUT: f32 = HIT + 3.0; @@ -88,75 +88,54 @@ fn setup_witch( let mut animation = AnimationClip::default(); + let mut translation_samples = vec![(0.0, Vec3::new(0.0, 0.0, 0.0))]; + + // 浮遊アニメーション + // 0.1秒刻みで HIT までキーフレームを打つ + for i in 0..(HIT * 10.0).floor() as usize { + translation_samples.push(( + 0.1 * i as f32, + Vec3::new( + 0.0 + (i as f32 * 0.1).cos() * 10.0, + -20.0 + (i as f32 * 0.37).cos() * 5.0, + 0.0, + ), + )); + } + + // 落下アニメーション + translation_samples.push((HIT, Vec3::new(0.0, 0.0, 0.0))); + translation_samples.push((HIT + 2.0, Vec3::new(0.0, -120.0, 0.0))); + animation.add_curve_to_target( animation_target_id, AnimatableCurve::new( animated_field!(Transform::translation), - UnevenSampleAutoCurve::new([ - (0.0, Vec3::new(0.0, 0.0, 0.0)), - (HIT, Vec3::new(0.0, 0.0, 0.0)), - (HIT + 2.0, Vec3::new(0.0, -120.0, 0.0)), - ]) - .expect("should be able to build translation curve because we pass in valid samples"), + UnevenSampleAutoCurve::new(translation_samples).expect( + "should be able to build translation curve because we pass in valid samples", + ), ), ); - let rot = 0.6; + + let mut rotation_samples: Vec<(f32, Quat)> = + vec![(0.0, Quat::from_rotation_z(f32::consts::PI * 0.0))]; + + // 攻撃の瞬間から回転アニメーションを開始 + // 0.5 * PI づつキーフレームを打たないとうまく回転が補間されないことに注意 + for i in 0..12 { + rotation_samples.push(( + HIT + 0.6 * i as f32, + Quat::from_rotation_z(f32::consts::PI * 0.5 * i as f32), + )); + } + animation.add_curve_to_target( animation_target_id, AnimatableCurve::new( animated_field!(Transform::rotation), - UnevenSampleAutoCurve::new([ - (0.0, Quat::from_rotation_z(f32::consts::PI * 0.0)), - ( - HIT + rot * 0.0, - Quat::from_rotation_z(f32::consts::PI * 0.0), - ), - ( - HIT + rot * 1.0, - Quat::from_rotation_z(f32::consts::PI * 0.5), - ), - ( - HIT + rot * 2.0, - Quat::from_rotation_z(f32::consts::PI * 1.0), - ), - ( - HIT + rot * 3.0, - Quat::from_rotation_z(f32::consts::PI * 1.5), - ), - ( - HIT + rot * 4.0, - Quat::from_rotation_z(f32::consts::PI * 2.0), - ), - ( - HIT + rot * 5.0, - Quat::from_rotation_z(f32::consts::PI * 2.5), - ), - ( - HIT + rot * 6.0, - Quat::from_rotation_z(f32::consts::PI * 3.0), - ), - ( - HIT + rot * 7.0, - Quat::from_rotation_z(f32::consts::PI * 3.5), - ), - ( - HIT + rot * 8.0, - Quat::from_rotation_z(f32::consts::PI * 4.0), - ), - ( - HIT + rot * 9.0, - Quat::from_rotation_z(f32::consts::PI * 4.5), - ), - ( - HIT + rot * 10.0, - Quat::from_rotation_z(f32::consts::PI * 5.0), - ), - ( - HIT + rot * 11.0, - Quat::from_rotation_z(f32::consts::PI * 5.5), - ), - ]) - .expect("should be able to build translation curve because we pass in valid samples"), + UnevenSampleAutoCurve::new(rotation_samples).expect( + "should be able to build translation curve because we pass in valid samples", + ), ), ); @@ -244,11 +223,6 @@ fn setup_raven( animation.add_event(APPEAR + 1.0, OpeningEvent::SE(SE::DragonFlutter)); animation.add_event(APPEAR + 2.0, OpeningEvent::SE(SE::DragonFlutter)); animation.add_event(APPEAR + 3.0, OpeningEvent::SE(SE::DragonFlutter)); - animation.add_event(APPEAR + 4.0, OpeningEvent::SE(SE::DragonFlutter)); - animation.add_event(APPEAR + 5.0, OpeningEvent::SE(SE::DragonFlutter)); - animation.add_event(APPEAR + 6.0, OpeningEvent::SE(SE::DragonFlutter)); - animation.add_event(APPEAR + 7.0, OpeningEvent::SE(SE::DragonFlutter)); - animation.add_event(APPEAR + 8.0, OpeningEvent::SE(SE::DragonFlutter)); animation.add_event( ATTACK, OpeningEvent::Animate {