Skip to content
Snippets Groups Projects
  1. Jun 26, 2017
    • Hachem_Muche's avatar
      Adjusted log_detail_ai setting for some messages. Combat log debugging... · 83bafd4a
      Hachem_Muche authored
      Adjusted log_detail_ai setting for some messages.  Combat log debugging messages require log_detail_ai > 1.4.
      83bafd4a
    • Hachem_Muche's avatar
      This update has 3 main parts: · bdc16947
      Hachem_Muche authored
      A)	Upgrading AI primitives (“infrastructure”) in the engine to make designing new and more capable AIs easier.
      B)	Rewriting the Talented and Tactical AIs, plus adding some supporting AIs, so that NPCs in ToME using them behave more intelligently.
      C)	Correcting and updating tactical tables and associated code for a number of (but not all) talents that are currently not being used effectively by NPCs.
      
      HIGHLIGHTS:
      Major rewrite of many AI definitions and functions, including new functions to make writing new AIs simpler.
      Completely new talented and tactical AIs (for ToME) that allow NPCs to act without contact with the player, actively manage all standard resources, and more consistently comply with their AI specifications.  This includes provisions for all NPCs to avoid drowning/grid damage, better coordinate movement and talent use, and invoke other AIs.
      NPCs can both activate and deactivate all sustain talents intelligently (particularly for the tactical AI) with or without player contact, according to the tactical situation.
      The new AIs are designed to work concurrently with their existing counterparts to allow for them to be phased in.
      
      Main Game Play Effects (for NPCs using the new AIs):
      NPCs do not require contact with the player to act.
      NPCs will actively manage all standard resources, including their health.
      NPCs can both activate and deactivate sustained talents as appropriate.
      NPCs will move away from harmful (damaging, suffocating) terrain, and will do a better job at maintaining appropriate distance from the player while in combat (new tactical AI).
      If using a talent fails, the NPC will immediately attempt to use another (next best for the tactical AI) talent.
      
      GAME LOG DETAIL CONTROL:
      The amount of detail printed in the game log by most engine/ToME ai functions can be controlled by setting the variable:
      
      	config.settings.log_level_ai = X
      
      Where X is a number from 0 (no extra output) to 4 (very verbose output) specifiying how much detail to output to the game log.
      
      NEW/UPDATED AI’s included:
      “dumb_talented” (engine) – updated to add support for t.onAIGetTarget.
      “improved_talented” (engine) - Simplified version of “dumb_talented” using the new talent filter system. Designed as a drop-in replacement for the dumb_talented AI using the new AI functions.
      “improved_talented_simple” (ToME) – designed as an overload for the dumb_talented_simple AI
      “improved_tactical” (ToME) – designed as a drop-in replacement for the tactical AI (details below)
      “maintenance” (ToME) – manages health and resources, triggering other appropriate talents and AIs, (mostly for simple AIs out of combat)
      “move_safe_grid” (ToME) – moves from harmful to safe terrain
      “flee_dmap_keep_los” (ToME) – migrated from ai.tactical.lua, flees from current target while maintaining LOS to it
      “target_simple” (engine) – will only maintain targeting on hostiles
      "target_simple" (ToME) – has an increased chance to clear friendly targets, always clears self
      “tactical” --The existing tactical AI has been partially updated to be compatible with most of the new tactical table functionality, with minimal changes.  (It lacks most of the additional features of the new tactical AI in order to work as before as much as possible.)  Better log file output.
      
      NEW TACTICAL AI:
      This is an almost complete rewrite of the current tactical AI that is compatible with existing NPC specifications and data.
      Interprets existing tactical tables as before, but supports additional information allowed in the new tactical table format.
      The tactical AI weighs all tactical table parameters (not just the best one) when evaluating talents, making it much better at picking the correct talent at the correct time.
      Full support for both positive and negative tactical values – this allows the AI to intelligently turn on and off sustained talents, including those with sustain_slots or that drain resources.  (For example, an NPC can switch between hymns or vile poison enhancements as the tactical situation develops.)
      Automatically manages all standard resources, with support for resource-specific wants.
      Does a better job at maintaining an advantageous distance to the target.
      
      (Un-tested) The tactical AI should run significantly faster than before for most NPCs.  The new AI is more efficient when evaluating and performing actions, but does more.
      
      Extensive documentation for the changes, including detailed instructions/tutorial for how to construct tactical tables.
      Defined key parameters for supported TACTICs in mod.class.interface.ActorAI.  This allows new TACTICs to be added easily, including by addons.
      
      EXTENDED TACTICAL TABLE functionality:
      Added detailed documentation on how to construct tactical tables and how they are interpreted by the (new) tactical AI.
      No changes are required to current tactical tables for them to be interpreted by the new AI functions the same way they were interpreted before.  Note, however, that many of the existing tactical tables have significant errors that prevent NPCs from using talents appropriately.  (A number of these have been corrected as part of this development.)
      
      Changes:
      Tactical functions take the actor affected rather than the NPC's ai target as an argument in order to be consistent with the way DamageType and status resistances are interpreted.
      
      There is an additional (lowest) level of table parsing for status immunities to allow both DamageType resistance and status effects to be accounted for.
      
      For example, Apply Poison’s NATURE-based damage is added to the tactical table as:
      
      tactical = { ATTACK = {NATURE = {poison = 2}}}
      
      which takes both the target’s poison immunity and NATURE resistance into account.
      
      A sub-table  SELF = {…} can be specified for tactics that apply only to the talent user.  This helps specify tactics for talents that have different effects on the user and on their target(s).
      
      For example, the updated tactical table for lightning runes is now:
      
      tactical = { ATTACK = { LIGHTNING = 1 }, SELF = {defend = 1} }
      
      reflecting the fact that it provides defense to the user (but not the target).
      
      When applying DamageTypes, source damage bonuses and target affinity are accounted for in addition to resistances and penetration.
      
      Alternate tactical tables (t.tactical_imp) are included for some talents during the transitional period.)
      
      AI talent use changes:
      Completed support (This was only partially supported before.) for the talent field t.onAIGetTarget for all engine AIs and support functions.  ActorAI:getTarget(typ).
      
      Separated ai pre-use talent checks from actor:preUseTalent into new function (ActorAI:aiPreUseTalent) at the engine level.   This is needed to allow sustains to be turned on and off properly (to allow ActorTalents:forceUseTalent to turn off sustains (with buff removal effects, for example), when the AI would otherwise NOT turn them off.
      For ToME, this permits the function talent.on_pre_use_ai to control both activating and deactivating sustained talents.
      
      SUMMARY of FUNCTIONS:
      New Engine Functions:
      ActorTalents:filterTalent(t, filter) - checks a talent against a filter
      ActorAI:aiTalentTargets(t, aitarget, tg, all_targets, ax, ay) - Generate a list of target entities (Actors) a talent MAY affect if used (This provides engine support for the dummy projection performed in the current tactical AI.)
      ActorAI:aiGetAvailableTalents(aitarget, t_filter, t_list) – generates a list of talents available for use
      aiPreUseTalent(t, silent, fake) – (stub) determines if the AI should use a talent (separated from preUseTalent to allow sustains to be correctly turned on and off)
      ActorAI:getTarget(typ) – supports talent.onAIGetTarget, talents automatically self-targeted, and supports the grid_params argument to locate grids if the targeting table requires it.
      ActorAI:getTargetGrid(tg, params) – acquires grids via projection, choosing one to move to based on parameters in the targeting table -making targeting of movement talents for NPCs much simpler.
      
      Updated Engine Functions:
      ActorAI:setTarget will automatically check on_acquire_target and on_targeted functions when a new target is set.
      ActorAI:runAI will return nil, generating a log message, rather than crashing with an undefined ai
      
      New ToME functions:
      ActorAI.aiParseTalent(t) – parses a talent definition, setting some variables for AI use – making talent analysis faster for the AI
      ActorAI.AI_InitializeData() – parses all talent definitions, initializes resource tactics, and logs a summary of all tactics detected in talent definitions
      ActorAI:aiPreUseTalent(t, silent, fake) – Determines if the AI should use the talent.  Checks t.on_pre_use_ai (applies to both activation and deactivation of sustained talents) and caches its results in the self.turn_procs table.
      ActorAI:aiCheckSustainedTalent(t) – determines if a sustained talent should be toggled (Allows simple AIs to turn on and off sustained talents correctly.  This is primarily concerned with resource drains.)
      ActorAI:aiGetResourceTalent(res_def, t_filter,  t_list) – finds a talent to replenish a resource
      ActorAI:aiResourceAction(res_def, t_filter, t_list) – finds an action (talent or AI) to replenish a resource
      ActorAI:aiHealingAction(aitarget, filter, t_list) – finds an action (talent or AI) to heal self
      ActorAI:aiGetGridDamage(gx, gy) – computes expected grid damage and air loss for the actor.  Updated some grid definitions to allow this function to detect the damage.
      ActorAI:aiGridHazard(gx, gy, dam_wt, air_wt) – rates the overall hazard level for grid.  May be overloaded for some Actors to allow for special map navigation.
      ActorAI:aiFindSafeGrid(radius, want, dist_weight, ignore_los, grid_val) – finds the a nearby grid to escape grid damage and suffocation.
      ActorAI:aiCanFleeDmapKeepLos() – moved from tactical ai for general use
      ActorAI:aiTacticEffectValues(targets, effect_type, effect_wt, talent, selffire, friendlyfire) – computes the tactical value of specific tactic weight argument vs a list of actors – for concurrent compatibility with the existing tactical AI
      ActorAI:aiTalentTactics(t, aitarget, targets, tactic, tg, wt_mod) – fully resolves the tactical table for a talent (including finding targets as needed) – used by the new tactical AI to evaluate talents and by some simple AIs to use tactical tables when choosing talents
      Combat:combatGetAffinity(type) – returns damage affinity
      Talents.aiLowerTacticals(tactical) – function to convert TACTIC labels to lower case in tactical tables
      
      Updated ToME Functions:
      NPC:act() – NPCs will perform resting activity if they take no other action during a turn
      NPC:getTarget(typ) – simplified to reflect the changes to ActorAI:getTarget
      NPC:seen_by(who) – NPCs will not pass friendly targets to each other unless ai_state._pass_friendly_target is set
      NPC:aiCanPass(x, y) – removed (uses engine version), shove pressure folded into ActorAI:moveDirection
      
      MISC RELATED CHANGES:
      The level of log file detail output by various AI functions can be specified by setting config.settings.log_detail_ai to a value from 0 (minimal output) to 4 (very verbose output).
      
      Engine:
      ActorAI:aiSeeTargetPos(target) – added extra checks to the estimated location to exclude it if another actor is seen there and that the target can actually move there – this significantly reduces the chance to target friends or self
      ActorLife:takeHit(value, src, death_note) – death message is not displayed if src is undefined
      utils: table.to_strings = function(src, fmt) – converts a table to table of formatted strings, very useful for various debugging outputs
      utils: table.equivalence(t1, t2, recurse) – checks if two tables are equivalent, i.e. they are identical or contain the same values assigned to the same keys, can recursively track all of the keys to the first difference found
      
      ToME:
      ActorAI:moveDirection(x, y, force) – moved from NPC.lua, incorporates shove algorithm code, fixing a bug that causes shove pressure to almost always fail
      Actor:preUseTalent(ab, silent, fake) – updates any missed AI parsing of talents as needed when tested
      Resource definitions updated with new AI parameters (equilibrium, paradox, psi, air)
      Actor:regenLife(fake) --- returns the life, psi regenerated, updated to take a fake parameter to calculate the amount of life and psi that will be regenerated without applying the values.  Eliminated the resting hack for Solipsism: life regeneration is only reduced by the amount of psi regeneration that can be used, none is diverted once psi is replenished.
      Updated Actor status immunity functions:
      Actor:canBe(what, eid) -- Rewritten to reference a table of status type labels that makes defining new status types (addons) much simpler.  Can take an argument for the effect id being applied, which forces checking of general status immunities (negative_status_immune is always checked), and can be used to force checking of status types contained in the effect subtype table. (i. e. self:canBe(nil, “EFF_DAZED”) will check stun_immune.)
      Now returns the random result, percent chance to be affected.  AIs have been updated to use the chance rather than an individual result, so that tactical weights are consistent across multiple calls.
      Actor.newStatusType(what, method) – used to define a new status type. e.g. Actor.newStatusType(“annoy”, true) causes self:canBe(“annoy”) to check the self.annoy_immune field.
      Actor:canSeeNoCache(actor, def, def_pct) – updated to always return the correct chance to see the target (regardless of success).
      Actor:getTalentSpeed(t) – looks for a t.getEnergy function that returns the amount of game energy needed to use the talent (on the basis of 1 = 100% of normal, stacks with talent type speed).
      Combat:combatGetResist(type) -- results are properly bounded between -100% and + 100%.
      resolvers.talented_ai_tactic updated to better balance ai_tactic for more tactical flexibility.  Fixed an upvalue(!) bug that could cause failure when placing randbosses generated from an earlier save file.
      
      Some ToME TALENT CHANGES:
      Note many talent defintions have incorrect tactical tables.  A number of the most complex (for the AI) talents have been updates with new tactical information so that NPCs can use them.
      
      Talents can have .ai_level field to specify the (raw) talent level to use for AI purposes (For prodigies and other 1 point talents).
      
      Summoning Talents – Defined new functions in talents.lua (available to all talent definitions) supporting significant tactical changes which allow NPCs to better pick appropriate summoning talents and place summons.
      Poisons – use the updated AI changes to allow NPCs to switch between poison effects in combat.
      Psionic Projection talents – tactical tables for discharging the talent now take into account the loss of the aura effect
      Meditation – enabled for NPCs who will actively toggle this talent to manage their equilibrium.
      Spacetime Tuning – NPCs can learn the talent, but only benefit from the passive effects.
      Suncloak – enabled for NPCs (requires LOS to target)
      True Grit – enabled for NPCs (since they can now manage their resources)
      Nature Touch – NPCs will search for a target (favoring self) that needs healing
      
      Some ToDo Items:
      Update the way the Actor.ai_tactics table is used to allow for sustains/status effects to modify tactical priorities in the tactical AI.  So wild speed could reduce but not eliminate talent use, Unstoppable would prevent running away while active, etc...
      Finish enabling summoning talents for NPCs : Detonate, Rage, Phase Summon
      Wards: NPCs must match wards to target attack types
      Add a method in data.damage_types.lua to translate compound DamageTypes into the base types (that have resistances)
      bdc16947
  2. Jun 09, 2017
  3. Jun 08, 2017
    • DarkGod's avatar
      Merge branch 'ItemsAndShops' into 'master' · a94c095a
      DarkGod authored
      Shop changes
      
      There are currently several problems with the shop system.
      
      - Tier 3 is available early on which creates a weird and problematic early game crutch
      
      - Shops use the zone level for their material tiers which is usually not updated and leads to weird unintuitive changes in the value of various shops, notably that most don't scale past material tier 1-2 at all
      
      - Restock times are at set game events that are arbitrary
      
      This changes shops to scale in a more sane way.  Specifically:
      
      - AoA restock events are removed
      
      - New shop property player_material_level that makes shop material tier increase every 10 player levels.  This is applied to most AoA shops.
      
      - New world property restock_by_level makes shops restock when the player achieves level 5 and every 10 levels.  This is applied only to the AoA campaign.
      
      - Shop restock size is changed from usually 10 to 4 to balance the increased frequency of restocks and better shop scaling
      
      - Inscription shops now guarantee an ego
      
      - Gates of Morning shops are changed significantly.  Instead of having standard rules they now only fill 2 items but are guaranteed to be double greater ego items to differentiate them from other shops.  Prices are increased by 300% to provide another gold sink and to prevent early game Celestials from buying high end items.
      
      Bug fixes:
      
      - Fixed shops only restocking if you had opened them already
      
      - Fixed some shops trying to generate item types that don't exist (robe)
      
      
      See merge request !445
      a94c095a
    • DarkGod's avatar
      Merge branch 'Balance' into 'master' · 9cdead9d
      DarkGod authored
      Ranged Weapon/Archer Balance
      
      - Removed the free +20% attack speed on ranged weapons
      - Swift Shot now grants an increased attack speed buff for 5 turns
      - Removed armor penetration on Headshot
      - Reduced damage dealt by Called Shots
      - Reduced damage dealt and removed confusion on Shadow Shot
      - Reduced damage dealt by Bullshot
      - Trueshot now grants a scaling bonus to mark chance rather than a flat 100%
      - Reduced number of talents placed on cooldown by Sentinel slightly
      - Buffed Pestilent Blight
      - Worm Rot now gains a scaling chance to trigger worm spawning on removal (including Catalepsy)
      - Removed sustain cost of Shadow Decoy
      
      See merge request !460
      9cdead9d
    • DarkGod's avatar
      Merge branch 'MoreMummies' into 'master' · fddd1c60
      DarkGod authored
      More Mummies
      
      Updated Mummy NPC definitions:
      The Greater Mummy Lord gets his shalore racial talents, cut immunity, a better selection of runes, and is size 3.
      
      New NPC "Greater Mummy" an elite melee-ranged hybrid version of the other mummies. (So the GML has some poker buddies.)
      
      Resolver filters can assign a complete object list to their base_list field.
      
      Fixed resolver definitions for mummy wrappings so that they can be generated more reliably.
      
      Elven ruins mummies automatically use their zone-specific object list regardless of where they're generated.
      
      See merge request !459
      fddd1c60
  4. Jun 07, 2017
    • razakai's avatar
      - Removed the free +20% attack speed on ranged weapons · 6551d691
      razakai authored
      - Swift Shot now grants an increased attack speed buff for 5 turns
      - Removed armor penetration on Headshot
      - Reduced damage dealt by Called Shots
      - Reduced damage dealt and removed confusion on Shadow Shot
      - Reduced damage dealt by Bullshot
      - Trueshot now grants a scaling bonus to mark chance rather than a flat 100%
      - Reduced number of talents placed on cooldown by Sentinel slightly
      - Buffed Pestilent Blight
      - Worm Rot now gains a scaling chance to trigger worm spawning on removal (including Catalepsy)
      - Removed sustain cost of Shadow Decoy
      6551d691
  5. Jun 06, 2017
    • Hachem_Muche's avatar
      Mummy wrappings removed from objects.lua (no "mummy_rarity") · 40f01b62
      Hachem_Muche authored
      Moved definitions for Bindings of Eternal Night and Crown of Eternal Night back to ancient-elven-ruins/objects.lua.
      
      resolvers.resolveObject: filter.base_list can be a list of objects (matches zone:makeEntity)
      
      Elven ruins mummies will load their zone object list into the appropriate equipment resolvers (so they will always get their mummy wrappings, etc. in any zone where they are loaded).
      
      Greater Mummies get headgear. (This slightly increases the chance to drop the Crown.)
      40f01b62
    • Hachem_Muche's avatar
      Merge branch 'master' into MoreMummies · bb7c4223
      Hachem_Muche authored
      bb7c4223
  6. Jun 03, 2017
    • DarkGod's avatar
      Merge branch 'ObjectResolversUpdate' into 'master' · 210c47eb
      DarkGod authored
      Further Object resolvers updates
      
      Streamlined base_list handling in game.zone:makeEntity (and resolvers.resolveObject) to prevent excessive reloading and processing entity lists.
      Priority is type (if a base_list) then filter.base_list
      
      Actor:addedToLevel: escorts will get an appropriate faction (hard_faction, game.zone.special_level_faction, summoner.faction)
      
      game.state:applyRandomClass: converted equipment resolvers will allow power_source.nature (for Psyshots)
      
      The I.D. sets special_level_faction = "enemies" for NPCs created after level generation
      
      dialogs/debug/DebugMain.lua: fixed a bug that could cause no exp to be awarded when killing NPCs
      
      See merge request !457
      210c47eb
  7. May 31, 2017
    • Chris Davidson's avatar
      Fix store restocks only happening if you had already opened the shop at some... · b340a421
      Chris Davidson authored
      Fix store restocks only happening if you had already opened the shop at some point.  All restocks and their associated levels are now stored and applied at Store:loadup.
      
      Add support for player_material_level and restock_by_level
      b340a421
    • Chris Davidson's avatar
      Add a new world property stores_restock_by_level that makes restocks happen at... · 13c91cf4
      Chris Davidson authored
      Add a new world property stores_restock_by_level that makes restocks happen at player level 5 and every multiple of 10.  This is applied to only AoA.
      
      Fix some shops referencing type "robe" that doesn't actually exist
      
      Set most AoA shops nb_fill value to 4 from 10
      
      Set most AoA shops to use player_material_level
      
      Set AoA inscription shops to guarantee an ego
      
      Create a new set of equipment shops specific to Gates of Morning.  Each has nb_fill of 2, 300% sell price increase, and guarantees 2 greater egos.  Material tier is controlled by the zone instead of using the new player_material_level.
      13c91cf4
  8. May 29, 2017
    • Hachem_Muche's avatar
      Updated Mummy NPC definitions: · 1bd08b5b
      Hachem_Muche authored
      The Greater Mummy Lord gets his shalore racial talents, cut immunity, a better selection of runes, and is size 3.
      
      New NPC "Greater Mummy" an elite melee-ranged hybrid version of the other mummies. (So the GML has some poker buddies.)
      
      Fixed resolver definitions for mummy wrappings so that they can be generated more reliably.
      
      mummy-wrappings.lua is loaded with objects.lua.  Mummy wrappings are very rare by default, but have a "mummy_rarity" field to allow generating them more reliably without loading a separate base list. (They are more common in the Elven Ruins.)
      
      Moved Bindings of Eternal Night and Crown of Eternal Night to boss-artifacts-maj-eyal.lua.
      1bd08b5b
    • Hachem_Muche's avatar
      Streamlined base_list handling in game.zone:makeEntity (and... · 466573d3
      Hachem_Muche authored
      Streamlined base_list handling in game.zone:makeEntity (and resolvers.resolveObject) to prevent excessive reloading and processing entity lists.
      Priority is type (if a base_list) then filter.base_list
      
      Actor:addedToLevel: escorts will get an appropriate faction (hard_faction, game.zone.special_level_faction, summoner.faction)
      
      game.state:applyRandomClass: converted equipment resolvers will allow power_source.nature (for Psyshots)
      
      The I.D. sets special_level_faction = "enemies" for NPCs created after level generation
      
      dialogs/debug/DebugMain.lua: fixed a bug that could cause no exp to be awarded when killing NPCs
      466573d3
  9. May 28, 2017
  10. May 27, 2017
    • DarkGod's avatar
      Merge branch 'MajorEventsUpdate' into 'master' · d8808e85
      DarkGod authored
      Major events update
      
      GameState:doneEvent is updated to allow incrementing the used count (which is returned), and it is automatically called for events that are placed or assigned to a level, allowing event code to check the count correctly.
      
      
      GameState:startEvents() updated:
      
      The zone events file supports some new fields:
      
      unique = true prevents triggering of events that have previously been triggered (anywhere in the game)
      
      level_range = a range of allowed levels the event is allowed to spawn on (complements the forbid field)
      
      special = an optional function(lev) that can determine if the event should spawn or not (The logic is updated to be consistent with other "special" functions used in filters, etc.)
      
      Fixed a bug in passing event_id to event functions (metatables).
      
      Added documentation and output to the relevant GameState functions.
      
      Fixed issues with major events that involve a change of zone (sub-vault, rat-lich, damp-cave, old-battle-field, drake-cave, naga-portal, fearscape-portal):
      
      .no_worldport is set to that of the parent zone.
      
      Actor levels are 5% to 15% higher than the parent zone and game difficulty adjustments are not compounded.
      
      Object material levels match the parent zone.
      
      Auto explore and minimap settings are updated.
      
      
      This makes these events "safe" to add anywhere in the game and at higher difficulties, and they are added as standard to the I.D. (with appropriate level restrictions).
      
      
      Fixed a bug in game:changeLevelReal that was causing the player to incorrectly be placed at level start when params.auto_level_stair was set.  (Affected the old-battle-field event and some other stairs)
      
      Other event changes:
        
      The player can choose to ignore the naga-portal and fearscape-portal by hitting escape at the pop-up.
      
      The cultists event uniqueness is fixed (unique across the game) and it can only spawn from level 15+ in the I.D.
      
      Fixed a bug in the sub-vault event that was preventing the stairs from crumbling as intended.
      
      Updated the sludgenest and noxious-caldera events for the wilderness and the conclave-vault event for the halfling ruins.  (No game play change; the special field is removed as it's not needed.)
      
      
      
      
      See merge request !441
      d8808e85
    • DarkGod's avatar
      Merge branch 'Artifact_tweaks' into 'master' · 75fb217c
      DarkGod authored
      Artifact Cheese :cheese:
      
      <dt>Artifact buffs and tweaks</dt> (contains !442 cloudcaller buffs)
      ___
      Aetherwalk gains voidwalker effects and deals magic-based arcane damage in radius 3 on any teleport when worn
      ___
      Frost Treads cost adjusted, gains 10% movespeed, has dex requirement removed and gains wil instead for nature flavor. 
      
      New AoE effect on walking, beneficial to player, detrimental to enemies.
      ___
      Cloudcaller now deals 15 lightning damage per turn in radius 3 around the user, light bonuses changed to cold for flavor. Active power buffed for more uses
      ___
      Acera and Everpyre Blade now have their damage type changed to acid and fire respectively to reinforce identity
      
      Everpyre Blade loses active and gains it as an on-hit instead
      ___
      Ring of the dead is now unvaultable
      ___
      Behemoth Hide stats increased to reinforce usefulness
      ___
      Mighty girdle and Girdle of Calm Waters tiers swapped (2 and 1 respectively) and level ranges swapped to make Calm Waters less common. Cost on Calm Waters adjusted slightly.
      
      
      
      
      See merge request !447
      75fb217c
    • DarkGod's avatar
      Merge branch 'ObjectResolversUpdate' into 'master' · 9fa5d00f
      DarkGod authored
      Object Resolvers Update Supplement
      
      debug/SummonCreature.lua : fixed a bug causing generated NPC's to not be removed from the level until actually added (affects RandomActor)
      
      Added log messages to Actor:wearAllInventory for party members (for cases like a quest auto equipping items for the player)
      
      Updated some auto_equip_filters:
      
      class descriptors:
      
      Bulwark, Sun Paladin: BODY: allows wearing light armor if nothing better is available
      
      Bulwark, Sun Paladin: Reaver: MAINHAND can equip a 2h weapon if it won't block the OFFHAND slot (for ogres, etc.)
      
      Berserker, Archer: OFFHAND can equip if there is a MAINHAND weapon already equipped (fixes an issue of for some randbosses not using MH weapons)
      
      Rogue, Shadowblade: BODY can wear mummy wrappings
      
      Summoner: removed auto_equip_filters
      
      See merge request !456
      9fa5d00f
  11. May 26, 2017
    • Hachem_Muche's avatar
      debug/SummonCreature.lua : fixed a bug causing previewed NPC's to be added to... · c9c2a01c
      Hachem_Muche authored
      debug/SummonCreature.lua : fixed a bug causing previewed NPC's to be added to the level inappropriately
      
      Added log messages to Actor:wearAllInventory for party members (for cases like a quest auto equipping items for the player)
      
      Updated some auto_equip_filters
      class descriptors:
      Bulwark, Sun Paladin: BODY: allows wearing light armor if nothing better is available
      Bulwark, Sun Paladin: Reaver: MAINHAND can equip a 2h weapon if it won't block the OFFHAND slot (for ogres, etc.)
      Berserker, Archer: OFFHAND can equip if there is a MAINHAND weapon already equipped (fixes an issue of for some randbosses not using MH weapons)
      Rogue, Shadowblade: BODY can wear mummy wrappings
      Summoner: removed auto_equip_filters
      c9c2a01c
  12. May 25, 2017
  13. May 24, 2017
  14. May 23, 2017
    • DarkGod's avatar
      Fixed shops · ff31794a
      DarkGod authored
      ff31794a
    • Hachem_Muche's avatar
      cb1397f7
    • DarkGod's avatar
      0d3b7bb8
    • DarkGod's avatar
    • DarkGod's avatar
      Merge branch 'ObjectResolversUpdate' into 'master' · e350cdf8
      DarkGod authored
      Object resolvers update
      
      Summary:
      This updates object resolvers, eliminating redundant code to ensure consistent behaviour and integrating them into the debugging object creation interface -- allowing resolver filters to be debugged directly within the debugging dialogs.
      
      It adds a new system for NPCs choosing equipment to wear based on filters, and updates ToME character class descriptors and Entity definitions to ensure only appropriate equipment is worn (to prevent wearing Objects that interfere with talents).  This fixes the issue of NPCs getting added random classes with many unusable talents.
      (Embers and Ashes class descriptors and Entities work as before, but need to be updated to benefit from the changes.)
      
      Details:
      
      New utility functions (useful for debugging):
      string.fromFunction(fct, fmt) returns a string abbreviation for a function, including filepath, line numbers
      
      string.fromValue(v, recurse, offset, prefix, suffix) -- enhancement of tostring function with more thorough handling of tables and functions
      
      string.fromTable(src, recurse, offset, prefix, suffix, key_recurse): returns a single-line string representation of a table, including string representations of subtables and functions.  The recursion level for both keys and values can be set.  The converted string is lua source code compatible, depending on arguments.
      
      engine.Zone:checkFilter: Added documentation, can set filter.allow_uniques to allow unique items to pass the filter, special function takes the filter as its 2nd argument
      
      engine.Zone:filterToString: updated -- handles subtables, functions, and other complex values
      
      engine.Zone:makeEntity: the type parameter can be a list of entities
      
      engine.Zone:makeEntityByName: Added documentation, type can be a string descriptor used to load a base list (follows makeEntity filter.base_list)
      
      engine.Entity:resolve: Added documentation
      
      engine.Birther: Bugfix: the order of resolvers is preserved when applying birth descriptors (causes resolver.attachtinker to fail with no equipment to attach to)
      
      engine.interface.ActorInventory:initBody()
      	May be reapplied to an actor without overwriting existing inventories (merges properties), copies the inventory definition short_name
      
      dialogs.debug.SummonCreature, dialogs.debug.RandomActor:
      	Actors are fully resolved before added:  including "addedToLevel", "on_added", "on_added_to_level" (except spawning escorts) updating for game difficulty, etc. on generation, before adding
      	Uniques (including inventory items) are not registered in the game until the actor is actually placed.
      
      dialogs.debug:RandomObject:
      	Can set the working actor to be a NPC (defaults to the player)
      	New button/hotkeys to open the working actor character sheet and inventory screens
      	Can select from one of several object resolvers, which will call the appropriate code and resolve the object.  This works like other object generation, allowing preview/inspection before adding the object to the game, which is controlled by the selected resolver as normal
      	Uniques created are not registered until actually added to the game.
      
      CharacterSheet: can always open the inventory dialog in debug mode
      	
      Actor:resolveLevelTalents: code to apply self.learn_tids moved from createRandomBoss to this function (enabling this function for all Actors)
      
      New function Object:wornLocations(use_actor, weight_fn, filter_field, no_type_check)
      	(This functionality replaces the no_npc_weapon_equip flag.)
      	Returns a table if inventory locations where an object can be worn, filtered and sorted
      	The "best" locations appear first, permitting Actors to automatically optimize their equipment.
      	The default criteria are simple (based on object "power", from material level and getPowerRank), but can be updated to be more sophisticated.
      
      New function Actor:wearAllInventory(force, ...)
      	Attempts to wear all items in main inventory, using Object:wornLocations to find the best locations
      	(currently does not attempt to attach tinkers, aggressively remove worn items, or support psionic focus)
      
      New function Actor:updateObjectRequirements(o)
      	Returns object requirements modified by actor talents
      	Used by Actor:canWearObject, Object:getRequirementDesc, and resolvers.resolveObject
      	
      New function Actor:searchAllInventories(o, fct)
      	Searches all inventories for an object (including attached tinkers).  Triggers an optional callback on found items.
      
      NPC:addedToLevel:
      	classes added from higher difficulty settings allow equipment to be updated and autolevel stats (if more than one class added)
      	calls Actor:wearAllInventory to equip objects
      
      game.state:entityFilterAlter: Added documentation, updated RandomObject help
      
      game.state:entityFilter: Added documentation, updated RandomObject help
      
      game.state:entityFilterPost: Added documentation, updated RandomObject and RandomActor help
      
      game.state:egoFilter: Added documentation
      
      game.state:applyRandomClass: 
      	Fixed a bug causing starting class stats to not be added properly
      	Copies all class resolvers with _allow_random_boss set true (resolvers.equip: ignore_material_restriction=true)
      	Resolvers enabled: inscription, inscriptions, auto_equip_filters, attach_tinker, inventory, drops, drop_randart
      	The can_tinker table is copied (allows resolvers.attach_tinker to work properly)
      	autolevel set to "random_boss" unless data.autolevel == false
      	May set data.update_body to force adding inventory slots to the actor
      	May set data.spend_points to spend all unspent stat points
      	data.force_classes can take numerical indexes. Fixed a bug causing multiple forced classes to be applied in definition order rather than randomly.  (Example: {"Rogue", Alchemist=true, Necromancer=true} always adds the Rogue class first then Alchemist and Necromancer in random order, before adding any other random classes)
      
      game.state:createRandomBoss:
      	Allows learn_tids to be applied by resolveLevelTalents (random class talents are learned before attempting to wear equipment with NPC:addedToLevel)
      	No longer removes equip and drops resolvers from the base NPC
      	This preserves important drops and equipment (updated to "boss" levels) required for NPC talents (i.e. randelite Naga Mymidons are not spawned disarmed/improperly armed with certain classes) -- applyRandomClass replaces equipment and updates inventory filters as needed.
      
      New resolver --  resolvers.auto_equip_filters(t, readonly):
      	Sets filters by inventory slot to be checked before automatically wearing objects.  Can be used by class descriptors and general npc definitions to ensure that equipment automatically equipped will not interfere with talents.
      	Input is either a table of filters or a class descriptor name to load the filters from the referenced birth descriptors (i.e. resolvers.auto_equip_filters("Archmage")).
      	As usual, multiple copies of this resolver overwrite each other by inventory slot (use readonly to prevent), so randbosses with more than one class will generally use the filters for the last class applied.  (i.e. Alchemist (applied first), Rogue (applied second) will preferentially equip daggers in MAINHAND/OFFHAND and alchemist gems in QUIVER)
      	
      New general object resolver function -- resolvers.resolveObject(e, filter, do_wear, tries):
      	Called by all filter-based object resolvers for consistency, interprets the filter fields:
      		base_list, random_art_replace, alter (takes the resolving actor as an argument), autoreq (can trigger actor levelup and learning talents in addition to stats), force_inven, force_item, force_drop, never_drop, _use_object (sets a pre-resolved object to use, skipping random generation), replace_unique (filter for generating a replacement for a specific object)
      	Uses Object:wornLocations to find the best locations in which to wear objects.
      	Correctly handles replaced objects and always places unworn objects into main inventory unless explicitly forbidden.  (Calls game.zone:addObject only for objects that are actually added to the actor.)
      	Documentation serves as core help in RandomObject dialog for resolvers.
      
      resolvers.equip: updated to use resolvers.resolveObject
      
      resolvers.inventory: updated to use resolvers.resolveObject
      
      resolvers.drops: updated to use resolvers.resolveObject
      
      resolvers.attachtinker:  updated to use resolvers.resolveObject, will place the tinker in main inventory if .keep_object is set
      
      resolvers.drop_randart:  interprets .data field as input to game.state:generateRandart, may set ._use_object to use a pre-resolved object and .no_add to return the generated object instead of adding it to inventory
      
      Class Descriptors updated with inventory filters:
      Spellpower based casters (Anorithil, Paradox Mage, Archmage, Alchemist, Necromancer, Corruptor):
      MAINHAND: staff
      OFFHAND: none unless a 1H weapon is equipped in MAINHAND
      Alchemist:
      QUIVER: alchemist-gem
      
      Oozemancer, Summoner, Doomed:
      MAINHAND/OFFHAND: mindstars
      
      Stone Warden:
      MAINHAND/OFFHAND: shield or weapon with the block combat field
      
      Brawler:
      MAINHAND/OFFHAND: unarmed
      
      Reaver:
      MAINHAND/OFFHAND: 1H weapon
      
      Archer:
      MAINHAND: Archery weapon
      QUIVER: Ammo must match type of MAINHAND weapon
      
      Temporal Warden:
      MAINHAND: longbow
      OFFHAND: none
      QUIVER: Ammo must match type of MAINHAND weapon
      QS_MAINHAND: 1H weapon
      
      Sun Paladin, Bullwark:
      MAINHAND: 1H weapon
      OFFHAND: shield or weapon with the block combat field
      BODY: heavy or massive armor
      
      Berzerker:
      MAINHAND: 2H weapon
      OFFHAND: unarmed
      
      Rogue, Shadowblade, Marauder:
      MAINHAND/OFFHAND: dagger
      Rogue, Shadowblade:
      BODY: light or cloth armor
      
      Skirmisher:
      MAINHAND: sling
      OFFHAND: shield or weapon with the block combat field
      QUIVER: Ammo must match type of MAINHAND weapon
      
      
      Some NPC Entity updates:
      Bosses in Trollmire, The Maze, Daikara, Dreadfell, Elven Ruins, High Peak, Orc Prides,
      Assassin Lord, Tannen, Golbug, Corrupted Oozemancer,
      Some major and minor demons, various caster npcs, many orcs, thieves, minotaurs, yaechs, naga
      
      
      See merge request !455
      e350cdf8
    • Hachem_Muche's avatar
      Update Object:getPowerRank for rares and greater egos. · 49e81c2e
      Hachem_Muche authored
      string.fromValue can take negative recursion level to get std tostring
      
      Remove debugging code
      49e81c2e
  15. May 22, 2017
    • Hachem_Muche's avatar
      39a2dff6
    • Hachem_Muche's avatar
      77fb7da7
    • Hachem_Muche's avatar
      ActorInventory:initBody: inventory short_name is copied from the inventory definition · 7645124f
      Hachem_Muche authored
      New function: Object:wornLocations(use_actor, weight_fn, filter_field, no_type_check)
      	Replaces Actor:getFilteredInventories
      	Returns a table if locations (inventory and slot) where an object can be worn, filtered and sorted
      	The locations are sorted ("best" first), permitting Actors to automatically optimize their equipment.
      	The default weight_fn is a simple formula (based on object "power" from material level and getPowerRank), but can be updated to be more sophisticated.
      	no_type_check can be specified to allow different type replacement equipment for unfiltered inventories
      
      game.state:applyRandomClass:
      	data.update_body can be a list of inventory slots specifying which inventories to define/update when applying a class
      
      game.state:createRandomBoss:
      	Base actor equipment resolvers are updated to "boss" level drops.
      
      resolvers.generateObject renamed resolvers.resolveObject:
      	new filter fields supported:
      	replace_unique: specifies a filter to replace a unique that could not be created (similar to randart_replace, but the replacement object is equipped rather than the existing unique)
      	check_antimagic: force an antimagic check even if the object will not be worn
      
      resolvers.auto_equip_filters(t, readonly):
      	set readonly to specify an inventory filter that cannot be overwritten (to ensure specific equipment is not removed, i.e. Elandar will not replace the Staff of Absorption if he gets extra classes from higher game difficulties)
      
      Object resolvers add the field _resolver_type to the objects they create.
      
      dialogs.debug.RandomObject:
      	fixed a bug causing resolvers.equip to preview ineligible equipment (antimagic check)
      
      dialogs.debug.SummonCreature:
      	fixed a bug causing summoned actors to try to wear equipment before being fully resolved
      
      Added/updated auto_equip_filters for a number of NPCs
      7645124f
  16. May 21, 2017
  17. May 17, 2017
    • Hachem_Muche's avatar
      Class Descriptors updated with inventory filters: · 787174f9
      Hachem_Muche authored
      Spellpower based casters (Anorithil, Paradox Mage, Archmage, Alchemist, Necromancer, Corruptor):
      MAINHAND: staff
      OFFHAND: none unless a 1H weapon is equipped in MAINHAND
      Alchemist:
      QUIVER: alchemist-gem
      
      Oozemancer, Summoner, Doomed:
      MAINHAND/OFFHAND: mindstars
      
      Stone Warden:
      MAINHAND/OFFHAND: shield or weapon with the block combat field
      
      Brawler:
      MAINHAND/OFFHAND: unarmed
      
      Reaver:
      MAINHAND/OFFHAND: 1H weapon
      
      Archer:
      MAINHAND: Archery weapon
      QUIVER: Ammo must match type of MAINHAND weapon
      
      Temporal Warden:
      MAINHAND: longbow
      OFFHAND: none
      QUIVER: Ammo must match type of MAINHAND weapon
      QS_MAINHAND: 1H weapon
      
      Sun Paladin, Bullwark:
      MAINHAND: 1H weapon
      OFFHAND: shield or weapon with the block combat field
      
      Berzerker:
      MAINHAND: 2H weapon
      OFFHAND: unarmed
      
      Rogue, Shadowblade, Marauder:
      MAINHAND/OFFHAND: dagger
      Rogue, Shadowblade:
      BODY: light or cloth armor
      
      Skirmisher:
      MAINHAND: sling
      OFFHAND: shield or weapon with the block combat field
      QUIVER: Ammo must match type of MAINHAND weapon
      
      Some NPC Entity updates:
      Bosses in Trollmire, The Maze, Daikara, Dreadfell, Elven Ruins, High Peak, Orc Prides,
      Assassin Lord, Tannen, Golbug, Corrupted Oozemancer,
      Some major and minor demons, various caster npcs, many orcs, thieves, minotaurs, yaechs, naga
      787174f9
    • Hachem_Muche's avatar
      dialogs.debug.SummonCreature, dialogs.debug.RandomActor: · 6fc7a145
      Hachem_Muche authored
      	Actors are fully resolved before added:  including "addedToLevel", "on_added", "on_added_to_level" (except spawning escorts) updating for game difficulty, etc. on generation, before adding
      	Uniques (including inventory items) are not registered in the game until the actor is actually placed.
      
      dialogs.debug:RandomObject:
      	Can set the working actor to be a NPC (defaults to the player)
      	New button/hotkeys to open the working actor character sheet and inventory screens
      	Can select from one of several object resolvers, which will call the appropriate code and resolve the object.  This works like other object generation, allowing preview/inspection before adding the object to the game, which is controlled by the selected resolver as normal
      	Uniques created are not registered until actually added to the game.
      
      CharacterSheet: can always open the inventory dialog in debug mode
      6fc7a145
  18. May 16, 2017
    • Hachem_Muche's avatar
      engine.Zone:checkFilter: Added documentation, can set filter.allow_uniques to... · 2e731c01
      Hachem_Muche authored
      engine.Zone:checkFilter: Added documentation, can set filter.allow_uniques to allow unique items to pass the filter, special function takes the filter as its 2nd argument
      
      engine.Zone:filterToString: updated -- handles subtables, functions, and other complex values
      
      engine.Zone:makeEntity: the type parameter can be a list of entities
      
      engine.Zone:makeEntityByName: Added documentation, type can be a string descriptor used to load a base list (follows makeEntity filter.base_list)
      
      engine.Entity:resolve: Added documentation
      
      engine.Birther: Bugfix: the order of resolvers is preserved when applying birth descriptors (causes resolver.attachtinker to fail with no equipment to attach to)
      2e731c01
    • Hachem_Muche's avatar
      engine.interface.ActorInventory:initBody may be reapplied to an actor without... · ea5ab16c
      Hachem_Muche authored
      engine.interface.ActorInventory:initBody may be reapplied to an actor without overwriting existing inventories (merges properties)
      ea5ab16c
    • Hachem_Muche's avatar
      New utility functions (useful for debugging): · 237d606b
      Hachem_Muche authored
      string.fromFunction(fct, fmt) returns a string abbreviation for a function, including filepath, line numbers
      
      string.fromValue(v, recurse, offset, prefix, suffix) -- enhancement of tostring function with more thorough handling of tables and functions
      
      string.fromTable(src, recurse, offset, prefix, suffix, key_recurse): returns a single-line string representation of a table, including string representations of subtables and functions.  The recursion level for both keys and values can be set.  The converted string is lua source code compatible, depending on arguments.
      237d606b
  19. May 09, 2017
Loading