You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
60 lines
4.0 KiB
60 lines
4.0 KiB
3 years ago
|
--! Previous: sha1:8102b0362d2ae5b73ed1d56214f7fffa445c469e
|
||
|
--! Hash: sha1:8a890a4c8807eb5a7aae90456ba1e7712cda502b
|
||
|
--! Message: SummonedUnit table
|
||
|
|
||
|
--- Connection between Players and Units, indicating how and when players have summoned this unit.
|
||
|
CREATE TABLE IF NOT EXISTS SummonedUnit
|
||
|
(
|
||
|
--- The ID of this summoning instance.
|
||
|
instanceId SERIAL PRIMARY KEY NOT NULL,
|
||
|
--- The Player that summoned this unit at some point.
|
||
|
playerId INT NOT NULL REFERENCES Player (id) ON DELETE CASCADE ON UPDATE CASCADE,
|
||
|
--- The Unit that was summoned by this Player at some point.
|
||
|
unitId INT NOT NULL REFERENCES Unit (id) ON DELETE CASCADE ON UPDATE CASCADE,
|
||
|
--- The time and date this instance was summoned by pulling or recalling.
|
||
|
summonedAt TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW(),
|
||
|
--- True if this instance was summoned by /pull (as opposed to /recall).
|
||
|
wasPulled BOOLEAN NOT NULL DEFAULT FALSE,
|
||
|
--- True if this instance was summoned by /recall (as opposed to /pull).
|
||
|
wasRecalled BOOLEAN NOT NULL DEFAULT FALSE,
|
||
|
--- The timestamps when this unit was resummoned because it appeared in a /pull while already summoned.
|
||
|
--- Does not include the initial summoning if that summoning happened via /pull.
|
||
|
resummonings TIMESTAMP WITH TIME ZONE ARRAY DEFAULT NULL,
|
||
|
--- The time and date this instance was desummoned by digesting or releasing.
|
||
|
desummonedAt TIMESTAMP WITH TIME ZONE DEFAULT NULL,
|
||
|
--- The summoned unit (friendly or enemy) that digested this unit, if a summoned unit was responsible and that
|
||
|
--- summoned unit has not been deleted somehow.
|
||
|
digestedByInstanceId INT DEFAULT NULL REFERENCES SummonedUnit (instanceId) ON DELETE SET NULL ON UPDATE CASCADE,
|
||
|
--- True if this instance was desummoned by being digested rather than being released.
|
||
|
wasDigested BOOLEAN DEFAULT NULL,
|
||
|
--- True if this instance was desummoned by being released rather than being digested.
|
||
|
wasReleased BOOLEAN DEFAULT NULL,
|
||
|
--- The unit's current health. If 0, the unit is unconscious and cannot participate in fights.
|
||
|
--- At -MaxHealth, the unit has been fully digested and this record will be deleted.
|
||
|
currentHealth INT NOT NULL,
|
||
|
--- The unit's maximum health.
|
||
|
maxHealth INT NOT NULL CHECK (maxHealth > 0),
|
||
|
--- The unit's strength.
|
||
|
strength INT NOT NULL CHECK (strength > 0),
|
||
|
--- The unit's current health must be between maxHealth and -maxHealth (the latter of which means digestion).
|
||
|
CONSTRAINT SummonedUnit_CurrentHealthBounds CHECK (
|
||
|
currentHealth BETWEEN -maxHealth AND maxHealth),
|
||
|
--- Exactly one of wasPulled or wasRecalled must be TRUE.
|
||
|
CONSTRAINT SummonedUnit_ExactlyOneOrigin CHECK (
|
||
|
((wasPulled IS TRUE OR wasRecalled IS TRUE) AND NOT (wasPulled IS FALSE AND wasRecalled IS FALSE))),
|
||
|
--- Exactly one of wasDigested or wasReleased must be TRUE if desummonedAt is set,
|
||
|
--- and both must be NULL if desummonedAt is NULL.
|
||
|
CONSTRAINT SummonedUnit_ExactlyOneFate CHECK (
|
||
|
((wasDigested IS TRUE OR wasReleased IS TRUE) = (desummonedAt IS NOT NULL))
|
||
|
AND (wasDigested IS NULL OR wasReleased IS NULL) = (desummonedAt IS NULL)),
|
||
|
--- The digesting summoned unit's instance ID must be set only if wasDigested is TRUE.
|
||
|
CONSTRAINT SummonedUnit_DigesterForDigestedOnly CHECK (
|
||
|
digestedByInstanceId IS NULL OR wasDigested IS TRUE)
|
||
|
);
|
||
|
|
||
|
--- No more than one instance of a particular unit may be summoned by the same player.
|
||
|
--- Once the previous instance has been desummoned (by any method), the unit may be summoned again.
|
||
|
CREATE UNIQUE INDEX IF NOT EXISTS SummonedUnit_OneInstancePerUnitPerPlayer
|
||
|
ON SummonedUnit (playerId, unitId)
|
||
|
WHERE (desummonedAt IS NULL);
|