summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--conf/battle/monster.conf4
-rw-r--r--conf/msg_athena.conf9
-rw-r--r--src/map/battle.c1
-rw-r--r--src/map/battle.h2
-rw-r--r--src/map/map.h2
-rw-r--r--src/map/mob.c62
-rw-r--r--src/map/mob.h2
-rw-r--r--src/map/npc.c27
-rw-r--r--src/map/npc.h5
9 files changed, 113 insertions, 1 deletions
diff --git a/conf/battle/monster.conf b/conf/battle/monster.conf
index 779a69f43..4d9014c91 100644
--- a/conf/battle/monster.conf
+++ b/conf/battle/monster.conf
@@ -197,3 +197,7 @@ ksprotection: 0
// Should MVP slaves retain their target when summoned back to their master?
mob_slave_keep_target: yes
+
+// Wheter or not to spawn the mvp tomb.
+// See http://irowiki.org/wiki/MVP#Gravestone
+mvp_tomb_enabled: yes
diff --git a/conf/msg_athena.conf b/conf/msg_athena.conf
index 83fca9cb9..a3f718e52 100644
--- a/conf/msg_athena.conf
+++ b/conf/msg_athena.conf
@@ -571,5 +571,14 @@
654: Oboro
655: Unknown Job
+// MvP Tomb
+// Added here so it can be easily translated
+656: Tomb
+657: [ ^EE0000%s^000000 ]
+658: Has met its demise
+659: Time of death : ^EE0000%s^000000
+660: Defeated by
+661: [^EE0000%s^000000]
+
//Custom translations
import: conf/import/msg_conf.txt
diff --git a/src/map/battle.c b/src/map/battle.c
index 86297f271..cb470f938 100644
--- a/src/map/battle.c
+++ b/src/map/battle.c
@@ -5209,6 +5209,7 @@ static const struct _battle_data {
{ "max_baby_third_parameter", &battle_config.max_baby_third_parameter, 108, 10, 10000, },
{ "atcommand_max_stat_bypass", &battle_config.atcommand_max_stat_bypass, 0, 0, 100, },
{ "skill_amotion_leniency", &battle_config.skill_amotion_leniency, 90, 0, 100 },
+ { "mvp_tomb_enabled", &battle_config.mvp_tomb_enabled, 1, 0, 1 },
};
diff --git a/src/map/battle.h b/src/map/battle.h
index 3e779c212..f8f0a10d7 100644
--- a/src/map/battle.h
+++ b/src/map/battle.h
@@ -472,6 +472,8 @@ extern struct Battle_Config
int max_third_parameter;
int max_baby_third_parameter;
int atcommand_max_stat_bypass;
+
+ int mvp_tomb_enabled;
} battle_config;
void do_init_battle(void);
diff --git a/src/map/map.h b/src/map/map.h
index b78e71b0c..a92a22884 100644
--- a/src/map/map.h
+++ b/src/map/map.h
@@ -241,7 +241,7 @@ enum bl_type {
//For common mapforeach calls. Since pets cannot be affected, they aren't included here yet.
#define BL_CHAR (BL_PC|BL_MOB|BL_HOM|BL_MER|BL_ELEM)
-enum npc_subtype { WARP, SHOP, SCRIPT, CASHSHOP };
+enum npc_subtype { WARP, SHOP, SCRIPT, CASHSHOP, TOMB };
enum {
RC_FORMLESS=0,
diff --git a/src/map/mob.c b/src/map/mob.c
index ee5bda342..896b97103 100644
--- a/src/map/mob.c
+++ b/src/map/mob.c
@@ -125,6 +125,60 @@ static int mobdb_searchname_array_sub(struct mob_db* mob, const char *str)
}
/*==========================================
+ * MvP Tomb [GreenBox]
+ *------------------------------------------*/
+void mvptomb_create(struct mob_data *md, char *killer, time_t time)
+{
+ struct npc_data *nd;
+
+ CREATE(nd, struct npc_data, 1);
+
+ nd->bl.id = md->tomb_nid = npc_get_new_npc_id();
+
+ nd->ud.dir = md->ud.dir;
+ nd->bl.m = md->bl.m;
+ nd->bl.x = md->bl.x;
+ nd->bl.y = md->bl.y;
+ nd->bl.type = BL_NPC;
+
+ safestrncpy(nd->name, msg_txt(656), sizeof(nd->name));
+
+ nd->class_ = 565;
+ nd->speed = 200;
+ nd->subtype = TOMB;
+
+ nd->u.tomb.md = md;
+ nd->u.tomb.kill_time = time;
+
+ if (killer)
+ nd->u.tomb.killer_name = aStrdup(killer); // Don't rely that killer name will be available all time
+ else
+ nd->u.tomb.killer_name = NULL;
+
+ map_addnpc(nd->bl.m, nd);
+ map_addblock(&nd->bl);
+ status_set_viewdata(&nd->bl, nd->class_);
+ status_change_init(&nd->bl);
+ unit_dataset(&nd->bl);
+ clif_spawn(&nd->bl);
+}
+
+void mvptomb_destroy(struct mob_data *md)
+{
+ struct npc_data *nd = (struct npc_data *)map_id2bl(md->tomb_nid);
+
+ if (nd)
+ {
+ if (nd->u.tomb.killer_name)
+ aFree(nd->u.tomb.killer_name);
+
+ npc_unload(nd);
+ }
+
+ md->tomb_nid = 0;
+}
+
+/*==========================================
* Founds up to N matches. Returns number of matches [Skotlex]
*------------------------------------------*/
int mobdb_searchname_array(struct mob_db** data, int size, const char *str)
@@ -916,6 +970,10 @@ int mob_spawn (struct mob_data *md)
// Added for carts, falcons and pecos for cloned monsters. [Valaris]
md->sc.option = md->db->option;
+ // MvP tomb [GreenBox]
+ if (md->tomb_nid)
+ mvptomb_destroy(md);
+
map_addblock(&md->bl);
if( map[md->bl.m].users )
clif_spawn(&md->bl);
@@ -2505,6 +2563,10 @@ int mob_dead(struct mob_data *md, struct block_list *src, int type)
if(!md->spawn) //Tell status_damage to remove it from memory.
return 5; // Note: Actually, it's 4. Oh well...
+ // MvP tomb [GreenBox]
+ if (battle_config.mvp_tomb_enabled && md->spawn->state.boss)
+ mvptomb_create(md, mvp_sd ? mvp_sd->status.name : NULL, time(NULL));
+
if( !rebirth )
mob_setdelayspawn(md); //Set respawning.
return 3; //Remove from map.
diff --git a/src/map/mob.h b/src/map/mob.h
index a93cb04e3..4caf0148c 100644
--- a/src/map/mob.h
+++ b/src/map/mob.h
@@ -167,6 +167,8 @@ struct mob_data {
* Used to flag summon deletions, saves a worth amount of memory
**/
bool can_summon : 1;
+
+ int tomb_nid;
};
diff --git a/src/map/npc.c b/src/map/npc.c
index 661406c95..d0defdf88 100644
--- a/src/map/npc.c
+++ b/src/map/npc.c
@@ -1078,6 +1078,31 @@ int npc_globalmessage(const char* name, const char* mes)
return 0;
}
+// MvP tomb [GreenBox]
+void run_tomb(struct map_session_data* sd, struct npc_data* nd)
+{
+ char buffer[200];
+ char time[10];
+
+ strftime(time, sizeof(time), "%H:%M", localtime(&nd->u.tomb.kill_time));
+
+ // TODO: Find exact color?
+ snprintf(buffer, sizeof(buffer), msg_txt(657), nd->u.tomb.md->db->name);
+ clif_scriptmes(sd, nd->bl.id, buffer);
+
+ clif_scriptmes(sd, nd->bl.id, msg_txt(658));
+
+ snprintf(buffer, sizeof(buffer), msg_txt(659), time);
+ clif_scriptmes(sd, nd->bl.id, buffer);
+
+ clif_scriptmes(sd, nd->bl.id, msg_txt(660));
+
+ snprintf(buffer, sizeof(buffer), msg_txt(661), nd->u.tomb.killer_name ? nd->u.tomb.killer_name : "Unknown");
+ clif_scriptmes(sd, nd->bl.id, buffer);
+
+ clif_scriptclose(sd, nd->bl.id);
+}
+
/*==========================================
* クリック時のNPC処理
*------------------------------------------*/
@@ -1107,6 +1132,8 @@ int npc_click(struct map_session_data* sd, struct npc_data* nd)
case SCRIPT:
run_script(nd->u.scr.script,0,sd->bl.id,nd->bl.id);
break;
+ case TOMB:
+ run_tomb(sd,nd);
}
return 0;
diff --git a/src/map/npc.h b/src/map/npc.h
index 5e5bcb41a..47f6117d9 100644
--- a/src/map/npc.h
+++ b/src/map/npc.h
@@ -62,6 +62,11 @@ struct npc_data {
short x,y; // destination coords
unsigned short mapindex; // destination map
} warp;
+ struct {
+ struct mob_data *md;
+ time_t kill_time;
+ char *killer_name;
+ } tomb;
} u;
};