206 Commits

Author SHA1 Message Date
978f061481 test butler early in CI 2025-11-06 15:24:44 -06:00
fb61272e8a temporarily use staged butler binaries 2025-11-06 15:24:44 -06:00
ad4cc972a6 update boe-scenarios 2025-11-06 15:24:43 -06:00
f4493c9e15 for now, commit the butler binaries 2025-11-06 15:24:43 -06:00
5785121948 get boe-scenarios from gitea 2025-11-06 15:24:42 -06:00
703707ea6d attacking charmed monsters dispels charm, doesn't anger town 2025-11-06 15:24:42 -06:00
8fc3723e76 fix a buffer message 2025-11-06 15:24:42 -06:00
0eb6828066 fix shop items being unidentified 2025-11-06 15:24:41 -06:00
1b7809b823 try something smart with talk node part1 and part2 display 2025-11-06 15:24:41 -06:00
1ad3b21f53 tutorial town map change 2025-11-06 15:24:41 -06:00
b97bcbada9 tutorial fixes 2025-11-06 15:24:41 -06:00
5eb239cd4b fix typo in minimap help text 2025-11-06 15:24:41 -06:00
3d38c352ad bugfixes 2025-11-06 15:24:40 -06:00
60b855df05 tutorial first draft finished 2025-11-06 15:24:40 -06:00
1c699c1257 fix shrinking talk text to fit 2025-11-06 15:24:40 -06:00
233c74eaf9 correct my mistake about destoning prices 2025-11-06 15:24:40 -06:00
56c0677ac4 Right text for townperson_100 picker 2025-11-06 15:24:39 -06:00
3a97ba8ef0 note a bug 2025-11-06 15:24:39 -06:00
ac757918c0 help messages for death 2025-11-06 15:24:39 -06:00
cbff85d66a node graph comment 2025-11-06 15:24:39 -06:00
f1392ed778 editor explain Kill/Raise Dead ex1c 2025-11-06 15:24:38 -06:00
14288192e8 implement if monsters alive node 2025-11-06 15:24:38 -06:00
8990fa3cb8 add if-then node definition for checking monster range alive 2025-11-06 15:24:38 -06:00
d38554e453 add note to scry monster description 2025-11-06 15:24:37 -06:00
220c5f5bd1 basics of final tower 2025-11-06 15:24:37 -06:00
14f6999fce tutorial 2/3 finished 2025-11-06 15:24:37 -06:00
bde2ec7a40 tip the scales for Unlock Door spell in tutorial 2025-11-06 15:24:37 -06:00
4a36b97363 fix the minmax calls on success chance printing 2025-11-06 15:24:36 -06:00
10d4f13828 finish vault tower? 2025-11-06 15:24:36 -06:00
9a2b648cb9 implement vehicle pictype (presets only, for now) 2025-11-06 15:24:36 -06:00
579eb4753b IF_HAVE_ITEM_CLASS treat negative as don't take 2025-11-06 15:24:36 -06:00
62595aba82 fix guard repositioning logic 2025-11-06 15:24:36 -06:00
dedfc78a0e need slightly different townperson picker for relocate node 2025-11-06 15:24:35 -06:00
e02d46b45f fix visual studio build 2025-11-06 15:24:35 -06:00
d450642332 working on tower 2 2025-11-06 15:24:35 -06:00
9c9506e903 Fix outdated 'Bye' help message 2025-11-06 15:24:35 -06:00
6954f5e0b5 fix crash on bash door in new scenario 2025-11-06 15:24:35 -06:00
75bc195d47 relocate creature node use townperson picker 2025-11-06 15:24:34 -06:00
ba79a89c6a tutorial improvements 2025-11-06 15:24:34 -06:00
bc7573b68a clarify Has Statistic? node options 2025-11-06 15:24:34 -06:00
24aaac96c4 solid chunk of tutorial work 2025-11-06 15:24:34 -06:00
d9def0508d fix help text about spellcasting key shortcuts 2025-11-06 15:24:34 -06:00
5e2af3d28f fix create special node on spot 2025-11-06 15:24:33 -06:00
ccd795c658 tutorial work 2025-11-06 15:24:33 -06:00
7d3d0e9c42 tutorial work 2025-11-06 15:24:33 -06:00
ac341208d4 tutorial work 2025-11-06 15:24:33 -06:00
f374325fd2 fix adding entrance to town 0 2025-11-06 15:24:32 -06:00
2e1cc4cf40 fix typo in string picker 2025-11-06 15:24:32 -06:00
2218c59cab fix 'remove frills' prompting town entrance/sign text change 2025-11-06 15:24:32 -06:00
bba7502534 show timers that call special nodes 2025-11-06 15:24:32 -06:00
dc5fae5e5e tutorial work 2025-11-06 15:24:31 -06:00
0606ece32a scenario editor draw roads more correctly 2025-11-06 15:24:31 -06:00
6201603e00 start adding other caller types to list 2025-11-06 15:24:31 -06:00
a14314421a fix book icon for series 2025-11-06 15:24:31 -06:00
8c6825f346 Make directional key scrolling default on 2025-11-06 15:24:30 -06:00
dc95cee364 update archive 2025-11-06 15:24:30 -06:00
54d51fb8b3 basic support for meta scenario tags 2025-11-06 15:24:30 -06:00
51cf5881c2 don't overwrite meta.xml without a change 2025-11-06 15:24:30 -06:00
be00a19661 make tooltip detection recursive 2025-11-06 15:24:29 -06:00
f08c30edf7 store and restore controls' tooltip text 2025-11-06 15:24:29 -06:00
de7ab5eaae done with lore floor 2025-11-06 15:24:29 -06:00
9b89330615 error message for out-of-bounds teleport 2025-11-06 15:24:29 -06:00
1bf032105f remove starting tooltip text 2025-11-06 15:24:28 -06:00
e79331802d fix record button overlapping picture 2025-11-06 15:24:28 -06:00
68e2f75602 restore editing specials mode 2025-11-06 15:24:28 -06:00
5c482e0508 tooltips on node links 2025-11-06 15:24:28 -06:00
85aaa9c307 show navigable buttons linking to callers and callees 2025-11-06 15:24:27 -06:00
659c5f1f84 full graphing 2025-11-06 15:24:27 -06:00
b2cc93e47f fix logic 2025-11-06 15:24:27 -06:00
65dc6695cc WIP nodegraph 2025-11-06 15:24:27 -06:00
284032cdce reorient the lore room and write more 2025-11-06 15:24:26 -06:00
f46ef69aca humanoid lizards 2025-11-06 15:24:26 -06:00
71a584d852 editor hint for titled message 2025-11-06 15:24:26 -06:00
33420a5643 Fix previews animating picts that shouldn't 2025-11-06 15:24:26 -06:00
63ab1e21ad odd-number pict coords to even 2025-11-06 15:24:25 -06:00
300c705504 WIP tutorial work 2025-11-06 15:24:25 -06:00
5f31f79edf interval for scenedit autosave 2025-11-06 15:24:25 -06:00
7edf2802d7 Let packaged prefab be .exg 2025-11-06 15:24:25 -06:00
4f49f81425 you can manually insert extra files in scenario pack 2025-11-06 15:24:24 -06:00
e159a02474 tarfile copy filename too 2025-11-06 15:24:24 -06:00
b9410ec7cb frame don't draw when control invisible 2025-11-06 15:24:24 -06:00
4954f41273 delete signature for nonexistent tarball method 2025-11-06 15:24:24 -06:00
38fdba9314 Monsters don't backtrack in combat move. fix #796 2025-11-06 15:24:23 -06:00
0abae9ca7c fix continuous shift when zoomed out in editor 2025-11-06 15:24:23 -06:00
19eef1590d reposition Resume 2025-11-06 15:24:23 -06:00
7df672bd41 Escape: open a 'pause' menu 2025-11-06 15:24:23 -06:00
843c119e5c add button & fix buttonpanel crash bug 2025-11-06 15:24:22 -06:00
48f5b8fc1c extremely aggressive scenedit autosave 2025-11-06 15:24:22 -06:00
b86e43024a fix loading last scenario for unpacked scenarios 2025-11-06 15:24:22 -06:00
8cf0613c5c previewing dialogs, never crash the editor 2025-11-06 15:24:21 -06:00
40a37478e3 Update testing help dialog 2025-11-06 15:24:21 -06:00
6494c3c494 disable contest help and reroute getting started 2025-11-06 15:24:21 -06:00
10313dad08 distribution docs for itch edition 2025-11-06 15:24:21 -06:00
a31fb2f94e tool to find creature in town 2025-11-06 15:24:20 -06:00
75b5686484 button to preview all dialogs in node list 2025-11-06 15:24:20 -06:00
50132a48e3 partly implement parentless button 2025-11-06 15:24:20 -06:00
732b01c44c townperson picker show name if has one 2025-11-06 15:24:19 -06:00
1c7d1d5707 townperson picker for single monster attitude 2025-11-06 15:24:19 -06:00
bb732b7784 townperson picker for town attitude range 2025-11-06 15:24:19 -06:00
4a16ab4f7b allow labeled cPictChoice variant 2025-11-06 15:24:18 -06:00
8ce19e73a5 preview quest 2025-11-06 15:24:18 -06:00
62ed0e1cdc preview special item 2025-11-06 15:24:18 -06:00
c8a693bd28 allow choose special node type from any category w/ search 2025-11-06 15:24:17 -06:00
c809834050 preview for TOWN_STAIR node 2025-11-06 15:24:17 -06:00
ed64975b14 preview for TOWN_PORTAL dialog 2025-11-06 15:24:17 -06:00
3054299a73 preview for lever dialog 2025-11-06 15:24:17 -06:00
d97c1abff3 add note to generic stairway text field 2025-11-06 15:24:17 -06:00
0da41c7d25 preview town node generic dialogs 2025-11-06 15:24:16 -06:00
8cd989c9e2 hide button2 when not needed 2025-11-06 15:24:16 -06:00
7a033f9e2e preview for IF_NUM_RESPONSE node 2025-11-06 15:24:16 -06:00
6f2fd7ea61 get_num_response don't show range if there is none 2025-11-06 15:24:15 -06:00
179ac5d931 preview for IF_TEXT_RESPONSE 2025-11-06 15:24:15 -06:00
fe465a4abc previewable Display Picture with control of small icon 2025-11-06 15:24:15 -06:00
a98773f3f6 fix full-sheet graphic picker for unpacked scenario 2025-11-06 15:24:15 -06:00
377a63ff35 preview two more one-time dialogs in editor 2025-11-06 15:24:14 -06:00
610b7a2d7f fix picker for one-time give item dialog msg 2025-11-06 15:24:14 -06:00
3136807a9a Quest node fields allow create/edit and choose 2025-11-06 15:24:14 -06:00
65de954fd0 allow picking special node as well as create/edit 2025-11-06 15:24:14 -06:00
a638b9ae28 string choice dialog allow forcing 1 column 2025-11-06 15:24:13 -06:00
2a87b24bb8 allow duplicating special node 2025-11-06 15:24:13 -06:00
7f0b416c92 more node editor hints 2025-11-06 15:24:12 -06:00
e339ea6d0e editor hint for short once dialog, story dialog 2025-11-06 15:24:12 -06:00
df8dc6f9f2 editor hint for 6-str once dialog 2025-11-06 15:24:12 -06:00
65bf9c3452 story dialog show/hide right/left at ends 2025-11-06 15:24:11 -06:00
6c8078fa61 control-click to duplicate terrain/monster/item type 2025-11-06 15:24:11 -06:00
3889c04b8a editor hint for INC_FLAG 2025-11-06 15:24:11 -06:00
045db25c11 function to get a display name for sdf 2025-11-06 15:24:11 -06:00
a9c48f3cb4 substitutions no longer needed 2025-11-06 15:24:10 -06:00
8f4bd54194 more lore room 2025-11-06 15:24:10 -06:00
f9beb0aabc allow wrapping story dialog title 2025-11-06 15:24:10 -06:00
48e47c9711 allow preview story dialog in editor 2025-11-06 15:24:09 -06:00
9015cf2b05 hint for SET_SDF 2025-11-06 15:24:09 -06:00
ca16fb634d allow importing animated terrain icon 2025-11-06 15:24:09 -06:00
b93daefb5d fix custom graphics manipulation for unpacked scenarios 2025-11-06 15:24:09 -06:00
eb5408cef8 Work on lore room 2025-11-06 15:24:08 -06:00
cded3a3e0f interpolate correct menu item to find preferences
fix #797 other minor issue
2025-11-06 15:24:08 -06:00
b8c09b2c44 allow scenario to contain extra first help message. fix #797 2025-11-06 15:24:07 -06:00
5a160f99ff quick-fix failure to show load/create dialog for builtin scens 2025-11-06 15:24:07 -06:00
4ac5e2e044 fix key shortcuts of reset help confirmation 2025-11-06 15:24:07 -06:00
fb2346f557 Wire up the tutorial (which is empty) 2025-11-06 15:24:07 -06:00
0af8985d48 NSI script copy tutorial.boes 2025-11-06 15:24:06 -06:00
bf8079a43e Xcode package tutorial 2025-11-06 15:24:06 -06:00
b454952f5d Visual studio package tutorial 2025-11-06 15:24:06 -06:00
946ff0ca02 Scons package the tutorial scenario 2025-11-06 15:24:05 -06:00
a1e2eaf5d0 Unpacked empty tutorial scenario 2025-11-06 15:24:05 -06:00
68da72b304 print success chance when fail breaking door or barrier 2025-11-06 15:24:05 -06:00
49d8501795 ignore empty encoding element 2025-11-06 15:24:05 -06:00
73fa5fc874 ignore uninitialized Rectangle 1-8 2025-11-06 15:24:04 -06:00
18d80d9fc0 Fix a case of minimap area rect spoilers 2025-11-06 15:24:04 -06:00
2f9fa8806f targeting grid fix big monster handling 2025-11-06 15:24:04 -06:00
2722b16c85 Clip big monster combat frame at window edge 2025-11-06 15:24:03 -06:00
799bfe8916 don't tooltip or annotate hidden towns/junk sign locs 2025-11-06 15:24:03 -06:00
2ea81c22a6 move is_sign to boe.locutils 2025-11-06 15:24:03 -06:00
10b0fc2890 fix hovering map features outdoors 2025-11-06 15:24:03 -06:00
64d508a505 fix outdoor positioning of circle markers 2025-11-06 15:24:02 -06:00
86f0fd17e3 fix crash when out-of-bounds 'tile' hovered in minimap 2025-11-06 15:24:02 -06:00
14130cb3e0 add btnpanel sources to xcode12 2025-11-06 15:24:02 -06:00
da957d7c65 specify vehicle.hpp directory 2025-11-06 15:24:01 -06:00
a128c0b91c Tooltip text when party icon highlighted 2025-11-06 15:24:01 -06:00
853771230a better way of only showing known extent of area rectangle 2025-11-06 15:24:01 -06:00
9fd2683aa9 TRANSPARENT->EMPTY makes it compile on Windows 2025-11-06 15:24:00 -06:00
814cd44f73 very messy support for recording 6-string dialog 2025-11-06 15:24:00 -06:00
404fd5d24e combine 2-string dialog records into 1 element 2025-11-06 15:24:00 -06:00
d01103a8ca record 2-string dialogs in one element 2025-11-06 15:24:00 -06:00
9fcd06bd1d draw and give tooltips for more map features 2025-11-06 15:23:59 -06:00
1fd34fb657 messy map tooltip demo 2025-11-06 15:23:59 -06:00
a5d368265c Refactor minimap rendering and fix tiny town crash 2025-11-06 15:23:59 -06:00
049d5d4cb9 combat highlighting handle big monsters 2025-11-06 15:23:58 -06:00
91be550c12 update scen archive 2025-11-06 15:23:58 -06:00
8c4aac43e8 don't show misleading frame in targeting mode 2025-11-06 15:23:58 -06:00
ac776231a7 frame friendlies/monsters during combat 2025-11-06 15:23:58 -06:00
34e71f1830 don't highlight invisible monster for targeting 2025-11-06 15:23:57 -06:00
1778105f33 highlight targetable squares with enemy/ally attitude. fix #779 2025-11-06 15:23:57 -06:00
4db78082f5 more encodings 2025-11-06 15:23:57 -06:00
ff821abb79 handle MacRoman specially 2025-11-06 15:23:56 -06:00
ca010ef10c fix word highlighting where substitutions are used 2025-11-06 15:23:56 -06:00
432e3e0317 run trimming and decoding on more scenario strings 2025-11-06 15:23:56 -06:00
afed1e9ed9 guessed encodings 2025-11-06 15:23:56 -06:00
a6aaa6776f go to absurd lengths handling locales 2025-11-06 15:23:55 -06:00
893a66a7cb apply substitutions when calculating line wrapping 2025-11-06 15:23:55 -06:00
07a8857ca2 Fix replay which loads a prefab 2025-11-06 15:23:55 -06:00
60e8673634 update scen archive 2025-11-06 15:23:54 -06:00
84b59702f2 Allow create new or load party after selecting scenario 2025-11-06 15:23:54 -06:00
61bf7c9704 for legacy scenarios, help open readme or load prefab 2025-11-06 15:23:53 -06:00
9a5ca68322 updates to scen archive 2025-11-06 15:23:53 -06:00
bee32a2879 New dialog presents a yes/no choice with alternate non-exclusive actions 2025-11-06 15:23:53 -06:00
451371a834 Include Bandit Busywork in custom scenarios section 2025-11-06 15:23:52 -06:00
ebde2d705a use windows 2022 for release build 2025-11-06 15:23:52 -06:00
0d7d17dca1 add as many custom scenarios as possible 2025-11-06 15:23:51 -06:00
ba6168fbe3 Release build squashed 2025-11-06 15:23:51 -06:00
aeb5a39544 Load image directly
Co-authored-by: Celtic Minstrel <CelticMinstrel@users.noreply.github.com>
2025-11-06 14:36:22 -06:00
fffd5e81cc fix updating the in-memory image for full-sheets replaced 2025-11-06 14:36:01 -06:00
6335d467a6 Fix undo reload/import full-sheet graphic 2025-11-06 14:35:48 -06:00
7136cd55dc try fix test compilation 2025-11-06 14:35:39 -06:00
65c630b06a add function call that prevents black custom sheet canvas 2025-11-06 14:35:22 -06:00
17eea48e40 show selected icons visually 2025-11-06 14:35:16 -06:00
62d71639c9 refactor custom graphics dialog into a class 2025-11-06 14:35:06 -06:00
51c33e33cc strip and re-add terrain backgrounds 2025-11-06 14:35:00 -06:00
6ae2ac66a4 import terrain icons to custom sheets 2025-11-06 14:34:50 -06:00
4d44225f6b allow cPict to draw on any RenderTarget 2025-11-06 14:34:38 -06:00
02e92b2b58 non-mac targets scenario editor must save LastScenario pref 2025-11-06 14:34:31 -06:00
15cb840e28 clear icon selection when sheet changes 2025-11-06 14:34:22 -06:00
78bcc4cb29 allow selecting range of icons in graphics sheet 2025-11-06 14:34:14 -06:00
85dc268d1d MacOS find inner binary of image editor app bundle 2025-11-06 14:34:03 -06:00
1c6f9a80a6 edit/reload buttons in graphic editor 2025-11-06 14:33:55 -06:00
73bff7c2bc add image editor preference to scenedit 2025-11-06 14:33:47 -06:00
182 changed files with 27413 additions and 1196 deletions

78
.github/workflows/mac-universal.yml vendored Normal file
View File

@@ -0,0 +1,78 @@
name: Mac universal build
on:
push:
branches:
- universal
release:
types: [published]
jobs:
build:
runs-on: macos-14
env:
CONFIGURATION: ${{ matrix.configuration }}
BUTLER_API_KEY: ${{ secrets.BUTLER_API_KEY }}
PROD_MACOS_CERTIFICATE: '${{ secrets.PROD_MACOS_CERTIFICATE }}'
PROD_MACOS_CERTIFICATE_PWD: '${{ secrets.PROD_MACOS_CERTIFICATE_PWD }}'
PROD_MACOS_CERTIFICATE_NAME: '${{ secrets.PROD_MACOS_CERTIFICATE_NAME }}'
PROD_MACOS_CI_KEYCHAIN_PWD: '${{ secrets.PROD_MACOS_CI_KEYCHAIN_PWD }}'
PROD_MACOS_NOTARIZATION_APPLE_ID: '${{ secrets.PROD_MACOS_NOTARIZATION_APPLE_ID }}'
PROD_MACOS_NOTARIZATION_TEAM_ID: '${{ secrets.PROD_MACOS_NOTARIZATION_TEAM_ID }}'
PROD_MACOS_NOTARIZATION_PWD: '${{ secrets.PROD_MACOS_NOTARIZATION_PWD }}'
BUILD_OS: macos
strategy:
fail-fast: false
matrix:
configuration:
- Release
- Debug
steps:
- uses: actions/checkout@v4
- name: test butler
run: './.github/workflows/scripts/butler_push.sh test'
shell: bash
if: ${{ startsWith(github.ref, 'refs/tags/') && matrix.configuration == 'Release' && matrix.os.name != 'macos' }}
# Download macos-intel
- uses: robinraju/release-downloader@v1
id: download
with:
latest: true
fileName: 'cboe-macos-intel-${{ matrix.configuration }}.tar'
extract: true
out-file-path: 'cboe-macos-intel-${{ matrix.configuration }}'
# Download macos-silicon
- uses: robinraju/release-downloader@v1
with:
latest: true
fileName: 'cboe-macos-silicon-${{ matrix.configuration }}.tar'
extract: true
out-file-path: 'cboe-macos-silicon-${{ matrix.configuration }}'
- run: .github/workflows/scripts/mac/make-universal.sh
# Skipping this for now because of issue nqnstudios#13
- name: Codesign and notarize
run: 'SIGN="no" NOTARIZE="no" .github/workflows/scripts/mac/sign-apps.sh'
- name: 'Tar files'
run: 'tar -cvf cboe-macos-universal-${{matrix.configuration}}.tar "build/Blades of Exile"'
# Upload everything as artifact
- uses: actions/upload-artifact@v4
with:
name: mac-universal-dependencies-${{matrix.configuration}}
path: cboe-macos-universal-${{matrix.configuration}}.tar
# upload a release
- name: Github release
uses: softprops/action-gh-release@v2
with:
files: cboe-macos-universal-${{ matrix.configuration }}.tar
tag_name: ${{ steps.download.outputs.tag_name }}
- name: 'Itch.io release'
run: './.github/workflows/scripts/butler_push.sh'
shell: bash
if: ${{ matrix.configuration == 'Release' }}

136
.github/workflows/release.yml vendored Normal file
View File

@@ -0,0 +1,136 @@
on:
push:
branches:
- 'itch-edition'
tags:
- "v*.*.*"
pull_request:
branches:
- itch-edition
jobs:
release:
env:
ARCH: ${{ matrix.os.flag }}
MACOSX_DEPLOYMENT_TARGET: 10.15
BUTLER_API_KEY: ${{ secrets.BUTLER_API_KEY }}
PROD_MACOS_CERTIFICATE: '${{ secrets.PROD_MACOS_CERTIFICATE }}'
PROD_MACOS_CERTIFICATE_PWD: '${{ secrets.PROD_MACOS_CERTIFICATE_PWD }}'
PROD_MACOS_CERTIFICATE_NAME: '${{ secrets.PROD_MACOS_CERTIFICATE_NAME }}'
PROD_MACOS_CI_KEYCHAIN_PWD: '${{ secrets.PROD_MACOS_CI_KEYCHAIN_PWD }}'
PROD_MACOS_NOTARIZATION_APPLE_ID: '${{ secrets.PROD_MACOS_NOTARIZATION_APPLE_ID }}'
PROD_MACOS_NOTARIZATION_TEAM_ID: '${{ secrets.PROD_MACOS_NOTARIZATION_TEAM_ID }}'
PROD_MACOS_NOTARIZATION_PWD: '${{ secrets.PROD_MACOS_NOTARIZATION_PWD }}'
VCPKG_BINARY_SOURCES: "clear;x-gha,readwrite"
RELEASE_FLAG: ${{ matrix.configuration == 'Release' && 'true' || 'false' }}
BUILD_OS: ${{ matrix.os.name }}
strategy:
fail-fast: false
matrix:
os:
- name: macos
suffix: '-intel'
flag: x86_64
deps: macos-universal
version: 13
scons-script: './.github/workflows/scripts/mac/scons-build.sh'
- name: macos
flag: arm64
suffix: '-silicon'
deps: macos-universal
version: 14
scons-script: './.github/workflows/scripts/mac/scons-build.sh'
# - name: ubuntu
# suffix: ''
# version: 22.04
# scons-script: scons
- name: windows
suffix: ''
version: 2022
scons-script: './.github/workflows/scripts/win/scons-build.bat'
configuration:
- Release
- Debug
runs-on: '${{ matrix.os.name }}-${{ matrix.os.version }}'
steps:
- name: Export GitHub Actions cache environment variables
uses: actions/github-script@v7
with:
script: "core.exportVariable('ACTIONS_CACHE_URL', process.env.ACTIONS_CACHE_URL || ''); core.exportVariable('ACTIONS_RUNTIME_TOKEN', process.env.ACTIONS_RUNTIME_TOKEN || '');"
- name: checkout
uses: actions/checkout@v4
with:
submodules: true
- name: test butler
run: './.github/workflows/scripts/butler_push.sh test'
shell: bash
if: ${{ startsWith(github.ref, 'refs/tags/') && matrix.configuration == 'Release' && matrix.os.name != 'macos' }}
- name: Download dependency build
uses: robinraju/release-downloader@v1
with:
repository: NQNStudios/cboe-dependencies
latest: true
fileName: 'dependencies-${{ matrix.os.deps || matrix.os.name }}-${{ matrix.configuration }}.tar'
extract: true
out-file-path: 'deps'
- name: Windows build dependencies
run: 'vcpkg install libxml2 && pip install scons'
if: ${{ matrix.os.name == 'windows' }}
- name: Mac build dependencies
run: brew install scons
if: ${{ matrix.os.name == 'macos' }}
- name: Linux build dependencies
run: sudo apt-get update && sudo apt-get install scons libxml2-utils libgl-dev libopenal-dev
if: ${{ matrix.os.name == 'ubuntu' }}
- name: Install TGUI
run: 'sudo ./.github/workflows/scripts/linux/install-tgui.sh'
if: ${{ matrix.os.name == 'ubuntu' }}
- name: Build
run: '${{ matrix.os.scons-script }} test=false release=$RELEASE_FLAG'
shell: bash
- name: Download fix-rpaths.py script
run: git clone https://gist.github.com/NQNStudios/7145bcf6621891f5176c8caa165d6b93
if: ${{ matrix.os.name == 'macos' }}
- name: Fix rpaths game
run: 'python 7145bcf6621891f5176c8caa165d6b93/fix-rpaths.py "build/Blades of Exile/Blades of Exile.app"'
if: ${{ matrix.os.name == 'macos' }}
- name: Fix rpaths scenario editor
run: 'python 7145bcf6621891f5176c8caa165d6b93/fix-rpaths.py "build/Blades of Exile/BoE Scenario Editor.app"'
if: ${{ matrix.os.name == 'macos' }}
- name: Fix rpaths character editor
run: 'python 7145bcf6621891f5176c8caa165d6b93/fix-rpaths.py "build/Blades of Exile/BoE Character Editor.app"'
if: ${{ matrix.os.name == 'macos' }}
- run: cp .itch.toml "build/Blades of Exile/"
shell: bash
- name: 'Tar unsigned files'
run: 'tar -cvf cboe-${{ matrix.os.name }}${{ matrix.os.suffix }}-${{ matrix.configuration }}-unsigned.tar "Blades of Exile"'
working-directory: '${{ github.workspace }}/build'
- name: upload pre-signing artifact
uses: actions/upload-artifact@v4
with:
name: cboe-${{ matrix.os.name }}${{ matrix.os.suffix }}-${{ matrix.configuration }}-unsigned
path: '${{ github.workspace }}/build/cboe-${{ matrix.os.name }}${{ matrix.os.suffix }}-${{ matrix.configuration }}-unsigned.tar'
# Skipping this for now because of issue nqnstudios#13
- name: Codesign and notarize
run: 'SIGN="no" NOTARIZE="no" ./.github/workflows/scripts/mac/sign-apps.sh'
if: ${{ matrix.os.name == 'macos' }}
- name: 'Tar files'
run: 'tar -cvf cboe-${{ matrix.os.name }}${{ matrix.os.suffix }}-${{ matrix.configuration }}.tar "Blades of Exile"'
working-directory: '${{ github.workspace }}/build'
- name: 'Upload Artifact'
uses: actions/upload-artifact@v4
with:
name: cboe-${{ matrix.os.name }}${{ matrix.os.suffix }}-${{ matrix.configuration }}
path: '${{ github.workspace }}/build/cboe-${{ matrix.os.name }}${{ matrix.os.suffix }}-${{ matrix.configuration }}.tar'
- name: Github release
uses: softprops/action-gh-release@v2
with:
files: '${{ github.workspace }}/build/cboe-${{ matrix.os.name }}${{ matrix.os.suffix }}-${{ matrix.configuration }}.tar'
if: ${{ startsWith(github.ref, 'refs/tags/') }}
- name: 'Itch.io release'
run: './.github/workflows/scripts/butler_push.sh'
shell: bash
if: ${{ startsWith(github.ref, 'refs/tags/') && matrix.configuration == 'Release' && matrix.os.name != 'macos' }}

48
.github/workflows/scripts/butler_push.sh vendored Executable file
View File

@@ -0,0 +1,48 @@
#! /bin/bash
# Pass any argument to make it a dry run (for putting at the start of your CI, to catch failure early)
test="${1}"
butler_channel=""
butler_exe=""
release_dir=""
if [ "$BUILD_OS" = "ubuntu" ]; then
butler_channel=linux-amd64
butler_exe=butler
release_dir="linux"
# TEMPORARY
butler_exe=.github/workflows/scripts/linux/butler/butler
elif [ "$BUILD_OS" = "windows" ]; then
butler_channel=windows-amd64
butler_exe=butler.exe
release_dir="windows"
# TEMPORARY
butler_exe=.github/workflows/scripts/win/butler/butler.exe
elif [ "$BUILD_OS" = "macos" ]; then
butler_channel=darwin-amd64
butler_exe=butler
release_dir="macos"
# TEMPORARY
butler_exe=.github/workflows/scripts/mac/butler/butler
fi
# Butler download is disabled because something is wrong with the automated download links
## -L follows redirects
## -O specifies output name
# if [ ! -f ./${butler_exe} ]; then
# curl -L -o butler.zip https://broth.itch.ovh/butler/${butler_channel}/LATEST/archive/default
# unzip butler.zip
# fi
# GNU unzip tends to not set the executable bit even though it's set in the .zip
chmod +x ${butler_exe}
# just a sanity check run (and also helpful in case you're sharing CI logs)
./${butler_exe} -V
if [ -z "$test" ]; then
./${butler_exe} push "build/Blades of Exile/" nqn/blades-of-exile:${release_dir}
fi

BIN
.github/workflows/scripts/linux/butler/7z.so vendored Executable file

Binary file not shown.

BIN
.github/workflows/scripts/linux/butler/butler vendored Executable file

Binary file not shown.

Binary file not shown.

View File

@@ -3,7 +3,7 @@
git clone --depth 1 -b 0.9 https://github.com/texus/TGUI.git
cd TGUI
export CLICOLOR_FORCE=1
cmake -D TGUI_CXX_STANDARD=14 .
SFML_DIR=../deps/lib/cmake/SFML cmake -D TGUI_CXX_STANDARD=14 -D SFML_DIR=../deps/lib/cmake/SFML .
make
cmake --install .
cd .. # Probably not needed but...

View File

@@ -1,4 +1,4 @@
#!/bin/sh -ve
export CCFLAGS=-fdiagnostics-color=always
scons
scons $@

BIN
.github/workflows/scripts/mac/butler/7z.so vendored Executable file

Binary file not shown.

BIN
.github/workflows/scripts/mac/butler/butler vendored Executable file

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,27 @@
#! /bin/bash
if [ -z "$CONFIGURATION" ]; then
CONFIGURATION=Release
fi
INTEL=cboe-macos-intel-$CONFIGURATION
SILICON=cboe-macos-silicon-$CONFIGURATION
combine() {
mkdir -p "build/Blades of Exile/$1.app/Contents/MacOS"
lipo -create "$SILICON/Blades of Exile/$1.app/Contents/MacOS/$1" "$INTEL/Blades of Exile/$1.app/Contents/MacOS/$1" -output "build/Blades of Exile/$1.app/Contents/MacOS/$1"
cp -r "$SILICON/Blades of Exile/$1.app/Contents/Frameworks" "build/Blades of Exile/$1.app/Contents/"
cp -r "$SILICON/Blades of Exile/$1.app/Contents/Resources" "build/Blades of Exile/$1.app/Contents/"
cp "$SILICON/Blades of Exile/$1.app/Contents/Info.plist" "build/Blades of Exile/$1.app/Contents/"
cp "$SILICON/Blades of Exile/$1.app/Contents/PkgInfo" "build/Blades of Exile/$1.app/Contents/"
}
combine "Blades of Exile"
combine "BoE Scenario Editor"
combine "BoE Character Editor"
cp -r "$SILICON/Blades of Exile/Blades of Exile Base" "build/Blades of Exile/"
cp -r "$SILICON/Blades of Exile/Blades of Exile Scenarios" "build/Blades of Exile/"
cp -r "$SILICON/Blades of Exile/data" "build/Blades of Exile/"
cp -r "$SILICON/Blades of Exile/docs" "build/Blades of Exile/"
cp "$SILICON/Blades of Exile/.itch.toml" "build/Blades of Exile/"

View File

@@ -4,4 +4,4 @@ export CC="$(brew --prefix llvm)/bin/clang"
export CXX="$(brew --prefix llvm)/bin/clang++"
export SDKROOT="$(xcrun --show-sdk-path)"
scons CXXFLAGS="-I/usr/local/opt/zlib/include" LINKFLAGS="-L/usr/local/opt/zlib/lib" $@
scons CXXFLAGS="-I/usr/local/opt/zlib/include -arch $ARCH" LINKFLAGS="-L/usr/local/opt/zlib/lib" $@

79
.github/workflows/scripts/mac/sign-apps.sh vendored Executable file
View File

@@ -0,0 +1,79 @@
#! /bin/bash
# CODE-SIGNING STEP
# Original Source: https://federicoterzi.com/blog/automatic-code-signing-and-notarization-for-macos-apps-using-github-actions/
# Modified by NQNStudios
# Turn our base64-encoded certificate back to a regular .p12 file
echo $PROD_MACOS_CERTIFICATE | base64 --decode > certificate.p12
# We need to create a new keychain, otherwise using the certificate will prompt
# with a UI dialog asking for the certificate password, which we can't
# use in a headless CI environment
security create-keychain -p "$PROD_MACOS_CI_KEYCHAIN_PWD" build.keychain
security default-keychain -s build.keychain
security unlock-keychain -p "$PROD_MACOS_CI_KEYCHAIN_PWD" build.keychain
security import certificate.p12 -k build.keychain -P "$PROD_MACOS_CERTIFICATE_PWD" -T /usr/bin/codesign
security set-key-partition-list -S apple-tool:,apple:,codesign: -s -k "$PROD_MACOS_CI_KEYCHAIN_PWD" build.keychain
sign() {
if [ "$SIGN" = "no" ];
then
return
fi
APP_PATH="build/Blades of Exile/$1.app"
# We finally codesign our app bundle, specifying the Hardened runtime option
/usr/bin/codesign --force -s "$PROD_MACOS_CERTIFICATE_NAME" --options runtime "$APP_PATH"/Contents/Frameworks/*.dylib -v
(cd "$APP_PATH" && frameworks=Contents/Frameworks/*.framework/Versions/A/* && \
for framework in $frameworks; do
if [ -f "$framework" ]; then
/usr/bin/codesign --force -s "$PROD_MACOS_CERTIFICATE_NAME" --options runtime "$framework" -v
fi
done)
/usr/bin/codesign --force -s "$PROD_MACOS_CERTIFICATE_NAME" --options runtime "$APP_PATH"/Contents/Frameworks/*.framework/Versions/A/Resources/Info.plist -v
/usr/bin/codesign --force -s "$PROD_MACOS_CERTIFICATE_NAME" --options runtime "$APP_PATH/Contents/Info.plist" -v
/usr/bin/codesign --force -s "$PROD_MACOS_CERTIFICATE_NAME" --options runtime "$APP_PATH" -v
# NOTARIZATION STEP
if [ "$NOTARIZE" = "no" ];
then
return
fi
# (same source)
# Store the notarization credentials so that we can prevent a UI password dialog
# from blocking the CI
echo "Create keychain profile"
xcrun notarytool store-credentials "notarytool-profile" --apple-id "$PROD_MACOS_NOTARIZATION_APPLE_ID" --team-id "$PROD_MACOS_NOTARIZATION_TEAM_ID" --password "$PROD_MACOS_NOTARIZATION_PWD"
# We can't notarize an app bundle directly, but we need to compress it as an archive.
# Therefore, we create a zip file containing our app bundle, so that we can send it to the
# notarization service
echo "Creating temp notarization archive"
ditto -c -k --keepParent "$APP_PATH" "notarization.zip"
# Here we send the notarization request to the Apple's Notarization service, waiting for the result.
# This typically takes a few seconds inside a CI environment, but it might take more depending on the App
# characteristics. Visit the Notarization docs for more information and strategies on how to optimize it if
# you're curious
echo "Notarize app"
xcrun notarytool submit "notarization.zip" --keychain-profile "notarytool-profile" --wait
# Finally, we need to "attach the staple" to our executable, which will allow our app to be
# validated by macOS even when an internet connection is not available.
echo "Attach staple"
xcrun stapler staple "$APP_PATH" || exit 1
}
sign "Blades of Exile"
sign "BoE Scenario Editor"
sign "BoE Character Editor"

Binary file not shown.

Binary file not shown.

Binary file not shown.

3
.gitmodules vendored
View File

@@ -14,3 +14,6 @@
[submodule "deps/fmtlib"]
path = deps/fmtlib
url = http://github.com/fmtlib/fmt
[submodule "rsrc/scenarios/custom"]
path = rsrc/scenarios/custom
url = https://k7izh9.gitea.cloud/openboe/boe-scenarios

9
.itch.toml Normal file
View File

@@ -0,0 +1,9 @@
[[actions]]
name = "Play"
path = "Blades of Exile.exe"
platform = "windows"
[[actions]]
name = "Play"
path = "Blades of Exile.app"
platform = "osx"

View File

@@ -110,7 +110,7 @@ correct place to search. For example, if you installed Boost via Homebrew, you m
add something like the following to the Project Build Settings, under Linking->Other
Linking Flags:
-lboost_filesystem -lboost_system -L/usr/local/Cellar/boost/1.57.0/lib
-lboost_filesystem -lboost_system -lboost_locale -L/usr/local/Cellar/boost/1.57.0/lib
Again with Homebrew, you may also need to add the following to Apple LLVM Custom
Compiler Flags -> Other C++ Flags:

View File

@@ -232,13 +232,15 @@ elif platform == "win32":
vcpkg_other_libs = list(filter(path.exists, vcpkg_other_libs))
vcpkg_other_bins = [path.join(d.get_abspath(), 'bin') for d in vcpkg_other_packages]
vcpkg_other_bins = list(filter(path.exists, vcpkg_other_bins))
include_paths=[path.join(vcpkg_installed, 'include')] + vcpkg_other_includes
project_includes = []
for (root, dirs, files) in os.walk('src'):
project_includes.append(path.join(os.getcwd(), root))
include_paths=project_includes
env.Append(
LINKFLAGS=['/SUBSYSTEM:WINDOWS','/ENTRY:mainCRTStartup',f'/MACHINE:X{arch_short}'],
LINKFLAGS=['/SUBSYSTEM:WINDOWS','/ENTRY:mainCRTStartup',f'/MACHINE:X{arch_short}', '/VERBOSE', '/NODEFAULTLIB:libboost_filesystem-vc142-mt-x64-1_85.lib'],
CXXFLAGS=['/EHsc','/MD','/FIglobal.hpp','/utf-8'],
CPPPATH=include_paths,
LIBPATH=[path.join(vcpkg_installed, 'lib')] + vcpkg_other_libs + vcpkg_other_bins,
LIBPATH=[],
LIBS=Split("""
kernel32
user32
@@ -259,7 +261,10 @@ elif platform == "win32":
def build_app_package(env, source, build_dir, info):
env.Install(build_dir, source)
elif platform == "posix":
env.Append(CXXFLAGS=["-std=c++14","-include","global.hpp"])
env.Append(
CXXFLAGS=["-std=c++14","-include","global.hpp"],
#LINKFLAGS=["-rpath-link", "deps/lib/", "-rpath", "./"]
)
def build_app_package(env, source, build_dir, info):
env.Install(build_dir, source)
@@ -392,6 +397,7 @@ if not env.GetOption('clean'):
check_header('boost/spirit/include/classic.hpp', 'Boost.Spirit.Classic')
check_lib('boost_system', 'Boost.System', suffixes, boost_versions)
check_lib('boost_filesystem', 'Boost.Filesystem', suffixes, boost_versions)
check_lib('boost_locale', 'Boost.Locale', suffixes, boost_versions)
sfml_suffixes = ['-d']
check_lib('sfml-system', 'SFML-system', sfml_suffixes)
check_lib('sfml-window', 'SFML-window', sfml_suffixes)
@@ -421,6 +427,7 @@ if not env.GetOption('clean'):
if platform == 'posix':
def check_tgui(conf, second_attempt=False):
if conf.CheckLib('libtgui', language='C++'):
bundled_libs.append('tgui')
return conf
else:
if second_attempt:
@@ -502,7 +509,31 @@ Export("data_dir")
SConscript(["rsrc/SConscript", "doc/SConscript"])
# Bundle required frameworks and libraries
def handle_bundled_libs(extension, prefix=''):
target_dirs = ["#build/Blades of Exile", "#build/test"]
for lib in bundled_libs:
for lpath in env['LIBPATH']:
def check_path(src_file):
_dir = os.path.dirname(src_file)
print(f'checking {_dir} for {prefix}{lib}')
try:
print(os.listdir(_dir))
except:
pass
if path.exists(src_file) and src_file != "/usr/lib/x86_64-linux-gnu/libz.so":
for targ in target_dirs:
for so in os.listdir(_dir):
if os.path.basename(src_file) in so:
print(f'found {path.join(_dir, so)}')
env.Install(targ, path.join(_dir, so))
return True
return False
if check_path(path.join(lpath, prefix + lib + extension)):
break
elif check_path(path.join(lpath.replace('lib', 'bin'), prefix + lib + extension)):
break
elif check_path(path.join(lpath, 'x86_64-linux-gnu', prefix + lib + extension)):
break
if platform == "darwin":
app_targets = []
if 'game' in targets:
@@ -544,20 +575,7 @@ elif platform == "win32":
brotlidec
brotlicommon
""")
target_dirs = ["#build/Blades of Exile", "#build/test"]
for lib in bundled_libs:
for lpath in env['LIBPATH']:
src_file = path.join(lpath, lib + ".dll")
if path.exists(src_file):
for targ in target_dirs:
env.Install(targ, src_file)
break
elif 'lib' in lpath:
src_file = path.join(lpath.replace('lib', 'bin'), lib + ".dll")
if path.exists(src_file):
for targ in target_dirs:
env.Install(targ, src_file)
break
handle_bundled_libs(".dll")
# Extra: Microsoft redistributable libraries installer
if 'msvc' in env["TOOLS"]:
if path.exists("deps/VCRedistInstall.exe"):
@@ -565,11 +583,41 @@ elif platform == "win32":
else:
print("WARNING: Cannot find installer for the MSVC redistributable libraries for your version of Visual Studio.")
print("Please download it from Microsoft's website and place it at:")
print(" deps/VCRedistInstall.exe")
print(" deps/VCRedistInstall.exe")
# Create it so its lack doesn't cause makensis to break
# (Because the installer is an optional component.)
os.makedirs("build/Blades of Exile", exist_ok=True)
open("build/Blades of Exile/VCRedistInstall.exe", 'w').close()
elif platform == "posix":
targets = [
"Blades of Exile",
"BoE Character Editor",
"BoE Scenario Editor",
]
def patchelf():
to_patch = targets + [so for so in os.listdir("build/Blades of Exile") if '.so' in so]
for targ in to_patch:
subprocess.call(['patchelf', '--set-rpath', '.', targ], cwd='build/Blades of Exile')
atexit.register(patchelf)
bundled_libs += Split("""
GL
X11
stdc++
Xrandr
Xcursor
udev
openal
vorbisenc
vorbisfile
vorbis
ogg
FLAC
freetype
GLdispatch
GLX
xcb
""")
handle_bundled_libs(".so", "lib")
if env["package"]:
if platform == "darwin":

View File

@@ -76,6 +76,7 @@ Section "Blades of Exile" Section1
File "${RELEASE_DIR}\Blades of Exile Scenarios\stealth.boes"
File "${RELEASE_DIR}\Blades of Exile Scenarios\valleydy.boes"
File "${RELEASE_DIR}\Blades of Exile Scenarios\zakhazi.boes"
File "${RELEASE_DIR}\Blades of Exile Scenarios\tutorial.boes"
!include data.nsi
SetShellVarContext all
CreateShortCut "$DESKTOP\Blades of Exile.lnk" "$INSTDIR\Blades of Exile.exe"
@@ -243,6 +244,7 @@ Section Uninstall
Delete "$INSTDIR\Blades of Exile Scenarios\stealth.boes"
Delete "$INSTDIR\Blades of Exile Scenarios\valleydy.boes"
Delete "$INSTDIR\Blades of Exile Scenarios\zakhazi.boes"
Delete "$INSTDIR\Blades of Exile Scenarios\tutorial.boes"
Delete "$INSTDIR\VCRedistInstall.exe"
Delete "$INSTDIR\libsndfile-1.dll"
Delete "$INSTDIR\sfml-audio-2.dll"

View File

@@ -192,6 +192,7 @@
<Xml Include="..\..\..\rsrc\dialogs\welcome.xml" />
</ItemGroup>
<ItemGroup>
<ClCompile Include="..\..\..\src\dialogxml\dialogs\btnpanel.cpp" />
<ClCompile Include="..\..\..\src\dialogxml\keycodes.cpp" />
<ClCompile Include="..\..\..\src\dialogxml\dialogs\3choice.cpp" />
<ClCompile Include="..\..\..\src\dialogxml\dialogs\choicedlog.cpp" />
@@ -289,6 +290,7 @@
<ItemGroup>
<ClInclude Include="..\..\..\src\alchemy.hpp" />
<ClInclude Include="..\..\..\src\damage.hpp" />
<ClInclude Include="..\..\..\src\dialogxml\dialogs\btnpanel.hpp" />
<ClInclude Include="..\..\..\src\dialogxml\keycodes.hpp" />
<ClInclude Include="..\..\..\src\dialogxml\dialogs\3choice.hpp" />
<ClInclude Include="..\..\..\src\dialogxml\dialogs\choicedlog.hpp" />
@@ -505,6 +507,11 @@
<Exec Command="$(SolutionDir)..\..\pkg\win\build-scen.bat $(SolutionDir)..\..\rsrc\scenarios\valleydy $(SolutionDir)..\..\rsrc\scenarios\valleydy.boes" />
<Exec Command="$(SolutionDir)..\..\pkg\win\build-scen.bat $(SolutionDir)..\..\rsrc\scenarios\stealth $(SolutionDir)..\..\rsrc\scenarios\stealth.boes" />
<Exec Command="$(SolutionDir)..\..\pkg\win\build-scen.bat $(SolutionDir)..\..\rsrc\scenarios\zakhazi $(SolutionDir)..\..\rsrc\scenarios\zakhazi.boes" />
<<<<<<< HEAD
<Exec Command='xcopy $(SolutionDir)..\..\rsrc\scenarios\custom "$(TargetDir)\Blades of Exile Scenarios\custom\" /S /Y' />
=======
<Exec Command="$(SolutionDir)..\..\pkg\win\build-scen.bat $(SolutionDir)..\..\rsrc\scenarios\tutorial $(SolutionDir)..\..\rsrc\scenarios\tutorial.boes" />
>>>>>>> 25c8de44 (Visual studio package tutorial)
</Target>
<!--COPY FILES TO OUTPUT DIRECTORY-->
<Target Name="CopyFiles" AfterTargets="BuildScenarios">
@@ -567,4 +574,4 @@
</PropertyGroup>
<Error Condition="!Exists('..\packages\GitInfo.2.0.10\build\GitInfo.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\GitInfo.2.0.10\build\GitInfo.targets'))" />
</Target>
</Project>
</Project>

View File

@@ -833,6 +833,9 @@
</ClCompile>
<ClCompile Include="..\..\..\deps\fmtlib\src\format.cc" />
<ClCompile Include="..\..\..\deps\fmtlib\src\os.cc" />
<ClCompile Include="..\..\..\src\dialogxml\dialogs\btnpanel.cpp">
<Filter>DialogXML\Dialogs</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\..\..\src\view_dialogs.hpp" />
@@ -1095,8 +1098,11 @@
<ClInclude Include="..\..\..\src\tools\profile.hpp">
<Filter>Tools</Filter>
</ClInclude>
<ClInclude Include="..\..\..\src\dialogxml\dialogs\btnpanel.hpp">
<Filter>DialogXML\Dialogs</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<None Include="packages.config" />
</ItemGroup>
</Project>
</Project>

View File

@@ -14,6 +14,7 @@
"boost-chrono",
"boost-math",
"boost-spirit",
"boost-process"
"boost-process",
"boost-locale"
]
}

View File

@@ -348,6 +348,7 @@
<None Include="..\..\..\rsrc\dialogs\dialog.css" />
</ItemGroup>
<ItemGroup>
<ClCompile Include="..\..\..\src\dialogxml\dialogs\btnpanel.cpp" />
<ClCompile Include="..\..\..\src\dialogxml\keycodes.cpp" />
<ClCompile Include="..\..\..\src\dialogxml\dialogs\3choice.cpp" />
<ClCompile Include="..\..\..\src\dialogxml\dialogs\choicedlog.cpp" />
@@ -392,6 +393,7 @@
<ClCompile Include="..\..\..\src\fileio\xml-parser\tinyxmlerror.cpp" />
<ClCompile Include="..\..\..\src\fileio\xml-parser\tinyxmlparser.cpp" />
<ClCompile Include="..\..\..\src\gfx\gfxsheets.cpp" />
<ClCompile Include="..\..\..\src\gfx\graphics.cpp" />
<ClCompile Include="..\..\..\src\gfx\render_image.cpp" />
<ClCompile Include="..\..\..\src\gfx\render_shapes.cpp" />
<ClCompile Include="..\..\..\src\gfx\render_text.cpp" />
@@ -447,6 +449,8 @@
<ClCompile Include="..\..\..\deps\fmtlib\src\os.cc" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\..\..\src\dialogxml\dialogs\btnpanel.hpp" />
<ClInclude Include="..\..\..\src\gfx\graphics.hpp" />
<ClInclude Include="..\..\..\src\scenario\town_import.tpp" />
<ClInclude Include="..\..\..\src\alchemy.hpp" />
<ClInclude Include="..\..\..\src\damage.hpp" />
@@ -567,6 +571,8 @@
<Exec Command="$(SolutionDir)..\..\pkg\win\build-scen.bat $(SolutionDir)..\..\rsrc\scenarios\valleydy $(SolutionDir)..\..\rsrc\scenarios\valleydy.boes" />
<Exec Command="$(SolutionDir)..\..\pkg\win\build-scen.bat $(SolutionDir)..\..\rsrc\scenarios\stealth $(SolutionDir)..\..\rsrc\scenarios\stealth.boes" />
<Exec Command="$(SolutionDir)..\..\pkg\win\build-scen.bat $(SolutionDir)..\..\rsrc\scenarios\zakhazi $(SolutionDir)..\..\rsrc\scenarios\zakhazi.boes" />
<Exec Command="$(SolutionDir)..\..\pkg\win\build-scen.bat $(SolutionDir)..\..\rsrc\scenarios\tutorial $(SolutionDir)..\..\rsrc\scenarios\tutorial.boes" />
<Exec Command='xcopy $(SolutionDir)..\..\rsrc\scenarios\custom "$(TargetDir)\Blades of Exile Scenarios\custom\" /S /Y' />
</Target>
<!--COPY FILES TO OUTPUT DIRECTORY-->
<Target Name="CopyFiles" AfterTargets="BuildScenarios">
@@ -623,4 +629,4 @@
</Copy>
<Message Text="changed:@(ChangedScenarios)" Importance="high" />
</Target>
</Project>
</Project>

View File

@@ -826,6 +826,12 @@
</ClCompile>
<ClCompile Include="..\..\..\deps\fmtlib\src\format.cc" />
<ClCompile Include="..\..\..\deps\fmtlib\src\os.cc" />
<ClCompile Include="..\..\..\src\dialogxml\dialogs\btnpanel.cpp">
<Filter>DialogXML\Dialogs</Filter>
</ClCompile>
<ClCompile Include="..\..\..\src\gfx\graphics.cpp">
<Filter>Gfx</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\..\..\src\scenario\town_import.tpp">
@@ -1081,5 +1087,11 @@
<ClInclude Include="..\..\..\src\tools\profile.hpp">
<Filter>Tools</Filter>
</ClInclude>
<ClInclude Include="..\..\..\src\dialogxml\dialogs\btnpanel.hpp">
<Filter>DialogXML\Dialogs</Filter>
</ClInclude>
<ClInclude Include="..\..\..\src\gfx\graphics.hpp">
<Filter>Gfx</Filter>
</ClInclude>
</ItemGroup>
</Project>
</Project>

View File

@@ -14,6 +14,7 @@
"boost-chrono",
"boost-math",
"boost-spirit",
"boost-process"
"boost-process",
"boost-locale"
]
}

View File

@@ -66,6 +66,8 @@
413AAF672D38A4A5002E9BF1 /* living.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 914698FB1A7362D900F20F5E /* living.cpp */; };
413FE08F2CECFAFF000D97DC /* winutil.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 413FE08E2CECFAFF000D97DC /* winutil.cpp */; };
415EEEB02D5534A500B47408 /* prefs.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 415EEEAF2D5534A500B47408 /* prefs.cpp */; };
419889802E4541D10080B0FE /* btnpanel.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4198897F2E4541D10080B0FE /* btnpanel.cpp */; };
419889812E4541D10080B0FE /* btnpanel.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 4198897E2E4541D10080B0FE /* btnpanel.hpp */; };
41E550542DEB8C2A00A7DF52 /* scen.undo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 41E550532DEB8C2A00A7DF52 /* scen.undo.cpp */; };
91034D211B225E4A008F01C1 /* scen.appleevents.mm in Sources */ = {isa = PBXBuildFile; fileRef = 91034D201B225E49008F01C1 /* scen.appleevents.mm */; };
911A14031B8FAFC600900FD9 /* town_read.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 91C2A6EC1B8FA91400346948 /* town_read.cpp */; };
@@ -640,6 +642,8 @@
41342CE92DFB872400E66BEB /* quest.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = quest.cpp; sourceTree = "<group>"; };
413FE08E2CECFAFF000D97DC /* winutil.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = winutil.cpp; sourceTree = "<group>"; };
415EEEAF2D5534A500B47408 /* prefs.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = prefs.cpp; sourceTree = "<group>"; };
4198897E2E4541D10080B0FE /* btnpanel.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = btnpanel.hpp; sourceTree = "<group>"; };
4198897F2E4541D10080B0FE /* btnpanel.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = btnpanel.cpp; sourceTree = "<group>"; };
41E550522DEB8C1400A7DF52 /* scen.undo.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = scen.undo.hpp; sourceTree = "<group>"; };
41E550532DEB8C2A00A7DF52 /* scen.undo.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = scen.undo.cpp; sourceTree = "<group>"; };
91034D201B225E49008F01C1 /* scen.appleevents.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = scen.appleevents.mm; sourceTree = "<group>"; };
@@ -1159,6 +1163,8 @@
91E128F41BC2077700C8BE1D /* pictchoice.hpp */,
91E128F51BC2077700C8BE1D /* strchoice.hpp */,
91E128F61BC2077700C8BE1D /* strdlog.hpp */,
4198897E2E4541D10080B0FE /* btnpanel.hpp */,
4198897F2E4541D10080B0FE /* btnpanel.cpp */,
);
path = dialogs;
sourceTree = "<group>";
@@ -1766,6 +1772,7 @@
9149924C25913E3F00B5BE97 /* container.hpp in Headers */,
9149924E25913E3F00B5BE97 /* led.hpp in Headers */,
9170C5102D717F24009B6E7C /* scen.locpicker.hpp in Headers */,
419889812E4541D10080B0FE /* btnpanel.hpp in Headers */,
9143044B2970EDC1003A3967 /* keymods.hpp in Headers */,
9149925025913E3F00B5BE97 /* ledgroup.hpp in Headers */,
915473CE2C800AB000EB1C94 /* enchant.hpp in Headers */,
@@ -2081,6 +2088,7 @@
"$(SRCROOT)/../../rsrc/scenarios/valleydy",
"$(SRCROOT)/../../rsrc/scenarios/stealth",
"$(SRCROOT)/../../rsrc/scenarios/zakhazi",
"$(SRCROOT)/../../rsrc/scenarios/tutorial",
"$(SRCROOT)/../../rsrc/bases/cavebase",
);
name = "Pack Scenarios";
@@ -2090,6 +2098,7 @@
"$(BUILT_PRODUCTS_DIR)/Blades of Exile Scenarios/valleydy.boes",
"$(BUILT_PRODUCTS_DIR)/Blades of Exile Scenarios/stealth.boes",
"$(BUILT_PRODUCTS_DIR)/Blades of Exile Scenarios/zakhazi.boes",
"$(BUILT_PRODUCTS_DIR)/Blades of Exile Scenarios/tutorial.boes",
"$(BUILT_PRODUCTS_DIR)/Blades of Exile Base/cavebase.boes",
);
runOnlyForDeploymentPostprocessing = 0;
@@ -2217,6 +2226,7 @@
91E128F11BC2076B00C8BE1D /* strdlog.cpp in Sources */,
91CE248A1EA12866005BDCE4 /* utility.cpp in Sources */,
91CE248C1EA12A96005BDCE4 /* render_text.cpp in Sources */,
419889802E4541D10080B0FE /* btnpanel.cpp in Sources */,
91CE248E1EA12AA3005BDCE4 /* render_shapes.cpp in Sources */,
91A2480E2969CFD200B8D90F /* res_dialog.cpp in Sources */,
91CE24921EA12ABD005BDCE4 /* gfxsheets.cpp in Sources */,

View File

@@ -1884,6 +1884,7 @@
"$(SRCROOT)/../../rsrc/scenarios/valleydy",
"$(SRCROOT)/../../rsrc/scenarios/stealth",
"$(SRCROOT)/../../rsrc/scenarios/zakhazi",
"$(SRCROOT)/../../rsrc/scenarios/tutorial",
);
name = "Pack Scenarios";
outputPaths = (
@@ -1892,6 +1893,7 @@
"$(BUILT_PRODUCTS_DIR)/Blades of Exile Scenarios/valleydy.boes",
"$(BUILT_PRODUCTS_DIR)/Blades of Exile Scenarios/stealth.boes",
"$(BUILT_PRODUCTS_DIR)/Blades of Exile Scenarios/zakhazi.boes",
"$(BUILT_PRODUCTS_DIR)/Blades of Exile Scenarios/tutorial.boes",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;

View File

@@ -55,8 +55,10 @@ scen_env.BuildScenario('#build/rsrc/scenarios/busywork.boes', 'scenarios/busywor
scen_env.BuildScenario('#build/rsrc/scenarios/valleydy.boes', 'scenarios/valleydy/header.exs')
scen_env.BuildScenario('#build/rsrc/scenarios/stealth.boes', 'scenarios/stealth/header.exs')
scen_env.BuildScenario('#build/rsrc/scenarios/zakhazi.boes', 'scenarios/zakhazi/header.exs')
scen_env.BuildScenario('#build/rsrc/scenarios/tutorial.boes', 'scenarios/tutorial/header.exs')
env.Install(path.join(install_dir, "Blades of Exile Scenarios"), Glob("#build/rsrc/scenarios/*.boes"))
env.Install(path.join(install_dir, "Blades of Exile Scenarios"), "scenarios/custom")
env.Install(path.join(install_dir, "Blades of Exile Base"), Glob("#build/rsrc/bases/*.boes"))
# Validate dialogs

View File

@@ -2,7 +2,7 @@
<!-- NOTE: This file should be updated to use relative positioning the next time it changes. -->
<?xml-stylesheet href="dialog.xsl" type="text/xsl"?>
<dialog defbtn='done' escbtn='done'>
<pict name='pict' type='dlog' size='large' num='0' top='9' left='9'/>
<pict name='pict' type='dlog' size='large' num='0' top='10' left='10'/>
<text name='str1' framed='true' top='8' left='91' width='257' height='90'/>
<button name='done' type='done' top='107' left='287'/>
<button name='record' type='regular' def-key='r' top='107' left='8'>Record</button>

View File

@@ -2,7 +2,7 @@
<!-- NOTE: This file should be updated to use relative positioning the next time it changes. -->
<?xml-stylesheet href="dialog.xsl" type="text/xsl"?>
<dialog defbtn='done' escbtn='done'>
<pict name='pict' type='dlog' size='large' num='0' top='9' left='9'/>
<pict name='pict' type='dlog' size='large' num='0' top='10' left='10'/>
<text name='title' framed='true' top='9' left='91' width='257' height='19'/>
<text name='str1' framed='true' top='39' left='91' width='257' height='87'/>
<button name='done' type='done' top='140' left='287'/>

View File

@@ -2,7 +2,7 @@
<!-- NOTE: This file should be updated to use relative positioning the next time it changes. -->
<?xml-stylesheet href="dialog.xsl" type="text/xsl"?>
<dialog defbtn='done' escbtn='done'>
<pict name='pict' type='dlog' num='8' top='9' left='9'/>
<pict name='pict' type='dlog' num='8' top='10' left='10'/>
<text name='title' framed='true' top='9' left='55' width='257' height='19'/>
<text name='str1' framed='true' top='39' left='55' width='257' height='87'/>
<button name='done' type='done' top='140' left='251'/>

View File

@@ -2,7 +2,7 @@
<!-- NOTE: This file should be updated to use relative positioning the next time it changes. -->
<?xml-stylesheet href="dialog.xsl" type="text/xsl"?>
<dialog defbtn='done' escbtn='done'>
<pict name='pict' type='dlog' num='8' top='9' left='9'/>
<pict name='pict' type='dlog' num='8' top='10' left='10'/>
<text name='str1' framed='true' top='8' left='55' width='257' height='90'/>
<button name='done' type='done' top='107' left='251'/>
<button name='record' type='regular' def-key='r' top='107' left='8'>Record</button>

View File

@@ -2,7 +2,7 @@
<!-- NOTE: This file should be updated to use relative positioning the next time it changes. -->
<?xml-stylesheet href="dialog.xsl" type="text/xsl"?>
<dialog defbtn='done' escbtn='done'>
<pict name='pict' type='dlog' size='large' num='0' top='9' left='9'/>
<pict name='pict' type='dlog' size='large' num='0' top='10' left='10'/>
<text name='str1' framed='true' top='8' left='91' width='257' height='90'/>
<text name='str2' framed='true' top='107' left='91' width='257' height='98'/>
<button name='done' type='done' top='212' left='287'/>

View File

@@ -2,7 +2,7 @@
<!-- NOTE: This file should be updated to use relative positioning the next time it changes. -->
<?xml-stylesheet href="dialog.xsl" type="text/xsl"?>
<dialog defbtn='done' escbtn='done'>
<pict name='pict' type='dlog' size='large' num='0' top='9' left='9'/>
<pict name='pict' type='dlog' size='large' num='0' top='10' left='10'/>
<text name='title' framed='true' top='9' left='91' width='257' height='19'/>
<text name='str1' framed='true' top='39' left='91' width='257' height='87'/>
<text name='str2' framed='true' top='136' left='91' width='257' height='93'/>

View File

@@ -2,7 +2,7 @@
<!-- NOTE: This file should be updated to use relative positioning the next time it changes. -->
<?xml-stylesheet href="dialog.xsl" type="text/xsl"?>
<dialog defbtn='done' escbtn='done'>
<pict name='pict' type='dlog' num='8' top='9' left='9'/>
<pict name='pict' type='dlog' num='8' top='10' left='10'/>
<text name='title' framed='true' top='9' left='55' width='257' height='19'/>
<text name='str1' framed='true' top='39' left='55' width='257' height='87'/>
<text name='str2' framed='true' top='136' left='55' width='257' height='93'/>

View File

@@ -2,7 +2,7 @@
<!-- NOTE: This file should be updated to use relative positioning the next time it changes. -->
<?xml-stylesheet href="dialog.xsl" type="text/xsl"?>
<dialog defbtn='done' escbtn='done'>
<pict name='pict' type='dlog' num='8' top='9' left='9'/>
<pict name='pict' type='dlog' num='8' top='10' left='10'/>
<text name='str1' framed='true' top='8' left='55' width='257' height='90'/>
<text name='str2' framed='true' top='107' left='55' width='257' height='98'/>
<button name='done' type='done' top='212' left='251'/>

View File

@@ -4,16 +4,22 @@
<dialog defbtn='done' escbtn='done'>
<button name='done' type='done' top='341' left='319'/>
<pict type='dlog' num='8' top='9' left='9'/>
<text name='str1' framed='true' top='37' left='53' width='257' height='92'/>
<text name='str2' framed='true' top='136' left='53' width='257' height='92'/>
<text name='str3' framed='true' top='235' left='53' width='257' height='92'/>
<pane name='pane1' framed='true' top='37' left='53' width='257' height='92'>
<text name='str1' framed='true' top='37' left='53' width='257'/>
</pane>
<pane name='pane2' framed='true' top='136' left='53' width='257' height='92'>
<text name='str2' framed='true' top='136' left='53' width='257'/>
</pane>
<pane name='pane3' framed='true' top='235' left='53' width='257' height='92'>
<text name='str3' framed='true' top='235' left='53' width='257'/>
</pane>
<text size='large' top='9' left='53' width='257' height='19'>Encounter Notes:</text>
<button name='left' type='left' def-key='left' top='340' left='48'/>
<button name='right' type='right' def-key='right' top='340' left='111'/>
<!--
TODO: I like the idea of assigning the delete key to this...
-->
<button name='del1' type='regular' top='109' left='319'>Delete</button>
<button name='del2' type='regular' top='208' left='319'>Delete</button>
<button name='del3' type='regular' top='307' left='319'>Delete</button>
<button name='del1' type='regular' top='109' left='329'>Delete</button>
<button name='del2' type='regular' top='208' left='329'>Delete</button>
<button name='del3' type='regular' top='307' left='329'>Delete</button>
</dialog>

View File

@@ -0,0 +1,38 @@
<?xml version='1.0' encoding='UTF-8' standalone='no'?>
<!-- NOTE: This file should be updated to use relative positioning the next time it changes. -->
<?xml-stylesheet href="dialog.xsl" type="text/xsl"?>
<dialog defbtn='done' escbtn='cancel'>
<pict name='mainpic' type='dlog' num='16' top='6' left='6'/>
<text name='prompt' size='large' top='6' left='50' width='248' height='14'>Select a graphic:</text>
<group name='group'>
<led name='led1' state='off' top='29' left='55' width='57' height='36'/>
<led name='led2' state='off' top='74' left='55' width='57' height='36'/>
<led name='led3' state='off' top='119' left='55' width='57' height='36'/>
<led name='led4' state='off' top='164' left='55' width='57' height='36'/>
<led name='led5' state='off' top='209' left='55' width='57' height='36'/>
<led name='led6' state='off' top='254' left='55' width='57' height='36'/>
<led name='led7' state='off' top='29' left='251' width='57' height='36'/>
<led name='led8' state='off' top='74' left='251' width='57' height='36'/>
<led name='led9' state='off' top='119' left='251' width='57' height='36'/>
<led name='led10' state='off' top='164' left='251' width='57' height='36'/>
<led name='led11' state='off' top='209' left='251' width='57' height='36'/>
<led name='led12' state='off' top='254' left='251' width='57' height='36'/>
</group>
<pict name='pic1' type='ter' num='0' top='29' left='76'/>
<pict name='pic2' type='ter' num='1' top='74' left='76'/>
<pict name='pic3' type='ter' num='2' top='119' left='76'/>
<pict name='pic4' type='ter' num='3' top='164' left='76'/>
<pict name='pic5' type='ter' num='4' top='209' left='76'/>
<pict name='pic6' type='ter' num='5' top='254' left='76'/>
<pict name='pic7' type='ter' num='18' top='29' left='272'/>
<pict name='pic8' type='ter' num='19' top='74' left='272'/>
<pict name='pic9' type='ter' num='20' top='119' left='272'/>
<pict name='pic10' type='ter' num='21' top='164' left='272'/>
<pict name='pic11' type='ter' num='22' top='209' left='272'/>
<pict name='pic12' type='ter' num='23' top='254' left='272'/>
<text name='help' top='294' left='6' width='422' height='16'>Click button to left of graphic to select. Use arrows to change pages.</text>
<button name='left' type='left' top='314' left='6' def-key='left'/>
<button name='right' type='right' top='314' left='69' def-key='right'/>
<button name='done' type='done' top='314' left='393'/>
<button name='cancel' type='regular' top='314' left='322'>Cancel</button>
</dialog>

View File

@@ -1,7 +1,7 @@
<?xml version='1.0' encoding='UTF-8' standalone='no'?>
<!-- NOTE: This file should be updated to use relative positioning the next time it changes. -->
<?xml-stylesheet href="dialog.xsl" type="text/xsl"?>
<dialog defbtn='no'>
<dialog defbtn='yes' escbtn='no'>
<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'/>

View File

@@ -27,8 +27,10 @@
<button name='choose-bank1' type='regular' anchor='bank1' relative='pos pos-in' top='-4' left='8'>Choose</button>
<field name='bank2' type='int' top='332' left='359' width='110' height='16'/>
<button name='choose-bank2' type='regular' anchor='bank2' relative='pos pos-in' top='-4' left='8'>Choose</button>
<button name='left' type='left' def-key='left' top='358' left='50'/>
<button name='right' type='right' def-key='right' top='358' left='115'/>
<button name='cancel' type='regular' top='358' left='322'>Cancel</button>
<button name='okay' type='regular' top='358' left='387'>OK</button>
<button name='preview' type='regular' top='358' left='387'>Preview</button>
<button name='left' type='left' def-key='left' top='382' left='50'/>
<button name='right' type='right' def-key='right' top='382' left='115'/>
<button name='cancel' type='regular' top='382' left='322'>Cancel</button>
<button name='okay' type='regular' top='382' left='387'>OK</button>
</dialog>

View File

@@ -5,19 +5,20 @@
<field name='name' top='57' left='195' width='252' height='16'/>
<field name='descr' top='84' left='195' width='252' height='104'/>
<field name='spec' type='int' top='249' left='268' width='87' height='16'/>
<button name='okay' type='regular' top='288' left='397'>OK</button>
<pict type='dlog' num='16' top='8' left='8'/>
<text size='large' top='6' left='50' width='256' height='17'>Edit Special Items</text>
<text top='58' left='50' width='132' height='14'>Name of Special Item:</text>
<text top='85' left='50' width='118' height='27'>Special Item Description:</text>
<text top='243' left='51' width='208' height='28'>Scenario special node to be called when item is used:</text>
<button name='cancel' type='regular' top='288' left='332'>Cancel</button>
<button name='clear' type='large' top='15' left='329'>Clear Special</button>
<button name='edit-spec' type='large' top='246' left='363'>Create/Edit</button>
<led name='start-with' state='off' top='198' left='50'>Party starts scen. with item</led>
<led name='usable' state='off' top='218' left='50'>Special item can be used</led>
<text top='29' left='50' width='136' height='14'>Editing special item:</text>
<text name='num' top='29' left='190' width='39' height='14'/>
<button name='left' type='left' top='288' left='9'/>
<button name='right' type='right' top='288' left='72'/>
<button name='preview' type='regular' top='288' left='397'>Preview</button>
<button name='left' type='left' top='312' left='9'/>
<button name='right' type='right' top='312' left='72'/>
<button name='cancel' type='regular' top='312' left='332'>Cancel</button>
<button name='okay' type='regular' top='312' left='397'>OK</button>
</dialog>

View File

@@ -6,7 +6,7 @@
<text name='title' size='large' top='6' left='50' width='158' height='16'>Edit Special Node</text>
<text top='8' left='222' width='90' height='14'>Node number:</text>
<text name='num' top='8' left='314' width='38' height='14'/>
<text top='147' left='469' width='125' height='124'>
<text name='tip' top='147' left='519' width='125'>
Enter properties for this special encounter node.
For a detailed description of how this window works, see the documentation.
</text>
@@ -18,6 +18,7 @@
<button name='town' type='large' top='49' left='356'>Town Specs</button>
<button name='out' type='large' top='73' left='356'>Out Specs</button>
<button name='rect' type='large' top='49' left='483'>Rect Specs</button>
<button name='all' type='large' top='73' left='483'>All</button>
<text size='large' top='28' left='50' width='158' height='16'>Special Type:</text>
@@ -29,11 +30,13 @@
<text name='sdf1-lbl' framed='true' top='121' left='22' width='220' height='15'/>
<field name='sdf1' type='int' top='120' left='254' width='51' height='16'/>
<button name='sdf1-edit' type='tiny' top='106' left='272'/>
<button name='sdf1-edit2' type='tiny' relative='pos pos-in' rel-anchor='prev' top='0' left='4'>Choose</button>
<led name='sdf1-toggle' top='106' left='272'/>
<text name='sdf2-lbl' framed='true' top='121' left='317' width='176' height='16'/>
<field name='sdf2' type='int' top='120' left='510' width='51' height='16'/>
<button name='sdf2-edit' type='tiny' top='106' left='528'/>
<button name='sdf2-edit2' type='tiny' relative='pos pos-in' rel-anchor='prev' top='0' left='4'>Choose</button>
<led name='sdf2-toggle' top='106' left='528'/>
@@ -41,26 +44,31 @@
<text name='msg1-lbl' framed='true' top='164' left='22' width='238' height='15'/>
<field name='msg1' type='int' top='163' left='270' width='51' height='16'/>
<button name='msg1-edit' type='large' top='161' left='329'>Create/Edit</button>
<button name='msg1-edit2' type='regular' relative='pos pos-in' rel-anchor='prev' top='0' left='4'>Choose</button>
<led name='msg1-toggle' top='167' left='329'/>
<text name='msg2-lbl' framed='true' top='188' left='22' width='238' height='15'/>
<field name='msg2' type='int' top='187' left='270' width='51' height='16'/>
<button name='msg2-edit' type='large' top='185' left='329'>Create/Edit</button>
<button name='msg2-edit2' type='regular' relative='pos pos-in' rel-anchor='prev' top='0' left='4'>Choose</button>
<led name='msg2-toggle' top='191' left='329'/>
<text name='msg3-lbl' framed='true' top='212' left='22' width='238' height='15'/>
<field name='msg3' type='int' top='211' left='270' width='51' height='16'/>
<button name='msg3-edit' type='large' top='209' left='329'>Create/Edit</button>
<button name='msg3-edit2' type='regular' relative='pos pos-in' rel-anchor='prev' top='0' left='4'>Choose</button>
<led name='msg3-toggle' top='215' left='329'/>
<text name='pict-lbl' framed='true' top='236' left='22' width='238' height='15'/>
<field name='pict' type='int' top='235' left='270' width='51' height='16'/>
<button name='pict-edit' type='large' top='233' left='329'>Choose</button>
<button name='pict-edit2' type='regular' relative='pos pos-in' rel-anchor='prev' top='0' left='4'>Choose</button>
<led name='pict-toggle' top='239' left='329'/>
<text name='pictype-lbl' framed='true' top='260' left='22' width='238' height='15'/>
<field name='pictype' type='int' top='259' left='270' width='51' height='16'/>
<button name='pictype-edit' type='large' top='257' left='329'>Choose</button>
<button name='pictype-edit2' type='regular' relative='pos pos-in' rel-anchor='prev' top='0' left='4'>Choose</button>
<led name='pictype-toggle' top='263' left='329'/>
@@ -68,16 +76,19 @@
<text name='x1a-lbl' framed='true' top='302' left='22' width='238' height='15'/>
<field name='x1a' type='int' top='301' left='270' width='51' height='16'/>
<button name='x1a-edit' type='large' top='298' left='330'>Choose</button>
<button name='x1a-edit2' type='regular' relative='pos pos-in' rel-anchor='prev' top='0' left='4'>Choose</button>
<led name='x1a-toggle' top='304' left='330'/>
<text name='x1b-lbl' framed='true' top='326' left='22' width='238' height='15'/>
<field name='x1b' type='int' top='325' left='270' width='51' height='16'/>
<button name='x1b-edit' type='large' top='322' left='330'>Create/Edit</button>
<button name='x1b-edit2' type='regular' relative='pos pos-in' rel-anchor='prev' top='0' left='4'>Choose</button>
<led name='x1b-toggle' top='328' left='330'/>
<text name='x1c-lbl' framed='true' top='350' left='22' width='238' height='15'/>
<field name='x1c' type='int' top='349' left='270' width='51' height='16'/>
<button name='x1c-edit' type='large' top='346' left='330'>Create/Edit</button>
<button name='x1c-edit2' type='regular' relative='pos pos-in' rel-anchor='prev' top='0' left='4'>Choose</button>
<led name='x1c-toggle' top='352' left='330'/>
@@ -85,16 +96,19 @@
<text name='x2a-lbl' framed='true' top='394' left='22' width='238' height='15'/>
<field name='x2a' type='int' top='394' left='270' width='51' height='16'/>
<button name='x2a-edit' type='large' top='391' left='330'>Choose</button>
<button name='x2a-edit2' type='regular' relative='pos pos-in' rel-anchor='prev' top='0' left='4'>Choose</button>
<led name='x2a-toggle' top='397' left='330'/>
<text name='x2b-lbl' framed='true' top='419' left='22' width='238' height='15'/>
<field name='x2b' type='int' top='418' left='270' width='51' height='16'/>
<button name='x2b-edit' type='large' top='416' left='330'>Create/Edit</button>
<button name='x2b-edit2' type='regular' relative='pos pos-in' rel-anchor='prev' top='0' left='4'>Choose</button>
<led name='x2b-toggle' top='422' left='330'/>
<text name='x2c-lbl' framed='true' top='443' left='22' width='238' height='15'/>
<field name='x2c' type='int' top='442' left='270' width='51' height='16'/>
<button name='x2c-edit' type='large' top='440' left='330'>Create/Edit</button>
<button name='x2c-edit2' type='regular' relative='pos pos-in' rel-anchor='prev' top='0' left='4'>Choose</button>
<led name='x2c-toggle' top='446' left='330'/>
@@ -102,6 +116,7 @@
<text name='jump-lbl' framed='true' top='472' left='99' width='182' height='14'/>
<field name='jump' type='int' top='471' left='291' width='52' height='15'/>
<button name='jump-edit' type='large' top='468' left='349'>Create/Edit</button>
<button name='jump-edit2' type='regular' relative='pos pos-in' rel-anchor='prev' top='0' left='4'>Choose</button>
<led name='jump-toggle' top='474' left='349'/>
<button name='preview-dialog' type='regular' top='470' left='522'>Preview</button>
@@ -109,4 +124,31 @@
<button name='okay' type='regular' top='494' left='522'>OK</button>
<button name='cancel' type='regular' top='494' left='456'>Cancel</button>
<button name='back' type='large' top='494' left='10'>Go Back</button>
<text name='cb' relative='pos-in pos' anchor='tip' top='8' left='0'>Called By</text>
<text relative='pos-in pos' anchor='tip' top='8' left='100'>Calls</text>
<!-- There is NO limit to how many things could call a node. Only the designor's sanity.
But let's hope this is enough for most cases. -->
<button name='calledby0' type='tiny' relative='pos-in pos' anchor='cb' top='2' left='0'/>
<button name='calledby1' type='tiny' relative='pos-in pos' rel-anchor='prev' top='4' left='0'/>
<button name='calledby2' type='tiny' relative='pos-in pos' rel-anchor='prev' top='4' left='0'/>
<button name='calledby3' type='tiny' relative='pos-in pos' rel-anchor='prev' top='4' left='0'/>
<button name='calledby4' type='tiny' relative='pos-in pos' rel-anchor='prev' top='4' left='0'/>
<button name='calledby5' type='tiny' relative='pos-in pos' rel-anchor='prev' top='4' left='0'/>
<button name='calledby6' type='tiny' relative='pos-in pos' rel-anchor='prev' top='4' left='0'/>
<button name='calledby7' type='tiny' relative='pos-in pos' rel-anchor='prev' top='4' left='0'/>
<button name='calledby8' type='tiny' relative='pos-in pos' rel-anchor='prev' top='4' left='0'/>
<button name='calledby9' type='tiny' relative='pos-in pos' rel-anchor='prev' top='4' left='0'/>
<button name='calledby10' type='tiny' relative='pos-in pos' rel-anchor='prev' top='4' left='0'/>
<button name='calledby11' type='tiny' relative='pos-in pos' rel-anchor='prev' top='4' left='0'/>
<button name='calledby12' type='tiny' relative='pos-in pos' rel-anchor='prev' top='4' left='0'/>
<button name='calledby13' type='tiny' relative='pos-in pos' rel-anchor='prev' top='4' left='0'/>
<!-- There is a limit to how many nodes a node can call. I think it's 3, for the
if-elseif-else conditionals. -->
<button name='calls0' type='tiny' relative='pos-in pos' anchor='cb' top='2' left='100'/>
<button name='calls1' type='tiny' relative='pos-in pos' rel-anchor='prev' top='4' left='0'/>
<button name='calls2' type='tiny' relative='pos-in pos' rel-anchor='prev' top='4' left='0'/>
<button name='calls3' type='tiny' relative='pos-in pos' rel-anchor='prev' top='4' left='0'/>
<text name='tooltip' framed='true' ellipsis='true' width='260' height='16' relative='neg pos' anchor='calledby13' top='4' left='20'></text>
</dialog>

View File

@@ -1,5 +1,4 @@
<?xml version='1.0' encoding='UTF-8' standalone='no'?>
<!-- NOTE: This file should be updated to use relative positioning the next time it changes. -->
<?xml-stylesheet href="dialog.xsl" type="text/xsl"?>
<dialog defbtn='okay' escbtn='cancel'>
<pict type='dlog' num='16' top='6' left='6'/>
@@ -7,14 +6,42 @@
<text top='36' left='152' width='80' height='16'>Sheet Number:</text>
<text name='num' top='36' left='242' width='40' height='16'/>
<pict name='sheet' framed='true' scaled='true' type='full' num='0' top='54' left='12' width='280' height='360'/>
<!-- Icon grid segments -->
<tilemap name='zrows' anchor='sheet' relative='pos-in pos-in' top='0' left='0' rows='11' cols='10' framed='false'>
<line name='zrow' left='0' top='0' width='28' height='0'/>
<text height='36' left='0' top='0' />
</tilemap>
<tilemap name='zcols' anchor='sheet' relative='pos-in pos-in' top='0' left='0' rows='10' cols='11' framed='false'>
<line name='zcol' left='0' top='0' width='0' height='36'/>
<text width='28' left='0' top='0' />
</tilemap>
<!-- Whole-sheet operations -->
<button name='copy' type='regular' def-key='ctrl c' top='54' left='304'>Copy</button>
<button name='paste' type='regular' def-key='ctrl v' top='80' left='304'>Paste</button>
<button name='open' type='regular' def-key='ctrl o' top='106' left='304'>Import</button>
<button name='save' type='regular' def-key='ctrl s' top='132' left='304'>Export</button>
<button name='del' type='regular' def-key='ctrl x' top='158' left='304'>Delete</button>
<button name='paste' type='regular' def-key='ctrl v' relative='pos-in pos-in' rel-anchor='prev' top='26' left='0'>Paste</button>
<button name='edit' type='regular' relative='pos-in pos-in' rel-anchor='prev' top='26' left='0'>Edit</button>
<button name='reload' type='regular' relative='pos-in pos-in' rel-anchor='prev' top='26' left='0'>Reload</button>
<button name='open' type='regular' def-key='ctrl o' relative='pos-in pos-in' rel-anchor='prev' top='26' left='0'>Import</button>
<button name='save' type='regular' def-key='ctrl s' relative='pos-in pos-in' rel-anchor='prev' top='26' left='0'>Export</button>
<button name='del' type='regular' def-key='ctrl x' relative='pos-in pos-in' rel-anchor='prev' top='26' left='0'>Delete</button>
<!-- Icon operations -->
<text name='icon-head' relative='pos-in pos' rel-anchor='prev' top='5' left='0'>Selected icons:</text>
<text name='icon-min' relative='pos-in pos' rel-anchor='prev' top='2' left='0' width='30' framed='true'>0</text>
<text relative='pos pos-in' rel-anchor='prev' top='0' left='0'>-</text>
<text name='icon-max' relative='pos pos-in' rel-anchor='prev' top='0' left='0' width='30' framed='true'>0</text>
<button name='icon-terr' type='tiny' text-size='9' relative='pos-in pos' anchor='icon-min' top='2' left='0'>Import Terrain</button>
<button name='icon-terr-anim' type='tiny' text-size='9' relative='pos-in pos' rel-anchor='prev' top='2' left='0'>Import Animated Terrain</button>
<button name='strip-terr' type='tiny' text-size='9' relative='pos-in pos' rel-anchor='prev' top='2' left='0'>Strip Terrain Background</button>
<field name='diff-threshold' relative='pos-in pos' rel-anchor='prev' top='2' left='0' width='40' height='12' type='uint'>0</field>
<button name='add-terr' type='tiny' text-size='9' relative='pos-in pos' rel-anchor='prev' top='2' left='0'>Add Terrain Background</button>
<button name='left' type='left' def-key='left' top='426' left='20'/>
<button name='right' type='right' def-key='right' top='426' left='85'/>
<button name='new' type='regular' def-key='ctrl n' top='426' left='162'>New</button>
<button name='cancel' type='regular' top='426' left='239'>Cancel</button>
<button name='okay' type='regular' top='426' left='304'>OK</button>
</dialog>

View File

@@ -2,34 +2,19 @@
<!-- NOTE: This file should be updated to use relative positioning the next time it changes. -->
<?xml-stylesheet href="dialog.xsl" type="text/xsl"?>
<dialog defbtn='okay' escbtn='okay'>
<!--
TODO: This dialog contains out-of-date information
-->
<button name='okay' type='regular' top='284' left='403'>OK</button>
<text top='4' left='50' width='312' height='16'>BLADES OF EXILE - DISTRIBUTING YOUR SCENARIO</text>
<pict type='dlog' num='16' top='6' left='6'/>
<text top='22' left='50' width='413' height='56'>
<text top='22' left='50' width='413'>
When you've completed your scenario, you probably want to give other people the chance to play through it.
It's a big kick letting other people run around in your own fantasy world, get stuck at your puzzles, and kill your creations.
</text>
<text top='79' left='50' width='414' height='54'>
The easiest way to release a scenario is to send it over to Spiderweb Software.
Go to www.spidweb.com.
There's a scenario upload area there.
Alternately, mail it to us on disk (PO Box 85659, Seattle, WA 98145).
<text top='4' left='0' width='414' relative='pos-in pos' rel-anchor='prev'>
The easiest way to release a scenario is to send it to NQNStudios. (nqn AT fastmail DOT com)<br/>
<br/>
Alternately, you can upload it as a game on itch.io, then share the link with the Blades of Exile: Itch Edition
community and/or the Spiderweb Software message board.
</text>
<text top='134' left='50' width='412' height='40'>
Before you send a scenario, however, be sure to read the License Agreement (in the file Blades of Exile License).
It says a lot of big no-no's and describes your (and our) rights for your scenario.
</text>
<text top='175' left='50' width='418' height='54'>
Also look for information on the Blades of Exile Scenario Contest.
Your scenario, if really good, could win you products or a hefty chunk of money.
If you think your scenario is good enough, be sure to send it in!
</text>
<text top='230' left='50' width='418' height='52'>
Finally, if your scenario is really, really good, we might like to sell it as a stand-alone.
If we're interested, you can actually make money from your work!
To take a shot at this, just send us your scenario before releasing it.
</text>
<text top='4' left='50' width='312' height='16'>BLADES OF EXILE - DISTRIBUTING YOUR SCENARIO</text>
<text top='4' left='0' relative='pos-in pos' rel-anchor='prev' colour='link'>https://nqn.itch.io/blades-of-exile/community</text>
<text top='4' left='0' relative='pos-in pos' rel-anchor='prev' colour='link'>https://spiderwebforums.ipbhost.com/forum/12-blades-of-exile/</text>
<button name='okay' type='regular' relative='abs pos' rel-anchor='prev' top='4' left='403'>OK</button>
</dialog>

View File

@@ -2,33 +2,38 @@
<!-- NOTE: This file should be updated to use relative positioning the next time it changes. -->
<?xml-stylesheet href="dialog.xsl" type="text/xsl"?>
<dialog defbtn='okay' escbtn='okay'>
<!--
TODO: This dialog may contain out-of-date information
-->
<button name='okay' type='regular' top='288' left='403'>OK</button>
<pict type='dlog' num='16' top='6' left='6'/>
<text top='22' left='50' width='413' height='52'>
<text top='4' left='50' width='312' height='16'>BLADES OF EXILE - TESTING YOUR SCENARIO</text>
<text top='22' left='50' width='413'>
If you want other people to play your scenario, it is vitally important that you test it.
Otherwise, lots of people might waste lots of hours playing a scenairo that is unwinnable or otherwise doesn't work.
Otherwise, lots of people might waste lots of hours playing a scenario that is unwinnable or otherwise doesn't work.
</text>
<text top='75' left='50' width='414' height='54'>
To run your scenario, copy it into the Blades of Exile Scenarios folder and start it using the Custom Scenario button on the game title screen.
Play from your scenario from start to finish, and, if possible, have friends play it too.
<text top='4' left='0' relative='pos-in pos' rel-anchor='prev' width='414'>
To run your scenario, copy it into the Blades of Exile Scenarios folder and start it using the Start Scenario button on the game title screen.
</text>
<text top='130' left='50' width='412' height='53'>
<text top='4' left='0' relative='pos-in pos' rel-anchor='prev' width='414'>
You can also quickly launch your scenario using one of the Launch options in the Scenario menu of the editor.
In the editor preferences menu, you can set a save file to be used as your debug party.
</text>
<text top='4' left='0' relative='pos-in pos' rel-anchor='prev' width='414'>
When testing your scenario, one useful feature is debug mode.
While playing the game, type 'D'.
This will put you in Debug Mode.
Monsters will no longer move or attack you, and you will be able to play much faster.
Type '?' in debug mode for a list of many other quick actions you can perform to help with testing.
</text>
<text top='184' left='50' width='417' height='54'>
When you make a change in a town, before testing it, be sure to leave the town and type '>'.
<text top='4' left='0' relative='pos-in pos' rel-anchor='prev' width='414'>
When you make a change in a town, before testing it, be sure to leave the town and type '>' in debug mode.
This causes the game to forget everything you've done in that town.
If you don't do this, your corrections may not be remembered properly.
</text>
<text top='239' left='50' width='418' height='41'>
<text top='4' left='0' relative='pos-in pos' rel-anchor='prev' width='414'>
Finally, if you edit your scenario while playing in it, whenever you save a change go back to the game and reload your save file.
Otherwise, the game may not read the scenario data properly and crash.
</text>
<text top='4' left='50' width='312' height='16'>BLADES OF EXILE - TESTING YOUR SCENARIO</text>
<text top='4' left='0' relative='pos-in pos' rel-anchor='prev' width='414'>
Before distributing your scenario, Playtest it from start to finish, and, if possible, have friends play it too!
</text>
<button name='okay' type='regular' relative='abs pos' rel-anchor='prev' top='4' left='403'>OK</button>
</dialog>

View File

@@ -7,6 +7,6 @@
<button name='done' type='done' top='202' left='199'/>
<button name='left' type='left' def-key='left' top='202' left='55'/>
<button name='right' type='right' def-key='right' top='202' left='124'/>
<text name='title' size='large' top='17' left='55' width='179' height='16'/>
<text name='title' size='large' top='17' left='55' width='179' height='40'/>
<text name='str' framed='true' top='55' left='17' width='238' height='129'/>
</dialog>

View File

@@ -3,6 +3,7 @@
<?xml-stylesheet href="dialog.xsl" type="text/xsl"?>
<dialog escbtn='cancel'>
<text size='large' top='9' left='130' width='126' height='17'>Start a Scenario:</text>
<text top='9' left='240' width='190' height='40' name='tooltip'></text>
<stack name='list'>
<page>
<!-- Prefab scenarios -->
@@ -35,15 +36,33 @@
<page default='true' template='scenarios'>
<!-- Custom scenarios -->
<pict type='dlog' num='16' top='10' left='10'/>
<pict name='pic1' type='scen' num='0' top='58' left='62'/>
<text name='desc1' framed='true' top='34' left='104' width='292' height='80'/>
<text outline='double' name='start1' top='32' left='59' width='342' height='84'/>
<pict name='tag1-1' type='item' size='small' num='0' top='95' left='110'/>
<pict name='tag1-2' type='item' size='small' num='0' top='95' left='134'/>
<pict name='tag1-3' type='item' size='small' num='0' top='95' left='158'/>
<pict name='tag1-4' type='item' size='small' num='0' top='95' left='182'/>
<pict name='tag1-5' type='item' size='small' num='0' top='95' left='206'/>
<pict name='pic2' type='scen' num='0' top='145' left='62'/>
<text name='desc2' framed='true' top='121' left='104' width='292' height='80'/>
<text outline='double' name='start2' top='118' left='59' width='342' height='84'/>
<pict name='tag2-1' type='item' size='small' num='0' top='181' left='110'/>
<pict name='tag2-2' type='item' size='small' num='0' top='181' left='134'/>
<pict name='tag2-3' type='item' size='small' num='0' top='181' left='158'/>
<pict name='tag2-4' type='item' size='small' num='0' top='181' left='182'/>
<pict name='tag2-5' type='item' size='small' num='0' top='181' left='206'/>
<pict name='pic3' type='scen' num='0' top='232' left='62'/>
<text name='desc3' framed='true' top='208' left='104' width='292' height='80'/>
<text outline='double' name='start3' top='205' left='59' width='342' height='84'/>
<pict name='tag3-1' type='item' size='small' num='0' top='268' left='110'/>
<pict name='tag3-2' type='item' size='small' num='0' top='268' left='134'/>
<pict name='tag3-3' type='item' size='small' num='0' top='268' left='158'/>
<pict name='tag3-4' type='item' size='small' num='0' top='268' left='182'/>
<pict name='tag3-5' type='item' size='small' num='0' top='268' left='206'/>
</page>
</stack>

View File

@@ -8,12 +8,12 @@
<led name='nosound' relative='pos-in pos' rel-anchor='prev' top='10' left='0'>No UI Sounds</led>
<text name='scale-head' size='large' relative='neg pos' rel-anchor='prev' top='17' left='10' width='260' height='17'>Scale UI:</text>
<group name='scaleui'>
<led name='1' relative='pos-in pos' anchor='scale-head' top='4' left='15'>1</led>
<led name='1_5' relative='pos-in pos' anchor='scale-head' top='4' left='55'>1.5</led>
<led name='2' relative='pos-in pos' anchor='scale-head' top='4' left='95'>2</led>
<led name='3' relative='pos-in pos' anchor='scale-head' top='4' left='135'>3</led>
<led name='4' relative='pos-in pos' anchor='scale-head' top='4' left='175'>4</led>
<led name='other' relative='pos-in pos' anchor='scale-head' top='4' left='215'/>
<led name='1' relative='neg pos' anchor='scale-head' top='4' left='20'>1</led>
<led name='1_5' relative='pos pos-in' rel-anchor='prev' top='0' left='3'>1.5</led>
<led name='2' relative='pos pos-in' rel-anchor='prev' top='0' left='3'>2</led>
<led name='3' relative='pos pos-in' rel-anchor='prev' top='0' left='3'>3</led>
<led name='4' relative='pos pos-in' rel-anchor='prev' top='0' left='3'>4</led>
<led name='other' relative='pos pos-in' rel-anchor='prev' top='0' left='3'/>
</group>
<text name='debug-party-head' size='large' relative='pos pos-in' anchor='nosound' top='0' left='50'>Debug Party:</text>
@@ -21,6 +21,10 @@
<button name='choose-party' relative='pos neg' rel-anchor='prev' type='regular' top='3' left='2'>Choose</button>
<led name='force-default-party' relative='pos-in pos' anchor='debug-party-head' top='2' left='0'>Force default party (ignore above)</led>
<button name='okay' relative='abs pos' anchor='scale-head' type='regular' top='7' left='354'>OK</button>
<text name='image-editor-head' size='large' relative='pos-in pos-in' anchor='force-default-party' top='30' left='0'>Image Editor:</text>
<field name='image-editor' type='text' relative='neg-in neg' rel-anchor='prev' top='2' left='5' width='100' height='15'/>
<button name='choose-image-editor' relative='pos neg' rel-anchor='prev' type='regular' top='3' left='2'>Choose</button>
<button name='okay' relative='abs pos' anchor='scale-head' type='regular' top='37' left='354'>OK</button>
<button name='cancel' relative='neg pos-in' anchor='okay' type='regular' top='0' left='73'>Cancel</button>
</dialog>

View File

@@ -1,9 +1,10 @@
<?xml version='1.0' encoding='UTF-8' standalone='no'?>
<!-- NOTE: This file should be updated to use relative positioning the next time it changes. -->
<!-- NOTE: This dialog is NOT used for the automap. It is used by Display Picture nodes. -->
<?xml-stylesheet href="dialog.xsl" type="text/xsl"?>
<dialog defbtn='okay' escbtn='okay'>
<button name='okay' type='regular' top='276' left='232'>OK</button>
<pict type='dlog' num='21' top='6' left='6'/>
<pict name='icon' type='dlog' num='21' top='6' left='6'/>
<text name='title' size='large' top='6' left='50' width='300' height='17'>Map of Somewhere:</text>
<pict name='map' type='full' num='1400' top='28' left='50'/>
</dialog>

View File

@@ -0,0 +1,9 @@
<?xml version='1.0' encoding='UTF-8' standalone='no'?>
<!-- NOTE: This file should be updated to use relative positioning the next time it changes. -->
<?xml-stylesheet href="dialog.xsl" type="text/xsl"?>
<dialog defbtn='play'>
<pict type='scen' size='large' num='0' top='9' left='9'/>
<text name='prompt' top='5' left='80' width='250' height='32'>You've completed the tutorial! We recommend playing the first official scenario, The Valley of Dying Things, next.</text>
<button name='cancel' type='regular' top='46' left='178'>Cancel</button>
<button name='play' type='regular' def-key='esc' top='46' left='248'>Play</button>
</dialog>

View File

@@ -0,0 +1,17 @@
<?xml version='1.0' encoding='UTF-8' standalone='no'?>
<?xml-stylesheet href="dialog.xsl" type="text/xsl"?>
<dialog defbtn='done' escbtn='cancel'>
<pict name='pic' type='dlog' num='16' top='8' left='8'/>
<text name='title' size='large' top='6' left='50' width='256' height='14'>Select:</text>
<!-- Column 1 -->
<button type='tiny' name='button1' top='54' left='8'/>
<button type='tiny' name='button2' relative='pos-in pos-in' rel-anchor='prev' top='15' left='0'/>
<button type='tiny' name='button3' relative='pos-in pos-in' rel-anchor='prev' top='15' left='0'/>
<button type='tiny' name='button4' relative='pos-in pos-in' rel-anchor='prev' top='15' left='0'/>
<button type='tiny' name='button5' relative='pos-in pos-in' rel-anchor='prev' top='15' left='0'/>
<button type='tiny' name='button6' relative='pos-in pos-in' rel-anchor='prev' top='15' left='0'/>
<button name='left' type='left' def-key='left' relative='pos-in pos-in' anchor='button6' top='19' left='0'/>
<button name='right' type='right' def-key='right' relative='pos-in pos-in' rel-anchor='prev' top='0' left='63'/>
<button name='cancel' type='regular' relative='pos-in pos-in' rel-anchor='prev' top='0' left='101'>Cancel</button>
<button name='done' type='regular' relative='pos-in pos-in' rel-anchor='prev' top='0' left='66'>OK</button>
</dialog>

View File

@@ -9,10 +9,17 @@
Spiderweb Software, created in 1997 and later released as
Free Open-Source Software.
</text>
<text name='spidweb' relative='pos-in pos' rel-anchor='prev' top='3' left='16' colour='link' underline='true'>
http://www.spidweb.com/blades/opensource.html
<text relative='pos-in pos' rel-anchor='prev' top='2' left='0' width='413'>
You're playing an Itch Edition release of OpenBoE. The Itch Edition
was funded by many generous supporters through IndieGoGo, and is
currently funded by donations on Patreon. Click below to follow the project
and see the rewards for becoming a supporter!
</text>
<text relative='neg pos' rel-anchor='prev' top='3' left='16' width='413'>
<text name='patreon' relative='pos-in pos' rel-anchor='prev' top='0' left='16' width='230' colour='link' underline='true'>
http://patreon.com/blades_itch_edition
</text>
<pict type='item' num='17' relative='pos neg' rel-anchor='prev' top='15' left='2'/>
<text relative='neg pos' anchor='patreon' top='3' left='16' width='413'>
Three exciting original scenarios await you, filled
with many hours of puzzles, fighting and adventure!
In addition to these, hundreds more written by

View File

@@ -880,6 +880,7 @@
</object>
<object class="NSMenuItem" id="441636068">
<reference key="NSMenu" ref="374024848"/>
<bool key="NSIsDisabled">YES</bool>
<string key="NSTitle">Scenario Design Contest!</string>
<string key="NSKeyEquiv"/>
<int key="NSMnemonicLoc">2147483647</int>

1
rsrc/scenarios/custom Submodule

Submodule rsrc/scenarios/custom added at 01e0ea01e9

View File

@@ -30,6 +30,9 @@
<intro-msg>
<![CDATA[After months of scraping out a living, you start to get excited. At last, you can go out, have adventures, and fight evil!]]>
</intro-msg>
<first-time-help-extra>
<![CDATA[For now, you should find Vonnegut and get your orders. Press the mouth button (or type 't') to talk to nearby people or creatures.]]>
</first-time-help-extra>
</text>
<ratings>
<content>PG</content>

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.9 KiB

Binary file not shown.

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,48 @@
2,2,2,4,2,2,2,2,3,2,2,2,2,2,2,2,3,3,2,2,3,2,2,2,2,2,2,2,2,2,2,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,2
2,2,2,2,4,2,2,2,2,4,2,2,2,2,2,4,3,2,2,2,2,3,2,2,2,2,2,2,2,4,2,4,4,2,2,2,2,2,3,2,2,2,3,2,2,2,2,2
3,2,3,2,2,2,3,2,2,2,4,2,2,2,3,2,2,2,2,2,3,2,2,2,2,2,2,2,3,2,2,2,2,2,3,2,4,2,2,2,2,2,2,2,2,2,4,2
2,3,2,2,2,3,2,2,2,2,2,2,2,4,4,2,2,3,2,2,2,2,4,3,2,2,2,2,2,3,2,2,2,3,2,2,2,2,2,2,2,2,2,2,2,2,2,3
2,2,2,2,4,2,2,2,2,2,2,2,2,2,2,2,3,2,2,2,2,2,2,2,2,2,2,2,2,2,3,2,2,2,2,2,2,3,2,3,2,2,2,2,4,3,2,2
2,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,2,2,2,2,2,2,2,3,3,2,2,2,3,2,2,2,2,2,4,2,3,2,2,2,2,2,2,2,2,2,3
4,2,2,3,2,2,3,3,4,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,2,2,2,3,3,2,2,4,4,2,4,2,2,4
2,2,2,4,2,4,2,2,3,2,3,4,3,2,2,2,2,2,2,2,2,2,3,2,2,2,2,3,2,2,2,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,2
2,2,2,2,2,2,2,4,4*0,2,2,2,2,2,2,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2*1,2,4,3,2,2,2,2,2,2,2,2,2,2,4,2
3,2,2,2,2,2,2,2,2,2,2,2,2,2,3,2,2,4,2,4,2,2,2,4,2,4,2,2,2,2,4,3,2,2,2,2,4,2,4,4,2,3,2,2,2,2,4,2
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,2,2,2,2,2,3,4,4,2,2,2,2,2,2,2,2,3,2,2,2,2,4,2,2,3,2,2,2,3,2
3,2,2,2,2,2,4,3,2,2,4,2,2,4,2,2,2,2,4,3,2,2,2,2,2,3,2,4,2,2,2,2,3,2,3,2,2,2,2,2,2,2,2,2,2,2,2,3
2,3,2,2,2,2,2,2,2,2,3,4,2,3,2,2,2,2,2,2,2,2,3,2,2,2,2,2,2,2,2,2,2,2,3,2,4,2,2,2,2,2,2,2,2,2,2,3
2,2,2,3,2,3,4,2,2,4,2,2,2,2,4,2,2,2,2,3,2,2,2,2,4,4,2,2,2,2,2,4,2,2,2,4,2,2,3,2,2,4,2,2,2,2,2,2
2,2,2,2,3,3,2,3,2,3,2,2,2,3,2,2,2,2,2,2,2,2,2,2,2,2,2,3,2,3,4,2,2,2,2,2,3,3,2,2,2,2,2,2,2,3,2,2
2,2,3,2,2,3,2,3,2,2,2,2,3,2,2,2,2,4,2,2,4,3,2,2,2,2,2,3,2,3,4,2,3,3,2,4,2,3,2,3,3,2,2,2,2,4,2,2
2,2,2,2,2,2,2,3,2,3,2,4,4,2,4,3,2,2,2,2,2,2,2,2,2,2,3,3,2,4,2,2,2,2,2,2,2,2,2,3,3,2,2,3,2,2,2,2
2,2,4,2,2,2,2,2,2,2,2,2,2,2,2,3,2,4,2,2,2,2,2,2,2,3,2,2,2,4,3,2,3,2,2,3,2,3,2,2,2,2,2,3,2,2,2,3
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,2,2,3,4,2,4,2,3,2,2,2,2,3,3,2,2,2,2,2,2
2,2,2,2,2,2,3,2,3,2,2,3,2,2,2,2,2,2,2,2,2,2,4,3,3,2,2,2,2,2,2,2,2,2,3,2,2,2,2,2,2,2,2,2,2,2,2,2
3,2,2,2,3,2,2,2,2,2,2,4,3,2,2,3,4,3,2,2,3,2,3,2,2,2,2,2,2,2,2,4,2,2,3,2,2,4,2,2,2,4,2,2,2,2,2,4
2,2,2,2,2,2,2,2,2,2,2,4,2,2,2,2,3,2,2,4,2,3,3,2,3,2,2,2,2,4,2,2,2,2,2,2,2,2,2,2,4,3,2,2,2,2,2,2
2,4,2,3,2,2,2,2,2,2,2,2,3,2,2,3,4,4,4,2,2,3,112,112,112,112,112,3,3,2,2,3,2,2,2,2,2,2,2,2,3,4,2,2,2,2,2,2
2,4,2,2,2,2,3,2,4,3,2,2,2,2,2,2,2,2,2,4,2,2,112,3,2,3,112,3,2,2,2,2,3,3,2,2,2,2,3,3,2,2,4,2,2,3,2,4
2,2,4,2,2,2,4,2,4,2,3,4,3,2,2,2,3,2,2,3,2,2,112,2,242@1,2,112,2,3,3,2,2,2,3,2,2,2,2,2,2,4,2,2,3,3,3,2,2
3,2,2,3,2,4,2,2,2,3,2,4,4,2,4,2,2,2,3,2,4,3,112,4,2&9:0,3,112,2,2,2,2,4,4,3,2,2,2,2,3,2,2,2,2,2,2,2,2,2
2,2,2,2,2,4,2,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,2,2,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,2,2,3,2,2,2,2
2,2,2,2,2,2,2,112,111,111,111,111,111,111,111,111,111,111,2,3,2,112,112,2&9:1,121!0,112,112,112,2,3,56,55,55,55,55,55,55,55,55,54,112,2,3,2,2,2,2,2
2,2,2,2,4,2,2,112,111,2,111,111,111,2,3,111,111,111,2,3,2,112,112,2,2,112,112,112,3,2,57,50,62,51,51,59,50,50,50,53,112,2,2,2,2,4,2,2
4,3,2,4,2,2,2,112,3,2,2,2,111,2,111,3,2,4,3&25,3&9&25:2,2&25,2&25,3&25,2&25,2&25,2&25,2&25,2&25,3&25,2&9&25:4,57,50,53,2,242@3,57,50,50,50,53,112,2,2,2,2,2,2,2
2,3,2,2,2,2,3,112,3,4,2,111,2,3,111,111,111,111,2,2,2,2,2,2,2&25,2,2,2,3,4,57,50,53,2,2,57,50,50,50,53,112,2,2,3,2,2,2,2
2,3,2,2,2,2,2,112,2,2,112,112,112,112,112,112,112,112,112,112,112,112,112,2,2&25,2,112,112,112,112,57,50,61,55,55,60,50,50,50,53,112,3,2,2,2,2,2,2
2,2,2,2,2,2,2,112,2*2,112,112,2,3,2,2,2,2,4,2,3,2,2,112,2,2&9&25:3,3,112,56,55,55,60,50,50*3,50,50,50,50,50,50,53,112,2,2,2,2,2,3,3
3,2,3,2,2,2,2,112,111,112,2,2,2,2,2,2,2,2,2,2,2,2,112,112,112,112,112,57,50,50,50,50,50,50,50,50,50,50,50,53,112,2,2,2,2,2,4,2
2,2,3,2,2,3,2,112,111,112,2,2,3,2,2,3,2,3,2,2,2,2,112,3,3&25,2,112,57,50,50,50,50,50,62,51,51,51,51,51,52,112,3,2,2,3,3,3,2
2,4,2,4,2,3,2,112,111,112,2,4,3,3,2,2,3,2,2,2,2,2,112,2,3&25,4,112,57,50,50,50,50,50,53,112,112,112,112,112,112,112,2,3,4,3,2,2,2
2,2,2,2,2,3,2,112,242@0,112,2,3,2,2,2,2,2,2,2,2,3,2,112,2,2&25,2,112,57,50,50,50,50,50,53,112,2,2,2,2,2,3,2,4,2,2,2,2,3
3,3,2,2,4,2,2,112,256,112,112,112,112,112,112,112,112,112,112,112,112,112,112,2,2&25,2,112,57,50,50,50,50,50,53,112,2,2,2,2,2,2,4,2,2,2,2,2,2
2,3,2,4,2,2,2,112,2:7,2:7,2,2,111,2,2,2,2,2,2,4,2,2,2:6,3,2&25,2,112,57,50,50,50,50,50,53,112,2,2,2,2,2,2,2,4,2,2,3,2,2
2,2,2,2,2,2,2,112,2,2,111,2,2,111,111,2,2,4,2,2,2,2,2:6,3,2&25,2,112,57,50,50,50,50,50,53,112,2,2,2,3,2,2,4,2,2,2,2,2,2
2,2,4,2,2,2,4,112,4,111,2,111,3,111,2,2,2,2,2,2,2,2,2:6,2,2&25,2,112,57,50,50,50,50,50,53,112,2,2,2,4,2,2,2,3,2,2,2,2,2
2,2,2,3,2,2,2,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,2,2&25,2,112,57,50,50,50,50,50,53,112,2,3,3,2,2,4,2,2,2,3,2,2,2
2,2,2,2,2,2,3,2,3,2,2,2,2,2,3,2,2,2,3,3,2,2,112,4,2&25,56,55,60,50,50,50,50,50,53,112,2,2,2,3,2,2,2,3,2,2,2,2,2
2,2,2,2,3,2,2,2,2,2,2,2,2,2,2,2,2,2,3,2,2,3,112,3,242@2,57,50,50,50,50,50,50,50,53,112,3,2,4,2,2,2,2,2,2,2,3,2,3
2,2,4,2,3,2,2,4,2,4,2,2,2,2,2,2,2,3,2,4,2,2,112,112,112,58,51,51,51,51,51,51,51,52,112,2,2,2,2,2,2,3,2,3,2,2,2,2
2,2,2,2,3,2,2,4,2,4,2,2,2,2,2,2,2,3,4,2,2,2,2,2,112,112,112,112,112,112,112,112,112,112,112,2,2,2,2,4,2,2,2,2,2,2,2,2
2,2,2,3,2,3,3,2,2,3,3,2,2,2,2,2,2,2,2,2,2,2,2,2,4,2,2,2,2,2,4,4,2,2,2,2,2,2,4,2,2,2,2,2,2,2,2,2
2,2,3,2,2,2,2,2,4,2,3,4,2,2,2,2,2,2,2,2,3,2,2,2,2,3,2,3,2,2,2,2,2,2,2,2,3,2,2,3,2,2,2,3,2,3,2,2

View File

@@ -0,0 +1,56 @@
@once-dlog = 0
sdf -1, -1
msg 0, -1, 1
pic 21, 4
ex1 -1, -1, -1
ex2 -1, -1, -1
goto -1
@disp-msg = 1
sdf -1, -1
msg 6, 7, -1
pic 0, 4
ex1 -1, -1, -1
ex2 -1, -1, -1
goto -1
@once-dlog = 2
sdf -1, -1
msg 8, -1, 1
pic 29, 4
ex1 -1, -1, -1
ex2 -1, -1, -1
goto -1
@disp-msg = 3
sdf -1, -1
msg 14, -1, -1
pic 0, 4
ex1 -1, -1, -1
ex2 -1, -1, -1
goto -1
@if-sdf = 4
sdf 200, 0
msg -1, -1, -1
pic 0, 4
ex1 1, -1, -1
ex2 -1, -1, -1
goto 5
@disp-msg = 5
sdf -1, -1
msg 15, -1, -1
pic 0, 4
ex1 -1, -1, -1
ex2 -1, -1, -1
goto -1
@once-disp-msg = 6
sdf 200, 1
msg 16, -1, -1
pic 0, 4
ex1 -1, -1, -1
ex2 -1, -1, -1
goto -1
@once-dlog = 7
sdf 200, 2
msg 17, -1, 1
pic 0, 4
ex1 -1, -1, -1
ex2 -1, -1, -1
goto -1

View File

@@ -0,0 +1,49 @@
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<sector boes="2.0.0">
<name>Part 2: Exploration</name>
<comment>Comment</comment>
<sign id="0">
<![CDATA[West - Marshy Tower|East - Lake Tower|South - Vault Tower]]>
</sign>
<area top="25" left="6" bottom="36" right="21">Path to Marshy Tower</area>
<area top="37" left="7" bottom="41" right="22">Backwoods</area>
<area top="31" left="23" bottom="43" right="25">Road to Vault Tower</area>
<area top="27" left="26" bottom="30" right="29">Road to Lake Tower</area>
<string id="0">
<![CDATA[You're now exploring the great outdoors! When outdoors, each tile on the map represents a larger space, so each move you make takes more in-game time.]]>
</string>
<string id="1">
<![CDATA[In the outdoors, you'll find entrances to towns or dungeons like the tower from which you're emerging now.]]>
</string>
<string id="2">
<![CDATA[Clearing many BoE scenarios usually requires a thorough exploration of the outdoors and every town or dungeon you can find. First of all, you should open your minimap to help keep track of where you've been! Type 'a' to do so.]]>
</string>
<string id="6">
<![CDATA[To read a sign, use the Look command. You can do this by typing 'l' or clicking the button of the eye. You have to be standing next to things like signs or books to investigate them closely.]]>
</string>
<string id="7">
<![CDATA[You can also look by right-clicking.]]>
</string>
<string id="8">
<![CDATA[The terrain is getting wilder as you make your way westward. You should move diagonally to avoid dangerous terrain where possible, but this might not always be possible.]]>
</string>
<string id="14">
<![CDATA[It seems like this road leads to one of the towers you need to visit, but the woods have overgrown the path. There must be another way around.]]>
</string>
<string id="15">
<![CDATA[You can see a tower across the water, but there's no ferry or bridge to take you across. Frustrating.]]>
</string>
<string id="16">
<![CDATA[You have found your way back onto the overgrown road to Vault Tower!]]>
</string>
<string id="17">
<![CDATA[In the outdoors, if you're not poisoned and you have enough food, you can rest to recover your health and spell points.]]>
</string>
<string id="18">
<![CDATA[Type 'r', or click the button of a tent, to do this.]]>
</string>
<string id="19">
<![CDATA[If you're ever low on food, Michael has a priest spell (Manna) which will summon some!]]>
</string>
<string id="22" />
</sector>

View File

@@ -0,0 +1,42 @@
@select-pc = 0
sdf -1, -1
msg 0, 1, -1
pic 0, 4
ex1 0, -1, 7
ex2 1, -1, -1
goto 2
@change-ter = 1
sdf -1, -1
msg -1, -1, -1
pic 0, 4
ex1 -10, -11, -1
ex2 259, -1, -1
goto -1
@status = 2
sdf -1, -1
msg 0, 1, -1
pic 0, 4
ex1 3, 1, 7
ex2 258, -1, -1
goto 1
@once-dlog = 3
sdf 3, 3
msg 2, -1, 1
pic 74, 3
ex1 -1, -1, -1
ex2 -1, -1, -1
goto -1
@once-dlog = 4
sdf 3, 2
msg 8, -1, 1
pic 55, 3
ex1 -1, -1, -1
ex2 -1, -1, -1
goto -1
@once-dlog = 5
sdf 3, 4
msg 14, -1, 1
pic 58, 3
ex1 -1, -1, -1
ex2 -1, -1, -1
goto -1

View File

@@ -0,0 +1,164 @@
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<scenario boes="2.0.0">
<title>Tutorial</title>
<icon>13</icon>
<id></id>
<version>1.0.0</version>
<language>en-US</language>
<author>
<name>OpenBoE</name>
<email></email>
</author>
<feature-flags>
<door-town-difficulty>fixed</door-town-difficulty>
<resurrection-balm>required</resurrection-balm>
<scenario-meta-format>V2</scenario-meta-format>
</feature-flags>
<text>
<teaser>An exciting adventure!</teaser>
<teaser></teaser>
<icon>0</icon>
<first-time-help-extra>
<![CDATA[To move through the tutorial, click in any direction (starting with east, out of this hallway).]]>
</first-time-help-extra>
</text>
<ratings>
<content>G</content>
<difficulty>1</difficulty>
</ratings>
<flags>
<adjust-difficulty>true</adjust-difficulty>
<legacy>false</legacy>
<custom-graphics>false</custom-graphics>
</flags>
<creator>
<type>oboe</type>
<version>2.0.0</version>
</creator>
<game>
<num-towns>4</num-towns>
<out-width>1</out-width>
<out-height>1</out-height>
<start-town>1</start-town>
<town-start x="5" y="7" />
<outdoor-start x="0" y="0" />
<sector-start x="24" y="24" />
<special-item start-with="false" useable="false" special="-1">
<name>Marshy Artifact Piece</name>
<description>
<![CDATA[One of the three pieces you need to use the exit portal!]]>
</description>
</special-item>
<special-item start-with="false" useable="false" special="-1">
<name>Vault Artifact Piece</name>
<description>
<![CDATA[The second piece!]]>
</description>
</special-item>
<special-item start-with="false" useable="false" special="-1">
<name>Lake Artifact Piece</name>
<description>
<![CDATA[The last piece!]]>
</description>
</special-item>
<shop>
<name>Healing</name>
<type>dead</type>
<prompt>heal</prompt>
<face>41</face>
<entries>
<heal>0</heal>
<heal>1</heal>
<heal>2</heal>
<heal>4</heal>
<heal>9</heal>
<heal>5</heal>
<heal>6</heal>
<heal>7</heal>
<heal>8</heal>
</entries>
</shop>
<shop>
<name>Shady Guard&apos;s Wares</name>
<type>live</type>
<prompt>shop</prompt>
<face>10</face>
<entries>
<item quantity="2">171</item>
</entries>
</shop>
<string id="0">
<![CDATA[You carefully remove the ornaments from this altar.]]>
</string>
<string id="1">
<![CDATA[Lo and behold, the gods are petty!]]>
</string>
<string id="2">
<![CDATA[Ah, an imp! These tricky little things (and all other infernal creatures, like demons) are immune to fire damage, so your Flame and Fireball spells won't do any good.]]>
</string>
<string id="3">
<![CDATA[Different monsters have different resistances and vulnerabilities. You can learn them through trial and error, or you can use a mage spell, Scry Monsters, to learn them directly. When you scry a monster, you keep its information to read whenever you want in the 'Monsters' menu.]]>
</string>
<string id="8">
<![CDATA[Aargh! A zombie!]]>
</string>
<string id="9">
<![CDATA[Zombies and other undead creatures are immune to cold damage. Your priest spell casters, Feodoric and Michael, have a spell (Turn Undead) which is quite good at returning these things to the afterlife.]]>
</string>
<string id="14">
<![CDATA[Ghasts are bad news. These undead creatures will attack you many times in the same turn, and stun you so you can't defend yourself.]]>
</string>
<string id="15">
<![CDATA[With extra-fatal enemies like these, it's smart to wipe them out before you deal with lower-priority targets. You can also use the mage spell 'Slow' to prevent them from acting on their turn. Don't forget about that one!]]>
</string>
<string id="19" />
</game>
<editor>
<default-ground>2</default-ground>
<graphics>
<pic index="0">terrain</pic>
<pic index="1">terrain</pic>
<pic index="2">terrain</pic>
</graphics>
<item-class id="1">lockpicks</item-class>
<sdf row="0" col="0">entrance message</sdf>
<sdf row="0" col="1">supplies message</sdf>
<sdf row="0" col="2">dining hall message</sdf>
<sdf row="0" col="3">pantry message</sdf>
<sdf row="0" col="4"># spiders killed</sdf>
<sdf row="0" col="5">party cleaned webs</sdf>
<sdf row="0" col="6">spider combat done</sdf>
<sdf row="0" col="7">gave piece</sdf>
<sdf row="0" col="8">archery message</sdf>
<sdf row="0" col="9">mage spells message</sdf>
<sdf row="0" col="10">priest spells combat message</sdf>
<sdf row="0" col="11">spell help message</sdf>
<sdf row="0" col="12">looked through portcullis</sdf>
<sdf row="1" col="0">looked at book</sdf>
<sdf row="1" col="1">book node</sdf>
<sdf row="1" col="2">entry message</sdf>
<sdf row="1" col="3">exit message</sdf>
<sdf row="1" col="4">artifact pieces</sdf>
<sdf row="2" col="0">piece given</sdf>
<sdf row="2" col="1">guard patrol direction</sdf>
<sdf row="2" col="2">guard patrol dy</sdf>
<sdf row="2" col="3">guard patrol start</sdf>
<sdf row="2" col="4">close the door!</sdf>
<sdf row="2" col="5">stopped by window guard</sdf>
<sdf row="2" col="6">know to ask about patrol</sdf>
<sdf row="2" col="7">past tired guard</sdf>
<sdf row="2" col="8">guard paid off</sdf>
<sdf row="2" col="9">seen boat</sdf>
<sdf row="3" col="0">piece given</sdf>
<sdf row="3" col="1">death message</sdf>
<sdf row="3" col="2">learned about zombies</sdf>
<sdf row="3" col="3">learned about imp</sdf>
<sdf row="3" col="4">learned about ghast</sdf>
<sdf row="3" col="5">party loop index</sdf>
<sdf row="3" col="6">saw skill trainer</sdf>
<sdf row="3" col="7">death gone</sdf>
<sdf row="200" col="0">found boat</sdf>
<sdf row="200" col="1">exit backwoods message</sdf>
<sdf row="200" col="2">resting message</sdf>
</editor>
</scenario>

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,63 @@
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<dialogue boes="2.0.0">
<personality id="0">
<title>Unused</title>
<look></look>
<name></name>
<job></job>
</personality>
<personality id="1">
<title>Unused</title>
<look></look>
<name></name>
<job></job>
</personality>
<personality id="2">
<title>Unused</title>
<look></look>
<name></name>
<job></job>
</personality>
<personality id="3">
<title>Unused</title>
<look></look>
<name></name>
<job></job>
</personality>
<personality id="4">
<title>Unused</title>
<look></look>
<name></name>
<job></job>
</personality>
<personality id="5">
<title>Unused</title>
<look></look>
<name></name>
<job></job>
</personality>
<personality id="6">
<title>Unused</title>
<look></look>
<name></name>
<job></job>
</personality>
<personality id="7">
<title>Unused</title>
<look></look>
<name></name>
<job></job>
</personality>
<personality id="8">
<title>Unused</title>
<look></look>
<name></name>
<job></job>
</personality>
<personality id="9">
<title>Unused</title>
<look></look>
<name></name>
<job></job>
</personality>
</dialogue>

View File

@@ -0,0 +1,63 @@
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<dialogue boes="2.0.0">
<personality id="10">
<title>Unused</title>
<look></look>
<name></name>
<job></job>
</personality>
<personality id="11">
<title>Unused</title>
<look></look>
<name></name>
<job></job>
</personality>
<personality id="12">
<title>Unused</title>
<look></look>
<name></name>
<job></job>
</personality>
<personality id="13">
<title>Unused</title>
<look></look>
<name></name>
<job></job>
</personality>
<personality id="14">
<title>Unused</title>
<look></look>
<name></name>
<job></job>
</personality>
<personality id="15">
<title>Unused</title>
<look></look>
<name></name>
<job></job>
</personality>
<personality id="16">
<title>Unused</title>
<look></look>
<name></name>
<job></job>
</personality>
<personality id="17">
<title>Unused</title>
<look></look>
<name></name>
<job></job>
</personality>
<personality id="18">
<title>Unused</title>
<look></look>
<name></name>
<job></job>
</personality>
<personality id="19">
<title>Unused</title>
<look></look>
<name></name>
<job></job>
</personality>
</dialogue>

View File

@@ -0,0 +1,165 @@
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<dialogue boes="2.0.0">
<personality id="20">
<title>Shady Guard</title>
<look>
<![CDATA[This guard looks more than a little disgruntled. If you can keep her ire directed at her boss, that might be a great advantage.]]>
</look>
<name>
<![CDATA["Who even cares? If you must, call me G."]]>
</name>
<job>
<![CDATA["Guarding this vault. But one good heist could pay me off better than the wages, that's for sure."]]>
</job>
<unknown>
<![CDATA["Just leave the planning to me, okay?"]]>
</unknown>
</personality>
<personality id="21">
<title>Tired Guard</title>
<look>
<![CDATA[This guard looks tired of doing his job, but also too tired to defy his boss.]]>
</look>
<name>
<![CDATA["Like I'm telling you that, intruder!"]]>
</name>
<job>
<![CDATA["I guard the place."]]>
</job>
<unknown>
<![CDATA["Stop trying to confuse me."]]>
</unknown>
</personality>
<personality id="22">
<title>G</title>
<look>
<![CDATA[It's your old pal G, the conniving guard. "Looks like we're stuck at a dead end, hm?"]]>
</look>
<name>
<![CDATA["It's just G."]]>
</name>
<job>
<![CDATA["My job now is to get the two of us out of here with the treasure! But I'm afraid we're stuck."]]>
</job>
<unknown>
<![CDATA["I'll take that gold, now."]]>
</unknown>
</personality>
<personality id="23">
<title>Unused</title>
<look></look>
<name></name>
<job></job>
</personality>
<personality id="24">
<title>Unused</title>
<look></look>
<name></name>
<job></job>
</personality>
<personality id="25">
<title>Unused</title>
<look></look>
<name></name>
<job></job>
</personality>
<personality id="26">
<title>Unused</title>
<look></look>
<name></name>
<job></job>
</personality>
<personality id="27">
<title>Unused</title>
<look></look>
<name></name>
<job></job>
</personality>
<personality id="28">
<title>Unused</title>
<look></look>
<name></name>
<job></job>
</personality>
<personality id="29">
<title>Unused</title>
<look></look>
<name></name>
<job></job>
</personality>
<node for="20">
<keyword>heis</keyword>
<keyword>vaul</keyword>
<type>if-sdf</type>
<param>2</param>
<param>5</param>
<param>0</param>
<text>
<![CDATA["So you want in, huh?" She smirks. "Well the next door will require more sophistication than the one you busted down like an impatient troll. I have the tools you need, but they'll cost you."]]>
</text>
<text>
<![CDATA["So, the guard in the hallway is giving you trouble, huh? I have an idea for that."]]>
</text>
</node>
<node for="20">
<keyword>tool</keyword>
<keyword>purc</keyword>
<type>shop</type>
<param>3</param>
<param>1</param>
<text>
<![CDATA[Shady Guard's Wares]]>
</text>
<text>
<![CDATA["Sorry, bud. That's all I've got."]]>
</text>
</node>
<node for="20">
<keyword>idea</keyword>
<type>set-sdf</type>
<param>2</param>
<param>6</param>
<text>
<![CDATA["He's supposed to patrol between two lookout points. He gets lazy sometimes, but if you ask him about patrol duty, he has to do it! That's when you slip past."]]>
</text>
</node>
<node for="21">
<keyword>patr</keyword>
<keyword>duty</keyword>
<type>set-sdf</type>
<param>2</param>
<param>3</param>
<text>
<![CDATA["Blast! You're right. I've been slacking off. Now move along so I can do my job."]]>
</text>
<text>
<![CDATA[Every once in a while, this guard will now switch locations. You can wait for a turn by clicking your main character, or typing '5' on the number pad.]]>
</text>
</node>
<node for="22">
<keyword>stuc</keyword>
<keyword>dead</keyword>
<type>reg</type>
<text>
<![CDATA["Well, I'll be honest. I know the way out, but you're not going anywhere without giving me the gold you found in the vault."]]>
</text>
<text>
<![CDATA[Technically, there is another option. You could start combat mode with 'f' and move to attack. Attacking friendly characters can be a very bad idea, but this is a role-playing game, so it's up to you. (This guard doesn't seem so tough.)]]>
</text>
</node>
<node for="22">
<keyword>purc</keyword>
<keyword>givi</keyword>
<type>buy-sdf</type>
<param>400</param>
<param>2</param>
<param>8</param>
<param>1</param>
<text>
<![CDATA["Your cooperation is much appreciated. So long, suckers!"|Well, you managed to keep at least a chunk of the gold secret, so that's nice.]]>
</text>
<text>
<![CDATA[You don't have enough gold. Did you loot the chest in the vault room?]]>
</text>
</node>
</dialogue>

View File

@@ -0,0 +1,198 @@
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<dialogue boes="2.0.0">
<personality id="30">
<title>Death</title>
<look>
<![CDATA[For centuries, people have lived with their unanswered questions about Death. It's your lucky day to get those questions answered by the very embodiment of the idea itself!]]>
</look>
<name>
<![CDATA["Death."]]>
</name>
<job>
<![CDATA["I tend to lost souls."]]>
</job>
<unknown>
<![CDATA["Don't make this any more complicated than it is."]]>
</unknown>
</personality>
<personality id="31">
<title>Healer</title>
<look>
<![CDATA[This healer is certainly in odd company.]]>
</look>
<name>
<![CDATA["That's not important right now. I'm here to help fix your situation."]]>
</name>
<job>
<![CDATA["I'm one half of what you might call the ultimate good cop, bad cop routine. Let me heal your companion, then we'll move along."]]>
</job>
<unknown>
<![CDATA["What do you mean?"]]>
</unknown>
</personality>
<personality id="32">
<title>Trainer</title>
<look>
<![CDATA[This person exists solely to train adventurers.]]>
</look>
<name>
<![CDATA["Trainer."]]>
</name>
<job>
<![CDATA["Training. You give me gold and skill points, I make you good at things."]]>
</job>
<unknown>
<![CDATA["What was that?"]]>
</unknown>
</personality>
<personality id="33">
<title>Merchant</title>
<look>
<![CDATA[This merchant looks apologetic. "I promise I'm the last person getting between you and a real adventure!"]]>
</look>
<name>
<![CDATA["Stephen." (Stephen Merchant?)]]>
</name>
<job>
<![CDATA["I can identify your items, and you can sell me the ones you don't want! It's always smart to have your items identified. I can tell you right now that one of the items in these boxes is cursed."]]>
</job>
<unknown>
<![CDATA["Huh?"]]>
</unknown>
</personality>
<personality id="34">
<title>Unused</title>
<look></look>
<name></name>
<job></job>
</personality>
<personality id="35">
<title>Unused</title>
<look></look>
<name></name>
<job></job>
</personality>
<personality id="36">
<title>Unused</title>
<look></look>
<name></name>
<job></job>
</personality>
<personality id="37">
<title>Unused</title>
<look></look>
<name></name>
<job></job>
</personality>
<personality id="38">
<title>Unused</title>
<look></look>
<name></name>
<job></job>
</personality>
<personality id="39">
<title>Unused</title>
<look></look>
<name></name>
<job></job>
</personality>
<node for="30">
<keyword>deat</keyword>
<keyword>lost</keyword>
<type>reg</type>
<text>
<![CDATA["There are three types of death you need to be concerned about: the normal kind, petrification, and dusting."]]>
</text>
</node>
<node for="30">
<keyword>conc</keyword>
<type>reg</type>
<text>
<![CDATA["When you're dead, you're not much help to your party. If you're the only one who can unlock doors, for example, your teammates might be completely stuck without you!"]]>
</text>
<text>
<![CDATA["And you don't gain experience, either."]]>
</text>
</node>
<node for="30">
<keyword>norm</keyword>
<keyword>kind</keyword>
<type>reg</type>
<text>
<![CDATA["Some deaths are just death. Not much else to say about those, but a Raise Dead spell will sort you out. Probably. Actually, casting those yourself, you run the risk of dusting the target. And if they do come back, they won't be as strong as before. That's a high risk operation when you're inexperienced."]]>
</text>
<text>
<![CDATA["You're probably better off paying a professional healer like my associate here to fix your deaths when you're getting started on your adventures."]]>
</text>
</node>
<node for="30">
<keyword>petr</keyword>
<keyword>ston</keyword>
<type>reg</type>
<text>
<![CDATA["Watch out for basilisks and the like. They can stone you with just a glance, which is just annoying. Stoning's cheaper to reverse than your average death, but you won't learn that spell for yourself until later."]]>
</text>
</node>
<node for="30">
<keyword>dust</keyword>
<type>reg</type>
<text>
<![CDATA["Dusting is the worst kind of death. It's very expensive to get sorted. It happens when you take a hit so big it quite simply blows you away. You get obliterated. It can also happen if you mess up trying to Raise a normally dead person."]]>
</text>
<text>
<![CDATA["At a low level, if you have multiple party members dead, frankly, there's no coming back from it. Especially if it's your magic casters. Sometimes you're better off deleting your companions and making new ones in a major town. But between you and me, the easiest thing is to save often so you can just reload."]]>
</text>
</node>
<node for="31">
<keyword>situ</keyword>
<keyword>heal</keyword>
<type>shop</type>
<param>0</param>
<param>0</param>
<text>
<![CDATA[Healer]]>
</text>
<text>
<![CDATA["You're clear to go. We won't keep you any longer."]]>
</text>
</node>
<node for="30">
<keyword>save</keyword>
<keyword>relo</keyword>
<type>reg</type>
<text>
<![CDATA["Type 'Control+s', or 'Command+s' on a Mac, to save your game. I do it all the time, it's how I'm basically immortal. Then it's 'Control+o' or 'Command+o' to reload."]]>
</text>
<text>
<![CDATA["Once you've created your own save file, the game will also make autosaves for you. Those can come in handy."]]>
</text>
</node>
<node for="31">
<keyword>keep</keyword>
<keyword>clea</keyword>
<type>call-local</type>
<param>23</param>
<text />
</node>
<node for="32">
<keyword>trai</keyword>
<keyword>purc</keyword>
<type>train</type>
<text />
</node>
<node for="33">
<keyword>iden</keyword>
<type>id</type>
<param>50</param>
<text>
<![CDATA["Potions, scrolls, wands... it's best to know what they do before you use them."]]>
</text>
</node>
<node for="33">
<keyword>curs</keyword>
<type>reg</type>
<text>
<![CDATA["Yeah, cursed weapons and armor will really getcha. Equip one, and you won't be able to get rid of it until the curse is removed!"]]>
</text>
</node>
</dialogue>

View File

@@ -0,0 +1,48 @@
112,112,112,112,112,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111
112,112,112,112,112,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,112,112,112,112,112
112,112,112,112,112,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,112,112,112,112,112
112,112,112,112,112,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,112,112,112,112,112
112,112,112,112,112,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,2v,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,112,112,112,112,112
112,112,112,112,112,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,111,111,111,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,112,112,112,112,112
112,112,112,112,112,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,122,111,111,111,122,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,112,112,112,112,112
112,112,112,112,112,170,170,170,170,170,170,170,170,170,170,170,170,170,122,122,122,122,122,122,131:1&9,122,122,122,122,122,122,170,170,170,170,170,170,170,170,170,170,170,170,112,112,112,112,112
112,112,112,112,112,170,170,170,170,170,170,170,170,170,170,170,170,170,136,177@0,176@1,194@4,138,170:3,170:3,170:3,138,194@7,178@2,177@3,136,170,170,170,170,170,170,170,170,170,170,170,170,112,112,112,112,112
112,112,112,112,112,170,170,170,170,170,170,170,170,170,170,170,170,170,122,170,170,170:5,133:50,170,170,170,122,170,170,170,122,170,170,170,170,170,170,170,170,170,170,170,170,112,112,112,112,112
112,112,112,112,112,170,170,170,170,170,170,170,170,170,170,170,170,170,136,170,170,170:5,138,170,170:6&9,170,138,170,170,170,136,170,170,170,170,170,170,170,170,170,170,170,170,112,112,112,112,112
112,112,112,112,112,170,170,170,170,170,170,170,170,122,122,122,122,122,122,125,122,122,122,122,130,122,122,122,122,125,122,122,122,122,122,122,170,170,170,170,170,170,170,112,112,112,112,112
112,112,112,112,112,170,122,122,122,122,122,122,122,122,174,170,170,170,170,170,170,170,170,170,170,170,170,257,170,170,170,170,170,170,174,122,170,170,170,170,170,170,170,112,112,112,112,112
112,112,112,112,112,170,122,170,197,197,170,170,170,125:7,170,170,170,170,170,170,170,170,170,170,170:49&9,170,170,257,170,170,170,170,170,170,170,122,170,170,170,170,170,170,170,112,112,112,112,112
112,112,112,112,112,170,122,198,185,183,170,197,197,122,170,170,174,122,122,122,122,122,122,136,130,136,122,122,122,122,122,122,174,170,170,122,170,170,170,170,170,170,170,112,112,112,112,112
112,112,112,112,112,170,122,170,195,195,170,185,183,122,257,257,170,122,2,2,2,115,2,111,2,2,3,111,111,2,111,122,170,170,170,122,170,170,170,170,170,170,170,112,112,112,112,112
112,112,112,112,112,170,122,170,170,170,170,195,195,122,170,257,257,122,111,2,111,2,2,2,3,111,2,3,114,115,111,122,170,170,170,122,170,170,170,170,170,170,170,112,112,112,112,112
112,112,112,112,112,170,122,122,129:8,122,122,122,122,122,170,170,170,122,114,3,3,111,2,115,2,2,111,2,111,2,114,122,170,170,170,122,170,170,170,170,170,170,170,112,112,112,112,112
112,112,112,112,112,170,122,171:37,171:37,171:37&10,178@5,177,177,122,170,170,170,122,111,2,111,56,55,55,55,68,55,55,55,54,111,122,170,170,170,122,170,170,170,170,170,170,170,112,112,112,112,112
112,112,112,112,112,170,122,170,170&10,170,170&10,170$1,170$2,122,170:48,170,170,122,2,111,2,57,50,50,62,70,59,50,50,53,2,122,170,170,170,122,170,170,170,170,170,170,170,112,112,112,112,112
112,112,112,112,112,170,122,170,202,202,170@6$0,170&10,170:19&10&9,134,170:48,170,170,122,2,2,111,57,50,50,53,2:24&9,58,59,50,53,111,122,170,170,170,122,170,170,170,170,170,170,170,112,112,112,112,112
112,112,112,112,112,170,122,122,122,122,122,122,122,122,170:48,170,170,122,111,111,2,58,51,51,52,111,111,58,51,52,2,122,170,170,170,122,170,170,170,170,170,170,170,112,112,112,112,112
112,112,112,112,112,170,170,170,170,170,170,170,170,122,170,170,170,122,114,2,111,2,2,111,2,111,2,2,111,2,2,122,170,170,170,122,170,170,170,170,170,170,170,112,112,112,112,112
112,112,112,112,112,170,170,170,170,170,170,170,170,122,170,170,170,122,2,111,2,2,111,2,111,2,2,2,2,2,111,122,170,170,170,122,170,170,170,170,170,170,170,112,112,112,112,112
112,112,112,112,112>,170,170,170,170,170,170,170,170,122,170,170,174,122,122,122,122,122,122,122,136,130,136,122,122,122,122,122,174,170,170,122,170,170,170,170,170,170,170,112<,112,112,112,112
112,112,112,112,112,170,170,170,170,170,170,170,170,122,170,170,170,170,170,170,170,170,170,170,208:28,170:25&9,170,170,170,170,170,170,170,170,170,122,170,170,170,170,170,170,170,112,112,112,112,112
112,112,112,112,112,170,170,170,170,170,170,170,170,122,174,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,174,122,170,170,170,170,170,170,170,112,112,112,112,112
112,112,112,112,112,170,170,170,170,170,170,170,170,122,122,122,122,122,122,122,122,122,122,122,122,125,122,122,122,122,122,122,122,122,122,122,170,170,170,170,170,170,170,112,112,112,112,112
112,112,112,112,112,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,122,204:30,170:30,204:30,122,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,112,112,112,112,112
112,112,112,112,112,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,137,204,170,204,137,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,112,112,112,112,112
112,112,112,112,112,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,122,204,170,204,122,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,112,112,112,112,112
112,112,112,112,112,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,137,186:32,193,186:33,137,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,112,112,112,112,112
112,112,112,112,112,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,112,122,122,258:34,122,122,112,170,170,170,170,170,170,170,170,170,170,170,170,170,170,112,112,112,112,112
112,112,112,112,112,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,112,112,2,2,2^,2,2,112,112,170,170,170,170,170,170,170,170,170,170,170,170,170,112,112,112,112,112
112,112,112,112,112,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,112,2,2,2,2,2,2,2,112,170,170,170,170,170,170,170,170,170,170,170,170,170,112,112,112,112,112
112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,2,2,2,2,2,2,2,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112
112,112,112,112,112,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,112,112,112,112,112
112,112,112,112,112,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,112,112,112,112,112
112,112,112,112,112,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,112,112,112,112,112
112,112,112,112,112,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,112,112,112,112,112
112,112,112,112,112,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,112,112,112,112,112
112,112,112,112,112,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,112,112,112,112,112
112,112,112,112,112,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,112,112,112,112,112
112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112
112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112
112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112
112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112
112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112

View File

@@ -0,0 +1,357 @@
@once-dlog = 0
sdf -1, -1
msg 2, -1, 1
pic 92, 1
ex1 -1, -1, -1
ex2 -1, -1, -1
goto 4
@if-status = 1
sdf -1, -1
msg -1, -1, -1
pic 0, 4
ex1 2, 2, -1
ex2 1, 0, 2
goto -1
@block-move = 2
sdf -1, -1
msg 0, -1, -1
pic 0, 4
ex1 1, -1, -1
ex2 -1, -1, -1
goto -1
@once-disp-msg = 3
sdf 0, 0
msg 1, 45, -1
pic 0, 4
ex1 -1, -1, -1
ex2 -1, -1, -1
goto 29
@once-dlog = 4
sdf -1, -1
msg 8, -1, 1
pic 95, 1
ex1 -1, -1, -1
ex2 -1, -1, -1
goto -1
@once-disp-msg = 5
sdf 0, 1
msg 14, -1, -1
pic 0, 4
ex1 -1, -1, -1
ex2 -1, -1, -1
goto -1
@if-ter = 6
sdf -1, -1
msg -1, -1, -1
pic 0, 4
ex1 22, 9, -1
ex2 133, 0, -1
goto -1
@once-disp-msg = 7
sdf 0, 2
msg 15, -1, -1
pic 0, 4
ex1 -1, -1, -1
ex2 -1, -1, -1
goto -1
@once-dlog = 8
sdf 0, 3
msg 16, -1, 1
pic 102, 3
ex1 -1, -1, -1
ex2 -1, -1, -1
goto -1
@inc-sdf = 9
sdf 0, 4
msg -1, -1, -1
pic 0, 4
ex1 1, 0, -1
ex2 -1, -1, -1
goto 10
@if-sdf = 10
sdf 0, 4
msg -1, -1, -1
pic 0, 4
ex1 3, 16, -1
ex2 -1, -1, -1
goto -1
@once-dlog = 11
sdf -1, -1
msg 22, -1, 1
pic 0, 4
ex1 -1, -1, -1
ex2 -1, -1, -1
goto -1
@if-status = 12
sdf -1, -1
msg -1, -1, -1
pic 0, 4
ex1 6, 14, -1
ex2 1, 0, 2
goto 15
@if-sdf = 13
sdf 0, 4
msg -1, -1, -1
pic 0, 4
ex1 3, 12, -1
ex2 -1, -1, -1
goto -1
@if-sdf = 14
sdf 0, 5
msg -1, -1, -1
pic 0, 4
ex1 1, -1, -1
ex2 -1, -1, -1
goto 11
@set-sdf = 15
sdf 0, 5
msg 28, -1, -1
pic 0, 4
ex1 1, -1, -1
ex2 -1, -1, -1
goto 17
@disp-msg = 16
sdf -1, -1
msg 29, -1, -1
pic 0, 4
ex1 -1, -1, -1
ex2 -1, -1, -1
goto 18
@set-sdf = 17
sdf 0, 4
msg -1, -1, -1
pic 0, 4
ex1 0, -1, -1
ex2 -1, -1, -1
goto -1
@set-sdf = 18
sdf 0, 6
msg -1, -1, -1
pic 0, 4
ex1 1, -1, -1
ex2 -1, -1, -1
goto -1
@if-sdf = 19
sdf 0, 6
msg -1, -1, -1
pic 0, 4
ex1 1, 20, -1
ex2 -1, -1, -1
goto -1
@if-ter = 20
sdf -1, -1
msg -1, -1, -1
pic 0, 4
ex1 13, 20, -1
ex2 134, 21, -1
goto -1
@once-dlog = 21
sdf -1, -1
msg 31, -1, 1
pic 96, 1
ex1 -1, -1, -1
ex2 -1, -1, -1
goto -1
@if-spec-item = 22
sdf -1, -1
msg -1, -1, -1
pic 0, 4
ex1 0, -1, -1
ex2 -1, -1, -1
goto 23
@disp-msg = 23
sdf -1, -1
msg 37, -1, -1
pic 0, 4
ex1 -1, -1, -1
ex2 -1, -1, -1
goto -1
@once-give-spec-item = 24
sdf 0, 7
msg 38, 46, -1
pic 0, 4
ex1 0, 0, -1
ex2 -1, -1, -1
goto 36
@if-ter = 25
sdf -1, -1
msg -1, -1, -1
pic 0, 4
ex1 25, 24, -1
ex2 130, 26, -1
goto -1
@once-dlog = 26
sdf -1, -1
msg 39, -1, 1
pic 214, 1
ex1 -1, -1, -1
ex2 -1, -1, -1
goto -1
@change-ter = 27
sdf -1, -1
msg -1, -1, -1
pic 0, 4
ex1 25, 24, -1
ex2 131, -1, -1
goto -1
@lever-generic = 28
sdf -1, -1
msg -1, -1, -1
pic 0, 4
ex1 -1, 27, -1
ex2 -1, -1, -1
goto -1
@change-ter = 29
sdf -1, -1
msg -1, -1, -1
pic 0, 4
ex1 24, 7, -1
ex2 130, -1, -1
goto -1
@if-spec-item = 30
sdf -1, -1
msg -1, -1, -1
pic 0, 4
ex1 0, 31, -1
ex2 -1, -1, -1
goto 35
@once-dlog = 31
sdf -1, -1
msg 47, -1, 1
pic 137, 1
ex1 -1, -1, -1
ex2 -1, -1, -1
goto -1
@spell-priest = 32
sdf -1, -1
msg 55, -1, -1
pic 0, 4
ex1 18, 0, -1
ex2 -1, -1, -1
goto -1
@spell-priest = 33
sdf -1, -1
msg 56, -1, -1
pic 0, 4
ex1 27, 0, -1
ex2 -1, -1, -1
goto -1
@disp-msg = 34
sdf -1, -1
msg 53, -1, -1
pic 0, 4
ex1 -1, -1, -1
ex2 -1, -1, -1
goto -1
@block-move = 35
sdf -1, -1
msg 54, -1, -1
pic 0, 4
ex1 1, -1, -1
ex2 -1, -1, -1
goto -1
@inc-sdf = 36
sdf 1, 4
msg -1, -1, -1
pic 0, 4
ex1 1, 0, -1
ex2 -1, -1, -1
goto -1
@if-context = 37
sdf -1, -1
msg -1, -1, -1
pic 0, 4
ex1 2, -1, 45
ex2 -1, -1, -1
goto 46
@if-statistic = 38
sdf -1, -1
msg -1, -1, -1
pic 0, 4
ex1 2, 39, -1
ex2 9, -1, -1
goto 40
@once-dlog = 39
sdf 0, 9
msg 57, -1, 1
pic 25, 4
ex1 -1, -1, -1
ex2 -1, -1, -1
goto 42
@if-statistic = 40
sdf -1, -1
msg -1, -1, -1
pic 0, 4
ex1 4, 41, -1
ex2 7, -1, -1
goto 43
@once-dlog = 41
sdf 0, 8
msg 63, -1, 1
pic 57, 7
ex1 -1, -1, -1
ex2 -1, -1, -1
goto -1
@nop = 42
sdf -1, -1
msg -1, -1, -1
pic 0, 4
ex1 -1, -1, -1
ex2 -1, -1, -1
goto -1
@if-statistic = 43
sdf -1, -1
msg -1, -1, -1
pic 0, 4
ex1 3, 44, -1
ex2 10, -1, -1
goto -1
@once-dlog = 44
sdf 0, 10
msg 69, -1, 1
pic 26, 4
ex1 -1, -1, -1
ex2 -1, -1, -1
goto -1
@block-move = 45
sdf -1, -1
msg -1, -1, -1
pic 0, 4
ex1 0, -1, -1
ex2 1, -1, -1
goto 38
@if-sdf = 46
sdf 0, 6
msg -1, -1, -1
pic 0, 4
ex1 1, -1, -1
ex2 -1, -1, -1
goto 47
@block-move = 47
sdf -1, -1
msg 75, -1, -1
pic 0, 4
ex1 1, -1, -1
ex2 -1, -1, -1
goto -1
@once-dlog = 48
sdf 0, 11
msg 76, -1, 1
pic 14, 4
ex1 -1, -1, -1
ex2 -1, -1, -1
goto -1
@once-disp-msg = 49
sdf 0, 12
msg 82, -1, -1
pic 0, 4
ex1 -1, -1, -1
ex2 -1, -1, -1
goto -1
@if-ter = 50
sdf -1, -1
msg -1, -1, -1
pic 0, 4
ex1 22, 9, -1
ex2 133, 4, -1
goto -1

View File

@@ -0,0 +1,181 @@
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<town boes="2.0.0">
<size>48</size>
<name>Marshy Tower</name>
<comment>Comment 1</comment>
<comment>Comment 2</comment>
<comment>Comment 3</comment>
<bounds top="3" left="3" bottom="34" right="47" />
<difficulty>0</difficulty>
<lighting>lit</lighting>
<timer freq="2">13</timer>
<timer freq="0">0</timer>
<flags>
<chop kills="30000" />
</flags>
<item id="0">
<type>109</type>
</item>
<item id="1">
<type>103</type>
</item>
<item id="2">
<type>106</type>
</item>
<item id="3">
<type>106</type>
</item>
<item id="4">
<type>155</type>
<contained>true</contained>
</item>
<item id="5">
<type>19</type>
</item>
<item id="6">
<type>19</type>
</item>
<item id="7">
<type>0</type>
<charges>50</charges>
<contained>true</contained>
</item>
<creature id="0">
<type>118</type>
<attitude>hostile-a</attitude>
<mobility>1</mobility>
<personality>-1</personality>
<face>0</face>
<onkill>9</onkill>
</creature>
<creature id="1">
<type>118</type>
<attitude>hostile-a</attitude>
<mobility>1</mobility>
<personality>-1</personality>
<face>0</face>
<onkill>9</onkill>
</creature>
<creature id="2">
<type>118</type>
<attitude>hostile-a</attitude>
<mobility>1</mobility>
<personality>-1</personality>
<face>0</face>
<onkill>9</onkill>
</creature>
<string id="0">
<![CDATA[Your priest, Michael, stops the party. "Let's not go in anywhere dangerous while any of us are poisoned. I'll cure us by pressing 'p' or the ankh button to open the Priest Spells menu, choosing myself as the caster, choosing Cure Poison, then choosing a target, and pressing 'cast.'"]]>
</string>
<string id="1">
<![CDATA[This tower is slowly sinking into the marsh. Not fast enough to be of concern for you, though.]]>
</string>
<string id="2">
<![CDATA[Your expedition has hit another snag. This abandoned security checkpoint shows no way of opening from the outside.]]>
</string>
<string id="8">
<![CDATA[Michael points to a crack in the wall. "I can break that with another Priest spell!"]]>
</string>
<string id="9">
<![CDATA[You can also cast Priest spells using the 'Cast Priest' menu at the top of the screen. First, click Michael's name in the 'Party Stats' panel in the upper right, to select him.]]>
</string>
<string id="10">
<![CDATA[Then, cast the Priest spell 'Move Mountains' and select the cracked wall to destroy it.]]>
</string>
<string id="14">
<![CDATA[Whenever this tower was last occupied, some supplies were left here for guards on duty. You can search containers by looking at them with 'l'/right-click, and you can take items you find lying around by pressing 'g' or the hand button.]]>
</string>
<string id="15">
<![CDATA[With no way around the rubble in the main hall, you wander into the dining hall. Maybe it connects with another part of the tower.]]>
</string>
<string id="16">
<![CDATA[Oh, no! This pantry has been infested with giant spiders.]]>
</string>
<string id="17">
<![CDATA[Press 'f' to enter combat mode. ]]>
</string>
<string id="22">
<![CDATA[Now that the spiders are dead, you probably want to clean off their webs. Control+w, or Command+w on a Mac, will make the party rest for a short time in town or a dungeon, long enough to clean off any webs. You can also select 'Wait 80 Moves' in the Action menu.]]>
</string>
<string id="28">
<![CDATA[You can also clean webs off of map tiles by clicking the 'Use' button (or typing 'u') and selecting a tile with webs on it.]]>
</string>
<string id="29">
<![CDATA[Press 'f' again, or click the Sword button, to end combat mode.]]>
</string>
<string id="30">
<![CDATA[timer called]]>
</string>
<string id="31">
<![CDATA[Once again, Michael recognizes a weakened spot in the wall where mold has grown through the bricks. Casting Move Mountains here will make the opening you need to explore further.]]>
</string>
<string id="32">
<![CDATA[(When building your own party, you should probably always give at least one of your characters 2 levels of Priest Spells skill! Some older scenarios assume you will be able to cast Move Mountains, and to recognize vulnerable walls. You can get stuck without it.)]]>
</string>
<string id="37">
<![CDATA[Through the gate, you see what remains of a courtyard. The first artifact piece is in there! Too bad the gate won't open.]]>
</string>
<string id="38">
<![CDATA[You collect the first piece of the artifact! It's wet....]]>
</string>
<string id="39">
<![CDATA[Finally! A mechanism for opening one of these gates.]]>
</string>
<string id="40">
<![CDATA[You can operate most levers by using, looking, or moving onto them.]]>
</string>
<string id="45">
<![CDATA[More concerning, is how the portcullis clangs shut behind you!]]>
</string>
<string id="46">
<![CDATA[Well, with the front gate now closed, you'll need to find another way out.]]>
</string>
<string id="47">
<![CDATA[You see a window high in the southern wall of this chapel. Maybe you could crawl through it, if only you could stand on something tall.]]>
</string>
<string id="48">
<![CDATA[Like that altar! The gods won't mind if you move their idols aside... probably.]]>
</string>
<string id="49">
<![CDATA[Click the 'Use' button, or type 'u', then select a tile to use it.]]>
</string>
<string id="53">
<![CDATA[Disease is an extremely unpleasant status to have. Michael has a priest spell, Cure Disease, that can fix it.]]>
</string>
<string id="54">
<![CDATA[There appears to be a small chapel here. Maybe you can look into it after searching the courtyard to the north.]]>
</string>
<string id="55">
<![CDATA[This book describes how to cast a new priest spell: Disease.]]>
</string>
<string id="56">
<![CDATA[This book describes how to cast a new priest spell: Cure Disease.]]>
</string>
<string id="57">
<![CDATA[Adrianna and Feodoric can cast mage spells. Press 'm' on their turn, use the 'Cast Mage' menu item, or click the flaming orb button to do so. Lots of mage spells are useful in combat! Try Flame or Fireball for wiping out enemies early on.]]>
</string>
<string id="63">
<![CDATA[Frrrrrr comes prepared with a bow and arrow. To fire, type 's' or click the button of an arrow, then select a tile with an enemy on it.]]>
</string>
<string id="64">
<![CDATA[You'll want to keep stocked up on arrows, but Frrrrrr can also wield melee weapons if you find an extra for them.]]>
</string>
<string id="69">
<![CDATA[Priests are useful in combat, too! They have spells like Wound for dealing damage, Stumble for disabling enemies, or Charm Foe for turning enemies against each other.]]>
</string>
<string id="70">
<![CDATA[Most importantly, though, they can heal your party when someone's injured!]]>
</string>
<string id="71">
<![CDATA[(Feodoric can also cast some priest spells.)]]>
</string>
<string id="75">
<![CDATA[Start combat mode before going in there!]]>
</string>
<string id="76">
<![CDATA[There are MANY other spells in Blades of Exile! To learn how any other spell works, open the Mage or Priest spells menu, then hold the Alt key (or Option key on a Mac) while clicking on the spell.]]>
</string>
<string id="82">
<![CDATA[Through this portcullis, you can see the next piece of the artifact. But you can't get it open.]]>
</string>
</town>

View File

@@ -0,0 +1,24 @@
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2
2,2,2,2,2,2,2,2,122,136,122,136,122,136,122,136,122,2,2,2,2,2,2,2
2,2,2,2,2,2,122,122,122,186:5,122,186:18,122,186:8,122,186:21,122,122,122,2,2,2,2,2
2,2,2,2,122,122,136,206:0,170,204,170,204,170,204,170,204,170,207,136,2,2,2,2,2
2,2,2,2,122,170,170,170:0,170,170,170,170,170,170,170,170,170,251:24,122,2,2,2,2,2
2,2,2,2,122,122,136,206:0,170,170,170,170,170,170,170,170,170,207,136,2,2,2,2,2
2,2,2,2,2,2,122,122,122,136,122,136,122,136,122,136,122,122,122,2,2,2,2,2
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2
2,2,2,2,2,2,2,2,2,2,122,122,122,122,122,2,2,2,2,2,2,2,2,2
2,2,2,2,2,2,2,2,2,122,122,170,251,170,122,122,122,122,2,2,2,2,2,2
2,2,2,2,2,2,2,2,2,122,187,170,170,170,187,122,122,122,2,2,2,2,2,2
2,2,2,2,2,2,2,2,2,122,206,170,170,170,170,173:29,251:31,122,2,2,2,2,2,2
2,2,2,2,2,2,2,2,2,122,122,170,170,170,122,132!0,122,122,2,2,2,2,2,2
2,2,2,2,2,2,2,2,2,2,122,122,170:27&9,122,122,2,2,2,2,2,2,2,2,2
2,2,2,2,2,2,2,2,2,2,2,122,131v<^>,122,2,2,2,2,2,2,2,2,2,2
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2

View File

@@ -0,0 +1,224 @@
@once-disp-msg = 0
sdf 1, 2
msg 0, 1, -1
pic 0, 4
ex1 -1, -1, -1
ex2 -1, -1, -1
goto 3
@if-look = 1
sdf -1, -1
msg -1, -1, -1
pic 0, 4
ex1 -1, -1, 2
ex2 -1, -1, -1
goto -1
@set-sdf = 2
sdf 1, 0
msg -1, -1, -1
pic 0, 4
ex1 1, -1, -1
ex2 -1, -1, -1
goto -100
@set-ptr = 3
sdf 1, 1
msg -1, -1, -1
pic 0, 4
ex1 100, -1, -1
ex2 -1, -1, -1
goto -1
@nop = 4
sdf -1, -1
msg -1, -1, -1
pic 0, 4
ex1 -1, -1, -1
ex2 -1, -1, -1
goto -1
@set-sdf = 5
sdf 1, 1
msg -1, -1, -1
pic 0, 4
ex1 6, -1, -1
ex2 -1, -1, -1
goto 1
@once-dlog = 6
sdf -1, -1
msg 3, -1, 1
pic 24, 4
ex1 34, 7, -1
ex2 -1, -1, -1
goto -1
@story-dlog = 7
sdf -1, -1
msg 3, 10, 14
pic 24, 4
ex1 -1, -1, -1
ex2 -1, -1, -1
goto -1
@set-sdf = 8
sdf 1, 1
msg -1, -1, -1
pic 0, 4
ex1 9, -1, -1
ex2 -1, -1, -1
goto 1
@once-dlog = 9
sdf -1, -1
msg 15, -1, 1
pic 24, 4
ex1 34, 10, -1
ex2 -1, -1, -1
goto -1
@title-msg = 10
sdf -1, -1
msg 21, -1, 25
pic 17, 4
ex1 -1, -1, -1
ex2 -1, -1, -1
goto 14
@title-msg = 11
sdf -1, -1
msg 24, 32, 23
pic 85, 3
ex1 -1, -1, -1
ex2 -1, -1, -1
goto 13
@title-msg = 12
sdf -1, -1
msg 22, 31, 9
pic 22, 4
ex1 -1, -1, -1
ex2 -1, -1, -1
goto 11
@title-msg = 13
sdf -1, -1
msg 34, 35, 33
pic 28, 4
ex1 -1, -1, -1
ex2 -1, -1, -1
goto 17
@title-msg = 14
sdf -1, -1
msg 27, 28, 26
pic 38, 3
ex1 -1, -1, -1
ex2 -1, -1, -1
goto 15
@title-msg = 15
sdf -1, -1
msg 30, -1, 29
pic 45, 3
ex1 -1, -1, -1
ex2 -1, -1, -1
goto 12
@nop = 16
sdf -1, -1
msg -1, -1, -1
pic 0, 4
ex1 -1, -1, -1
ex2 -1, -1, -1
goto -1
@title-msg = 17
sdf -1, -1
msg 37, 38, 36
pic 2, 4
ex1 -1, -1, -1
ex2 -1, -1, -1
goto -1
@set-sdf = 18
sdf 1, 1
msg -1, -1, -1
pic 0, 4
ex1 19, -1, -1
ex2 -1, -1, -1
goto 1
@once-dlog = 19
sdf -1, -1
msg 39, -1, 1
pic 24, 4
ex1 34, 20, -1
ex2 -1, -1, -1
goto -1
@once-dlog = 20
sdf -1, -1
msg 45, -1, 1
pic 24, 4
ex1 -1, -1, -1
ex2 -1, -1, -1
goto -1
@set-sdf = 21
sdf 1, 1
msg -1, -1, -1
pic 0, 4
ex1 22, -1, -1
ex2 -1, -1, -1
goto 1
@once-dlog = 22
sdf -1, -1
msg 51, -1, 1
pic 24, 4
ex1 34, 23, -1
ex2 -1, -1, -1
goto -1
@once-dlog = 23
sdf -1, -1
msg 57, -1, 1
pic 24, 4
ex1 -1, -1, -1
ex2 -1, -1, -1
goto -1
@if-sdf = 24
sdf 1, 0
msg -1, -1, -1
pic 0, 4
ex1 1, 25, -1
ex2 -1, -1, -1
goto 26
@portal-generic = 25
sdf -1, -1
msg -1, -1, -1
pic 0, 4
ex1 12, 14, -1
ex2 -1, -1, -1
goto -1
@disp-msg = 26
sdf -1, -1
msg 63, 64, -1
pic 0, 4
ex1 -1, -1, -1
ex2 -1, -1, -1
goto -1
@once-dlog = 27
sdf 1, 3
msg 65, -1, 1
pic 0, 4
ex1 -1, -1, -1
ex2 -1, -1, -1
goto -1
@block-move = 28
sdf -1, -1
msg -1, -1, -1
pic 0, 4
ex1 1, -1, -1
ex2 -1, -1, -1
goto -1
@if-sdf = 29
sdf 1, 4
msg -1, -1, -1
pic 0, 4
ex1 3, -1, -1
ex2 -1, -1, -1
goto 30
@block-move = 30
sdf -1, -1
msg 71, -1, -1
pic 0, 4
ex1 1, -1, -1
ex2 -1, -1, -1
goto -1
@end-scen = 31
sdf -1, -1
msg -1, -1, -1
pic 0, 4
ex1 -1, -1, -1
ex2 -1, -1, -1
goto -1

View File

@@ -0,0 +1,155 @@
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<town boes="2.0.0">
<size>24</size>
<name>Part 1: Lore</name>
<comment>Comment 1</comment>
<comment>Comment 2</comment>
<comment>Comment 3</comment>
<bounds top="3" left="3" bottom="20" right="20" />
<difficulty>0</difficulty>
<lighting>lit</lighting>
<flags>
<chop kills="30000" />
</flags>
<sign id="0">
<![CDATA[To exit, gather the 3 pieces of the artifact!]]>
</sign>
<string id="0">
<![CDATA[This room contains multiple books explaining the almost 30-year history of Blades of Exile! To read one, you must be standing next to it. Then, either right-click its space, or click the eye button in your hotbar (hotkey: 'l' for look) before selecting its space.]]>
</string>
<string id="1">
<![CDATA[Try glancing at at least one of them before you rush off through the portal to the east.]]>
</string>
<string id="2">
<![CDATA[happened]]>
</string>
<string id="3">
<![CDATA["What in the world is a Role-Playing Game?"]]>
</string>
<string id="4">
<![CDATA[A primer for the TRULY uninitiated.]]>
</string>
<string id="9">
<![CDATA[Exile: Escape from the Pit]]>
</string>
<string id="10">
<![CDATA[Do you remember being young and pretending you were a knight or a wizard or a space explorer? Or maybe you pretended to be one of those things just yesterday. Whenever it last happened, you were role-playing.]]>
</string>
<string id="11">
<![CDATA[Role-Playing Games are structured ways to imagine being someone, somewhere, or someTHING else. People play RPGs to experience relief from normal, restrictive life, or to process intense subjects that might feel inappropriate in a casual conversation. Sometimes both at the same time!]]>
</string>
<string id="12">
<![CDATA[Fantasy RPGs like this one set up a rich and often magical environment where you get to be the hero. With enough training and tactical know-how, you can stand up to any threat you come across.]]>
</string>
<string id="13">
<![CDATA[In Blades of Exile you will control a party of adventurers fighting monsters, exploring treacherous dungeons, and navigating political intrigue. All of that can get pretty complicated, especially because this game was created in 1997, a time when you could be expected to read an entire manual BEFORE launching anything on your computer.]]>
</string>
<string id="14">
<![CDATA[We (the small group of volunteers working to preserve this game) want as many people as possible to enjoy it, and that includes you! Even if you've never played an RPG before. This tutorial is our best effort at helping you get started.]]>
</string>
<string id="15">
<![CDATA["What Do I Need to Know About the world of Exile?"]]>
</string>
<string id="16">
<![CDATA[A really quick lore dump.]]>
</string>
<string id="21">
<![CDATA[The continent of Valorim is ruled by the Empire, a tyrannical regime that controls almost everything on its surface. The Empire wiped almost every magical or non-human form of life out of existence, banishing the rest to a prison colony, Exile, in a vast network of inhospitable caves.]]>
</string>
<string id="22">
<![CDATA[In Exile I, you are thrown into the Pit for your disobedience. There, you discover an entire society of people the Empire tried to cast aside, imperiled by war with the sliths. You achieve glory as the adventurers who kill their leader Sss-Thsss, ending that war.]]>
</string>
<string id="23">
<![CDATA[Exile II: Crystal Souls]]>
</string>
<string id="24">
<![CDATA[In Exile II, peace has been attained with the sliths, but the Empire wages a retaliatory war against Exile, threatening to wipe out the fragile civilization that has developed in the caves over centuries. In so doing, they uncover an ancient alien race known as the Vahnatai, and plunder their sacred artifacts known as Crystal Souls. Each Crystal Soul contains a revered, immortalized Vahnatai.]]>
</string>
<string id="25">
<![CDATA[The Empire]]>
</string>
<string id="26">
<![CDATA[Nephilim]]>
</string>
<string id="27">
<![CDATA[Among the creatures the Empire nearly eradicated, there was an entire species with its own culture and customs. This is one of them, a nephil. Feline humanoids, nephilim tend to be more dextrous than humans.]]>
</string>
<string id="28">
<![CDATA[Most surviving nephilim live underground, where they were either banished or fled.]]>
</string>
<string id="29">
<![CDATA[Slithzerikai]]>
</string>
<string id="30">
<![CDATA[Slithzerikai, or sliths, are humanoid lizards who occupied the caves of Exile before the Empire started throwing its subjects down there. As exiled humans and nephilim expanded their underground society, a drawn-out war with the slithzerikai ensued.]]>
</string>
<string id="31">
<![CDATA[Then, joining with a group of powerful and angry rebel mages, you find a way back to the surface and strike a vengeful blow by killing the Emperor Hawthorne.]]>
</string>
<string id="32">
<![CDATA[The Vahnatai, wary of the exiled humans and nephils who have encroached on their caves, make a pact with the people of Exile, to fight together against the Empire's war of domination. Together, you recover the Crystal Souls and repel the invasion.]]>
</string>
<string id="33">
<![CDATA[Exile III: Ruined World]]>
</string>
<string id="34">
<![CDATA[In Exile III, people of the underground nation have begun emerging from their long captivity. What they find, however, is a surface world stricken by destruction, with its lumbering Empire unable to prevent a verging collapse. ]]>
</string>
<string id="35">
<![CDATA[Moving quickly, you heal the plagues of the land and uncover a conspiracy led by Rentar-Ihrno, a vengeful Vahnatai, who seeks to destroy the surface civilization for its theft of the Crystal Souls.]]>
</string>
<string id="36">
<![CDATA[Blades of Exile]]>
</string>
<string id="37">
<![CDATA[BoE came with 3 new scenarios, self-contained adventures taking place at various places and times before, after, or during the events of the Exile trilogy.]]>
</string>
<string id="38">
<![CDATA[More importantly, BoE came with an accessible construction kit for making UNLIMITED custom scenarios. Fans of the Exile Trilogy formed a thriving community around BoE, which produced almost 300 scenarios (that we know of) over the course of several years.]]>
</string>
<string id="39">
<![CDATA["What is Blades of Exile?"]]>
</string>
<string id="45">
<![CDATA[Blades of Exile is an RPG created by Spiderweb Software in 1997. It's part of the Exile series along with 3 other games. We call it BoE for short.]]>
</string>
<string id="46">
<![CDATA[We're still keeping BoE alive because it did something very special: it gave players complete access to the editor for designing new adventures in the Exile universe. Along with the official adventures made by Spiderweb Software, you can play literally HUNDREDS of adventures created by the player community. The archive of BoE scenarios is vast, and is extremely sentimental for anyone who dove into this game at the height of its popularity.]]>
</string>
<string id="47">
<![CDATA[The next book will fill you in on the other Exile games' storylines, which will help you understand BoE and its scenarios much better. If you've played the Exile series, or Spiderweb Software's modern remakes, Avernum 1-3, you might want to skip it.]]>
</string>
<string id="48">
<![CDATA[The final book explains how you're playing BoE almost 30 years after its creation.]]>
</string>
<string id="51">
<![CDATA["Open Blades of Exile 2.0"]]>
</string>
<string id="52">
<![CDATA[The story of a modern restoration by dozens of devoted fans.]]>
</string>
<string id="57">
<![CDATA["Open Blades of Exile 2.0"]]>
</string>
<string id="58">
<![CDATA[Making computer games is extremely hard! It was in the 1990s, and it still is now. Blades of Exile was made by an extremely small team with only one person, Jeff Vogel, doing the writing, design, and programming.]]>
</string>
<string id="59">
<![CDATA[Games don't last forever without someone updating or preserving them--and that takes hundreds of hours of labor. Jeff Vogel maintained Blades of Exile for as long as he could, but eventually (and understandably!) had to move on. In 2007, he released the original source code to allow the game's fans to pick up where he left off.]]>
</string>
<string id="60">
<![CDATA[You're now playing Open Blades of Exile, the result of dozens of BoE fans' hard work since 2007!]]>
</string>
<string id="63">
<![CDATA[Before leaving this floor, you should read at least one of these books!]]>
</string>
<string id="64">
<![CDATA[Remember, stand next to a book and right-click it to read.]]>
</string>
<string id="65">
<![CDATA[The next part of the tutorial will teach you how to explore new worlds in Blades of Exile! To complete it, you must find three artifact pieces hidden across a small world map. (Don't worry, you'll be guided along the way.)]]>
</string>
<string id="71">
<![CDATA[The portal on the other side of this rune must be your way out of the tutorial. But the rune seems to be looking for something you don't have. You can't cross it.]]>
</string>
</town>

View File

@@ -0,0 +1,48 @@
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,57,50,50,50
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,57,50,50,50
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,57,50,50,50
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,57,50,50,50
2,2,2,2,2,2,2,2,2,122,122,122,122,122,122,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,112,112,112,112,112,112,112,57,50,50,50
2,2,2,2,2,2,2,2,2,122,170,170,170,170$0,122,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,57,50,50,50
2,2,2,2,2,2,2,2,2:2,132!0,170:19,170,170,170,122,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,57,50,50,50
2,2,2,2,2,2,2,2v<^>,2:2,126,170:19,170,170,170,122,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,57,50,50,50
2,2,2,2,2,2,2,2,2:2,122,170:19,170,170,170,122,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,57,50,50,50
2,2,2,2,122,122,122,122,122,122,170:4,170:4,170:4,170,122,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,57,50,50,50
2,2,2,2,122,2,2,2,2,122,122,260,122,122,122,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,57,50,50,50
2,2,2,2,122,2,2,2,2,122,170:12,170:12,170:12,170,122,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,57,50,50,50
2,2,2,2,2,2,2,2,2,122,170,170,170,170,122,122,122,122,122,122,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,57,50,50,50
2,2,2,2,2,2,2,2,2,122,170,170,170,170,138,170$1,170,170,170,122,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,57,50,50,50
2,2,2,2,2,2,2,2,2,122,170:20,170:20,170:20,170:20,122,170,170,170,170,122,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,57,50,50,50
2,2,2,2,2,2,2,2,2,122,170,170,170,170,122,170,170,170,170,122,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,57,50,50,50
2,2,2,2,2,2,2,2,2,122,170,170,170,170,122,170,170,170,170,122,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,112,112,112,112,112,57,50,50,50
2,2,2,2,2,2,2,2,2,122,170,170,170,170,122,170,170,170,170,122,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,112,112,2,2,2,2,57,50,50,50
2,2,2,2,2,2,2,2,2,122,170,170,170,170,122,122,122,138,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,112,2,2,2,2,2,57,50,50,50
2,2,2,2,2,2,2,2,2,122,170,170,170,170,170,170,170,170,170:21,170:26,170,170,170:29,122,170,194@0,170,122,170,170,170,170,170,170,170,170,122,122,2:35,2,56,55,55,55,60,50,50,50
2,2,2,2,2,2,2,2,2,122,170,170,170,170,170,170,170,170,170:27,170:26,170,170,170:29,127,170,170:0&9,170,130,170,170,170,170,170,170,170,170,170$2,123,2:35,2,58b1,51,51,51,59,50,50,50
2,2,2,2,2,2,2,2,2,122,170,170,170,170,170,170,170,170,170:21,170:26,170,170,170:29,122,170,170,170,122,170,170,170,170,170,170,170,170,122,122,2:35,2,2,2,2,2,57,50,50,50
2,2,2,2,2,2,2,2,2,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,112,2,2,2,2,2,57,50,50,50
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,112,112,112,2,2,2,57,50,50,50
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,112,112,112,112,57,50,50,50
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,57,50,50,50
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,57,50,50,50
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,57,50,50,50
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,57,50,50,50
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,57,50,50,50
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,57,50,50,50
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,57,50,50,50
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,57,50,50,50
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,57,50,50,50
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,57,50,50,50
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,57,50,50,50
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,57,50,50,50
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,57,50,50,50
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,57,50,50,50
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,57,50,50,50
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,57,50,50,50
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,57,50,50,50
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,57,50,50,50
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,57,50,50,50
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,57,50,50,50
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,57,50,50,50
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,57,50,50,50
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,57,50,50,50

View File

@@ -0,0 +1,259 @@
@once-give-spec-item = 0
sdf 2, 0
msg 0, 34, -1
pic 0, 4
ex1 1, 0, -1
ex2 -1, -1, -1
goto 1
@inc-sdf = 1
sdf 1, 4
msg -1, -1, -1
pic 0, 4
ex1 1, 0, -1
ex2 -1, -1, -1
goto 31
@if-ter = 2
sdf -1, -1
msg -1, -1, -1
pic 0, 4
ex1 9, 7, -1
ex2 126, 3, -1
goto -1
@once-dlog = 3
sdf -1, -1
msg 1, -1, 1
pic 90, 1
ex1 -1, -1, -1
ex2 -1, -1, -1
goto -1
@if-ter = 4
sdf -1, -1
msg 7, -1, 1
pic 18, 3
ex1 9, 7, -1
ex2 129, 5, -1
goto 6
@block-move = 5
sdf -1, -1
msg 13, 10, -1
pic 0, 4
ex1 1, -1, -1
ex2 -1, -1, -1
goto -1
@if-ter = 6
sdf -1, -1
msg -1, -1, -1
pic 0, 4
ex1 11, 10, -1
ex2 260, 8, -1
goto -1
@once-dlog = 7
sdf -1, -1
msg 14, -1, 1
pic 18, 3
ex1 -1, -1, -1
ex2 -1, -1, -1
goto -1
@if-item-class = 8
sdf -1, -1
msg -1, -1, -1
pic 0, 4
ex1 1, 9, -1
ex2 -1, -1, -1
goto 7
@if-item-class-equip = 9
sdf -1, -1
msg -1, -1, -1
pic 0, 4
ex1 1, -1, -1
ex2 -1, -1, -1
goto 10
@once-dlog = 10
sdf -1, -1
msg 20, -1, 1
pic 18, 3
ex1 -1, -1, -1
ex2 -1, -1, -1
goto -1
@relocate = 11
sdf -1, -1
msg -1, -1, -1
pic 0, 4
ex1 2, 4, -1
ex2 101, -101, -1
goto 16
@set-ptr = 12
sdf 2, 1
msg -1, -1, -1
pic 0, 4
ex1 101, -1, -1
ex2 -1, -1, -1
goto 13
@set-sdf = 13
sdf 2, 1
msg -1, -1, -1
pic 0, 4
ex1 1, -1, -1
ex2 -1, -1, -1
goto -1
@set-sdf = 14
sdf 2, 1
msg -1, -1, -1
pic 0, 4
ex1 3, -1, -1
ex2 -1, -1, -1
goto -1
@if-sdf = 15
sdf 2, 1
msg -1, -1, -1
pic 0, 4
ex1 3, 13, -1
ex2 -1, -1, -1
goto 14
@disp-sm-msg = 16
sdf -1, -1
msg 26, -1, -1
pic 0, 4
ex1 -1, -1, -1
ex2 -1, -1, -1
goto 15
@block-move = 17
sdf -1, -1
msg 27, 28, -1
pic 0, 4
ex1 1, -1, -1
ex2 -1, -1, -1
goto 22
@if-sdf = 18
sdf 2, 3
msg -1, -1, -1
pic 0, 4
ex1 1, 11, -1
ex2 -1, -1, -1
goto -1
@once-dlog = 19
sdf 2, 4
msg 7, -1, 1
pic 18, 3
ex1 -1, -1, -1
ex2 -1, -1, -1
goto -1
@if-sdf = 20
sdf 2, 1
msg -1, -1, -1
pic 0, 4
ex1 3, -1, -1
ex2 -1, -1, -1
goto 17
@if-sdf = 21
sdf 2, 1
msg -1, -1, -1
pic 0, 4
ex1 3, 17, -1
ex2 -1, -1, -1
goto -1
@set-sdf = 22
sdf 2, 5
msg -1, -1, -1
pic 0, 4
ex1 1, -1, -1
ex2 -1, -1, -1
goto -1
@if-sdf = 23
sdf 2, 6
msg -1, -1, -1
pic 0, 4
ex1 1, 24, -1
ex2 -1, -1, -1
goto -1
@disp-msg = 24
sdf -1, -1
msg 29, 30, -1
pic 0, 4
ex1 -1, -1, -1
ex2 -1, -1, -1
goto 25
@start-talk = 25
sdf -1, -1
msg -1, -1, -1
pic 71, 4
ex1 21, -1, -1
ex2 -1, -1, -1
goto -1
@set-sdf = 26
sdf 2, 7
msg -1, -1, -1
pic 0, 4
ex1 1, -1, -1
ex2 -1, -1, -1
goto -1
@if-sdf = 27
sdf 2, 7
msg -1, -1, -1
pic 0, 4
ex1 1, 28, -1
ex2 -1, -1, -1
goto 21
@block-move = 28
sdf -1, -1
msg 31, -1, -1
pic 0, 4
ex1 1, -1, -1
ex2 -1, -1, -1
goto -1
@if-ter = 29
sdf -1, -1
msg -1, -1, -1
pic 0, 4
ex1 23, 20, -1
ex2 127, 30, -1
goto -1
@disp-msg = 30
sdf -1, -1
msg 32, 33, -1
pic 0, 4
ex1 -1, -1, -1
ex2 -1, -1, -1
goto -1
@change-ter = 31
sdf -1, -1
msg -1, -1, -1
pic 0, 4
ex1 27, 20, -1
ex2 131, -1, -1
goto -1
@if-sdf = 32
sdf 2, 8
msg -1, -1, -1
pic 0, 4
ex1 1, 33, -1
ex2 -1, -1, -1
goto -1
@destroy-monst = 33
sdf -1, -1
msg 35, 36, -1
pic 0, 4
ex1 36, 20, -1
ex2 -1, -1, -1
goto 34
@set-sdf = 34
sdf 2, 8
msg -1, -1, -1
pic 0, 4
ex1 0, -1, -1
ex2 -1, -1, -1
goto -1
@once-dlog = 35
sdf 2, 9
msg 37, -1, 1
pic 0, 19
ex1 -1, -1, -1
ex2 -1, -1, -1
goto -1
@disp-msg = 36
sdf -1, -1
msg 43, 36, -1
pic 0, 4
ex1 -1, -1, -1
ex2 -1, -1, -1
goto -1

View File

@@ -0,0 +1,129 @@
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<town boes="2.0.0">
<size>48</size>
<name>Vault Tower</name>
<comment>Comment 1</comment>
<comment>Comment 2</comment>
<comment>Comment 3</comment>
<bounds top="3" left="3" bottom="44" right="44" />
<difficulty>0</difficulty>
<lighting>lit</lighting>
<timer freq="10">18</timer>
<timer freq="2">32</timer>
<flags>
<chop kills="30000" />
</flags>
<item id="0">
<type>0</type>
<charges>500</charges>
<property>true</property>
<contained>true</contained>
</item>
<creature id="0">
<type>19</type>
<attitude>friendly</attitude>
<mobility>0</mobility>
<personality>20</personality>
<face>10</face>
</creature>
<creature id="1">
<type>19</type>
<attitude>friendly</attitude>
<mobility>0</mobility>
<personality>21</personality>
<face>71</face>
<ontalk>23</ontalk>
</creature>
<creature id="2">
<type>19</type>
<attitude>friendly</attitude>
<mobility>0</mobility>
<personality>22</personality>
<face>10</face>
<onkill>36</onkill>
</creature>
<sign id="0">
<![CDATA[Vault Tower -|NO BREAKING AND ENTERING]]>
</sign>
<string id="0">
<![CDATA[This appears to be the central chamber of the vault! And right here, is the artifact piece you're looking for.]]>
</string>
<string id="1">
<![CDATA[You've reached Vault Tower. This building is in better repair than the last one, and the front door is locked. Thissa says, "I can break thissss!"]]>
</string>
<string id="2">
<![CDATA[It may be rude, but the life of an adventurer involves breaking the rules (and other people's property) sometimes. When you try to open a locked door, you'll have the option to bash it down. When asked, choose your physically strongest character, and give it your best shot.]]>
</string>
<string id="7">
<![CDATA["Whoa there!"]]>
</string>
<string id="8">
<![CDATA[Oops. Of course this place is guarded.]]>
</string>
<string id="9">
<![CDATA["The boss will make me pay for that door, you know! Fix it or I'll have to follow the 'violent repulsion' protocol."]]>
</string>
<string id="10">
<![CDATA[You can close doors behind you with the Use command, which might come in handy for sneaking around. Type 'u' or click the 'Use' button, and see if you can get this door back on its hinges.]]>
</string>
<string id="13">
<![CDATA["Oi! I said, fix the door."]]>
</string>
<string id="14">
<![CDATA["I'll tell you what. I wouldn't mind a piece of the boss's treasure. Listen to me, and I'll tell you how to get in. We can split the stash."]]>
</string>
<string id="15">
<![CDATA[Press 't', or the button with a mouth on it, then select a creature to start a conversation.]]>
</string>
<string id="20">
<![CDATA["Hey hotshot! You'll want to give those lockpicks to your wiliest thief and equip them by clicking on them in the items panel."]]>
</string>
<string id="21">
<![CDATA[To view a different character's inventory, click their name in the stats panel at the top-right. If Frrrrrr isn't holding the lockpicks, select whoever is. ]]>
</string>
<string id="22">
<![CDATA[To give an item from one character to another click the button with a 'G' next to the lockpicks. Select Frrrrrr, who is your best lockpicker right now. Then make sure they're equipped.]]>
</string>
<string id="26">
<![CDATA[The guard changes positions.]]>
</string>
<string id="27">
<![CDATA[The guard watching through this window stops you. "Hey! Move any further and I'll shoot."]]>
</string>
<string id="28">
<![CDATA[Maybe your buddy in the first room can help with this. (People might respond differently to the same questions after something specific happens.)]]>
</string>
<string id="29">
<![CDATA[You can ask people about things that aren't shown as buttons in the dialog window. Click 'Ask About' or type 'a' to do so, then type what you want to ask about.]]>
</string>
<string id="30">
<![CDATA[This guard will respond to the words 'patrol' or 'duty'!]]>
</string>
<string id="31">
<![CDATA[No sense in turning around now!]]>
</string>
<string id="32">
<![CDATA[Adrianna examines this door closely. "The lock is sealed magically," she observes. "I have a spell for that."]]>
</string>
<string id="33">
<![CDATA[Cast the mage spell 'Unlock Doors' as a third option for tricky doors where bashing or picking doesn't cut it!]]>
</string>
<string id="34">
<![CDATA[You take it, and the gate opens.]]>
</string>
<string id="35">
<![CDATA[The sneaky guard turns and flees from your presence, passing right through the wall to the east!]]>
</string>
<string id="36">
<![CDATA[(If you're ever stuck in a scenario, try moving into suspicious walls. Even if they're not breakable with magic, you might find a hidden door!) ]]>
</string>
<string id="37">
<![CDATA[Excellent! A boat. This should take you along the water to the final Tower!]]>
</string>
<string id="38">
<![CDATA[Move onto the boat to board it.]]>
</string>
<string id="43">
<![CDATA[Having struck down your duplicitous collaborator, you notice something strange about the wall to the east.]]>
</string>
</town>

View File

@@ -0,0 +1,48 @@
5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5
5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5
5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5
5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5
5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5
5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5
5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5
5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5
5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5
5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,21,6,6,6,6,6,6,18,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5
5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,21,8,0,0,98,0,0,0,17,18,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5
5,5,5,5,5,5,5,5,5,5,5,5,5,5,21,6,6,8,0,0,0$6,0,1,0,0,0,17,18,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5
5,5,5,5,5,5,5,5,5,5,21,6,6,6,8,0,0,0,0,0,0,0,0,0,0,0,0,17,18,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5
5,5,5,5,5,5,5,5,21,6,8,0,0,0,0,0,0,0,0,0$2,0,0,0,1,0$8,0,0,98,17,18,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5
5,5,5,5,5,5,5,21,8,0,0,1,1,0,0,0$1,0,0,1,0,0,0,0,0,1,0,261,261,261,17,18,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5
5,5,5,5,5,5,5,9,0,98,0,0,1,0,0,0,98,0,0,0,0,0$7,0,0,0,1,261,0,0,1,15,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5
5,5,5,5,5,5,5,9,0,0,1,0,0,0,0,14,12,12,12,12,11,0,0,261,261,261,261,0,0,101@0,15,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5
5,5,5,5,5,5,5,9,0,0,1,1,0,1,0,15,5,5,5,5,20,12,11,261,0,1,0,0:4&9,0,0,15,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5
5,5,5,5,5,5,5,9,0,0,0,0,0,14,12,19,5,5,5,5,5,5,20,12,11,0,98,0,0$3,1$4,17,18,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5
5,5,5,5,5,5,5,9,1,0,0$0,98,0,15,5,5,5,5,5,5,5,5,5,5,20,12,12,12,12,11,0,17,18,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5
5,5,5,5,5,5,5,9,0,0,0,0,14,19,5,5,5,5,5,5,5,5,5,5,5,5,21,6,6,8,0,0,15,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5
5,5,5,5,5,5,21,8,0,0,1,14,19,5,5,5,5,5,5,5,5,5,5,5,5,21,8,0,1,0:28,0:28,0:28,15,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5
6,6,6,6,6,6,8,1,0,0,0,15,5,5,5,5,5,5,5,5,5,5,5,5,5,9,0,0,0,0,0,0,15,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5
0,0,0,0,0,0,98,0,0,0,14,19,5,5,5,5,5,5,5,5,5,5,5,5,21,8,0,0,0,0$5,0,98,15,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5
0,0,0,0,0v<^>,0,0,0,0,0,15,5,5,5,5,5,5,5,5,5,5,5,5,21,8,0,0,0,0,0,0,0,15,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5
0,0,0,1,0,0,0,0,1,14,19,5,5,5,5,5,5,5,5,5,5,5,21,8,0,98,0,0,0,0,0,0,15,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5
12,12,12,12,12,12,12,12,12,19,5,5,5,5,5,5,5,5,5,5,5,5,9,0,0,0,0,0,1,0,0,0,15,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5
5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,9,0,0,0,0,0,0,0,0,14,19,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5
5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,9,0,0,0,0,0,0,98,0,15,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5
5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,9,0,0,0,0,0,0,0,14,19,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5
5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,21,8,98,0,0,0,0,0,0,15,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5
5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,21,8,0,0,0,0,0,0,0,14,19,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5
5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,21,6,8,0,0,0,0,0,0,1,0,15,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5
5,5,5,5,5,5,5,5,5,5,5,5,5,5,21,6,6,6,8,101@1@2,0,0,0,0,0,0,0,0,14,19,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5
5,5,5,5,5,5,5,5,5,5,5,5,5,21,8,0,101@3@10@11@12,0,98,0,0,0,0,0,0,0,98,0,15,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5
5,5,5,5,5,5,5,5,5,5,21,6,18,9,101@4@5,0,1,1,0$9,0,0,0,0,1,0,0,0,1,15,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5
6,6,6,6,6,6,6,6,6,6,8,0,16,10,0,0:0&9,0,0,0,1,1,0,0,14,12,12,12,12,19,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5
0,0,0,0,0,0,0,0,0,0,0,0,15,9,101@6@7,107!0,101@8,98,0,1,101@9,0,0,15,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5
12,12,12,12,12,12,12,12,12,12,12,12,19,20,12,12,12,12,12,12,12,12,12,19,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5
5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5
5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5
5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5
5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5
5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5
5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5
5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5
5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5
5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5

View File

@@ -0,0 +1,224 @@
@once-give-spec-item = 0
sdf 3, 0
msg 0, -1, -1
pic 0, 4
ex1 2, 0, -1
ex2 -1, -1, -1
goto 1
@inc-sdf = 1
sdf 1, 4
msg -1, -1, -1
pic 0, 4
ex1 1, 0, -1
ex2 -1, -1, -1
goto -1
@once-dlog = 2
sdf -1, -1
msg 1, -1, 1
pic 19, 4
ex1 -1, -1, -1
ex2 -1, -1, -1
goto 3
@force-give = 3
sdf -1, -1
msg -1, -1, -1
pic 0, 4
ex1 25, -1, -1
ex2 -1, -1, -1
goto -1
@if-monsters-alive = 4
sdf -1, -1
msg -1, -1, -1
pic 0, 4
ex1 0, -1, -1
ex2 1, -1, -1
goto 16
@once-dlog = 5
sdf -1, -1
msg 7, -1, 1
pic 60, 3
ex1 -1, -1, -1
ex2 -1, -1, -1
goto 6
@set-ptr = 6
sdf 3, 1
msg -1, -1, -1
pic 0, 4
ex1 103, -1, -1
ex2 -1, -1, -1
goto 19
@if-alive = 7
sdf -1, -1
msg -1, -1, -1
pic 0, 4
ex1 0, 8, -1
ex2 -1, -1, -1
goto 21
@set-sdf = 8
sdf 3, 1
msg -1, -1, -1
pic 0, 4
ex1 13, -1, -1
ex2 -1, -1, -1
goto 10
@set-sdf = 9
sdf 3, 1
msg -1, -1, -1
pic 0, 4
ex1 14, -1, -1
ex2 -1, -1, -1
goto 11
@disp-msg = 10
sdf -1, -1
msg 15, -103, -1
pic 0, 4
ex1 -1, -1, -1
ex2 -1, -1, -1
goto -1
@select-pc = 11
sdf -1, -1
msg -1, -1, -1
pic 0, 4
ex1 0, -1, -1
ex2 1, -1, -1
goto 12
@death = 12
sdf -1, -1
msg -1, -1, -1
pic 0, 4
ex1 0, 1, -1
ex2 -1, -1, -1
goto 10
@call-global = 13
sdf -1, -1
msg -1, -1, -1
pic 0, 4
ex1 -1, -1, -1
ex2 -1, -1, -1
goto 3
@call-global = 14
sdf -1, -1
msg -1, -1, -1
pic 0, 4
ex1 -1, -1, -1
ex2 -1, -1, -1
goto 4
@call-global = 15
sdf -1, -1
msg -1, -1, -1
pic 0, 4
ex1 -1, -1, -1
ex2 -1, -1, -1
goto 5
@if-sdf = 16
sdf 3, 1
msg -1, -1, -1
pic 0, 4
ex1 1, 30, -1
ex2 -1, -1, -1
goto 5
@disp-msg = 17
sdf -1, -1
msg 16, -1, -1
pic 0, 4
ex1 -1, -1, -1
ex2 -1, -1, -1
goto -1
@select-pc = 18
sdf -1, -1
msg -1, -1, -1
pic 0, 4
ex1 1, -1, -1
ex2 2, -104, -1
goto 7
@set-ptr = 19
sdf 3, 5
msg -1, -1, -1
pic 0, 4
ex1 104, -1, -1
ex2 -1, -1, -1
goto 18
@nop = 20
sdf -1, -1
msg -1, -1, -1
pic 0, 4
ex1 -1, -1, -1
ex2 -1, -1, -1
goto -1
@inc-sdf = 21
sdf 3, 5
msg -1, -1, -1
pic 0, 4
ex1 1, 0, -1
ex2 -1, -1, -1
goto 22
@if-sdf = 22
sdf 3, 5
msg -1, -1, -1
pic 0, 4
ex1 6, 9, -1
ex2 -1, -1, -1
goto 18
@block-move = 23
sdf -1, -1
msg 17, -1, -1
pic 0, 4
ex1 1, -1, -1
ex2 -1, -1, -1
goto 24
@destroy-monst = 24
sdf -1, -1
msg -1, -1, -1
pic 0, 4
ex1 29, 18, -1
ex2 -1, -1, -1
goto 25
@destroy-monst = 25
sdf -1, -1
msg -1, -1, -1
pic 0, 4
ex1 28, 18, -1
ex2 -1, -1, -1
goto 29
@select-pc = 26
sdf -1, -1
msg -1, -1, -1
pic 0, 4
ex1 2, -1, -1
ex2 -1, -1, -1
goto 27
@skill-pts = 27
sdf -1, -1
msg 18, 19, -1
pic 0, 4
ex1 10, 0, -1
ex2 -1, -1, -1
goto 31
@if-sdf = 28
sdf 3, 6
msg -1, -1, -1
pic 0, 4
ex1 1, -1, -1
ex2 -1, -1, -1
goto 26
@set-sdf = 29
sdf 3, 7
msg -1, -1, -1
pic 0, 4
ex1 -1, -1, -1
ex2 -1, -1, -1
goto -1
@if-sdf = 30
sdf 3, 7
msg -1, -1, -1
pic 0, 4
ex1 1, -1, -1
ex2 -1, -1, -1
goto 17
@set-sdf = 31
sdf 3, 6
msg -1, -1, -1
pic 0, 4
ex1 1, -1, -1
ex2 -1, -1, -1
goto -1

View File

@@ -0,0 +1,186 @@
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<town boes="2.0.0">
<size>48</size>
<name>Lake Tower</name>
<comment>Comment 1</comment>
<comment>Comment 2</comment>
<comment>Comment 3</comment>
<bounds top="3" left="3" bottom="44" right="44" />
<difficulty>0</difficulty>
<lighting>dark</lighting>
<onenter condition="alive">2</onenter>
<flags>
<chop kills="30000" />
</flags>
<item id="0">
<type>0</type>
<charges>1500</charges>
<contained>true</contained>
</item>
<item id="1">
<type>261</type>
<contained>true</contained>
</item>
<item id="2">
<type>262</type>
<contained>true</contained>
</item>
<item id="3">
<type>201</type>
<contained>true</contained>
</item>
<item id="4">
<type>103</type>
<contained>true</contained>
</item>
<item id="5">
<type>115</type>
<contained>true</contained>
</item>
<item id="6">
<type>96</type>
<contained>true</contained>
</item>
<item id="7">
<type>51</type>
<contained>true</contained>
</item>
<item id="8">
<type>122</type>
<contained>true</contained>
</item>
<item id="9">
<type>245</type>
<contained>true</contained>
</item>
<item id="10">
<type>3</type>
<charges>4</charges>
<contained>true</contained>
</item>
<item id="11">
<type>1</type>
<charges>6</charges>
<contained>true</contained>
</item>
<item id="12">
<type>2</type>
<charges>5</charges>
<contained>true</contained>
</item>
<creature id="0">
<type>84</type>
<attitude>hostile-a</attitude>
<mobility>1</mobility>
<personality>-1</personality>
<face>0</face>
<onkill>13</onkill>
</creature>
<creature id="1">
<type>60</type>
<attitude>hostile-a</attitude>
<mobility>1</mobility>
<personality>-1</personality>
<face>0</face>
<onkill>14</onkill>
</creature>
<creature id="2">
<type>63</type>
<attitude>hostile-a</attitude>
<mobility>1</mobility>
<personality>-1</personality>
<face>0</face>
<onkill>15</onkill>
</creature>
<creature id="3">
<type>67</type>
<attitude>docile</attitude>
<mobility>0</mobility>
<personality>30</personality>
<face>21</face>
</creature>
<creature id="4">
<type>22</type>
<attitude>docile</attitude>
<mobility>0</mobility>
<personality>31</personality>
<face>41</face>
</creature>
<creature id="5">
<type>15</type>
<attitude>docile</attitude>
<mobility>0</mobility>
<personality>32</personality>
<face>12</face>
</creature>
<creature id="6">
<type>82</type>
<attitude>hostile-a</attitude>
<mobility>1</mobility>
<personality>-1</personality>
<face>0</face>
</creature>
<creature id="7">
<type>82</type>
<attitude>hostile-a</attitude>
<mobility>1</mobility>
<personality>-1</personality>
<face>0</face>
</creature>
<creature id="8">
<type>82</type>
<attitude>hostile-a</attitude>
<mobility>1</mobility>
<personality>-1</personality>
<face>0</face>
</creature>
<creature id="9">
<type>2</type>
<attitude>docile</attitude>
<mobility>0</mobility>
<personality>33</personality>
<face>8</face>
</creature>
<sign id="0">
<![CDATA[Remember to check often for secret doors and passages! (There might be a shortcut to get out of here.)]]>
</sign>
<string id="0">
<![CDATA[You found the last piece of the artifact! All that's left now is to return to the very first tower and cross the rune to get to the exit portal.]]>
</string>
<string id="1">
<![CDATA[When you enter the last tower, you find only a stairway spiraling down, down, and down. Eventually the walls give way to raw cave stone, and nothing lights your way.]]>
</string>
<string id="2">
<![CDATA[Searching through your pack, with great luck, you find some torches! To use a torch, click the 'U' button next to it in the items panel.]]>
</string>
<string id="3">
<![CDATA[Adrianna and Feodoric can also both cast the mage spell 'Light', another way to help you see where you're going.]]>
</string>
<string id="4">
<![CDATA[Alternatively, you might choose to keep the lights off! Harder for the monsters to see you, that way.]]>
</string>
<string id="7">
<![CDATA[Your path is blocked by a priest, and Death itself.]]>
</string>
<string id="13">
<![CDATA["I see you have lost someone! I'm here to explain the intricacies of your situation."]]>
</string>
<string id="14">
<![CDATA["Congratulations on getting this far without suffering loss! However, it's time for a lesson in mortality."]]>
</string>
<string id="15">
<![CDATA[Death points its finger at you.]]>
</string>
<string id="16">
<![CDATA["We'll get out of your way after we get all your people breathing again."]]>
</string>
<string id="17">
<![CDATA[Death and its ironic companion leave you, opening the way.]]>
</string>
<string id="18">
<![CDATA[Around the corner is another person trying to teach you something. This time, it's a trainer!]]>
</string>
<string id="19">
<![CDATA[Here are some free skill points. Try talking to them.]]>
</string>
</town>

View File

@@ -27,6 +27,9 @@
<intro-msg>
<![CDATA[You've just stayed the night in your room at the fort, and have had a good night's sleep and a good meal. Time to go out and be heroes!]]>
</intro-msg>
<first-time-help-extra>
<![CDATA[For now, you should get equipment, explore this fort, and get your orders. Press the hand button (or type 'g') to pick up the nearby items.]]>
</first-time-help-extra>
</text>
<ratings>
<content>G</content>

View File

@@ -90,16 +90,6 @@
<item id="19">
<type>155</type>
</item>
<item id="20">
<type>-1</type>
<always>true</always>
<property>true</property>
</item>
<item id="21">
<type>-1</type>
<always>true</always>
<property>true</property>
</item>
<item id="22">
<type>20</type>
<contained>true</contained>
@@ -213,10 +203,6 @@
<item id="50">
<type>171</type>
</item>
<item id="51">
<type>-1</type>
<property>true</property>
</item>
<item id="52">
<type>165</type>
<property>true</property>

View File

@@ -226,24 +226,15 @@
<item id="55">
<type>11</type>
</item>
<item id="56">
<type>-1</type>
</item>
<item id="57">
<type>10</type>
</item>
<item id="58">
<type>-1</type>
</item>
<item id="59">
<type>11</type>
</item>
<item id="60">
<type>9</type>
</item>
<item id="61">
<type>-1</type>
</item>
<item id="62">
<type>12</type>
</item>

View File

@@ -33,6 +33,9 @@
<intro-msg>
<![CDATA[She will tell you what your mission is, should you choose to accept it. All you know is that the stakes are incredibly high, and time is of the essence ...]]>
</intro-msg>
<first-time-help-extra>
<![CDATA[For now, you should explore this fort, and get your orders.]]>
</first-time-help-extra>
</text>
<ratings>
<content>G</content>

View File

@@ -50,6 +50,7 @@
<xs:element name="teaser" minOccurs="0" maxOccurs="2" type="xs:string"/>
<xs:element name="icon" type="scenIcon" minOccurs="0"/>
<xs:element name="intro-msg" minOccurs="0" maxOccurs="6" type="xs:string"/>
<xs:element name="first-time-help-extra" minOccurs="0" type="xs:string"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="ratings">

View File

@@ -1,11 +1,11 @@
Welcome to Blades of Exile. These windows will pop up occasionally to explain what is going on. If they annoy you, they can be turned off in the Preferences screen (access from Options menu).
In general, you can get help by clicking on the '?' buttons or typing '?'. For now, you should get equipment, explore this fort, and get your orders. Press the hand buttons (or type 'g') to pick up the nearby items.
Welcome to Blades of Exile. These windows will pop up occasionally to explain what is going on. If they annoy you, they can be turned off in the Preferences screen (access from the {which-menu} menu).
In general, you can get help by clicking on the '?' buttons or typing '?'. {scen-extra}
Everyone responds to 'Look', 'Name', and 'Job' (use the buttons at the bottom). To ask about something people mention, click on the word (click on 'Demon' to ask about demons). Certain people respond to 'Buy' and 'Sell', which puts you in shopping mode.
Shortcuts: To get previous response, press the Back button (or hit space). You can press any of the bottom buttons by typing the first letter in the word. Hit Record to write notes in journal, and hit Bye (or type Escape) to stop talking.
Shortcuts: To get previous response, press the Back button (or hit space). You can press any of the bottom buttons by typing the first letter in the word. Hit Record to write notes in journal, and hit Done (or type Escape) to stop talking.
To cast a spell, first click on the number of the person to cast (to the upper left). Then click on the button by the spell to cast (hit Space to see other spells). Finally, if it's a spell cast on a party member, click on the correct Target button.
Shortcut: Typing the letter after a spell picks the spell, and typing '1'-'6' picks a caster. Option clicking a spell button brings up a spell description. Finally, you can often cast spells faster using the Mage Spells and Priest spells menus.
Shortcut: Typing the letter before a spell picks the spell (case-sensitive), and typing '1'-'6' picks a caster. Option clicking a spell button brings up a spell description. Finally, you can often cast spells faster using the Mage Spells and Priest spells menus.
This menu always contains all the spells an active PC can cast. Click on the name of a PC to make them active. Then select a spell from this menu to cast. Then, if you need to pick someone to cast the spell on, a window will come up for you to do so.
This is where you improve a character's skills when creating or training them. Press the '+' button to buy a skill, and the '-' button to undo the choice. The Cancel button undoes your work, and Keep keeps your choices.
Option-click the buttons by a skill to get a description of the skill and advice on how much to buy. When training a character, you need both gold and skill points (which you get by killing things and getting experience).
@@ -59,7 +59,7 @@ You've just written what this special encounter says down in your adventure jour
One of your characters has just been cursed. That character will function worse in combat, be hit more easily, and take more damage from blows for a while. Curses wear off fairly quickly.
You have mounted a horse. A horse doubles your speed when moving outdoors: you'll spend much less time moving from town to town and will have an easier time evading monsters. To dismount, pause (by clicking on your party or hitting '5' on the keypad).
You have just boarded a boat. Steer the boat onto land to get out. Certain boats can pass over lava. When using a boat outdoors, you can enter towns on the shore by steering the boat into them.
This command bring up a map of the area you're in. Generally, maps of dungeons and the outdoors will be remembered. However, if a town undergoes some sort of major change, you'll lose your map for that town.
This command brings up a map of the area you're in. Generally, maps of dungeons and the outdoors will be remembered. However, if a town undergoes some sort of major change, you'll lose your map for that town.
Your health is a measure of how much punishment you can take before dying - the more the better. Whenever you get hit, you lose some health. Taking damage when your health is down to 0 will kill you.
Your spell points are what you expend to cast spells. Each spell drains away some of your spell points. Time and rest restore them. When creating a character, you get 3 bonus spell points for every level of Mage and Priest Spells skill you buy.
Some doors can't be opened no matter what you try. For example, portcullises can almost never be opened by picking locks or bashing.
@@ -68,12 +68,12 @@ This character will, for a fee, recharge some of your items whose charges have b
A special node just triggered, and since you previously enabled it, you are now in step-through mode. Take a look at the transcript - it gives you the node that is about to execute, together with the type and number (useful if you need to locate it in the editor).
To execute that node, simply press any key (or click the mouse button). After the node has executed, if it calls another one, you will see it in the transcript. Keep pressing a key to step through the nodes. If you wish to exit step-through mode in the middle of a node sequence, simply press Escape.
One of your characters has just died. Their items will be dropped where they were standing and you will be unable to use any of their abilities. You may want to reload an earlier save, or delete this character and make a new one—but there are other options to reverse this unfortunate condition.
If you find a healer, they may be able to bring this character back to life for a hefty price. At higher levels, your priests may also cast 'Raise Dead.' At low levels, death is a very big deal.
One of your characters has just been turned to stone. Their items will be dropped where they were standing and you will be unable to use any of their abilities. You may want to reload an earlier save, or delete this character and make a new one—but there are other options to reverse this unfortunate condition.
If you find a healer, they may be able to un-petrify this character—at a reasonable price. At higher levels, your priests may also cast 'Destone.'
One of your characters has just been turned to dust. Their items will be dropped where they were standing and you will be unable to use any of their abilities. You may want to reload an earlier save, or delete this character and make a new one—but there are other options to reverse this unfortunate condition.
If you find a healer, they may be able to resurrect this character—at an enormous price. At higher levels, your priests may also cast 'Resurrection.' At low levels, you probably can't afford to save a dusted character.

View File

@@ -5,7 +5,7 @@ Makes the selected PC more skilled for a short time. Works like the priest spell
Decreases the morale of the victim. Casting this on a weak foe will make the foe flee. Even if the monster doesn't flee, later castings have a higher chance of success.
This spell fills the selected space with a short-lasting wall of fire.
This draining spell identifies all the unidentified items being held by your characters.
This spell is cast during combat. When cast, you receive information about the monster you target: current health, spell points, morale, etc.
This spell is cast during combat. When cast, you receive information about the monster you target: current health, resistances, spell points, morale, etc.
This spell covers the target with sticky goo, slowing it down and interfering with its attacks.
This spell lets you see everything in a short radius around you, even spaces blocked off by walls. It's useful for finding secret passages, for example.
Poisons the target creature. This does a fair amount of damage, but it takes time to happen.

View File

@@ -13,4 +13,8 @@ Missile
Dialog Icon (large)
Scenario Icon (large)
Terrain Map Icon
Status Icon
Status Icon
Vehicle
Vehicle (Occupied)

View File

@@ -158,7 +158,7 @@ if-num-response
if-boat
if-horse
if-quest
if-monsters-alive

View File

@@ -110,7 +110,7 @@ Unused
Unused
PC Status
0 - raise dead, 1 - hurt
Unused
0 - no saving throw, 1 - saving throw allowed
Unused
Unused
Unused

View File

@@ -415,7 +415,7 @@ Unused
Unused
Unused
Number of large (full-sheet) pic to display
Unused
Number of small icon to display (-1: a map)
Unused
Unused
Unused

View File

@@ -397,14 +397,14 @@ Unused
Unused
Unused
Unused
If the party has this much of the stat ...
If the party/current PC has this much of the stat ...
Call this special ...
Unused
Which statistic
Check mode
Unused
Otherwise call this special
Result depends on whether a particular skill in the party is high enough.
Result depends on whether a particular skill in the party or current PC is high enough.
--------------------
Text Response?
Unused
@@ -525,3 +525,19 @@ Unused
Otherwise call this special
Result depends on the status of a quest.
--------------------
If Monster(s) Alive?
Unused
Unused
Unused
Unused
Unused
Unused
Unused
First monster
Last monster
Specific attitude?
If at least this many are alive ...
Call this special ...
Unused
Otherwise call this special
Result depends on how many monsters within the given range of townpeople are alive and present.

View File

@@ -6,8 +6,8 @@ Second part of message
Unused
Unused
Unused
First monster to affect (negative counts back from last)
Last monster to affect (negative counts back from last)
First monster
Last monster
Unused
New Attitude
Unused
@@ -299,7 +299,7 @@ X coordinate to go to
Y coordinate to go to
Unused
Number of town to place party in
What text? (0 - up, 1 - down)
What text? (0 - up, 1 - down, 8+ - instant)
Trigger Limitations
Special to Call in New Town
A dialog box comes up saying the party has found a stairway, and asking if they want to climb it. 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.

View File

@@ -37,7 +37,7 @@ Human is the default species in Blades of Exile. Humans have skins of a variety
Nephilim
The Nephilim are a race of feline humanoids. Once common on the surface world, they have been hunted to near extinction, although some now remain in Exile. Nephilim characters start with better dexterity, and are much better at using missile weapons.
Slithzerikai
The Slithzerikai (sliths for short) are a race of lizard men, both strong and smart. Once unknown on the surface world, they are starting to appear there. Slith characters get bonuses to strength and intelligence, and are better at using pole weapons.
The Slithzerikai (sliths for short) are a race of humanoid lizards, both strong and smart. Once unknown on the surface world, they are starting to appear there. Slith characters get bonuses to strength and intelligence, and are better at using pole weapons.
Vahnatai
The Vahnatai are a frail and spindly yet intelligent subterranean race. They get a penalty to strength and can't carry as much, but also receive a bonus to intelligence and are better at casting mage spells.
Reptile

View File

@@ -63,8 +63,8 @@ cThreeChoice::cThreeChoice
if(j < 0) buttonDefs[i++] = null_btn;
else buttonDefs[i++] = basic_buttons[j];
}
init_buttons(buttonDefs[0], buttonDefs[1], buttonDefs[2]);
init_pict(pic);
init_buttons(buttonDefs[0], buttonDefs[1], buttonDefs[2]);
parentDlog.recalcRect();
}
@@ -155,6 +155,13 @@ void cThreeChoice::init_buttons(cBasicButtonType btn1, cBasicButtonType btn2, cB
me->add(btn, cur_btn_rect, sout.str());
cur_btn_rect.right = cur_btn_rect.left - 4;
}
// Add a record button and hide it
cButton* record = new cButton(*me);
record->setText("Record");
record->attachClickHandler(std::bind(&cThreeChoice::onRecord, this, _2));
cur_btn_rect = {buttons_top,10,buttons_top + 23,buttons_right};
me->add(record, cur_btn_rect, "record");
record->hide();
}
void cThreeChoice::init_pict(pic_num_t pic){
@@ -164,6 +171,7 @@ void cThreeChoice::init_pict(pic_num_t pic){
pic_ctrl->setPict(pic,type);
pic_ctrl->recalcRect();
me->add(pic_ctrl, pic_ctrl->getBounds(), "pict");
buttons_top = max(buttons_top, pic_ctrl->getBounds().bottom + 8);
}
std::string cThreeChoice::show(){
@@ -174,7 +182,7 @@ std::string cThreeChoice::show(){
return "**ERROR**"; // shouldn't be reached
}
short custom_choice_dialog(std::array<std::string, 6>& strs,short pic_num,ePicType pic_type,std::array<short, 3>& buttons,bool anim_pict,short anim_loops, int anim_fps, cDialog* parent) {
short custom_choice_dialog(std::array<std::string, 6>& strs,short pic_num,ePicType pic_type,std::array<short, 3>& buttons,bool anim_pict,short anim_loops, int anim_fps, cUniverse* univ, cDialog* parent) {
set_cursor(sword_curs);
std::vector<std::string> vec(strs.begin(), strs.end());
@@ -185,6 +193,28 @@ short custom_choice_dialog(std::array<std::string, 6>& strs,short pic_num,ePicTy
if(anim_pict)
setup_dialog_pict_anim(*(customDialog.operator->()), "pict", anim_loops, anim_fps);
if(univ != nullptr){
customDialog.setRecordHandler([vec, univ](cDialog& dlg) -> void {
std::string combined;
for(std::string msg : vec){
if(!msg.empty()){
if(!combined.empty()){
combined += " ||";
}
combined += msg;
}
}
// It's not necessarily a NOTE_SCEN and location shouldn't be empty,
// but these things aren't actually shown to the party in the encounter notes dialog.
if(univ->party.record(NOTE_SCEN, combined, "")){
give_help(58,0,dlg);
// TODO ASB is only in game source, but this function is in common source so the scenario editor can preview dialogs :(
/*
add_string_to_buf("Added to encounter notes.");
*/
}
});
}
std::string item_hit = customDialog.show();
for(int i = 0; i < 3; i++) {
@@ -195,14 +225,18 @@ short custom_choice_dialog(std::array<std::string, 6>& strs,short pic_num,ePicTy
return -1;
}
short once_dialog(cUniverse& univ, cSpecial& spec, eSpecCtxType cur_type, cDialog* parent) {
short once_dialog(cUniverse& univ, cSpecial& spec, eSpecCtxType cur_type, std::array<short, 3> buttons, cDialog* parent) {
std::array<std::string, 6> strs;
std::array<short, 3> buttons = {-1,-1,-1};
if(spec.m1 < 0)
return -1;
univ.get_strs(strs, cur_type, spec.m1);
return custom_choice_dialog(strs, spec.pic, ePicType(spec.pictype), buttons, true, spec.ex1c, spec.ex2c, &univ, parent);
}
short once_dialog(cUniverse& univ, cSpecial& spec, eSpecCtxType cur_type, cDialog* parent) {
std::array<short, 3> buttons = {-1,-1,-1};
if(spec.m3 > 0) {
// The first button defaults to OK if toggle is on
buttons[0] = 1;
@@ -220,5 +254,23 @@ short once_dialog(cUniverse& univ, cSpecial& spec, eSpecCtxType cur_type, cDialo
showError("Dialog box ended up with no buttons.");
return -1;
}
return custom_choice_dialog(strs, spec.pic, ePicType(spec.pictype), buttons, true, spec.ex1c, spec.ex2c, parent);
return once_dialog(univ, spec, cur_type, buttons, parent);
}
cThreeChoice& cThreeChoice::setRecordHandler(record_callback_t rec){
if(rec == nullptr){
hasRecord = false;
dlg["record"].hide();
}else{
hasRecord = true;
rec_f = rec;
dlg["record"].show();
}
return *this;
}
bool cThreeChoice::onRecord(std::string id){
if(hasRecord) rec_f(dlg);
else dlg[id].hide();
return hasRecord;
}

View File

@@ -37,6 +37,9 @@ namespace {cBasicButtonType null_btn = boost::none;}
extern bbtt basic_buttons[71];
#endif
/// The signature of a record handler for cThreeChoice.
typedef std::function<void(cDialog&)> record_callback_t;
/// A choice dialog with several strings and up to three buttons.
/// This is the class used for dialogs generated by special nodes.
/// It generates the dialog dynamically from the given input.
@@ -48,6 +51,9 @@ class cThreeChoice : public cChoiceDlog {
void init_buttons(cBasicButtonType btn1, cBasicButtonType btn2, cBasicButtonType btn3);
void init_pict(pic_num_t pic);
const ePicType type;
record_callback_t rec_f;
bool hasRecord;
bool onRecord(std::string id);
public:
/// Create a dialog with just one button.
/// @param strings A list of the strings to place in the dialog.
@@ -70,12 +76,22 @@ public:
/// @param t The type of the icon.
/// @param parent Optionally, a parent dialog.
cThreeChoice(std::vector<std::string>& strings, std::array<short, 3>& buttons, pic_num_t pic, ePicType t, cDialog* parent = nullptr);
/// Set a record handler.
/// @param rec The handler.
/// @return This object, for method-call chaining.
/// @note Only one record handler can be set at a time. To remove it, set it to null.
/// @note The presence of the Record button is determined entirely by the presence of a record handler.
///
/// A record handler should take one parameter, which is a reference to the dialog.
/// (That's the cDialog, not the cThreeChoice.) It should return void.
cThreeChoice& setRecordHandler(record_callback_t rec);
/// @copydoc cChoiceDlog::show()
/// @note The unique key in this case is the label specified in the button specification.
std::string show();
};
short custom_choice_dialog(std::array<std::string, 6>& strs,short pic_num,ePicType pic_type,std::array<short, 3>& buttons, bool anim_pict = false, short anim_loops = -1, int anim_fps = -1, cDialog* parent = nullptr);
short custom_choice_dialog(std::array<std::string, 6>& strs,short pic_num,ePicType pic_type,std::array<short, 3>& buttons, bool anim_pict = false, short anim_loops = -1, int anim_fps = -1, cUniverse* univ = nullptr, cDialog* parent = nullptr);
short once_dialog(cUniverse& univ, cSpecial& spec, eSpecCtxType cur_type, std::array<short, 3> buttons, cDialog* parent = nullptr);
short once_dialog(cUniverse& univ, cSpecial& spec, eSpecCtxType cur_type, cDialog* parent = nullptr);
#endif

Some files were not shown because too many files have changed in this diff Show More