diff --git a/lib/Lacuna/AI.pm b/lib/Lacuna/AI.pm index 614cf285..c6b67fbd 100644 --- a/lib/Lacuna/AI.pm +++ b/lib/Lacuna/AI.pm @@ -348,7 +348,7 @@ sub train_spies { my $room_for = $max_spies - $spies; my $train_count = 0; if ($subsidise) { - my $deception = $colony->empire->deception_affinity * 50; + my $deception = $colony->empire->effective_deception_affinity * 50; while ($train_count < $room_for) { $train_count++; next if (rand(100) < $chance); diff --git a/lib/Lacuna/DB/Result/Building.pm b/lib/Lacuna/DB/Result/Building.pm index 566859d3..2227e0b9 100755 --- a/lib/Lacuna/DB/Result/Building.pm +++ b/lib/Lacuna/DB/Result/Building.pm @@ -194,14 +194,14 @@ sub farming_production_bonus { my $empire = $self->body->empire; return 1 unless defined $empire; my $boost = (time < $empire->food_boost->epoch) ? 25 : 0; - return (100 + $boost + $empire->farming_affinity * 4) / 100; + return (100 + $boost + $empire->effective_farming_affinity * 4) / 100; } sub manufacturing_production_bonus { my ($self) = @_; my $empire = $self->body->empire; return 1 unless defined $empire; - return (100 + $empire->manufacturing_affinity * 4) / 100; + return (100 + $empire->effective_manufacturing_affinity * 4) / 100; } sub lapis_production_hour { @@ -391,7 +391,7 @@ sub energy_production_bonus { return 1 unless defined $empire; my $boost = (time < $empire->energy_boost->epoch) ? 25 : 0; my $gg_bonus = ($self->body->get_type eq 'gas giant') ? 50 : 0; - return (100 + $boost + $gg_bonus + $empire->science_affinity * 4) / 100; + return (100 + $boost + $gg_bonus + $empire->effective_science_affinity * 4) / 100; } sub energy_production_hour { @@ -420,7 +420,7 @@ sub mining_production_bonus { my $refinery = $self->body->refinery; my $refinery_bonus = (defined $refinery) ? $refinery->effective_level * 5 : 0; my $boost = (time < $empire->ore_boost->epoch) ? 25 : 0; - return (100 + $boost + $refinery_bonus + $empire->mining_affinity * 4) / 100; + return (100 + $boost + $refinery_bonus + $empire->effective_mining_affinity * 4) / 100; } sub ore_production_hour { @@ -446,7 +446,7 @@ sub water_production_bonus { return 1 unless defined $empire; my $boost = (time < $empire->water_boost->epoch) ? 25 : 0; my $gg_bonus = ($self->body->get_type eq 'gas giant') ? -25 : 0; - return (100 + $boost + $gg_bonus + $empire->environmental_affinity * 4) / 100; + return (100 + $boost + $gg_bonus + $empire->effective_environmental_affinity * 4) / 100; } sub water_production_hour { @@ -471,7 +471,7 @@ sub waste_consumption_bonus { my $empire = $self->body->empire; return 1 unless defined $empire; my $gg_bonus = ($self->body->get_type eq 'gas giant') ? 25 : 0; - return (100 + $gg_bonus + $empire->environmental_affinity * 4) / 100; + return (100 + $gg_bonus + $empire->effective_environmental_affinity * 4) / 100; } sub waste_production_hour { @@ -501,8 +501,8 @@ sub happiness_production_bonus { $sboost = 50; } $boost += $sboost; - return (100 + $boost) * (100 + $empire->political_affinity * 10)/10000; -# return (100 + $boost + ($empire->political_affinity * 10)) / 100; #Old Way + return (100 + $boost) * (100 + $empire->effective_political_affinity * 10)/10000; +# return (100 + $boost + ($empire->effective_political_affinity * 10)) / 100; #Old Way } sub happiness_production_hour { @@ -542,7 +542,7 @@ sub food_capacity { return 0 if $base == 0; my $empire = $self->body->empire; return 1 unless defined $empire; - return sprintf('%.0f', $base * ($self->storage_bonus + ($empire->farming_affinity * 4 / 100) )); + return sprintf('%.0f', $base * ($self->storage_bonus + ($empire->effective_farming_affinity * 4 / 100) )); } sub energy_capacity { @@ -551,7 +551,7 @@ sub energy_capacity { return 0 if $base == 0; my $empire = $self->body->empire; return 1 unless defined $empire; - return sprintf('%.0f', $base * ($self->storage_bonus + ($empire->science_affinity * 4 / 100) )); + return sprintf('%.0f', $base * ($self->storage_bonus + ($empire->effective_science_affinity * 4 / 100) )); } sub ore_capacity { @@ -560,7 +560,7 @@ sub ore_capacity { return 0 if $base == 0; my $empire = $self->body->empire; return 1 unless defined $empire; - return sprintf('%.0f', $base * ($self->storage_bonus + ($empire->mining_affinity * 4 / 100) )); + return sprintf('%.0f', $base * ($self->storage_bonus + ($empire->effective_mining_affinity * 4 / 100) )); } sub water_capacity { @@ -569,7 +569,7 @@ sub water_capacity { return 0 if $base == 0; my $empire = $self->body->empire; return 1 unless defined $empire; - return sprintf('%.0f', $base * ($self->storage_bonus + ($empire->environmental_affinity * 4 / 100) )); + return sprintf('%.0f', $base * ($self->storage_bonus + ($empire->effective_environmental_affinity * 4 / 100) )); } sub waste_capacity { @@ -579,7 +579,7 @@ sub waste_capacity { my $empire = $self->body->empire; return 1 unless defined $empire; my $gg_bonus = ($self->body->get_type eq 'gas giant') ? 25 : 0; - return sprintf('%.0f', $base * ($self->storage_bonus + ($gg_bonus + $empire->environmental_affinity * 4) / 100) ); + return sprintf('%.0f', $base * ($self->storage_bonus + ($gg_bonus + $empire->effective_environmental_affinity * 4) / 100) ); } # BUILD @@ -783,14 +783,14 @@ sub construction_cost_reduction_bonus { my $self = shift; my $empire = $self->body->empire; return 1 unless defined $empire; - return (100 - $empire->research_affinity * 5) / 100; + return (100 - $empire->effective_research_affinity * 5) / 100; } sub manufacturing_cost_reduction_bonus { my $self = shift; my $empire = $self->body->empire; return 1 unless defined $empire; - return (100 - $empire->manufacturing_affinity * 5) / 100; + return (100 - $empire->effective_manufacturing_affinity * 5) / 100; } sub time_cost_reduction_bonus { @@ -803,7 +803,7 @@ sub time_cost_reduction_bonus { if ($body->happiness < 0 ) { $unhappy_workers = abs($body->happiness) / 1000; } - my $base_cost_reduction = 100 - $extra - ($body->empire->management_affinity * 5); + my $base_cost_reduction = 100 - $extra - ($body->empire->effective_management_affinity * 5); if ( $base_cost_reduction < 1 ) { my $new_factor = (1 - $base_cost_reduction) / 30; $base_cost_reduction = 1 - $new_factor; diff --git a/lib/Lacuna/DB/Result/Building/Espionage.pm b/lib/Lacuna/DB/Result/Building/Espionage.pm index a1618506..de276164 100644 --- a/lib/Lacuna/DB/Result/Building/Espionage.pm +++ b/lib/Lacuna/DB/Result/Building/Espionage.pm @@ -50,7 +50,7 @@ after finish_upgrade => sub { $empire->is_isolationist(0); $empire->update; } - my $offense = ($empire->deception_affinity * 50) + ($self->effective_level * 75); + my $offense = ($empire->effective_deception_affinity * 50) + ($self->effective_level * 75); my $spies = Lacuna->db->resultset('Lacuna::DB::Result::Spies')->search({ on_body_id => $self->body_id, from_body_id => $self->body_id, diff --git a/lib/Lacuna/DB/Result/Building/GeneticsLab.pm b/lib/Lacuna/DB/Result/Building/GeneticsLab.pm index 0acf70bf..1bc9e439 100644 --- a/lib/Lacuna/DB/Result/Building/GeneticsLab.pm +++ b/lib/Lacuna/DB/Result/Building/GeneticsLab.pm @@ -82,7 +82,7 @@ sub get_possible_grafts { sub graft_odds { my $self = shift; - return $self->effective_level + $self->body->empire->science_affinity; + return $self->effective_level + $self->body->empire->effective_science_affinity; } sub is_graft_success { @@ -92,7 +92,7 @@ sub is_graft_success { sub survival_odds { my $self = shift; - return ($self->effective_level * 3) + $self->body->empire->science_affinity; + return ($self->effective_level * 3) + $self->body->empire->effective_science_affinity; } sub is_survival_success { diff --git a/lib/Lacuna/DB/Result/Building/Intelligence.pm b/lib/Lacuna/DB/Result/Building/Intelligence.pm index 309aae65..a91dd45c 100644 --- a/lib/Lacuna/DB/Result/Building/Intelligence.pm +++ b/lib/Lacuna/DB/Result/Building/Intelligence.pm @@ -131,7 +131,7 @@ has training_multiplier => ( my $self = shift; # my $multiplier = $self->effective_level my $multiplier = 1 - - $self->body->empire->deception_affinity + - $self->body->empire->effective_deception_affinity + $self->espionage_level + $self->security_level; $multiplier = 1 if $multiplier < 1; @@ -142,7 +142,7 @@ has training_multiplier => ( sub training_costs { my $self = shift; my $multiplier = $self->training_multiplier; - my $time_to_train = sprintf('%.0f', 2060 * $multiplier / $self->body->empire->management_affinity); + my $time_to_train = sprintf('%.0f', 2060 * $multiplier / $self->body->empire->effective_management_affinity); if ($self->body->happiness < 0) { my $unhappy_workers = abs($self->body->happiness)/100_000; $time_to_train = int($time_to_train * $unhappy_workers); @@ -193,7 +193,7 @@ sub train_spy { my $latest = $self->latest_spy; my $available_on = (defined $latest) ? $latest->available_on->clone : DateTime->now; $available_on->add(seconds => $time_to_train ); - my $deception = $empire->deception_affinity * 50; + my $deception = $empire->effective_deception_affinity * 50; my $spy = Lacuna->db->resultset('Spies')->new({ from_body_id => $self->body_id, on_body_id => $self->body_id, diff --git a/lib/Lacuna/DB/Result/Building/SSLa.pm b/lib/Lacuna/DB/Result/Building/SSLa.pm index 76866f72..d3bc4de4 100644 --- a/lib/Lacuna/DB/Result/Building/SSLa.pm +++ b/lib/Lacuna/DB/Result/Building/SSLa.pm @@ -113,7 +113,7 @@ has plan_resource_cost => ( lazy => 1, default => sub { my $self = shift; - return 40000 * ((100 - (5 * $self->body->empire->research_affinity)) / 100); + return 40000 * ((100 - (5 * $self->body->empire->effective_research_affinity)) / 100); } ); @@ -122,7 +122,7 @@ has plan_time_cost => ( lazy => 1, default => sub { my $self = shift; - return 1200 * ((100 - (5 * $self->body->empire->management_affinity)) / 100); + return 1200 * ((100 - (5 * $self->body->empire->effective_management_affinity)) / 100); } ); diff --git a/lib/Lacuna/DB/Result/Building/Security.pm b/lib/Lacuna/DB/Result/Building/Security.pm index 920bbef0..cd9a8e41 100644 --- a/lib/Lacuna/DB/Result/Building/Security.pm +++ b/lib/Lacuna/DB/Result/Building/Security.pm @@ -75,7 +75,7 @@ sub prisoners { after finish_upgrade => sub { my $self = shift; - my $defense = ($self->body->empire->deception_affinity * 50) + ($self->effective_level * 75); + my $defense = ($self->body->empire->effective_deception_affinity * 50) + ($self->effective_level * 75); my $spies = Lacuna->db->resultset('Lacuna::DB::Result::Spies')->search({ on_body_id => $self->body_id, from_body_id => $self->body_id, diff --git a/lib/Lacuna/DB/Result/Building/Shipyard.pm b/lib/Lacuna/DB/Result/Building/Shipyard.pm index acd28b96..91ec0636 100644 --- a/lib/Lacuna/DB/Result/Building/Shipyard.pm +++ b/lib/Lacuna/DB/Result/Building/Shipyard.pm @@ -277,7 +277,7 @@ sub set_ship_speed { my $propulsion_level = (defined $self->propulsion_factory) ? $self->propulsion_factory->effective_level : 0; my $css_level = (defined $self->crashed_ship_site) ? $self->crashed_ship_site->effective_level : 0; my $ptf = ($ship->pilotable && defined $self->pilot_training_facility) ? $self->pilot_training_facility->effective_level : 0; - my $improvement = 1 + ($self->effective_level * 0.01) + ($ptf * 0.03) + ($propulsion_level * 0.05) + ($css_level * 0.05) + ($self->body->empire->science_affinity * 0.03); + my $improvement = 1 + ($self->effective_level * 0.01) + ($ptf * 0.03) + ($propulsion_level * 0.05) + ($css_level * 0.05) + ($self->body->empire->effective_science_affinity * 0.03); $ship->speed(sprintf('%.0f', $ship->base_speed * $improvement)); return $ship->speed; } @@ -287,7 +287,7 @@ sub set_ship_combat { my $css_level = (defined $self->crashed_ship_site) ? $self->crashed_ship_site->effective_level : 0; my $munitions = (defined $self->munitions_lab) ? $self->munitions_lab->effective_level : 0; my $ptf = ($ship->pilotable && defined $self->pilot_training_facility) ? $self->pilot_training_facility->effective_level : 0; - my $improvement = 1 + ($self->effective_level * 0.01) + ($ptf * 0.03) + ($munitions * 0.05) + ($css_level * 0.05) + ($self->body->empire->deception_affinity * 0.03) + ($self->body->empire->science_affinity * 0.03); + my $improvement = 1 + ($self->effective_level * 0.01) + ($ptf * 0.03) + ($munitions * 0.05) + ($css_level * 0.05) + ($self->body->empire->effective_deception_affinity * 0.03) + ($self->body->empire->effective_science_affinity * 0.03); $ship->combat(sprintf('%.0f', $ship->base_combat * $improvement)); return $ship->combat; } @@ -297,7 +297,7 @@ sub set_ship_hold_size { my $trade_ministry_level = (defined $self->trade_ministry) ? $self->trade_ministry->effective_level : 0; my $css_level = (defined $self->crashed_ship_site) ? $self->crashed_ship_site->effective_level : 0; my $improvement = 1 + ($self->effective_level * 0.01) + ($css_level * 0.05); - my $trade_bonus = $self->body->empire->trade_affinity * ( $trade_ministry_level || 0.1 ); + my $trade_bonus = $self->body->empire->effective_trade_affinity * ( $trade_ministry_level || 0.1 ); $ship->hold_size(sprintf('%.0f', $ship->base_hold_size * $trade_bonus * $improvement)); return $ship->hold_size; } @@ -307,7 +307,7 @@ sub set_ship_stealth { my $cloaking_level = (defined $self->cloaking_lab) ? $self->cloaking_lab->effective_level : 0; my $ptf = ($ship->pilotable && defined $self->pilot_training_facility) ? $self->pilot_training_facility->effective_level : 0; my $css_level = (defined $self->crashed_ship_site) ? $self->crashed_ship_site->effective_level : 0; - my $improvement = 1 + ($self->effective_level * 0.01) + ($ptf * 0.03) + ($cloaking_level * 0.05) + ($css_level * 0.05) + ($self->body->empire->deception_affinity * 0.03); + my $improvement = 1 + ($self->effective_level * 0.01) + ($ptf * 0.03) + ($cloaking_level * 0.05) + ($css_level * 0.05) + ($self->body->empire->effective_deception_affinity * 0.03); $ship->stealth(sprintf('%.0f', $ship->base_stealth * $improvement )); return $ship->stealth; } diff --git a/lib/Lacuna/DB/Result/Building/Transporter.pm b/lib/Lacuna/DB/Result/Building/Transporter.pm index f3d01aa2..078d372e 100644 --- a/lib/Lacuna/DB/Result/Building/Transporter.pm +++ b/lib/Lacuna/DB/Result/Building/Transporter.pm @@ -85,7 +85,7 @@ sub available_market { sub determine_available_cargo_space { my ($self) = @_; - return 12500 * $self->effective_level * $self->body->empire->trade_affinity; + return 12500 * $self->effective_level * $self->body->empire->effective_trade_affinity; } sub trade_one_for_one { diff --git a/lib/Lacuna/DB/Result/Building/Waste/Exchanger.pm b/lib/Lacuna/DB/Result/Building/Waste/Exchanger.pm index 263b3b8b..2906b2b7 100644 --- a/lib/Lacuna/DB/Result/Building/Waste/Exchanger.pm +++ b/lib/Lacuna/DB/Result/Building/Waste/Exchanger.pm @@ -39,7 +39,7 @@ has max_recycle => ( lazy => 1, default => sub { my $self = shift; - return $self->effective_level * 17_500 * $self->body->empire->environmental_affinity; + return $self->effective_level * 17_500 * $self->body->empire->effective_environmental_affinity; }, ); diff --git a/lib/Lacuna/DB/Result/Building/Waste/Recycling.pm b/lib/Lacuna/DB/Result/Building/Waste/Recycling.pm index 73e6e269..25af26cd 100644 --- a/lib/Lacuna/DB/Result/Building/Waste/Recycling.pm +++ b/lib/Lacuna/DB/Result/Building/Waste/Recycling.pm @@ -10,7 +10,7 @@ has max_recycle => ( lazy => 1, default => sub { my $self = shift; - return $self->effective_level * 3_500 * $self->body->empire->environmental_affinity; + return $self->effective_level * 3_500 * $self->body->empire->effective_environmental_affinity; }, ); diff --git a/lib/Lacuna/DB/Result/Empire.pm b/lib/Lacuna/DB/Result/Empire.pm index 077652ce..62f99910 100644 --- a/lib/Lacuna/DB/Result/Empire.pm +++ b/lib/Lacuna/DB/Result/Empire.pm @@ -115,6 +115,37 @@ __PACKAGE__->has_many('received_messages', 'Lacuna::DB::Result::Message', __PACKAGE__->has_many('medals', 'Lacuna::DB::Result::Medals', 'empire_id'); __PACKAGE__->has_many('all_probes', 'Lacuna::DB::Result::Probes', 'empire_id'); +for my $affin (qw( + manufacturing_affinity + deception_affinity + research_affinity + management_affinity + farming_affinity + mining_affinity + science_affinity + environmental_affinity + political_affinity + trade_affinity + growth_affinity + )) +{ + my $builder = "_build_effective_$affin"; + has "effective_$affin" => + is => 'rw', + isa => 'Int', + lazy => 1, + builder => $builder, + clearer => "clear_effective_$affin"; + + __PACKAGE__->meta->add_method($builder => sub { + my $self = shift; + + # for future work, we may allow temporary affinity boosts/penalties. + return $self->$affin; + }); +} + + sub observatory_probes { my ($self,$args) = @_; @@ -920,8 +951,8 @@ sub next_colony_cost { { type=> { in => [qw(colony_ship short_range_colony_ship space_station)]}, task=>'travelling', direction=>'out', 'body.empire_id' => $self->id}, { join => 'body' } )->count; - my $inflation = 1 + INFLATION - ($self->growth_affinity * 5 / 100); -# my $inflation = 1 + INFLATION - ($self->growth_affinity / 100); + my $inflation = 1 + INFLATION - ($self->effective_growth_affinity * 5 / 100); +# my $inflation = 1 + INFLATION - ($self->effective_growth_affinity / 100); my $tally = 100_000 * ($inflation**($count-1)); return sprintf('%.0f', $tally); } diff --git a/lib/Lacuna/DB/Result/Map/Body/Planet.pm b/lib/Lacuna/DB/Result/Map/Body/Planet.pm index bdab467b..6176c543 100644 --- a/lib/Lacuna/DB/Result/Map/Body/Planet.pm +++ b/lib/Lacuna/DB/Result/Map/Body/Planet.pm @@ -1004,7 +1004,7 @@ sub found_colony { x => 0, y => 0, class => 'Lacuna::DB::Result::Building::PlanetaryCommand', - level => $empire->growth_affinity - 1, + level => $empire->effective_growth_affinity - 1, }); $self->build_building($command); $command->finish_upgrade; diff --git a/t/330_JunkBuildings.t b/t/330_JunkBuildings.t index 236fc356..5e15fc62 100644 --- a/t/330_JunkBuildings.t +++ b/t/330_JunkBuildings.t @@ -24,7 +24,7 @@ my $home = $empire->home_planet; #$db->resultset('Lacuna::DB::Result::Building')->search({class=>'Lacuna::DB::Result::Building::Permanent::SpaceJunkPark'})->delete; #$db->resultset('Lacuna::DB::Result::Building')->search({class=>'Lacuna::DB::Result::Building::Permanent::PyramidJunkSculpture'})->delete; -my $construction_cost_reduction_bonus = (100 - $empire->research_affinity * 5) / 100; +my $construction_cost_reduction_bonus = (100 - $empire->effective_research_affinity * 5) / 100; diag("construction_cost_reduction_bonus is ", $construction_cost_reduction_bonus); my @builds = (