Skip to content

Commit 92e4d04

Browse files
committed
Revert "Merge pull request #15 from Cyber-Mitch/feat/elo_function"
This reverts commit 06fb9c5, reversing changes made to 20dde80.
1 parent 06fb9c5 commit 92e4d04

4 files changed

Lines changed: 3 additions & 322 deletions

File tree

.github/workflows/ci.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,4 +36,4 @@ jobs:
3636
sozo test
3737
- name: Check formatting
3838
run: |
39-
scarb fmt --check
39+
scarb fmt --check

src/model/game_model.cairo

Lines changed: 0 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,6 @@
11
use starknet::{ContractAddress, contract_address_const};
22
// Keeps track of the state of the game
33

4-
// New PlayerRating model to store player ratings
5-
#[derive(Copy, Drop, Serde, Introspect)]
6-
#[dojo::model]
7-
pub struct PlayerRating {
8-
#[key]
9-
pub player: ContractAddress,
10-
pub rating: u32 // Elo rating
11-
}
12-
13-
// Trait for PlayerRating operations
14-
pub trait PlayerRatingTrait {
15-
fn new(player: ContractAddress, rating: u32) -> PlayerRating;
16-
}
17-
18-
impl PlayerRatingImpl of PlayerRatingTrait {
19-
fn new(player: ContractAddress, rating: u32) -> PlayerRating {
20-
PlayerRating { player, rating }
21-
}
22-
}
23-
244
#[derive(Serde, Copy, Drop, Introspect, PartialEq)]
255
#[dojo::model]
266
pub struct GameCounter {

src/systems/Snooknet.cairo

Lines changed: 1 addition & 198 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use dojo::event::EventStorage;
55

66

77
use 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};
99
use 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]
1818
pub 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

Comments
 (0)