created buildable doors (that regain full health when opened/closed

This commit is contained in:
troido 2018-01-16 13:26:30 +01:00
parent c06e1c9b27
commit 5e0514ddbd
3 changed files with 56 additions and 3 deletions

View File

@ -8,11 +8,13 @@ class Change(Component):
This could probably also be implemented with a combination of harvest and loot,
but this seemed better."""
def __init__(self, into, nextArgs=None, nextKwargs=None):
def __init__(self, into, permitted=None, nextArgs=None, nextKwargs=None):
self.into = into
self.nextArgs = nextArgs or []
self.nextKwargs = nextKwargs or {}
self.permitted = permitted
def attach(self, obj):
self.owner = obj
@ -21,7 +23,17 @@ class Change(Component):
def roomJoin(self, o, roomData):
self.roomData = roomData
def interact(self, obj):
def interact(self, other):
if self.permitted is not None and other.getName() not in self.permitted:
return
obj = gameobjects.makeEntity(self.into, self.roomData, *self.nextArgs, preserve=self.owner.isPreserved(), **self.nextKwargs)
obj.place(self.owner.getGround())
self.owner.remove()
def toJSON(self):
return {
"into": self.into,
"permitted": self.permitted,
"nextArgs": self.nextArgs,
"nextKwargs": self.nextKwargs
}

View File

@ -0,0 +1,25 @@
from .component import Component
class HomePortal(Component):
def __init__(self, roomName="*home:{}"):
self.roomName = roomName
def attach(self, obj):
obj.addListener("objectenter", self.onEnter)
self.owner = obj
def onEnter(self, owner, obj=None, *data):
obj.trigger("changeroom", self.destRoom, dest)
def toJSON(self):
return {
"destRoom": self.destRoom,
"destPos": self.origin,
"mask": self.mask
}

View File

@ -80,7 +80,7 @@ entities["troll"] = lambda home=None: Entity(sprite="troll", height=1.8, compone
"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)])
"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={
@ -118,6 +118,8 @@ entities["sword"] = lambda: Entity(sprite="sword", height=0.5, components={"item
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)})
@ -126,6 +128,20 @@ entities["closeddoor"] = lambda: Entity(sprite="closeddoor", name="door", height
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)