469 lines
13 KiB
Lua
469 lines
13 KiB
Lua
local room_builder = require "maproombuilder"
|
|
local module = {}
|
|
local random = map_random
|
|
|
|
local texturePaths = {
|
|
aquatic0 = "Characters/Aquatic0.png",
|
|
aquatic1 = "Characters/Aquatic1.png",
|
|
avian0 = "Characters/Avian0.png",
|
|
avian1 = "Characters/Avian1.png",
|
|
cat0 = "Characters/Cat0.png",
|
|
cat1 = "Characters/Cat1.png",
|
|
demon0 = "Characters/Demon0.png",
|
|
demon1 = "Characters/Demon1.png",
|
|
dog0 = "Characters/Dog0.png",
|
|
dog1 = "Characters/Dog1.png",
|
|
elemental0 = "Characters/Elemental0.png",
|
|
elemental1 = "Characters/Elemental1.png",
|
|
humanoid0 = "Characters/Humanoid0.png",
|
|
humanoid1 = "Characters/Humanoid1.png",
|
|
misc0 = "Characters/Misc0.png",
|
|
misc1 = "Characters/Misc1.png",
|
|
pest0 = "Characters/Pest0.png",
|
|
pest1 = "Characters/Pest1.png",
|
|
pant0 = "Characters/Plant0.png",
|
|
plant1 = "Characters/Plant1.png",
|
|
player0 = "Characters/Player0.png",
|
|
player1 = "Characters/Player1.png",
|
|
quadroped0 = "Characters/Quadraped0.png",
|
|
quadroped1 = "Characters/Quadraped1.png",
|
|
reptile0 = "Characters/Reptile0.png",
|
|
reptile1 = "Characters/Reptile1.png",
|
|
rodent0 = "Characters/Rodent0.png",
|
|
rodent1 = "Characters/Rodent1.png",
|
|
slime0 = "Characters/Slime0.png",
|
|
slime1 = "Characters/Slime1.png",
|
|
undead0 = "Characters/Undead0.png",
|
|
undead1 = "Characters/Undead1.png",
|
|
}
|
|
|
|
|
|
local behaviour = {
|
|
pacifist = 0,
|
|
normal = 1,
|
|
hostile = 2,
|
|
guerilla = 3,
|
|
coward = 4,
|
|
sentinel = 5,
|
|
fire_demon = 6,
|
|
sorcerer = 7,
|
|
assassin = 8
|
|
}
|
|
|
|
local stats = {
|
|
default = {
|
|
hp = 12,
|
|
dmg = 2,
|
|
atk = 0,
|
|
def = 0,
|
|
speed = 1
|
|
},
|
|
pest = {
|
|
hp = 6,
|
|
dmg = 1,
|
|
atk = 0,
|
|
def = 0,
|
|
speed = 1
|
|
},
|
|
misc = {
|
|
hp = 18,
|
|
dmg = 2,
|
|
atk = 0,
|
|
def = 0,
|
|
speed = 1
|
|
},
|
|
dog = {
|
|
hp = 12,
|
|
dmg = 2,
|
|
atk = 0,
|
|
def = 0,
|
|
speed = 1
|
|
},
|
|
undead = {
|
|
hp = 24,
|
|
dmg = 1,
|
|
atk = 0,
|
|
def = 0,
|
|
speed = 1
|
|
},
|
|
orc = {
|
|
hp = 20,
|
|
dmg = 2,
|
|
atk = 0,
|
|
def = 0,
|
|
speed = 1
|
|
},
|
|
boss = {
|
|
hp = 60,
|
|
dmg = 3,
|
|
atk = 1,
|
|
def = 0,
|
|
speed = 1
|
|
},
|
|
platino = {
|
|
hp = 90,
|
|
dmg = 1,
|
|
atk = 0,
|
|
def = 0,
|
|
speed = 1
|
|
},
|
|
shopkeeper = {
|
|
hp = 200,
|
|
dmg = 10,
|
|
atk = 2,
|
|
def = 0,
|
|
speed = 1
|
|
},
|
|
}
|
|
|
|
local function concat(table1, table2)
|
|
for i=1,#table2 do
|
|
table1[#table1+1] = table2[i]
|
|
end
|
|
return table1
|
|
end
|
|
|
|
local pests = {
|
|
{ stats.pest, 96, 0, "A Slim Worm", behaviour.pacifist },
|
|
{ stats.pest, 112, 0, "A Fat Worm", behaviour.pacifist },
|
|
|
|
{ stats.pest, 16, 16, "A Fly", behaviour.pacifist },
|
|
{ stats.pest, 48, 16, "A Moth", behaviour.pacifist },
|
|
{ stats.pest, 80, 16, "A Gnat", behaviour.pacifist },
|
|
|
|
{ stats.pest, 0, 32, "A Small Spider", behaviour.pacifist },
|
|
{ stats.pest, 16, 32, "A Medium Spider", behaviour.pacifist },
|
|
{ stats.pest, 32, 32, "A Large Spider", behaviour.pacifist },
|
|
{ stats.pest, 48, 32, "A Small Scorpion", behaviour.pacifist },
|
|
{ stats.pest, 64, 32, "A Medium Scorpion", behaviour.pacifist },
|
|
{ stats.pest, 80, 32, "A Large Scorpion", behaviour.pacifist },
|
|
|
|
{ stats.pest, 0, 48, "A Slug", behaviour.pacifist },
|
|
{ stats.pest, 16, 48, "A Large Slug", behaviour.pacifist },
|
|
{ stats.pest, 48, 48, "A Red Slug", behaviour.pacifist },
|
|
{ stats.pest, 64, 48, "A Large Red Slug", behaviour.pacifist },
|
|
|
|
{ stats.pest, 0, 64, "A Giant Brown Ant", behaviour.pacifist },
|
|
{ stats.pest, 16, 64, "A Giant Black Ant", behaviour.pacifist },
|
|
}
|
|
for i=1,#pests do
|
|
pests[i] = concat({ texturePaths.pest0, texturePaths.pest1 }, pests[i])
|
|
end
|
|
|
|
local avian = {
|
|
{ stats.default, 0, 11*16, "A Small Brown Bat", behaviour.pacifist },
|
|
{ stats.default, 16, 11*16, "A Big Brown Bat", behaviour.normal },
|
|
{ stats.default, 32, 11*16, "A Vampire Bat", behaviour.guerilla },
|
|
{ stats.default, 48, 11*16, "A Rabid Bat", behaviour.hostile },
|
|
}
|
|
for i=1,#avian do
|
|
avian[i] = concat({ texturePaths.avian0, texturePaths.avian1 }, avian[i])
|
|
end
|
|
|
|
local misc = {
|
|
{ stats.misc, 0, 0, "A Giant Black Rat", behaviour.sentinel },
|
|
{ stats.misc, 16, 0, "A Giant White Rat", behaviour.sentinel },
|
|
{ stats.misc, 64, 0, "An Owl Bear", behaviour.sentinel },
|
|
}
|
|
for i=1,#misc do
|
|
misc[i] = concat({ texturePaths.misc0, texturePaths.misc1 }, misc[i])
|
|
end
|
|
|
|
local reanimated = {
|
|
{ stats.undead, 0, 32, "A Skeleton", behaviour.normal },
|
|
{ stats.undead, 48, 32, "A Black Skeleton", behaviour.normal },
|
|
{ stats.undead, 64, 32, "A Zombie", behaviour.normal },
|
|
{ stats.undead, 80, 32, "A Zombie", behaviour.normal }
|
|
}
|
|
for i=1,#reanimated do
|
|
reanimated[i] = concat({ texturePaths.undead0, texturePaths.undead1 }, reanimated[i])
|
|
end
|
|
|
|
local undead = {
|
|
{ stats.undead, 5*16, 16, "A Mummy", behaviour.normal },
|
|
{ stats.undead, 6*16, 16, "A Two Headed Mummy", behaviour.sentinel },
|
|
{ stats.undead, 0*16, 32, "A Skeleton", behaviour.normal },
|
|
{ stats.misc, 1*16, 32, "A Burning Skeleton", behaviour.fire_demon },
|
|
{ stats.misc, 2*16, 32, "An Eldritch Skeleton", behaviour.sorcerer },
|
|
{ stats.misc, 3*16, 32, "A Black Skeleton", behaviour.guerilla },
|
|
{ stats.misc, 4*16, 32, "A Zombie", behaviour.coward },
|
|
{ stats.misc, 5*16, 32, "A Pale Zombie", behaviour.coward },
|
|
{ stats.misc, 7*16, 32, "A Scorched Zombie", behaviour.fire_demon },
|
|
{ stats.undead, 0*16, 4*16, "A Whight", behaviour.coward },
|
|
{ stats.undead, 1*16, 4*16, "A Ghast", behaviour.sentinel },
|
|
{ stats.misc, 1*16, 4*16, "A Ghost", behaviour.guerilla },
|
|
{ stats.misc, 0*16, 5*16, "A Spectre", behaviour.sentinel },
|
|
{ stats.undead, 1*16, 5*16, "An Eldritch Spectre", behaviour.sorcerer },
|
|
{ stats.undead, 2*16, 5*16, "A Scorched Spectre", behaviour.fire_demon },
|
|
}
|
|
for i=1,#undead do
|
|
undead[i] = concat({ texturePaths.undead0, texturePaths.undead1 }, undead[i])
|
|
end
|
|
|
|
local dogs = {
|
|
{ stats.dog, 0, 16, "A Rabid Dog", behaviour.normal },
|
|
{ stats.dog, 16, 16, "An Angry Rabid Dog", behaviour.hostile }
|
|
}
|
|
for i=1,#dogs do
|
|
dogs[i] = concat({ texturePaths.dog0, texturePaths.dog1 }, dogs[i])
|
|
end
|
|
|
|
local reptile = {
|
|
{ stats.default, 0, 64, "A Small Brown Snake", behaviour.coward },
|
|
{ stats.default, 16, 64, "A Medium Brown Snake", behaviour.guerilla },
|
|
{ stats.default, 32, 64, "A Large Brown Snake", behaviour.hostile },
|
|
{ stats.default, 48, 64, "A Small Black Snake", behaviour.coward },
|
|
{ stats.default, 64, 64, "A Medium Black Snake", behaviour.guerilla },
|
|
{ stats.default, 80, 64, "A Large Black Snake", behaviour.hostile },
|
|
}
|
|
for i=1,#reptile do
|
|
reptile[i] = concat({ texturePaths.reptile0, texturePaths.reptile1 }, reptile[i])
|
|
end
|
|
|
|
local demon = {
|
|
{ stats.default, 0, 0, "A Demon", behaviour.hostile },
|
|
{ stats.default, 16, 0, "A Demon", behaviour.hostile },
|
|
{ stats.default, 32, 0, "A Demon", behaviour.hostile },
|
|
{ stats.default, 48, 0, "A Demon", behaviour.hostile },
|
|
{ stats.default, 64, 0, "A Demon", behaviour.hostile },
|
|
{ stats.default, 80, 0, "A Demon", behaviour.hostile },
|
|
{ stats.default, 96, 0, "A Demon", behaviour.hostile },
|
|
{ stats.default, 112, 0, "A Demon", behaviour.hostile },
|
|
}
|
|
for i=1,#demon do
|
|
demon[i] = concat({ texturePaths.demon0, texturePaths.demon1 }, demon[i])
|
|
end
|
|
|
|
local orcs = {
|
|
{ stats.orc, 0, 4*16, "An Orc Guard", behaviour.normal },
|
|
{ stats.orc, 16, 4*16, "An Orc Seargeant", behaviour.coward },
|
|
{ stats.orc, 32, 4*16, "An Orc Militia", behaviour.hostile },
|
|
{ stats.orc, 48, 4*16, "An Orc Sentry", behaviour.sentinel },
|
|
{ stats.orc, 64, 4*16, "An Orc Brute", behaviour.guerilla },
|
|
{ stats.orc, 80, 4*16, "An Orc Captain", behaviour.hostile },
|
|
{ stats.orc, 96, 4*16, "An Orc Pyro", behaviour.fire_demon },
|
|
}
|
|
for i=1,#orcs do
|
|
orcs[i] = concat({ texturePaths.humanoid0, texturePaths.humanoid1 }, orcs[i])
|
|
end
|
|
|
|
local assassins = {
|
|
{ stats.misc, 1*16, 6*16, "A Reaper", behaviour.assassin },
|
|
{ stats.misc, 0*16, 7*16, "An Assassin", behaviour.assassin },
|
|
{ stats.misc, 1*16, 7*16, "A Royal Assassin", behaviour.assassin },
|
|
}
|
|
for i=1,#assassins do
|
|
assassins[i] = concat({ texturePaths.undead0, texturePaths.undead1 }, assassins[i])
|
|
end
|
|
|
|
local bosses = {
|
|
{ stats.boss, 16, 5*16, "The Hell Hound", behaviour.fire_demon, true },
|
|
{ stats.boss, 16, 23*16, "The Cleric", behaviour.sorcerer, true },
|
|
{ stats.boss, 16, 8*16, "The Shadow", behaviour.assassin, true },
|
|
}
|
|
bosses[1] = concat({ texturePaths.dog0, texturePaths.dog1 }, bosses[1])
|
|
bosses[2] = concat({ texturePaths.humanoid0, texturePaths.humanoid1 }, bosses[2])
|
|
bosses[3] = concat({ texturePaths.undead0, texturePaths.undead1 }, bosses[3])
|
|
|
|
local eastereggs = {
|
|
{ stats.misc, 6*16, 1*16, "Linus, the Developer", behaviour.passive },
|
|
{ stats.misc, 2*16, 3*16, "Lialynn, the Ranger", behaviour.passive },
|
|
{ stats.misc, 4*16, 3*16, "Miniel, the Paladin", behaviour.passive },
|
|
{ stats.misc, 2*16,12*16, "Feng, the Fighter", behaviour.passive },
|
|
{ stats.misc, 0*16, 7*16, "Adnis, the Ranger", behaviour.passive },
|
|
{ stats.misc, 7*16, 8*16, "Ti, the Mage", behaviour.passive },
|
|
}
|
|
|
|
for i=1,#eastereggs do
|
|
eastereggs[i] = concat({ texturePaths.player0, texturePaths.player1 }, eastereggs[i])
|
|
end
|
|
|
|
local shopkeeperBehaviour = behaviour.passive
|
|
if PlayerData.shopOwnerKiller then
|
|
shopkeeperBehaviour = behaviour.hostile
|
|
end
|
|
|
|
local shopkeeper = {
|
|
texturePaths.humanoid0,
|
|
texturePaths.humanoid1,
|
|
stats.shopkeeper,
|
|
16,
|
|
12*16,
|
|
"The Trader",
|
|
shopkeeperBehaviour
|
|
}
|
|
|
|
local bodyguard = {
|
|
texturePaths.humanoid0,
|
|
texturePaths.humanoid1,
|
|
stats.orc,
|
|
32,
|
|
12*16,
|
|
"A Bodyguard",
|
|
behaviour.hostile
|
|
}
|
|
|
|
-- Add Platino
|
|
table.insert(eastereggs, {
|
|
texturePaths.reptile0,
|
|
texturePaths.reptile1,
|
|
stats.platino,
|
|
48,
|
|
12*16,
|
|
"Platino",
|
|
behaviour.sentinel,
|
|
true
|
|
})
|
|
|
|
local function repack(data)
|
|
return {
|
|
texturePath1 = data[1],
|
|
texturePath2 = data[2],
|
|
stats = data[3],
|
|
clipX = data[4],
|
|
clipY = data[5],
|
|
label = data[6] or "",
|
|
behaviour = data[7] or behaviour.normal,
|
|
boss = data[8] or false,
|
|
}
|
|
end
|
|
|
|
-- Begin script
|
|
local enemies = {}
|
|
if(CURRENT_LEVEL > 0) then
|
|
if (CURRENT_LEVEL == 1) then
|
|
enemies = concat(enemies, pests)
|
|
enemies = concat(enemies, avian)
|
|
enemies = concat(enemies, misc)
|
|
enemies = concat(enemies, dogs)
|
|
elseif (CURRENT_LEVEL > 15 or (QUICK_MODE and CURRENT_LEVEL > 9)) then
|
|
enemies = {}
|
|
enemies = concat(enemies, undead)
|
|
enemies = concat(enemies, orcs)
|
|
enemies = concat(enemies, assassins)
|
|
elseif (CURRENT_LEVEL > 10 or (QUICK_MODE and CURRENT_LEVEL > 6)) then
|
|
enemies = {}
|
|
enemies = concat(enemies, undead)
|
|
enemies = concat(enemies, avian)
|
|
elseif (CURRENT_LEVEL > 5 or (QUICK_MODE and CURRENT_LEVEL > 3)) then
|
|
enemies = {}
|
|
enemies = concat(enemies, orcs)
|
|
enemies = concat(enemies, avian)
|
|
elseif (CURRENT_LEVEL > 1) then
|
|
enemies = {}
|
|
enemies = concat(enemies, reanimated)
|
|
enemies = concat(enemies, reptile)
|
|
enemies = concat(enemies, avian)
|
|
enemies = concat(enemies, misc)
|
|
enemies = concat(enemies, dogs)
|
|
end
|
|
end
|
|
|
|
local addSpecialInLevel = random(100) == 1
|
|
|
|
local function add_monster_to_tile(room, roomx, roomy, rx, ry, monster)
|
|
local x = (roomx * 512) + rx * 32
|
|
local y = (roomy * 384) + ry * 32
|
|
room.monsters[rx][ry] = {
|
|
x,
|
|
y,
|
|
monster
|
|
}
|
|
end
|
|
|
|
function module.add_monsters_to_room(room, roomx, roomy)
|
|
local addSpecial = addSpecialInLevel and random(5) == 1
|
|
local count = random(3)
|
|
if (CURRENT_LEVEL > 3) then
|
|
count = random(4)
|
|
end
|
|
count = count + 1
|
|
local i = 0
|
|
while i < count do
|
|
local rx = random(13) + 1
|
|
local ry = random(9) + 1
|
|
if room_builder.is_tile_avilable(room, rx, ry) then
|
|
if addSpecial then
|
|
addSpecialInLevel = false
|
|
addSpecial = false
|
|
add_monster_to_tile(room, roomx, roomy, rx, ry, eastereggs[random(#eastereggs)])
|
|
else
|
|
add_monster_to_tile(room, roomx, roomy, rx, ry, enemies[random(#enemies)])
|
|
end
|
|
i = i + 1
|
|
end
|
|
end
|
|
end
|
|
|
|
function module.add_boss_to_room(room, roomx, roomy)
|
|
local boss = bosses[CURRENT_LEVEL / 5]
|
|
if QUICK_MODE then
|
|
boss = bosses[CURRENT_LEVEL / 3]
|
|
end
|
|
local success = false
|
|
while not success do
|
|
local rx = random(13) + 1
|
|
local ry = random(9) + 1
|
|
if room_builder.is_tile_avilable(room, rx, ry) then
|
|
local x = (roomx * 512) + rx * 32
|
|
local y = (roomy * 384) + ry * 32
|
|
room.monsters[rx][ry] = {
|
|
x,
|
|
y,
|
|
boss
|
|
}
|
|
success = true
|
|
end
|
|
end
|
|
end
|
|
|
|
function module.add_shopkeeper_to_room(room, roomx, roomy)
|
|
local success = false
|
|
while not success do
|
|
local rx = random(13) + 1
|
|
local ry = random(9) + 1
|
|
if room_builder.is_tile_avilable(room, rx, ry) then
|
|
local x = (roomx * 512) + rx * 32
|
|
local y = (roomy * 384) + ry * 32
|
|
room.monsters[rx][ry] = {
|
|
x,
|
|
y,
|
|
shopkeeper
|
|
}
|
|
success = true
|
|
end
|
|
end
|
|
end
|
|
|
|
function module.add_bodyguard_to_room(room, roomx, roomy)
|
|
local success = false
|
|
while not success do
|
|
local rx = random(13) + 1
|
|
local ry = random(9) + 1
|
|
if room_builder.is_tile_avilable(room, rx, ry) then
|
|
local x = (roomx * 512) + rx * 32
|
|
local y = (roomy * 384) + ry * 32
|
|
room.monsters[rx][ry] = {
|
|
x,
|
|
y,
|
|
bodyguard
|
|
}
|
|
success = true
|
|
end
|
|
end
|
|
end
|
|
|
|
function module.load_monsters(map, monsters)
|
|
for i=0,15 do
|
|
for j=0,11 do
|
|
monster = monsters[i][j]
|
|
if monster then
|
|
add_monster(map, monster[1], monster[2], repack(monster[3]))
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
return module
|
|
|