Commit 43d43217df2ce81b12803803b2cbbbf0b2d0bd2a

Authored by dg
1 parent 80063db4

New object class: "rares" that work by additing random powers to a base item (not egos)

Rare monsters now drop a "rare" item


git-svn-id: http://svn.net-core.org/repos/t-engine4@5158 51575b47-30f0-44d4-a5cc-537603b46e54
... ... @@ -1168,11 +1168,11 @@ function _M:setupCommands()
1168 1168 end end,
1169 1169 [{"_g","ctrl"}] = function() if config.settings.cheat then
1170 1170 -- self:registerDialog(require("mod.dialogs.DownloadCharball").new())
1171   --- local o = game.state:generateRandart{lev=50, egos=0, power_points_factor=3, nb_powers_add=3}
  1171 +-- local o = game.zone:makeEntity(game.level,"object",{random_object=true},nil,true)
1172 1172 -- o:identify(true)
1173 1173 -- game.zone:addEntity(game.level,o,"object",game.player.x,game.player.y)
1174   --- local m = game.zone:makeEntity(game.level,"actor",{random_elite=true},nil,true)
1175   --- game.zone:addEntity(game.level,m,"actor",game.player.x,game.player.y-1)
  1174 + local m = game.zone:makeEntity(game.level,"actor",{random_elite=true},nil,true)
  1175 + game.zone:addEntity(game.level,m,"actor",game.player.x,game.player.y-1)
1176 1176 end end,
1177 1177 [{"_f","ctrl"}] = function() if config.settings.cheat then
1178 1178 self.player.quests["love-melinda"] = nil
... ...
... ... @@ -242,7 +242,7 @@ function _M:generateRandart(data)
242 242 resolvers.current_level = math.ceil(lev * 1.4)
243 243
244 244 -- Get a base object
245   - local base = data.base or game.zone:makeEntity(game.level, "object", {ingore_material_restriction=true, no_tome_drops=true, ego_filter={keep_egos=true, ego_chance=-1000}, special=function(e)
  245 + local base = data.base or game.zone:makeEntity(game.level, "object", data.base_filter or {ingore_material_restriction=true, no_tome_drops=true, ego_filter={keep_egos=true, ego_chance=-1000}, special=function(e)
246 246 return (not e.unique and e.randart_able) and (not e.material_level or e.material_level >= 2) and true or false
247 247 end}, nil, true)
248 248 if not base then game.level.level = oldlev resolvers.current_level = oldclev return end
... ... @@ -260,9 +260,10 @@ function _M:generateRandart(data)
260 260 -----------------------------------------------------------
261 261 -- Determine power
262 262 -----------------------------------------------------------
263   - local points = math.ceil((lev * 0.7 + rng.range(5, 15)) / 2) * (data.power_points_factor or 1)
  263 + local points = math.ceil(((lev * 0.7 + rng.range(5, 15)) / 2) * (data.power_points_factor or 1))
264 264 local nb_powers = 1 + rng.dice(math.max(1, lev / 17), 2) + (data.nb_powers_add or 0)
265 265 local powers = {}
  266 + print("Powers:", points, nb_powers, lev)
266 267
267 268 o.cost = o.cost + points * 7
268 269
... ... @@ -289,7 +290,7 @@ function _M:generateRandart(data)
289 290 local ngd = NameGenerator.new(rng.chance(2) and randart_name_rules.default or randart_name_rules.default2)
290 291 local ngt = (themename and randart_name_rules[themename] and NameGenerator.new(randart_name_rules[themename])) or ngd
291 292 local name
292   - local namescheme = (ngt ~= ngd) and rng.range(1, 4) or rng.range(1, 3)
  293 + local namescheme = data.namescheme or ((ngt ~= ngd) and rng.range(1, 4) or rng.range(1, 3))
293 294 if namescheme == 1 then
294 295 name = o.name.." '"..ngt:generate().."'"
295 296 elseif namescheme == 2 then
... ... @@ -301,7 +302,7 @@ function _M:generateRandart(data)
301 302 end
302 303 o.define_as = name:upper():gsub("[^A-Z]", "_")
303 304
304   - o.unided_name = rng.table{"glowing","scintillating","rune-covered","unblemished","jewel-encrusted"}.." "..o.unided_name
  305 + o.unided_name = rng.table{"glowing","scintillating","rune-covered","unblemished","jewel-encrusted"}.." "..(o.unided_name or o.name)
305 306 o.unique = name
306 307 o.randart = true
307 308 o.no_unique_lore = true
... ... @@ -424,6 +425,10 @@ function _M:generateRandart(data)
424 425 -- Setup the name
425 426 o.name = name
426 427
  428 + if data.post then
  429 + data.post(o)
  430 + end
  431 +
427 432 if data.add_pool then self:addWorldArtifact(o) end
428 433
429 434 game.level.level = oldlev
... ... @@ -1030,6 +1035,11 @@ function _M:entityFilterAlter(zone, level, type, filter)
1030 1035 end
1031 1036 end
1032 1037
  1038 + if filter.random_object then
  1039 + print("[TOME ENTITY FILTER] random object requested, removing ego chances")
  1040 + filter.ego_chance = -1000
  1041 + end
  1042 +
1033 1043 -- By default we dont apply special filters, but we always provide one so that entityFilter is called
1034 1044 return filter
1035 1045 end
... ... @@ -1066,6 +1076,7 @@ function _M:entityFilter(zone, e, filter, type)
1066 1076 end
1067 1077 end
1068 1078 if e.lore and e.rarity and util.getval(zone.no_random_lore) then return false end
  1079 + if filter.random_object and not e.randart_able then return false end
1069 1080 return true
1070 1081 else
1071 1082 return true
... ... @@ -1099,7 +1110,7 @@ function _M:entityFilterPost(zone, level, type, e, filter)
1099 1110 rank=3.2, ai = "tactical",
1100 1111 life_rating=function(v) return v * 1.3 + 2 end,
1101 1112 loot_quality = "store",
1102   - loot_quantity = 1,
  1113 + loot_quantity = 0,
1103 1114 drop_equipment = false,
1104 1115 no_loot_randart = true,
1105 1116 resources_boost = 1.5,
... ... @@ -1121,10 +1132,27 @@ function _M:entityFilterPost(zone, level, type, e, filter)
1121 1132 b.inc_damage = b.inc_damage or {}
1122 1133 b.inc_damage.all = (b.inc_damage.all or 0) - 40 * (20 - data.level + 1) / 20
1123 1134 end
  1135 +
  1136 + -- Drop
  1137 + local o = game.zone:makeEntity(game.level,"object", {random_object=true}, nil, true)
  1138 + b:addObject(b.INVEN_INVEN, o)
  1139 + game.zone:addEntity(game.level, o, "object")
1124 1140 end,
1125 1141 }
1126 1142 e = self:createRandomBoss(e, table.merge(base, filter.random_elite, true))
1127 1143 end
  1144 + elseif type == "object" then
  1145 + if filter.random_object and not e.unique and e.randart_able then
  1146 + e = game.state:generateRandart{
  1147 + lev = math.max(4, game.zone:level_adjust_level(game.level, game.zone, "object")),
  1148 + egos = 0,
  1149 + power_points_factor = 3,
  1150 + nb_powers_add = 1,
  1151 + base = e,
  1152 + post = function(o) o.rare = true o.unique = nil o.randart = nil end,
  1153 + namescheme = 3
  1154 + }
  1155 + end
1128 1156 end
1129 1157
1130 1158 return e
... ...
... ... @@ -194,7 +194,7 @@ function _M:getPowerRank()
194 194 if self.godslayer then return 10 end
195 195 if self.unique then return 3 end
196 196 if self.egoed and self.greater_ego then return 2 end
197   - if self.egoed then return 1 end
  197 + if self.egoed or self.rare then return 1 end
198 198 return 0
199 199 end
200 200
... ... @@ -210,6 +210,8 @@ function _M:getDisplayColor()
210 210 else
211 211 return {255, 215, 0}, "#FFD700#"
212 212 end
  213 + elseif self.rare then
  214 + return {250, 128, 114}, "#SALMON#"
213 215 elseif self.egoed then
214 216 if self.greater_ego then
215 217 if self.greater_ego > 1 then
... ...