Skip to content

Commit

Permalink
[SRV] refact(ScriptEngine): add abstract layer to scripts between Eng…
Browse files Browse the repository at this point in the history
…ine and GameLogic

Now any Python IDE should detect exist wraps of exported objects and provide auto-indentation.
Engine_Geometry left without wraps for now. Also documentation wasn't added yet.
  • Loading branch information
Insineer committed Sep 12, 2019
1 parent 66d2062 commit 3359d41
Show file tree
Hide file tree
Showing 23 changed files with 421 additions and 67 deletions.
12 changes: 7 additions & 5 deletions Documentation/ScriptEngine API [russian].txt
Original file line number Diff line number Diff line change
Expand Up @@ -25,13 +25,13 @@ Object -> Item (Небольшой предмет) -> Gun -> Taser.
Точки передачи управления (колбеки, которые вызывает движок):

Модуль Map: FillMap()
Модуль EngineHook: OnPlayerJoined()
Модуль Engine.Hooks: OnPlayerJoined()
// more soon


// * * * * *
//
// Модуль Engine_Server
// Модуль Engine.Server
//
// * * * * *

Expand Down Expand Up @@ -75,7 +75,7 @@ ItemSpriteState(enumeration)

// * * * * *
//
// Модуль Engine_World
// Модуль Engine.World
//
// * * * * *

Expand Down Expand Up @@ -123,7 +123,9 @@ Object
Функции:
AddVerb(string id, function() action) - добавить действие объекту (можно запихать аргументом любую функцию без аргументов)
Update(duration timeDelta) - вызывается каждый такт обновления мира движком
InteractedBy(Object) - вызывается, когда вызвано взаимодействие с объектом другим объектом (щелкнули по объекту: в аргументе то, что было в руке или сама рука)
InteractedBy(Object) -> bool // вызывается, когда вызвано взаимодействие с объектом другим объектом (щелкнули по объекту: в аргументе то, что было в руке или сама рука)
BumpedTo(Object) -> bool // вызывается, когда объект натыкается на другой объект (пока это возможно только для объектов, которым явно задали speed).
// При Move объект не начинает двигаться в препятствие

IsCloseTo(Object) - проверяет, находится ли объект рядом с тем, который передан в аргументе
Move(Vec2i) - передвинуть объект в заданном направлении. Все компоненты вектора должны быть == 1 ({1, 0}, {1, 1} например)
Expand Down
6 changes: 6 additions & 0 deletions GameLogic/Engine/Hooks.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
from Engine.Server import Player
from Objects.Creatures.Ghost import Ghostize

def OnPlayerJoined(player: Player):
print(player.ckey + " has joined! Yay!")
player.AddVerb("ghost", Ghostize)
4 changes: 4 additions & 0 deletions GameLogic/Engine/HooksRawArgs.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
from Engine.Hooks import *

def rawOnPlayerJoined(player):
OnPlayerJoined(Player(player))
52 changes: 52 additions & 0 deletions GameLogic/Engine/Server.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
from Engine_Server import *
from Engine.World import World, Control

from enum import Enum

class Game(eGame):
def __new__(cls, parent):
return parent

@property
def world() -> World:
return World(eGGame.world)


class Player(ePlayer):
def __new__(cls, parent):
return parent

@property
def ckey(self) -> str:
return super().ckey

@property
def control(self) -> Control:
return Control(super().control)

@control.setter
def control(self, value):
super(Player, self.__class__).control.fset(self, value)

def IsConnected(self) -> bool:
return super().IsConnected()


class ResourceManager(eResourceManager):
def __new__(cls, parent):
return parent

def GetIcon(title, state) -> eIcon:
eGServer.RM.GetIcon(title, state)


gServer = eGServer
gGame = Game(eGGame)
gRM = ResourceManager(eGServer.RM)


class ItemSpriteState(eItemSpriteState):
DEFAULT = eItemSpriteState.DEFAULT
ON_MOB = eItemSpriteState.ON_MOB
IN_HAND_LEFT = eItemSpriteState.IN_HAND_LEFT
IN_HAND_RIGHT = eItemSpriteState.IN_HAND_RIGHT
8 changes: 8 additions & 0 deletions GameLogic/Engine/Utils.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import contextlib
from datetime import timedelta
from typing import Callable

from Engine_Server import eGGame

def spawn(delay: timedelta, activity: Callable[[], None]) -> None:
eGGame.AddDelayedActivity(delay, activity)
Loading

0 comments on commit 3359d41

Please sign in to comment.