Empire technologies table

* Added table to store empire technologies. The table will store
technologies in all states.

* Note: this table is called "emp.technologies_v2" for now. It will need
to be renamed when the old tech system is gone.

* 030-data/110-empires.sql needs to be executed to create the new table
and a type it uses.
This commit is contained in:
Emmanuel BENOîT 2012-02-17 07:46:51 +01:00
parent 1ae9a15f6e
commit 3b2ec4bb64

View file

@ -67,6 +67,86 @@ ALTER TABLE emp.resources
FOREIGN KEY ( resource_name_id ) REFERENCES defs.resources;
/*
* States for empire technologies
* -------------------------------
*
* This enumerated type represents the 3 possible state for an empire
* technology: being researched, pending implementation, or implemented.
*/
DROP TYPE IF EXISTS emp.technology_state CASCADE;
CREATE TYPE emp.technology_state
AS ENUM(
/* Research in progress */
'RESEARCH' ,
/* Implementation pending */
'PENDING' ,
/* Implemented technology */
'KNOWN'
);
/*
* Empire technologies
* --------------------
*
* This table stores technologies that are being researched, need to be or
* have been implemented by an empire. Technologies that are being researched
* include additional information that represent the research progress and
* priority.
*
* FIXME: this table must be renamed to emp.technologies after the old
* research system has been removed
*/
CREATE TABLE emp.technologies_v2(
/* Identifier of the empire */
empire_id INT NOT NULL ,
/* Identifier of the technology */
technology_name_id INT NOT NULL ,
/* Current state of the technology */
emptech_state emp.technology_state NOT NULL
DEFAULT 'RESEARCH' ,
/* Accumulated research points, or NULL if research is over */
emptech_points DOUBLE PRECISION
DEFAULT 0.0 ,
/* Research priority, or NULL if research is over */
emptech_priority INT DEFAULT 2
CHECK( emptech_priority BETWEEN 0 AND 4 ) ,
/* Primary key is the empire / technology pair */
PRIMARY KEY( empire_id , technology_name_id ) ,
/* Make sure there are both research points and a priority during research
* and neither when the technology is pending implementation or
* implemented.
*/
CHECK( CASE emptech_state
WHEN 'RESEARCH' THEN
( emptech_points IS NOT NULL AND emptech_priority IS NOT NULL )
ELSE
( emptech_points IS NULL AND emptech_priority IS NULL )
END )
);
CREATE INDEX idx_emptech_technology
ON emp.technologies_v2 ( technology_name_id );
ALTER TABLE emp.technologies_v2
ADD CONSTRAINT fk_emptech_empire
FOREIGN KEY ( empire_id ) REFERENCES emp.empires ( name_id )
ON DELETE CASCADE ,
ADD CONSTRAINT fk_emptech_technology
FOREIGN KEY ( technology_name_id ) REFERENCES defs.technologies;
--
-- Empire technologies
--