breakhack/data/monstergen.lua

485 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 fairies = {
{ stats.misc, 0, 48, "A Fairy", behaviour.pacifist },
{ stats.misc, 16, 48, "A Fairy", behaviour.pacifist },
{ stats.misc, 32, 48, "A Fairy", behaviour.pacifist },
{ stats.misc, 48, 48, "A Fairy", behaviour.pacifist },
{ stats.misc, 64, 48, "A Fairy", behaviour.pacifist },
{ stats.misc, 80, 48, "A Fairy", behaviour.pacifist },
}
for i=1,#fairies do
fairies[i] = concat({ texturePaths.humanoid0, texturePaths.humanoid1 }, fairies[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 addFairyToLevel = random(3) == 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(2) == 1
local addFairy = random(4) == 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)])
elseif addFairyToLevel and addFairy then
addFairyToLevel = false
add_monster_to_tile(room, roomx, roomy, rx, ry, fairies[random(#fairies)])
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