Commit Graph

96 Commits

Author SHA1 Message Date
fb1f97e2f1 Preset town fields now use the field type enum 2014-12-22 22:46:30 -05:00
c768b2557c More operator= -> append for legacy data conversion 2014-12-22 22:17:23 -05:00
6499923ab5 Fix preset fields (and special spots) not appearing 2014-12-22 18:37:59 -05:00
e54c67aaa1 DialogXML header extensions -> .hpp 2014-12-22 09:52:58 -05:00
317a01afa1 Look up saved talk/encounter strings when loading a legacy savegame 2014-12-22 09:29:01 -05:00
4b96f579b7 Embark on an epic journey to make both the game and the two editors load the entire scenario into memory.
Some other tweaks and fixes got pulled in along the way.
Details:
- Improved const-correctness
- The scenario is now part of the universe, so now there's no global scenario object in the game or the PC editor. (Of course, the scenario editor has no universe, so it still has a global scenario object.)
- Towns and outdoors now store a reference to the scenario; the party, current town, and current outdoors store a reference to the universe. Altogether this means that the data module has no need for global scenario or universe objects.
- The fileio routines now take a scenario or universe reference as a parameter, so they don't need the global scenario or universe objects either.
- cCurOut now has an arrow operator for accessing the current outdoor section, instead of a 2x2 subset of the outdoors; this replaces using i_w_c to index the 2x2 subset. (And it's much less verbose!)
- cCurTown no longer stores a pointer to the town record, since it can simply access it through the universe instance which it stores a reference to.
- Tweaked how the monster roster menu works (it now caches up to 60 monsters)
- The operator= functions that convert from legacy to new scenario/save format are now ordinary functions rather than operators.
- The bizarre use of assigning a cCreature to itself to populate certain fields has been nuked.
- When at the corner of an outdoor sector, the scenario editor now shows the cornermost terrain in the diagonally adjacent sector.
- There was a missing check to prevent horses entering dangerous terrain (eg, swamp) while in town.
- Fix cancelling load party dialog causing a party to appear
2014-12-22 00:20:37 -05:00
2a2326035e Fix up all the mini-map stuff!
- Preset animated graphics now start at 960 instead of 400, due to all the new preset terrains from the previous commit running into their range.
- Tore out some optimization in the automap drawing, because it made it harder to figure out why it wasn't working
- Both game and editor now use the larger 12x12 map graphics, and fall back to shrinking down the 28x36 terrain graphic if no map graphic is set
- Upon loading an old scenario, map graphic is automatically set the same as the main graphic if it's a preset graphic; for custom graphics it's set to none
- Scenario now has three zoom levels for mini-map - the original in which the entire town is visible, a slightly closer one that matches the in-game view, and a large one using the 12x12 map graphics at full size.
- Fix some map patterns having the wrong bounding rect
- Graphics (and sounds) now included in the project by folder reference, so that I don't need to manually every new sheet to the project
2014-12-18 01:38:22 -05:00
8bb96396a5 Remove the RECT typedef for my custom rectangle class 2014-12-17 00:30:02 -05:00
2ef6d01ec7 Update spell data
- Fireball mistakenly required you to select a PC target while Haste did not.
- Forgot the two special monster priest spells
- Changed display name of ICE_WALL_BALL
2014-12-16 18:40:54 -05:00
6866bf70c5 Fix special spots not being properly cleared from the previous town
(And get rid of the old forwarder functions for the field bitfields.)
2014-12-16 18:18:58 -05:00
58c34423ac Rearrange field types enum and use it when setting fields on a space 2014-12-16 17:33:28 -05:00
d88ace968f Use the spell enum for monster spells
- Enemy priests now cast Goo instead of Stumble; this was changed to match the effect of the spell.
- Enemy priests now cast Minor Heal instead of Light Heal; this is merely a name change to match the equivalent PC spell.
- PCs now cast Bless All instead of Bless Party; this is merely a name change to match the equivalent monster spell.
2014-12-16 14:45:32 -05:00
65c6919b1d Organize talking strings rather than stuffing them all in one big array
(Note: This seems to break recording talking/encounter strings.)
2014-12-15 20:06:08 -05:00
c6d960d078 Remove the string forwarders that were introduced to allow use of the original string indices
(A few things might be broken, probably just related to recording talk/encounter notes.)
2014-12-15 13:55:00 -05:00
c90afdc013 Move Wand of Pyhrrus spell into main combat cast routine. 2014-12-15 11:16:45 -05:00
d7d08cbaa3 Mass reformatting (space after keywords) 2014-12-15 10:09:23 -05:00
02478da9d7 Lots of TODO comments, some noting things related to the Windows version 2014-12-15 08:46:47 -05:00
1ad2cf85ac Fix typo 2014-12-15 08:46:46 -05:00
fbe186f8b7 Stuff about force cages, stone blocks, move mountains
- Add all objects, fields, and sfx to place_spell_pattern
- Add move mountains effect to place_spell_pattern
- Most of the implementation for force cages and stone blocks is now done (still untested)
- Properly implement MOVE_MOUNTAINS_MASS spell
2014-12-15 08:46:44 -05:00
c8889a9989 Prevent party from getting a victory dialog if they die during special node processing in a chain that contains an end scenario node 2014-12-15 08:46:43 -05:00
0344cf2525 Introduce a spell enum, and use it everywhere for PC spellcasting
- Monster spellcasting is untouched
- Also updated the spells documentation, which had some old information from Exile III and omitted a lot of ranges.
2014-12-15 08:46:43 -05:00
1fbf8939b2 Move per-PC combat data into cPlayer class 2014-12-14 02:51:16 -05:00
a198c232bb Strictify skill enum 2014-12-14 02:51:01 -05:00
1200ff47d4 Strictify item ability enum 2014-12-12 15:18:43 -05:00
90bcdb9062 Fix typo 2014-12-12 13:31:04 -05:00
db2a7aa99b Strictify trait enum 2014-12-12 13:30:56 -05:00
aabade3b85 Attempt to convert scenarios that used specials on boatable terrains, by inserting a "boat block" special in the front of each such chain
- This commit also introduces "boat block" and "horse block" specials as part of the IF_CONTEXT special node type.
2014-12-12 10:46:52 -05:00
5bfdb5eafa Misc little bits of housekeeping and stuff 2014-12-11 01:51:22 -05:00
e2bd88daaa Restore age-checking in queued specials 2014-12-11 01:48:35 -05:00
ae09fc518f Add a few item graphics 2014-12-11 01:36:31 -05:00
a780119030 Expand If Statistic node to allow checking hp, sp, xp, skill points, etc
(Adapted from Windows code)
2014-12-11 01:36:30 -05:00
c0110adb40 New special nodes:
- Town set attitude for affecting single creature, adapted from Windows code; technically redundant, but maybe handy
- If numeric response
- Print nums (for debugging)
- SDF arithmetic - add, subtract, multiply, divide, exponentiate
- Store random to SDF (adapted from Windows code)
- Display picture (inspired by Windows code, but the implementation is completely different and totally incompatible)
2014-12-11 01:36:22 -05:00
004b6d1ace Various field/belt related stuff
- Remove all field booleans except quickfire and belt, which have been moved to cCurTown
- Alter and extend place_spell_pattern, to allow arbitrary damage types and to make it more clear in the code what's happening when it's called
- Delete fields.cpp file; a few things moved to locutils.cpp, but most are now part of cCurTown
- set_terrain function automatically updates belt present boolean if setting to a conveyor.
2014-12-11 00:46:28 -05:00
869ca7b2d7 Clean up, fix, and tweak the spellcasting dialog
- Includes new status effect images for the forcecage and for hypothetical inverses of dumbfound and magic resistance, as well as icons for the whole-party statuses.
2014-12-11 00:15:05 -05:00
5249c6eef7 Add a lot of stuff scraped from *i's version of the code, plus a couple of additional bits.
Adapted from *i:
- Show a confirm dialog when interrupting a special node sequence
- New monster special ability: call global special node (as an action, not on death)
- New item special ability: call global special node
- Check there's a monster death special before calling it (wasn't necessary before, might be now with the special queue changes)
- Queue specials that are triggered while another special is in progress, instead of ignoring them; they will be run after the current special in progress finishes.
- *i's version of petrification touch is currently active only for monster-on-monster combat; need to merge with my version for monster-on-pc combat.
- Pass party location to special in use special item context
- Fix set town visibility node (was checking wrong field and thus could not hide towns)
Special nodes:
- Town Hostile: change to Set Town Attitude
- Select PC node: option to select random PC
- Affect special nodes can now affect monsters
- Fix affect death node reviving non-existent PCs
- Affect Spells: Can remove spells, and can affect level 1-3 spells
- If Objects: Merged from If Barrels and If Crates
- If Species: Replaces If Cave Lore
- If Trait: Replaces If Woodsman
- If Statistic: Replaces If Enough Mage Lore
- Change Lighting: Can affect town's global lighting setting, player's light level, or both at once.
- Pointers! Actually, I'd already implemented the callbacks for setting and getting them, but they're now actually used, and the implementation has been tweaked a little.
- Campaign flags! Again, I'd already implemented them sorta, but I tweaked things and they ended up sort of halfway between the two implementations. Plus there's now a special node to set them.

Additional bits:
- Special queue now uses an std::queue instead of a basic array.
- Enum for town lighting levels
- Disease touch ability is now honoured for monster-on-monster combat
- See monster special context now passes the monster's location as the trigger location; also, removed the double-trigger from one circumstance.
- Along with the set town attitude change, there's now the possibility for making the town hostile to trigger a special node, which can cause the party to be slain.
- Select PC special node: option to select specific PC
- Spell IDs for use in shops and Affect Spell nodes have changed so that 0 is now the first level 1 spell, and so forth.
- add_string_to_buf can now auto-split the string over multiple lines, and the special node that uses it takes advantage of this
- Special node parser warns if a node type is missing a corresponding opcode
- Reserved "pointers" to access the special node's trigger location (this was *i's idea, but he never implemented it)
2014-12-08 01:08:30 -05:00
0d7ad2c718 Finish strictifying special node type enum (forgot the scenario editor) 2014-12-07 17:53:30 -05:00
46c3c69bd9 Merge the XXX_BLOCK and SANCTIFY special nodes into a single, more versatile IS_CONTEXT node 2014-12-07 00:36:10 -05:00
5ec983ef32 Strictify special node context enum 2014-12-06 23:22:56 -05:00
bfdcfeab58 Strictify special node type enum 2014-12-06 22:28:09 -05:00
0629a70419 Strictiy terrain special enum 2014-12-06 20:59:50 -05:00
f9f90473f3 Fix garbled dialog graphics in custom special node dialogs 2014-12-05 23:49:01 -05:00
4db81f1403 Implementation of parsing for the map format (untested)
- Some stubs inserted for loading new-format scenario data
2014-12-05 00:50:17 -05:00
94d8717a0b Nuke as many warnings as possible, and several globals as well
- Warnings completely suppressed for the included TinyXML and gzstream libraries
- Parentheses warnings are now errors, since there were several that looked like bugs
- Ditto for dangling else warnings

Some of these warnings were actually bugs:
- Town wandering monsters would have never spawned, because the code to do so was accidentally nested within a check for overall_mode == MODE_OUTDOORS
---> boe.monster.cpp, lines 105-137
- Monster's behaviour with respect to elemental fields did not correctly depend on their immunities (this is the same precedence issue Sylae messed up fixing in the Windows code)
---> boe.monsters.cpp, lines 345-359
- Display of damage blocked by armour appeared to be incorrect (needs verification)
---> boe.newgraph.cpp, line 1079
- Three-choice dialogs probably weren't dealing with unusual button types correctly, though that's a minor point since they aren't expected to use such buttons
2014-12-04 12:44:17 -05:00
47fc23928c Strictify status types enum 2014-12-03 23:18:12 -05:00
13116980fb Strictify race enum
- This incidentally fixes a lot of things that were broken in the previous commit due to the magic values changing
2014-12-03 20:21:24 -05:00
5b7649543f Merge race and monster type enums 2014-12-03 18:27:34 -05:00
03c64ebd7b Eliminate use of __attribute__
Ideally this would be standard C++, but here I've settled for things that should be supported by both clang and VS/cl.exe:
- Deprecated attribute retained, but now uses __declspec syntax
- Packed attribute replaced with pragma pack, except one instance where it unnecessary
- Aligned attribute replaced with explicit padding bytes inserted in the structs where needed
- Unused attribute simply removed (though where possible, the unused entities were also removed)
2014-12-02 15:54:50 -05:00
e6057387eb Strictify PC main status enum 2014-12-01 21:38:20 -05:00
e86362d294 Strictify the terrain trim enum 2014-12-01 20:04:30 -05:00
d900c7edef Enumify terrain blockage and generalize the line of sight function
This should probably be two separate commits, but they're tangled together and I don't want to spend the effort to disentangle them.
2014-12-01 19:50:19 -05:00