77 lines
No EOL
2.7 KiB
PL/PgSQL
77 lines
No EOL
2.7 KiB
PL/PgSQL
-- LegacyWorlds Beta 6
|
|
-- PostgreSQL database scripts
|
|
--
|
|
-- Game updates - fleet status
|
|
--
|
|
-- Copyright(C) 2004-2010, DeepClone Development
|
|
-- --------------------------------------------------------
|
|
|
|
|
|
CREATE OR REPLACE FUNCTION sys.process_planet_fleet_status_updates( c_tick BIGINT )
|
|
RETURNS VOID
|
|
STRICT VOLATILE
|
|
SECURITY INVOKER
|
|
AS $$
|
|
DECLARE
|
|
rec RECORD;
|
|
mt_id BIGINT;
|
|
BEGIN
|
|
-- Lock all records
|
|
PERFORM f.id FROM sys.updates su
|
|
INNER JOIN verse.updates vu ON vu.update_id = su.id
|
|
INNER JOIN verse.planets p ON p.name_id = vu.planet_id
|
|
INNER JOIN fleets.fleets f ON f.location_id = p.name_id
|
|
INNER JOIN emp.empires e ON e.name_id = f.owner_id
|
|
WHERE su.last_tick = c_tick AND su.status = 'PROCESSING'
|
|
AND su.gu_type = 'PLANET_FLEET_STATUS'
|
|
FOR UPDATE;
|
|
|
|
-- Fleet deployments
|
|
FOR rec IN SELECT f.id AS fleet , f.owner_id AS owner , f.location_id AS location ,
|
|
b.id AS battle
|
|
FROM sys.updates su
|
|
INNER JOIN verse.updates vu ON vu.update_id = su.id
|
|
INNER JOIN fleets.fleets f ON f.location_id = vu.planet_id
|
|
AND f.status = 'DEPLOYING' AND f.penalty = 1
|
|
INNER JOIN emp.empires e ON e.name_id = f.owner_id
|
|
LEFT OUTER JOIN battles.battles b
|
|
ON b.location_id = f.location_id AND b.last_tick IS NULL
|
|
WHERE su.last_tick = c_tick AND su.status = 'PROCESSING'
|
|
AND su.gu_type = 'PLANET_FLEET_STATUS'
|
|
LOOP
|
|
-- Add fleet to battle (will be ignored if battle is NULL)
|
|
PERFORM battles.add_fleet( rec.battle , rec.fleet , TRUE , c_tick );
|
|
|
|
-- Find the biggest available fleet belonging to that owner
|
|
SELECT INTO mt_id f.id
|
|
FROM fleets.fleets f
|
|
INNER JOIN fleets.ships s ON s.fleet_id = f.id
|
|
INNER JOIN tech.ships sd ON sd.buildable_id = s.ship_id
|
|
LEFT OUTER JOIN fleets.movements m ON m.fleet_id = f.id
|
|
WHERE f.owner_id = rec.owner AND f.location_id = rec.location
|
|
AND m.fleet_id IS NULL AND f.status = 'AVAILABLE'
|
|
GROUP BY f.id
|
|
ORDER BY sum( sd.power * s.amount ) DESC
|
|
LIMIT 1;
|
|
CONTINUE WHEN NOT FOUND;
|
|
|
|
-- Merge fleet
|
|
PERFORM fleets.merge_ships( mt_id , rec.fleet );
|
|
DELETE FROM fleets.fleets WHERE id = rec.fleet;
|
|
END LOOP;
|
|
|
|
-- Fleets that must become available
|
|
UPDATE fleets.fleets f SET status = 'AVAILABLE' , penalty = 0
|
|
FROM sys.updates su , verse.updates vu
|
|
WHERE vu.update_id = su.id AND f.location_id = vu.planet_id
|
|
AND f.penalty = 1 AND su.status = 'PROCESSING'
|
|
AND su.gu_type = 'PLANET_FLEET_STATUS' AND su.last_tick = c_tick;
|
|
|
|
-- Fleets that still have a penalty
|
|
UPDATE fleets.fleets f SET penalty = penalty - 1
|
|
FROM sys.updates su , verse.updates vu
|
|
WHERE vu.update_id = su.id AND f.location_id = vu.planet_id
|
|
AND f.penalty > 1 AND su.status = 'PROCESSING'
|
|
AND su.gu_type = 'PLANET_FLEET_STATUS' AND su.last_tick = c_tick;
|
|
END;
|
|
$$ LANGUAGE plpgsql; |