Skip to content

Commit

Permalink
get method require contract address
Browse files Browse the repository at this point in the history
  • Loading branch information
zsluedem committed Feb 20, 2024
1 parent c720603 commit 5694c59
Show file tree
Hide file tree
Showing 8 changed files with 100 additions and 101 deletions.
29 changes: 15 additions & 14 deletions src/actions.cairo
Original file line number Diff line number Diff line change
Expand Up @@ -107,18 +107,20 @@ mod kingdom_lord_controller {
}

fn get_resource(
self: @ContractState
self: @ContractState,
player: ContractAddress,
) -> (Resource<Wood>, Resource<Brick>, Resource<Steel>, Resource<Food>) {
let (wood, brick, steel, food) = self.outer_city.get_minable_resource();
let remain_food = self.barn.get_food();
let (remain_wood, remain_brick, remain_steel) = self.warehouse.get_resource();
let (wood, brick, steel, food) = self.outer_city.get_minable_resource(player);
let remain_food = self.barn.get_food(player);
let (remain_wood, remain_brick, remain_steel) = self.warehouse.get_resource(player);
(wood + remain_wood, brick + remain_brick, steel + remain_steel, food + remain_food)
}

fn get_growth_rate(
self: @ContractState
self: @ContractState,
player: ContractAddress,
) -> (GrowthRate<Wood>, GrowthRate<Brick>, GrowthRate<Steel>, GrowthRate<Food>) {
self.outer_city.get_growth_rate()
self.outer_city.get_growth_rate(player)
}

fn start_upgrade(ref self: ContractState, building_id: u64) -> Result<u64, Error> {
Expand All @@ -128,14 +130,14 @@ mod kingdom_lord_controller {
steel: req_steel,
food: req_food
} = self.upgrade_requirement(building_id);
let (wood, brick, steel, food) = self.get_resource();
let caller_address = get_caller_address();
let (wood, brick, steel, food) = self.get_resource(caller_address);
if wood >= req_wood && brick >= req_brick && steel >= req_steel && food >= req_food {
let (mined_wood, mined_brick, mined_steel, mined_food) = self.mine();
self.warehouse.add_resource(mined_wood, mined_brick, mined_steel);
self.barn.add_food(mined_food);
self.warehouse.remove_resource(req_wood, req_brick, req_steel);
self.barn.remove_food(req_food);
let caller_address = get_caller_address();
let next_level = self.next_level(building_id);
let upgrade_id = self
.city_hall
Expand Down Expand Up @@ -164,17 +166,16 @@ mod kingdom_lord_controller {
res
}

fn get_under_upgrading(self: @ContractState) -> Array<UnderUpgrading> {
self.city_hall.get_under_upgrading()
fn get_under_upgrading(self: @ContractState, player: ContractAddress,) -> Array<UnderUpgrading> {
self.city_hall.get_under_upgrading(player)
}

fn get_complete_upgrading(self: @ContractState) -> Array<UnderUpgrading> {
self.city_hall.get_complete_upgrading()
fn get_complete_upgrading(self: @ContractState, player: ContractAddress,) -> Array<UnderUpgrading> {
self.city_hall.get_complete_upgrading(player)
}

fn get_buildings_levels(self: @ContractState) -> Array<Level>{
fn get_buildings_levels(self: @ContractState, player: ContractAddress) -> Array<Level>{
let world = self.world_dispatcher.read();
let player = get_caller_address();
let mut res = array![];
let mut index = 0_u64;
loop{
Expand Down
8 changes: 4 additions & 4 deletions src/components/barn.cairo
Original file line number Diff line number Diff line change
Expand Up @@ -31,12 +31,12 @@ impl BarnTraitImpl of BarnExtension{

#[starknet::interface]
trait BarnTrait<TState>{
fn get_food(self: @TState) -> Resource<Food>;
fn get_food(self: @TState, player: ContractAddress) -> Resource<Food>;
}

#[starknet::component]
mod barn_component{
use starknet::{get_caller_address};
use starknet::{get_caller_address, ContractAddress};
use core::starknet::info::get_block_number;
use dojo::world::{
IWorldProvider, IWorldProviderDispatcher, IWorldDispatcher, IWorldDispatcherTrait
Expand All @@ -50,8 +50,8 @@ mod barn_component{
impl BarnTraitImpl<
TContractState, +HasComponent<TContractState>, +IWorldProvider<TContractState>
> of BarnTrait<ComponentState<TContractState>>{
fn get_food(self: @ComponentState<TContractState>) -> Resource<Food>{
let barn = get!(self.get_contract().world(), get_caller_address(), (Barn));
fn get_food(self: @ComponentState<TContractState>, player: ContractAddress) -> Resource<Food>{
let barn = get!(self.get_contract().world(), player, (Barn));
barn.get_food()
}

Expand Down
10 changes: 4 additions & 6 deletions src/components/city_hall.cairo
Original file line number Diff line number Diff line change
Expand Up @@ -39,8 +39,7 @@ mod city_hall_component {
impl CityHallInternalImpl<
TContractState, +HasComponent<TContractState>, +IWorldProvider<TContractState>
> of CityHallInternalTrait<TContractState> {
fn get_under_upgrading(self: @ComponentState<TContractState>) -> Array<UnderUpgrading> {
let caller = get_caller_address();
fn get_under_upgrading(self: @ComponentState<TContractState>, player: ContractAddress) -> Array<UnderUpgrading> {
let current_block_number = get_block_number();
let mut index = self.max_construction_index.read();
let mut under_construction_count = self.under_construction_count.read();
Expand All @@ -53,7 +52,7 @@ mod city_hall_component {
break;
}
let under_construction: UnderUpgrading = self.Construction_Lists.read(index.into());
if under_construction.address == caller
if under_construction.address == player
&& under_construction.end_block_number > current_block_number {
constructions.append(under_construction);
under_construction_count -= 1;
Expand All @@ -63,8 +62,7 @@ mod city_hall_component {
constructions
}

fn get_complete_upgrading(self: @ComponentState<TContractState>) -> Array<UnderUpgrading> {
let caller = get_caller_address();
fn get_complete_upgrading(self: @ComponentState<TContractState>, player: ContractAddress) -> Array<UnderUpgrading> {
let current_block_number = get_block_number();
let mut index = self.max_construction_index.read();
let mut under_construction_count = self.under_construction_count.read();
Expand All @@ -77,7 +75,7 @@ mod city_hall_component {
break;
}
let under_construction: UnderUpgrading = self.Construction_Lists.read(index.into());
if under_construction.address == caller
if under_construction.address == player
&& under_construction.end_block_number <= current_block_number {
constructions.append(under_construction);
under_construction_count -= 1;
Expand Down
94 changes: 41 additions & 53 deletions src/components/outer_city.cairo
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,9 @@ use core::Serde;
#[starknet::interface]
trait OuterCityTrait<TState> {
fn get_minable_resource(
self: @TState
self: @TState, player: ContractAddress
) -> (Resource<Wood>, Resource<Brick>, Resource<Steel>, Resource<Food>);
fn get_last_mined_block(self: @TState) -> u64;
fn get_outer_city_building_level(self: @TState) -> Array<Level>;
fn get_last_mined_block(self: @TState, player: ContractAddress) -> u64;
}

#[derive(Model, Copy, Drop, Serde)]
Expand All @@ -24,7 +23,7 @@ struct OuterCity {

#[starknet::component]
mod outer_city_component {
use starknet::{get_caller_address};
use starknet::{get_caller_address, ContractAddress};
use core::starknet::info::get_block_number;
use dojo::world::{
IWorldProvider, IWorldProviderDispatcher, IWorldDispatcher, IWorldDispatcherTrait
Expand All @@ -49,53 +48,37 @@ mod outer_city_component {
TContractState, +HasComponent<TContractState>, +IWorldProvider<TContractState>
> of OuterCityTrait<ComponentState<TContractState>> {
fn get_minable_resource(
self: @ComponentState<TContractState>
self: @ComponentState<TContractState>, player: ContractAddress
) -> (Resource<Wood>, Resource<Brick>, Resource<Steel>, Resource<Food>) {
let outer_city = get!(self.get_contract().world(), get_caller_address(), (OuterCity));
let outer_city = get!(self.get_contract().world(), player, (OuterCity));
let current_block_number = get_block_number();
let wood: Resource<Wood> = self
.get_wood_building()
.get_wood_building(player)
.get_minable(outer_city.last_mined_block, current_block_number);
let brick: Resource<Brick> = self
.get_brick_building()
.get_brick_building(player)
.get_minable(outer_city.last_mined_block, current_block_number);
let steel: Resource<Steel> = self
.get_steel_building()
.get_steel_building(player)
.get_minable(outer_city.last_mined_block, current_block_number);
let food: Resource<Food> = self
.get_food_building()
.get_food_building(player)
.get_minable(outer_city.last_mined_block, current_block_number);
(wood, brick, steel, food)
}

fn get_last_mined_block(self: @ComponentState<TContractState>) -> u64 {
get!(self.get_contract().world(), get_caller_address(), (OuterCity)).last_mined_block
fn get_last_mined_block(self: @ComponentState<TContractState>, player: ContractAddress) -> u64 {
get!(self.get_contract().world(), player, (OuterCity)).last_mined_block
}

fn get_outer_city_building_level(self: @ComponentState<TContractState>) -> Array<Level> {
let mut res = array![];
let mut index = 0;
let end_index = 18;
loop {
if end_index == index {
break;
}
let building: CityBuilding = get!(
self.get_contract().world(), (get_caller_address(), index), (CityBuilding)
);
res.append(building.get_level());
index += 1;
};
res
}
}

#[generate_trait]
impl OuterCityInternalImpl<
TContractState, +HasComponent<TContractState>, +IWorldProvider<TContractState>
> of OuterCityInternalTrait<TContractState> {
fn get_build_with_index_range(
self: @ComponentState<TContractState>, start: u64, count: u64
self: @ComponentState<TContractState>, start: u64, count: u64, player: ContractAddress
) -> Array<CityBuilding> {
let mut res = array![];
let mut index = start;
Expand All @@ -104,61 +87,66 @@ mod outer_city_component {
if end_index == index {
break;
}
let building = get!(
self.get_contract().world(), (get_caller_address(), index), (CityBuilding)
);
let building = get!(self.get_contract().world(), (player, index), (CityBuilding));
res.append(building);
index += 1;
};
res
}

fn get_wood_building(self: @ComponentState<TContractState>) -> Array<CityBuilding> {
self.get_build_with_index_range(WOOD_BUILDING_START_INDEX, 4)
fn get_wood_building(
self: @ComponentState<TContractState>, player: ContractAddress
) -> Array<CityBuilding> {
self.get_build_with_index_range(WOOD_BUILDING_START_INDEX, 4, player)
}

fn get_steel_building(self: @ComponentState<TContractState>) -> Array<CityBuilding> {
self.get_build_with_index_range(STEEL_BUILDING_START_INDEX, 4)
fn get_steel_building(
self: @ComponentState<TContractState>, player: ContractAddress
) -> Array<CityBuilding> {
self.get_build_with_index_range(STEEL_BUILDING_START_INDEX, 4, player)
}

fn get_brick_building(self: @ComponentState<TContractState>) -> Array<CityBuilding> {
self.get_build_with_index_range(BRICK_BUILDING_START_INDEX, 4)
fn get_brick_building(
self: @ComponentState<TContractState>, player: ContractAddress
) -> Array<CityBuilding> {
self.get_build_with_index_range(BRICK_BUILDING_START_INDEX, 4, player)
}

fn get_food_building(self: @ComponentState<TContractState>) -> Array<CityBuilding> {
self.get_build_with_index_range(CEREAL_BUILDING_START_INDEX, 6)
fn get_food_building(
self: @ComponentState<TContractState>, player: ContractAddress
) -> Array<CityBuilding> {
self.get_build_with_index_range(CEREAL_BUILDING_START_INDEX, 6, player)
}

fn get_growth_rate(
self: @ComponentState<TContractState>
self: @ComponentState<TContractState>, player: ContractAddress,
) -> (GrowthRate<Wood>, GrowthRate<Brick>, GrowthRate<Steel>, GrowthRate<Food>) {
let outer_city = get!(self.get_contract().world(), get_caller_address(), (OuterCity));
let wood_growth_rate: GrowthRate<Wood> = self.get_wood_building().get_growth_rate();
let brick_growth_rate: GrowthRate<Brick> = self.get_brick_building().get_growth_rate();
let steel_growth_rate: GrowthRate<Steel> = self.get_steel_building().get_growth_rate();
let food_growth_rate: GrowthRate<Food> = self
.get_food_building()
.get_growth_rate();
let outer_city = get!(self.get_contract().world(), player, (OuterCity));
let wood_growth_rate: GrowthRate<Wood> = self.get_wood_building(player).get_growth_rate();
let brick_growth_rate: GrowthRate<Brick> = self.get_brick_building(player).get_growth_rate();
let steel_growth_rate: GrowthRate<Steel> = self.get_steel_building(player).get_growth_rate();
let food_growth_rate: GrowthRate<Food> = self.get_food_building(player).get_growth_rate();
(wood_growth_rate, brick_growth_rate, steel_growth_rate, food_growth_rate)
}

fn mine(
self: @ComponentState<TContractState>
) -> (Resource<Wood>, Resource<Brick>, Resource<Steel>, Resource<Food>) {
let world = self.get_contract().world();
let mut outer_city = get!(world, get_caller_address(), (OuterCity));
let caller = get_caller_address();
let mut outer_city = get!(world, caller, (OuterCity));
let current_block_number = get_block_number();
let wood = self
.get_wood_building()
.get_wood_building(caller)
.mine(outer_city.last_mined_block, current_block_number);
let brick = self
.get_brick_building()
.get_brick_building(caller)
.mine(outer_city.last_mined_block, current_block_number);
let steel = self
.get_steel_building()
.get_steel_building(caller)
.mine(outer_city.last_mined_block, current_block_number);
let food = self
.get_food_building()
.get_food_building(caller)
.mine(outer_city.last_mined_block, current_block_number);
outer_city.last_mined_block = current_block_number;
set!(world, (outer_city));
Expand Down
6 changes: 3 additions & 3 deletions src/components/warehouse.cairo
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ impl AdminWareHouseImpl of AdminWareHouseTrait{

#[starknet::component]
mod warehouse_component{
use starknet::{get_caller_address};
use starknet::{get_caller_address, ContractAddress};
use core::starknet::info::get_block_number;
use dojo::world::{
IWorldProvider, IWorldProviderDispatcher, IWorldDispatcher, IWorldDispatcherTrait
Expand Down Expand Up @@ -71,8 +71,8 @@ mod warehouse_component{
set!(world, (warehouse))
}

fn get_resource(self:@ComponentState<TContractState>) -> (Resource<Wood>, Resource<Brick>, Resource<Steel>){
let warehouse = get!(self.get_contract().world(), get_caller_address(), (Warehouse));
fn get_resource(self:@ComponentState<TContractState>, player: ContractAddress) -> (Resource<Wood>, Resource<Brick>, Resource<Steel>){
let warehouse = get!(self.get_contract().world(), player, (Warehouse));
warehouse.get_resource()
}
}
Expand Down
11 changes: 6 additions & 5 deletions src/interface.cairo
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ use kingdom_lord::models::resource::{ Brick, Wood, Steel,Food, Resource};
use kingdom_lord::models::growth::{GrowthRate};
use kingdom_lord::models::level::Level;
use kingdom_lord::components::city_hall::city_hall_component::{UnderUpgrading};
use starknet::ContractAddress;

#[derive(Debug, Serde, Drop, Copy, PartialEq)]
enum Error{
Expand All @@ -12,11 +13,11 @@ enum Error{
#[starknet::interface]
trait IKingdomLord<TState>{
fn spawn(ref self: TState);
fn get_resource(self: @TState) -> (Resource<Wood>, Resource<Brick>, Resource<Steel>, Resource<Food>);
fn get_growth_rate(self: @TState) -> (GrowthRate<Wood>, GrowthRate<Brick>, GrowthRate<Steel>, GrowthRate<Food>);
fn get_under_upgrading(self: @TState) -> Array<UnderUpgrading>;
fn get_complete_upgrading(self: @TState) -> Array<UnderUpgrading>;
fn get_buildings_levels(self: @TState) -> Array<Level>;
fn get_resource(self: @TState, player: ContractAddress) -> (Resource<Wood>, Resource<Brick>, Resource<Steel>, Resource<Food>);
fn get_growth_rate(self: @TState, player: ContractAddress) -> (GrowthRate<Wood>, GrowthRate<Brick>, GrowthRate<Steel>, GrowthRate<Food>);
fn get_under_upgrading(self: @TState, player: ContractAddress) -> Array<UnderUpgrading>;
fn get_complete_upgrading(self: @TState, player: ContractAddress) -> Array<UnderUpgrading>;
fn get_buildings_levels(self: @TState, player: ContractAddress) -> Array<Level>;
fn start_upgrade(ref self: TState, building_id: u64) -> Result<u64, Error>;
fn finish_upgrade(ref self: TState, upgrade_id: u64) -> Result<UnderUpgrading, Error>;
fn upgrade_requirement(self: @TState, building_id: u64) -> BuildingUpgradeResource;
Expand Down
Loading

0 comments on commit 5694c59

Please sign in to comment.