mirror of
https://github.com/cave-story-randomizer/cave-story-randomizer
synced 2025-05-06 06:54:25 +00:00
fixes outer wall infloop, improves error handling, fixes puppy placement
This commit is contained in:
parent
a3431e2fc6
commit
770fd79308
|
@ -1 +1 @@
|
|||
=:S``i`=:l}~qls}<7D>``flvqy````lu~t=:S``ia=:l}~qls}<7D>``flvqy```alu~t=:S``ib=:l}~qls}<7D>``flvqy```blu~t=:S``ic=:l}~qls}<7D>``flvqy```clu~t=:S``id=:l}~qls}<7D>``flvqy```dlu~t=:S``ii=:l{u炼}~qls}<7D>``f=:lq~<7E>`a``j```aj````lvqy```d=:ls~<7E>`c`aj`aabj```bl𩺰y`a``=:lq~<7E>`a``j````j````=:l}缆````lt~<7E>`c`al<61>slu~t=:S`a``=:l{u炼}<7D>t𡼏<74>仙<EFBFBD>䣳P<E4A3B3>P<EFBFBD>P<EFBFBD>Pq═坾㏄<E59DBE>=:<3A>奴𦶧l轮z````ls|=:ls~<7E>`c``j`aaaj```blx}sl𩺰y``f`lq~<7E>`a``j```aj````=:l𩺰y`a``lvq```dl<64>q```aj``iij```ej```h=:=:=:=:S`a`a=:l<><6C>l<EFBFBD><6C>`aalt~<7E>`a`alvq````l<>q``bij``i`j``ahj```i=:=:S`a`b=:l<><6C>l<EFBFBD><6C>`aalt~<7E>`a`alvq````l<>q``caj``i`j``ahj```i=:S`a`c=:l<><6C>l<EFBFBD><6C>`aalt~<7E>`a`clvq```dlv|z`eicj`a`el<65>q``ccj``idj``abj``a`=:S`a`d=:l<><6C>lvq```dl<64>q``cdj``idj```ej``ab=:S`a`e=:l<><6C>l<EFBFBD>q``cfj``idj``abj``a`=:S`a`f=:l<><6C>lvq```dl<64>q```ij``idj```cj``ei=:S`ae`=:l<><6C>l}<7D>l<EFBFBD><6C>=:PPPPPPPPPPPPPPPz<50><7A>WΝx䰻<78>l~tlu~t=:S`aea=:l<><6C>l}<7D>l<EFBFBD><6C>=:PPPPP<50>腼P<E885BC>周<EFBFBD>P<EFBFBD><50>P<EFBFBD><50>P<EFBFBD>叚<EFBFBD>䰻<EFBFBD>l~tlu~t=:S`b``=:l{u炼<75>z```gj`b`al<61>[```glu<6C>`b`b=:S`b`a=:l<><6C>u<EFBFBD>`b`b=:S`b`b=:l{u炼}缆```blt~<7E>`b``lv}<7D>v~`b`aj``afl𩺰y`a``l<><6C>=:l}<7D>yP<79>𠠬r<F0A0A0AC><72>𢰦<EFBFBD><F0A2B0A6><EFBFBD>P<EFBFBD>=:<3A>Ν𤣳予^^^ls}<7D>```l~tls|=:ls~<7E>`b`fj``fgj````l𩺰y``a`l𩺰y``i`=:lq~<7E>`b`fj``acj````=:l}<7D>lvqs``af<61><66>憕<EFBFBD>P<EFBFBD>中<EFBFBD>P<EFBFBD>腼ol~tls|lvqs````=:l<>q``e`l𩺰y``b`=:l}<7D>=:oQl𩺰y``e`l~tls|<7C>vqs``ae~髿P<E9ABBF>佅驣Ν<E9A9A3>P<EFBFBD><50>=:<3A>㎜<EFBFBD>P<EFBFBD>P<EFBFBD>匕<EFBFBD><E58C95>𧊀<EFBFBD>^l~tls|lq~<7E>`b`fj``b`j````=:lrq``b`ls}<7D>``glr<6C>````=:l<><6C>`ba`j``a`l<><6C>`ba`j``aalu~t=:S`b`a=:S`b`b=:S`b`c=:S`b`d=:S`b`e=:S`b`f=:S`ba`=:l{u炼𩺰y`be`ls}<7D>```=:l<><6C>}<7D>ls}<7D>`ae=:t<><74><EFBFBD>硂<E7A182><7F>Ql𩺰y`af`l~tls|<7C><>P<EFBFBD><50>憕<EFBFBD>P<EFBFBD>𠠬<EFBFBD>𢶠<EFBFBD><F0A2B6A0>Ν<EFBFBD><CE9D>=:<3A><>P<EFBFBD>𣶸<EFBFBD>^l~tls|=:lv}``afls}<7D>``f=:l<><6C>`ba`j``a`l<><6C>`ba`j``aalu~t=:=:S0bb`=:lv|z`bgbj`bbalu~t=:S`bba=:l{u炼t~<7E>`bb`l}缆````l𩺰y``e`=:lq~<7E>`b`bj``a`j````l𩺰y``dd=:lq~<7E>`b`cj``a`j```bl𩺰y`abh=:lt~<7E>`b`blt~<7E>`b`clv|[`bgclu~t=:S`bc`=:lv|z`fb`j`bcc=:lv|z`bghj`bcb=:l<><6C>l}<7D>|<7C><>𣻸^^l~tlu~t=:S`bca=:l𩺰y``e`=:lq~<7E>`b`dj``a`j````l𩺰y```h=:lq~<7E>`b`ej``a`j```bl𩺰y`abh=:lt~<7E>`b`dlt~<7E>`b`elu<6C>`bcb=:S`bcb=:l<><6C>lvq```dl<64>q``cej`e``j```ej```i=:S`bcc=:l<><6C>lvq```dl<64>q``cej``idj```ej```i=:S`c``=:S`c`a=:S`ca`=:S`cb`=:l{u炼t~<7E>`cb`ls}<7D>```l}缆````l𩺰y``e`=:lq~<7E>`ca`j```aj```bl}<7D>lvqs``be=:QQl~tls|=:lq~<7E>`ca`j```cj````l𩺰y`ae`=:lt~<7E>`ca`l<><6C>u~t=:S`cd`=:lv|z`eicj`cdalu~t=:S`cda=:lv|z`bgdj`cdblu~t=:S`cdb=:lv|[`bh`lt~<7E>`cd`lu~t=:S`ce`=:l<><6C>l}<7D>qP<71><50>憕<EFBFBD>Ν<EFBFBD><CE9D>P<EFBFBD><50><EFBFBD>P<EFBFBD>P膄^^^l~tlu~t=:S`cf`=:l<><6C>l}<7D>l<EFBFBD><6C>佅𠠬<E4BD85>P<EFBFBD>𠠬<EFBFBD><F0A0A0AC>P<EFBFBD><50>\P<>佅𠠬𢅛<F0A0A0AC>=:𩡗𤟠<F0A9A197>佅P<E4BD85>P<EFBFBD><50>袇P<E8A287>佅𠠬<E4BD85>𠠬<EFBFBD><F0A0A0AC>=:<3A>ㄒP<E38492><50><EFBFBD>婱<EFBFBD>𠠬<EFBFBD><F0A0A0AC>γl~tls|<7C><><EFBFBD>P<EFBFBD>鴂Ν𢅛𠠬<F0A2859B><F0A0A0AC><EFBFBD>P<EFBFBD><50>=:𩡗ㄘ<F0A9A197><E38498>^l~tlu~t=:S`d`a=:lt~<7E>`d`alv|[`bgelu<6C>`dba=:S`d`b=:l<><6C>l}<7D>l<EFBFBD><6C>a`el<65><6C><EFBFBD>Ql~tlt~<7E>`d`blv|[`bgflu<6C>``b`=:S`daa=:lt~<7E>`daalu~t=:S`dab=:l<><6C>l<EFBFBD><6C>`bbls~<7E>`dabj``baj````=:lv|[`bgilu<6C>`dbc=:S`dba=:lu<6C>``b`=:S`dbb=:lu<6C>``b`=:S`dbc=:lu<6C>``b`=:S`e``=:l<><6C>lt~<7E>`e``l<><6C>`bblu<6C>`e`b=:S`e`a=:l<><6C>lt~<7E>`e`al<61><6C>`bblu<6C>`e`c=:S`e`b=:lu<6C>``ad=:S`e`c=:lu<6C>``ad=:S`f``=:S`f`a=:l{u炼}~qls}<7D>``f=:lq~<7E>`fa`j```aj````lvqy```d=:ls~<7E>`f`aj`aabj````l𩺰y`a``=:lq~<7E>`fa`j````j````=:l}缆````lt~<7E>`f`al<61>slu~t=:S`fa`=:l{u炼v|z`bdcj`faa=:l{u炼}<7D>qP<71><50><EFBFBD>═佅^l~tls|<7C>匕<EFBFBD>Ν<EFBFBD>P<EFBFBD><50>兣l~tlu~t=:S`faa=:ls~<7E>`f``j`aaaj```blx}sl𩺰y``f`lq~<7E>`fa`j```aj````=:l𩺰y`a``lvq```dl<64>q```ij`f`aj``ahj``fd=:Sab``=:l{u炼q~<7E>ab``j``b`j```a=:lv~ab``j``aflvqy```a=:l𩺰y`a``lvq```al<61>q``cijab``j``faj``ab
|
||||
=:S``i`=:l}~qls}<7D>``flvqy````lu~t=:S``ia=:l}~qls}<7D>``flvqy```alu~t=:S``ib=:l}~qls}<7D>``flvqy```blu~t=:S``ic=:l}~qls}<7D>``flvqy```clu~t=:S``id=:l}~qls}<7D>``flvqy```dlu~t=:S``ii=:l{u炼}~qls}<7D>``f=:lq~<7E>`a``j```aj````lvqy```d=:ls~<7E>`c`aj`aabj```bl𩺰y`a``=:lq~<7E>`a``j````j````=:l}缆````lt~<7E>`c`al<61>slu~t=:S`a``=:l{u炼}<7D>t𡼏<74>仙<EFBFBD>䣳P<E4A3B3>P<EFBFBD>P<EFBFBD>Pq═坾㏄<E59DBE>=:<3A>奴𦶧l轮z````ls|=:ls~<7E>`c``j`aaaj```blx}sl𩺰y``f`lq~<7E>`a``j```aj````=:l𩺰y`a``lvq```dl<64>q```aj``iij```ej```h=:=:=:=:S`a`a=:l<><6C>l<EFBFBD><6C>`aalt~<7E>`a`alvq````l<>q``bij``i`j``ahj```i=:=:S`a`b=:l<><6C>l<EFBFBD><6C>`aalt~<7E>`a`alvq````l<>q``caj``i`j``ahj```i=:S`a`c=:l<><6C>l<EFBFBD><6C>`aalt~<7E>`a`clvq```dlv|z`eicj`a`el<65>q``ccj``idj``abj``a`=:S`a`d=:l<><6C>lvq```dl<64>q``cdj``idj```ej``ab=:S`a`e=:l<><6C>l<EFBFBD>q``cfj``idj``abj``a`=:S`a`f=:l<><6C>lvq```dl<64>q```ij``idj```cj``ei=:S`ae`=:l<><6C>l}<7D>l<EFBFBD><6C>=:PPPPPPPPPPPPPPPz<50><7A>WΝx䰻<78>l~tlu~t=:S`aea=:l<><6C>l}<7D>l<EFBFBD><6C>=:PPPPP<50>腼P<E885BC>周<EFBFBD>P<EFBFBD><50>P<EFBFBD><50>P<EFBFBD>叚<EFBFBD>䰻<EFBFBD>l~tlu~t=:S`b``=:l{u炼<75>z```gj`b`al<61>[```glu<6C>`b`b=:S`b`a=:l<><6C>u<EFBFBD>`b`b=:S`b`b=:l{u炼}缆```blt~<7E>`b``lv}<7D>v~`b`aj``afl𩺰y`a``l<><6C>=:l}<7D>yP<79>𠠬r<F0A0A0AC><72>𢰦<EFBFBD><F0A2B0A6><EFBFBD>P<EFBFBD>=:<3A>Ν𤣳予^^^ls}<7D>```l~tls|=:ls~<7E>`b`fj``fgj````l𩺰y``a`l𩺰y``i`=:lq~<7E>`b`fj``acj````=:l}<7D>lvqs``af<61><66>憕<EFBFBD>P<EFBFBD>中<EFBFBD>P<EFBFBD>腼ol~tls|lvqs````=:l<>q``e`l𩺰y``b`=:l}<7D>=:oQl𩺰y``e`l~tls|<7C>vqs``ae~髿P<E9ABBF>佅驣Ν<E9A9A3>P<EFBFBD><50>=:<3A>㎜<EFBFBD>P<EFBFBD>P<EFBFBD>匕<EFBFBD><E58C95>𧊀<EFBFBD>^l~tls|lq~<7E>`b`fj``b`j````=:lrq``b`ls}<7D>``glr<6C>````=:l<><6C>`ba`j``a`l<><6C>`ba`j``aalu~t=:S`b`a=:S`b`b=:S`b`c=:S`b`d=:S`b`e=:S`b`f=:S`ba`=:l{u炼𩺰y`be`ls}<7D>```=:l<><6C>}<7D>ls}<7D>`ae=:t<><74><EFBFBD>硂<E7A182><7F>Ql𩺰y`af`l~tls|<7C><>P<EFBFBD><50>憕<EFBFBD>P<EFBFBD>𠠬<EFBFBD>𢶠<EFBFBD><F0A2B6A0>Ν<EFBFBD><CE9D>=:<3A><>P<EFBFBD>𣶸<EFBFBD>^l~tls|=:lv}``afls}<7D>``f=:l<><6C>`ba`j``a`l<><6C>`ba`j``aalu~t=:=:S0bb`=:lv|z`bgbj`bbalu~t=:S`bba=:l{u炼t~<7E>`bb`l}缆````l𩺰y``e`=:lq~<7E>`b`bj``a`j````l𩺰y``dd=:lq~<7E>`b`cj``a`j```bl𩺰y`abh=:lt~<7E>`b`blt~<7E>`b`clv|[`bgclu~t=:S`bc`=:lv|z`fb`j`bcc=:lv|z`bghj`bcb=:l<><6C>l}<7D>|<7C><>𣻸^^l~tlu~t=:S`bca=:l𩺰y``e`=:lq~<7E>`b`dj``a`j````l𩺰y```h=:lq~<7E>`b`ej``a`j```bl𩺰y`abh=:lt~<7E>`b`dlt~<7E>`b`elu<6C>`bcb=:S`bcb=:l<><6C>lvq```dl<64>q``cej`e``j```ej```i=:S`bcc=:l<><6C>lvq```dl<64>q``cej``idj```ej```i=:S`c``=:S`c`a=:S`ca`=:S`cb`=:l{u炼t~<7E>`cb`ls}<7D>```l}缆````l𩺰y``e`=:lq~<7E>`ca`j```aj```bl}<7D>lvqs``be=:QQl~tls|=:lq~<7E>`ca`j```cj````l𩺰y`ae`=:lt~<7E>`ca`l<><6C>u~t=:S`cd`=:lv|z`eicj`cdalu~t=:S`cda=:lv|z`bgdj`cdblu~t=:S`cdb=:lv|[`bh`lt~<7E>`cd`lu~t=:S`ce`=:l<><6C>l}<7D>qP<71><50>憕<EFBFBD>Ν<EFBFBD><CE9D>P<EFBFBD><50><EFBFBD>P<EFBFBD>P膄^^^l~tlu~t=:S`cf`=:l<><6C>l}<7D>l<EFBFBD><6C>佅𠠬<E4BD85>P<EFBFBD>𠠬<EFBFBD><F0A0A0AC>P<EFBFBD><50>\P<>佅𠠬𢅛<F0A0A0AC>=:𩡗𤟠<F0A9A197>佅P<E4BD85>P<EFBFBD><50>袇P<E8A287>佅𠠬<E4BD85>𠠬<EFBFBD><F0A0A0AC>=:<3A>ㄒP<E38492><50><EFBFBD>婱<EFBFBD>𠠬<EFBFBD><F0A0A0AC>γl~tls|<7C><><EFBFBD>P<EFBFBD>鴂Ν𢅛𠠬<F0A2859B><F0A0A0AC><EFBFBD>P<EFBFBD><50>=:𩡗ㄘ<F0A9A197><E38498>^l~tlu~t=:S`d`a=:lt~<7E>`d`alv|[`bgelu<6C>`dba=:S`d`b=:l<><6C>l}<7D>l<EFBFBD><6C>a`el<65><6C><EFBFBD>Ql~tlt~<7E>`d`blv|[`bgflu<6C>`dbb=:S`daa=:lt~<7E>`daalu~t=:S`dab=:l<><6C>l<EFBFBD><6C>`bbls~<7E>`dabj``baj````=:lv|[`bgilu<6C>`dbc=:S`dba=:lu<6C>``fd=:S`dbb=:lu<6C>``fd=:S`dbc=:lu<6C>``fd=:S`e``=:l<><6C>lt~<7E>`e``l<><6C>`bblu<6C>`e`b=:S`e`a=:l<><6C>lt~<7E>`e`al<61><6C>`bblu<6C>`e`c=:S`e`b=:lu<6C>``ad=:S`e`c=:lu<6C>``ad=:S`f``=:S`f`a=:l{u炼}~qls}<7D>``f=:lq~<7E>`fa`j```aj````lvqy```d=:ls~<7E>`f`aj`aabj````l𩺰y`a``=:lq~<7E>`fa`j````j````=:l}缆````lt~<7E>`f`al<61>slu~t=:S`fa`=:l{u炼v|z`bdcj`faa=:l{u炼}<7D>qP<71><50><EFBFBD>═佅^l~tls|<7C>匕<EFBFBD>Ν<EFBFBD>P<EFBFBD><50>兣l~tlu~t=:S`faa=:ls~<7E>`f``j`aaaj```blx}sl𩺰y``f`lq~<7E>`fa`j```aj````=:l𩺰y`a``lvq```dl<64>q```ij`f`aj``ahj``fd=:Sab``=:l{u炼q~<7E>ab``j``b`j```a=:lv~ab``j``aflvqy```a=:l𩺰y`a``lvq```al<61>q``cijab``j``faj``ab
|
|
@ -147,7 +147,7 @@ a symbol.<NOD<END
|
|||
#0401
|
||||
<DNP0401<FL+0275<EVE0421
|
||||
#0402
|
||||
<PRI<MSG<SOU0105<TURArf!<NOD<DNP0402<FL+0276<EVE0020
|
||||
<PRI<MSG<SOU0105<TURArf!<NOD<DNP0402<FL+0276<EVE0422
|
||||
#0411
|
||||
<DNP0411<END
|
||||
#0412
|
||||
|
@ -155,11 +155,11 @@ a symbol.<NOD<END
|
|||
<FL+0279<EVE0423
|
||||
|
||||
#0421
|
||||
<EVE0020
|
||||
<EVE0064
|
||||
#0422
|
||||
<EVE0020
|
||||
<EVE0064
|
||||
#0423
|
||||
<EVE0020
|
||||
<EVE0064
|
||||
|
||||
|
||||
#0500
|
||||
|
|
|
@ -42,12 +42,12 @@ local function _itemData()
|
|||
-- WEAPONS --
|
||||
-------------
|
||||
polarStar1 = {
|
||||
name = "Polar Star",
|
||||
name = "Polar Star 1",
|
||||
script = "<EVE0002",
|
||||
attributes = {"weaponBoss", "weaponSN", "polarStar", "mandatory"}
|
||||
},
|
||||
polarStar2 = {
|
||||
name = "Polar Star",
|
||||
name = "Polar Star 2",
|
||||
script = "<EVE0002",
|
||||
attributes = {"weaponBoss", "weaponSN", "polarStar", "mandatory"}
|
||||
},
|
||||
|
@ -211,12 +211,12 @@ local function _itemData()
|
|||
attributes = {"mandatory"}
|
||||
},
|
||||
booster1 = {
|
||||
name = "Booster",
|
||||
name = "Booster 1",
|
||||
script = "<EVE0068",
|
||||
attributes = {"flight", "booster", "mandatory"}
|
||||
},
|
||||
booster2 = {
|
||||
name = "Booster",
|
||||
name = "Booster 2",
|
||||
script = "<EVE0068",
|
||||
attributes = {"flight", "booster", "mandatory"}
|
||||
},
|
||||
|
|
|
@ -17,7 +17,8 @@ end
|
|||
|
||||
function C:canAccess(items)
|
||||
if not self.region:canAccess(items) then return false end
|
||||
return self.requirements == nil or self.requirements(self, items)
|
||||
if self.requirements == nil then return true end
|
||||
return self.requirements(self, items)
|
||||
end
|
||||
|
||||
function C:hasItem()
|
||||
|
@ -31,7 +32,10 @@ end
|
|||
|
||||
function C:writeItem(tscFiles, item)
|
||||
item = item or self.item
|
||||
assert(self.item ~= nil, self.name)
|
||||
if item == nil then
|
||||
logError("No item at " .. self.name)
|
||||
return
|
||||
end
|
||||
if self.map == nil or self.event == nil or item.script == nil then return end
|
||||
tscFiles[self.map]:placeItemAtLocation(item, self)
|
||||
end
|
||||
|
|
|
@ -7,7 +7,8 @@ function C:new(worldGraph, name)
|
|||
end
|
||||
|
||||
function C:canAccess(items)
|
||||
return self.requirements == nil or self.requirements(self, items)
|
||||
if self.requirements == nil then return true end
|
||||
return self.requirements(self, items)
|
||||
end
|
||||
|
||||
function C:getLocation(key)
|
||||
|
|
|
@ -2,11 +2,11 @@ local Region = require 'database.region'
|
|||
local Location = require 'database.location'
|
||||
|
||||
function _has(items, attribute)
|
||||
return _count(items, attribute) > 0
|
||||
return _count(items, attribute, 1)
|
||||
end
|
||||
|
||||
function _count(items, attribute)
|
||||
return #_.filter(items, function(k,v) return _.contains(v.attributes, attribute) end)
|
||||
function _count(items, attribute, num)
|
||||
return #_.filter(items, function(k,v) return _.contains(v.attributes, attribute) end) >= num
|
||||
end
|
||||
|
||||
local firstCave = Region:extend()
|
||||
|
@ -38,13 +38,12 @@ function mimigaVillage:new(worldGraph)
|
|||
}
|
||||
|
||||
self.requirements = function(self, items)
|
||||
if _has(items, "weaponSN") and self.world.regions.firstCave:canAccess(items) then return true end
|
||||
return false
|
||||
return _has(items, "weaponSN")
|
||||
end
|
||||
|
||||
self.locations.assembly.requirements = function(self, items) return _has(items, "juice") end
|
||||
self.locations.mrLittle.requirements = function(self, items)
|
||||
return _has(items, "flight") and _has(items, "locket") and self.region.world.regions.outerWall.locations.littleHouse:canAccess(items)
|
||||
return _has(items, "locket") and self.region.world.regions.outerWall.locations.littleHouse:canAccess(items)
|
||||
end
|
||||
self.locations.grave.requirements = function(self, items) return _has(items, "locket") end
|
||||
self.locations.mushroomChest.requirements = function(self, items)
|
||||
|
@ -72,7 +71,7 @@ function arthur:new(worldGraph)
|
|||
}
|
||||
|
||||
self.requirements = function(self, items)
|
||||
if _has(items, "arthurKey") and self.world.regions.mimigaVillage:canAccess(items) then return true end
|
||||
if _has(items, "arthurKey") and _has(items, "weaponSN") then return true end
|
||||
return false
|
||||
end
|
||||
|
||||
|
@ -109,8 +108,7 @@ function grasstownWest:new(worldGraph)
|
|||
}
|
||||
|
||||
self.requirements = function(self, items)
|
||||
if self.world.regions.arthur:canAccess(items) then return true end
|
||||
return false
|
||||
return self.world.regions.arthur:canAccess(items)
|
||||
end
|
||||
|
||||
self.locations.santa.requirements = function(self, items) return _has(items, "santaKey") end
|
||||
|
@ -173,8 +171,7 @@ function upperSandZone:new(worldGraph)
|
|||
}
|
||||
|
||||
self.requirements = function(self, items)
|
||||
if _has(items, "weaponSN") and self.world.regions.arthur:canAccess(items) then return true end
|
||||
return false
|
||||
return self.world.regions.arthur:canAccess(items)
|
||||
end
|
||||
|
||||
self.locations.curly.requirements = function(self, items) return _has(items, "polarStar") end
|
||||
|
@ -187,7 +184,7 @@ local lowerSandZone = Region:extend()
|
|||
function lowerSandZone:new(worldGraph)
|
||||
lowerSandZone.super.new(self, worldGraph, "Sand Zone (Lower)")
|
||||
self.locations = {
|
||||
chestPup = Location("Puppy (Chest)", "Sand", "0421", self),
|
||||
chestPup = Location("Puppy (Chest)", "Sand", "0423", self),
|
||||
darkPup = Location("Puppy (Dark)", "Dark", "0401", self),
|
||||
runPup = Location("Puppy (Run)", "Sand", "0422", self),
|
||||
sleepyPup = Location("Puppy (Sleep)", "Sand", "0421", self),
|
||||
|
@ -198,16 +195,14 @@ function lowerSandZone:new(worldGraph)
|
|||
}
|
||||
|
||||
self.requirements = function(self, items)
|
||||
if not self.world.regions.arthur:canAccess(items) then return false end
|
||||
if _has(items, "eventOmega") and self.world.regions.upperSandZone:canAccess(items) then return true end
|
||||
return false
|
||||
return _has(items, "eventOmega") and self.world.regions.upperSandZone:canAccess(items)
|
||||
end
|
||||
|
||||
self.locations.jenka.requirements = function(self, items) return _count(items, "puppy") == 5 end
|
||||
self.locations.jenka.requirements = function(self, items) return _count(items, "puppy", 5) end
|
||||
self.locations.king.requirements = function(self, items) return _has(items, "eventToroko") end
|
||||
|
||||
self.locations.eventToroko.requirements = function(self, items)
|
||||
return _count(items, "puppy") == 5 and _has(items, "weaponBoss")
|
||||
return _count(items, "puppy", 5) and _has(items, "weaponBoss")
|
||||
end
|
||||
self.locations.eventToroko:setItem(self.world.items:getByKey("eventToroko"))
|
||||
end
|
||||
|
@ -235,7 +230,7 @@ function labyrinthW:new(worldGraph)
|
|||
self.locations.mazeCapsule.requirements = function(self, items) return _has(items, "weapon") end
|
||||
self.locations.turboChaba.requirements = function(self, items) return _has(items, "machineGun") end
|
||||
self.locations.snakeChaba.requirements = function(self, items) return _has(items, "fireball") end
|
||||
self.locations.whimChaba.requirements = function(self, items) return _count(items, "polarStar") == 2 end
|
||||
self.locations.whimChaba.requirements = function(self, items) return _count(items, "polarStar", 2) end
|
||||
self.locations.campChest.requirements = function(self, items) return _has(items, "flight") end
|
||||
self.locations.puuBlack.requirements = function(self, items) return _has(items, "clinicKey") and _has(items, "weaponBoss") end
|
||||
end
|
||||
|
@ -248,8 +243,7 @@ function labyrinthB:new(worldGraph)
|
|||
}
|
||||
|
||||
self.requirements = function(self, items)
|
||||
if self.world.regions.arthur:canAccess(items) then return true end
|
||||
return false
|
||||
return self.world.regions.arthur:canAccess(items)
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -336,7 +330,7 @@ function outerWall:new(worldGraph)
|
|||
|
||||
self.requirements = function(self, items)
|
||||
if not self.world.regions.arthur:canAccess(items) then return false end
|
||||
if _has(items, "eventKazuma") and _has(items, "flight") and self.world.regions.eggCorridor2:canAccess(items) then return true end
|
||||
if _has(items, "eventKazuma") and _has(items, "flight") and _has(items, "eventCore") then return true end
|
||||
if _has(items, "teleportKey") and self.world.regions.plantation:canAccess(items) then return true end
|
||||
return false
|
||||
end
|
||||
|
@ -391,7 +385,7 @@ function lastCave:new(worldGraph)
|
|||
redDemon = Location("Red Demon Boss", "Priso2", "0300", self)
|
||||
}
|
||||
|
||||
self.requirements = function(self, items) return _has(items, "eventRocket") and _has(items, "weaponBoss") end
|
||||
self.requirements = function(self, items) return _has(items, "eventRocket") and _has(items, "weaponBoss") and _count(items, booster, 2) end
|
||||
end
|
||||
|
||||
local endgame = Region:extend()
|
||||
|
@ -446,13 +440,17 @@ function worldGraph:getLocations()
|
|||
end
|
||||
|
||||
function worldGraph:getPuppySpots()
|
||||
local locations = self.locationsArray(self.regions.upperSandZone:getEmptyLocations())
|
||||
for k, location in pairs(self.regions.lowerSandZone:getEmptyLocations()) do
|
||||
if k ~= "jenka" and k ~= "king" and k ~= "eventToroko" then
|
||||
table.insert(locations, location)
|
||||
end
|
||||
end
|
||||
return locations
|
||||
return {
|
||||
self.regions.upperSandZone.locations.curly,
|
||||
self.regions.upperSandZone.locations.curlyPup,
|
||||
self.regions.upperSandZone.locations.panties,
|
||||
self.regions.upperSandZone.locations.sandCapsule,
|
||||
self.regions.lowerSandZone.locations.chestPup,
|
||||
self.regions.lowerSandZone.locations.darkPup,
|
||||
self.regions.lowerSandZone.locations.runPup,
|
||||
self.regions.lowerSandZone.locations.sleepyPup,
|
||||
self.regions.lowerSandZone.locations.pawCapsule
|
||||
}
|
||||
end
|
||||
|
||||
function worldGraph:getHellSpots()
|
||||
|
@ -495,7 +493,6 @@ end
|
|||
|
||||
function worldGraph:collect(preCollectedItems)
|
||||
local collected = _.clone(preCollectedItems) or {}
|
||||
assert(collected ~= nil)
|
||||
local availableLocations = self:getFilledLocations()
|
||||
|
||||
local foundItems = 0
|
||||
|
@ -523,12 +520,9 @@ end
|
|||
|
||||
function worldGraph.locationsArray(locations)
|
||||
local array = {}
|
||||
local countIn = 0
|
||||
for k, v in pairs(locations) do
|
||||
table.insert(array, v)
|
||||
countIn = countIn + 1
|
||||
end
|
||||
assert(#array == countIn, string.format("Size of locations array incorrect! In: %d Out: %d", #locations, #array))
|
||||
return array
|
||||
end
|
||||
|
||||
|
@ -538,7 +532,7 @@ function worldGraph:logLocations()
|
|||
logSpoiler("")
|
||||
logSpoiler("Region: " .. r.name)
|
||||
for k2,l in pairs(r.locations) do
|
||||
if not _has({l.item}, "event") then
|
||||
if l.item ~= nil and not _has({l.item}, "event") then
|
||||
logSpoiler("\t " .. l.name .. ": " .. l.item.name)
|
||||
end
|
||||
end
|
||||
|
|
|
@ -101,9 +101,6 @@ function C:_writePlaintext(tscFiles)
|
|||
end
|
||||
|
||||
function C:_shuffleItems(tscFiles)
|
||||
local l, i = #self.worldGraph:getLocations(), #self.itemDeck:getItems()
|
||||
assert(l == i, ("Locations: %d\r\nItems: %d"):format(l, i))
|
||||
|
||||
-- first fill puppies
|
||||
self:_fastFillItems(self.itemDeck:getItemsByAttribute("puppy"), _.shuffle(self.worldGraph:getPuppySpots()))
|
||||
|
||||
|
@ -116,7 +113,7 @@ function C:_shuffleItems(tscFiles)
|
|||
self:_fillItems(mandatory, _.shuffle(_.reverse(self.worldGraph:getEmptyLocations())))
|
||||
self:_fastFillItems(optional, _.shuffle(self.worldGraph:getEmptyLocations()))
|
||||
|
||||
assert(#self.worldGraph:getEmptyLocations() == 0, self.worldGraph:emptyString() .. "\r\n" .. self.itemDeck:unplacedString())
|
||||
--assert(#self.worldGraph:getEmptyLocations() == 0, self.worldGraph:emptyString() .. "\r\n" .. self.itemDeck:unplacedString())
|
||||
self.worldGraph:writeItems(tscFiles)
|
||||
self.worldGraph:logLocations()
|
||||
end
|
||||
|
@ -131,11 +128,12 @@ function C:_fillItems(items, locations)
|
|||
local assumed = self.worldGraph:collect(itemsLeft)
|
||||
|
||||
local fillable = _.filter(locations, function(k,v) return not v:hasItem() and v:canAccess(assumed) end)
|
||||
local empty = _.filter(locations, function(k,v) return not v:hasItem() end)
|
||||
assert(#fillable > 0, ("No available locations for %s! Items left: %d"):format(item.name, #itemsLeft))
|
||||
assert(item ~= nil, "No item found!")
|
||||
logDebug(("Placing %s at %s"):format(item.name, fillable[1].name))
|
||||
fillable[1]:setItem(item)
|
||||
if #fillable > 0 then
|
||||
logDebug(("Placing %s at %s"):format(item.name, fillable[1].name))
|
||||
fillable[1]:setItem(item)
|
||||
else
|
||||
logError(("No available locations for %s! Items left: %d"):format(item.name, #itemsLeft))
|
||||
end
|
||||
until #itemsLeft == 0
|
||||
end
|
||||
|
||||
|
|
Loading…
Reference in a new issue