Empire resources update

* Added a new update that computes the amount of resources possessed and
owed by empires. At the moment this computation ignores fleets, as their
upkeep does not use the resource system.
This commit is contained in:
Emmanuel BENOîT 2012-01-10 13:29:56 +01:00
parent b49bc1a44f
commit 04e550709a
4 changed files with 186 additions and 2 deletions
legacyworlds-server-data/db-structure/parts

View file

@ -29,9 +29,18 @@ CREATE TYPE log_type
-- Update types
CREATE TYPE update_type AS ENUM (
/* Empires' money is being updated using the previous update's results */
/* Empires' money is being updated using the previous update's results
*
* FIXME: this update type should disappear, as everything it does will
* be replaced by the resources update.
*/
'EMPIRE_MONEY' ,
/* Empires' resources are being updated using the previous update's
* results.
*/
'EMPIRE_RESOURCES' ,
/* Empire research points are being attributed to technologies */
'EMPIRE_RESEARCH' ,

View file

@ -0,0 +1,63 @@
-- LegacyWorlds Beta 6
-- PostgreSQL database scripts
--
-- Game updates - empire resources
--
-- Copyright(C) 2004-2012, DeepClone Development
-- --------------------------------------------------------
/*
* Empire resources update
*
* For each empire in the update batch, compute the new amount of resources
* based on the upkeep and income from planets.
*
* FIXME: this should also include fleet upkeeps. This situation will be
* resolved once the system is modified to rely solely on resources.
*
* Parameters:
* _tick The identifier of the game update
*/
DROP FUNCTION IF EXISTS sys.process_empire_resources_updates( BIGINT );
CREATE FUNCTION sys.process_empire_resources_updates( _tick BIGINT )
RETURNS VOID
STRICT VOLATILE
SECURITY INVOKER
AS $process_empire_resources_updates$
UPDATE emp.resources _emp_resources
SET empres_possessed = CASE
WHEN _emp_resources.empres_possessed + _pl_resources.pres_income - _pl_resources.pres_upkeep > 0 THEN
_emp_resources.empres_possessed + _pl_resources.pres_income - _pl_resources.pres_upkeep
ELSE
0
END ,
empres_owed = CASE
WHEN _emp_resources.empres_possessed + _pl_resources.pres_income - _pl_resources.pres_upkeep < 0 THEN
_pl_resources.pres_upkeep - _emp_resources.empres_possessed - _pl_resources.pres_income
ELSE
0
END
FROM sys.updates _upd_sys
INNER JOIN emp.updates _upd_emp
ON _upd_emp.update_id = _upd_sys.id
INNER JOIN emp.planets _emp_planets
USING ( empire_id )
INNER JOIN verse.planet_resources _pl_resources
USING ( planet_id )
WHERE _upd_sys.last_tick = $1
AND _upd_sys.status = 'PROCESSING'
AND _upd_sys.gu_type = 'EMPIRE_RESOURCES'
AND _emp_resources.empire_id = _upd_emp.empire_id
AND _emp_resources.resource_name_id = _pl_resources.resource_name_id;
$process_empire_resources_updates$ LANGUAGE SQL;
REVOKE EXECUTE
ON FUNCTION sys.process_empire_resources_updates( BIGINT )
FROM PUBLIC;