1
- use soroban_sdk:: { contractimpl, log, BytesN , Env , Map } ;
1
+ use soroban_sdk:: { contractimpl, log, panic_with_error, vec, BytesN , Env , Map , Vec } ;
2
+ use crate :: types:: { Action , ActionItem , ProxyError } ;
3
+
2
4
mod game_engine {
3
5
soroban_sdk:: contractimport!( file = "../game_engine.wasm" ) ;
4
6
}
5
7
8
+ const ACTIONS : & str = "actions" ;
6
9
const ENGINE_ID : & str = "engine" ;
7
10
8
11
pub struct LoggingEngine ;
9
12
#[ contractimpl]
10
13
impl LoggingEngine {
11
14
pub fn wrap ( env : Env , engine_id : BytesN < 32 > ) {
12
15
env. storage ( ) . set ( & ENGINE_ID , & engine_id) ;
16
+ env. storage ( )
17
+ . set :: < & str , Vec < ActionItem > > ( & ACTIONS , & vec ! [ & env] ) ;
13
18
log ! ( & env, "🗒️ logger engine taking notes" ) ;
14
19
}
15
20
@@ -20,6 +25,15 @@ impl LoggingEngine {
20
25
game_engine:: Client :: new ( & env, & Self :: engine_id ( env. clone ( ) ) )
21
26
}
22
27
28
+ pub fn actions ( env : Env ) -> Vec < ActionItem > {
29
+ env. storage ( ) . get ( & ACTIONS ) . unwrap ( ) . unwrap ( )
30
+ }
31
+ fn log_action ( env : & Env , action : & ActionItem ) {
32
+ let mut actions = Self :: actions ( env. clone ( ) ) ;
33
+ actions. push_back ( * action) ;
34
+ env. storage ( ) . set ( & ACTIONS , & actions) ;
35
+ }
36
+
23
37
/// wrapping interface implemention
24
38
pub fn init (
25
39
env : Env ,
@@ -34,7 +48,7 @@ impl LoggingEngine {
34
48
) {
35
49
if !env. storage ( ) . has ( & ENGINE_ID ) {
36
50
log ! ( & env, "Call 'wrap' first" ) ;
37
- panic ! ( ) ;
51
+ panic_with_error ! ( & env , ProxyError :: NotWrapped ) ;
38
52
}
39
53
40
54
Self :: get_engine ( & env) . init (
@@ -49,19 +63,41 @@ impl LoggingEngine {
49
63
) ;
50
64
}
51
65
pub fn p_turn ( env : Env , direction : game_engine:: Direction ) -> Result < ( ) , game_engine:: Error > {
52
- Ok ( Self :: get_engine ( & env) . p_turn ( & direction) )
66
+ if let Err ( Ok ( e) ) = Self :: get_engine ( & env) . try_p_turn ( & direction) {
67
+ return Err ( e) ;
68
+ }
69
+ Self :: log_action ( & env, & ActionItem ( Action :: Turn , direction as u32 ) ) ;
70
+ Ok ( ( ) )
53
71
}
54
72
pub fn p_move ( env : Env , times : Option < u32 > ) -> Result < ( ) , game_engine:: Error > {
55
- Ok ( Self :: get_engine ( & env) . p_move ( & times) )
73
+ if let Err ( Ok ( e) ) = Self :: get_engine ( & env) . try_p_move ( & times) {
74
+ return Err ( e) ;
75
+ }
76
+ Self :: log_action ( & env, & ActionItem ( Action :: Move , 1 ) ) ;
77
+ Ok ( ( ) )
56
78
}
57
79
pub fn p_shoot ( env : Env ) -> Result < ( ) , game_engine:: Error > {
58
- Ok ( Self :: get_engine ( & env) . p_shoot ( ) )
80
+ let p = Self :: get_engine ( & env) . p_points ( ) ;
81
+ if let Err ( Ok ( e) ) = Self :: get_engine ( & env) . try_p_shoot ( ) {
82
+ return Err ( e) ;
83
+ }
84
+ let hits = Self :: get_engine ( & env) . p_points ( ) - p;
85
+ Self :: log_action ( & env, & ActionItem ( Action :: Shoot , hits) ) ;
86
+ Ok ( ( ) )
59
87
}
60
88
pub fn p_harvest ( env : Env ) -> Result < ( ) , game_engine:: Error > {
61
- Ok ( Self :: get_engine ( & env) . p_harvest ( ) )
89
+ if let Err ( Ok ( e) ) = Self :: get_engine ( & env) . try_p_harvest ( ) {
90
+ return Err ( e) ;
91
+ }
92
+ Self :: log_action ( & env, & ActionItem ( Action :: Harvest , 1 ) ) ;
93
+ Ok ( ( ) )
62
94
}
63
95
pub fn p_upgrade ( env : Env ) -> Result < ( ) , game_engine:: Error > {
64
- Ok ( Self :: get_engine ( & env) . p_upgrade ( ) )
96
+ if let Err ( Ok ( e) ) = Self :: get_engine ( & env) . try_p_upgrade ( ) {
97
+ return Err ( e) ;
98
+ }
99
+ Self :: log_action ( & env, & ActionItem ( Action :: Upgrade , 1 ) ) ;
100
+ Ok ( ( ) )
65
101
}
66
102
pub fn p_pos ( env : Env ) -> game_engine:: Point {
67
103
Self :: get_engine ( & env) . p_pos ( )
0 commit comments