From 98e5e62ef7a04977146fdbfbc3166dad5d082da0 Mon Sep 17 00:00:00 2001 From: mekolat Date: Thu, 18 Jun 2015 23:41:58 -0400 Subject: add scope, npc/mob variables; add new get/set --- src/map/script-call.cpp | 87 +++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 69 insertions(+), 18 deletions(-) (limited to 'src/map/script-call.cpp') diff --git a/src/map/script-call.cpp b/src/map/script-call.cpp index b8f531a..2ebfca3 100644 --- a/src/map/script-call.cpp +++ b/src/map/script-call.cpp @@ -78,7 +78,7 @@ dumb_ptr script_rid2sd(ScriptState *st) * 変数の読み取り *------------------------------------------ */ -void get_val(dumb_ptr sd, struct script_data *data) +void get_val(dumb_ptr sd, struct script_data *data) { MATCH_BEGIN (*data) { @@ -88,7 +88,7 @@ void get_val(dumb_ptr sd, struct script_data *data) PRINTF("get_val error param SP::%d\n"_fmt, u.reg.sp()); int numi = 0; if (sd) - numi = pc_readparam(sd, u.reg.sp()); + numi = pc_readparam(sd->is_player(), u.reg.sp()); *data = ScriptDataInt{numi}; } MATCH_CASE (const ScriptDataVariable&, u) @@ -106,7 +106,7 @@ void get_val(dumb_ptr sd, struct script_data *data) if (postfix == '$') { RString str; - if (prefix == '@') + if (prefix == '@' || prefix == '.') { if (sd) str = pc_readregstr(sd, u.reg); @@ -130,7 +130,7 @@ void get_val(dumb_ptr sd, struct script_data *data) else { int numi = 0; - if (prefix == '@') + if (prefix == '@' || prefix == '.') { if (sd) numi = pc_readreg(sd, u.reg); @@ -144,18 +144,18 @@ void get_val(dumb_ptr sd, struct script_data *data) if (name[1] == '#') { if (sd) - numi = pc_readaccountreg2(sd, name); + numi = pc_readaccountreg2(sd->is_player(), name); } else { if (sd) - numi = pc_readaccountreg(sd, name); + numi = pc_readaccountreg(sd->is_player(), name); } } else { if (sd) - numi = pc_readglobalreg(sd, name); + numi = pc_readglobalreg(sd->is_player(), name); } *data = ScriptDataInt{numi}; } @@ -166,8 +166,38 @@ void get_val(dumb_ptr sd, struct script_data *data) void get_val(ScriptState *st, struct script_data *data) { - dumb_ptr sd = st->rid ? map_id2sd(st->rid) : nullptr; - get_val(sd, data); + dumb_ptr bl = nullptr; + MATCH_BEGIN (*data) + { + MATCH_CASE (const ScriptDataParam&, u) + { + bl = map_id2bl(st->rid); + } + MATCH_CASE (const ScriptDataVariable&, u) + { + ZString name_ = variable_names.outtern(u.reg.base()); + VarName name = stringish(name_); + char prefix = name.front(); + if (prefix == '.' && name[1] == '@') + { + if (name.back() == '$') + { + Option> s = st->regstrm.search(u.reg); + ZString val = s.map([](P s_) -> ZString { return *s_; }).copy_or(""_s); + *data = ScriptDataStr{val}; + } + else + *data = ScriptDataInt{st->regm.get(u.reg)}; + return; + } + if (prefix == '.' && st->oid) + bl = map_id2bl(st->oid); + else if (prefix != '$' && st->rid) + bl = map_id2bl(st->rid); + } + } + MATCH_END (); + get_val(bl, data); } /*========================================== @@ -185,12 +215,12 @@ struct script_data get_val2(ScriptState *st, SIR reg) * 変数設定用 *------------------------------------------ */ -void set_reg(dumb_ptr sd, VariableCode type, SIR reg, struct script_data vd) +void set_reg(dumb_ptr sd, VariableCode type, SIR reg, struct script_data vd) { if (type == VariableCode::PARAM) { int val = vd.get_if()->numi; - pc_setparam(sd, reg.sp(), val); + pc_setparam(sd->is_player(), reg.sp(), val); return; } assert (type == VariableCode::VARIABLE); @@ -203,7 +233,7 @@ void set_reg(dumb_ptr sd, VariableCode type, SIR reg, struct s if (postfix == '$') { RString str = vd.get_if()->str; - if (prefix == '@') + if (prefix == '@' || prefix == '.') { pc_setregstr(sd, reg, str); } @@ -219,7 +249,7 @@ void set_reg(dumb_ptr sd, VariableCode type, SIR reg, struct s else { int val = vd.get_if()->numi; - if (prefix == '@') + if (prefix == '@' || prefix == '.') { pc_setreg(sd, reg, val); } @@ -230,24 +260,45 @@ void set_reg(dumb_ptr sd, VariableCode type, SIR reg, struct s else if (prefix == '#') { if (name[1] == '#') - pc_setaccountreg2(sd, name, val); + pc_setaccountreg2(sd->is_player(), name, val); else - pc_setaccountreg(sd, name, val); + pc_setaccountreg(sd->is_player(), name, val); } else { - pc_setglobalreg(sd, name, val); + pc_setglobalreg(sd->is_player(), name, val); + } + } +} + +void set_scope_reg(ScriptState *st, SIR reg, struct script_data vd) +{ + ZString name = variable_names.outtern(reg.base()); + if (name.back() == '$') + { + if (auto *u = vd.get_if()) + { + if (!u->str) + { + st->regstrm.erase(reg); + return; + } + st->regstrm.insert(reg, u->str); } + else + st->regstrm.erase(reg); } + else if (auto *u = vd.get_if()) + st->regm.put(reg, u->numi); } -void set_reg(dumb_ptr sd, VariableCode type, SIR reg, int id) +void set_reg(dumb_ptr sd, VariableCode type, SIR reg, int id) { struct script_data vd = ScriptDataInt{id}; set_reg(sd, type, reg, vd); } -void set_reg(dumb_ptr sd, VariableCode type, SIR reg, RString zd) +void set_reg(dumb_ptr sd, VariableCode type, SIR reg, RString zd) { struct script_data vd = ScriptDataStr{zd}; set_reg(sd, type, reg, vd); -- cgit v1.2.3-60-g2f50