Browse Source

Implemented status change for Packing_Envelope item (#5959)

Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>

Thanks to @limitro !
Atemo 4 years ago
parent
commit
7a2c936913
6 changed files with 145 additions and 2 deletions
  1. 22 2
      db/re/item_db_usable.yml
  2. 40 0
      doc/status_change.txt
  3. 10 0
      src/map/script_constants.hpp
  4. 9 0
      src/map/skill.cpp
  5. 53 0
      src/map/status.cpp
  6. 11 0
      src/map/status.hpp

+ 22 - 2
db/re/item_db_usable.yml

@@ -45014,11 +45014,31 @@ Body:
   - Id: 22611
     AegisName: Packing_Envelope
     Name: Packed Envelope
-    Type: Delayconsume
+    Type: Usable
     Buy: 10
     Weight: 10
     Script: |
-      /* TODO */
+      .@r = rand(1,10);
+      if (.@r == 1)
+         sc_start SC_PACKING_ENVELOPE1,30000,33; // +atk
+      else if (.@r == 2)
+         sc_start SC_PACKING_ENVELOPE2,30000,33; // +matk
+      else if (.@r == 3)
+         sc_start SC_PACKING_ENVELOPE3,30000,3; // +hp%
+      else if (.@r == 4)
+         sc_start SC_PACKING_ENVELOPE4,30000,3; // +sp%
+      else if (.@r == 5)
+         sc_start SC_PACKING_ENVELOPE5,30000,33; // +flee
+      else if (.@r == 6)
+         sc_start SC_PACKING_ENVELOPE6,30000,3; // +aspd
+      else if (.@r == 7)
+         sc_start SC_PACKING_ENVELOPE7,30000,33; // +def
+      else if (.@r == 8)
+         sc_start SC_PACKING_ENVELOPE8,30000,33; // +mdef
+      else if (.@r == 9)
+         sc_start SC_PACKING_ENVELOPE9,30000,33; // +crit
+      else
+         sc_start SC_PACKING_ENVELOPE10,30000,33; // +hit
   - Id: 22612
     AegisName: Decomposition_Potion
     Name: Corrupt Reagents

+ 40 - 0
doc/status_change.txt

@@ -2716,3 +2716,43 @@ SC_DORAM_BUF_01 ()
 	
 SC_DORAM_BUF_02 ()
 	desc: Recovers 5 SP every 10 seconds.
+
+SC_PACKING_ENVELOPE1	(EFST_PACKING_ENVELOPE1)
+	desc: Increases ATK
+	val1: + watk
+
+SC_PACKING_ENVELOPE2	(EFST_PACKING_ENVELOPE2)
+	desc: Increases MATK
+	val1: + ematk
+
+SC_PACKING_ENVELOPE3	(EFST_PACKING_ENVELOPE3)
+	desc: Increases MaxHP
+	val1: +% MaxHP
+
+SC_PACKING_ENVELOPE4	(EFST_PACKING_ENVELOPE4)
+	desc: Increases MaxSP
+	val1: +% MaxSP
+
+SC_PACKING_ENVELOPE5	(EFST_PACKING_ENVELOPE5)
+	desc: Increases FLEE
+	val1: + Flee
+
+SC_PACKING_ENVELOPE6	(EFST_PACKING_ENVELOPE6)
+	desc: Increases ASPD
+	val1: + ASPD
+
+SC_PACKING_ENVELOPE7	(EFST_PACKING_ENVELOPE7)
+	desc: Increases DEF
+	val1: + DEF
+
+SC_PACKING_ENVELOPE8	(EFST_PACKING_ENVELOPE8)
+	desc: Increases MDEF
+	val1: + MDEF
+
+SC_PACKING_ENVELOPE9	(EFST_PACKING_ENVELOPE9)
+	desc: Increases Critical rate
+	val1: + Critical rate
+
+SC_PACKING_ENVELOPE10	(EFST_PACKING_ENVELOPE10)
+	desc: Increases HIT
+	val1: + HIT

+ 10 - 0
src/map/script_constants.hpp

@@ -1617,6 +1617,16 @@
 	export_constant(SC_STONE_WALL);
 	export_constant(SC_CLOUD_POISON);
 	export_constant(SC_HOMUN_TIME);
+	export_constant(SC_PACKING_ENVELOPE1);
+	export_constant(SC_PACKING_ENVELOPE2);
+	export_constant(SC_PACKING_ENVELOPE3);
+	export_constant(SC_PACKING_ENVELOPE4);
+	export_constant(SC_PACKING_ENVELOPE5);
+	export_constant(SC_PACKING_ENVELOPE6);
+	export_constant(SC_PACKING_ENVELOPE7);
+	export_constant(SC_PACKING_ENVELOPE8);
+	export_constant(SC_PACKING_ENVELOPE9);
+	export_constant(SC_PACKING_ENVELOPE10);
 #ifdef RENEWAL
 	export_constant(SC_EXTREMITYFIST2);
 #endif

+ 9 - 0
src/map/skill.cpp

@@ -2004,6 +2004,9 @@ int skill_additional_effect(struct block_list* src, struct block_list *bl, uint1
 					case SC_REUSE_LIMIT_LUXANIMA:	case SC_LUXANIMA:	case SC_SOULENERGY:
 					case SC_EP16_2_BUFF_SS:		case SC_EP16_2_BUFF_SC:	case SC_EP16_2_BUFF_AC:
 					case SC_EMERGENCY_MOVE:		case SC_MADOGEAR:		case SC_HOMUN_TIME:
+					case SC_PACKING_ENVELOPE1:	case SC_PACKING_ENVELOPE2:	case SC_PACKING_ENVELOPE3:
+					case SC_PACKING_ENVELOPE4:	case SC_PACKING_ENVELOPE5:	case SC_PACKING_ENVELOPE6:
+					case SC_PACKING_ENVELOPE7:	case SC_PACKING_ENVELOPE8:	case SC_PACKING_ENVELOPE9:	case SC_PACKING_ENVELOPE10:
 						continue;
 					case SC_WHISTLE:		case SC_ASSNCROS:		case SC_POEMBRAGI:
 					case SC_APPLEIDUN:		case SC_HUMMING:		case SC_DONTFORGETME:
@@ -8479,6 +8482,9 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
 					case SC_REUSE_LIMIT_LUXANIMA:	case SC_LUXANIMA:	case SC_SOULENERGY:
 					case SC_EP16_2_BUFF_SS:		case SC_EP16_2_BUFF_SC:	case SC_EP16_2_BUFF_AC:
 					case SC_EMERGENCY_MOVE:		case SC_HOMUN_TIME:
+					case SC_PACKING_ENVELOPE1:	case SC_PACKING_ENVELOPE2:	case SC_PACKING_ENVELOPE3:
+					case SC_PACKING_ENVELOPE4:	case SC_PACKING_ENVELOPE5:	case SC_PACKING_ENVELOPE6:
+					case SC_PACKING_ENVELOPE7:	case SC_PACKING_ENVELOPE8:	case SC_PACKING_ENVELOPE9:	case SC_PACKING_ENVELOPE10:
 						continue;
 					case SC_WHISTLE:
 					case SC_ASSNCROS:
@@ -10013,6 +10019,9 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
 					case SC_REUSE_LIMIT_LUXANIMA:		case SC_LUXANIMA:	case SC_SOULENERGY:
 					case SC_EP16_2_BUFF_SS:		case SC_EP16_2_BUFF_SC:	case SC_EP16_2_BUFF_AC:
 					case SC_EMERGENCY_MOVE:		case SC_MADOGEAR:		case SC_HOMUN_TIME:
+					case SC_PACKING_ENVELOPE1:	case SC_PACKING_ENVELOPE2:	case SC_PACKING_ENVELOPE3:
+					case SC_PACKING_ENVELOPE4:	case SC_PACKING_ENVELOPE5:	case SC_PACKING_ENVELOPE6:
+					case SC_PACKING_ENVELOPE7:	case SC_PACKING_ENVELOPE8:	case SC_PACKING_ENVELOPE9:	case SC_PACKING_ENVELOPE10:
 					continue;
 				case SC_ASSUMPTIO:
 					if( bl->type == BL_MOB )

+ 53 - 0
src/map/status.cpp

@@ -1742,6 +1742,18 @@ void initChangeTables(void)
 	StatusIconChangeTable[SC_MADOGEAR] = EFST_RIDING;
 #endif
 
+	// ep15
+	StatusIconChangeTable[SC_PACKING_ENVELOPE1] = EFST_PACKING_ENVELOPE1;
+	StatusIconChangeTable[SC_PACKING_ENVELOPE2] = EFST_PACKING_ENVELOPE2;
+	StatusIconChangeTable[SC_PACKING_ENVELOPE3] = EFST_PACKING_ENVELOPE3;
+	StatusIconChangeTable[SC_PACKING_ENVELOPE4] = EFST_PACKING_ENVELOPE4;
+	StatusIconChangeTable[SC_PACKING_ENVELOPE5] = EFST_PACKING_ENVELOPE5;
+	StatusIconChangeTable[SC_PACKING_ENVELOPE6] = EFST_PACKING_ENVELOPE6;
+	StatusIconChangeTable[SC_PACKING_ENVELOPE7] = EFST_PACKING_ENVELOPE7;
+	StatusIconChangeTable[SC_PACKING_ENVELOPE8] = EFST_PACKING_ENVELOPE8;
+	StatusIconChangeTable[SC_PACKING_ENVELOPE9] = EFST_PACKING_ENVELOPE9;
+	StatusIconChangeTable[SC_PACKING_ENVELOPE10] = EFST_PACKING_ENVELOPE10;
+
 	/* Other SC which are not necessarily associated to skills */
 	StatusChangeFlagTable[SC_ASPDPOTION0] |= SCB_ASPD;
 	StatusChangeFlagTable[SC_ASPDPOTION1] |= SCB_ASPD;
@@ -1929,6 +1941,17 @@ void initChangeTables(void)
 
 	StatusChangeFlagTable[SC_MADOGEAR] |= SCB_SPEED;
 
+	StatusChangeFlagTable[SC_PACKING_ENVELOPE1] |= SCB_WATK;
+	StatusChangeFlagTable[SC_PACKING_ENVELOPE2] |= SCB_MATK;
+	StatusChangeFlagTable[SC_PACKING_ENVELOPE3] |= SCB_MAXHP;
+	StatusChangeFlagTable[SC_PACKING_ENVELOPE4] |= SCB_MAXSP;
+	StatusChangeFlagTable[SC_PACKING_ENVELOPE5] |= SCB_FLEE;
+	StatusChangeFlagTable[SC_PACKING_ENVELOPE6] |= SCB_ASPD;
+	StatusChangeFlagTable[SC_PACKING_ENVELOPE7] |= SCB_DEF;
+	StatusChangeFlagTable[SC_PACKING_ENVELOPE8] |= SCB_MDEF;
+	StatusChangeFlagTable[SC_PACKING_ENVELOPE9] |= SCB_CRI;
+	StatusChangeFlagTable[SC_PACKING_ENVELOPE10] |= SCB_HIT;
+
 	/* StatusDisplayType Table [Ind] */
 	StatusDisplayType[SC_ALL_RIDING]	  = BL_PC;
 	StatusDisplayType[SC_PUSH_CART]		  = BL_PC;
@@ -3779,6 +3802,8 @@ static int status_get_hpbonus(struct block_list *bl, enum e_status_bonus type) {
 				bonus -= sc->data[SC__WEAKNESS]->val2;
 			if(sc->data[SC_EQC])
 				bonus -= sc->data[SC_EQC]->val3;
+			if(sc->data[SC_PACKING_ENVELOPE3])
+				bonus += sc->data[SC_PACKING_ENVELOPE3]->val1;
 		}
 		// Max rate reduce is -100%
 		bonus = cap_value(bonus,-100,INT_MAX);
@@ -3911,6 +3936,8 @@ static int status_get_spbonus(struct block_list *bl, enum e_status_bonus type) {
 				bonus += sc->data[SC_LUXANIMA]->val3;
 			if (sc->data[SC_MTF_MSP])
 				bonus += sc->data[SC_MTF_MSP]->val1;
+			if(sc->data[SC_PACKING_ENVELOPE4])
+				bonus += sc->data[SC_PACKING_ENVELOPE4]->val1;
 
 			//Decreasing
 			if (sc->data[SC_MELODYOFSINK])
@@ -6955,6 +6982,8 @@ static unsigned short status_calc_watk(struct block_list *bl, struct status_chan
 		watk += watk * sc->data[SC_SUNSTANCE]->val2 / 100;
 	if (sc->data[SC_SOULFALCON])
 		watk += sc->data[SC_SOULFALCON]->val2;
+	if (sc->data[SC_PACKING_ENVELOPE1])
+		watk += sc->data[SC_PACKING_ENVELOPE1]->val1;
 
 	return (unsigned short)cap_value(watk,0,USHRT_MAX);
 }
@@ -7018,6 +7047,8 @@ static unsigned short status_calc_ematk(struct block_list *bl, struct status_cha
 		matk += sc->data[SC__AUTOSHADOWSPELL]->val4 * 5;
 	if (sc->data[SC_INSPIRATION])
 		matk += sc->data[SC_INSPIRATION]->val2;
+	if (sc->data[SC_PACKING_ENVELOPE2])
+		matk += sc->data[SC_PACKING_ENVELOPE2]->val1;
 
 	return (unsigned short)cap_value(matk,0,USHRT_MAX);
 }
@@ -7139,6 +7170,8 @@ static signed short status_calc_critical(struct block_list *bl, struct status_ch
 		critical += sc->data[SC_BEYONDOFWARCRY]->val3;
 	if (sc->data[SC_MTF_HITFLEE])
 		critical += sc->data[SC_MTF_HITFLEE]->val1;
+	if (sc->data[SC_PACKING_ENVELOPE9])
+		critical += sc->data[SC_PACKING_ENVELOPE9]->val1 * 10;
 
 	return (short)cap_value(critical,10,SHRT_MAX);
 }
@@ -7207,6 +7240,8 @@ static signed short status_calc_hit(struct block_list *bl, struct status_change
 		hit += sc->data[SC_SOULFALCON]->val3;
 	if (sc->data[SC_SATURDAYNIGHTFEVER])
 		hit -= 50 + 50 * sc->data[SC_SATURDAYNIGHTFEVER]->val1;
+	if (sc->data[SC_PACKING_ENVELOPE10])
+		hit += sc->data[SC_PACKING_ENVELOPE10]->val1;
 
 	return (short)cap_value(hit,1,SHRT_MAX);
 }
@@ -7319,6 +7354,8 @@ static signed short status_calc_flee(struct block_list *bl, struct status_change
 	//	flee -= (flee * sc->data[SC_C_MARKER]->val3) / 100;
 	if (sc->data[SC_GROOMING])
 		flee += sc->data[SC_GROOMING]->val2;
+	if (sc->data[SC_PACKING_ENVELOPE5])
+		flee += sc->data[SC_PACKING_ENVELOPE5]->val1;
 
 	return (short)cap_value(flee,1,SHRT_MAX);
 }
@@ -7445,6 +7482,8 @@ static defType status_calc_def(struct block_list *bl, struct status_change *sc,
 		def += sc->data[SC_SOULGOLEM]->val2;
 	if (sc->data[SC_STONE_WALL])
 		def += sc->data[SC_STONE_WALL]->val2;
+	if( sc->data[SC_PACKING_ENVELOPE7] )
+		def += sc->data[SC_PACKING_ENVELOPE7]->val1;
 
 	return (defType)cap_value(def,DEFTYPE_MIN,DEFTYPE_MAX);
 }
@@ -7573,6 +7612,8 @@ static defType status_calc_mdef(struct block_list *bl, struct status_change *sc,
 		mdef += sc->data[SC_SOULGOLEM]->val3;
 	if (sc->data[SC_STONE_WALL])
 		mdef += sc->data[SC_STONE_WALL]->val3;
+	if (sc->data[SC_PACKING_ENVELOPE8])
+		mdef += sc->data[SC_PACKING_ENVELOPE8]->val1;
 
 	return (defType)cap_value(mdef,DEFTYPE_MIN,DEFTYPE_MAX);
 }
@@ -7994,6 +8035,8 @@ static short status_calc_fix_aspd(struct block_list *bl, struct status_change *s
 		aspd -= sc->data[SC_HEAT_BARREL]->val1 * 10;
 	if (sc->data[SC_EP16_2_BUFF_SS])
 		aspd -= 100; // +10 ASPD
+	if (sc->data[SC_PACKING_ENVELOPE6])
+		aspd -= sc->data[SC_PACKING_ENVELOPE6]->val1 * 10;
 
 	return cap_value(aspd, 0, 2000); // Will be recap for proper bl anyway
 }
@@ -13235,6 +13278,16 @@ int status_change_clear(struct block_list* bl, int type)
 			case SC_SOULENERGY:
 			case SC_MADOGEAR:
 			case SC_HOMUN_TIME:
+			case SC_PACKING_ENVELOPE1:
+			case SC_PACKING_ENVELOPE2:
+			case SC_PACKING_ENVELOPE3:
+			case SC_PACKING_ENVELOPE4:
+			case SC_PACKING_ENVELOPE5:
+			case SC_PACKING_ENVELOPE6:
+			case SC_PACKING_ENVELOPE7:
+			case SC_PACKING_ENVELOPE8:
+			case SC_PACKING_ENVELOPE9:
+			case SC_PACKING_ENVELOPE10:
 			// Costumes
 			case SC_MOONSTAR:
 			case SC_SUPER_STAR:

+ 11 - 0
src/map/status.hpp

@@ -988,6 +988,17 @@ enum sc_type : int16 {
 
 	SC_NPC_HALLUCINATIONWALK,
 
+	SC_PACKING_ENVELOPE1,
+	SC_PACKING_ENVELOPE2,
+	SC_PACKING_ENVELOPE3,
+	SC_PACKING_ENVELOPE4,
+	SC_PACKING_ENVELOPE5,
+	SC_PACKING_ENVELOPE6,
+	SC_PACKING_ENVELOPE7,
+	SC_PACKING_ENVELOPE8,
+	SC_PACKING_ENVELOPE9,
+	SC_PACKING_ENVELOPE10,
+
 #ifdef RENEWAL
 	SC_EXTREMITYFIST2, //! NOTE: This SC should be right before SC_MAX, so it doesn't disturb if RENEWAL is disabled
 #endif