@@ -5,7 +5,7 @@ use dojo::event::EventStorage;
55
66
77use dojo_starter :: interfaces :: ISnooknet :: ISnooknet ;
8- use dojo_starter :: model :: game_model :: {Game , GameTrait , GameState , GameCounter , PlayerRating };
8+ use dojo_starter :: model :: game_model :: {Game , GameTrait , GameState , GameCounter };
99use dojo_starter :: model :: tournament_model :: {
1010 Tournament as TournamentModel , TournamentTrait , TournamentStatus , TournamentReward ,
1111 TournamentCounter ,
@@ -16,12 +16,6 @@ use dojo_starter::model::player_model::{Player, PlayerTrait};
1616// dojo decorator
1717#[dojo:: contract]
1818pub mod Snooknet {
19- use super :: {ISnooknet , Game , GameTrait , GameCounter , GameState , PlayerRating };
20- use starknet :: {
21- ContractAddress , get_caller_address, get_block_timestamp, contract_address_const,
22- };
23- use dojo :: model :: {ModelStorage };
24- use dojo :: event :: EventStorage ;
2519 use super :: * ;
2620
2721 #[derive(Copy , Drop , Serde )]
@@ -32,15 +26,6 @@ pub mod Snooknet {
3226 pub timestamp : u64 ,
3327 }
3428
35- #[derive(Copy , Drop , Serde )]
36- #[dojo:: event]
37- pub struct RatingUpdated {
38- #[key]
39- pub player : ContractAddress ,
40- pub new_rating : u32 ,
41- }
42-
43-
4429 #[derive(Copy , Drop , Serde )]
4530 #[dojo:: event]
4631 pub struct GameCreated {
@@ -125,10 +110,6 @@ pub mod Snooknet {
125110 let player_1 = get_caller_address ();
126111 let player_2 = opponent ;
127112
128- // Initialize ratings for players if they don't exist
129- self . ensure_player_rating (player_1 );
130- self . ensure_player_rating (player_2 );
131-
132113 // Create a new game
133114 let mut new_game : Game = GameTrait :: new (
134115 game_id ,
@@ -156,49 +137,11 @@ pub mod Snooknet {
156137 let caller = get_caller_address ();
157138
158139 let timestamp = get_block_timestamp ();
159-
160140 assert ((caller == game . player1) || (caller == game . player2), ' Not a Player' );
161-
162- assert (
163- (winner == game . player1)
164- || (winner == game . player2)
165- || (winner == contract_address_const :: <0x0 >()),
166- ' Invalid winner' ,
167- );
168-
169- // Ensure game is not already finished
170- assert (game . state != GameState :: Finished , ' Game already ended' );
171-
172141 game . winner = winner ;
173142 game . state = GameState :: Finished ;
174143 game . updated_at = get_block_timestamp ();
175144
176- // Update player ratings using Elo algorithm
177- if winner != contract_address_const :: <0x0 >() {
178- // Not a draw
179- let (new_rating1 , new_rating2 ) = self
180- . elo_function (game . player1, game . player2, winner );
181- let mut rating1 : PlayerRating = world . read_model (game . player1);
182- let mut rating2 : PlayerRating = world . read_model (game . player2);
183- rating1 . rating = new_rating1 ;
184- rating2 . rating = new_rating2 ;
185- world . write_model (@ rating1 );
186- world . write_model (@ rating2 );
187- world . emit_event (@ RatingUpdated { player : game . player1, new_rating : new_rating1 });
188- world . emit_event (@ RatingUpdated { player : game . player2, new_rating : new_rating2 });
189- } else {
190- // Draw: both players get 0.5 score
191- let (new_rating1 , new_rating2 ) = self . elo_function_draw (game . player1, game . player2);
192- let mut rating1 : PlayerRating = world . read_model (game . player1);
193- let mut rating2 : PlayerRating = world . read_model (game . player2);
194- rating1 . rating = new_rating1 ;
195- rating2 . rating = new_rating2 ;
196- world . write_model (@ rating1 );
197- world . write_model (@ rating2 );
198- world . emit_event (@ RatingUpdated { player : game . player1, new_rating : new_rating1 });
199- world . emit_event (@ RatingUpdated { player : game . player2, new_rating : new_rating2 });
200- }
201-
202145 world . write_model (@ game );
203146 world . emit_event (@ Winner { game_id , winner });
204147 world . emit_event (@ GameEnded { game_id , timestamp });
@@ -299,145 +242,6 @@ pub mod Snooknet {
299242 self . world (@ " Snooknet" )
300243 }
301244
302- fn ensure_player_rating (ref self : ContractState , player : ContractAddress ) {
303- let mut world = self . world_default ();
304- let mut rating : PlayerRating = world . read_model (player );
305- if rating . rating == 0 {
306- rating . rating = 1500 ;
307- world . write_model (@ rating );
308- }
309- }
310-
311- // Elo function for win/loss
312- fn elo_function (
313- ref self : ContractState ,
314- player1 : ContractAddress ,
315- player2 : ContractAddress ,
316- winner : ContractAddress ,
317- ) -> (u32 , u32 ) {
318- let mut world = self . world_default ();
319- let rating1 : PlayerRating = world . read_model (player1 );
320- let rating2 : PlayerRating = world . read_model (player2 );
321- let r1 = rating1 . rating; // u32
322- let r2 = rating2 . rating; // u32
323- let k = 32_u32 ; // Elo K-factor
324-
325- // Calculate expected scores (scaled 0 to 1000)
326- let expected1 = self . calculate_expected (r1 , r2 ); // u32
327- let expected2 = self . calculate_expected (r2 , r1 ); // u32
328-
329- // Assign scores based on winner
330- let (score1 , score2 ) = if winner == player1 {
331- (1000_u32 , 0_u32 )
332- } else {
333- (0_u32 , 1000_u32 )
334- };
335-
336- // Calculate rating changes safely
337- let new_rating1 = if score1 >= expected1 {
338- // Positive or zero change (e.g., winner)
339- let delta = (score1 - expected1 ) * k / 1000 ;
340- r1 + delta
341- } else {
342- // Negative change (e.g., loser)
343- let delta = self . safe_subtract (expected1 , score1 ) * k / 1000 ;
344- let min_rating = 100_u32 ; // Minimum rating to prevent too-low values
345- if r1 <= delta {
346- min_rating
347- } else {
348- r1 - delta
349- }
350- };
351-
352- let new_rating2 = if score2 >= expected2 {
353- // Positive or zero change
354- let delta = (score2 - expected2 ) * k / 1000 ;
355- r2 + delta
356- } else {
357- // Negative change
358- let delta = self . safe_subtract (expected2 , score2 ) * k / 1000 ;
359- let min_rating = 100_u32 ;
360- if r2 <= delta {
361- min_rating
362- } else {
363- r2 - delta
364- }
365- };
366-
367- (new_rating1 , new_rating2 )
368- }
369-
370- // Elo function for draw
371- fn elo_function_draw (
372- ref self : ContractState , player1 : ContractAddress , player2 : ContractAddress ,
373- ) -> (u32 , u32 ) {
374- let mut world = self . world_default ();
375- let rating1 : PlayerRating = world . read_model (player1 );
376- let rating2 : PlayerRating = world . read_model (player2 );
377- let r1 = rating1 . rating;
378- let r2 = rating2 . rating;
379- let k = 32_u32 ;
380-
381- let expected1 = self . calculate_expected (r1 , r2 );
382- let expected2 = self . calculate_expected (r2 , r1 );
383- let score = 500_u32 ; // Draw score (scaled)
384-
385- let new_rating1 = if score >= expected1 {
386- let delta = (score - expected1 ) * k / 1000 ;
387- r1 + delta
388- } else {
389- let delta = self . safe_subtract (expected1 , score ) * k / 1000 ;
390- let min_rating = 100_u32 ;
391- if r1 <= delta {
392- min_rating
393- } else {
394- r1 - delta
395- }
396- };
397-
398- let new_rating2 = if score >= expected2 {
399- let delta = (score - expected2 ) * k / 1000 ;
400- r2 + delta
401- } else {
402- let delta = self . safe_subtract (expected2 , score ) * k / 1000 ;
403- let min_rating = 100_u32 ;
404- if r2 <= delta {
405- min_rating
406- } else {
407- r2 - delta
408- }
409- };
410-
411- (new_rating1 , new_rating2 )
412- }
413-
414- // Helper function to calculate expected score
415- fn calculate_expected (self : @ ContractState , r1 : u32 , r2 : u32 ) -> u32 {
416- if r1 > r2 {
417- let diff = r1 - r2 ;
418- if diff > 400 {
419- 1000_u32
420- } else {
421- 500_u32 + (diff * 5 ) / 4
422- }
423- } else {
424- let diff = r2 - r1 ;
425- if diff > 400 {
426- 0_u32
427- } else {
428- 500_u32 - (diff * 5 ) / 4
429- }
430- }
431- }
432-
433- fn safe_subtract (self : @ ContractState , a : u32 , b : u32 ) -> u32 {
434- if a >= b {
435- a - b
436- } else {
437- 0_u32
438- }
439- }
440-
441245 fn create_new_tournament_id (ref self : ContractState ) -> u256 {
442246 let mut world = self . world_default ();
443247 let mut tournament_counter : TournamentCounter = world . read_model (' v0' );
@@ -449,4 +253,3 @@ pub mod Snooknet {
449253 }
450254}
451255
452-
0 commit comments