Skip to content

Commit a8973b5

Browse files
committed
Add register game begin listener
1 parent c08717d commit a8973b5

File tree

3 files changed

+80
-1
lines changed

3 files changed

+80
-1
lines changed

game_controller.c

+36
Original file line numberDiff line numberDiff line change
@@ -1136,6 +1136,42 @@ void show_text() {
11361136
"mov [0x1FEA094],eax;");
11371137
}
11381138

1139+
// game begin
1140+
typedef void (*HandleGameBeginEvent)(void);
1141+
1142+
HandleGameBeginEvent handle_game_begin_event;
1143+
1144+
void game_begin_hook_handler() {
1145+
// backup registers
1146+
asm ("push eax;");
1147+
asm ("push ebx;");
1148+
asm ("push ecx;");
1149+
asm ("push edx;");
1150+
asm ("push esi;");
1151+
1152+
handle_game_begin_event();
1153+
// restore registers
1154+
asm ("pop esi;");
1155+
asm ("pop edx;");
1156+
asm ("pop ecx;");
1157+
asm ("pop ebx;");
1158+
asm ("pop eax;");
1159+
1160+
// back to normal path 1
1161+
asm ("leave;");
1162+
1163+
// execute stole code
1164+
asm ("mov eax,0x0000190;");
1165+
1166+
// back to normal path 2
1167+
asm ("jmp 0x04F6CFD;");
1168+
}
1169+
1170+
void execute_callback_on_game_begin(HandleGameBeginEvent function) {
1171+
handle_game_begin_event = function;
1172+
hook_at(0x04F6CF8, (void*)game_begin_hook_handler);
1173+
}
1174+
11391175
void free_memory(char *ptr)
11401176
{
11411177
free(ptr);

strongmod/api/game.py

+29-1
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
11
from common.singleton import Singleton
2-
from internal.game_controller import set_on_tick_listener, is_game_created, get_resolution, disable_bot, show_message
2+
from internal.game_controller import set_on_tick_listener, is_game_created, get_resolution, disable_bot, show_message, \
3+
set_on_game_begin_listener
34
from api.lord import Lord, LordDoesNotExistException
45

56

67
class Game(metaclass=Singleton):
78
def __init__(self):
89
self.tick_listeners = []
10+
set_on_game_begin_listener(self.publish_game_begin)
11+
self.game_begin_listeners = []
912
set_on_tick_listener(self.publish)
1013
self.replaced_default_bots = {}
1114
self.set_on_tick_listener(self.tick_replaced_default_bots)
@@ -70,3 +73,28 @@ def show_message(self, title, message):
7073
game.show_message("hello,", "world")
7174
"""
7275
show_message(title, message)
76+
77+
def publish_game_begin(self):
78+
for game_begin_listener in self.game_begin_listeners:
79+
game_begin_listener()
80+
81+
def register_game_begin_listener(self, game_begin_listener):
82+
"""
83+
Register a listener to be notified when the game begins.
84+
85+
The registered listener will be called when the game begins, such as when
86+
a saved game is loaded or when the game editor starts, etc.
87+
88+
:param game_begin_listener: A callable object, such as a
89+
function or method, to be notified when the game begins.
90+
:type game_begin_listener: callable
91+
92+
:Example:
93+
game = Game()
94+
95+
def game_begin_listener():
96+
game.show_message("hello,", "world")
97+
98+
game.register_game_begin_listener(game_begin_listener)
99+
"""
100+
self.game_begin_listeners.append(game_begin_listener)

strongmod/internal/game_controller.py

+15
Original file line numberDiff line numberDiff line change
@@ -417,3 +417,18 @@ def get_all_buildings():
417417

418418
_game_controller.show_text.restype = ctypes.c_void_p
419419
show_text = _game_controller.show_text
420+
421+
422+
class GameBeginListener:
423+
listener = None
424+
425+
426+
@ctypes.CFUNCTYPE(ctypes.c_void_p)
427+
def handle_game_begin_event():
428+
GameBeginListener.listener()
429+
430+
431+
def set_on_game_begin_listener(listener):
432+
GameBeginListener.listener = listener
433+
434+
_game_controller.execute_callback_on_game_begin(handle_game_begin_event)

0 commit comments

Comments
 (0)