Преглед изворни кода

* Corrected Triple Blow
* Added 'Guardian Angel' code for supernovices

git-svn-id: https://svn.code.sf.net/p/rathena/svn/branches/stable@492 54d463be-8e91-2dee-dedb-b68131a5f0ec

celest пре 20 година
родитељ
комит
1a437b3c75
5 измењених фајлова са 37 додато и 2 уклоњено
  1. 2 0
      Changelog.txt
  2. 2 1
      src/map/battle.c
  3. 22 0
      src/map/clif.c
  4. 1 0
      src/map/map.h
  5. 10 1
      src/map/pc.c

+ 2 - 0
Changelog.txt

@@ -6,10 +6,12 @@ Date	Added
           - Level 6-10 Stone Curse will not consume a red gem now when it fails
           - Players should be able to use items when they're stoned but not yet
             completely petrified
+          - Corrected Triple Blow to work with bows (they actually do ^^)
         * Added 'guildgetexp' script command [celest]
         * Added bLongAtkRate item effect [celest]
         * Implemented Confusion (50%) - still need more info on how monsters act
           when they're confused [celest]
+        * Added 'Guardian Angel' code for supernovices [celest]
 
 12/6
 	* Fixed file props for new npcs [MouseJstr]

+ 2 - 1
src/map/battle.c

@@ -2926,7 +2926,8 @@ static struct Damage battle_calc_pc_weapon_attack(
 	}
 
 	//ŽO’i�¶
-	if(skill_num == 0 && skill_lv >= 0 && (skill = pc_checkskill(sd,MO_TRIPLEATTACK)) > 0 && sd->status.weapon <= 16 && !sd->state.arrow_atk) {
+	//if(skill_num == 0 && skill_lv >= 0 && (skill = pc_checkskill(sd,MO_TRIPLEATTACK)) > 0 && sd->status.weapon <= 16 && !sd->state.arrow_atk) {
+	if(skill_num == 0 && skill_lv >= 0 && (skill = pc_checkskill(sd,MO_TRIPLEATTACK)) > 0 && sd->status.weapon <= 16) { // triple blow works with bows ^^ [celest]
 			da = (rand()%100 < (30 - skill)) ? 2:0;
 	}
 

+ 22 - 0
src/map/clif.c

@@ -7728,6 +7728,28 @@ void clif_parse_GlobalMessage(int fd, struct map_session_data *sd) { // S 008c <
 	WFIFOW(fd,0) = 0x8e;
 	WFIFOSET(fd, WFIFOW(fd,2));
 
+	// Celest
+	if (pc_calc_base_job2 (sd->status.class) == 23 && (sd->status.base_exp*100/pc_nextbaseexp(sd))%10 == 0) {
+		estr_lower(RFIFOP(fd,4));
+		if (sd->state.snovice_flag == 0 && strstr(RFIFOP(fd,4), "guardian angel, can you hear my voice? ^^;"))
+			sd->state.snovice_flag = 1;
+		else if (sd->state.snovice_flag == 1) {
+			sprintf(message, "my name is %s, and i'm a super novice~", sd->status.name);
+			estr_lower(message);
+			if (strstr(RFIFOP(fd,4), message))
+				sd->state.snovice_flag = 2;
+		}
+		else if (sd->state.snovice_flag == 2 && strstr(RFIFOP(fd,4), "please help me~ t.t"))
+			sd->state.snovice_flag = 3;
+		else if (sd->state.snovice_flag == 3) {
+			int i;
+			skill_status_change_start(&sd->bl,SkillStatusChangeTable[MO_EXPLOSIONSPIRITS],1,0,0,0,skill_get_time(MO_EXPLOSIONSPIRITS,1),0 );
+			for(i=0;i<5;i++)
+				pc_addspiritball(sd,skill_get_time(MO_CALLSPIRITS,1),5);
+			sd->state.snovice_flag = 0;
+		}
+	}
+
 	if(message) free(message);
 	if(buf) free(buf);
 

+ 1 - 0
src/map/map.h

@@ -137,6 +137,7 @@ struct map_session_data {
 		unsigned make_arrow_flag : 1;
 		unsigned potionpitcher_flag : 1;
 		unsigned storage_flag : 1;
+		unsigned snovice_flag : 4;
 	} state;
 	struct {
 		unsigned killer : 1;

+ 10 - 1
src/map/pc.c

@@ -280,9 +280,14 @@ int pc_setrestartvalue(struct map_session_data *sd,int type) {
 
 	//-----------------------
 	// 死亡した
-	if(sd->special_state.restart_full_recover) {	// オシリスカ?ド
+	if(sd->special_state.restart_full_recover ||	// オシリスカ?ド
+		sd->state.snovice_flag == 4) {				// [Celest]
 		sd->status.hp=sd->status.max_hp;
 		sd->status.sp=sd->status.max_sp;
+		if (sd->state.snovice_flag == 4) {
+			sd->state.snovice_flag = 0;
+			skill_status_change_start(&sd->bl,SkillStatusChangeTable[MO_STEELBODY],1,0,0,0,skill_get_time(MO_STEELBODY,1),0 );
+		}
 	}
 	else {
 		if(s_class.job == 0 && battle_config.restart_hp_rate < 50) { //ノビは半分回復
@@ -5427,6 +5432,10 @@ int pc_damage(struct block_list *src,struct map_session_data *sd,int damage)
 	clif_updatestatus(sd,SP_HP);
 	pc_calcstatus(sd,0);
 
+	// activate Steel body if a super novice dies at 99+% exp [celest]
+	if (s_class.job == 23 && (i=sd->status.base_exp*1000/pc_nextbaseexp(sd))>=990 && i<=1000)
+		sd->state.snovice_flag = 4;
+
 	for(i=0;i<5;i++)
 		if(sd->dev.val1[i]){
 			skill_status_change_end(&map_id2sd(sd->dev.val1[i])->bl,SC_DEVOTION,-1);