Skip to content

Commit

Permalink
Add an option to change link's attack stat, and enemy HP multiplier
Browse files Browse the repository at this point in the history
Add an option to change link's attack stat, and enemy HP multiplier
  • Loading branch information
ROGsamurai authored Sep 10, 2024
2 parents b987321 + dcf1a29 commit 74155ac
Show file tree
Hide file tree
Showing 19 changed files with 60 additions and 42 deletions.
2 changes: 1 addition & 1 deletion soh/include/leveled_stat_math.h
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
#ifndef LEVELED_STAT_MATH_H
#define LEVELED_STAT_MATH_H
#define HEALTH_ATTACK_MULTIPLIER 17
#include "z64.h"

#ifdef __cplusplus
Expand All @@ -25,6 +24,7 @@ f32 Leveled_DamageFormula(f32 attack, u8 power, u8 courage);
f32 Leveled_DamageModify(Actor * actor, Actor * attackingActor, f32 attack);
u16 Leveled_GoldSkulltulaExperience(u8 tokens);
void Leveled_SetPlayerModifiedStats(Player * player);
u8 Leveled_GetHealthAttackMultiplier();
s8 Leveled_GetSceneLevel(s16 sceneId);

#ifdef __cplusplus
Expand Down
47 changes: 29 additions & 18 deletions soh/soh/SohMenuBar.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2082,31 +2082,42 @@ void DrawLeveledMenu() {

ImGui::EndMenu();
}
UIWidgets::EnhancementSliderInt("Enemy HP and Link's Attack Multiplier: %dx", "##LeveledHPandAttackDamageMultiplier", "gLeveled.Enhancements.AttackAndHPMultiplier", 1, 32, "", 9, true, false);
UIWidgets::Tooltip("Changes Link's Attack and enemy HP multiplier. This doesn't change balance, but rather the size of numbers.");
ImGui::EndMenu();
}


if (ImGui::BeginMenu("Difficulty Options")) {
if (ImGui::BeginMenu("Heart Container Value in Units")) {
UIWidgets::EnhancementRadioButton("4 (x0.25)", "gLeveled.Difficulty.HeartUnits", 1);
UIWidgets::EnhancementRadioButton("8 (x0.5)", "gLeveled.Difficulty.HeartUnits", 2);
UIWidgets::EnhancementRadioButton("12 (x0.75)", "gLeveled.Difficulty.HeartUnits", 3);
UIWidgets::EnhancementRadioButton("16 (Vanilla)", "gLeveled.Difficulty.HeartUnits", 4);
UIWidgets::EnhancementRadioButton("20 (x1.25)", "gLeveled.Difficulty.HeartUnits", 5);
UIWidgets::EnhancementRadioButton("24 (x1.5)", "gLeveled.Difficulty.HeartUnits", 6);
UIWidgets::EnhancementRadioButton("28 (x1.75)", "gLeveled.Difficulty.HeartUnits", 7);
UIWidgets::EnhancementRadioButton("32 (x2)", "gLeveled.Difficulty.HeartUnits", 8);
UIWidgets::EnhancementRadioButton("48 (x3)", "gLeveled.Difficulty.HeartUnits", 12);
UIWidgets::EnhancementRadioButton("64 (x4)", "gLeveled.Difficulty.HeartUnits", 16);
UIWidgets::EnhancementRadioButton("80 (x5)", "gLeveled.Difficulty.HeartUnits", 20);
UIWidgets::EnhancementRadioButton("96 (x6)", "gLeveled.Difficulty.HeartUnits", 24);
UIWidgets::EnhancementRadioButton("112 (x7)", "gLeveled.Difficulty.HeartUnits", 28);
UIWidgets::EnhancementRadioButton("128 (x8)", "gLeveled.Difficulty.HeartUnits", 32);
if (ImGui::BeginMenu("Player Options")) {
if (ImGui::BeginMenu("Heart Container Value in Units")) {
UIWidgets::EnhancementRadioButton("4 (x0.25)", "gLeveled.Difficulty.HeartUnits", 1);
UIWidgets::EnhancementRadioButton("8 (x0.5)", "gLeveled.Difficulty.HeartUnits", 2);
UIWidgets::EnhancementRadioButton("12 (x0.75)", "gLeveled.Difficulty.HeartUnits", 3);
UIWidgets::EnhancementRadioButton("16 (Vanilla)", "gLeveled.Difficulty.HeartUnits", 4);
UIWidgets::EnhancementRadioButton("20 (x1.25)", "gLeveled.Difficulty.HeartUnits", 5);
UIWidgets::EnhancementRadioButton("24 (x1.5)", "gLeveled.Difficulty.HeartUnits", 6);
UIWidgets::EnhancementRadioButton("28 (x1.75)", "gLeveled.Difficulty.HeartUnits", 7);
UIWidgets::EnhancementRadioButton("32 (x2)", "gLeveled.Difficulty.HeartUnits", 8);
UIWidgets::EnhancementRadioButton("48 (x3)", "gLeveled.Difficulty.HeartUnits", 12);
UIWidgets::EnhancementRadioButton("64 (x4)", "gLeveled.Difficulty.HeartUnits", 16);
UIWidgets::EnhancementRadioButton("80 (x5)", "gLeveled.Difficulty.HeartUnits", 20);
UIWidgets::EnhancementRadioButton("96 (x6)", "gLeveled.Difficulty.HeartUnits", 24);
UIWidgets::EnhancementRadioButton("112 (x7)", "gLeveled.Difficulty.HeartUnits", 28);
UIWidgets::EnhancementRadioButton("128 (x8)", "gLeveled.Difficulty.HeartUnits", 32);
ImGui::EndMenu();
}
UIWidgets::Tooltip(
"Sets how many health units each completed heart container is worth.\nOne heart on the "
"health meter is equal to 16 health units.\nA lower setting results in lower total health.");


ImGui::Text("Damage Multiplier: %.2fx", (float)CVarGetInteger("gLeveled.Difficulty.Player.DamageMultiplier", 4) / 4.0f);
ImGui::SameLine();
UIWidgets::EnhancementSliderInt("", "##LeveledPlayerDamageMultiplier", "gLeveled.Difficulty.Player.DamageMultiplier", 1, 32, "", 4, true, false);
UIWidgets::Tooltip("Sets a multiplier for the damage the player takes. Includes ALL sources, even damage while being frozen or burned.\nDamage cannot be reduced below 1.");
ImGui::EndMenu();
}
UIWidgets::Tooltip(
"Sets how many health units each completed heart container is worth.\nOne heart on the "
"health meter is equal to 16 health units.\nA lower setting results in lower total health.");

if (ImGui::BeginMenu("EXP Options")) {
UIWidgets::PaddedEnhancementSliderFloat("EXP Rate: %.1f %%", "##Leveled_EXPRate", "gLeveled.Difficulty.EXP.Rate", 0.0f, 10.0f, "", 1.0f, true, true, false, false);
Expand Down
10 changes: 5 additions & 5 deletions soh/src/code/leveled_overlays.c
Original file line number Diff line number Diff line change
Expand Up @@ -434,7 +434,7 @@ void Actor_LevelUpDraw(PlayState* play, Actor* actor) {
}

if (i == 6) {
OVERLAY_DISP = Gfx_Texture32(OVERLAY_DISP, dgQuestIconMagicJarBigTex, 32, 32, (s16)spBC.x, (s16)spBC.y, 32, 32, 4098, 4098);
OVERLAY_DISP = Gfx_Texture32(OVERLAY_DISP, dgQuestIconMagicJarBigTex, 24, 24, (s16)spBC.x, (s16)spBC.y, 24, 24, 3072, 3072);
}

CLOSE_DISPS(play->state.gfxCtx);
Expand Down Expand Up @@ -599,13 +599,13 @@ void Leveled_KaleidoEquip_Stats(PlayState* play) {
Color_RGBA8 textColor = { 255, 255, 255, 255 };

if (CUR_EQUIP_VALUE(EQUIP_TYPE_SWORD) == 1)
attack = HEALTH_ATTACK_MULTIPLIER;
attack = Leveled_GetHealthAttackMultiplier();
if (CUR_EQUIP_VALUE(EQUIP_TYPE_SWORD) == 2)
attack = HEALTH_ATTACK_MULTIPLIER << 1;
attack = Leveled_GetHealthAttackMultiplier() << 1;
if (CUR_EQUIP_VALUE(EQUIP_TYPE_SWORD) == 3) {
attack = HEALTH_ATTACK_MULTIPLIER << 2;
attack = Leveled_GetHealthAttackMultiplier() << 2;
if (gBitFlags[3] & gSaveContext.inventory.equipment)
attack = HEALTH_ATTACK_MULTIPLIER;
attack = Leveled_GetHealthAttackMultiplier();
}

// Values and Icons
Expand Down
6 changes: 5 additions & 1 deletion soh/src/code/leveled_stat_math.c
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,10 @@ static u32 sExpTable[] = { 0, 30, 64, 105, 155, 217, 292,
439224, 458796, 478997, 499839, 521336, 543501, 566346, 589885, 614131, 639098, 664799,
691249, 718461, 746448, 775226, 804807, 835208, 866441, 898523, 931466, 965287, 999999 };*/

u8 Leveled_GetHealthAttackMultiplier() {
return CLAMP(CVarGetInteger("gLeveled.Enhancements.AttackAndHPMultiplier", 9), 1, 32);
}

u16 GetActorStat_DisplayAttack(u16 attack, u8 power) {
return GetActorStat_Attack(attack, power) / (1 + (float)power / 30.0f);
}
Expand Down Expand Up @@ -49,7 +53,7 @@ u8 GetActorStat_PlayerCourage(u8 level) {
}

u16 GetActorStat_EnemyMaxHealth(u16 baseHealth, u8 level){
return (u16)(CLAMP((f32)GetActorStat_Attack(baseHealth * HEALTH_ATTACK_MULTIPLIER, GetActorStat_PlayerPower(level)) * CVarGetFloat("gLeveled.Difficulty.Enemy.HPPercent", 1.0f), 1, 0xffff));
return (u16)(CLAMP((f32)GetActorStat_Attack(baseHealth * Leveled_GetHealthAttackMultiplier(), GetActorStat_PlayerPower(level)) * CVarGetFloat("gLeveled.Difficulty.Enemy.HPPercent", 1.0f), 1, 0xffff));
}

u8 GetPlayerStat_BonusHearts(u8 level){
Expand Down
2 changes: 1 addition & 1 deletion soh/src/code/z_collision_check.c
Original file line number Diff line number Diff line change
Expand Up @@ -3052,7 +3052,7 @@ void CollisionCheck_ApplyDamage(PlayState* play, CollisionCheckContext* colChkCt
Actor* attacker = collider->ac;

if (collider->actor->category != ACTORCAT_PLAYER) {
damage *= HEALTH_ATTACK_MULTIPLIER;
damage *= Leveled_GetHealthAttackMultiplier();
} else {
damage *= (1 << CVarGetInteger(CVAR_ENHANCEMENT("DamageMult"), 0));
}
Expand Down
3 changes: 3 additions & 0 deletions soh/src/code/z_parameter.c
Original file line number Diff line number Diff line change
Expand Up @@ -3188,6 +3188,9 @@ s32 Health_ChangeBy(PlayState* play, s16 healthChange) {
}

if (healthChange < 0) {
healthChange = (f32)healthChange * (f32)CVarGetInteger("gLeveled.Difficulty.Player.DamageMultiplier", 4) / 4.0f;
if (healthChange >= 0)
healthChange = -1;
ActorDamageNumber_New(GET_PLAYER(play), -healthChange);
}

Expand Down
4 changes: 2 additions & 2 deletions soh/src/overlays/actors/ovl_Boss_Dodongo/z_boss_dodongo.c
Original file line number Diff line number Diff line change
Expand Up @@ -728,7 +728,7 @@ void BossDodongo_Explode(BossDodongo* this, PlayState* play) {
Audio_PlayActorSound2(&this->actor, NA_SE_IT_BOMB_EXPLOSION);
Audio_PlayActorSound2(&this->actor, NA_SE_EN_DODO_K_DAMAGE);
func_80033E88(&this->actor, play, 4, 10);
u16 damage = Leveled_DamageModify(&this->actor, &GET_PLAYER(play)->actor, 2 * HEALTH_ATTACK_MULTIPLIER);
u16 damage = Leveled_DamageModify(&this->actor, &GET_PLAYER(play)->actor, 2 * Leveled_GetHealthAttackMultiplier());
this->health -= damage;
ActorDamageNumber_New(&this->actor, damage);

Expand Down Expand Up @@ -1509,7 +1509,7 @@ void BossDodongo_UpdateDamage(BossDodongo* this, PlayState* play) {
item1 = this->collider.elements[0].info.acHitInfo;
if ((this->actionFunc == BossDodongo_Vulnerable) || (this->actionFunc == BossDodongo_LayDown)) {
swordDamage = damage = CollisionCheck_GetSwordDamage(item1->toucher.dmgFlags, play);
swordDamage = Leveled_DamageModify(&this->actor, this->collider.base.actor, swordDamage * HEALTH_ATTACK_MULTIPLIER);
swordDamage = Leveled_DamageModify(&this->actor, this->collider.base.actor, swordDamage * Leveled_GetHealthAttackMultiplier());

if (damage != 0) {
Audio_PlayActorSound2(&this->actor, NA_SE_EN_DODO_K_DAMAGE);
Expand Down
2 changes: 1 addition & 1 deletion soh/src/overlays/actors/ovl_Boss_Fd/z_boss_fd.c
Original file line number Diff line number Diff line change
Expand Up @@ -1288,7 +1288,7 @@ void BossFd_CollisionCheck(BossFd* this, PlayState* play) {
if (headCollider->info.bumperFlags & BUMP_HIT) {
headCollider->info.bumperFlags &= ~BUMP_HIT;
hurtbox = headCollider->info.acHitInfo;
u16 damage = Leveled_DamageModify(&this->actor, &GET_PLAYER(play)->actor, 2 * HEALTH_ATTACK_MULTIPLIER);
u16 damage = Leveled_DamageModify(&this->actor, &GET_PLAYER(play)->actor, 2 * Leveled_GetHealthAttackMultiplier());
if (hurtbox->toucher.dmgFlags & 0x1000)
damage <<= 1;
ActorDamageNumber_New(&this->actor, damage);
Expand Down
4 changes: 2 additions & 2 deletions soh/src/overlays/actors/ovl_Boss_Fd2/z_boss_fd2.c
Original file line number Diff line number Diff line change
Expand Up @@ -845,7 +845,7 @@ void BossFd2_CollisionCheck(BossFd2* this, PlayState* play) {
hurtbox = this->collider.elements[0].info.acHitInfo;
if (!bossFd->faceExposed) {
if (hurtbox->toucher.dmgFlags & 0x40000040) {
u16 damage = Leveled_DamageModify(&this->actor, &GET_PLAYER(play)->actor, 2 * HEALTH_ATTACK_MULTIPLIER);
u16 damage = Leveled_DamageModify(&this->actor, &GET_PLAYER(play)->actor, 2 * Leveled_GetHealthAttackMultiplier());

ActorDamageNumber_New(&this->actor, damage);
if (this->actor.colChkInfo.health > damage) {
Expand Down Expand Up @@ -887,7 +887,7 @@ void BossFd2_CollisionCheck(BossFd2* this, PlayState* play) {
if (hurtbox->toucher.dmgFlags & 0x80) {
damage = 0;
}
damage = Leveled_DamageModify(&this->actor, &GET_PLAYER(play)->actor, damage * HEALTH_ATTACK_MULTIPLIER);
damage = Leveled_DamageModify(&this->actor, &GET_PLAYER(play)->actor, damage * Leveled_GetHealthAttackMultiplier());
if ((bossFd->actor.colChkInfo.health > 1) || canKill) {
if (bossFd->actor.colChkInfo.health >= damage) {
ActorDamageNumber_New(&this->actor, damage);
Expand Down
2 changes: 1 addition & 1 deletion soh/src/overlays/actors/ovl_Boss_Ganon/z_boss_ganon.c
Original file line number Diff line number Diff line change
Expand Up @@ -2794,7 +2794,7 @@ void BossGanon_UpdateDamage(BossGanon* this, PlayState* play) {
hitWithSword = true;
}

damage = Leveled_DamageModify(&this->actor, &GET_PLAYER(play)->actor, damage * HEALTH_ATTACK_MULTIPLIER);
damage = Leveled_DamageModify(&this->actor, &GET_PLAYER(play)->actor, damage * Leveled_GetHealthAttackMultiplier());
ActorDamageNumber_New(&this->actor, damage);

if (hitWithSword) {
Expand Down
2 changes: 1 addition & 1 deletion soh/src/overlays/actors/ovl_Boss_Ganon2/z_boss_ganon2.c
Original file line number Diff line number Diff line change
Expand Up @@ -1994,7 +1994,7 @@ void func_80902524(BossGanon2* this, PlayState* play) {
}
u8 baseDamage = phi_v1_2;

phi_v1_2 = Leveled_DamageModify(&this->actor, &GET_PLAYER(play)->actor, phi_v1_2 * HEALTH_ATTACK_MULTIPLIER);
phi_v1_2 = Leveled_DamageModify(&this->actor, &GET_PLAYER(play)->actor, phi_v1_2 * Leveled_GetHealthAttackMultiplier());
if (phi_v1_2 <= this->actor.colChkInfo.health) {
this->actor.colChkInfo.health -= phi_v1_2;
} else {
Expand Down
4 changes: 2 additions & 2 deletions soh/src/overlays/actors/ovl_Boss_Ganondrof/z_boss_ganondrof.c
Original file line number Diff line number Diff line change
Expand Up @@ -1245,7 +1245,7 @@ void BossGanondrof_CollisionCheck(BossGanondrof* this, PlayState* play) {
dmg = CollisionCheck_GetSwordDamage(dmgFlags, play);
(dmg == 0) ? (dmg = 2) : (canKill = true);

dmg = Leveled_DamageModify(&this->actor, &GET_PLAYER(play)->actor, dmg * HEALTH_ATTACK_MULTIPLIER);
dmg = Leveled_DamageModify(&this->actor, &GET_PLAYER(play)->actor, dmg * Leveled_GetHealthAttackMultiplier());
ActorDamageNumber_New(&this->actor, dmg);
if ((this->actor.colChkInfo.health > 2) || canKill) {
if (dmg < this->actor.colChkInfo.health) {
Expand Down Expand Up @@ -1277,7 +1277,7 @@ void BossGanondrof_CollisionCheck(BossGanondrof* this, PlayState* play) {
}
} else if (acHit && (hurtbox->toucher.dmgFlags & 0x0001F8A4)) {
this->work[GND_INVINC_TIMER] = 10;
u16 dmg = Leveled_DamageModify(&this->actor, &GET_PLAYER(play)->actor, 2 * HEALTH_ATTACK_MULTIPLIER);
u16 dmg = Leveled_DamageModify(&this->actor, &GET_PLAYER(play)->actor, 2 * Leveled_GetHealthAttackMultiplier());
ActorDamageNumber_New(&this->actor, dmg);
if (dmg < this->actor.colChkInfo.health) {
this->actor.colChkInfo.health -= dmg;
Expand Down
2 changes: 1 addition & 1 deletion soh/src/overlays/actors/ovl_Boss_Goma/z_boss_goma.c
Original file line number Diff line number Diff line change
Expand Up @@ -1833,7 +1833,7 @@ void BossGoma_UpdateHit(BossGoma* this, PlayState* play) {
} else if (this->actionFunc == BossGoma_FloorStunned &&
(damage = CollisionCheck_GetSwordDamage(acHitInfo->toucher.dmgFlags, play)) != 0) {
damage = Leveled_DamageModify(&this->actor, this->collider.elements[0].info.acHit->actor,
damage * HEALTH_ATTACK_MULTIPLIER);
damage * Leveled_GetHealthAttackMultiplier());
if (damage <= this->actor.colChkInfo.health) {
this->actor.colChkInfo.health -= damage;
} else {
Expand Down
2 changes: 1 addition & 1 deletion soh/src/overlays/actors/ovl_Boss_Mo/z_boss_mo.c
Original file line number Diff line number Diff line change
Expand Up @@ -1782,7 +1782,7 @@ void BossMo_CoreCollisionCheck(BossMo* this, PlayState* play) {
this->work[MO_TENT_ACTION_STATE] = MO_CORE_STUNNED;
this->timers[0] = 25;

damage = Leveled_DamageModify(&this->actor, &GET_PLAYER(play)->actor, damage * HEALTH_ATTACK_MULTIPLIER);
damage = Leveled_DamageModify(&this->actor, &GET_PLAYER(play)->actor, damage * Leveled_GetHealthAttackMultiplier());
ActorDamageNumber_New(&this->actor, damage);

this->actor.speedXZ = 15.0f;
Expand Down
2 changes: 1 addition & 1 deletion soh/src/overlays/actors/ovl_Boss_Tw/z_boss_tw.c
Original file line number Diff line number Diff line change
Expand Up @@ -3095,7 +3095,7 @@ void BossTw_TwinrovaUpdate(Actor* thisx, PlayState* play2) {
swordDamage = true;
}

damage = Leveled_DamageModify(&this->actor, &GET_PLAYER(play)->actor, damage * HEALTH_ATTACK_MULTIPLIER);
damage = Leveled_DamageModify(&this->actor, &GET_PLAYER(play)->actor, damage * Leveled_GetHealthAttackMultiplier());
ActorDamageNumber_New(&this->actor, damage);

if (!(info->toucher.dmgFlags & DMG_HOOKSHOT)) {
Expand Down
2 changes: 1 addition & 1 deletion soh/src/overlays/actors/ovl_En_Ba/z_en_ba.c
Original file line number Diff line number Diff line change
Expand Up @@ -454,7 +454,7 @@ void EnBa_Update(Actor* thisx, PlayState* play) {

if ((this->actor.params < EN_BA_DEAD_BLOB) && (this->collider.base.acFlags & 2)) {
this->collider.base.acFlags &= ~2;
u16 damage = Leveled_DamageModify(&this->actor, &GET_PLAYER(play)->actor, HEALTH_ATTACK_MULTIPLIER);
u16 damage = Leveled_DamageModify(&this->actor, &GET_PLAYER(play)->actor, Leveled_GetHealthAttackMultiplier());
ActorDamageNumber_New(&this->actor, damage);

if (damage > this->actor.colChkInfo.health) {
Expand Down
2 changes: 1 addition & 1 deletion soh/src/overlays/actors/ovl_En_Clear_Tag/z_en_clear_tag.c
Original file line number Diff line number Diff line change
Expand Up @@ -371,7 +371,7 @@ void EnClearTag_Update(Actor* thisx, PlayState* play2) {
this->acceleration.z = Rand_CenteredFloat(15.0f);

Audio_PlayActorSound2(&this->actor, NA_SE_EN_FANTOM_THUNDER_GND);
u16 damage = Leveled_DamageModify(&this->actor, &GET_PLAYER(play)->actor, HEALTH_ATTACK_MULTIPLIER);
u16 damage = Leveled_DamageModify(&this->actor, &GET_PLAYER(play)->actor, Leveled_GetHealthAttackMultiplier());
if (damage <= this->actor.colChkInfo.health) {
this->actor.colChkInfo.health -= damage;
} else {
Expand Down
2 changes: 1 addition & 1 deletion soh/src/overlays/actors/ovl_En_Goma/z_en_goma.c
Original file line number Diff line number Diff line change
Expand Up @@ -655,7 +655,7 @@ void EnGoma_UpdateHit(EnGoma* this, PlayState* play) {
swordDamage = 1;
}

swordDamage = Leveled_DamageModify(&this->actor, &player->actor, swordDamage * HEALTH_ATTACK_MULTIPLIER);
swordDamage = Leveled_DamageModify(&this->actor, &player->actor, swordDamage * Leveled_GetHealthAttackMultiplier());
if (swordDamage <= this->actor.colChkInfo.health) {
this->actor.colChkInfo.health -= swordDamage;
} else {
Expand Down
2 changes: 1 addition & 1 deletion soh/src/overlays/actors/ovl_En_Vm/z_en_vm.c
Original file line number Diff line number Diff line change
Expand Up @@ -397,7 +397,7 @@ void EnVm_CheckHealth(EnVm* this, PlayState* play) {
EnBom* bomb;

if (Actor_GetCollidedExplosive(play, &this->colliderCylinder.base) != NULL) {
u16 damage = Leveled_DamageModify(&this->actor, &GET_PLAYER(play)->actor, HEALTH_ATTACK_MULTIPLIER);
u16 damage = Leveled_DamageModify(&this->actor, &GET_PLAYER(play)->actor, Leveled_GetHealthAttackMultiplier());
this->actor.colChkInfo.damage += damage;
ActorDamageNumber_New(&this->actor, damage);
Actor_ApplyDamage(&this->actor);
Expand Down

0 comments on commit 74155ac

Please sign in to comment.