mob_chat_db txt to yml (#5976)
* Converted mob_chat_db txt to yml * mob_skill_db now display a warning when the chat ID doesn't exist Thanks to @Lemongrass3110 and @aleos89 !
This commit is contained in:
parent
2a831df25e
commit
7f71f4c0c3
@ -1,5 +0,0 @@
|
|||||||
// Monster Chat Database
|
|
||||||
//
|
|
||||||
// Structure of Database:
|
|
||||||
// Line_ID#Color_Code#Dialog
|
|
||||||
|
|
32
db/import-tmpl/mob_chat_db.yml
Normal file
32
db/import-tmpl/mob_chat_db.yml
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
# This file is a part of rAthena.
|
||||||
|
# Copyright(C) 2021 rAthena Development Team
|
||||||
|
# https://rathena.org - https://github.com/rathena
|
||||||
|
#
|
||||||
|
# This program is free software: you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation, either version 3 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
#
|
||||||
|
###########################################################################
|
||||||
|
# Monster Chat Database
|
||||||
|
###########################################################################
|
||||||
|
#
|
||||||
|
# Settings
|
||||||
|
#
|
||||||
|
###########################################################################
|
||||||
|
# - Id Index of the message.
|
||||||
|
# Color Hexadecimal color (Default: 0xFF0000).
|
||||||
|
# Dialog Text displayed by the monster.
|
||||||
|
###########################################################################
|
||||||
|
|
||||||
|
Header:
|
||||||
|
Type: MOB_CHAT_DB
|
||||||
|
Version: 1
|
@ -1,46 +0,0 @@
|
|||||||
// Monster Chat Database
|
|
||||||
//
|
|
||||||
// Structure of Database:
|
|
||||||
// Line_ID#Color_Code#Dialog
|
|
||||||
|
|
||||||
1#0xFF0000#Weakling! Challenge me if you have any courage!
|
|
||||||
2#0xFF0000#Impressive! I wonder how far your recklessness will take you.
|
|
||||||
3#0xFF0000#I almost pity how outmatched you are against me. Now prepare for my attack!
|
|
||||||
4#0xFF0000#My loyal servants! Welcome them with a painful death!
|
|
||||||
5#0xFF0000#Don't you run away!
|
|
||||||
6#0xFF0000#You worthless humans. Your so-called holy powers have no effect on me!
|
|
||||||
7#0xFF0000#Useless underlings!...Well, that's fine, I have more weapons to use and dispose.
|
|
||||||
8#0xFF0000#Pray to your gods!
|
|
||||||
9#0xFF0000#Do you still think you're a match to me?!
|
|
||||||
10#0xFF0000#Vanish!
|
|
||||||
11#0xFF0000#Let's see how long you can endure my power!
|
|
||||||
12#0xFF0000#Is this all you've got?!
|
|
||||||
13#0xFF0000#You're tickling me!
|
|
||||||
14#0xFF0000#This is how you attack? Watch and learn, weaklings!
|
|
||||||
15#0xFF0000#It's time to finish the game!
|
|
||||||
16#0xFF0000#Oh, you're stronger than I thought!
|
|
||||||
17#0xFF0000#No, this can't be happening! I'm Satan Morocc, Demon King of Destruction!
|
|
||||||
18#0xFF0000#I can never die! I'll be coming back for you!
|
|
||||||
19#0xFF0000#I was born to conquer this world! None shall stop me!
|
|
||||||
20#0xFF0000#Your days are numbered!
|
|
||||||
21#0xFF0000#Pulse Strike! My fingers tear steel!
|
|
||||||
22#0xFF0000#Hahaha, tell me who I am! I'm Baphomet, the Heir of Hell!
|
|
||||||
23#0xFF0000#Enjoy your time on the mortal plane while you can, your hope will soon turn into despair!
|
|
||||||
24#0xFF0000#When are you going to learn your lesson? In death?
|
|
||||||
25#0xFF0000#No... I can't lose! I won't beg for my life! I'm not running away! I don't accept this as defeat!
|
|
||||||
26#0xFF0000#Argh... I... I'm weakening...
|
|
||||||
27#0xFF0000#What do you want from me?
|
|
||||||
28#0xFF0000#No! I didn't do this! He's the one who planned out all this!
|
|
||||||
29#0xFF0000#I just wanted to find peace..! That's why I have been fleeing away!
|
|
||||||
30#0xFF0000#Ahhhh!!! Now, I just have to kill you all!
|
|
||||||
31#0xFF0000#Annoying flies!! Get off of me!
|
|
||||||
32#0xFF0000#Suffer in Hell!
|
|
||||||
33#0xFF0000#Mwahahaha! Taste the anger of the earth!!!
|
|
||||||
34#0xFF0000#No... I won't accept this as defeat!
|
|
||||||
35#0xFF0000#Will it ease your loneliness to hit me? Why don't you stay here with me forever, human?
|
|
||||||
36#0xFF0000#You will forgot the meaning of time. I wonder how long can you last in here...
|
|
||||||
37#0xFF0000#Is there anyone waiting for you outside of here? Throw them all away, you are mine now...
|
|
||||||
38#0xFF0000#Discard your life and stay confined here. You will yearn for freedom in captivity !!
|
|
||||||
39#0xFF0000#How much will the outside world change if you stay here in solitude for one thousand years?
|
|
||||||
40#0xFF0000#Yes! Yearn for your freedom from this confined place, your captivity here will be permanent !!
|
|
||||||
|
|
118
db/mob_chat_db.yml
Normal file
118
db/mob_chat_db.yml
Normal file
@ -0,0 +1,118 @@
|
|||||||
|
# This file is a part of rAthena.
|
||||||
|
# Copyright(C) 2021 rAthena Development Team
|
||||||
|
# https://rathena.org - https://github.com/rathena
|
||||||
|
#
|
||||||
|
# This program is free software: you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation, either version 3 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
#
|
||||||
|
###########################################################################
|
||||||
|
# Monster Chat Database
|
||||||
|
###########################################################################
|
||||||
|
#
|
||||||
|
# Settings
|
||||||
|
#
|
||||||
|
###########################################################################
|
||||||
|
# - Id Index of the message.
|
||||||
|
# Color Hexadecimal color (Default: 0xFF0000).
|
||||||
|
# Dialog Text displayed by the monster.
|
||||||
|
###########################################################################
|
||||||
|
|
||||||
|
Header:
|
||||||
|
Type: MOB_CHAT_DB
|
||||||
|
Version: 1
|
||||||
|
|
||||||
|
Body:
|
||||||
|
- Id: 1
|
||||||
|
Dialog: Weakling! Challenge me if you have any courage!
|
||||||
|
- Id: 2
|
||||||
|
Dialog: Impressive! I wonder how far your recklessness will take you.
|
||||||
|
- Id: 3
|
||||||
|
Dialog: I almost pity how outmatched you are against me. Now prepare for my attack!
|
||||||
|
- Id: 4
|
||||||
|
Dialog: My loyal servants! Welcome them with a painful death!
|
||||||
|
- Id: 5
|
||||||
|
Dialog: Don't you run away!
|
||||||
|
- Id: 6
|
||||||
|
Dialog: You worthless humans. Your so-called holy powers have no effect on me!
|
||||||
|
- Id: 7
|
||||||
|
Dialog: Useless underlings!...Well, that's fine, I have more weapons to use and dispose.
|
||||||
|
- Id: 8
|
||||||
|
Dialog: Pray to your gods!
|
||||||
|
- Id: 9
|
||||||
|
Dialog: Do you still think you're a match to me?!
|
||||||
|
- Id: 10
|
||||||
|
Dialog: Vanish!
|
||||||
|
- Id: 11
|
||||||
|
Dialog: Let's see how long you can endure my power!
|
||||||
|
- Id: 12
|
||||||
|
Dialog: Is this all you've got?!
|
||||||
|
- Id: 13
|
||||||
|
Dialog: You're tickling me!
|
||||||
|
- Id: 14
|
||||||
|
Dialog: This is how you attack? Watch and learn, weaklings!
|
||||||
|
- Id: 15
|
||||||
|
Dialog: It's time to finish the game!
|
||||||
|
- Id: 16
|
||||||
|
Dialog: Oh, you're stronger than I thought!
|
||||||
|
- Id: 17
|
||||||
|
Dialog: No, this can't be happening! I'm Satan Morocc, Demon King of Destruction!
|
||||||
|
- Id: 18
|
||||||
|
Dialog: I can never die! I'll be coming back for you!
|
||||||
|
- Id: 19
|
||||||
|
Dialog: I was born to conquer this world! None shall stop me!
|
||||||
|
- Id: 20
|
||||||
|
Dialog: Your days are numbered!
|
||||||
|
- Id: 21
|
||||||
|
Dialog: Pulse Strike! My fingers tear steel!
|
||||||
|
- Id: 22
|
||||||
|
Dialog: Hahaha, tell me who I am! I'm Baphomet, the Heir of Hell!
|
||||||
|
- Id: 23
|
||||||
|
Dialog: Enjoy your time on the mortal plane while you can, your hope will soon turn into despair!
|
||||||
|
- Id: 24
|
||||||
|
Dialog: When are you going to learn your lesson? In death?
|
||||||
|
- Id: 25
|
||||||
|
Dialog: No... I can't lose! I won't beg for my life! I'm not running away! I don't accept this as defeat!
|
||||||
|
- Id: 26
|
||||||
|
Dialog: Argh... I... I'm weakening...
|
||||||
|
- Id: 27
|
||||||
|
Dialog: What do you want from me?
|
||||||
|
- Id: 28
|
||||||
|
Dialog: No! I didn't do this! He's the one who planned out all this!
|
||||||
|
- Id: 29
|
||||||
|
Dialog: I just wanted to find peace..! That's why I have been fleeing away!
|
||||||
|
- Id: 30
|
||||||
|
Dialog: Ahhhh!!! Now, I just have to kill you all!
|
||||||
|
- Id: 31
|
||||||
|
Dialog: Annoying flies!! Get off of me!
|
||||||
|
- Id: 32
|
||||||
|
Dialog: Suffer in Hell!
|
||||||
|
- Id: 33
|
||||||
|
Dialog: Mwahahaha! Taste the anger of the earth!!!
|
||||||
|
- Id: 34
|
||||||
|
Dialog: No... I won't accept this as defeat!
|
||||||
|
- Id: 35
|
||||||
|
Dialog: Will it ease your loneliness to hit me? Why don't you stay here with me forever, human?
|
||||||
|
- Id: 36
|
||||||
|
Dialog: You will forgot the meaning of time. I wonder how long can you last in here...
|
||||||
|
- Id: 37
|
||||||
|
Dialog: Is there anyone waiting for you outside of here? Throw them all away, you are mine now...
|
||||||
|
- Id: 38
|
||||||
|
Dialog: Discard your life and stay confined here. You will yearn for freedom in captivity !!
|
||||||
|
- Id: 39
|
||||||
|
Dialog: How much will the outside world change if you stay here in solitude for one thousand years?
|
||||||
|
- Id: 40
|
||||||
|
Dialog: Yes! Yearn for your freedom from this confined place, your captivity here will be permanent !!
|
||||||
|
|
||||||
|
Footer:
|
||||||
|
Imports:
|
||||||
|
- Path: db/import/mob_chat_db.yml
|
@ -10987,17 +10987,29 @@
|
|||||||
2940,Evil Shadow@NPC_DARKSTRIKE,attack,340,1,3000,0,5000,yes,target,always,0,,,,,,,
|
2940,Evil Shadow@NPC_DARKSTRIKE,attack,340,1,3000,0,5000,yes,target,always,0,,,,,,,
|
||||||
2941,Evil Shadow@NPC_CRITICALSLASH,chase,170,1,3000,0,5000,yes,target,always,0,,,,,,,
|
2941,Evil Shadow@NPC_CRITICALSLASH,chase,170,1,3000,0,5000,yes,target,always,0,,,,,,,
|
||||||
2941,Evil Shadow@NPC_PETRIFYATTACK,attack,180,5,3500,0,5000,yes,target,always,0,,,,,,,
|
2941,Evil Shadow@NPC_PETRIFYATTACK,attack,180,5,3500,0,5000,yes,target,always,0,,,,,,,
|
||||||
2942,Evil Fanatics@NPC_INVINCIBLE,idle,685,1,10000,0,20000,yes,self,myhpltmaxrate,100,,,,,,,42
|
2942,Evil Fanatics@NPC_INVINCIBLE,idle,685,1,10000,0,20000,yes,self,myhpltmaxrate,100,,,,,,,
|
||||||
2942,Evil Fanatics@NPC_INVINCIBLE,attack,685,1,10000,0,20000,yes,self,myhpltmaxrate,100,,,,,,,42
|
2942,Evil Fanatics@NPC_INVINCIBLE,attack,685,1,10000,0,20000,yes,self,myhpltmaxrate,100,,,,,,,
|
||||||
2942,Evil Fanatics@NPC_INVINCIBLE,attack,685,1,10000,0,20000,yes,self,myhpltmaxrate,90,,,,,,,42
|
2942,Evil Fanatics@NPC_INVINCIBLE,attack,685,1,10000,0,20000,yes,self,myhpltmaxrate,90,,,,,,,
|
||||||
2942,Evil Fanatics@NPC_INVINCIBLE,attack,685,1,10000,0,20000,yes,self,myhpltmaxrate,80,,,,,,,42
|
2942,Evil Fanatics@NPC_INVINCIBLE,attack,685,1,10000,0,20000,yes,self,myhpltmaxrate,80,,,,,,,
|
||||||
2942,Evil Fanatics@NPC_INVINCIBLE,attack,685,1,10000,0,20000,yes,self,myhpltmaxrate,70,,,,,,,42
|
2942,Evil Fanatics@NPC_INVINCIBLE,attack,685,1,10000,0,20000,yes,self,myhpltmaxrate,70,,,,,,,
|
||||||
2942,Evil Fanatics@NPC_INVINCIBLE,attack,685,1,10000,0,20000,yes,self,myhpltmaxrate,60,,,,,,,42
|
2942,Evil Fanatics@NPC_INVINCIBLE,attack,685,1,10000,0,20000,yes,self,myhpltmaxrate,60,,,,,,,
|
||||||
2942,Evil Fanatics@NPC_INVINCIBLE,attack,685,1,10000,0,20000,yes,self,myhpltmaxrate,50,,,,,,,42
|
2942,Evil Fanatics@NPC_INVINCIBLE,attack,685,1,10000,0,20000,yes,self,myhpltmaxrate,50,,,,,,,
|
||||||
2942,Evil Fanatics@NPC_INVINCIBLE,attack,685,1,10000,0,20000,yes,self,myhpltmaxrate,40,,,,,,,42
|
2942,Evil Fanatics@NPC_INVINCIBLE,attack,685,1,10000,0,20000,yes,self,myhpltmaxrate,40,,,,,,,
|
||||||
2942,Evil Fanatics@NPC_INVINCIBLE,attack,685,1,10000,0,20000,yes,self,myhpltmaxrate,30,,,,,,,42
|
2942,Evil Fanatics@NPC_INVINCIBLE,attack,685,1,10000,0,20000,yes,self,myhpltmaxrate,30,,,,,,,
|
||||||
2942,Evil Fanatics@NPC_INVINCIBLE,attack,685,1,10000,0,20000,yes,self,myhpltmaxrate,20,,,,,,,42
|
2942,Evil Fanatics@NPC_INVINCIBLE,attack,685,1,10000,0,20000,yes,self,myhpltmaxrate,20,,,,,,,
|
||||||
2942,Evil Fanatics@NPC_INVINCIBLE,attack,685,1,10000,0,20000,yes,self,myhpltmaxrate,10,,,,,,,42
|
2942,Evil Fanatics@NPC_INVINCIBLE,attack,685,1,10000,0,20000,yes,self,myhpltmaxrate,10,,,,,,,
|
||||||
|
// unknown monster chat
|
||||||
|
// 2942,Evil Fanatics@NPC_INVINCIBLE,idle,685,1,10000,0,20000,yes,self,myhpltmaxrate,100,,,,,,,42
|
||||||
|
// 2942,Evil Fanatics@NPC_INVINCIBLE,attack,685,1,10000,0,20000,yes,self,myhpltmaxrate,100,,,,,,,42
|
||||||
|
// 2942,Evil Fanatics@NPC_INVINCIBLE,attack,685,1,10000,0,20000,yes,self,myhpltmaxrate,90,,,,,,,42
|
||||||
|
// 2942,Evil Fanatics@NPC_INVINCIBLE,attack,685,1,10000,0,20000,yes,self,myhpltmaxrate,80,,,,,,,42
|
||||||
|
// 2942,Evil Fanatics@NPC_INVINCIBLE,attack,685,1,10000,0,20000,yes,self,myhpltmaxrate,70,,,,,,,42
|
||||||
|
// 2942,Evil Fanatics@NPC_INVINCIBLE,attack,685,1,10000,0,20000,yes,self,myhpltmaxrate,60,,,,,,,42
|
||||||
|
// 2942,Evil Fanatics@NPC_INVINCIBLE,attack,685,1,10000,0,20000,yes,self,myhpltmaxrate,50,,,,,,,42
|
||||||
|
// 2942,Evil Fanatics@NPC_INVINCIBLE,attack,685,1,10000,0,20000,yes,self,myhpltmaxrate,40,,,,,,,42
|
||||||
|
// 2942,Evil Fanatics@NPC_INVINCIBLE,attack,685,1,10000,0,20000,yes,self,myhpltmaxrate,30,,,,,,,42
|
||||||
|
// 2942,Evil Fanatics@NPC_INVINCIBLE,attack,685,1,10000,0,20000,yes,self,myhpltmaxrate,20,,,,,,,42
|
||||||
|
// 2942,Evil Fanatics@NPC_INVINCIBLE,attack,685,1,10000,0,20000,yes,self,myhpltmaxrate,10,,,,,,,42
|
||||||
// 2942,Evil Fanatics@NPC_DANCINGBLADE,attack,713,1,1000,0,15000,yes,self,always,0,,,,,,,
|
// 2942,Evil Fanatics@NPC_DANCINGBLADE,attack,713,1,1000,0,15000,yes,self,always,0,,,,,,,
|
||||||
// 2942,Evil Fanatics@NPC_PULSESTRIKE2,attack,712,1,800,0,15000,yes,self,always,0,,,,,,,
|
// 2942,Evil Fanatics@NPC_PULSESTRIKE2,attack,712,1,800,0,15000,yes,self,always,0,,,,,,,
|
||||||
// 2942,Evil Fanatics@NPC_DARKPIERCING,attack,715,1,2500,0,60000,yes,self,always,0,,,,,,,
|
// 2942,Evil Fanatics@NPC_DARKPIERCING,attack,715,1,2500,0,60000,yes,self,always,0,,,,,,,
|
||||||
|
11
doc/yaml/db/mob_chat_db.yml
Normal file
11
doc/yaml/db/mob_chat_db.yml
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
###########################################################################
|
||||||
|
# Monster Chat Database
|
||||||
|
###########################################################################
|
||||||
|
#
|
||||||
|
# Settings
|
||||||
|
#
|
||||||
|
###########################################################################
|
||||||
|
# - Id Index of the message.
|
||||||
|
# Color Hexadecimal color (Default: 0xFF0000).
|
||||||
|
# Dialog Text displayed by the monster.
|
||||||
|
###########################################################################
|
@ -339,7 +339,7 @@
|
|||||||
<Copy SourceFiles="$(SolutionDir)db\import-tmpl\mob_avail.yml" DestinationFolder="$(SolutionDir)db\import\" ContinueOnError="true" Condition="!Exists('$(SolutionDir)db\import\mob_avail.yml')" />
|
<Copy SourceFiles="$(SolutionDir)db\import-tmpl\mob_avail.yml" DestinationFolder="$(SolutionDir)db\import\" ContinueOnError="true" Condition="!Exists('$(SolutionDir)db\import\mob_avail.yml')" />
|
||||||
<Copy SourceFiles="$(SolutionDir)db\import-tmpl\mob_boss.txt" DestinationFolder="$(SolutionDir)db\import\" ContinueOnError="true" Condition="!Exists('$(SolutionDir)db\import\mob_boss.txt')" />
|
<Copy SourceFiles="$(SolutionDir)db\import-tmpl\mob_boss.txt" DestinationFolder="$(SolutionDir)db\import\" ContinueOnError="true" Condition="!Exists('$(SolutionDir)db\import\mob_boss.txt')" />
|
||||||
<Copy SourceFiles="$(SolutionDir)db\import-tmpl\mob_branch.txt" DestinationFolder="$(SolutionDir)db\import\" ContinueOnError="true" Condition="!Exists('$(SolutionDir)db\import\mob_branch.txt')" />
|
<Copy SourceFiles="$(SolutionDir)db\import-tmpl\mob_branch.txt" DestinationFolder="$(SolutionDir)db\import\" ContinueOnError="true" Condition="!Exists('$(SolutionDir)db\import\mob_branch.txt')" />
|
||||||
<Copy SourceFiles="$(SolutionDir)db\import-tmpl\mob_chat_db.txt" DestinationFolder="$(SolutionDir)db\import\" ContinueOnError="true" Condition="!Exists('$(SolutionDir)db\import\mob_chat_db.txt')" />
|
<Copy SourceFiles="$(SolutionDir)db\import-tmpl\mob_chat_db.yml" DestinationFolder="$(SolutionDir)db\import\" ContinueOnError="true" Condition="!Exists('$(SolutionDir)db\import\mob_chat_db.yml')" />
|
||||||
<Copy SourceFiles="$(SolutionDir)db\import-tmpl\mob_classchange.txt" DestinationFolder="$(SolutionDir)db\import\" ContinueOnError="true" Condition="!Exists('$(SolutionDir)db\import\mob_classchange.txt')" />
|
<Copy SourceFiles="$(SolutionDir)db\import-tmpl\mob_classchange.txt" DestinationFolder="$(SolutionDir)db\import\" ContinueOnError="true" Condition="!Exists('$(SolutionDir)db\import\mob_classchange.txt')" />
|
||||||
<Copy SourceFiles="$(SolutionDir)db\import-tmpl\mob_db.yml" DestinationFolder="$(SolutionDir)db\import\" ContinueOnError="true" Condition="!Exists('$(SolutionDir)db\import\mob_db.yml')" />
|
<Copy SourceFiles="$(SolutionDir)db\import-tmpl\mob_db.yml" DestinationFolder="$(SolutionDir)db\import\" ContinueOnError="true" Condition="!Exists('$(SolutionDir)db\import\mob_db.yml')" />
|
||||||
<Copy SourceFiles="$(SolutionDir)db\import-tmpl\mob_item_ratio.txt" DestinationFolder="$(SolutionDir)db\import\" ContinueOnError="true" Condition="!Exists('$(SolutionDir)db\import\mob_item_ratio.txt')" />
|
<Copy SourceFiles="$(SolutionDir)db\import-tmpl\mob_item_ratio.txt" DestinationFolder="$(SolutionDir)db\import\" ContinueOnError="true" Condition="!Exists('$(SolutionDir)db\import\mob_item_ratio.txt')" />
|
||||||
|
108
src/map/mob.cpp
108
src/map/mob.cpp
@ -73,12 +73,6 @@ const t_tick MOB_MAX_DELAY = 24 * 3600 * 1000;
|
|||||||
// holds Monster Spawn informations
|
// holds Monster Spawn informations
|
||||||
std::unordered_map<uint16, std::vector<spawn_info>> mob_spawn_data;
|
std::unordered_map<uint16, std::vector<spawn_info>> mob_spawn_data;
|
||||||
|
|
||||||
//Dynamic mob chat database
|
|
||||||
std::map<short,struct mob_chat> mob_chat_db;
|
|
||||||
struct mob_chat *mob_chat(short id) {
|
|
||||||
return util::map_find( mob_chat_db, id );
|
|
||||||
}
|
|
||||||
|
|
||||||
//Dynamic item drop ratio database for per-item drop ratio modifiers overriding global drop ratios.
|
//Dynamic item drop ratio database for per-item drop ratio modifiers overriding global drop ratios.
|
||||||
#define MAX_ITEMRATIO_MOBS 10
|
#define MAX_ITEMRATIO_MOBS 10
|
||||||
struct s_mob_item_drop_ratio {
|
struct s_mob_item_drop_ratio {
|
||||||
@ -112,6 +106,8 @@ struct s_randomsummon_group {
|
|||||||
|
|
||||||
static DBMap *mob_summon_db; /// Random Summon DB. struct s_randomsummon_group -> group_id
|
static DBMap *mob_summon_db; /// Random Summon DB. struct s_randomsummon_group -> group_id
|
||||||
|
|
||||||
|
MobChatDatabase mob_chat_db;
|
||||||
|
|
||||||
/*==========================================
|
/*==========================================
|
||||||
* Local prototype declaration (only required thing)
|
* Local prototype declaration (only required thing)
|
||||||
*------------------------------------------*/
|
*------------------------------------------*/
|
||||||
@ -3856,7 +3852,7 @@ int mobskill_use(struct mob_data *md, t_tick tick, int event)
|
|||||||
}
|
}
|
||||||
//Skill used. Post-setups...
|
//Skill used. Post-setups...
|
||||||
if ( ms[i]->msg_id ){ //Display color message [SnakeDrak]
|
if ( ms[i]->msg_id ){ //Display color message [SnakeDrak]
|
||||||
struct mob_chat *mc = mob_chat(ms[i]->msg_id);
|
std::shared_ptr<s_mob_chat> mc = mob_chat_db.find(ms[i]->msg_id);
|
||||||
|
|
||||||
if (mc) {
|
if (mc) {
|
||||||
std::string name = md->name, output;
|
std::string name = md->name, output;
|
||||||
@ -5522,59 +5518,62 @@ static bool mob_readdb_group(char* str[], int columns, int current){
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
//processes one mob_chat_db entry [SnakeDrak]
|
const std::string MobChatDatabase::getDefaultLocation() {
|
||||||
//db struct: Line_ID,Color_Code,Dialog
|
return std::string(db_path) + "/mob_chat_db.yml";
|
||||||
static bool mob_parse_row_chatdb(char* fields[], int columns, int current)
|
}
|
||||||
{
|
|
||||||
char* msg;
|
|
||||||
struct mob_chat *ms;
|
|
||||||
int msg_id;
|
|
||||||
size_t len;
|
|
||||||
|
|
||||||
msg_id = atoi(fields[0]);
|
/**
|
||||||
|
* Reads and parses an entry from the mob_chat_db.
|
||||||
|
* @param node: YAML node containing the entry.
|
||||||
|
* @return count of successfully parsed rows
|
||||||
|
*/
|
||||||
|
uint64 MobChatDatabase::parseBodyNode(const YAML::Node &node) {
|
||||||
|
uint16 id;
|
||||||
|
|
||||||
if (msg_id <= 0){
|
if (!this->asUInt16(node, "Id", id))
|
||||||
ShowError("mob_parse_row_chatdb: Invalid chat ID '%d' in line %d\n", msg_id, current);
|
return 0;
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
ms = mob_chat(msg_id);
|
std::shared_ptr<s_mob_chat> chat = this->find(id);
|
||||||
|
bool exists = chat != nullptr;
|
||||||
|
|
||||||
if( ms == NULL ){
|
if (!exists) {
|
||||||
try{
|
if (!this->nodesExist(node, { "Dialog" })) {
|
||||||
ms = &mob_chat_db[msg_id];
|
return 0;
|
||||||
}catch( const std::bad_alloc& ){
|
|
||||||
ShowError( "mob_parse_row_chatdb: Memory allocation for chat ID '%d' failed.\n", msg_id );
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
chat = std::make_shared<s_mob_chat>();
|
||||||
|
chat->msg_id = id;
|
||||||
}
|
}
|
||||||
|
|
||||||
//MSG ID
|
if (this->nodeExists(node, "Color")) {
|
||||||
ms->msg_id=msg_id;
|
std::string hex;
|
||||||
//Color
|
|
||||||
ms->color=strtoul(fields[1],NULL,0);
|
|
||||||
//Message
|
|
||||||
msg = fields[2];
|
|
||||||
len = strlen(msg);
|
|
||||||
|
|
||||||
while( len && ( msg[len-1]=='\r' || msg[len-1]=='\n' ) )
|
if (!this->asString(node, "Color", hex))
|
||||||
{// find EOL to strip
|
return 0;
|
||||||
len--;
|
|
||||||
|
chat->color = strtoul(hex.c_str(), nullptr, 0);
|
||||||
|
} else {
|
||||||
|
if (!exists)
|
||||||
|
chat->color = strtoul("0xFF0000", nullptr, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(len>(CHAT_SIZE_MAX-1)){
|
if (this->nodeExists(node, "Dialog")) {
|
||||||
ShowError("mob_parse_row_chatdb: Message too long! Line %d, id: %d\n", current, msg_id);
|
std::string msg;
|
||||||
return false;
|
|
||||||
}
|
if (!this->asString(node, "Dialog", msg))
|
||||||
else if( !len ){
|
return 0;
|
||||||
ShowWarning("mob_parse_row_chatdb: Empty message for id %d.\n", msg_id);
|
|
||||||
return false;
|
if (msg.length() > (CHAT_SIZE_MAX-1)) {
|
||||||
|
this->invalidWarning(node["Dialog"], "Message too long!\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
chat->msg = msg;
|
||||||
}
|
}
|
||||||
|
|
||||||
msg[len] = 0; // strip previously found EOL
|
if (!exists)
|
||||||
safestrncpy(ms->msg, fields[2], CHAT_SIZE_MAX);
|
this->put(id, chat);
|
||||||
|
|
||||||
return true;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*==========================================
|
/*==========================================
|
||||||
@ -5810,8 +5809,15 @@ static bool mob_parse_row_mobskilldb(char** str, int columns, int current)
|
|||||||
else
|
else
|
||||||
ms->emotion = -1;
|
ms->emotion = -1;
|
||||||
|
|
||||||
if(str[18] != NULL && mob_chat(atoi(str[18]))!=NULL)
|
if (*str[18]) {
|
||||||
ms->msg_id = atoi(str[18]);
|
uint16 id = static_cast<uint16>(strtol(str[18], nullptr, 10));
|
||||||
|
if (mob_chat_db.find(id) != nullptr)
|
||||||
|
ms->msg_id = id;
|
||||||
|
else {
|
||||||
|
ms->msg_id = 0;
|
||||||
|
ShowWarning("mob_parse_row_mobskilldb: Unknown chat ID %s for monster %d.\n", str[18], mob_id);
|
||||||
|
}
|
||||||
|
}
|
||||||
else
|
else
|
||||||
ms->msg_id = 0;
|
ms->msg_id = 0;
|
||||||
|
|
||||||
@ -6191,6 +6197,8 @@ static void mob_load(void)
|
|||||||
else
|
else
|
||||||
mob_db.load();
|
mob_db.load();
|
||||||
|
|
||||||
|
mob_chat_db.load(); // load before mob_skill_db
|
||||||
|
|
||||||
for(int i = 0; i < ARRAYLENGTH(dbsubpath); i++){
|
for(int i = 0; i < ARRAYLENGTH(dbsubpath); i++){
|
||||||
int n1 = strlen(db_path)+strlen(dbsubpath[i])+1;
|
int n1 = strlen(db_path)+strlen(dbsubpath[i])+1;
|
||||||
int n2 = strlen(db_path)+strlen(DBPATH)+strlen(dbsubpath[i])+1;
|
int n2 = strlen(db_path)+strlen(DBPATH)+strlen(dbsubpath[i])+1;
|
||||||
@ -6207,8 +6215,6 @@ static void mob_load(void)
|
|||||||
safesnprintf(dbsubpath2,n1,"%s%s",db_path,dbsubpath[i]);
|
safesnprintf(dbsubpath2,n1,"%s%s",db_path,dbsubpath[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
sv_readdb(dbsubpath1, "mob_chat_db.txt", '#', 3, 3, -1, &mob_parse_row_chatdb, silent);
|
|
||||||
|
|
||||||
if( db_use_sqldbs && i == 0 )
|
if( db_use_sqldbs && i == 0 )
|
||||||
mob_read_sqlskilldb();
|
mob_read_sqlskilldb();
|
||||||
else
|
else
|
||||||
|
@ -189,10 +189,20 @@ struct s_mob_skill {
|
|||||||
unsigned short msg_id;
|
unsigned short msg_id;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct mob_chat {
|
struct s_mob_chat {
|
||||||
unsigned short msg_id;
|
uint16 msg_id;
|
||||||
unsigned long color;
|
uint32 color;
|
||||||
char msg[CHAT_SIZE_MAX];
|
std::string msg;
|
||||||
|
};
|
||||||
|
|
||||||
|
class MobChatDatabase : public TypesafeYamlDatabase<uint16, s_mob_chat> {
|
||||||
|
public:
|
||||||
|
MobChatDatabase() : TypesafeYamlDatabase("MOB_CHAT_DB", 1) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
const std::string getDefaultLocation();
|
||||||
|
uint64 parseBodyNode(const YAML::Node &node);
|
||||||
};
|
};
|
||||||
|
|
||||||
struct spawn_info {
|
struct spawn_info {
|
||||||
|
@ -285,6 +285,12 @@ int do_init( int argc, char** argv ){
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!process("MOB_CHAT_DB", 1, root_paths, "mob_chat_db", [](const std::string& path, const std::string& name_ext) -> bool {
|
||||||
|
return sv_readdb(path.c_str(), name_ext.c_str(), '#', 3, 3, -1, &mob_parse_row_chatdb, false);
|
||||||
|
})) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
// TODO: add implementations ;-)
|
// TODO: add implementations ;-)
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@ -3407,3 +3413,41 @@ static bool mob_readdb_sub(char *fields[], int columns, int current) {
|
|||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Copied and adjusted from mob.cpp
|
||||||
|
static bool mob_parse_row_chatdb(char* fields[], int columns, int current) {
|
||||||
|
int msg_id = atoi(fields[0]);
|
||||||
|
|
||||||
|
if (msg_id <= 0){
|
||||||
|
ShowError("Invalid chat ID '%d' in line %d\n", msg_id, current);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
char* msg = fields[2];
|
||||||
|
size_t len = strlen(msg);
|
||||||
|
|
||||||
|
while( len && ( msg[len-1] == '\r' || msg[len-1] == '\n' ) ) {// find EOL to strip
|
||||||
|
len--;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (len > (CHAT_SIZE_MAX-1)) {
|
||||||
|
ShowError("Message too long! Line %d, id: %d\n", current, msg_id);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
else if (len == 0) {
|
||||||
|
ShowWarning("Empty message for id %d.\n", msg_id);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
msg[len] = 0; // strip previously found EOL
|
||||||
|
|
||||||
|
body << YAML::BeginMap;
|
||||||
|
body << YAML::Key << "Id" << YAML::Value << msg_id;
|
||||||
|
if (strcmp(fields[1], "0xFF0000") != 0) // default color
|
||||||
|
body << YAML::Key << "Color" << YAML::Value << fields[1];
|
||||||
|
body << YAML::Key << "Dialog" << YAML::Value << msg;
|
||||||
|
body << YAML::EndMap;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@ -380,5 +380,6 @@ static bool itemdb_read_randomopt_group(char *str[], int columns, int current);
|
|||||||
static bool itemdb_randomopt_group_yaml(void);
|
static bool itemdb_randomopt_group_yaml(void);
|
||||||
static bool pc_readdb_levelpenalty(char* fields[], int columns, int current);
|
static bool pc_readdb_levelpenalty(char* fields[], int columns, int current);
|
||||||
static bool pc_levelpenalty_yaml();
|
static bool pc_levelpenalty_yaml();
|
||||||
|
static bool mob_parse_row_chatdb(char* fields[], int columns, int current);
|
||||||
|
|
||||||
#endif /* CSV2YAML_HPP */
|
#endif /* CSV2YAML_HPP */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user