merged roomedge into portal, moved tcommunicate and utils to common folder and fixed package when starting main directory

This commit is contained in:
troido 2017-12-31 00:10:14 +01:00
parent b3fc583cb1
commit 2b268de063
15 changed files with 29 additions and 87 deletions

View File

@ -15,11 +15,11 @@ if len(sys.argv)>1 and sys.argv[1] in {"server", "client"}:
else:
# make it work even if it wasn't executed as module
import os.path
sys.path.append(os.path.join(os.path.dirname(__file__)))
sys.path.append(os.path.join(os.path.dirname(__file__), ".."))
if sys.argv[1] == "server":
from server import main
from asciifarm.server import main
else:
from client import main
from asciifarm.client import main
main.main(sys.argv[2:])
else:

View File

@ -1,7 +1,7 @@
import socket
from .tcommunicate import send, receive
from asciifarm.common.tcommunicate import send, receive
class Connection:

View File

@ -102,7 +102,7 @@
"!": ["grass", "club"],
"]": ["grass", "armour"],
"1": [{
"type": "roomboundary",
"type": "roomexit",
"args": ["right", [1, 0], [false, true]]
}, "grass"],
" ": []

View File

@ -93,7 +93,7 @@
"X": "rock",
"^": ["spiketrap", "ground"],
"1": [{
"type": "roomboundary",
"type": "roomexit",
"args": ["begin", [-2, 0], [false, true]]
}, "grass"],
"%": [{

View File

@ -94,7 +94,7 @@
"X": "rock",
"^": ["spiketrap", "ground"],
"1": [{
"type": "roomboundary",
"type": "roomexit",
"args": ["begin", [-2, 0], [false, true]]
}, "grass"],
"%": [{

View File

@ -1,5 +1,5 @@
from .. import timeout
from .. import utils
from asciifarm.common import utils
import random
from .component import Component

View File

@ -4,21 +4,31 @@ from .component import Component
class Portal(Component):
def __init__(self, destRoom, destPos=None):
def __init__(self, destRoom, destPos=(0,0), mask=(False, False)):
self.destRoom = destRoom
self.destPos = destPos
if isinstance(self.destPos, list):
destPos = tuple(destPos)
self.origin = destPos
self.mask = mask
def attach(self, obj):
obj.addListener("objectenter", self.onEnter)
self.owner = obj
def onEnter(self, owner, obj=None, *data):
obj.trigger("changeroom", self.destRoom, self.destPos)
offset = self.owner.getGround().getPos()
if isinstance(self.origin, str):
dest = self.origin
else:
dest = tuple(
self.origin[i] + (offset[i] if self.mask[i] else 0)
for i in range(2)
)
obj.trigger("changeroom", self.destRoom, dest)
def toJSON(self):
return {
"destRoom": self.destRoom,
"destPos": self.destPos
"destPos": self.origin,
"mask": self.mask
}

View File

@ -1,31 +0,0 @@
from .component import Component
# todo: combine with portal
class RoomEdge(Component):
def __init__(self, destRoom, destOrigin=(0,0), mask=(True, True)):
self.destRoom = destRoom
self.origin = destOrigin
self.mask = mask
def attach(self, obj):
obj.addListener("objectenter", self.onEnter)
self.owner = obj
def onEnter(self, owner, obj=None, *data):
offset = self.owner.getGround().getPos()
dest = tuple(
self.origin[i] + (offset[i] if self.mask[i] else 0)
for i in range(2)
)
obj.trigger("changeroom", self.destRoom, dest)
def toJSON(self):
return {
"destRoom": self.destRoom,
"destPos": self.destPos
}

View File

@ -3,7 +3,7 @@ import time
from . import gameserver
from . import world
from . import view
from . import utils
from asciifarm.common import utils
import os
import json

View File

@ -18,7 +18,6 @@ from .components.build import Build
from .components.harvest import Harvest
from .components.food import Food
from .components.equippable import Equippable
from .components.roomedge import RoomEdge
""" This module contains factory functions for many placable entities, and a make function to call a factory by a string name """
@ -78,14 +77,10 @@ def makeWater():
return Entity(sprite="water", height=0)
entities["water"] = makeWater
def makeRoomExit(destRoom, destPos=None, sprite="exit", size=0):
return Entity(sprite=sprite, height=size, components={"collision": Portal(destRoom, destPos)})
def makeRoomExit(destRoom, destPos=None, mask=(False, False), sprite=" ", size=0):
return Entity(sprite=sprite, height=size, components={"collision": Portal(destRoom, destPos, mask)})
entities["roomexit"] = makeRoomExit
def makeRoomBoundary(destRoom, destPos=None, mask=(True, True)):
return Entity(sprite=" ", height=0, components={"collision": RoomEdge(destRoom, destPos, mask)})
entities["roomboundary"] = makeRoomBoundary
def makeRabbit():
return Entity(sprite="rabbit", height=1, components={"move": Move(slowness=4), "controller": RandomWalkController(moveChance=0.05)})
entities["rabbit"] = makeRabbit

View File

@ -1,4 +1,4 @@
from . import utils
from asciifarm.common import utils
class Grid:

View File

@ -3,7 +3,7 @@ import socket
import sys
import threading
from .tcommunicate import send, receive
from asciifarm.common.tcommunicate import send, receive
# Class to open a TCP Socket

View File

@ -1,32 +0,0 @@
HEADER_SIZE = 4
# this module is for sending discree messages over TCP
# this is achieved by prefixing all messages with their length
# calls to send and recv will also keep attempting to send all data unless this proves impossible
def send(sock, msg):
length = len(msg)
header = length.to_bytes(4, byteorder="big")
totalmsg = header + msg
sock.sendall(totalmsg)
def receive(sock):
header = recvall(sock, 4) #sock.recv(4)
length = int.from_bytes(header, byteorder="big")
return recvall(sock, length)
def recvall(sock, length):
chunks = []
bytes_recd = 0
while bytes_recd < length:
chunk = sock.recv(min(length - bytes_recd, 4096))
if chunk == b'':
break
#raise RuntimeError("socket connection broken")
chunks.append(chunk)
bytes_recd = bytes_recd + len(chunk)
return b''.join(chunks)