Asciifarm/asciifarm/server/gameobjects.py

150 lines
7.3 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
from .components.equippable import Equippable
from .components.volatile import Volatile
from .components.change import Change
""" This module contains factory functions for many placable entities, and a make function to call a factory by a string name """
entities = {}
entities["wall"] = lambda: Entity(sprite="wall", height=2, flags={"solid"})
entities["freeland"] = lambda: Entity(name="buildable", flags={"freeland"})
entities["rock"] = lambda: Entity(sprite="rock", height=10, flags={"solid"})
entities["tree"] = lambda: Entity(sprite="tree", height=3, flags={"solid"})
entities["house"] = lambda: Entity(sprite="house", height=3, flags={"solid"})
entities["fence"] = lambda: Entity(sprite="fence", height=1, flags={"solid"})
entities["stone"] = lambda: Entity(sprite="stone", height=0.4, components={"item": Build("builtwall", flagsNeeded={"freeland"}, blockingFlags={"solid", "occupied"})})
entities["pebble"] = lambda: Entity(sprite="pebble", height=0.2, components={"item": Item()})
entities["grass"] = lambda: Entity(
sprite=random.choice(["ground"] + 2*["grass1", "grass2", "grass3"]), name="grass", height=0.1, flags={"floor", "soil"})
entities["greengrass"] = lambda: Entity(
sprite=random.choice(["grass1", "grass2", "grass3"]), height=0.1, flags={"floor", "soil"})
entities["floor"] = lambda: Entity(sprite="floor", height=0.1, flags={"floor"})
entities["ground"] = lambda: Entity(sprite="ground", height=0.1, flags={"floor", "soil"})
entities["bridge"] = lambda small=False: Entity(sprite=("smallbridge" if small else "bridge"), height=0.1, flags={"floor"})
entities["water"] = lambda: Entity(sprite="water", height=0)
entities["roomexit"] = lambda destRoom, destPos=None, mask=(False, False), sprite=" ", size=0: Entity(
sprite=sprite, height=size, components={"collision": Portal(destRoom, destPos, mask)})
entities["rabbit"] = lambda: Entity(
sprite="rabbit", name="bunny", height=1, components={"move": Move(slowness=4), "controller": RandomWalkController(moveChance=0.05)})
entities["dummy"] = lambda: Entity(
sprite="dummy", height=1, flags={"occupied"}, components={"fighter": Fighter(maxHealth=20, strength=0), "alignment": Alignment(faction.NONE)})
entities["spiketrap"] = lambda: Entity(
sprite="spikes", height=1, flags={"occupied"}, components={"fighter": Fighter(maxHealth=25, strength=25), "collision": Trap()})
entities["goblin"] = lambda home=None: Entity(sprite="goblin", height=1.2, components={
"move": Move(slowness=3),
"fighter": Fighter(maxHealth=15, strength=5, slowness=8),
"alignment": Alignment(faction.EVIL),
"controller": MonsterAi(viewDist=8, moveChance=0.02, home=home),
"loot": Loot([("sword", .05), ("club", .1), ("food", .25)])
})
entities["troll"] = lambda home=None: Entity(sprite="troll", height=1.8, components={
"move": Move(slowness=4),
"fighter": Fighter(maxHealth=75, strength=15, slowness=10),
"alignment": Alignment(faction.EVIL),
"controller": MonsterAi(viewDist=8, moveChance=0.01, home=home),
"loot": Loot([("stone", 1), ("stone", .3), ("pebble", .5), ("pebble", .5), ("pebble", .5), ("hardwood", 0.1)])
})
entities["rat"] = lambda home=None: Entity(sprite="rat", height=1, components={
"move": Move(slowness=3),
"fighter": Fighter(maxHealth=8, strength=2, slowness=5),
"alignment": Alignment(faction.EVIL),
"controller": MonsterAi(viewDist=3, moveChance=0.08, home=home, homesickness=0.1),
"loot": Loot([("seed", 0.9), ("seed", 0.3)])
})
entities["spawner"] = lambda objType, number, delay, sprite=None, name=None, height=0, setHome=False, initialSpawn=False, objArgs=None, objKwargs=None: Entity(
sprite=sprite, height=height, name=name, components={
"spawn": Spawner(objType, number, delay, setHome, initialSpawn, objArgs, objKwargs)})
entities["sownseed"] = lambda: Entity(sprite="seed", height=0.05, name="plantedseed", flags={"occupied"}, components={"grow": Growing("youngplant", 100)})
entities["youngplant"] = lambda: Entity(sprite="youngplant", height=0.5, flags={"occupied"}, components={"grow": Growing("plant", 200)})
entities["plant"] = lambda: Entity(sprite="plant", height=1.2, flags={"occupied"}, components={
"interact": Harvest(),
"loot": Loot([("seed", .92), ("seed", .20), ("food", .8), ("food", .4)])
})
entities["food"] = lambda: Entity(sprite="food", height=0.3, components={"item": Food(20)})
entities["seed"] = lambda: Entity(sprite="seed", height=0.2, components={"item": Build("sownseed", flagsNeeded={"soil"}, blockingFlags={"occupied", "solid"})})
entities["builtwall"] = lambda: Entity(
sprite="wall", height=2, flags={"solid"}, components={
"fighter": Fighter(maxHealth=100, strength=0),
"alignment": Alignment(faction.NONE),
"loot": Loot([("stone", 1)])})
entities["sword"] = lambda: Entity(sprite="sword", height=0.5, components={"item": Equippable("hand", {"strength": 5})})
entities["club"] = lambda: Entity(sprite="club", height=0.5, components={"item": Equippable("hand", {"strength": 3})})
entities["weapon"] = lambda strength=0, name="weapon": Entity(sprite="sword", name=name, height=0.5, components={"item": Equippable("hand", {"strength": strength})})
entities["armour"] = lambda: Entity(sprite="armour", height=0.5, components={"item": Equippable("body", {"defense": 100})})
entities["wound"] = lambda duration=4, height=0.2: Entity(sprite="wound", height=height, components={"volatile": Volatile(duration)})
entities["closeddoor"] = lambda: Entity(sprite="closeddoor", name="door", height=2, flags={"solid"}, components={"interact": Change("opendoor")})
entities["opendoor"] = lambda: Entity(sprite="opendoor", name="door", height=1, flags={"occupied"}, components={"interact": Change("closeddoor")})
entities["builtcloseddoor"] = lambda: Entity(sprite="closeddoor", name="door", height=2, flags={"solid"}, components={
"interact": Change("builtopendoor"),
"fighter": Fighter(maxHealth=100, strength=0),
"alignment": Alignment(faction.NONE),
"loot": Loot([("stone", 1)])})
entities["builtopendoor"] = lambda: Entity(sprite="opendoor", name="door", height=1, flags={"occupied"}, components={
"interact": Change("builtcloseddoor"),
"fighter": Fighter(maxHealth=100, strength=0),
"alignment": Alignment(faction.NONE),
"loot": Loot([("stone", 1)])})
entities["hardwood"] = lambda: Entity(sprite="hardwood", height=0.4, components={"item": Build("builtcloseddoor", flagsNeeded={"freeland"}, blockingFlags={"solid", "occupied"})})
def makeEntity(entType, roomData, *args, preserve=False, **kwargs):
entity = entities[entType](*args, **kwargs)
entity.construct(roomData, preserve)
return entity