Skip to content

Commit

Permalink
train add amount
Browse files Browse the repository at this point in the history
  • Loading branch information
zsluedem committed May 17, 2024
1 parent b962540 commit b2617b6
Show file tree
Hide file tree
Showing 8 changed files with 99 additions and 107 deletions.
27 changes: 15 additions & 12 deletions src/actions.cairo
Original file line number Diff line number Diff line change
Expand Up @@ -223,8 +223,9 @@ mod kingdom_lord_controller {
fn start_training(
self: @ContractState,
soldier_kind: u64,
amount: u64
) -> Result<u64, Error>{
panic_on_err(self._start_training(soldier_kind))
panic_on_err(self._start_training(soldier_kind, amount))
}
fn finish_training(self: @ContractState, is_barrack: bool) -> Result<u64, Error>{
panic_on_err(self._finish_training(is_barrack))
Expand Down Expand Up @@ -341,8 +342,8 @@ mod kingdom_lord_controller {
fn finish_upgrade_test(self: @ContractState) -> Result<(), Error>{
self._finish_upgrade()
}
fn start_training_test(self: @ContractState, soldier_kind: u64) -> Result<u64, Error>{
self._start_training(soldier_kind)
fn start_training_test(self: @ContractState, soldier_kind: u64, amount:u64) -> Result<u64, Error>{
self._start_training(soldier_kind, amount)
}
fn finish_training_test(self: @ContractState, is_barrack: bool) -> Result<u64, Error>{
self._finish_training(is_barrack)
Expand Down Expand Up @@ -580,7 +581,8 @@ mod kingdom_lord_controller {
soldier_kind: 0,
start_time: 0,
end_time: 0,
is_finished: true
is_finished: true,
amount: 0
});

index = 0;
Expand All @@ -598,7 +600,8 @@ mod kingdom_lord_controller {
soldier_kind: 0,
start_time: 0,
end_time: 0,
is_finished: true
is_finished: true,
amount: 0
});

set!(world, (SpawnStatus { player, already_spawned: true }));
Expand Down Expand Up @@ -814,15 +817,15 @@ mod kingdom_lord_controller {
// }


fn _start_training(self: @ContractState, soldier_kind: u64) -> Result<u64, Error> {
fn _start_training(self: @ContractState, soldier_kind: u64, amount: u64) -> Result<u64, Error> {
let caller_address = get_caller_address();
let soldier_kind_num = soldier_kind;
let soldier_kind: SoldierKind = soldier_kind.into();
let soldier_info = soldier_info(soldier_kind);
let req_wood = soldier_info.req_wood.into();
let req_brick = soldier_info.req_brick.into();
let req_steel = soldier_info.req_steel.into();
let req_food = soldier_info.req_food.into();
let req_wood = (soldier_info.req_wood * amount).into();
let req_brick = (soldier_info.req_brick * amount).into();
let req_steel = (soldier_info.req_steel * amount).into();
let req_food = (soldier_info.req_food * amount).into();
let (wood, brick, steel, food) = self.get_resource(caller_address);
if wood < req_wood || brick < req_brick || steel < req_steel || food < req_food {
return Result::Err(Error::ResourceNotEnough);
Expand All @@ -836,9 +839,9 @@ mod kingdom_lord_controller {
self.barn.remove_food(caller_address, req_food);

let res = if soldier_kind_num < 3{
self.barrack.start_training(soldier_kind, soldier_info.required_time)
self.barrack.start_training(soldier_kind, soldier_info.required_time, amount)
} else {
self.stable.start_training(soldier_kind, soldier_info.required_time)
self.stable.start_training(soldier_kind, soldier_info.required_time, amount)
};
match res {
Result::Ok(training_id) => {
Expand Down
26 changes: 17 additions & 9 deletions src/components/barrack.cairo
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ struct BarrackUnderTraining{
start_time: u64,
end_time: u64,
is_finished: bool,
amount: u64
}

#[derive(Model, Copy, Drop, Serde)]
Expand All @@ -44,6 +45,7 @@ struct BarrackWaitingToTrain{
soldier_kind: u64,
required_time: u64,
is_planned: bool,
amount: u64
}


Expand All @@ -54,7 +56,8 @@ fn new_wait_to_train(address: ContractAddress, training_id: u64) -> BarrackWaiti
training_id: training_id,
soldier_kind: 0,
required_time: 0,
is_planned: false
is_planned: false,
amount: 0
}
}

Expand Down Expand Up @@ -124,15 +127,16 @@ mod barrack_component{
}
fn start_training(self: @ComponentState<TContractState>,
soldier_kind: SoldierKind,
required_time: u64
required_time: u64,
amount: u64
)-> Result<u64, Error>{
let world = self.get_contract().world();
let current_time = get_current_time();
let player = get_caller_address();
let barrack: Barrack = get!(world, (player), (Barrack));
let mut under_training = get!(world, (player), (BarrackUnderTraining));

let required_time = barrack.bonus * required_time / 100;
let required_time = (barrack.bonus * required_time / 100) * amount;
if barrack.population == 0{
return Result::Err(Error::NoTargetBuildingConstructed);
}
Expand All @@ -143,11 +147,13 @@ mod barrack_component{
under_training.start_time = current_time;
under_training.end_time = current_time + required_time;
under_training.soldier_kind = soldier_kind.into();
under_training.amount = amount;
let mut next_training_id = under_training.current_training_id + 1;
if next_training_id == UNDER_TRAINING_COUNT{
next_training_id = 0;
}
under_training.current_training_id = next_training_id;

set!(world, (under_training));
res = Result::Ok(under_training.current_training_id);
} else {
Expand All @@ -171,6 +177,7 @@ mod barrack_component{
train.soldier_kind = soldier_kind.into();
train.required_time = required_time;
train.is_planned = true;
train.amount = amount;

set!(world, (train));
res = Result::Ok(index);
Expand Down Expand Up @@ -198,22 +205,22 @@ mod barrack_component{
let origin_training_id = training.current_training_id;
match soldier_kind{
SoldierKind::Millitia => {
troops.army.millitia += 1;
troops.army.millitia += training.amount;
},
SoldierKind::Guard => {
troops.army.guard += 1;
troops.army.guard += training.amount;
},
SoldierKind::HeavyInfantry => {
troops.army.heavy_infantry += 1;
troops.army.heavy_infantry += training.amount;
},
SoldierKind::Scouts => {
troops.army.scouts += 1;
troops.army.scouts += training.amount;
},
SoldierKind::Knights => {
troops.army.knights += 1;
troops.army.knights += training.amount;
},
SoldierKind::HeavyKnights => {
troops.army.heavy_knights += 1;
troops.army.heavy_knights += training.amount;
}
}

Expand All @@ -229,6 +236,7 @@ mod barrack_component{
training.start_time = current_time;
training.end_time = current_time + next_train.required_time;
training.is_finished = false;
training.amount = next_train.amount;
set!(world, (next_train));
}
set!(world, (troops));
Expand Down
25 changes: 16 additions & 9 deletions src/components/stable.cairo
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ struct StableUnderTraining{
start_time: u64,
end_time: u64,
is_finished: bool,
amount: u64
}

#[derive(Model, Copy, Drop, Serde)]
Expand All @@ -39,6 +40,7 @@ struct StableWaitingToTrain{
soldier_kind: u64,
required_time: u64,
is_planned: bool,
amount: u64
}


Expand All @@ -48,7 +50,8 @@ fn new_stable_wait_to_train(address: ContractAddress, training_id: u64) -> Stabl
training_id: training_id,
soldier_kind: 0,
required_time: 0,
is_planned: false
is_planned: false,
amount: 0
}
}

Expand Down Expand Up @@ -115,15 +118,16 @@ mod stable_component{
}
fn start_training(self: @ComponentState<TContractState>,
soldier_kind: SoldierKind,
required_time: u64
required_time: u64,
amount:u64
)-> Result<u64, Error>{
let world = self.get_contract().world();
let current_time = get_current_time();
let player = get_caller_address();
let stable: Stable = get!(world, (player), (Stable));
let mut under_training = get!(world, (player), (StableUnderTraining));

let required_time = stable.bonus * required_time / 100;
let required_time = (stable.bonus * required_time / 100) * amount;
if stable.population == 0{
return Result::Err(Error::NoTargetBuildingConstructed);
}
Expand All @@ -133,6 +137,7 @@ mod stable_component{
under_training.is_finished = false;
under_training.start_time = current_time;
under_training.end_time = current_time + required_time;
under_training.amount = amount;
under_training.soldier_kind = soldier_kind.into();
let mut next_training_id = under_training.current_training_id + 1;
if next_training_id == UNDER_TRAINING_COUNT{
Expand Down Expand Up @@ -161,6 +166,7 @@ mod stable_component{
train.soldier_kind = soldier_kind.into();
train.required_time = required_time;
train.is_planned = true;
train.amount = amount;

set!(world, (train));
res = Result::Ok(index);
Expand Down Expand Up @@ -188,22 +194,22 @@ mod stable_component{
let origin_training_id = training.current_training_id;
match soldier_kind{
SoldierKind::Millitia => {
troops.army.millitia += 1;
troops.army.millitia += training.amount;
},
SoldierKind::Guard => {
troops.army.guard += 1;
troops.army.guard += training.amount;
},
SoldierKind::HeavyInfantry => {
troops.army.heavy_infantry += 1;
troops.army.heavy_infantry += training.amount;
},
SoldierKind::Scouts => {
troops.army.scouts += 1;
troops.army.scouts += training.amount;
},
SoldierKind::Knights => {
troops.army.knights += 1;
troops.army.knights += training.amount;
},
SoldierKind::HeavyKnights => {
troops.army.heavy_knights += 1;
troops.army.heavy_knights += training.amount;
}
}

Expand All @@ -219,6 +225,7 @@ mod stable_component{
training.start_time = current_time;
training.end_time = current_time + next_train.required_time;
training.is_finished = false;
training.amount = next_train.amount;
set!(world, (next_train));
}
set!(world, (troops));
Expand Down
2 changes: 2 additions & 0 deletions src/interface.cairo
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@ trait IKingdomLord<ContractState>{
fn start_training(
self: @ContractState,
soldier_kind: u64,
amount: u64
) -> Result<u64, Error>;
fn finish_training(self: @ContractState, is_barrack: bool) -> Result<u64, Error>;
// fn pay_to_finish_upgrade(ref self: ContractState, upgrade_id: u64) -> Result<(), Error>;
Expand Down Expand Up @@ -140,6 +141,7 @@ trait IKingdomLordTest<ContractState>{
fn start_training_test(
self: @ContractState,
soldier_kind: u64,
amount: u64
) -> Result<u64, Error>;
fn finish_training_test(self: @ContractState, is_barrack: bool) -> Result<u64, Error>;

Expand Down
46 changes: 9 additions & 37 deletions src/tests/test_ambush.cairo
Original file line number Diff line number Diff line change
Expand Up @@ -46,22 +46,10 @@ use core::result::ResultTrait;
increase_time(100);
level1_barrack(context, 21, player1);
level1_stable(context, 22, player1);
train_millitia(context);
train_millitia(context);
train_millitia(context);
train_millitia(context);
train_millitia(context);
train_millitia(context);
train_millitia(context);
train_millitia(context);
train_scouts(context);
train_scouts(context);
train_scouts(context);
train_scouts(context);
train_scouts(context);
train_scouts(context);
train_scouts(context);
train_scouts(context);
train_millitia(context, 6);
train_millitia(context, 2);
train_scouts(context, 6);
train_scouts(context, 2);
assert_troop(context, player1, 8,0,0,8,0,0);

increase_time(10);
Expand All @@ -79,26 +67,10 @@ use core::result::ResultTrait;
increase_time(100);
level1_barrack(context, 21, player2);
level1_stable(context, 22, player2);
train_millitia(context);
train_millitia(context);
train_millitia(context);
train_millitia(context);
train_millitia(context);
train_millitia(context);
train_millitia(context);
train_millitia(context);
train_millitia(context);
train_millitia(context);
train_scouts(context);
train_scouts(context);
train_scouts(context);
train_scouts(context);
train_scouts(context);
train_scouts(context);
train_scouts(context);
train_scouts(context);
train_scouts(context);
train_scouts(context);
train_millitia(context, 6);
train_millitia(context, 4);
train_scouts(context, 6);
train_scouts(context, 4);
assert_troop(context, player2, 10,0,0,10,0,0);

let ambush_data = array![
Expand All @@ -109,7 +81,7 @@ use core::result::ResultTrait;
context.kingdom_lord_test.create_ambush_test(ambush_hash,10, 0,0,10,0,0).expect('create ambush succeed');
assert_troop(context, player2, 0,0,0,0,0,0);
increase_time(100000);
context.kingdom_lord_test.start_training_test(0).expect('train millitia');
context.kingdom_lord_test.start_training_test(0, 1).expect('train millitia');
assert_resource(context, player2, 880, 900, 850, 970);
assert_resource(context, player1, 1000, 1000, 1000, 1000);
context.kingdom_lord_test.reveal_attack_test(ambush_hash, 75, 90, 100000, 1, 76,90, true).expect('reveal attack succeed');
Expand Down
8 changes: 4 additions & 4 deletions src/tests/test_total_population.cairo
Original file line number Diff line number Diff line change
Expand Up @@ -51,16 +51,16 @@ mod tests {
assert_population(context, caller, 14);


train_millitia(context);
train_millitia(context, 1);
assert_population(context, caller, 15);

train_millitia(context);
train_millitia(context, 1);
assert_population(context, caller, 16);

train_scouts(context);
train_scouts(context, 1);
assert_population(context, caller, 18);

train_scouts(context);
train_scouts(context, 1);
assert_population(context, caller, 20);
}
}
Loading

0 comments on commit b2617b6

Please sign in to comment.