141 lines
4.9 KiB
Python
141 lines
4.9 KiB
Python
import random
|
|
|
|
from . import entity
|
|
from . import faction
|
|
from .entity import Entity
|
|
from .components.item import Item
|
|
from .components.randomwalkcontroller import RandomWalkController
|
|
from .components.move import Move
|
|
from .components.portal import Portal
|
|
from .components.trap import Trap
|
|
from .components.fighter import Fighter
|
|
from .components.monsterai import MonsterAi
|
|
from .components.spawner import Spawner
|
|
from .components.grow import Growing
|
|
from .components.alignment import Alignment
|
|
from .components.loot import Loot
|
|
from .components.build import Build
|
|
from .components.harvest import Harvest
|
|
from .components.food import Food
|
|
|
|
""" This module contains factory functions for many placable entities, and a make function to call a factory by a string name """
|
|
|
|
entities = {}
|
|
|
|
|
|
def makeWall():
|
|
return Entity(sprite="wall", height=2, solid=True)
|
|
entities["wall"] = makeWall
|
|
|
|
def makeRock():
|
|
return Entity(sprite="rock", height=10, solid=True)
|
|
entities["rock"] = makeRock
|
|
|
|
def makeTree():
|
|
return Entity(sprite="tree", height=3, solid=True)
|
|
entities["tree"] = makeTree
|
|
|
|
def makeStone():
|
|
return Entity(sprite="stone", height=0.4, components={"item": Build("builtwall")})
|
|
entities["stone"] = makeStone
|
|
|
|
def makePebble():
|
|
return Entity(sprite="pebble", height=0.2, components={"item": Item()})
|
|
entities["pebble"] = makePebble
|
|
|
|
def makeGrass():
|
|
return Entity(sprite=random.choice(["ground", "grass1", "grass2", "grass3"]), height=0.1)
|
|
entities["grass"] = makeGrass
|
|
|
|
def makeFloor():
|
|
return Entity(sprite="floor", height=0)
|
|
entities["floor"] = makeFloor
|
|
|
|
def makeGround():
|
|
return Entity(sprite="ground", height=0)
|
|
entities["ground"] = makeGround
|
|
|
|
def makeWater():
|
|
return Entity(sprite="water", height=0, solid=True)
|
|
entities["water"] = makeWater
|
|
|
|
def makeRoomExit(destRoom, destPos=None, sprite="exit", size=1):
|
|
return Entity(sprite=sprite, height=size, components={"collision": Portal(destRoom, destPos)})
|
|
entities["roomexit"] = makeRoomExit
|
|
|
|
def makeRabbit():
|
|
return Entity(sprite="rabbit", height=1, components={"move": Move(slowness=4), "controller": RandomWalkController(moveChance=0.05)})
|
|
entities["rabbit"] = makeRabbit
|
|
|
|
def makeDummy():
|
|
return Entity(sprite="dummy", height=1, components={"fighter": Fighter(maxHealth=20, strength=0), "alignment": Alignment(faction.NONE)})
|
|
entities["dummy"] = makeDummy
|
|
|
|
def makeSpikeTrap():
|
|
return Entity(sprite="spikes", height=1, components={"fighter": Fighter(maxHealth=25, strength=25), "collision": Trap()})
|
|
entities["spiketrap"] = makeSpikeTrap
|
|
|
|
def makeGoblin():
|
|
return Entity(sprite="goblin", height=1.2, components={
|
|
"move": Move(slowness=4),
|
|
"fighter": Fighter(maxHealth=25, strength=5, slowness=3),
|
|
"alignment": Alignment(faction.EVIL),
|
|
"controller": MonsterAi(viewDist=8, moveChance=0.01),
|
|
"loot": Loot([("seed", .5), ("seed", .1)])
|
|
})
|
|
entities["goblin"] = makeGoblin
|
|
|
|
def makeTroll():
|
|
return Entity(sprite="troll", height=1.8, components={
|
|
"move": Move(slowness=5),
|
|
"fighter": Fighter(maxHealth=125, strength=12, slowness=5),
|
|
"alignment": Alignment(faction.EVIL),
|
|
"controller": MonsterAi(viewDist=8, moveChance=0.01),
|
|
"loot": Loot([("stone", 1), ("stone", .3), ("pebble", .5), ("pebble", .5), ("pebble", .5)])
|
|
})
|
|
entities["troll"] = makeTroll
|
|
|
|
def makeGoblinSpawner(): # I should probably generalize this...
|
|
return Entity(sprite="portal", height=1, name="goblinspawner", components={"spawn": Spawner("goblin", 2, 20)})
|
|
entities["goblinspawner"] = makeGoblinSpawner
|
|
|
|
def makeSpawner(objType, number, delay, sprite="portal", name=None, objArgs=[], objKwargs={}):
|
|
return Entity(sprite=sprite, height=1, name=name, components={"spawn": Spawner(objType, number, delay, objArgs, objKwargs)})
|
|
entities["spawner"] = makeSpawner
|
|
|
|
def makeSownSeed():
|
|
return Entity(sprite="seed", height=0.05, name="plantedseed", components={"grow": Growing("youngplant", 100)})
|
|
entities["sownseed"] = makeSownSeed
|
|
|
|
def makeYoungPlant():
|
|
return Entity(sprite="youngplant", height=0.5, components={"grow": Growing("plant", 200)})
|
|
entities["youngplant"] = makeYoungPlant
|
|
|
|
def makePlant():
|
|
return Entity(sprite="plant", height=1.2, components={
|
|
"interact": Harvest(),
|
|
"loot": Loot([("seed", .92), ("seed", .20), ("food", .8), ("food", .4)])
|
|
})
|
|
entities["plant"] = makePlant
|
|
|
|
def makeFood():
|
|
return Entity(sprite="food", height=0.2, components={"item": Food(20)})
|
|
entities["food"] = makeFood
|
|
|
|
|
|
def makeSeed():
|
|
return Entity(sprite="seed", height=0.3, components={"item": Build("sownseed")})
|
|
entities["seed"] = makeSeed
|
|
|
|
|
|
def makeBuiltWall():
|
|
return Entity(sprite="wall", height=2, solid=True, components={"fighter": Fighter(maxHealth=100, strength=0), "alignment": Alignment(faction.NONE), "loot": Loot([("stone", 1)])})
|
|
entities["builtwall"] = makeBuiltWall
|
|
|
|
|
|
def makeEntity(entType, roomData, *args, **kwargs):
|
|
entity = entities[entType](*args, **kwargs)
|
|
entity.construct(roomData)
|
|
return entity
|
|
|