Add invoke_choose and invoke_player to DrivenEngine. invoke_player is not fully implemented in World

This commit is contained in:
2023-10-24 00:49:15 -04:00
parent 912bec91bf
commit d68a1dd0fe
10 changed files with 223 additions and 36 deletions

View File

@@ -220,8 +220,10 @@ enum DrvAction {
PLAY_RECV_INCOMING,
PLAY_NOTIFY_CLOSE,
PLAY_NOTIFY_ACCEPT,
PLAY_INVOKE_EVENT_UPDATE,
PLAY_SET_LUA_SOURCE_PACK,
PLAY_CALL_EVENT_UPDATE,
PLAY_INVOKE_PLAYER,
PLAY_INVOKE_CHOOSE,
PLAY_INVOKE_LUA_SOURCE,
PLAY_RELEASE,
};
@@ -233,8 +235,10 @@ inline static const char *action_string(DrvAction act) {
case PLAY_RECV_INCOMING: return "PLAY_RECV_INCOMING";
case PLAY_NOTIFY_CLOSE: return "PLAY_NOTIFY_CLOSE";
case PLAY_NOTIFY_ACCEPT: return "PLAY_NOTIFY_ACCEPT";
case PLAY_INVOKE_EVENT_UPDATE: return "PLAY_INVOKE_EVENT_UPDATE";
case PLAY_SET_LUA_SOURCE_PACK: return "PLAY_SET_LUA_SOURCE_PACK";
case PLAY_CALL_EVENT_UPDATE: return "PLAY_CALL_EVENT_UPDATE";
case PLAY_INVOKE_PLAYER: return "PLAY_INVOKE_PLAYER";
case PLAY_INVOKE_CHOOSE: return "PLAY_INVOKE_CHOOSE";
case PLAY_INVOKE_LUA_SOURCE: return "PLAY_INVOKE_LUA_SOURCE";
case PLAY_RELEASE: return "PLAY_RELEASE";
default: return "unknown";
}
@@ -477,12 +481,22 @@ uint32_t DrivenEngine::drv_notify_accept(uint32_t port) {
return chid;
}
void DrivenEngine::drv_invoke_event_update(double clock) {
void DrivenEngine::drv_call_event_update(double clock) {
clock_ = clock;
event_update();
}
void DrivenEngine::drv_set_lua_source_pack(uint32_t srcpklen, const char *srcpk) {
void DrivenEngine::drv_invoke_player(int64_t place, uint32_t datapklen, const char *datapk) {
Invocation *inv = new Invocation(Invocation::KIND_PLAYER, visible_actor_id_, place, std::string_view(datapk, datapklen));
queued_invocations_.emplace_back(inv);
}
void DrivenEngine::drv_invoke_choose(int64_t place, uint32_t datapklen, const char *datapk) {
Invocation *inv = new Invocation(Invocation::KIND_CHOOSE, visible_actor_id_, place, std::string_view(datapk, datapklen));
queued_invocations_.emplace_back(inv);
}
void DrivenEngine::drv_invoke_lua_source(uint32_t srcpklen, const char *srcpk) {
Invocation *inv = new Invocation(Invocation::KIND_LUA_SOURCE, visible_actor_id_, visible_actor_id_, std::string_view(srcpk, srcpklen));
queued_invocations_.emplace_back(inv);
rescan_lua_source_ = false;
@@ -791,12 +805,12 @@ static void replay_notify_accept(EngineWrapper *w) {
static void play_invoke_event_update(EngineWrapper *w, double clock) {
assert(w->rlog == nullptr);
if (w->wlog != nullptr) {
w->wlog->write_cmd_hash(PLAY_INVOKE_EVENT_UPDATE, eng::memhash());
w->wlog->write_cmd_hash(PLAY_CALL_EVENT_UPDATE, eng::memhash());
w->wlog->write_double(clock);
w->wlog->flush();
}
w->engine->drv_invoke_event_update(clock);
w->engine->drv_call_event_update(clock);
}
static void replay_invoke_event_update(EngineWrapper *w) {
@@ -805,32 +819,83 @@ static void replay_invoke_event_update(EngineWrapper *w) {
return reset_wrapper(w, "replay log corrupt in replay_event_update");
}
w->engine->drv_invoke_event_update(clock);
w->engine->drv_call_event_update(clock);
}
////////////////////////
void play_set_lua_source_pack(EngineWrapper *w, uint32_t srcpklen, const char *srcpk) {
void play_invoke_player(EngineWrapper *w, int64_t place, uint32_t datapklen, const char *datapk) {
assert(w->rlog == nullptr);
if (w->wlog != nullptr) {
w->wlog->write_cmd_hash(PLAY_SET_LUA_SOURCE_PACK, eng::memhash());
w->wlog->write_cmd_hash(PLAY_INVOKE_PLAYER, eng::memhash());
w->wlog->write_int64(place);
w->wlog->write_string(std::string_view(datapk, datapklen));
w->wlog->flush();
}
w->engine->drv_invoke_player(place, datapklen, datapk);
}
void replay_invoke_player(EngineWrapper *w) {
int64_t place = w->rlog->read_int64();
std::string srcpack = w->rlog->read_string();
if (!w->rlog->good()) {
return reset_wrapper(w, "replay log corrupt in replay_invoke_player");
}
w->engine->drv_invoke_player(place, srcpack.size(), srcpack.c_str());
}
////////////////////////
void play_invoke_choose(EngineWrapper *w, int64_t place, uint32_t datapklen, const char *datapk) {
assert(w->rlog == nullptr);
if (w->wlog != nullptr) {
w->wlog->write_cmd_hash(PLAY_INVOKE_CHOOSE, eng::memhash());
w->wlog->write_int64(place);
w->wlog->write_string(std::string_view(datapk, datapklen));
w->wlog->flush();
}
w->engine->drv_invoke_choose(place, datapklen, datapk);
}
void replay_invoke_choose(EngineWrapper *w) {
int64_t place = w->rlog->read_int64();
std::string srcpack = w->rlog->read_string();
if (!w->rlog->good()) {
return reset_wrapper(w, "replay log corrupt in replay_invoke_choose");
}
w->engine->drv_invoke_choose(place, srcpack.size(), srcpack.c_str());
}
////////////////////////
void play_invoke_lua_source(EngineWrapper *w, uint32_t srcpklen, const char *srcpk) {
assert(w->rlog == nullptr);
if (w->wlog != nullptr) {
w->wlog->write_cmd_hash(PLAY_INVOKE_LUA_SOURCE, eng::memhash());
w->wlog->write_string(std::string_view(srcpk, srcpklen));
w->wlog->flush();
}
w->engine->drv_set_lua_source_pack(srcpklen, srcpk);
w->engine->drv_invoke_lua_source(srcpklen, srcpk);
}
void replay_set_lua_source_pack(EngineWrapper *w) {
void replay_invoke_lua_source(EngineWrapper *w) {
std::string srcpack = w->rlog->read_string();
if (!w->rlog->good()) {
return reset_wrapper(w, "replay log corrupt in replay_set_lua_source_pack");
return reset_wrapper(w, "replay log corrupt in replay_invoke_lua_source");
}
w->engine->drv_set_lua_source_pack(srcpack.size(), srcpack.c_str());
w->engine->drv_invoke_lua_source(srcpack.size(), srcpack.c_str());
}
@@ -900,8 +965,10 @@ static void replaycore_step(EngineWrapper *w) {
case PLAY_RECV_INCOMING: replay_recv_incoming(w); return;
case PLAY_NOTIFY_CLOSE: replay_notify_close(w); return;
case PLAY_NOTIFY_ACCEPT: replay_notify_accept(w); return;
case PLAY_INVOKE_EVENT_UPDATE: replay_invoke_event_update(w); return;
case PLAY_SET_LUA_SOURCE_PACK: replay_set_lua_source_pack(w); return;
case PLAY_CALL_EVENT_UPDATE: replay_invoke_event_update(w); return;
case PLAY_INVOKE_PLAYER: replay_invoke_lua_source(w); return;
case PLAY_INVOKE_CHOOSE: replay_invoke_lua_source(w); return;
case PLAY_INVOKE_LUA_SOURCE: replay_invoke_lua_source(w); return;
case PLAY_RELEASE: release(w); return;
default: return reset_wrapper(w, "Replay log corrupt in command dispatcher");
}
@@ -962,7 +1029,9 @@ static void init_engine_wrapper_helper(EngineWrapper *w) {
w->play_notify_close = play_notify_close;
w->play_notify_accept = play_notify_accept;
w->play_invoke_event_update = play_invoke_event_update;
w->play_set_lua_source_pack = play_set_lua_source_pack;
w->play_invoke_player = play_invoke_player;
w->play_invoke_choose = play_invoke_choose;
w->play_invoke_lua_source = play_invoke_lua_source;
w->replay_initialize = replaycore_initialize;
w->replay_step = replaycore_step;