diff --git a/game/modules/tome/class/Actor.lua b/game/modules/tome/class/Actor.lua index 077418dbfdd09d1ccd1a45f50eba90338a4b5775..e74bf12465cbb0e249c0030eed2c68946cbef2b4 100644 --- a/game/modules/tome/class/Actor.lua +++ b/game/modules/tome/class/Actor.lua @@ -4057,7 +4057,7 @@ function _M:worthExp(target) end --- Remove all effects based on a filter -function _M:removeEffectsFilter(t, nb) +function _M:removeEffectsFilter(t, nb, silent, force) nb = nb or 100000 local effs = {} local removed = 0 @@ -4073,7 +4073,7 @@ function _M:removeEffectsFilter(t, nb) while #effs > 0 and nb > 0 do local eff = rng.tableRemove(effs) - self:removeEffect(eff) + self:removeEffect(eff, silent, force) nb = nb - 1 removed = removed + 1 end @@ -4445,6 +4445,12 @@ function _M:addedToLevel(level, x, y) if game.level.data.zero_gravity then self:setEffect(self.EFF_ZERO_GRAVITY, 1, {}) else self:removeEffect(self.EFF_ZERO_GRAVITY, nil, true) end + if game.level.data.effects and game.level.data.effects_allow then + for _, effid in ipairs(game.level.data.effects) do + self:setEffect(effid, 1, {}) + end + end + self:check("on_added_to_level", level, x, y) end diff --git a/game/modules/tome/class/Game.lua b/game/modules/tome/class/Game.lua index 98a21c8bdb74b1756ff19bb3b7d01fa857c2d8db..fc43b8223182f2ec67b3b9d2364274d345ba9cfe 100644 --- a/game/modules/tome/class/Game.lua +++ b/game/modules/tome/class/Game.lua @@ -850,12 +850,21 @@ function _M:changeLevelReal(lev, zone, params) self.zone_name_s = nil -- Special stuff + for uid, act in pairs(self.level.entities) do if act.setEffect then act:removeEffectsFilter(function(e) return e.zone_wide_effect end, nil, nil, true) end end for uid, act in pairs(self.level.entities) do if act.setEffect then if self.level.data.zero_gravity then act:setEffect(act.EFF_ZERO_GRAVITY, 1, {}) else act:removeEffect(act.EFF_ZERO_GRAVITY, nil, true) end end end + if self.level.data.effects then + for uid, act in pairs(self.level.entities) do + if act.setEffect then for _, effid in ipairs(self.level.data.effects) do + act:setEffect(effid, 1, {}) + end end + end + end + self.level.data.effects_allow = true -- Level feeling local feeling diff --git a/game/modules/tome/data/gfx/effects/zone_aura_acid.png b/game/modules/tome/data/gfx/effects/zone_aura_acid.png new file mode 100644 index 0000000000000000000000000000000000000000..64d9fb319f58b46f7d61cad32e51ecbc7ad9b6a5 Binary files /dev/null and b/game/modules/tome/data/gfx/effects/zone_aura_acid.png differ diff --git a/game/modules/tome/data/gfx/effects/zone_aura_arcane.png b/game/modules/tome/data/gfx/effects/zone_aura_arcane.png new file mode 100644 index 0000000000000000000000000000000000000000..143aee899de34beee7efd47fd730c15a469758b9 Binary files /dev/null and b/game/modules/tome/data/gfx/effects/zone_aura_arcane.png differ diff --git a/game/modules/tome/data/gfx/effects/zone_aura_blight.png b/game/modules/tome/data/gfx/effects/zone_aura_blight.png new file mode 100644 index 0000000000000000000000000000000000000000..7dd8362e32d32b6a2415fb4f1b5673b5e763352d Binary files /dev/null and b/game/modules/tome/data/gfx/effects/zone_aura_blight.png differ diff --git a/game/modules/tome/data/gfx/effects/zone_aura_cold.png b/game/modules/tome/data/gfx/effects/zone_aura_cold.png new file mode 100644 index 0000000000000000000000000000000000000000..68cbb39b23ed7a08b863535fa1ec86eb9360ca46 Binary files /dev/null and b/game/modules/tome/data/gfx/effects/zone_aura_cold.png differ diff --git a/game/modules/tome/data/gfx/effects/zone_aura_darkness.png b/game/modules/tome/data/gfx/effects/zone_aura_darkness.png new file mode 100644 index 0000000000000000000000000000000000000000..fb83ecf1fd3fcdf6d87e06871261a5604c7eec89 Binary files /dev/null and b/game/modules/tome/data/gfx/effects/zone_aura_darkness.png differ diff --git a/game/modules/tome/data/gfx/effects/zone_aura_fire.png b/game/modules/tome/data/gfx/effects/zone_aura_fire.png new file mode 100644 index 0000000000000000000000000000000000000000..2b051171bd59fd3685fa52c25ece0389edaf2ece Binary files /dev/null and b/game/modules/tome/data/gfx/effects/zone_aura_fire.png differ diff --git a/game/modules/tome/data/gfx/effects/zone_aura_light.png b/game/modules/tome/data/gfx/effects/zone_aura_light.png new file mode 100644 index 0000000000000000000000000000000000000000..62847bd48e432b6cfa2d5481229c0f379ab35c81 Binary files /dev/null and b/game/modules/tome/data/gfx/effects/zone_aura_light.png differ diff --git a/game/modules/tome/data/gfx/effects/zone_aura_lightning.png b/game/modules/tome/data/gfx/effects/zone_aura_lightning.png new file mode 100644 index 0000000000000000000000000000000000000000..8bd972553f3bd5b46b853f9365149dcac129acfd Binary files /dev/null and b/game/modules/tome/data/gfx/effects/zone_aura_lightning.png differ diff --git a/game/modules/tome/data/gfx/effects/zone_aura_mind.png b/game/modules/tome/data/gfx/effects/zone_aura_mind.png new file mode 100644 index 0000000000000000000000000000000000000000..ce030dca06cc52dbfe9051b9aca56d99125208f1 Binary files /dev/null and b/game/modules/tome/data/gfx/effects/zone_aura_mind.png differ diff --git a/game/modules/tome/data/gfx/effects/zone_aura_nature.png b/game/modules/tome/data/gfx/effects/zone_aura_nature.png new file mode 100644 index 0000000000000000000000000000000000000000..bafba0ad5c4754b2859cb394c423728e81e37881 Binary files /dev/null and b/game/modules/tome/data/gfx/effects/zone_aura_nature.png differ diff --git a/game/modules/tome/data/gfx/effects/zone_aura_physical.png b/game/modules/tome/data/gfx/effects/zone_aura_physical.png new file mode 100644 index 0000000000000000000000000000000000000000..f2b735f73e52901e46998a42cda99fc4836fd006 Binary files /dev/null and b/game/modules/tome/data/gfx/effects/zone_aura_physical.png differ diff --git a/game/modules/tome/data/gfx/effects/zone_aura_temporal.png b/game/modules/tome/data/gfx/effects/zone_aura_temporal.png new file mode 100644 index 0000000000000000000000000000000000000000..180f8d106b9f1702c1f2ef6d913f1b3031ebfd15 Binary files /dev/null and b/game/modules/tome/data/gfx/effects/zone_aura_temporal.png differ diff --git a/game/modules/tome/data/timed_effects/other.lua b/game/modules/tome/data/timed_effects/other.lua index 1f67aff59d722fbd676b0dcf3d83bfec221658fa..0e53d746662d22ef869422160ac81fb208c95b3d 100644 --- a/game/modules/tome/data/timed_effects/other.lua +++ b/game/modules/tome/data/timed_effects/other.lua @@ -617,7 +617,7 @@ newEffect{ type = "other", subtype = { spacetime=true }, status = "detrimental", - cancel_on_level_change = true, + zone_wide_effect = true, parameters = {}, on_merge = function(self, old_eff, new_eff) return old_eff @@ -1848,3 +1848,255 @@ newEffect{ end end, } + +newEffect{ + name = "ZONE_AURA_FIRE", + desc = "Oil mist", + no_stop_enter_worlmap = true, + long_desc = function(self, eff) return ("Zone-wide effect: +10% fire damage, -10% fire resistance, -10% armour, -2 sight range.") end, + decrease = 0, no_remove = true, + type = "other", + subtype = { aura=true }, + status = "detrimental", + zone_wide_effect = true, + parameters = {}, + activate = function(self, eff) + self:effectTemporaryValue(eff, "resists", {[DamageType.FIRE]=-10}) + self:effectTemporaryValue(eff, "inc_damage", {[DamageType.FIRE]=10}) + self:effectTemporaryValue(eff, "sight", -2) + self:effectTemporaryValue(eff, "combat_armor", -math.ceil(self:combatArmor() * 0.1)) + end, + deactivate = function(self, eff) + end, +} + +newEffect{ + name = "ZONE_AURA_COLD", + desc = "Grave chill", + no_stop_enter_worlmap = true, + long_desc = function(self, eff) return ("Zone-wide effect: +10% cold damage, -10% cold resistance, -10% physical save, -20% confusion immunity.") end, + decrease = 0, no_remove = true, + type = "other", + subtype = { aura=true }, + status = "detrimental", + zone_wide_effect = true, + parameters = {}, + activate = function(self, eff) + self:effectTemporaryValue(eff, "resists", {[DamageType.COLD]=-10}) + self:effectTemporaryValue(eff, "inc_damage", {[DamageType.COLD]=10}) + self:effectTemporaryValue(eff, "confusion_immune", -0.2) + self:effectTemporaryValue(eff, "combat_physresist", -math.ceil(self:combatPhysicalResist(true) * 0.1)) + end, + deactivate = function(self, eff) + end, +} + +newEffect{ + name = "ZONE_AURA_LIGHTNING", + desc = "Static discharge", + no_stop_enter_worlmap = true, + long_desc = function(self, eff) return ("Zone-wide effect: +10% lightning damage, -10% lightning resistance, -10% physical power, -20% stun immunity.") end, + decrease = 0, no_remove = true, + type = "other", + subtype = { aura=true }, + status = "detrimental", + zone_wide_effect = true, + parameters = {}, + activate = function(self, eff) + self:effectTemporaryValue(eff, "resists", {[DamageType.LIGHTNING]=-10}) + self:effectTemporaryValue(eff, "inc_damage", {[DamageType.LIGHTNING]=10}) + self:effectTemporaryValue(eff, "stun_immune", -0.2) + self:effectTemporaryValue(eff, "combat_dam", -math.ceil(self:combatPhysicalpower() * 0.1)) + end, + deactivate = function(self, eff) + end, +} + +newEffect{ + name = "ZONE_AURA_ACID", + desc = "Noxious fumes", + no_stop_enter_worlmap = true, + long_desc = function(self, eff) return ("Zone-wide effect: +10% acid damage, -10% acid resistance, -10% defense, -20% disarm immunity.") end, + decrease = 0, no_remove = true, + type = "other", + subtype = { aura=true }, + status = "detrimental", + zone_wide_effect = true, + parameters = {}, + activate = function(self, eff) + self:effectTemporaryValue(eff, "resists", {[DamageType.ACID]=-10}) + self:effectTemporaryValue(eff, "inc_damage", {[DamageType.ACID]=10}) + self:effectTemporaryValue(eff, "disarm_immune", -0.2) + self:effectTemporaryValue(eff, "combat_def", -math.ceil(self:combatDefense(true) * 0.1)) + end, + deactivate = function(self, eff) + end, +} + +newEffect{ + name = "ZONE_AURA_DARKNESS", + desc = "Echoes of the void", + no_stop_enter_worlmap = true, + long_desc = function(self, eff) return ("Zone-wide effect: +10% darkness damage, -10% darkness resistance, -10% mental save, -20% fear immunity.") end, + decrease = 0, no_remove = true, + type = "other", + subtype = { aura=true }, + status = "detrimental", + zone_wide_effect = true, + parameters = {}, + activate = function(self, eff) + self:effectTemporaryValue(eff, "resists", {[DamageType.DARKNESS]=-10}) + self:effectTemporaryValue(eff, "inc_damage", {[DamageType.DARKNESS]=10}) + self:effectTemporaryValue(eff, "fear_immune", -0.2) + self:effectTemporaryValue(eff, "combat_mentalresist", -math.ceil(self:combatMentalResist(true) * 0.1)) + end, + deactivate = function(self, eff) + end, +} + +newEffect{ + name = "ZONE_AURA_MIND", + desc = "Eerie silence", + no_stop_enter_worlmap = true, + long_desc = function(self, eff) return ("Zone-wide effect: +10% mind damage, -10% mind resistance, -10% spellpower, -20% silence immunity.") end, + decrease = 0, no_remove = true, + type = "other", + subtype = { aura=true }, + status = "detrimental", + zone_wide_effect = true, + parameters = {}, + activate = function(self, eff) + self:effectTemporaryValue(eff, "resists", {[DamageType.MIND]=-10}) + self:effectTemporaryValue(eff, "inc_damage", {[DamageType.MIND]=10}) + self:effectTemporaryValue(eff, "silence_immune", -0.2) + self:effectTemporaryValue(eff, "combat_spellpower", -math.ceil(self:combatSpellpower() * 0.1)) + end, + deactivate = function(self, eff) + end, +} + +newEffect{ + name = "ZONE_AURA_LIGHT", + desc = "Aura of light", + no_stop_enter_worlmap = true, + long_desc = function(self, eff) return ("Zone-wide effect: +10% light damage, -10% light resistance, -10% accuracy, -20% blind immunity.") end, + decrease = 0, no_remove = true, + type = "other", + subtype = { aura=true }, + status = "detrimental", + zone_wide_effect = true, + parameters = {}, + activate = function(self, eff) + self:effectTemporaryValue(eff, "resists", {[DamageType.LIGHT]=-10}) + self:effectTemporaryValue(eff, "inc_damage", {[DamageType.LIGHT]=10}) + self:effectTemporaryValue(eff, "blind_immune", -0.2) + self:effectTemporaryValue(eff, "combat_atk", -math.ceil(self:combatAttack() * 0.1)) + end, + deactivate = function(self, eff) + end, +} + +newEffect{ + name = "ZONE_AURA_ARCANE", + desc = "Aether residue", + no_stop_enter_worlmap = true, + long_desc = function(self, eff) return ("Zone-wide effect: +10% arcane damage, -10% arcane resistance, -10% armour hardiness, -20% stoning immunity.") end, + decrease = 0, no_remove = true, + type = "other", + subtype = { aura=true }, + status = "detrimental", + zone_wide_effect = true, + parameters = {}, + activate = function(self, eff) + self:effectTemporaryValue(eff, "resists", {[DamageType.ARCANE]=-10}) + self:effectTemporaryValue(eff, "inc_damage", {[DamageType.ARCANE]=10}) + self:effectTemporaryValue(eff, "stone_immune", -0.2) + self:effectTemporaryValue(eff, "combat_armor_hardiness", -math.ceil(self:combatArmorHardiness() * 0.1)) + end, + deactivate = function(self, eff) + end, +} + +newEffect{ + name = "ZONE_AURA_TEMPORAL", + desc = "Impossible geometries", + no_stop_enter_worlmap = true, + long_desc = function(self, eff) return ("Zone-wide effect: +10% temporal damage, -10% temporal resistance, -10% spell save, -20% pinning immunity.") end, + decrease = 0, no_remove = true, + type = "other", + subtype = { aura=true }, + status = "detrimental", + zone_wide_effect = true, + parameters = {}, + activate = function(self, eff) + self:effectTemporaryValue(eff, "resists", {[DamageType.TEMPORAL]=-10}) + self:effectTemporaryValue(eff, "inc_damage", {[DamageType.TEMPORAL]=10}) + self:effectTemporaryValue(eff, "pin_immune", -0.2) + self:effectTemporaryValue(eff, "combat_spellresist", -math.ceil(self:combatSpellResist(true) * 0.1)) + end, + deactivate = function(self, eff) + end, +} + +newEffect{ + name = "ZONE_AURA_PHYSICAL", + desc = "Uncontrolled anger", + no_stop_enter_worlmap = true, + long_desc = function(self, eff) return ("Zone-wide effect: +10% physical damage, -10% physical resistance, -10% mindpower, -20% knockback immunity.") end, + decrease = 0, no_remove = true, + type = "other", + subtype = { aura=true }, + status = "detrimental", + zone_wide_effect = true, + parameters = {}, + activate = function(self, eff) + self:effectTemporaryValue(eff, "resists", {[DamageType.PHYSICAL]=-10}) + self:effectTemporaryValue(eff, "inc_damage", {[DamageType.PHYSICAL]=10}) + self:effectTemporaryValue(eff, "knockback_immune", -0.2) + self:effectTemporaryValue(eff, "combat_mindpower", -math.ceil(self:combatMindpower() * 0.1)) + end, + deactivate = function(self, eff) + end, +} + +newEffect{ + name = "ZONE_AURA_BLIGHT", + desc = "Miasma", + no_stop_enter_worlmap = true, + long_desc = function(self, eff) return ("Zone-wide effect: +10% blight damage, -10% blight resistance, -20% healing mod, -20% disease immunity.") end, + decrease = 0, no_remove = true, + type = "other", + subtype = { aura=true }, + status = "detrimental", + zone_wide_effect = true, + parameters = {}, + activate = function(self, eff) + self:effectTemporaryValue(eff, "resists", {[DamageType.BLIGHT]=-10}) + self:effectTemporaryValue(eff, "inc_damage", {[DamageType.BLIGHT]=10}) + self:effectTemporaryValue(eff, "stone_immune", -0.2) + self:effectTemporaryValue(eff, "healing_factor", -0.2) + end, + deactivate = function(self, eff) + end, +} + +newEffect{ + name = "ZONE_AURA_NATURE", + desc = "Slimy floor", + no_stop_enter_worlmap = true, + long_desc = function(self, eff) return ("Zone-wide effect: +10% nature damage, -10% nature resistance, -10% ranged defense, -20% poison immunity.") end, + decrease = 0, no_remove = true, + type = "other", + subtype = { aura=true }, + status = "detrimental", + zone_wide_effect = true, + parameters = {}, + activate = function(self, eff) + self:effectTemporaryValue(eff, "resists", {[DamageType.NATURE]=-10}) + self:effectTemporaryValue(eff, "inc_damage", {[DamageType.NATURE]=10}) + self:effectTemporaryValue(eff, "poison_immune", -0.2) + self:effectTemporaryValue(eff, "combat_def_ranged", -math.ceil(self:combatDefenseRanged(true) * 0.1)) + end, + deactivate = function(self, eff) + end, +} diff --git a/game/modules/tome/data/zones/high-peak/zone.lua b/game/modules/tome/data/zones/high-peak/zone.lua index 062147f7fee2232521b9f7b1588b4e36d3732fdf..d821cbdcb70775df147fe0567d17964a13372fb4 100644 --- a/game/modules/tome/data/zones/high-peak/zone.lua +++ b/game/modules/tome/data/zones/high-peak/zone.lua @@ -40,7 +40,7 @@ return { map = { class = "engine.generator.map.Roomer", nb_rooms = 10, - rooms = {"random_room", {"pit",3}, {"lesser_vault",3}, {"greater_vault",5}}, + rooms = {"random_room", {"pit",3}, {"lesser_vault",2}, {"greater_vault",3}}, rooms_config = {pit={filters={{type="orc"}, {type="naga"}, {type="dragon"}, {type="demon"}}}}, lesser_vaults_list = {"circle"}, lite_room_chance = 10, @@ -83,6 +83,16 @@ return { game.player:hasQuest("high-peak"):failed_charred_scar(level) end end + + if level.level <= 10 then + local p = game.player + local effid = rng.table{ + p.EFF_ZONE_AURA_FIRE, p.EFF_ZONE_AURA_COLD, p.EFF_ZONE_AURA_LIGHTNING, p.EFF_ZONE_AURA_ACID, + p.EFF_ZONE_AURA_DARKNESS, p.EFF_ZONE_AURA_MIND, p.EFF_ZONE_AURA_LIGHT, p.EFF_ZONE_AURA_ARCANE, + p.EFF_ZONE_AURA_TEMPORAL, p.EFF_ZONE_AURA_PHYSICAL, p.EFF_ZONE_AURA_BLIGHT, p.EFF_ZONE_AURA_NATURE, + } + level.data.effects = {effid} + end end, on_turn = function(self) if not game.level.allow_portals then return end diff --git a/ideas/todo b/ideas/todo index 92ed6e9385e96899bd082bcc361f4c2ae7bf1648..21d846de98f2e5cfbf80bcf24b54c89321fca28c 100644 --- a/ideas/todo +++ b/ideas/todo @@ -1,7 +1,6 @@ * RSS feed of events in a character's life, exportable to FB * auto-leveling for beginners/lazy * sleep => replace all talents with spcial dream talents, freeze all tmp effects -* daze => ??? after v1: * donator's fight club