diff --git a/game/modules/tome/class/Actor.lua b/game/modules/tome/class/Actor.lua index 6756c19ce197e10cc99949b9480452a7fbe09fa5..30ac1b3c6c1407eff5e93ffbe614ca98dfde1052 100644 --- a/game/modules/tome/class/Actor.lua +++ b/game/modules/tome/class/Actor.lua @@ -1802,10 +1802,11 @@ function _M:onTakeHit(value, src) self.summoner:incFeedback(feedback_gain) end -- Trigger backlash retribution damage - if self:knowTalent(self.T_BACKLASH) and not src.no_backlash_loops then + if self:knowTalent(self.T_BACKLASH) and not src.no_backlash_loops and not src.turn_procs.backlash then if src.y and src.x and not src.dead then local t = self:getTalentFromId(self.T_BACKLASH) t.doBacklash(self, src, feedback_gain, t) + src.turn_procs.backlash = true end end end diff --git a/game/modules/tome/class/Game.lua b/game/modules/tome/class/Game.lua index 7b91c001ae96e2a93aa6821af4928e5247eaeb06..15f96a60eddd943706668ffc382c397a26c8d078 100644 --- a/game/modules/tome/class/Game.lua +++ b/game/modules/tome/class/Game.lua @@ -1344,7 +1344,8 @@ do return end if self.zone.no_autoexplore or self.level.no_autoexplore then self.log("You may not auto-explore this level.") elseif #seen > 0 then - self.log("You may not auto-explore with enemies in sight!") + local dir = game.level.map:compassDirection(seen[1].x - self.player.x, seen[1].y - self.player.y) + self.log("You may not auto-explore with enemies in sight (%s to the %s%s)!", seen[1].actor.name, dir, self.level.map:isOnScreen(seen[1].x, seen[1].y) and "" or " - offscreen") for _, node in ipairs(seen) do node.actor:addParticles(engine.Particles.new("notice_enemy", 1)) end diff --git a/game/modules/tome/class/Player.lua b/game/modules/tome/class/Player.lua index b3276b894b4b7aad36de124d53bba2ec569be896..a719620fb312959e46f5efae40af4a753f645d78 100644 --- a/game/modules/tome/class/Player.lua +++ b/game/modules/tome/class/Player.lua @@ -593,7 +593,8 @@ end function _M:suffocate(value, src, death_msg) local dead, affected = mod.class.Actor.suffocate(self, value, src, death_msg) if affected and value > 0 and self.runStop then - self:runStop("suffocating") + -- only stop autoexplore when air is less than 75% of max. + if self.air < 0.75 * self.max_air then self:runStop("suffocating") end self:restStop("suffocating") end return dead, affected @@ -719,7 +720,8 @@ function _M:restCheck() for _, node in ipairs(spotted) do node.actor:addParticles(engine.Particles.new("notice_enemy", 1)) end - return false, ("hostile spotted (%s%s)"):format(spotted[1].actor.name, game.level.map:isOnScreen(spotted[1].x, spotted[1].y) and "" or " - offscreen") + local dir = game.level.map:compassDirection(spotted[1].x - self.x, spotted[1].y - self.y) + return false, ("hostile spotted to the %s (%s%s)"):format(dir, spotted[1].actor.name, game.level.map:isOnScreen(spotted[1].x, spotted[1].y) and "" or " - offscreen") end -- Resting improves regen @@ -801,9 +803,12 @@ end -- 'ignore_memory' is only used when checking for paths around traps. This ensures we don't remember items "obj_seen" that we aren't supposed to function _M:runCheck(ignore_memory) local spotted = spotHostiles(self) - if #spotted > 0 then return false, ("hostile spotted (%s%s)"):format(spotted[1].actor.name, game.level.map:isOnScreen(spotted[1].x, spotted[1].y) and "" or " - offscreen") end + if #spotted > 0 then + local dir = game.level.map:compassDirection(spotted[1].x - self.x, spotted[1].y - self.y) + return false, ("hostile spotted to the %s (%s%s)"):format(dir, spotted[1].actor.name, game.level.map:isOnScreen(spotted[1].x, spotted[1].y) and "" or " - offscreen") + end - if self.air_regen < 0 then return false, "losing breath!" end + if self.air_regen < 0 and self.air < 0.75 * self.max_air then return false, "losing breath!" end -- Notice any noticeable terrain local noticed = false @@ -812,15 +817,22 @@ function _M:runCheck(ignore_memory) if what == "self" and not game.level.map.attrs(x, y, "obj_seen") then local obj = game.level.map:getObject(x, y, 1) if obj then - noticed = "object seen" if not ignore_memory then game.level.map.attrs(x, y, "obj_seen", true) end - return + noticed = "object seen" + return false, noticed end end - -- Only notice interesting terrains, but allow auto-explore and A* to take us to the exit. Auto-explore can also take us through "safe" doors local grid = game.level.map(x, y, Map.TERRAIN) - if grid and grid.notice and not (self.running and self.running.path and (game.level.map.attrs(x, y, "noticed") + if grid and grid.special and not grid.autoexplore_ignore and not game.level.map.attrs(x, y, "autoexplore_ignore") and self.running and self.running.path then + game.level.map.attrs(x, y, "autoexplore_ignore", true) + noticed = "something interesting" + return false, noticed + end + + -- Only notice interesting terrains, but allow auto-explore and A* to take us to the exit. Auto-explore can also take us through "safe" doors + if grid and grid.notice and not (grid.special and self.running and self.running.explore and not grid.block_move and (grid.autoexplore_ignore or game.level.map.attrs(x, y, "autoexplore_ignore"))) + and not (self.running and self.running.path and (game.level.map.attrs(x, y, "noticed") or (what ~= self and (self.running.explore and grid.door_opened -- safe door or #self.running.path == self.running.cnt and (self.running.explore == "exit" -- auto-explore onto exit or not self.running.explore and grid.change_level)) -- A* onto exit @@ -829,23 +841,26 @@ function _M:runCheck(ignore_memory) or self.running.cnt < 3 and grid.orb_portal and -- path from portal game.level.map:checkEntity(self.running.path[1].x, self.running.path[1].y, Map.TERRAIN, "orb_portal")))) then - if self.running and self.running.explore and self.running.path and self.running.explore ~= "unseen" and self.running.cnt == #self.running.path + 1 then + if grid and grid.special then + game.level.map.attrs(x, y, "autoexplore_ignore", true) + noticed = "something interesting" + elseif self.running and self.running.explore and self.running.path and self.running.explore ~= "unseen" and self.running.cnt == #self.running.path + 1 then noticed = "at " .. self.running.explore else noticed = "interesting terrain" end -- let's only remember and ignore standard interesting terrain - if not ignore_memory and (grid.change_level or grid.orb_portal) then game.level.map.attrs(x, y, "noticed", true) end - return + if not ignore_memory and (grid.change_level or grid.orb_portal or grid.escort_portal) then game.level.map.attrs(x, y, "noticed", true) end + return false, noticed end - if grid and grid.type and grid.type == "store" then noticed = "store entrance spotted"; return end + if grid and grid.type and grid.type == "store" then noticed = "store entrance spotted" ; return false, noticed end -- Only notice interesting characters local actor = game.level.map(x, y, Map.ACTOR) - if actor and actor.can_talk then noticed = "interesting character"; return end + if actor and actor.can_talk then noticed = "interesting character" ; return false, noticed end -- We let the engine take care of traps, but we should still notice "trap" stores. - if game.level.map:checkAllEntities(x, y, "store") then noticed = "store entrance spotted"; return end + if game.level.map:checkAllEntities(x, y, "store") then noticed = "store entrance spotted" ; return false, noticed end end) if noticed then return false, noticed end @@ -1307,8 +1322,11 @@ function _M:useOrbPortal(portal) if portal.special then portal:special(self) return end local spotted = spotHostiles(self) - if #spotted > 0 then game.logPlayer(self, "You can not use the Orb with foes in sight.") return end - + if #spotted > 0 then + local dir = game.level.map:compassDirection(spotted[1].x - self.x, spotted[1].y - self.y) + game.logPlayer(self, "You can not use the Orb with foes in sight (%s to the %s%s)", spotted[1].actor.name, dir, game.level.map:isOnScreen(spotted[1].x, spotted[1].y) and "" or " - offscreen") + return + end if portal.on_preuse then portal:on_preuse(self) end if portal.nothing then -- nothing diff --git a/game/modules/tome/class/interface/PlayerExplore.lua b/game/modules/tome/class/interface/PlayerExplore.lua index 863365deb69bc0a9be7c0402ac600cfd40ed9cbb..f7d810f0bfb951633cbeea69487db88853ae350b 100644 --- a/game/modules/tome/class/interface/PlayerExplore.lua +++ b/game/modules/tome/class/interface/PlayerExplore.lua @@ -1833,6 +1833,7 @@ function _M:autoExplore() local unseen_tiles = {} local unseen_singlets = {} local unseen_items = {} + local unseen_special = {} local unseen_doors = {} local exits = {} local portals = {} @@ -1846,6 +1847,7 @@ function _M:autoExplore() local running = true local minval = 999999999999999 local minval_items = 999999999999999 + local minval_special = 999999999999999 local minval_portals = 999999999999999 local val, _, anode, tile_list @@ -1853,6 +1855,18 @@ function _M:autoExplore() local extra_iters = 5 -- number of extra iterations to do after we found an item or unseen tile local singlet_greed = 4 -- number of additional moves we're willing to do to explore a single unseen tile local item_greed = 5 -- number of additional moves we're willing to do to visit an unseen item rather than an unseen tile + local special_greed = 5 -- number of additional moves we're willing to do to visit a special tile rather than an unseen tile + + -- we only run to a vault or locked door once, but if we are next to it, then we should try to open it if appropriate + local c = toSingle(self.x, self.y) + for _, node in ipairs(listAdjacentNodes(c)) do + local ax, ay = node[0], node[1] + local terrain = game.level.map(ax, ay, Map.TERRAIN) + if terrain and game.level.map.attrs(ax, ay, "autoexplore_ignore") and (terrain.door_player_check or terrain.door_player_stop) then + unseen_doors[#unseen_doors + 1] = toSingle(ax, ay) + door_values[toSingle(ax, ay)] = 1 + end + end -- Create a distance map array via flood-fill to locate unseen tiles, unvisited items, closed doors, and exits while running do @@ -1967,9 +1981,15 @@ function _M:autoExplore() current_tiles_next[#current_tiles_next + 1] = node end end + -- go to special terrain unless it should be ignored + if terrain.special and not terrain.autoexplore_ignore and not game.level.map.attrs(x, y, "autoexplore_ignore") then + unseen_special[#unseen_special + 1] = c + values[c] = move_cost + if move_cost < minval_special then + minval_special = move_cost + end -- only go to objects we haven't walked over yet - local obj = game.level.map:getObject(x, y, 1) - if obj and not game.level.map.attrs(x, y, "obj_seen") then + elseif game.level.map:getObject(x, y, 1) and not game.level.map.attrs(x, y, "obj_seen") then unseen_items[#unseen_items + 1] = c values[c] = move_cost if move_cost < minval_items then @@ -1985,12 +2005,12 @@ function _M:autoExplore() break end end - if is_unexplored then + if is_unexplored and not game.level.map.attrs(x, y, "autoexplore_ignore") then unseen_doors[#unseen_doors + 1] = c if not door_values[c] or door_values[c] > move_cost then door_values[c] = move_cost end - else -- door is safe to move through + elseif not is_unexplored then -- door is safe to move through node[3] = move_cost + 1 safe_doors[c] = true if is_slow then @@ -2028,7 +2048,7 @@ function _M:autoExplore() end end -- Continue the loop if we haven't found any destination tiles or if lower cost paths to the destination tiles may exist - running = #unseen_tiles == 0 and #unseen_items == 0 + running = #unseen_tiles == 0 and #unseen_items == 0 and #unseen_special == 0 for _, c in ipairs(unseen_tiles) do if values[c] > iter then running = true @@ -2050,7 +2070,7 @@ function _M:autoExplore() end -- if we need to continue running but have no more tiles to iterate over, propagate from "slow_tiles" such as traps - if #current_tiles_next == 0 and #slow_tiles > 0 and #unseen_tiles == 0 and #unseen_items == 0 then + if #current_tiles_next == 0 and #slow_tiles > 0 and #unseen_tiles == 0 and #unseen_items == 0 and #unseen_special == 0 then running = true current_tiles = slow_tiles for _, node in ipairs(slow_tiles) do @@ -2071,7 +2091,7 @@ function _M:autoExplore() -- Negligible time is spent below -- Choose target - if #unseen_tiles > 0 or #unseen_items > 0 or #unseen_doors > 0 or #exits > 0 or #portals > 0 then + if #unseen_tiles > 0 or #unseen_items > 0 or #unseen_special > 0 or #unseen_doors > 0 or #exits > 0 or #portals > 0 then local target_type local choices = {} local distances = {} @@ -2103,7 +2123,22 @@ function _M:autoExplore() end end end - -- go to closest items first + -- go to closest special terrain first + if #choices == 0 and minval_special <= minval + special_greed then + for _, c in ipairs(unseen_special) do + if values[c] == minval_special then + target_type = "special" + choices[#choices + 1] = c + local x, y = toDouble(c) + local dist = core.fov.distance(self.x, self.y, x, y, true) + distances[c] = dist + if dist < mindist then + mindist = dist + end + end + end + end + -- go to closest items next if #choices == 0 and minval_items <= minval + item_greed then for _, c in ipairs(unseen_items) do if values[c] == minval_items then @@ -2399,23 +2434,32 @@ function _M:autoExplore() if self.running and self.running.explore then -- take care of a couple fringe cases -- don't open adjacent or target doors if we've already been running + local x, y = path[1].x, path[1].y + local terrain = game.level.map(x, y, Map.TERRAIN) if target_type == "door" then if #path == 1 then self:runStop("at door") + if terrain and (terrain.door_player_check or terrain.door_player_stop) then game.level.map.attrs(x, y, "autoexplore_ignore", true) end return false else path[#path] = nil end end + -- don't bump into special terrain if we've already been running + if target_type == "special" then + if #path == 1 then + self:runStop("something interesting") + game.level.map.attrs(x, y, "autoexplore_ignore", true) + return false + end + end -- don't run into adjacent interesting terrain if we've already been running - local x, y = path[1].x, path[1].y - local terrain = game.level.map(x, y, Map.TERRAIN) if terrain.notice and (target_type ~= "exit" and target_type ~= "portal" or #path ~= 1) then if safe_doors[toSingle(x, y)] and not self.running.busy then self.running.busy = { type = "opening door", do_move = true, no_energy = true } elseif not game.level.map.attrs(x, y, "noticed") then - if terrain.change_level or terrain.orb_portal then game.level.map.attrs(x, y, "noticed", true) end + if terrain.change_level or terrain.orb_portal or terrain.escort_portal then game.level.map.attrs(x, y, "noticed", true) end self:runStop("interesting terrain") return false end @@ -2432,10 +2476,22 @@ function _M:autoExplore() -- end hack! checkAmbush(self) else - -- another fringe case: if we target an item in an adjacent wall that we've probably already targeted, then mark it as seen and find a new target - if #path == 1 and target_type == "object" and game.level.map:checkEntity(target_x, target_y, Map.TERRAIN, "block_move", self, nil, true) then - game.level.map.attrs(target_x, target_y, "obj_seen", true) - return self:autoExplore() + if #path == 1 then + -- another fringe case: if we target an item in an adjacent wall that we've probably already targeted, then mark it as seen and find a new target + if target_type == "object" and game.level.map:checkEntity(target_x, target_y, Map.TERRAIN, "block_move", self, nil, true) then + game.level.map.attrs(target_x, target_y, "obj_seen", true) + return self:autoExplore() + end + -- similar deal for adjacent "special" terrain + if target_type == "special" then + game.level.map.attrs(target_x, target_y, "autoexplore_ignore", true) + return self:autoExplore() + end + local x, y = path[1].x, path[1].y + local terrain = game.level.map(x, y, Map.TERRAIN) + if target_type == "door" and terrain and (terrain.door_player_check or terrain.door_player_stop) then + game.level.map.attrs(x, y, "autoexplore_ignore", true) + end end -- don't open non-adjacent target doors if target_type == "door" and #path > 1 then path[#path] = nil end @@ -2512,6 +2568,17 @@ function _M:checkAutoExplore() if self.running.explore == "unseen" or self.running.explore == "object" and not obj then return self:autoExplore() else + --only go to locked vault doors once + if self.running.explore == "door" then + local c = toSingle(tx, ty) + for _, anode in ipairs(listAdjacentNodes(c)) do + local ax, ay = anode[0], anode[1] + local aterrain = game.level.map(ax, ay, Map.TERRAIN) + if aterrain and (aterrain.door_player_check or aterrain.door_player_stop) then + game.level.map.attrs(ax, ay, "autoexplore_ignore", true) + end + end + end self:runStop("at " .. self.running.explore) return false end @@ -2521,7 +2588,7 @@ function _M:checkAutoExplore() if game.level.map.has_seens(cx, cy) and game.level.map:checkEntity(cx, cy, Map.TERRAIN, "block_move", self, nil, true) then -- game.level.map:checkAllEntities(cx, cy, "block_move", self) then if terrain.notice then - if terrain.change_level or terrain.orb_portal then game.level.map.attrs(cx, cy, "noticed", true) end + if terrain.change_level or terrain.orb_portal or terrain.escort_portal then game.level.map.attrs(cx, cy, "noticed", true) end self:runStop("interesting terrain") return false elseif self.running.explore == "unseen" or self.running.explore == "object" and self.running.cnt ~= #self.running.path then diff --git a/game/modules/tome/data/general/events/cultists.lua b/game/modules/tome/data/general/events/cultists.lua index 2338ac2c2528d11ab55d67bacffe914f31fc98bc..7a7d6a4e8be0b99d9df8bb725d7fab22b0816e4a 100644 --- a/game/modules/tome/data/general/events/cultists.lua +++ b/game/modules/tome/data/general/events/cultists.lua @@ -52,6 +52,7 @@ for i, p in ipairs(list) do g.nice_tiler = nil g.grow = nil g.dig = nil g.special = true + g.autoexplore_ignore = true g.is_monolith = true game.zone:addEntity(game.level, g, "terrain", p.x, p.y) diff --git a/game/modules/tome/data/general/events/fearscape-portal.lua b/game/modules/tome/data/general/events/fearscape-portal.lua index d09369aee7b57dbb4e9b835e1d5bc048cc555d62..0d8d291eda4b59c8085c9eb6c2df7af926f9ca0f 100644 --- a/game/modules/tome/data/general/events/fearscape-portal.lua +++ b/game/modules/tome/data/general/events/fearscape-portal.lua @@ -166,6 +166,7 @@ g.block_move = function(self, x, y, who, act, couldpass) end self.broken = true self.change_level = nil + self.autoexplore_ignore = true end, "Destroy", "Enter") return false diff --git a/game/modules/tome/data/general/events/glowing-chest.lua b/game/modules/tome/data/general/events/glowing-chest.lua index f9861937c41cf0fc6da6e6524fdc75f6ebfa68c1..4138e679426200b82391bea4361272ca654ba5b4 100644 --- a/game/modules/tome/data/general/events/glowing-chest.lua +++ b/game/modules/tome/data/general/events/glowing-chest.lua @@ -81,6 +81,8 @@ g.block_move = function(self, x, y, who, act, couldpass) end self.chest_item = nil self.chest_guards = nil + self.block_move = nil + self.autoexplore_ignore = true end end, "Open", "Leave") return false diff --git a/game/modules/tome/data/general/events/naga-portal.lua b/game/modules/tome/data/general/events/naga-portal.lua index 1dc6d9a4e6b144fcc26431344024a8bae68c8806..cb34593573bb3ce1f4a1fcb70148c728e5d27abe 100644 --- a/game/modules/tome/data/general/events/naga-portal.lua +++ b/game/modules/tome/data/general/events/naga-portal.lua @@ -135,6 +135,7 @@ g.block_move = function(self, x, y, who, act, couldpass) end self.broken = true self.change_level = nil + self.autoexplore_ignore = true end, "Destroy", "Enter") return false diff --git a/game/modules/tome/data/general/events/old-battle-field.lua b/game/modules/tome/data/general/events/old-battle-field.lua index d8fbe32b50e9f470e0594c7ead531865ead46a54..51207d783b8c5bb75cbc561bcc3e73bcab5df5da 100644 --- a/game/modules/tome/data/general/events/old-battle-field.lua +++ b/game/modules/tome/data/general/events/old-battle-field.lua @@ -138,6 +138,7 @@ if tries < 100 then game.level.map:updateMap(x, y) self.block_move = nil + self.autoexplore_ignore = true self:change_level_check() require("engine.ui.Dialog"):simplePopup("Fall...", "As you tried to dig the grave the ground fell under you. You find yourself stranded in an eerie lit cavern.") end end) diff --git a/game/modules/tome/data/general/events/tombstones.lua b/game/modules/tome/data/general/events/tombstones.lua index 1040de533fa8caff2442aa2f8f7ff4e54414683b..9fb80a16bee1f456569c4eb7adf282d215f6abc1 100644 --- a/game/modules/tome/data/general/events/tombstones.lua +++ b/game/modules/tome/data/general/events/tombstones.lua @@ -52,6 +52,7 @@ if tries < 100 then game.level.map:updateMap(x, y) self.block_move = nil + self.autoexplore_ignore = true if rng.percent(20) then game.log("There is nothing there.") return end local m = game.zone:makeEntity(game.level, "actor", {properties={"undead"}, add_levels=10, random_boss={nb_classes=1, rank=3, ai = "tactical", loot_quantity = 0, no_loot_randart = true}}, nil, true) diff --git a/game/modules/tome/data/general/events/weird-pedestals.lua b/game/modules/tome/data/general/events/weird-pedestals.lua index 2456bc8dbf7eec67f6e65aa66a00fbf6937deeec..a6e1c0a5aa5f910cee0257dbedc1315e2db0782f 100644 --- a/game/modules/tome/data/general/events/weird-pedestals.lua +++ b/game/modules/tome/data/general/events/weird-pedestals.lua @@ -62,6 +62,8 @@ for i = 1, 3 do who:restInit(20, "inspecting", "inspected", function(cnt, max) if cnt > max then self.pedestal_activated = true + self.block_move = nil + self.autoexplore_ignore = true require("engine.ui.Dialog"):simplePopup("Weird Pedestal", "As you inspect it a shadow materializes near you, and suddenly it is no more a shadow!") local m = game.zone:makeEntity(game.level, "actor", { diff --git a/game/modules/tome/data/quests/escort-duty.lua b/game/modules/tome/data/quests/escort-duty.lua index 0e2ef508653997495c46d8f02bea87908e8f2e93..bc59e2843d89ba4ff37f7927b40b9a91f05561d2 100644 --- a/game/modules/tome/data/quests/escort-duty.lua +++ b/game/modules/tome/data/quests/escort-duty.lua @@ -392,6 +392,7 @@ on_grant = function(self, who) g.add_displays = g.add_displays or {} g.add_displays[#g.add_displays+1] = mod.class.Grid.new{image="terrain/maze_teleport.png"} g.notice = true + g.escort_portal = true g.nice_tiler = nil g.on_move = function(self, x, y, who) if not who.escort_quest then return end diff --git a/game/modules/tome/data/zones/slime-tunnels/grids.lua b/game/modules/tome/data/zones/slime-tunnels/grids.lua index 7c4438af48e0e2e24bc55f426022746dfc3264d3..48ad60c5e1899a7fafc28043ae59f9a454229933 100644 --- a/game/modules/tome/data/zones/slime-tunnels/grids.lua +++ b/game/modules/tome/data/zones/slime-tunnels/grids.lua @@ -23,22 +23,22 @@ load("/data/general/grids/slime.lua") newEntity{ define_as = "ORB_DRAGON", - name = "orb pedestal (dragon)", image = "terrain/slime/slime_floor_01.png", add_displays={class.new{image = "terrain/pedestal_01.png", display_h=2, display_y=-1}}, + name = "orb pedestal (dragon)", special = true, image = "terrain/slime/slime_floor_01.png", add_displays={class.new{image = "terrain/pedestal_01.png", display_h=2, display_y=-1}}, display = '_', color_r=255, color_g=255, color_b=255, back_color=colors.LIGHT_RED, } newEntity{ define_as = "ORB_UNDEATH", - name = "orb pedestal (undeath)", image = "terrain/slime/slime_floor_01.png", add_displays={class.new{image = "terrain/pedestal_01.png", display_h=2, display_y=-1}}, + name = "orb pedestal (undeath)", special = true, image = "terrain/slime/slime_floor_01.png", add_displays={class.new{image = "terrain/pedestal_01.png", display_h=2, display_y=-1}}, display = '_', color_r=255, color_g=255, color_b=255, back_color=colors.LIGHT_RED, } newEntity{ define_as = "ORB_ELEMENTS", - name = "orb pedestal (elements)", image = "terrain/slime/slime_floor_01.png", add_displays={class.new{image = "terrain/pedestal_01.png", display_h=2, display_y=-1}}, + name = "orb pedestal (elements)", special = true, image = "terrain/slime/slime_floor_01.png", add_displays={class.new{image = "terrain/pedestal_01.png", display_h=2, display_y=-1}}, display = '_', color_r=255, color_g=255, color_b=255, back_color=colors.LIGHT_RED, } newEntity{ define_as = "ORB_DESTRUCTION", - name = "orb pedestal (destruction)", image = "terrain/slime/slime_floor_01.png", add_displays={class.new{image = "terrain/pedestal_01.png", display_h=2, display_y=-1}}, + name = "orb pedestal (destruction)", special = true, image = "terrain/slime/slime_floor_01.png", add_displays={class.new{image = "terrain/pedestal_01.png", display_h=2, display_y=-1}}, display = '_', color_r=255, color_g=255, color_b=255, back_color=colors.LIGHT_RED, } diff --git a/game/modules/tome/load.lua b/game/modules/tome/load.lua index eafb06b1e354099ad72c32fc50cf27496a80f3b2..19a4166533f0fa9124ee55a257d36fba7ee71a5c 100644 --- a/game/modules/tome/load.lua +++ b/game/modules/tome/load.lua @@ -227,7 +227,7 @@ ActorResource:defineResource("Psi", "psi", ActorTalents.T_PSI_POOL, "psi_regen", ActorStats:defineStat("Strength", "str", 10, 1, 100, "Strength defines your character's ability to apply physical force. It increases your melee damage, damage done with heavy weapons, your chance to resist physical effects, and carrying capacity.") ActorStats:defineStat("Dexterity", "dex", 10, 1, 100, "Dexterity defines your character's ability to be agile and alert. It increases your chance to hit, your ability to avoid attacks, and your damage with light or ranged weapons.") ActorStats:defineStat("Magic", "mag", 10, 1, 100, "Magic defines your character's ability to manipulate the magical energy of the world. It increases your spell power, and the effect of spells and other magic items.") -ActorStats:defineStat("Willpower", "wil", 10, 1, 100, "Willpower defines your character's ability to concentrate. It increases your mana ,stamina and PSI capacity, and your chance to resist mental attacks.") +ActorStats:defineStat("Willpower", "wil", 10, 1, 100, "Willpower defines your character's ability to concentrate. It increases your mana, stamina and PSI capacity, and your chance to resist mental attacks.") ActorStats:defineStat("Cunning", "cun", 10, 1, 100, "Cunning defines your character's ability to learn, think, and react. It allows you to learn many worldly abilities, and increases your mental capabilities and chance of critical hits.") ActorStats:defineStat("Constitution", "con", 10, 1, 100, "Constitution defines your character's ability to withstand and resist damage. It increases your maximum life and physical resistance.") -- Luck is hidden and starts at half max value (50) which is considered the standard