Production adjustment fix
* The production adjustment function was completely off (and always has been). It has been fixed. * The problem with the adjustment function not being reported means that no-one ever encountered it. As a consequence, happiness strike threshold has been increased to 50% /!\ Full database reset required (or at least much easier than other options).
This commit is contained in:
parent
c94958a058
commit
afa1224391
4 changed files with 95 additions and 8 deletions
|
@ -94,7 +94,7 @@ public class ConstantsRegistrarBean
|
||||||
cDesc = "Empire size limit (relative to the ideal size) beyond which things get tough.";
|
cDesc = "Empire size limit (relative to the ideal size) beyond which things get tough.";
|
||||||
defs.add( new ConstantDefinition( hcNames[ 7 ] , cat , cDesc , 2.0 , 1.1 , true ) );
|
defs.add( new ConstantDefinition( hcNames[ 7 ] , cat , cDesc , 2.0 , 1.1 , true ) );
|
||||||
cDesc = "Happiness level below which strikes begin.";
|
cDesc = "Happiness level below which strikes begin.";
|
||||||
defs.add( new ConstantDefinition( hcNames[ 8 ] , cat , cDesc , 0.25 , 0.0 , 1.0 ) );
|
defs.add( new ConstantDefinition( hcNames[ 8 ] , cat , cDesc , 0.5 , 0.0 , 1.0 ) );
|
||||||
cDesc = "Happiness change at each update, relative to the size of the population.";
|
cDesc = "Happiness change at each update, relative to the size of the population.";
|
||||||
defs.add( new ConstantDefinition( hcNames[ 9 ] , cat , cDesc , 0.001 , 0.00001 , 0.99999 ) );
|
defs.add( new ConstantDefinition( hcNames[ 9 ] , cat , cDesc , 0.001 , 0.00001 , 0.99999 ) );
|
||||||
cDesc = "Maximal population units for which happiness will change.";
|
cDesc = "Maximal population units for which happiness will change.";
|
||||||
|
|
|
@ -301,21 +301,45 @@ $$ LANGUAGE plpgsql;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
--
|
/*
|
||||||
-- Production adjustment
|
* Production adjustment
|
||||||
--
|
* ----------------------
|
||||||
CREATE OR REPLACE FUNCTION verse.adjust_production( prod REAL , happiness REAL )
|
*
|
||||||
|
* Adjust productions depending on a planet's happiness ratio. When the
|
||||||
|
* happiness ratio is greater than the game.happiness.strike constant, the
|
||||||
|
* production is not affected. However, under that threshold, the production
|
||||||
|
* decreases proportionally, until it reaches 0.
|
||||||
|
*
|
||||||
|
* Parameters:
|
||||||
|
* _prod The production's valule
|
||||||
|
* _h_ratio The happiness ratio
|
||||||
|
*
|
||||||
|
* Returns:
|
||||||
|
* ? The adjusted production value
|
||||||
|
*/
|
||||||
|
DROP FUNCTION IF EXISTS verse.adjust_production( REAL , REAL ) CASCADE;
|
||||||
|
CREATE OR REPLACE FUNCTION verse.adjust_production( _prod REAL , _h_ratio REAL )
|
||||||
RETURNS REAL
|
RETURNS REAL
|
||||||
|
LANGUAGE SQL
|
||||||
STRICT IMMUTABLE
|
STRICT IMMUTABLE
|
||||||
SECURITY INVOKER
|
SECURITY INVOKER
|
||||||
AS $$
|
AS $adjust_production$
|
||||||
|
|
||||||
SELECT ( CASE
|
SELECT ( CASE
|
||||||
WHEN $2 < sys.get_constant( 'game.happiness.strike' ) THEN
|
WHEN $2 < sys.get_constant( 'game.happiness.strike' ) THEN
|
||||||
( $1 * ( 1 - ( $2 / sys.get_constant( 'game.happiness.strike' ) ) ) )::REAL
|
( $1 * $2 / sys.get_constant( 'game.happiness.strike' ) )::REAL
|
||||||
ELSE
|
ELSE
|
||||||
$1
|
$1
|
||||||
END );
|
END );
|
||||||
$$ LANGUAGE SQL;
|
|
||||||
|
$adjust_production$;
|
||||||
|
|
||||||
|
REVOKE EXECUTE
|
||||||
|
ON FUNCTION verse.adjust_production( REAL , REAL )
|
||||||
|
FROM PUBLIC;
|
||||||
|
GRANT EXECUTE
|
||||||
|
ON FUNCTION verse.adjust_production( REAL , REAL )
|
||||||
|
TO :dbuser;
|
||||||
|
|
||||||
|
|
||||||
--
|
--
|
||||||
|
|
|
@ -0,0 +1,51 @@
|
||||||
|
/*
|
||||||
|
* Test the verse.adjust_production() function
|
||||||
|
*/
|
||||||
|
BEGIN;
|
||||||
|
-- Create a table of input values
|
||||||
|
CREATE TABLE test_input(
|
||||||
|
prod REAL ,
|
||||||
|
happ REAL
|
||||||
|
);
|
||||||
|
|
||||||
|
-- Set the happiness strike level to 50%
|
||||||
|
SELECT sys.uoc_constant( 'game.happiness.strike' , '(test)' , 'Happiness' , 0.5 );
|
||||||
|
|
||||||
|
-- ***** TESTS BEGIN HERE *****
|
||||||
|
SELECT plan( 3 );
|
||||||
|
|
||||||
|
INSERT INTO test_input VALUES
|
||||||
|
( 10 , 1 ) , ( 100 , 1 ) ,
|
||||||
|
( 10 , 0.9 ) , ( 100 , 0.9 ) ,
|
||||||
|
( 10 , 0.8 ) , ( 100 , 0.8 ) ,
|
||||||
|
( 10 , 0.7 ) , ( 100 , 0.7 ) ,
|
||||||
|
( 10 , 0.6 ) , ( 100 , 0.6 ) ,
|
||||||
|
( 10 , 0.5 ) , ( 100 , 0.5 );
|
||||||
|
SELECT diag_test_name( 'verse.adjust_production() - Production is unaffected when happiness >= game.happiness.strike' );
|
||||||
|
SELECT is_empty(
|
||||||
|
$$ SELECT * FROM test_input WHERE prod <> verse.adjust_production( prod , happ ); $$
|
||||||
|
);
|
||||||
|
DELETE FROM test_input;
|
||||||
|
|
||||||
|
INSERT INTO test_input VALUES
|
||||||
|
( 10 , 0.5 ) , ( 10 , 0.4 ) ,
|
||||||
|
( 10 , 0.3 ) , ( 10 , 0.2 ) ,
|
||||||
|
( 10 , 0.1 ) , ( 10 , 0 );
|
||||||
|
SELECT diag_test_name( 'verse.adjust_production() - Production is unaffected when happiness >= game.happiness.strike' );
|
||||||
|
SELECT set_eq(
|
||||||
|
$$ SELECT rank( ) OVER( ORDER BY happ ) AS r1 ,
|
||||||
|
rank( ) OVER ( ORDER BY verse.adjust_production( prod , happ ) ) AS r2
|
||||||
|
FROM test_input; $$ ,
|
||||||
|
$$ VALUES ( 1 , 1 ) , ( 2 , 2 ) , ( 3 , 3 ) , ( 4 , 4 ) , ( 5 , 5 ) , ( 6 , 6 ) $$
|
||||||
|
);
|
||||||
|
DELETE FROM test_input;
|
||||||
|
|
||||||
|
SELECT diag_test_name( 'verse.adjust_production() - Happiness = 0 => production = 0' );
|
||||||
|
INSERT INTO test_input VALUES
|
||||||
|
( 1 , 0 ) , ( 10 , 0 ) , ( 100 , 0 ) , ( 1000 , 0 ) , ( 10000 , 0 );
|
||||||
|
SELECT is_empty(
|
||||||
|
$$ SELECT * FROM test_input WHERE verse.adjust_production( prod , happ ) <> 0; $$
|
||||||
|
);
|
||||||
|
|
||||||
|
SELECT * FROM finish( );
|
||||||
|
ROLLBACK;
|
|
@ -0,0 +1,12 @@
|
||||||
|
/*
|
||||||
|
* Test privileges on verse.adjust_production()
|
||||||
|
*/
|
||||||
|
BEGIN;
|
||||||
|
|
||||||
|
SELECT plan( 1 );
|
||||||
|
|
||||||
|
SELECT diag_test_name( 'verse.adjust_production( ) - EXECUTE privilege' );
|
||||||
|
SELECT lives_ok( $$ SELECT verse.adjust_production( 1 , 1 ) $$ );
|
||||||
|
|
||||||
|
SELECT * FROM finish( );
|
||||||
|
ROLLBACK;
|
Reference in a new issue