summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/ast/npc.cpp55
-rw-r--r--src/ast/npc.hpp11
-rw-r--r--src/ast/npc_test.cpp68
-rw-r--r--src/map/chrif.cpp84
-rw-r--r--src/map/clif.cpp4
-rw-r--r--src/map/npc-parse.cpp122
-rw-r--r--src/map/npc.cpp2
-rw-r--r--src/map/script-fun.cpp36
-rw-r--r--src/monitor/fwd.hpp37
-rw-r--r--src/monitor/globals.cpp33
-rw-r--r--src/monitor/globals.hpp33
-rw-r--r--src/monitor/main.cpp243
12 files changed, 76 insertions, 652 deletions
diff --git a/src/ast/npc.cpp b/src/ast/npc.cpp
index e9c3464..8d4a43e 100644
--- a/src/ast/npc.cpp
+++ b/src/ast/npc.cpp
@@ -306,7 +306,7 @@ namespace npc
static
Result<ScriptNone> parse_script_none_head(io::LineSpan span, std::vector<Spanned<std::vector<Spanned<RString>>>>& bits)
{
- // ScriptNone: -|script|script name|-1{code}
+ // ScriptNone: -|script|script name|32767{code}
if (bits.size() != 4)
{
return Err(span.error_str("expect 4 |component|s"_s));
@@ -319,10 +319,10 @@ namespace npc
{
return Err(bits[2].span.error_str("in |component 3| expect 1 ,component,s"_s));
}
- assert(bits[3].data[0].data == "-1"_s);
+ assert(bits[3].data[0].data == "32767"_s);
if (bits[3].data.size() != 1)
{
- return Err(bits[3].span.error_str("in |component 4| should be just -1"_s));
+ return Err(bits[3].span.error_str("in |component 4| should be just 32767"_s));
}
ScriptNone script_none;
@@ -333,39 +333,6 @@ namespace npc
return Ok(std::move(script_none));
}
static
- Result<ScriptMapNone> parse_script_map_none_head(io::LineSpan span, std::vector<Spanned<std::vector<Spanned<RString>>>>& bits)
- {
- // ScriptMapNone: m,x,y,d|script|script name|-1{code}
- if (bits.size() != 4)
- {
- return Err(span.error_str("expect 4 |component|s"_s));
- }
- if (bits[0].data.size() != 4)
- {
- return Err(bits[0].span.error_str("in |component 1| expect 3 ,component,s"_s));
- }
- assert(bits[1].data.size() == 1);
- assert(bits[1].data[0].data == "script"_s);
- if (bits[2].data.size() != 1)
- {
- return Err(bits[2].span.error_str("in |component 3| expect 1 ,component,s"_s));
- }
- if (bits[3].data.size() != 1 || bits[3].data[0].data != "-1"_s)
- {
- return Err(bits[3].span.error_str("in |component 4| should be just -1"_s));
- }
-
- ScriptMapNone script_map_none;
- TRY_EXTRACT(bits[0].data[0], script_map_none.m);
- TRY_EXTRACT(bits[0].data[1], script_map_none.x);
- TRY_EXTRACT(bits[0].data[2], script_map_none.y);
- TRY_EXTRACT(bits[0].data[3], script_map_none.d);
- TRY_EXTRACT(bits[2].data[0], script_map_none.name);
- script_map_none.key4_span = bits[3].data[0].span;
- // also expect '{' and parse real script (in caller)
- return Ok(std::move(script_map_none));
- }
- static
Result<ScriptMap> parse_script_map_head(io::LineSpan span, std::vector<Spanned<std::vector<Spanned<RString>>>>& bits)
{
// ScriptMap: m,x,y,d|script|script name|class,xs,ys{code}
@@ -417,10 +384,9 @@ namespace npc
static
Result<Script> parse_script_any(io::LineSpan span, std::vector<Spanned<std::vector<Spanned<RString>>>>& bits, io::LineCharReader& lr)
{
- // 4 cases:
+ // 3 cases:
// ScriptFunction: function|script|Fun Name{code}
- // ScriptNone: -|script|script name|-1{code}
- // ScriptMapNone: m,x,y,d|script|script name|-1{code}
+ // ScriptNone: -|script|script name|32767{code}
// ScriptMap: m,x,y,d|script|script name|class,xs,ys{code}
if (bits[0].data[0].data == "function"_s)
{
@@ -445,17 +411,6 @@ namespace npc
rv.body = TRY(ast::script::parse_script_body(lr, opt));
return Ok(std::move(rv));
}
- else if (bits.size() >= 4 && bits[3].data[0].data == "-1"_s)
- {
- Script rv = TRY(parse_script_map_none_head(span, bits));
- rv.key_span = bits[1].data[0].span;
-
- ast::script::ScriptOptions opt;
- opt.implicit_start = true;
- opt.no_start = true;
- rv.body = TRY(ast::script::parse_script_body(lr, opt));
- return Ok(std::move(rv));
- }
else
{
ScriptMap script_map = TRY(parse_script_map_head(span, bits));
diff --git a/src/ast/npc.hpp b/src/ast/npc.hpp
index a51acd3..ca6479e 100644
--- a/src/ast/npc.hpp
+++ b/src/ast/npc.hpp
@@ -103,14 +103,6 @@ namespace npc
Spanned<NpcName> name;
io::LineSpan key4_span;
};
- struct ScriptMapNone
- {
- Spanned<MapName> m;
- Spanned<unsigned> x, y;
- Spanned<DIR> d;
- Spanned<NpcName> name;
- io::LineSpan key4_span;
- };
struct ScriptMap
{
Spanned<MapName> m;
@@ -120,13 +112,12 @@ namespace npc
Spanned<Species> npc_class;
Spanned<unsigned> xs, ys;
};
- using ScriptBase = Variant<ScriptFunction, ScriptNone, ScriptMapNone, ScriptMap>;
+ using ScriptBase = Variant<ScriptFunction, ScriptNone, ScriptMap>;
struct Script : ScriptBase
{
Script() = default;
Script(ScriptFunction s) : ScriptBase(std::move(s)) {}
Script(ScriptNone s) : ScriptBase(std::move(s)) {}
- Script(ScriptMapNone s) : ScriptBase(std::move(s)) {}
Script(ScriptMap s) : ScriptBase(std::move(s)) {}
io::LineSpan key_span;
diff --git a/src/ast/npc_test.cpp b/src/ast/npc_test.cpp
index a753623..dadeba7 100644
--- a/src/ast/npc_test.cpp
+++ b/src/ast/npc_test.cpp
@@ -423,11 +423,11 @@ namespace npc
{
// 1 2 3
//23456789012345678901234567890123456789
- "-|script|#config|-1{end;}"_s,
+ "-|script|#config|32767{end;}"_s,
// 123456
- "-|script|#config|-1\n{end;}\n"_s,
+ "-|script|#config|32767\n{end;}\n"_s,
// 1234567
- "-|script|#config|-1\n \n {end;} "_s,
+ "-|script|#config|32767\n \n {end;} "_s,
};
for (auto input : inputs)
{
@@ -435,7 +435,7 @@ namespace npc
auto res = TRY_UNWRAP(parse_top(lr), FAIL());
EXPECT_TRUE(res.get_success().is_some());
auto top = TRY_UNWRAP(std::move(res.get_success()), FAIL());
- EXPECT_SPAN(top.span, 1,1, 1,19);
+ EXPECT_SPAN(top.span, 1,1, 1,22);
auto script = top.get_if<Script>();
EXPECT_TRUE(script);
auto p = script->get_if<ScriptNone>();
@@ -446,66 +446,10 @@ namespace npc
EXPECT_SPAN(script->key_span, 1,3, 1,8);
EXPECT_SPAN(p->name.span, 1,10, 1,16);
EXPECT_EQ(p->name.data, stringish<NpcName>("#config"_s));
- EXPECT_SPAN(p->key4_span, 1,18, 1,19);
+ EXPECT_SPAN(p->key4_span, 1,18, 1,22);
if (input.endswith('}'))
{
- EXPECT_SPAN(script->body.span, 1,20, 1,25);
- }
- else if (input.endswith('\n'))
- {
- EXPECT_SPAN(script->body.span, 2,1, 2,6);
- }
- else if (input.endswith(' '))
- {
- EXPECT_SPAN(script->body.span, 3,2, 3,7);
- }
- else
- {
- FAIL();
- }
- EXPECT_EQ(script->body.braced_body, "{end;}"_s);
- }
- }
- }
- TEST(npcast, scriptmapnone)
- {
- QuietFd q;
- LString inputs[] =
- {
- // 1 2 3
- //23456789012345678901234567890123456789
- "map.gat,1,2,3|script|Init|-1{end;}"_s,
- "map.gat,1,2,3|script|Init|-1\n{end;}\n"_s,
- "map.gat,1,2,3|script|Init|-1\n \n {end;} "_s,
- };
- for (auto input : inputs)
- {
- io::LineCharReader lr(io::from_string, "<string>"_s, input);
- auto res = TRY_UNWRAP(parse_top(lr), FAIL());
- EXPECT_TRUE(res.get_success().is_some());
- auto top = TRY_UNWRAP(std::move(res.get_success()), FAIL());
- EXPECT_SPAN(top.span, 1,1, 1,28);
- auto script = top.get_if<Script>();
- EXPECT_TRUE(script);
- auto p = script->get_if<ScriptMapNone>();
- EXPECT_TRUE(p);
- if (p)
- {
- EXPECT_SPAN(p->m.span, 1,1, 1,7);
- EXPECT_EQ(p->m.data, stringish<MapName>("map"_s));
- EXPECT_SPAN(p->x.span, 1,9, 1,9);
- EXPECT_EQ(p->x.data, 1);
- EXPECT_SPAN(p->y.span, 1,11, 1,11);
- EXPECT_EQ(p->y.data, 2);
- EXPECT_SPAN(p->d.span, 1,13, 1,13);
- EXPECT_EQ(p->d.data, DIR::NW);
- EXPECT_SPAN(script->key_span, 1,15, 1,20);
- EXPECT_SPAN(p->name.span, 1,22, 1,25);
- EXPECT_EQ(p->name.data, stringish<NpcName>("Init"_s));
- EXPECT_SPAN(p->key4_span, 1,27, 1,28);
- if (input.endswith('}'))
- {
- EXPECT_SPAN(script->body.span, 1,29, 1,34);
+ EXPECT_SPAN(script->body.span, 1,23, 1,28);
}
else if (input.endswith('\n'))
{
diff --git a/src/map/chrif.cpp b/src/map/chrif.cpp
index 95aff2a..2606911 100644
--- a/src/map/chrif.cpp
+++ b/src/map/chrif.cpp
@@ -218,7 +218,7 @@ int chrif_changemapserverack(Session *, const Packet_Fixed<0x2b06>& fixed)
if (fixed.error == 1)
{
if (battle_config.error_log)
- PRINTF("map server change failed.\n"_fmt);
+ PRINTF("Changing the map server failed.\n"_fmt);
pc_authfail(sd->status_key.account_id);
return 0;
}
@@ -241,7 +241,7 @@ int chrif_connectack(Session *s, const Packet_Fixed<0x2af9>& fixed)
{
if (fixed.code)
{
- PRINTF("Connected to char-server failed %d.\n"_fmt, fixed.code);
+ PRINTF("Connecting to char-server failed %d.\n"_fmt, fixed.code);
exit(1);
}
PRINTF("Connected to char-server (connection #%d).\n"_fmt, s);
@@ -261,7 +261,7 @@ int chrif_sendmapack(Session *, Packet_Fixed<0x2afb> fixed)
{
if (fixed.unknown) //impossible
{
- PRINTF("chrif : send map list to char server failed %d\n"_fmt,
+ PRINTF("chrif: sending the map list to char-server failed %d\n"_fmt,
fixed.unknown);
exit(1);
}
@@ -383,7 +383,7 @@ void chrif_char_ask_name(AccountId id, CharName character_name, short operation_
fixed_0e.operation = operation_type; // type of operation
if (operation_type == 2)
fixed_0e.ban_add = modif;
- PRINTF("chrif : sended 0x2b0e\n"_fmt);
+ PRINTF("chrif: sent 0x2b0e\n"_fmt);
send_fpacket<0x2b0e, 44>(char_session, fixed_0e);
}
@@ -397,7 +397,7 @@ void chrif_char_ask_name(AccountId id, CharName character_name, short operation_
* 4: unban
* 5: changesex
* type of answer:
- * 0: login-server resquest done
+ * 0: login-server request done
* 1: player not found
* 2: gm level too low
* 3: login-server offline
@@ -414,7 +414,7 @@ int chrif_char_ask_name_answer(Session *, const Packet_Fixed<0x2b0f>& fixed)
{
AString output;
if (fixed.error == 1) // player not found
- output = STRPRINTF("The player '%s' doesn't exist."_fmt,
+ output = STRPRINTF("The player, '%s,' doesn't exist."_fmt,
player_name);
else
{
@@ -423,20 +423,20 @@ int chrif_char_ask_name_answer(Session *, const Packet_Fixed<0x2b0f>& fixed)
case 1: // block
switch (fixed.error)
{
- case 0: // login-server resquest done
+ case 0: // login-server request done
output = STRPRINTF(
- "Login-server has been asked to block the player '%s'."_fmt,
+ "Login-server has been asked to block '%s'."_fmt,
player_name);
break;
//case 1: // player not found
case 2: // gm level too low
output = STRPRINTF(
- "Your GM level don't authorise you to block the player '%s'."_fmt,
+ "Your GM level doesn't authorize you to block the player '%s'."_fmt,
player_name);
break;
case 3: // login-server offline
output = STRPRINTF(
- "Login-server is offline. Impossible to block the the player '%s'."_fmt,
+ "Login-server is offline, so it's impossible to block '%s'."_fmt,
player_name);
break;
}
@@ -444,20 +444,20 @@ int chrif_char_ask_name_answer(Session *, const Packet_Fixed<0x2b0f>& fixed)
case 2: // ban
switch (fixed.error)
{
- case 0: // login-server resquest done
+ case 0: // login-server request done
output = STRPRINTF(
- "Login-server has been asked to ban the player '%s'."_fmt,
+ "Login-server has been asked to ban '%s'."_fmt,
player_name);
break;
//case 1: // player not found
case 2: // gm level too low
output = STRPRINTF(
- "Your GM level don't authorise you to ban the player '%s'."_fmt,
+ "Your GM level doesn't authorize you to ban '%s'."_fmt,
player_name);
break;
case 3: // login-server offline
output = STRPRINTF(
- "Login-server is offline. Impossible to ban the the player '%s'."_fmt,
+ "Login-server is offline, so it's impossible to ban '%s'."_fmt,
player_name);
break;
}
@@ -465,20 +465,20 @@ int chrif_char_ask_name_answer(Session *, const Packet_Fixed<0x2b0f>& fixed)
case 3: // unblock
switch (fixed.error)
{
- case 0: // login-server resquest done
+ case 0: // login-server request done
output = STRPRINTF(
- "Login-server has been asked to unblock the player '%s'."_fmt,
+ "Login-server has been asked to unblock '%s'."_fmt,
player_name);
break;
//case 1: // player not found
case 2: // gm level too low
output = STRPRINTF(
- "Your GM level don't authorise you to unblock the player '%s'."_fmt,
+ "Your GM level doesn't authorize you to unblock '%s'."_fmt,
player_name);
break;
case 3: // login-server offline
output = STRPRINTF(
- "Login-server is offline. Impossible to unblock the the player '%s'."_fmt,
+ "Login-server is offline, so it's impossible to unblock '%s'."_fmt,
player_name);
break;
}
@@ -486,20 +486,20 @@ int chrif_char_ask_name_answer(Session *, const Packet_Fixed<0x2b0f>& fixed)
case 4: // unban
switch (fixed.error)
{
- case 0: // login-server resquest done
+ case 0: // login-server request done
output = STRPRINTF(
- "Login-server has been asked to unban the player '%s'."_fmt,
+ "Login-server has been asked to unban '%s'."_fmt,
player_name);
break;
//case 1: // player not found
case 2: // gm level too low
output = STRPRINTF(
- "Your GM level don't authorise you to unban the player '%s'."_fmt,
+ "Your GM level doesn't authorize you to unban '%s'."_fmt,
player_name);
break;
case 3: // login-server offline
output = STRPRINTF(
- "Login-server is offline. Impossible to unban the the player '%s'."_fmt,
+ "Login-server is offline, so it's impossible to unban '%s'."_fmt,
player_name);
break;
}
@@ -507,20 +507,20 @@ int chrif_char_ask_name_answer(Session *, const Packet_Fixed<0x2b0f>& fixed)
case 5: // changesex
switch (fixed.error)
{
- case 0: // login-server resquest done
+ case 0: // login-server request done
output = STRPRINTF(
- "Login-server has been asked to change the sex of the player '%s'."_fmt,
+ "Login-server has been asked to change the sex of '%s'."_fmt,
player_name);
break;
//case 1: // player not found
case 2: // gm level too low
output = STRPRINTF(
- "Your GM level don't authorise you to change the sex of the player '%s'."_fmt,
+ "Your GM level doesn't authorize you to change the sex of '%s'."_fmt,
player_name);
break;
case 3: // login-server offline
output = STRPRINTF(
- "Login-server is offline. Impossible to change the sex of the the player '%s'."_fmt,
+ "Login-server is offline, so it's impossible to change the sex of '%s'."_fmt,
player_name);
break;
}
@@ -531,7 +531,7 @@ int chrif_char_ask_name_answer(Session *, const Packet_Fixed<0x2b0f>& fixed)
clif_displaymessage(sd->sess, output);
}
else
- PRINTF("chrif_char_ask_name_answer failed - player not online.\n"_fmt);
+ PRINTF("chrif_char_ask_name_answer failed because the player is not online.\n"_fmt);
return 0;
}
@@ -699,14 +699,14 @@ int chrif_accountdeletion(Session *, const Packet_Fixed<0x2b13>& fixed)
{
sd->login_id1++; // change identify, because if player come back in char within the 5 seconds, he can change its characters
clif_displaymessage(sd->sess,
- "Your account has been deleted (disconnection)..."_s);
+ "Your account has been deleted. You will now be disconnected..."_s);
clif_setwaitclose(sd->sess); // forced to disconnect for the change
}
}
else
{
if (sd != nullptr)
- PRINTF("chrif_accountdeletion failed - player not online.\n"_fmt);
+ PRINTF("chrif_accountdeletion failed because the player is not online.\n"_fmt);
}
return 0;
@@ -736,11 +736,11 @@ int chrif_accountban(Session *, const Packet_Fixed<0x2b14>& fixed)
{ // status or final date of a banishment
case 1: // 0 = Unregistered ID
clif_displaymessage(sd->sess,
- "Your account has 'Unregistered'."_s);
+ "Your account has an unregistered ID."_s);
break;
case 2: // 1 = Incorrect Password
clif_displaymessage(sd->sess,
- "Your account has an 'Incorrect Password'..."_s);
+ "Your password is incorrect."_s);
break;
case 3: // 2 = This ID is expired
clif_displaymessage(sd->sess,
@@ -748,7 +748,7 @@ int chrif_accountban(Session *, const Packet_Fixed<0x2b14>& fixed)
break;
case 4: // 3 = Rejected from Server
clif_displaymessage(sd->sess,
- "Your account has been rejected from server."_s);
+ "Your account has been rejected by the server."_s);
break;
case 5: // 4 = You have been blocked by the GM Team
clif_displaymessage(sd->sess,
@@ -756,19 +756,19 @@ int chrif_accountban(Session *, const Packet_Fixed<0x2b14>& fixed)
break;
case 6: // 5 = Your Game's EXE file is not the latest version
clif_displaymessage(sd->sess,
- "Your Game's EXE file is not the latest version."_s);
+ "You need to update your client."_s);
break;
case 7: // 6 = Your are Prohibited to log in until %s
clif_displaymessage(sd->sess,
- "Your account has been prohibited to log in."_s);
+ "Your account has been prohibited from logging in."_s);
break;
case 8: // 7 = Server is jammed due to over populated
clif_displaymessage(sd->sess,
- "Server is jammed due to over populated."_s);
+ "The server is overpopulated."_s);
break;
case 9: // 8 = No MSG (actually, all states after 9 except 99 are No MSG, use only this)
clif_displaymessage(sd->sess,
- "Your account has not more authorised."_s);
+ "Your account must be authorized."_s);
break;
case 100: // 99 = This ID has been totally erased
clif_displaymessage(sd->sess,
@@ -776,7 +776,7 @@ int chrif_accountban(Session *, const Packet_Fixed<0x2b14>& fixed)
break;
default:
clif_displaymessage(sd->sess,
- "Your account has not more authorised."_s);
+ "Your account must be authorized."_s);
break;
}
}
@@ -795,7 +795,7 @@ int chrif_accountban(Session *, const Packet_Fixed<0x2b14>& fixed)
else
{
if (sd != nullptr)
- PRINTF("chrif_accountban failed - player not online.\n"_fmt);
+ PRINTF("chrif_accountban failed because the player is not online.\n"_fmt);
}
return 0;
@@ -808,7 +808,7 @@ int chrif_accountban(Session *, const Packet_Fixed<0x2b14>& fixed)
static
int chrif_recvgmaccounts(Session *s, const std::vector<Packet_Repeat<0x2b15>>& repeat)
{
- PRINTF("From login-server: receiving of %d GM accounts information.\n"_fmt,
+ PRINTF("Receiving information on %d GM accounts from login-server.\n"_fmt,
pc_read_gm_account(s, repeat));
return 0;
@@ -818,7 +818,7 @@ static
void chrif_delete(Session *s)
{
assert (s == char_session);
- PRINTF("Map-server can't connect to char-server (connection #%d).\n"_fmt,
+ PRINTF("map-server can't connect to char-server (connection #%d).\n"_fmt,
s);
char_session = nullptr;
}
@@ -1007,7 +1007,7 @@ void chrif_parse(Session *s)
return;
if (battle_config.error_log)
- PRINTF("chrif_parse : unknown packet %d %d\n"_fmt, s,
+ PRINTF("chrif_parse: unknown packet %d %d\n"_fmt, s,
packet_id);
s->set_eof();
return;
@@ -1061,7 +1061,7 @@ void check_connect_char_server(TimerData *, tick_t)
{
if (!char_session)
{
- PRINTF("Attempt to connect to char-server...\n"_fmt);
+ PRINTF("Attempting to connect to char-server...\n"_fmt);
chrif_state = 0;
char_session = make_connection(map_conf.char_ip, map_conf.char_port,
SessionParsers{.func_parse= chrif_parse, .func_delete= chrif_delete});
diff --git a/src/map/clif.cpp b/src/map/clif.cpp
index e3cd55f..2c65d44 100644
--- a/src/map/clif.cpp
+++ b/src/map/clif.cpp
@@ -901,7 +901,7 @@ int clif_spawnnpc(dumb_ptr<npc_data> nd)
{
nullpo_retz(nd);
- if (nd->npc_class == NEGATIVE_SPECIES || nd->flag & 1 || nd->npc_class == INVISIBLE_CLASS)
+ if (nd->flag & 1 || nd->npc_class == INVISIBLE_CLASS)
return 0;
Packet_Fixed<0x007c> fixed_7c;
@@ -2320,7 +2320,7 @@ void clif_getareachar_npc(dumb_ptr<map_session_data> sd, dumb_ptr<npc_data> nd)
nullpo_retv(sd);
nullpo_retv(nd);
- if (nd->npc_class == NEGATIVE_SPECIES || nd->flag & 1 || nd->npc_class == INVISIBLE_CLASS)
+ if (nd->flag & 1 || nd->npc_class == INVISIBLE_CLASS)
return;
Buffer buf;
diff --git a/src/map/npc-parse.cpp b/src/map/npc-parse.cpp
index 9c9a22c..4d9fcbd 100644
--- a/src/map/npc-parse.cpp
+++ b/src/map/npc-parse.cpp
@@ -446,7 +446,7 @@ bool npc_load_script_none(ast::script::ScriptBody& body, ast::npc::ScriptNone& s
nd->bl_id = npc_get_new_npc_id();
nd->dir = DIR::S;
nd->flag = 0;
- nd->npc_class = NEGATIVE_SPECIES;
+ nd->npc_class = INVISIBLE_CLASS;
nd->speed = 200_ms;
nd->scr.script = std::move(script);
nd->option = Opt0::ZERO;
@@ -514,115 +514,6 @@ bool npc_load_script_none(ast::script::ScriptBody& body, ast::npc::ScriptNone& s
}
static
-bool npc_load_script_map_none(ast::script::ScriptBody& body, ast::npc::ScriptMapNone& script_map_none)
-{
- MapName mapname = script_map_none.m.data;
- int x = script_map_none.x.data, y = script_map_none.y.data;
- DIR dir = script_map_none.d.data;
- P<map_local> m = TRY_UNWRAP(map_mapname2mapid(mapname),
- {
- script_map_none.m.span.error("No such map"_s);
- return false;
- });
-
- std::unique_ptr<const ScriptBuffer> script = compile_script(STRPRINTF("script npc \"%s\""_fmt, script_map_none.name.data), body, false);
- if (script == nullptr)
- return false;
-
- dumb_ptr<npc_data_script> nd;
- nd.new_();
- nd->scr.event_needs_map = false;
-
- nd->name = script_map_none.name.data;
-
- nd->bl_prev = nd->bl_next = nullptr;
- nd->bl_m = m;
- nd->bl_x = x;
- nd->bl_y = y;
- nd->bl_id = npc_get_new_npc_id();
- nd->dir = dir;
- nd->flag = 0;
- nd->npc_class = NEGATIVE_SPECIES;
- nd->speed = 200_ms;
- nd->scr.script = std::move(script);
- nd->option = Opt0::ZERO;
- nd->opt1 = Opt1::ZERO;
- nd->opt2 = Opt2::ZERO;
- nd->opt3 = Opt3::ZERO;
-
- npc_script++;
- nd->bl_type = BL::NPC;
- nd->npc_subtype = NpcSubtype::SCRIPT;
-
- nd->n = map_addnpc(m, nd);
- map_addblock(nd);
-
- {
- struct event_data ev {};
- ev.nd = nd;
- ev.pos = 0;
- NpcEvent npcev;
- npcev.npc = nd->name;
- npcev.label = ScriptLabel();
- ev_db.insert(npcev, ev);
- }
-
- register_npc_name(nd);
-
- for (auto& pair : scriptlabel_db)
- npc_convertlabel_db(pair.first, pair.second, nd);
-
- for (npc_label_list& el : nd->scr.label_listv)
- {
- ScriptLabel lname = el.name;
- int pos = el.pos;
-
- if (lname.startswith("On"_s))
- {
- struct event_data ev {};
- ev.nd = nd;
- ev.pos = pos;
- NpcEvent buf;
- buf.npc = nd->name;
- buf.label = lname;
- ev_db.insert(buf, ev);
- }
- }
-
- for (npc_label_list& el : nd->scr.label_listv)
- {
- int t_ = 0;
- ScriptLabel lname = el.name;
- int pos = el.pos;
- if (lname.startswith("OnTimer"_s) && extract(lname.xslice_t(7), &t_) && t_ > 0)
- {
- interval_t t = static_cast<interval_t>(t_);
-
- npc_timerevent_list tel {};
- tel.timer = t;
- tel.pos = pos;
-
- auto it = std::lower_bound(nd->scr.timer_eventv.begin(), nd->scr.timer_eventv.end(), tel,
- [](const npc_timerevent_list& l, const npc_timerevent_list& r)
- {
- return l.timer < r.timer;
- }
- );
- assert (it == nd->scr.timer_eventv.end() || it->timer != tel.timer);
-
- nd->scr.timer_eventv.insert(it, std::move(tel));
- }
- }
- // The counter starts stopped with 0 ticks, which is the first event,
- // unless there is none, in which case begin == end.
- nd->scr.timer = interval_t::zero();
- nd->scr.next_event = nd->scr.timer_eventv.begin();
- // nd->scr.timerid = nullptr;
-
- return true;
-}
-
-static
bool npc_load_script_map(ast::script::ScriptBody& body, ast::npc::ScriptMap& script_map)
{
MapName mapname = script_map.m.data;
@@ -761,17 +652,6 @@ bool npc_load_script_any(ast::npc::Script *script)
{
return npc_load_script_none(script->body, script_none);
}
- MATCH_CASE (ast::npc::ScriptMapNone&, script_map_none)
- {
- auto& mapname = script_map_none.m;
- Option<P<map_local>> m = map_mapname2mapid(mapname.data);
- if (m.is_none())
- {
- mapname.span.error(STRPRINTF("Map not found: %s"_fmt, mapname.data));
- return false;
- }
- return npc_load_script_map_none(script->body, script_map_none);
- }
MATCH_CASE (ast::npc::ScriptMap&, script_map)
{
auto& mapname = script_map.m;
diff --git a/src/map/npc.cpp b/src/map/npc.cpp
index 56c33cc..4296432 100644
--- a/src/map/npc.cpp
+++ b/src/map/npc.cpp
@@ -583,7 +583,7 @@ int npc_checknear(dumb_ptr<map_session_data> sd, BlockId id)
if (nd->bl_type != BL::NPC)
return 1;
- if (nd->npc_class == NEGATIVE_SPECIES)
+ if (nd->npc_class == INVISIBLE_CLASS)
return 0;
// エリア判定
diff --git a/src/map/script-fun.cpp b/src/map/script-fun.cpp
index 010b095..142debf 100644
--- a/src/map/script-fun.cpp
+++ b/src/map/script-fun.cpp
@@ -108,7 +108,7 @@ void builtin_goto(ScriptState *st)
{
if (!AARG(0).is<ScriptDataPos>())
{
- PRINTF("script: goto: not label !\n"_fmt);
+ PRINTF("script: goto: that's not a label!\n"_fmt);
st->state = ScriptEndState::END;
return;
}
@@ -149,7 +149,7 @@ void builtin_callfunc(ScriptState *st)
}
OMATCH_CASE_NONE ()
{
- PRINTF("script:callfunc: function not found! [%s]\n"_fmt, str);
+ PRINTF("script: callfunc: function not found! [%s]\n"_fmt, str);
st->state = ScriptEndState::END;
}
}
@@ -553,7 +553,7 @@ void builtin_setarray(ScriptState *st)
if (prefix != '$' && prefix != '@')
{
- PRINTF("builtin_setarray: illegal scope !\n"_fmt);
+ PRINTF("builtin_setarray: illegal scope!\n"_fmt);
return;
}
if (prefix != '$')
@@ -584,7 +584,7 @@ void builtin_cleararray(ScriptState *st)
if (prefix != '$' && prefix != '@')
{
- PRINTF("builtin_cleararray: illegal scope !\n"_fmt);
+ PRINTF("builtin_cleararray: illegal scope!\n"_fmt);
return;
}
if (prefix != '$')
@@ -641,7 +641,7 @@ void builtin_getarraysize(ScriptState *st)
if (prefix != '$' && prefix != '@')
{
- PRINTF("builtin_copyarray: illegal scope !\n"_fmt);
+ PRINTF("builtin_copyarray: illegal scope!\n"_fmt);
return;
}
@@ -660,7 +660,7 @@ void builtin_getelementofarray(ScriptState *st)
int i = conv_num(st, &AARG(1));
if (i > 255 || i < 0)
{
- PRINTF("script: getelementofarray (operator[]): param2 illegal number %d\n"_fmt,
+ PRINTF("script: getelementofarray (operator[]): param2 illegal number: %d\n"_fmt,
i);
push_int<ScriptDataInt>(st->stack, 0);
}
@@ -672,7 +672,7 @@ void builtin_getelementofarray(ScriptState *st)
}
else
{
- PRINTF("script: getelementofarray (operator[]): param1 not name !\n"_fmt);
+ PRINTF("script: getelementofarray (operator[]): param1 not named!\n"_fmt);
push_int<ScriptDataInt>(st->stack, 0);
}
}
@@ -750,7 +750,7 @@ void builtin_countitem(ScriptState *st)
else
{
if (battle_config.error_log)
- PRINTF("wrong item ID : countitem (%i)\n"_fmt, nameid);
+ PRINTF("wrong item ID: countitem (%i)\n"_fmt, nameid);
}
push_int<ScriptDataInt>(st->stack, count);
@@ -788,7 +788,7 @@ void builtin_checkweight(ScriptState *st)
amount = conv_num(st, &AARG(1));
if (amount <= 0 || !nameid)
{
- //if get wrong item ID or amount<=0, don't count weight of non existing items
+ //If it gets the wrong item ID or the amount<=0, don't count its weight (assume it's a non-existent item)
push_int<ScriptDataInt>(st->stack, 0);
return;
}
@@ -940,7 +940,7 @@ void builtin_delitem(ScriptState *st)
if (!nameid || amount <= 0)
{
- //by Lupus. Don't run FOR if u got wrong item ID or amount<=0
+ //By Lupus. Don't run FOR if you've got the wrong item ID or amount<=0
return;
}
@@ -1949,7 +1949,7 @@ static
void builtin_debugmes(ScriptState *st)
{
RString mes = conv_str(st, &AARG(0));
- PRINTF("script debug : %d %d : %s\n"_fmt,
+ PRINTF("script debug: %d %d: '%s'\n"_fmt,
st->rid, st->oid, mes);
}
@@ -2585,7 +2585,7 @@ void builtin_npcwarp(ScriptState *st)
if (!nd)
{
- PRINTF("builtin_npcwarp: no such npc: %s\n"_fmt, npc);
+ PRINTF("builtin_npcwarp: no such npc: '%s'\n"_fmt, npc);
return;
}
@@ -2628,7 +2628,7 @@ void builtin_npcareawarp(ScriptState *st)
if (!nd)
{
- PRINTF("builtin_npcareawarp: no such npc: %s\n"_fmt, npc);
+ PRINTF("builtin_npcareawarp: no such npc: '%s'\n"_fmt, npc);
return;
}
@@ -2873,7 +2873,7 @@ void builtin_shop(ScriptState *st)
nd = npc_name2id(name);
if (!nd)
{
- PRINTF("builtin_shop: no such npc: %s\n"_fmt, name);
+ PRINTF("builtin_shop: no such npc: '%s'\n"_fmt, name);
return;
}
@@ -2906,7 +2906,7 @@ void builtin_fakenpcname(ScriptState *st)
dumb_ptr<npc_data> nd = npc_name2id(name);
if (!nd)
{
- PRINTF("builtin_fakenpcname: no such npc: %s\n"_fmt, name);
+ PRINTF("builtin_fakenpcname: no such npc: '%s'\n"_fmt, name);
return;
}
nd->name = newname;
@@ -2968,7 +2968,7 @@ void builtin_strnpcinfo(ScriptState *st)
nd = npc_name2id(npc);
if (!nd)
{
- PRINTF("builtin_strnpcinfo: no such npc: %s\n"_fmt, npc);
+ PRINTF("builtin_strnpcinfo: no such npc: '%s'\n"_fmt, npc);
return;
}
} else {
@@ -3008,7 +3008,7 @@ void builtin_getnpcx(ScriptState *st)
nd = npc_name2id(name);
if (!nd)
{
- PRINTF("builtin_getnpcx: no such npc: %s\n"_fmt, name);
+ PRINTF("builtin_getnpcx: no such npc: '%s'\n"_fmt, name);
return;
}
} else {
@@ -3032,7 +3032,7 @@ void builtin_getnpcy(ScriptState *st)
nd = npc_name2id(name);
if (!nd)
{
- PRINTF("builtin_getnpcy: no such npc: %s\n"_fmt, name);
+ PRINTF("builtin_getnpcy: no such npc: '%s'\n"_fmt, name);
return;
}
} else {
diff --git a/src/monitor/fwd.hpp b/src/monitor/fwd.hpp
deleted file mode 100644
index 6900e8e..0000000
--- a/src/monitor/fwd.hpp
+++ /dev/null
@@ -1,37 +0,0 @@
-#pragma once
-// monitor/fwd.hpp - list of type names for monitor nonserver
-//
-// Copyright © 2014 Ben Longbons <b.r.longbons@gmail.com>
-//
-// This file is part of The Mana World (Athena server)
-//
-// 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/>.
-
-#include "../sanity.hpp"
-
-#include "../strings/fwd.hpp" // rank 1
-#include "../io/fwd.hpp" // rank 4
-#include "../net/fwd.hpp" // rank 5
-#include "../mmo/fwd.hpp" // rank 6
-#include "../high/fwd.hpp" // rank 9
-// monitor/fwd.hpp is rank ∞ because it is an executable
-
-
-namespace tmwa
-{
-namespace monitor
-{
- struct MonitorConf;
-} // namespace monitor
-} // namespace tmwa
diff --git a/src/monitor/globals.cpp b/src/monitor/globals.cpp
deleted file mode 100644
index 49e814d..0000000
--- a/src/monitor/globals.cpp
+++ /dev/null
@@ -1,33 +0,0 @@
-#include "globals.hpp"
-// globals.cpp - Evil global variables for tmwa-monitor.
-//
-// Copyright © 2014 Ben Longbons <b.r.longbons@gmail.com>
-//
-// This file is part of The Mana World (Athena server)
-//
-// 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/>.
-
-#include "monitor_conf.hpp"
-
-#include "../poison.hpp"
-
-
-namespace tmwa
-{
- namespace monitor
- {
- MonitorConf monitor_conf;
- pid_t pid_login, pid_char, pid_map;
- } // namespace monitor
-} // namespace tmwa
diff --git a/src/monitor/globals.hpp b/src/monitor/globals.hpp
deleted file mode 100644
index aa797d3..0000000
--- a/src/monitor/globals.hpp
+++ /dev/null
@@ -1,33 +0,0 @@
-#pragma once
-// globals.hpp - Evil global variables for tmwa-monitor.
-//
-// Copyright © 2014 Ben Longbons <b.r.longbons@gmail.com>
-//
-// This file is part of The Mana World (Athena server)
-//
-// 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/>.
-
-#include "fwd.hpp"
-
-#include <sys/types.h>
-
-
-namespace tmwa
-{
- namespace monitor
- {
- extern MonitorConf monitor_conf;
- extern pid_t pid_login, pid_char, pid_map;
- } // namespace monitor
-} // namespace tmwa
diff --git a/src/monitor/main.cpp b/src/monitor/main.cpp
deleted file mode 100644
index f21a4a7..0000000
--- a/src/monitor/main.cpp
+++ /dev/null
@@ -1,243 +0,0 @@
-// monitor/main.cpp - Old daemon to restart servers when they crashed.
-//
-// Copyright © ???? Bartosz Waszak <waszi@evil.org.pl>
-// Copyright © 2011-2014 Ben Longbons <b.r.longbons@gmail.com>
-//
-// This file is part of The Mana World (Athena server)
-//
-// 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/>.
-
-#include <sys/wait.h>
-
-#include <fcntl.h>
-#include <unistd.h>
-
-#include <csignal>
-#include <cstdlib>
-
-#include "../strings/mstring.hpp"
-#include "../strings/astring.hpp"
-#include "../strings/zstring.hpp"
-#include "../strings/xstring.hpp"
-#include "../strings/literal.hpp"
-
-#include "../io/cxxstdio.hpp"
-#include "../io/fd.hpp"
-#include "../io/line.hpp"
-
-#include "../mmo/config_parse.hpp"
-#include "../mmo/version.hpp"
-
-#include "../net/timestamp-utils.hpp"
-
-#include "globals.hpp"
-#include "monitor_conf.hpp"
-
-#include "../poison.hpp"
-
-
-namespace tmwa
-{
-namespace monitor
-{
-static
-AString make_path(XString base, XString path)
-{
- MString m;
- m += base;
- m += '/';
- m += path;
- return AString(m);
-}
-
-static
-pid_t start_process(ZString exec)
-{
- const char *args[2] = {exec.c_str(), nullptr};
- pid_t pid = fork();
- if (pid == -1)
- {
- FPRINTF(stderr, "Failed to fork"_fmt);
- return 0;
- }
- if (pid == 0)
- {
- DIAG_PUSH();
- DIAG_I(cast_qual);
- execv(exec.c_str(), const_cast<char **>(args));
- DIAG_POP();
- perror("Failed to exec");
- kill(getppid(), SIGABRT);
- exit(1);
- }
- return pid;
-}
-
-// Kill all children with the same signal we got, then ourself.
-static
-void stop_process(int sig)
-{
- if (pid_login)
- kill(pid_login, sig);
- if (pid_char)
- kill(pid_char, sig);
- if (pid_map)
- kill(pid_map, sig);
- DIAG_PUSH();
- DIAG_I(old_style_cast);
- DIAG_I(zero_as_null_pointer_constant);
- signal(sig, SIG_DFL);
- DIAG_POP();
- raise(sig);
-}
-
-static
-bool monitor_config(io::Spanned<XString> key, io::Spanned<ZString> value)
-{
- return parse_monitor_conf(monitor_conf, key, value);
-}
-
-static
-bool monitor_confs(io::Spanned<XString> key, io::Spanned<ZString> value)
-{
- if (key.data == "monitor_conf"_s)
- {
- return load_config_file(value.data, monitor_config);
- }
- key.span.error("Unknown meta-key for monitor nonserver"_s);
- return false;
-}
-} // namespace monitor
-} // namespace tmwa
-
-int main(int argc, char *argv[])
-{
- using namespace tmwa;
- using namespace tmwa::monitor;
- // These are all the signals we are likely to get
- // The shell handles stop/cont
- signal(SIGTERM, stop_process);
- signal(SIGINT, stop_process);
- signal(SIGQUIT, stop_process);
- signal(SIGABRT, stop_process);
-
- monitor_conf.workdir = make_path(ZString(strings::really_construct_from_a_pointer, getenv("HOME"), nullptr), "tmwserver"_s);
-
- ZString argv0 = ZString(strings::really_construct_from_a_pointer, argv[0], nullptr);
- bool loaded_config_yet = false;
- bool runflag = true;
-
- for (int ai = 1; ai < argc; ++ai)
- {
- ZString argvi = ZString(strings::really_construct_from_a_pointer, argv[ai], nullptr);
- if (argvi.startswith('-'))
- {
- if (argvi == "--help"_s)
- {
- PRINTF("Usage: %s [--help] [--version] [files...]\n"_fmt,
- argv0);
- exit(0);
- }
- else if (argvi == "--version"_s)
- {
- PRINTF("%s\n"_fmt, CURRENT_VERSION_STRING);
- exit(0);
- }
- else
- {
- FPRINTF(stderr, "Unknown argument: %s\n"_fmt, argvi);
- runflag = false;
- }
- }
- else
- {
- loaded_config_yet = true;
- runflag &= load_config_file(argvi, monitor_confs);
- }
- }
-
- if (!loaded_config_yet)
- runflag &= load_config_file("conf/tmwa-monitor.conf"_s, monitor_confs);
-
- if (!runflag)
- exit(1);
-
- if (chdir(monitor_conf.workdir.c_str()) < 0)
- {
- perror("Failed to change directory");
- exit(1);
- }
-
- PRINTF("Starting:\n"_fmt);
- PRINTF("* workdir: %s\n"_fmt, monitor_conf.workdir);
- PRINTF("* login_server: %s\n"_fmt, monitor_conf.login_server);
- PRINTF("* char_server: %s\n"_fmt, monitor_conf.char_server);
- PRINTF("* map_server: %s\n"_fmt, monitor_conf.map_server);
- {
- //make sure all possible file descriptors are free for use by the servers
- //if there are file descriptors higher than the max open from before the limit dropped, that's not our problem
- io::FD fd = io::FD::sysconf_SC_OPEN_MAX();
- while ((fd = fd.prev()) > io::FD::stderr())
- {
- if (fd.close() == 0)
- FPRINTF(stderr, "close fd %d\n"_fmt, fd.uncast_dammit());
- }
- fd = io::FD::open("/dev/null"_s, O_RDWR);
- if (fd == io::FD())
- {
- perror("open /dev/null");
- exit(1);
- }
- fd.dup2(io::FD::stdin());
- fd.dup2(io::FD::stdout());
- fd.close();
- }
- while (1)
- {
- // write stuff to stderr
- timestamp_seconds_buffer timestamp;
- stamp_time(timestamp);
-
- if (!pid_login)
- {
- pid_login = start_process(monitor_conf.login_server);
- FPRINTF(stderr, "[%s] forked login server: %lu\n"_fmt,
- timestamp, static_cast<unsigned long>(pid_login));
- }
- if (!pid_char)
- {
- pid_char = start_process(monitor_conf.char_server);
- FPRINTF(stderr, "[%s] forked char server: %lu\n"_fmt,
- timestamp, static_cast<unsigned long>(pid_char));
- }
- if (!pid_map)
- {
- pid_map = start_process(monitor_conf.map_server);
- FPRINTF(stderr, "[%s] forked map server: %lu\n"_fmt,
- timestamp, static_cast<unsigned long>(pid_map));
- }
- pid_t dead = wait(nullptr);
- if (dead == -1)
- {
- perror("Failed to wait for child");
- exit(1);
- }
- if (pid_login == dead)
- pid_login = 0;
- if (pid_char == dead)
- pid_char = 0;
- if (pid_map == dead)
- pid_map = 0;
- }
-}