Research update
* Implemented new research update. Old research system no longer updates. * Fixed a major bug in the constants registrar * Added game.research.vacation constant (determines the rate of research when players are in vacation mode)
This commit is contained in:
parent
a14601df37
commit
c7949e41cc
11 changed files with 414 additions and 85 deletions
legacyworlds-server-data/db-structure/tests
admin
040-functions/043-computation
050-updates/020-empire-research
user
040-functions/043-computation
050-updates/020-empire-research
utils/common-setup
|
@ -0,0 +1,24 @@
|
|||
/*
|
||||
* Test the sys.gu_research_get_empires() function
|
||||
*/
|
||||
BEGIN;
|
||||
\i utils/common-setup/setup-gu-research-get-empires-test.sql
|
||||
|
||||
SELECT plan( 2 );
|
||||
|
||||
SELECT diag_test_name( 'gu_research_get_empires() - Selected empires and vacation state' );
|
||||
SELECT set_eq( $$
|
||||
SELECT * FROM sys.gu_research_get_empires( 0::BIGINT );
|
||||
$$ , $$ VALUES (
|
||||
_get_emp_name( 'emp4') , FALSE
|
||||
) , (
|
||||
_get_emp_name( 'emp5') , TRUE
|
||||
) $$ );
|
||||
|
||||
SELECT diag_test_name( 'gu_research_get_empires() - No results with "bad" update identifier' );
|
||||
SELECT is_empty( $$
|
||||
SELECT * FROM sys.gu_research_get_empires( 12::BIGINT );
|
||||
$$ );
|
||||
|
||||
SELECT * FROM finish( );
|
||||
ROLLBACK;
|
|
@ -0,0 +1,11 @@
|
|||
/*
|
||||
* Test privileges on sys.gu_research_get_empires()
|
||||
*/
|
||||
BEGIN;
|
||||
SELECT plan( 1 );
|
||||
|
||||
SELECT diag_test_name( 'sys.gu_research_get_empires() - Privileges' );
|
||||
SELECT throws_ok( 'SELECT sys.gu_research_get_empires( 0::BIGINT )' , 42501 );
|
||||
|
||||
SELECT * FROM finish( );
|
||||
ROLLBACK;
|
|
@ -0,0 +1,137 @@
|
|||
/*
|
||||
* Common setup for research update locking and empire selection
|
||||
* --------------------------------------------------------------
|
||||
*
|
||||
* Empires are selected when:
|
||||
* - they are part of the current update batch,
|
||||
* - they possess planets,
|
||||
* - they have in-progress research entries.
|
||||
* All related data is locked: the update entries, empire, empire technology
|
||||
* records, technology definitions, planets (including ownership records and
|
||||
* happiness records), as well as the empire's name and associated account.
|
||||
*/
|
||||
|
||||
-- Make sure the only update type left is EmpireResearch
|
||||
DELETE FROM sys.update_types
|
||||
WHERE updtype_name <> 'EmpireResearch';
|
||||
|
||||
\i utils/strings.sql
|
||||
\i utils/resources.sql
|
||||
\i utils/accounts.sql
|
||||
\i utils/naming.sql
|
||||
\i utils/universe.sql
|
||||
|
||||
-- Create some technology definitions, dropping constraints on unused columns
|
||||
ALTER TABLE defs.technologies
|
||||
ALTER technology_description_id DROP NOT NULL ,
|
||||
ALTER technology_discovery_id DROP NOT NULL ,
|
||||
ALTER technology_category_id DROP NOT NULL ,
|
||||
ALTER technology_price DROP NOT NULL;
|
||||
SELECT _create_test_strings( 3 , 'tech' );
|
||||
INSERT INTO defs.technologies ( technology_name_id , technology_points )
|
||||
SELECT id , 100.0 FROM defs.strings
|
||||
WHERE name LIKE 'tech%';
|
||||
|
||||
-- Create the empire names and planets
|
||||
SELECT _create_emp_names( 6 , 'emp' );
|
||||
SELECT _create_raw_planets( 4 , 'planet' );
|
||||
INSERT INTO verse.planet_happiness( planet_id , target , current )
|
||||
SELECT id , 0.75 , 1500
|
||||
FROM naming.map_names
|
||||
WHERE name LIKE 'planet%';
|
||||
|
||||
|
||||
/*
|
||||
* Empire 1 has no planets and no in-progress research. It will not be
|
||||
* selected or locked.
|
||||
*/
|
||||
INSERT INTO emp.empires( name_id , cash )
|
||||
VALUES( _get_emp_name( 'emp1' ) , 100.0 );
|
||||
INSERT INTO emp.technologies_v2 (
|
||||
empire_id , technology_name_id ,
|
||||
emptech_state , emptech_points , emptech_priority )
|
||||
SELECT _get_emp_name( 'emp1' ) , technology_name_id , 'KNOWN' , NULL , NULL
|
||||
FROM defs.technologies;
|
||||
|
||||
/*
|
||||
* Empire 2 has planets, but no in-progress research. It will not be
|
||||
* selected.
|
||||
*/
|
||||
INSERT INTO emp.empires( name_id , cash )
|
||||
VALUES( _get_emp_name( 'emp2' ) , 100.0 );
|
||||
INSERT INTO emp.technologies_v2 (
|
||||
empire_id , technology_name_id ,
|
||||
emptech_state , emptech_points , emptech_priority )
|
||||
SELECT _get_emp_name( 'emp2' ) , technology_name_id , 'KNOWN' , NULL , NULL
|
||||
FROM defs.technologies;
|
||||
INSERT INTO emp.planets( empire_id , planet_id )
|
||||
VALUES( _get_emp_name( 'emp2' ) , _get_map_name( 'planet1' ) );
|
||||
|
||||
/*
|
||||
* Empire 3 has in-progress research, but no planets. It will not be selected.
|
||||
*/
|
||||
INSERT INTO emp.empires( name_id , cash )
|
||||
VALUES( _get_emp_name( 'emp3' ) , 100.0 );
|
||||
INSERT INTO emp.technologies_v2 ( empire_id , technology_name_id )
|
||||
SELECT _get_emp_name( 'emp3' ) , technology_name_id
|
||||
FROM defs.technologies;
|
||||
|
||||
/*
|
||||
* Empire 4 has in-progress research and planets. It has no vacation mode
|
||||
* record. It will be selected.
|
||||
*/
|
||||
INSERT INTO emp.empires( name_id , cash )
|
||||
VALUES( _get_emp_name( 'emp4' ) , 100.0 );
|
||||
INSERT INTO emp.technologies_v2 ( empire_id , technology_name_id )
|
||||
SELECT _get_emp_name( 'emp4' ) , technology_name_id
|
||||
FROM defs.technologies;
|
||||
INSERT INTO emp.planets( empire_id , planet_id )
|
||||
VALUES( _get_emp_name( 'emp4' ) , _get_map_name( 'planet2' ) );
|
||||
|
||||
/*
|
||||
* Empire 5 has in-progress research, planets and a vacation mode record.
|
||||
* It will be selected.
|
||||
*
|
||||
* Note: we need to add an entry to users.active_accounts for vacation mode
|
||||
* records to work.
|
||||
*/
|
||||
INSERT INTO emp.empires( name_id , cash )
|
||||
VALUES( _get_emp_name( 'emp5' ) , 100.0 );
|
||||
INSERT INTO emp.technologies_v2 ( empire_id , technology_name_id )
|
||||
SELECT _get_emp_name( 'emp5' ) , technology_name_id
|
||||
FROM defs.technologies;
|
||||
INSERT INTO emp.planets( empire_id , planet_id )
|
||||
VALUES( _get_emp_name( 'emp5' ) , _get_map_name( 'planet3' ) );
|
||||
INSERT INTO users.active_accounts( credentials_id ,vacation_credits )
|
||||
SELECT id , 12
|
||||
FROM users.addresses
|
||||
WHERE address = 'emp5@example.org';
|
||||
INSERT INTO users.vacations ( account_id , since , status )
|
||||
SELECT id , NOW() , 'PROCESSED'
|
||||
FROM users.addresses
|
||||
WHERE address = 'emp5@example.org';
|
||||
|
||||
/*
|
||||
* Empire 6 is similar to empire 4, but will not be marked for update in the
|
||||
* current batch.
|
||||
*/
|
||||
INSERT INTO emp.empires( name_id , cash )
|
||||
VALUES( _get_emp_name( 'emp6' ) , 100.0 );
|
||||
INSERT INTO emp.technologies_v2 ( empire_id , technology_name_id )
|
||||
SELECT _get_emp_name( 'emp6' ) , technology_name_id
|
||||
FROM defs.technologies;
|
||||
INSERT INTO emp.planets( empire_id , planet_id )
|
||||
VALUES( _get_emp_name( 'emp6' ) , _get_map_name( 'planet4' ) );
|
||||
|
||||
|
||||
/* Speaking of current batch - set it up */
|
||||
UPDATE sys.updates su
|
||||
SET update_state = 'PROCESSING' , update_last = 0
|
||||
FROM emp.empires_updates eu
|
||||
WHERE eu.update_id = su.update_id
|
||||
AND eu.name_id <> _get_emp_name( 'emp6' );
|
||||
UPDATE sys.updates su
|
||||
SET update_state = 'PROCESSED' , update_last = 0
|
||||
FROM emp.empires_updates eu
|
||||
WHERE eu.update_id = su.update_id
|
||||
AND eu.name_id = _get_emp_name( 'emp6' );
|
Reference in a new issue