record and replay dialog choices

This commit is contained in:
2024-08-30 00:08:49 -05:00
committed by Celtic Minstrel
parent 7791380a9a
commit 7a5c865779
7 changed files with 78 additions and 25 deletions

View File

@@ -710,37 +710,16 @@ static void show_job_bank(int which_bank, std::string title) {
job_dlg.run(); job_dlg.run();
} }
void handle_talk_event(location p, cFramerateLimiter& fps_limiter) { void handle_talk_node(int which_talk_entry) {
if(which_talk_entry == TALK_DUNNO)
return;
short get_pc,s1 = -1,s2 = -1; short get_pc,s1 = -1,s2 = -1;
char asked[4]; char asked[4];
short a,b,c,d; short a,b,c,d;
eTalkNode ttype; eTalkNode ttype;
if(p.in(talk_help_rect)) {
if(!help_btn->handleClick(p, fps_limiter))
return;
give_help_and_record(205,6);
return;
}
p.x -= 5;
p.y -= 5;
int which_talk_entry = TALK_DUNNO;
for(word_rect_t& word : talk_words) {
if(word.node == -1) continue;
rectangle wordRect(word.rect);
wordRect.offset(talk_area_rect.topLeft());
wordRect.offset(-1, -10); // TODO: This corrects for the byzantine offsets that win_draw_string applies for some reason...
if(!p.in(wordRect)) continue;
click_talk_rect(word);
which_talk_entry = word.node;
break;
}
if(which_talk_entry == TALK_DUNNO)
return;
switch(which_talk_entry) { switch(which_talk_entry) {
case TALK_DUNNO: case TALK_DUNNO:
SPECIAL_DUNNO: SPECIAL_DUNNO:
@@ -1101,6 +1080,31 @@ void handle_talk_event(location p, cFramerateLimiter& fps_limiter) {
place_talk_str(save_talk_str1,save_talk_str2,0,dummy_rect); place_talk_str(save_talk_str1,save_talk_str2,0,dummy_rect);
} }
void handle_talk_event(location p, cFramerateLimiter& fps_limiter) {
if(p.in(talk_help_rect)) {
if(!help_btn->handleClick(p, fps_limiter))
return;
give_help_and_record(205,6);
return;
}
p.x -= 5;
p.y -= 5;
int which_talk_entry = TALK_DUNNO;
for(word_rect_t& word : talk_words) {
if(word.node == -1) continue;
rectangle wordRect(word.rect);
wordRect.offset(talk_area_rect.topLeft());
wordRect.offset(-1, -10); // TODO: This corrects for the byzantine offsets that win_draw_string applies for some reason...
if(!p.in(wordRect)) continue;
click_talk_rect(word);
which_talk_entry = word.node;
break;
}
handle_talk_node(which_talk_entry);
}
//town_num; // Will be 0 - 200 for town, 200 - 290 for outdoors //town_num; // Will be 0 - 200 for town, 200 - 290 for outdoors
//short sign_type; // terrain type //short sign_type; // terrain type
void do_sign(short town_num, short which_sign, short sign_type) { void do_sign(short town_num, short which_sign, short sign_type) {

View File

@@ -13,6 +13,7 @@ void handle_info_request(cShopItem item);
void set_up_shop_array(); void set_up_shop_array();
void start_talk_mode(short m_num,short personality,mon_num_t monst_type,short store_face_pic); void start_talk_mode(short m_num,short personality,mon_num_t monst_type,short store_face_pic);
void end_talk_mode(); void end_talk_mode();
void handle_talk_node(int which_talk_entry);
void handle_talk_event(location p, cFramerateLimiter& fps_limiter); void handle_talk_event(location p, cFramerateLimiter& fps_limiter);
void handle_talk_spec(short ttype,char* place_string1,char* place_string2); void handle_talk_spec(short ttype,char* place_string1,char* place_string2);
void store_responses(); void store_responses();

View File

@@ -533,6 +533,10 @@ static void replay_next_action() {
handle_begin_talk(need_reprint); handle_begin_talk(need_reprint);
}else if(t == "handle_talk"){ }else if(t == "handle_talk"){
handle_talk(location_from_action(next_action), did_something, need_redraw, need_reprint); handle_talk(location_from_action(next_action), did_something, need_redraw, need_reprint);
}else if(t == "click_talk_rect"){
word_rect_t word_rect = word_rect_from_action(next_action);
click_talk_rect(word_rect);
handle_talk_node(word_rect.node);
} }
// TODO some of these actions shouldn't call advance_time(). They should return // TODO some of these actions shouldn't call advance_time(). They should return

View File

@@ -31,6 +31,7 @@
#include "fileio/resmgr/res_image.hpp" #include "fileio/resmgr/res_image.hpp"
#include "tools/prefs.hpp" #include "tools/prefs.hpp"
#include "tools/enum_map.hpp" #include "tools/enum_map.hpp"
#include "replay.hpp"
short monsters_faces[190] = { short monsters_faces[190] = {
0,1,2,3,4,5,6,7,8,9, 0,1,2,3,4,5,6,7,8,9,
@@ -824,6 +825,10 @@ static void place_talk_face() {
} }
void click_talk_rect(word_rect_t word) { void click_talk_rect(word_rect_t word) {
if(recording){
record_click_talk_rect(word, word.on == PRESET_WORD_ON);
}
rectangle talkRect(talk_gworld), wordRect(word.rect); rectangle talkRect(talk_gworld), wordRect(word.rect);
mainPtr.setActive(); mainPtr.setActive();
rect_draw_some_item(talk_gworld.getTexture(),talkRect,mainPtr,talk_area_rect); rect_draw_some_item(talk_gworld.getTexture(),talkRect,mainPtr,talk_area_rect);

View File

@@ -5,6 +5,9 @@
#include "scenario/item.hpp" #include "scenario/item.hpp"
#include "gfx/gfxsheets.hpp" #include "gfx/gfxsheets.hpp"
#ifndef BOE_NEWGRAPH_H
#define BOE_NEWGRAPH_H
struct word_rect_t { struct word_rect_t {
std::string word; std::string word;
rectangle rect; rectangle rect;
@@ -64,3 +67,5 @@ void place_talk_str(std::string str_to_place,std::string str_to_place2,short col
short scan_for_response(const char *str); short scan_for_response(const char *str);
void refresh_talking(); void refresh_talking();
graf_pos calc_item_rect(int num,rectangle& to_rect); graf_pos calc_item_rect(int num,rectangle& to_rect);
#endif /* defined(BOE_NEWGRAPH_H) */

View File

@@ -14,6 +14,8 @@
#include <locale> #include <locale>
#include <codecvt> #include <codecvt>
#include <string> #include <string>
#include <boost/lexical_cast.hpp>
#include "render_shapes.hpp"
using base64 = cppcodec::base64_rfc4648; using base64 = cppcodec::base64_rfc4648;
@@ -218,3 +220,30 @@ cKey key_from_action(Element& action) {
return key; return key;
} }
word_rect_t word_rect_from_action(Element& action) {
auto info = info_from_action(action);
std::string word = info["word"];
rectangle rect = boost::lexical_cast<rectangle>(info["rect"]);
word_rect_t word_rect(word, rect);
word_rect.node = boost::lexical_cast<int>(info["node"]);
bool preset = boost::lexical_cast<bool>(info["preset"]);
word_rect.on = preset ? PRESET_WORD_ON : CUSTOM_WORD_ON;
word_rect.off = preset ? PRESET_WORD_OFF : CUSTOM_WORD_OFF;
return word_rect;
}
void record_click_talk_rect(word_rect_t word_rect, bool preset) {
std::map<std::string,std::string> info;
info["word"] = word_rect.word;
info["rect"] = boost::lexical_cast<std::string>(word_rect.rect);
info["node"] = boost::lexical_cast<std::string>(word_rect.node);
info["preset"] = boost::lexical_cast<std::string>(preset);
record_action("click_talk_rect", info);
}

View File

@@ -7,11 +7,14 @@
#include <boost/filesystem.hpp> #include <boost/filesystem.hpp>
#include "location.hpp" #include "location.hpp"
#include "dialogxml/keycodes.hpp" #include "dialogxml/keycodes.hpp"
#include "boe.newgraph.hpp"
// Input recording system // Input recording system
namespace ticpp { class Element; } namespace ticpp { class Element; }
using ticpp::Element; using ticpp::Element;
struct word_rect_t;
extern bool recording; extern bool recording;
extern bool replaying; extern bool replaying;
@@ -28,5 +31,7 @@ extern void decode_file(std::string data, fs::path file);
extern location location_from_action(Element& action); extern location location_from_action(Element& action);
extern short short_from_action(Element& action); extern short short_from_action(Element& action);
extern cKey key_from_action(Element& action); extern cKey key_from_action(Element& action);
extern word_rect_t word_rect_from_action(Element& action);
extern void record_click_talk_rect(word_rect_t word_rect, bool preset);
#endif #endif