Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
59 commits
Select commit Hold shift + click to select a range
712042a
loading scen headers, skip parts of legacy load that may error
NQNStudios Aug 1, 2025
e600fa2
Scenario picker handle names with first character numeric
NQNStudios Aug 1, 2025
754c690
ignore quote at start of scen name alphabetical
NQNStudios Aug 2, 2025
c3fa18a
blank out scen_name on legacy record if not in_scen
NQNStudios Aug 2, 2025
c1aa404
resize vector2d to have room for legacy load
NQNStudios Aug 2, 2025
8e48008
bounds check when importing legacy journal entry
NQNStudios Aug 2, 2025
27c6f57
Fix replaying scenario list with recursive scenario folder structure
NQNStudios Aug 3, 2025
3542ffb
reuse RenderTexture
NQNStudios Aug 3, 2025
f76391d
Fix walkway trims. Fix #136
NQNStudios Aug 3, 2025
9d2fa23
delete obsolete branch which caused unintended roads to draw
NQNStudios Aug 3, 2025
3053879
apply substitutions when calculating line wrapping
NQNStudios Aug 3, 2025
172adbc
fix word highlighting where substitutions are used
NQNStudios Aug 4, 2025
b1ce73f
Don't draw trims on top of characters in combat
NQNStudios Aug 4, 2025
988c8a6
fix empty monsters in activate_groups()
NQNStudios Aug 4, 2025
eb9b0e6
fix monster field infliction logic. Fix #765
NQNStudios Aug 4, 2025
0de2b08
big monsters don't take extra field damage from multiple of same
NQNStudios Aug 4, 2025
53608ad
big monsters check whole footprint for safety. Fix #757
NQNStudios Aug 4, 2025
b72bf8f
shrink talk text when it doesn't fit
NQNStudios Aug 4, 2025
bd6b9ae
make boats and horses exist in legacy scenarios
NQNStudios Aug 5, 2025
31fb717
remove redundant boat/horse initialization
NQNStudios Aug 5, 2025
b9d7cd0
better handling for out-of-sight ranged/boom anim
NQNStudios Aug 5, 2025
b7af5d0
shortcut to get all gold in reach
NQNStudios Aug 5, 2025
1daacb9
fix party disappearing in huge town
NQNStudios Aug 6, 2025
cae5739
fix place/edit special node tool
NQNStudios Aug 6, 2025
7799128
fix loc_off_act_area for outdoors
NQNStudios Aug 9, 2025
aa1edaa
fix monsters rendering backwards. fix #785
NQNStudios Aug 9, 2025
fe50914
feature flag keep doors easier in old scenarios
NQNStudios Aug 9, 2025
e6161f9
Draw roads with brown dots. Fix #782
NQNStudios Aug 9, 2025
996e731
ignore uninitialized Rectangle 1-8
NQNStudios Aug 10, 2025
4a9443f
fix grammar in special node description
NQNStudios Aug 11, 2025
0283811
When shifting to town entrance, show outdoor loc str
NQNStudios Aug 11, 2025
1684a48
queue_special() return whether special was queued
NQNStudios Aug 11, 2025
f9c0b02
town entry autosave wait for specials to run. fix #781
NQNStudios Aug 11, 2025
199719a
starting with stairways, show more info in edit special list
NQNStudios Aug 11, 2025
c9e54f0
fix contradiction in comment
NQNStudios Aug 14, 2025
83888fd
add donor to credits
NQNStudios Jul 31, 2025
2e858dd
add name to funding list
NQNStudios Aug 15, 2025
d770e60
has_class require_charges allow item w/ 0 max charges
NQNStudios Aug 16, 2025
83e5661
Fix rendering UTF-8 text
NQNStudios Aug 18, 2025
92fe397
try allowing implicit fallthrough in xcode
NQNStudios Aug 18, 2025
e470575
Clear saved monsters when exiting scenario. Fix #786
NQNStudios Aug 18, 2025
80ffda1
PC editor also clear creature save
NQNStudios Aug 18, 2025
7c2115e
Fix another bug in creating special encounters
NQNStudios Aug 25, 2025
6e13a9e
add an is_new check
NQNStudios Aug 25, 2025
591387c
make get_sdf_name() const
NQNStudios Aug 25, 2025
095a5a7
substitutions no longer needed
NQNStudios Aug 18, 2025
7d9f5d5
cScenario copy constructor copy sdf_names
NQNStudios Aug 25, 2025
af60435
update search highlights when paging left/right. fix #791
NQNStudios Aug 26, 2025
168ff83
fix draw zoomed-out teranim in scenedit
NQNStudios Aug 28, 2025
8512389
remove Spiderweb Software copyright & concact info from docs
NQNStudios Aug 28, 2025
a320da8
fix crash showing change site at edge of world
NQNStudios Aug 29, 2025
bf51eef
show better changesite for floodfill/terrain frill/item place
NQNStudios Aug 29, 2025
6333c66
fix change cursor when hovering field
NQNStudios Aug 31, 2025
7666e0b
fix highlighting everything on strchoice page left/right
NQNStudios Sep 1, 2025
6f50ae3
fix 'frill up terrain' prompting town entrance/sign text change
NQNStudios Sep 1, 2025
f833747
Town and scenario timers are supposed to repeat
NQNStudios Sep 4, 2025
435d65f
fix bug undoing draw monster
NQNStudios Sep 4, 2025
80b8668
fix crash with up/down key on empty field
NQNStudios Sep 4, 2025
f250cd4
fix clicking 'ok' in edit item dialog
NQNStudios Sep 4, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 0 additions & 11 deletions doc/editor/Contents.html
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@
</head>
<body>
<h1><img src="../img/boe.gif"> <u><b>Blades Scenario Editor Instructions</b></u></h1>
<p><i>Copyright 1998, Spiderweb Software, Inc.</i></p>
<p>This document contains all the information you need to play use the Blades of Exile Scenario Editor and make new scenarios for Blades of Exile!</p>
<p>This menu can also take you to the different sections of this document. To find the thing you're looking for, try the table of contents...</p>
<h2>Table of Contents</h2>
Expand Down Expand Up @@ -98,15 +97,5 @@ <h2>Technical support</h2>
<li><a href="http://spiderwebforums.ipbhost.com/index.php?/forum/12-blades-of-exile/">Blades of Exile Forum at Spiderweb Software</a></li>
<li><a href='irc://irc.freenode.net/openboe'>Blades of Exile IRC channel</a></li>
</ul>
<h3>Spiderweb Software</h3>
<ul>
<li>PO Box 85659</li>
<li>Seattle, WA 98145-1659</li>
<li>(206) 789-4438</li>
<li>E-mail: <a href="mailto:spidweb@spidweb.com">SpidWeb@spidweb.com</a></li>
<li>America Online: SpidWeb</li>
<li>CompuServe: 76463,1521</li>
<li>Internet: <a href="http://www.spiderwebsoftware.com">http://www.spiderwebsoftware.com</a></li>
</ul>
</body>
</html>
2 changes: 2 additions & 0 deletions pkg/credits/Funding.txt
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ Confirmed:
- Bret Rodabaugh
- Dylan Nugent
- Evan Mulrooney
- Glen Chudley
- Jake Harrelson
- Jared Forcinito
- Jeff Potter
Expand All @@ -25,6 +26,7 @@ Confirmed:
- K L
- Laura Nelson
- Mariann Krizsan
- Maryanne Wachter
- Mike Lapinsky
- Nathan Rickey
- Nick Chaimov
Expand Down
4 changes: 2 additions & 2 deletions proj/xc12/BoE.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -2516,7 +2516,7 @@
"-Wno-quoted-include-in-framework-header",
"-Wno-shorten-64-to-32",
"-Wno-comma",
"-Werror=implicit-fallthrough",
"-Wimplicit-fallthrough",
);
};
name = Debug;
Expand Down Expand Up @@ -2631,7 +2631,7 @@
"-Wno-quoted-include-in-framework-header",
"-Wno-shorten-64-to-32",
"-Wno-comma",
"-Werror=implicit-fallthrough",
"-Wimplicit-fallthrough",
);
};
name = Release;
Expand Down
10 changes: 6 additions & 4 deletions rsrc/dialogs/about-boe.xml
Original file line number Diff line number Diff line change
Expand Up @@ -18,11 +18,11 @@
<!-- The height of this text needs to be 10 times the number of lines. -->
<text top='52' left='50' width='400' height='240'>
ORIGINAL GAME: <br/><br/><br/><br/><br/><br/>
OPEN SOURCE CREDITS: <br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/>
OPEN SOURCE CREDITS: <br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/>
SCENARIO FIXES AND UPDATES: <br/><br/>
</text>
<!-- This text is right-aligned and fills out the above text with sub-headings -->
<text top='52' left='40' width='190' height='840' align='right'>
<text top='52' left='40' width='190' height='860' align='right'>
<br/>
Concept, Design, Programming: <br/>
Graphics: <br/>
Expand All @@ -34,11 +34,11 @@
Graphics: <br/><br/><br/><br/><br/><br/><br/>
Consulting: <br/><br/><br/><br/>
Testing and Troubleshooting: <br/><br/>
Funding: <br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/>
Funding: <br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/>
<br/><br/>
Bandit Busywork: <br/>
</text>
<text top='52' left='250' width='230' height='840'>
<text top='52' left='250' width='230' height='860'>
<!-- ORIGINAL GAME --><br/>
<!-- Concept, Design, Programming -->Jeff Vogel <br/>
<!-- Graphics -->Andrew Hunter <br/>
Expand Down Expand Up @@ -84,6 +84,7 @@
Bret Rodabaugh <br/>
Dylan Nugent <br/>
Evan Mulrooney <br/>
Glen Chudley <br/>
Jake Harrelson <br/>
Jared Forcinito <br/>
Jeff Potter <br/>
Expand All @@ -99,6 +100,7 @@
K L <br/>
Laura Nelson <br/>
Mariann Krizsan <br/>
Maryanne Wachter <br/>
Mike Lapinsky <br/>
Nathan Rickey <br/>
Nick Chaimov <br/>
Expand Down
2 changes: 2 additions & 0 deletions rsrc/dialogs/get-items.xml
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@
<dialog defbtn='done' escbtn='done'>
<button name='done' type='done' top='408' left='337'/>
<pict type='dlog' num='2' top='10' left='10'/>
<button name='gold' type='small' def-key='shift 4' relative='pos-in pos' rel-anchor='prev' top='4' left='0'><key/></button>
<text name='gold-label' relative='pos pos-in' rel-anchor='prev' top='0' left='2' width='38'>Get all gold</text>
<button name='pc1' type='small' def-key='1' top='354' left='89'><key/></button>
<button name='pc2' type='small' def-key='2' top='354' left='174'><key/></button>
<button name='pc3' type='small' def-key='3' top='354' left='259'><key/></button>
Expand Down
1 change: 1 addition & 0 deletions rsrc/dialogs/pick-scenario.xml
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,7 @@
<button name='x' def-key='x' type='tiny' relative='pos pos-in' rel-anchor='prev' top='0' left='4'>X</button>
<button name='y' def-key='y' type='tiny' relative='pos pos-in' rel-anchor='prev' top='0' left='4'>Y</button>
<button name='z' def-key='z' type='tiny' relative='pos pos-in' rel-anchor='prev' top='0' left='4'>Z</button>
<button name='#' def-key='shift 3' type='tiny' relative='neg pos-in' anchor='j' top='0' left='32'>#</button>

<button name='cancel' type='regular' top='330' left='5'>Cancel</button>
<button name='prev' type='left' def-key='left' relative='pos pos-in' rel-anchor='prev' top='0' left='14'/>
Expand Down
5 changes: 2 additions & 3 deletions rsrc/dialogs/shift-town-entrance.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,7 @@
<button name='no' type='regular' def-key='n' top='39' left='178'>No</button>
<button name='yes' type='regular' def-key='y' top='39' left='244'>Yes</button>
<pict type='dlog' num='11' top='9' left='9'/>
<text top='4' left='51' width='251' height='32'>
Shift to this town's entrance in this outdoor section?
<text name='prompt' top='4' left='51' width='251' height='32'>
Shift to this town's entrance in outdoor section {sec} at {loc} ({loc_str})?
</text>
<text name='out-sec' relative='pos-in pos' rel-anchor='prev' top='4' left='0'></text>
</dialog>
Binary file modified rsrc/graphics/startanim.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
2 changes: 1 addition & 1 deletion rsrc/strings/specials-text-town.txt
Original file line number Diff line number Diff line change
Expand Up @@ -353,7 +353,7 @@ Number of town to place party in
Skip dialog and always change level?
Trigger Limitations
Special to Call in New Town
A dialog comes up text you supply (saying, perhaps, they've found a stairway). The dialog buttons are Climb and Leave. If the Leave button is pressed, the Jump To special is used, and the party is not allowed to enter the space. If the Climb button is pushed, the party is moved to another town.
A dialog comes up with text you supply (saying, perhaps, they've found a stairway). The dialog buttons are Climb and Leave. If the Leave button is pressed, the Jump To special is used, and the party is not allowed to enter the space. If the Climb button is pushed, the party is moved to another town.
--------------------
Relocate Outdoors
Unused
Expand Down
4 changes: 3 additions & 1 deletion src/dialogxml/dialogs/dialog.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -795,14 +795,16 @@ void cDialog::handle_one_event(const sf::Event& currentEvent, cFramerateLimiter&
}
BOOST_FALLTHROUGH;
case sf::Event::MouseMoved:{
int x = currentEvent.mouseMove.x / get_ui_scale();
int y = currentEvent.mouseMove.y / get_ui_scale();
// Did the window move, potentially dirtying the canvas below it?
if(check_window_moved(win, winLastX, winLastY))
if (redraw_everything != NULL)
redraw_everything();

bool inField = false;
for(auto& ctrl : controls) {
if(ctrl.second->getType() == CTRL_FIELD && ctrl.second->getBounds().contains(currentEvent.mouseMove.x, currentEvent.mouseMove.y)) {
if(ctrl.second->getType() == CTRL_FIELD && ctrl.second->getBounds().contains(x, y)) {
set_cursor(text_curs);
inField = true;
break;
Expand Down
5 changes: 5 additions & 0 deletions src/dialogxml/dialogs/strchoice.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -143,6 +143,8 @@ bool cStringChoice::onLeft(){
if(page == 0) page = lastPage();
else page--;
fillPage();
clearHighlights();
highlightSearch();
return true;
}

Expand All @@ -154,6 +156,8 @@ bool cStringChoice::onRight(){
if(page == lastPage()) page = 0;
else page++;
fillPage();
clearHighlights();
highlightSearch();
return true;
}

Expand Down Expand Up @@ -244,6 +248,7 @@ void cStringChoice::clearHighlights() {

bool cStringChoice::highlightSearch() {
bool match_on_page = false;
if(search_str.empty()) return false;

for(int offset = 0; offset < per_page; ++offset){
std::string led_id = "led" + std::to_string(offset + 1);
Expand Down
2 changes: 2 additions & 0 deletions src/dialogxml/widgets/field.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -560,6 +560,7 @@ void cTextField::handleInput(cKey key, bool record) {
if(current_action) history.add(current_action), current_action.reset();
if(haveSelection && !select)
selectionPoint = insertionPoint = std::min(selectionPoint,insertionPoint);
if(snippets.empty()) break;
if(snippets[ip_row].at.y == snippets[0].at.y) {
key.k = key_top;
if(select) key.mod += mod_shift;
Expand All @@ -574,6 +575,7 @@ void cTextField::handleInput(cKey key, bool record) {
if(current_action) history.add(current_action), current_action.reset();
if(haveSelection && !select)
selectionPoint = insertionPoint = std::max(selectionPoint,insertionPoint);
if(snippets.empty()) break;
if(snippets[ip_row].at.y == snippets.back().at.y) {
key.k = key_bottom;
if(select) key.mod += mod_shift;
Expand Down
1 change: 1 addition & 0 deletions src/fileio/fileio_party.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -284,6 +284,7 @@ bool load_party_v1(fs::path file_to_load, cUniverse& real_univ, bool town_restor
univ.file = path;
}else{
univ.party.scen_name = "";
store_party.scen_name[0] = '\0';
}

univ.party.import_legacy(store_party, univ);
Expand Down
9 changes: 5 additions & 4 deletions src/fileio/fileio_scen.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -266,8 +266,11 @@ bool load_scenario_v1(fs::path file_to_load, cScenario& scenario, eLoadScenario
return false;
}
port_item_list(&item_data);
scenario.import_legacy(temp_scenario);
scenario.import_legacy(item_data);
scenario.import_legacy(temp_scenario, load_type == eLoadScenario::ONLY_HEADER);
if(load_type == eLoadScenario::FULL){
scenario.ter_types[23].fly_over = false;
scenario.import_legacy(item_data);
}

// TODO: Consider skipping the fread and assignment when len is 0
scenario.special_items.resize(50);
Expand Down Expand Up @@ -295,8 +298,6 @@ bool load_scenario_v1(fs::path file_to_load, cScenario& scenario, eLoadScenario

fclose(file_id);

scenario.ter_types[23].fly_over = false;

scenario.scen_file = file_to_load;
if(load_type == eLoadScenario::ONLY_HEADER) return true;
load_spec_graphics_v1(scenario.scen_file);
Expand Down
5 changes: 5 additions & 0 deletions src/game/boe.actions.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1409,6 +1409,11 @@ void handle_victory(bool force, bool record) {
univ.exportGraphics();
univ.exportSummons();
univ.clear_stored_pcs();
// Saved monsters are not valid now
for(auto& pop : univ.party.creature_save){
pop.which_town = 200;
pop.clear();
}
reload_startup();
overall_mode = MODE_STARTUP;
draw_startup(0);
Expand Down
32 changes: 24 additions & 8 deletions src/game/boe.dlgutil.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -662,15 +662,16 @@ std::vector<std::string> preset_words = {
"Ask About...",
};

std::vector<location> preset_word_locs = {
{4, 366}, {70, 366}, {136, 366},
{4, 389}, {70, 389}, {121, 389},
{210, 389}, {190, 366},
{4, 343}
};

static void reset_talk_words() {
// first initialise talk_words here
talk_words.clear();
static const std::vector<location> preset_word_locs = {
{4, 366}, {70, 366}, {136, 366},
{4, 389}, {70, 389}, {121, 389},
{210, 389}, {190, 366},
{4, 343}
};
TextStyle style;
style.font = FONT_DUNGEON;
style.pointSize = TALK_WORD_SIZE;
Expand Down Expand Up @@ -1798,8 +1799,16 @@ class cChooseScenario {
for(auto& hdr : scen_headers){
// I just checked, and the scenario editor will let you name your scenario "" or " "!
std::string name = name_alphabetical(hdr.name);
if(!name.empty())
me[name.substr(0, 1)].show();
if(!name.empty()){
// Starts with a letter:
if(me.hasControl(name.substr(0, 1))){
me[name.substr(0, 1)].show();
}
// Starts with a digit:
else if(name[0] >= '0' && name[0] <= '9'){
me["#"].show();
}
}
}
}

Expand Down Expand Up @@ -1882,6 +1891,7 @@ class cChooseScenario {
stk.setPage(0);
return true;
});
// Letter buttons scroll to an alphabetical position:
for(int i = 0; i < 26; ++i){
std::string letter(1, (char)('a' + i));
me[letter].attachClickHandler([this](cDialog& me, std::string letter, eKeyMod) -> bool {
Expand All @@ -1895,6 +1905,12 @@ class cChooseScenario {
return true;
});
}
// Number button scrolls to scenarios that start with symbols or digits:
me["#"].attachClickHandler([this](cDialog& me, std::string letter, eKeyMod) -> bool {
auto& stk = dynamic_cast<cStack&>(me["list"]);
stk.setPage(1);
return true;
});

put_scen_info();

Expand Down
10 changes: 5 additions & 5 deletions src/game/boe.fileio.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -341,6 +341,8 @@ std::string name_alphabetical(std::string a) {
// The scenario editor will let you prepend whitespace to a scenario name :(
boost::algorithm::trim_left(a);
std::transform(a.begin(), a.end(), a.begin(), tolower);
// Some party makers start with the name of the corresponding scenario in quotes
if(a.substr(0,1) == "\"") a.erase(a.begin(), a.begin() + 1);
if(a.substr(0,2) == "a ") a.erase(a.begin(), a.begin() + 2);
else if(a.substr(0,4) == "the ") a.erase(a.begin(), a.begin() + 4);
return a;
Expand All @@ -359,11 +361,9 @@ std::vector<scen_header_type> build_scen_headers() {
std::string scen_file;
while(std::getline(in, scen_file)){
scen_header_type scen_head;
fs::path full_path;
for(fs::path scenDir : all_scen_dirs()){
full_path = scenDir / scen_file;
if (fs::exists(full_path))
break;
fs::path full_path = locate_scenario(scen_file, true);
if(full_path.empty()){
LOG("Scenario missing! " + scen_file);
}
if(load_scenario_header(full_path, scen_head)){
scen_headers.push_back(scen_head);
Expand Down
Loading
Loading