Sfoglia il codice sorgente

Corrected Sorcerer skill SO_CLOUD_KILL (#8942)

* Corrected SO_CLOUD_KILL
* Corrected skill duration that should scale with skill level
* Added missing flag for SC_CLOUD_POISON (missing visual effect on target)
* Moved extra damage from SC_CLOUD_POISON to battle_calc_cardfix to match damage on official server
* Added missing INT ratio in the skill formula
* SO_CLOUD_KILL now inflicts SC_CLOUD_POISON (100% on first hit, status not refreshed)
* Corrected UNT_CLOUD_KILL skill_damage flag : clif_skill_damage flag should be DMG_SPLASH and skill level -1

Co-authored-by: Aleos <aleos89@users.noreply.github.com>
Atemo 3 mesi fa
parent
commit
2561a5df9f
4 ha cambiato i file con 26 aggiunte e 11 eliminazioni
  1. 12 1
      db/re/skill_db.yml
  2. 5 0
      db/re/status.yml
  3. 5 7
      src/map/battle.cpp
  4. 4 3
      src/map/skill.cpp

+ 12 - 1
db/re/skill_db.yml

@@ -27960,7 +27960,18 @@ Body:
       - Level: 5
         Time: 3100
     AfterCastActDelay: 1000
-    Duration1: 5000
+    Duration1: # !TODO: find exact values
+      - Level: 1
+        Time: 1000
+      - Level: 2
+        Time: 2000
+      - Level: 3
+        Time: 3000
+      - Level: 4
+        Time: 4000
+      - Level: 5
+        Time: 5000
+    Duration2: 5000
     Cooldown: 5000
     FixedCastTime:
       - Level: 1

+ 5 - 0
db/re/status.yml

@@ -7540,6 +7540,11 @@ Body:
   - Status: Cloud_Poison
     Icon: EFST_CLOUD_POISON
     DurationLookup: SO_CLOUD_KILL
+    Flags:
+      BlEffect: true
+#     DisplayMob: true  # !TODO: check me
+    Fail:
+      Cloud_Poison: true
   - Status: Homun_Time
     Icon: EFST_HOMUN_TIME
     Flags:

+ 5 - 7
src/map/battle.cpp

@@ -581,13 +581,6 @@ int64 battle_attr_fix(struct block_list *src, struct block_list *target, int64 d
 #else
 					damage += (int64)(damage * tsc->getSCE(SC_VENOMIMPRESS)->val2 / 100);
 #endif
-				if (tsc->getSCE(SC_CLOUD_POISON)) {
-#ifdef RENEWAL
-					ratio += 5 * tsc->getSCE(SC_CLOUD_POISON)->val1;
-#else
-					damage += (int64)(damage * 5 * tsc->getSCE(SC_CLOUD_POISON)->val1 / 100);
-#endif
-				}
 				break;
 			case ELE_WIND:
 				if (tsc->getSCE(SC_WATER_INSIGNIA))
@@ -691,6 +684,10 @@ static int32 battle_calc_cardfix_debuff( status_change& tsc, int32 rh_ele ){
 			if (tsc.getSCE(SC_MISTYFROST))
 				ele_fix += 15;
 			break;
+		case ELE_POISON:
+			if (tsc.getSCE(SC_CLOUD_POISON))
+				ele_fix += 5 * tsc.getSCE(SC_CLOUD_POISON)->val1;
+			break;
 	}
 	return ele_fix;
 }
@@ -8374,6 +8371,7 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list
 						break;
 					case SO_CLOUD_KILL:
 						skillratio += -100 + 40 * skill_lv;
+						skillratio += sstatus->int_ * 3;
 						RE_LVL_DMOD(100);
 						if (sc) {
 							if (sc->getSCE(SC_CURSED_SOIL_OPTION))

+ 4 - 3
src/map/skill.cpp

@@ -1962,6 +1962,9 @@ int32 skill_additional_effect( struct block_list* src, struct block_list *bl, ui
 	case SO_VARETYR_SPEAR:
 		sc_start(src,bl, SC_STUN, 5 * skill_lv, skill_lv, skill_get_time(skill_id, skill_lv));
 		break;
+	case SO_CLOUD_KILL:
+		sc_start(src, bl, skill_get_sc(skill_id), 100, skill_lv, skill_get_time2(skill_id, skill_lv));
+ 		break;
 	case GN_SPORE_EXPLOSION:
 		sc_start(src, bl, SC_SPORE_EXPLOSION, 100, skill_lv, skill_get_time(skill_id, skill_lv));
 		break;
@@ -16974,9 +16977,7 @@ int32 skill_unit_onplace_timer(struct skill_unit *unit, struct block_list *bl, t
 			break;
 
 		case UNT_CLOUD_KILL:
-			if (tsc && !tsc->getSCE(type))
-				status_change_start(ss, bl, type, 10000, sg->skill_lv, ss->id, 0, 0, skill_get_time(sg->skill_id, sg->skill_lv), SCSTART_NOTICKDEF);
-			skill_attack(skill_get_type(sg->skill_id), ss, &unit->bl, bl, sg->skill_id, sg->skill_lv, tick, 0);
+			skill_attack(skill_get_type(sg->skill_id), ss, ss, bl, sg->skill_id, sg->skill_lv, tick, SD_ANIMATION|SD_LEVEL);
 			break;
 
 		case UNT_VACUUM_EXTREME: