Skip to content

Commit

Permalink
🍱 [Mob213] TerribleSonicBomberと愉快な仲間たちの追加 (#443)
Browse files Browse the repository at this point in the history
  • Loading branch information
uran247 authored Dec 31, 2024
1 parent 7f224fa commit b41b07a
Show file tree
Hide file tree
Showing 116 changed files with 1,895 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
#> asset:mob/0213.terrible_sonic_bomber/_index.d
# @private

#> tag
# @within
# function asset:mob/0213.terrible_sonic_bomber/**
# function asset:mob/0214.drone/**
#declare tag 5X.Centre #旋回中心座標を示す、基本的には呪われた剣の位置と一致する。イギリス綴りなので誤字ではない

#> tag_inter_object
# @within
# function asset:mob/0213.terrible_sonic_bomber/**
# function asset:object/2083.brimstone/**
#declare tag 5X.BrimstoneTarget #旋回中心座標を示す、基本的には呪われた剣の位置と一致する。イギリス綴りなので誤字ではない
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
#> asset:mob/0213.terrible_sonic_bomber/death/
#
# Mobの死亡時の処理
#
# @within function asset:mob/alias/213/death

# super
function asset:mob/super.death

# remove markers
kill @e[tag=5X.Centre]

# remove objects and mobs
execute as @e[scores={ObjectID=2082..2088}] on passengers run kill @s
execute as @e[scores={MobID=214}] run function api:mob/remove
kill @e[scores={ObjectID=2082..2088}]
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
#> asset:mob/0213.terrible_sonic_bomber/hurt/
#
# Mobのダメージ時の処理
#
# @within function asset:mob/alias/213/hurt

# super
function asset:mob/super.hurt

# TODO 被弾時の演出を書く
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
#> asset:mob/0213.terrible_sonic_bomber/init/
#
# Mobのinit時の処理
#
# @within asset:mob/alias/213/init

#> prv
# @private
#declare score_holder $initial_motion_end_time

#モブの見た目をライドする
# アニジャバのsummonを実行
# アニジャバのrootをファントムに乗せる
# TODO:召喚時につけなきゃいけないタグを確認する


# super
function asset:mob/super.init

#ファントムのNBTをいじる
data modify entity @s Size set value 32

#モブのデータに以下の情報を記録
# 初期モーション終了時間を記録
execute store result score $initial_motion_end_time Temporary run time query gametime
execute store result storage asset:context this.initial_motion_end_time int 1 run scoreboard players add $initial_motion_end_time Temporary 30

# 次回攻撃時刻を記録
execute store result storage asset:context this.next_attack_time int 1 run scoreboard players add $initial_motion_end_time Temporary 120

# 旋回中心座標を示すマーカーを置く
summon marker ~ ~ ~ {Tags:["Uninterferable","5X.Centre"]}

# 対空砲召喚
data modify storage api: Argument.ID set value 2088
function api:object/summon


#タイトルで何をやるか説明
title @a[distance=..128] title {"text":"対空砲を守り敵を迎撃せよ","color":"white","bold":true}


# reset
scoreboard players reset $initial_motion_end_time Temporary
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
#> asset:mob/0213.terrible_sonic_bomber/register
#
# Mobのデータを指定
#
# @within function asset:mob/alias/213/register

#継承 (int) (オプション)
data modify storage asset:mob Extends append value 2000
function asset:mob/extends
# 他のモブに継承されることを許可するか (boolean) (オプション)
# data modify storage asset:mob ExtendsSafe set value
# 継承されることを前提とした、抽象的なモブであるかどうか(boolean)
data modify storage asset:mob IsAbstract set value false
# ID (int)
data modify storage asset:mob ID set value 213
# Type (string) Wikiを参照
data modify storage asset:mob Type set value "Enemy.Boss"
# 干渉可能か否か (boolean)
data modify storage asset:mob Interferable set value true
# 名前 (TextComponentString) (オプション)
data modify storage asset:mob Name set value '{"text":"Terrible Sonic Bomber"}'
# Mobの説明文 (TextComponentString[]) (オプション)
data modify storage asset:mob Lore set value ['{"text":"TBD"}']
# 武器
# メインハンド (Compound(Item)) (オプション)
# data modify storage asset:mob Weapon.Mainhand set value
# オフハンド (Compound(Item)) (オプション)
# data modify storage asset:mob Weapon.Offhand set value
# 武器ドロップ率 ([float, float]) (オプション)
# data modify storage asset:mob WeaponDropChances set value
# 防具
# 頭 (Compound(Item)) (オプション)
# data modify storage asset:mob Armor.Head set value
# 胴 (Compound(Item)) (オプション)
# data modify storage asset:mob Armor.Chest set value
# 脚 (Compound(Item)) (オプション)
# data modify storage asset:mob Armor.Legs set value
# 足 (Compound(Item)) (オプション)
# data modify storage asset:mob Armor.Feet set value
# 防具ドロップ率 ([float, float]) (オプション)
# data modify storage asset:mob ArmorDropChances set value
# 体力 (double) (オプション)
data modify storage asset:mob Health set value 20000
# 攻撃力 (double) (オプション)
# data modify storage asset:mob AttackDamage set value
# 防御力 (double) (オプション) // 被ダメージがある程度大きい場合1ptにつき0.8%カット、小さい場合1ptにつき約4%カット 20pt以上は頭打ち
data modify storage asset:mob Defense set value 0
# 特殊防御力 (double) (オプション) // 4pointにつきダメージを大きく減らす
# data modify storage asset:mob SpecialDefense set value
# 移動速度 (double) (オプション)
# data modify storage asset:mob Speed set value
# 索敵範囲 (double) (オプション)
# data modify storage asset:mob FollowRange set value
# ノックバック耐性 (double) (オプション)
# data modify storage asset:mob KnockBackResist set value
# 属性倍率 // 1.0fで100% 最低でも25%は軽減されずに入る
# 物理倍率 (float) (オプション)
# data modify storage asset:mob Resist.Physical set value
# 魔法倍率 (float) (オプション)
data modify storage asset:mob Resist.Magic set value 0.4
# 火倍率 (float) (オプション)
# data modify storage asset:mob Resist.Fire set value
# 水倍率 (float) (オプション)
# data modify storage asset:mob Resist.Water set value
# 雷倍率 (float) (オプション)
data modify storage asset:mob Resist.Thunder set value 0.25
# フィールド
data modify storage asset:mob Field.TargetCoordinates set value []
data modify storage asset:mob Field.UsingWeapon set value ""
data modify storage asset:mob Field.AttackDistance set value 50
data modify storage asset:mob Field.InitialMotionTime set value 200
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
#> asset:mob/0213.terrible_sonic_bomber/remove/
#
# 天使が居なくなる際に実行される処理
#
# @within asset:mob/alias/213/remove

# Todo: ミサイルを消す
# Todo: 対空砲を消す

# super
function asset:mob/super.remove

# remove markers
kill @e[tag=5X.Centre]

# remove objects
execute as @e[scores={ObjectID=2082..2088}] on passengers run kill @s
execute as @e[scores={MobID=214}] run function api:mob/remove
kill @e[scores={ObjectID=2082..2088}]
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
#> asset:mob/0213.terrible_sonic_bomber/summon/
#
# Object召喚処理の呼び出し時に実行されるfunction
#
# @within asset:mob/alias/213/summon

# 元となるEntityを召喚する
summon phantom ~ ~ ~ {Tags:["MobInit","AntiBurn"],DeathLootTable:"empty",NoAI:1b}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
#> asset:mob/0213.terrible_sonic_bomber/summon/debug
#
# 動作チェック用の召喚処理 使い終わったら消してもいいかも
#
# @user
# @private

# 召喚
data modify storage api: Argument.ID set value 213
function api:mob/summon
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
#> asset:mob/0213.terrible_sonic_bomber/tick/
#
# Mobのtick時の処理
#
# @within asset:mob/alias/213/tick

#> prv
# @private
#declare score_holder $current_gametime
#declare score_holder $initial_motion_end_time
#declare score_holder $next_attack_time

# 現在時間を記録
execute store result score $current_gametime Temporary run time query gametime


# 初期モーション終了時間前の場合
# 上へゆっくり昇っていく
execute store result score $initial_motion_end_time Temporary run data get storage asset:context this.initial_motion_end_time
execute if score $initial_motion_end_time Temporary > $current_gametime Temporary run function asset:mob/0213.terrible_sonic_bomber/tick/motions/initial_motion


# 初期モーション終了時間ぴったり
# モデルを表示
# TBD

# それ以降

execute if score $initial_motion_end_time Temporary < $current_gametime Temporary store result score $next_attack_time Temporary run data get storage asset:context this.next_attack_time

# 巡行移動モーション
execute if score $initial_motion_end_time Temporary < $current_gametime Temporary if score $next_attack_time Temporary >= $current_gametime Temporary run function asset:mob/0213.terrible_sonic_bomber/tick/motions/cruise_motion

# 攻撃モーション準備
execute if score $initial_motion_end_time Temporary < $current_gametime Temporary if score $next_attack_time Temporary = $current_gametime Temporary run function asset:mob/0213.terrible_sonic_bomber/tick/motions/attack_motion_prepare

# 攻撃モーション実行
execute if score $initial_motion_end_time Temporary < $current_gametime Temporary if score $next_attack_time Temporary < $current_gametime Temporary run function asset:mob/0213.terrible_sonic_bomber/tick/motions/attack_motion

#tellraw @a [{"score":{"objective":"Temporary","name":"$next_attack_time"}}]


# reset
scoreboard players reset $initial_motion_end_time Temporary
scoreboard players reset $current_gametime Temporary
scoreboard players reset $next_attack_time Temporary
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
#> asset:mob/0213.terrible_sonic_bomber/tick/motions/attack_motion
#
#
#
# @within function asset:mob/0213.terrible_sonic_bomber/tick/

#> prv
# @private
#declare score_holder $current_gametime_for_attack
#declare score_holder $attack_start_time
#declare score_holder $attack_end_time
#declare score_holder $use_weapon
#declare score_holder $flare_time

# 現在時間を記録
execute store result score $current_gametime_for_attack Temporary run time query gametime

# 移動処理
# 中心座標を中心に旋回
execute unless entity @e[tag=5X.Centre,distance=..105] facing entity @e[tag=5X.Centre,distance=..128,limit=1] eyes rotated ~80 0 run tp @s ~ ~ ~ ~ ~

# 直進
execute rotated as @s run tp @s ^ ^ ^3

# 対空砲付近を飛ぶときはフレアを出す(3tickおき)
execute store result score $flare_time Temporary run time query gametime
scoreboard players operation $flare_time Temporary %= $3 Const
execute if entity @e[tag=5X.Centre,distance=..60] if score $flare_time Temporary matches 0 run particle minecraft:lava ^ ^-1 ^-2 1.5 0 1.5 1 24 force


# 攻撃処理
# 使用武器を取得
execute store result score $use_weapon Temporary run data get storage asset:context this.use_weapon

# 攻撃開始時刻になったら攻撃開始
execute store result score $attack_start_time Temporary run data get storage asset:context this.attack_start_time
execute store result score $attack_end_time Temporary run data get storage asset:context this.attack_end_time

execute if score $current_gametime_for_attack Temporary = $attack_start_time Temporary if score $current_gametime_for_attack Temporary < $attack_end_time Temporary run function asset:mob/0213.terrible_sonic_bomber/tick/motions/use_weapon


# 攻撃終了後の処理
execute if score $current_gametime_for_attack Temporary >= $attack_end_time Temporary run function asset:mob/0213.terrible_sonic_bomber/tick/motions/set_next_attack_time
execute if score $current_gametime_for_attack Temporary = $attack_end_time Temporary run function asset:mob/0213.terrible_sonic_bomber/tick/motions/escape_after_attack

#tellraw @a [{"text": "use_weapon"},{"score":{"objective":"Temporary","name":"$use_weapon"}}]
#tellraw @a [{"text": "attack_start_time"},{"score":{"objective":"Temporary","name":"$use_weapon"}}]

# reset
scoreboard players reset $current_gametime_for_attack Temporary
scoreboard players reset $attack_start_time Temporary
scoreboard players reset $attack_end_time Temporary
scoreboard players reset $use_weapon Temporary
scoreboard players reset $flare_time Temporary
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
#> asset:mob/0213.terrible_sonic_bomber/tick/motions/attack_motion_prepare
#
#
#
# @within function asset:mob/0213.terrible_sonic_bomber/tick/

#> prv
# @private
#declare score_holder $attack_start_time
#declare score_holder $weapon_num
#declare score_holder $health_per

# 攻撃武器選択 HP半分以下なら選択肢変化
function api:mob/get_health_percent
execute store result score $health_per Temporary run data get storage api: Return.HealthPer 100

# 乱数によるスキル選択
data modify storage lib: Args.key set value "5XWeapon"
execute if score $health_per Temporary matches 50.. run data modify storage lib: Args.max set value 3
execute if score $health_per Temporary matches ..49 run data modify storage lib: Args.max set value 4
data modify storage lib: Args.scarcity_history_size set value 2
execute store result score $weapon_num Temporary run function lib:random/with_biased/manual.m with storage lib: Args
scoreboard players add $weapon_num Temporary 1
#scoreboard players set $weapon_num Temporary -4
#tellraw @a [{"score":{"name":"$health_per","objective":"Temporary"},"color":"blue"}]

# 対空砲が破壊されていた場合武器が変化する攻撃はIDを変更、将来的にも乱数の範囲に入らない負の値にしておく
execute if entity @e[tag=PatriotLauncher.IsBroken,distance=..128] if score $weapon_num Temporary matches 4 run scoreboard players set $weapon_num Temporary -4

execute store result storage asset:context this.use_weapon int 1 run scoreboard players get $weapon_num Temporary

# 攻撃開始と終了時間指定(デフォルト値)
execute store result score $attack_start_time Temporary run time query gametime
execute store result storage asset:context this.attack_start_time int 1 run scoreboard players add $attack_start_time Temporary 20
execute store result storage asset:context this.attack_end_time int 1 run scoreboard players add $attack_start_time Temporary 20

# 攻撃内容に応じて向きを変える
execute if score $weapon_num Temporary matches 1..2 facing entity @e[tag=5X.Centre,limit=1] eyes rotated ~ 0 run tp @s ~ ~ ~ ~ ~
execute if score $weapon_num Temporary matches 4 facing entity @p eyes rotated ~ 0 run tp @s ~ ~ ~ ~ ~
execute if score $weapon_num Temporary matches -4 at @p positioned ~ ~10 ~ facing entity @s eyes facing ^ ^ ^-1 positioned as @s run tp @s ~ ~ ~ ~ ~

# 武器ごとの処理
execute if score $weapon_num Temporary matches 1 run function asset:mob/0213.terrible_sonic_bomber/tick/weapons/storm_shadow_prepare
execute if score $weapon_num Temporary matches 2 run function asset:mob/0213.terrible_sonic_bomber/tick/weapons/brimstone_prepare
execute if score $weapon_num Temporary matches 3 run function asset:mob/0213.terrible_sonic_bomber/tick/weapons/drone_prepare
execute if score $weapon_num Temporary matches 4 run function asset:mob/0213.terrible_sonic_bomber/tick/weapons/snakeeye_prepare
execute if score $weapon_num Temporary matches -4 run function asset:mob/0213.terrible_sonic_bomber/tick/weapons/gatling_prepare

# reset
scoreboard players reset $attack_start_time Temporary
scoreboard players reset $weapon_num Temporary
scoreboard players reset $health_per Temporary
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
#> asset:mob/0213.terrible_sonic_bomber/tick/motions/cruise_motion
#
#
#
# @within function asset:mob/0213.terrible_sonic_bomber/tick/

#> prv
# @private
#declare score_holder $flare_time

# 中心座標を中心に旋回
execute unless entity @e[tag=5X.Centre,distance=..95] facing entity @e[tag=5X.Centre,distance=..128,limit=1] eyes rotated ~80 0 run tp @s ~ ~ ~ ~ ~

# 直進
execute rotated as @s run tp @s ^ ^ ^3

# 攻撃後などで低空にいた場合は上昇
execute at @e[tag=5X.Centre,distance=..128,limit=1] positioned ~-100 ~30 ~-100 if entity @s[dx=199,dy=-100,dz=199] at @s run tp @s ~ ~0.5 ~

# 対空砲付近を飛ぶときはフレアを出す(3tickおき)
execute store result score $flare_time Temporary run time query gametime
scoreboard players operation $flare_time Temporary %= $3 Const
execute if entity @e[tag=5X.Centre,distance=..60] if score $flare_time Temporary matches 0 run particle minecraft:lava ^ ^-1 ^-2 1.5 0 1.5 1 24 force
#say cruise

# reset
scoreboard players reset $flare_time Temporary
Loading

0 comments on commit b41b07a

Please sign in to comment.