Commit 43d43217df2ce81b12803803b2cbbbf0b2d0bd2a
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
Showing
3 changed files
with
39 additions
and
9 deletions
... | ... | @@ -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 | ... | ... |
-
Please register or login to post a comment