From 3340a78fc4c2dd8469c290bf71337a7379be203f Mon Sep 17 00:00:00 2001 From: Sergiotarxz Date: Tue, 20 Jun 2023 01:48:55 +0200 Subject: [PATCH] Adding today changes: - Adding devota - Adding event loop - Adding explore attributes to teams --- dbicdh/PostgreSQL/deploy/6/001-auto.sql | 295 ++++ dbicdh/PostgreSQL/deploy/7/001-auto.sql | 295 ++++ dbicdh/PostgreSQL/upgrade/5-6/001-auto.sql | 18 + dbicdh/PostgreSQL/upgrade/6-7/001-auto.sql | 255 ++++ dbicdh/_source/deploy/6/001-auto.yml | 1467 ++++++++++++++++++++ dbicdh/_source/deploy/7/001-auto.yml | 1467 ++++++++++++++++++++ js-src/components/game.tsx | 2 +- js-src/input-packets.ts | 1 + lib/LasTres.pm | 9 + lib/LasTres/EventLoop.pm | 75 + lib/LasTres/Redis.pm | 3 + lib/LasTres/Schema/Result/Team.pm | 10 + public/img/devota.png | Bin 0 -> 137253 bytes public/js/bundle.js | 4 +- script/las_tres | 2 + 15 files changed, 3900 insertions(+), 3 deletions(-) create mode 100644 dbicdh/PostgreSQL/deploy/6/001-auto.sql create mode 100644 dbicdh/PostgreSQL/deploy/7/001-auto.sql create mode 100644 dbicdh/PostgreSQL/upgrade/5-6/001-auto.sql create mode 100644 dbicdh/PostgreSQL/upgrade/6-7/001-auto.sql create mode 100644 dbicdh/_source/deploy/6/001-auto.yml create mode 100644 dbicdh/_source/deploy/7/001-auto.yml create mode 100644 lib/LasTres/EventLoop.pm create mode 100644 public/img/devota.png diff --git a/dbicdh/PostgreSQL/deploy/6/001-auto.sql b/dbicdh/PostgreSQL/deploy/6/001-auto.sql new file mode 100644 index 0000000..e94372b --- /dev/null +++ b/dbicdh/PostgreSQL/deploy/6/001-auto.sql @@ -0,0 +1,295 @@ +-- +-- Created by SQL::Translator::Producer::PostgreSQL +-- Created on Mon Jun 19 20:01:37 2023 +-- +; +-- +-- Table: equipment +-- +CREATE TABLE "equipment" ( + "uuid" uuid NOT NULL, + PRIMARY KEY ("uuid") +); + +; +-- +-- Table: inventories +-- +CREATE TABLE "inventories" ( + "uuid" uuid NOT NULL, + PRIMARY KEY ("uuid") +); + +; +-- +-- Table: players +-- +CREATE TABLE "players" ( + "uuid" uuid NOT NULL, + "username" text NOT NULL, + "encrypted_password" text NOT NULL, + "email" text NOT NULL, + "verified" boolean NOT NULL, + "verification_token" text, + "register_date" timestamp DEFAULT NOW() NOT NULL, + "last_activity" timestamp DEFAULT NOW() NOT NULL, + PRIMARY KEY ("uuid"), + CONSTRAINT "unique_constraint_email" UNIQUE ("email"), + CONSTRAINT "unique_constraint_username" UNIQUE ("username") +); + +; +-- +-- Table: skill_like_lists +-- +CREATE TABLE "skill_like_lists" ( + "uuid" uuid DEFAULT uuid_generate_v4() NOT NULL, + PRIMARY KEY ("uuid") +); + +; +-- +-- Table: stats +-- +CREATE TABLE "stats" ( + "uuid" uuid NOT NULL, + "health" integer NOT NULL, + "mana" integer NOT NULL, + "strength" integer NOT NULL, + "resistance" integer NOT NULL, + "magic" integer NOT NULL, + "speed" integer NOT NULL, + "intelligence" integer NOT NULL, + PRIMARY KEY ("uuid") +); + +; +-- +-- Table: equipment_items +-- +CREATE TABLE "equipment_items" ( + "kind" text NOT NULL, + "equipment" uuid NOT NULL, + "identifier" text NOT NULL, + "quantity" integer NOT NULL, + PRIMARY KEY ("kind", "equipment") +); +CREATE INDEX "equipment_items_idx_equipment" on "equipment_items" ("equipment"); + +; +-- +-- Table: inventory_items +-- +CREATE TABLE "inventory_items" ( + "uuid" uuid DEFAULT uuid_generate_v4() NOT NULL, + "inventory" uuid NOT NULL, + "identifier" text NOT NULL, + "quantity" integer NOT NULL, + PRIMARY KEY ("uuid"), + CONSTRAINT "inventory_items_unique_item" UNIQUE ("inventory", "identifier") +); +CREATE INDEX "inventory_items_idx_inventory" on "inventory_items" ("inventory"); + +; +-- +-- Table: skill_like_items +-- +CREATE TABLE "skill_like_items" ( + "identifier" text NOT NULL, + "owner_list" uuid NOT NULL, + "level" integer DEFAULT 1 NOT NULL, + PRIMARY KEY ("identifier", "owner_list") +); +CREATE INDEX "skill_like_items_idx_owner_list" on "skill_like_items" ("owner_list"); + +; +-- +-- Table: teams +-- +CREATE TABLE "teams" ( + "uuid" uuid NOT NULL, + "is_exploring" boolean DEFAULT false NOT NULL, + "explore_frame" integer DEFAULT 0 NOT NULL, + "leader" uuid, + "name" text NOT NULL, + "planet" text NOT NULL, + "super_area" text NOT NULL, + "area" text NOT NULL, + "location" text NOT NULL, + PRIMARY KEY ("uuid"), + CONSTRAINT "u_name" UNIQUE ("name") +); +CREATE INDEX "teams_idx_leader" on "teams" ("leader"); + +; +-- +-- Table: player_pjs +-- +CREATE TABLE "player_pjs" ( + "uuid" uuid DEFAULT uuid_generate_v4() NOT NULL, + "owner" uuid NOT NULL, + "full_name" text NOT NULL, + "short_name" text NOT NULL, + "nick" text NOT NULL, + "race" text NOT NULL, + "team" uuid NOT NULL, + "creation_date" timestamp DEFAULT NOW() NOT NULL, + "last_activity" timestamp DEFAULT NOW() NOT NULL, + "experience" integer DEFAULT 1 NOT NULL, + "equipment" uuid NOT NULL, + "born_stats" uuid NOT NULL, + "training_stats" uuid NOT NULL, + "skills" uuid NOT NULL, + "spells" uuid NOT NULL, + "inventory" uuid NOT NULL, + "health" integer NOT NULL, + "mana" integer NOT NULL, + PRIMARY KEY ("uuid") +); +CREATE INDEX "player_pjs_idx_born_stats" on "player_pjs" ("born_stats"); +CREATE INDEX "player_pjs_idx_equipment" on "player_pjs" ("equipment"); +CREATE INDEX "player_pjs_idx_inventory" on "player_pjs" ("inventory"); +CREATE INDEX "player_pjs_idx_owner" on "player_pjs" ("owner"); +CREATE INDEX "player_pjs_idx_skills" on "player_pjs" ("skills"); +CREATE INDEX "player_pjs_idx_spells" on "player_pjs" ("spells"); +CREATE INDEX "player_pjs_idx_team" on "player_pjs" ("team"); +CREATE INDEX "player_pjs_idx_training_stats" on "player_pjs" ("training_stats"); + +; +-- +-- Table: player_companion_npcs +-- +CREATE TABLE "player_companion_npcs" ( + "uuid" uuid DEFAULT uuid_generate_v4() NOT NULL, + "owner" uuid NOT NULL, + "identifier" text NOT NULL, + "nick" text, + "race" text NOT NULL, + "level" integer DEFAULT 1 NOT NULL, + "exp" integer DEFAULT 1 NOT NULL, + "equipment" uuid NOT NULL, + "stats" uuid NOT NULL, + "skills" uuid NOT NULL, + "spells" uuid NOT NULL, + "inventory" uuid NOT NULL, + PRIMARY KEY ("uuid") +); +CREATE INDEX "player_companion_npcs_idx_equipment" on "player_companion_npcs" ("equipment"); +CREATE INDEX "player_companion_npcs_idx_inventory" on "player_companion_npcs" ("inventory"); +CREATE INDEX "player_companion_npcs_idx_owner" on "player_companion_npcs" ("owner"); +CREATE INDEX "player_companion_npcs_idx_skills" on "player_companion_npcs" ("skills"); +CREATE INDEX "player_companion_npcs_idx_spells" on "player_companion_npcs" ("spells"); +CREATE INDEX "player_companion_npcs_idx_stats" on "player_companion_npcs" ("stats"); + +; +-- +-- Table: player_pjs_flags +-- +CREATE TABLE "player_pjs_flags" ( + "name" text NOT NULL, + "owner" uuid NOT NULL, + PRIMARY KEY ("name", "owner") +); +CREATE INDEX "player_pjs_flags_idx_owner" on "player_pjs_flags" ("owner"); +CREATE INDEX "index_flag" on "player_pjs_flags" ("owner", "name"); + +; +-- +-- Table: player_pjs_log +-- +CREATE TABLE "player_pjs_log" ( + "uuid" uuid NOT NULL, + "content" jsonb NOT NULL, + "owner" uuid NOT NULL, + "date" timestamp DEFAULT NOW() NOT NULL, + PRIMARY KEY ("uuid") +); +CREATE INDEX "player_pjs_log_idx_owner" on "player_pjs_log" ("owner"); +CREATE INDEX "index_log" on "player_pjs_log" ("owner", "date"); + +; +-- +-- Foreign Key Definitions +-- + +; +ALTER TABLE "equipment_items" ADD CONSTRAINT "equipment_items_fk_equipment" FOREIGN KEY ("equipment") + REFERENCES "equipment" ("uuid") ON DELETE CASCADE ON UPDATE CASCADE DEFERRABLE; + +; +ALTER TABLE "inventory_items" ADD CONSTRAINT "inventory_items_fk_inventory" FOREIGN KEY ("inventory") + REFERENCES "inventories" ("uuid") ON DELETE CASCADE ON UPDATE CASCADE DEFERRABLE; + +; +ALTER TABLE "skill_like_items" ADD CONSTRAINT "skill_like_items_fk_owner_list" FOREIGN KEY ("owner_list") + REFERENCES "skill_like_lists" ("uuid") ON DELETE CASCADE ON UPDATE CASCADE DEFERRABLE; + +; +ALTER TABLE "teams" ADD CONSTRAINT "teams_fk_leader" FOREIGN KEY ("leader") + REFERENCES "player_pjs" ("uuid") DEFERRABLE; + +; +ALTER TABLE "player_pjs" ADD CONSTRAINT "player_pjs_fk_born_stats" FOREIGN KEY ("born_stats") + REFERENCES "stats" ("uuid") DEFERRABLE; + +; +ALTER TABLE "player_pjs" ADD CONSTRAINT "player_pjs_fk_equipment" FOREIGN KEY ("equipment") + REFERENCES "equipment" ("uuid") DEFERRABLE; + +; +ALTER TABLE "player_pjs" ADD CONSTRAINT "player_pjs_fk_inventory" FOREIGN KEY ("inventory") + REFERENCES "inventories" ("uuid") DEFERRABLE; + +; +ALTER TABLE "player_pjs" ADD CONSTRAINT "player_pjs_fk_owner" FOREIGN KEY ("owner") + REFERENCES "players" ("uuid") ON DELETE CASCADE ON UPDATE CASCADE DEFERRABLE; + +; +ALTER TABLE "player_pjs" ADD CONSTRAINT "player_pjs_fk_skills" FOREIGN KEY ("skills") + REFERENCES "skill_like_lists" ("uuid") DEFERRABLE; + +; +ALTER TABLE "player_pjs" ADD CONSTRAINT "player_pjs_fk_spells" FOREIGN KEY ("spells") + REFERENCES "skill_like_lists" ("uuid") DEFERRABLE; + +; +ALTER TABLE "player_pjs" ADD CONSTRAINT "player_pjs_fk_team" FOREIGN KEY ("team") + REFERENCES "teams" ("uuid") ON DELETE CASCADE ON UPDATE CASCADE DEFERRABLE; + +; +ALTER TABLE "player_pjs" ADD CONSTRAINT "player_pjs_fk_training_stats" FOREIGN KEY ("training_stats") + REFERENCES "stats" ("uuid") DEFERRABLE; + +; +ALTER TABLE "player_companion_npcs" ADD CONSTRAINT "player_companion_npcs_fk_equipment" FOREIGN KEY ("equipment") + REFERENCES "equipment" ("uuid") DEFERRABLE; + +; +ALTER TABLE "player_companion_npcs" ADD CONSTRAINT "player_companion_npcs_fk_inventory" FOREIGN KEY ("inventory") + REFERENCES "inventories" ("uuid") DEFERRABLE; + +; +ALTER TABLE "player_companion_npcs" ADD CONSTRAINT "player_companion_npcs_fk_owner" FOREIGN KEY ("owner") + REFERENCES "player_pjs" ("uuid") ON DELETE CASCADE ON UPDATE CASCADE DEFERRABLE; + +; +ALTER TABLE "player_companion_npcs" ADD CONSTRAINT "player_companion_npcs_fk_skills" FOREIGN KEY ("skills") + REFERENCES "skill_like_lists" ("uuid") DEFERRABLE; + +; +ALTER TABLE "player_companion_npcs" ADD CONSTRAINT "player_companion_npcs_fk_spells" FOREIGN KEY ("spells") + REFERENCES "skill_like_lists" ("uuid") DEFERRABLE; + +; +ALTER TABLE "player_companion_npcs" ADD CONSTRAINT "player_companion_npcs_fk_stats" FOREIGN KEY ("stats") + REFERENCES "stats" ("uuid") DEFERRABLE; + +; +ALTER TABLE "player_pjs_flags" ADD CONSTRAINT "player_pjs_flags_fk_owner" FOREIGN KEY ("owner") + REFERENCES "player_pjs" ("uuid") ON DELETE CASCADE ON UPDATE CASCADE DEFERRABLE; + +; +ALTER TABLE "player_pjs_log" ADD CONSTRAINT "player_pjs_log_fk_owner" FOREIGN KEY ("owner") + REFERENCES "player_pjs" ("uuid") ON DELETE CASCADE ON UPDATE CASCADE DEFERRABLE; + +; diff --git a/dbicdh/PostgreSQL/deploy/7/001-auto.sql b/dbicdh/PostgreSQL/deploy/7/001-auto.sql new file mode 100644 index 0000000..fed9d5b --- /dev/null +++ b/dbicdh/PostgreSQL/deploy/7/001-auto.sql @@ -0,0 +1,295 @@ +-- +-- Created by SQL::Translator::Producer::PostgreSQL +-- Created on Mon Jun 19 20:00:51 2023 +-- +; +-- +-- Table: equipment +-- +CREATE TABLE "equipment" ( + "uuid" uuid NOT NULL, + PRIMARY KEY ("uuid") +); + +; +-- +-- Table: inventories +-- +CREATE TABLE "inventories" ( + "uuid" uuid NOT NULL, + PRIMARY KEY ("uuid") +); + +; +-- +-- Table: players +-- +CREATE TABLE "players" ( + "uuid" uuid NOT NULL, + "username" text NOT NULL, + "encrypted_password" text NOT NULL, + "email" text NOT NULL, + "verified" boolean NOT NULL, + "verification_token" text, + "register_date" timestamp DEFAULT NOW() NOT NULL, + "last_activity" timestamp DEFAULT NOW() NOT NULL, + PRIMARY KEY ("uuid"), + CONSTRAINT "unique_constraint_email" UNIQUE ("email"), + CONSTRAINT "unique_constraint_username" UNIQUE ("username") +); + +; +-- +-- Table: skill_like_lists +-- +CREATE TABLE "skill_like_lists" ( + "uuid" uuid DEFAULT uuid_generate_v4() NOT NULL, + PRIMARY KEY ("uuid") +); + +; +-- +-- Table: stats +-- +CREATE TABLE "stats" ( + "uuid" uuid NOT NULL, + "health" integer NOT NULL, + "mana" integer NOT NULL, + "strength" integer NOT NULL, + "resistance" integer NOT NULL, + "magic" integer NOT NULL, + "speed" integer NOT NULL, + "intelligence" integer NOT NULL, + PRIMARY KEY ("uuid") +); + +; +-- +-- Table: equipment_items +-- +CREATE TABLE "equipment_items" ( + "kind" text NOT NULL, + "equipment" uuid NOT NULL, + "identifier" text NOT NULL, + "quantity" integer NOT NULL, + PRIMARY KEY ("kind", "equipment") +); +CREATE INDEX "equipment_items_idx_equipment" on "equipment_items" ("equipment"); + +; +-- +-- Table: inventory_items +-- +CREATE TABLE "inventory_items" ( + "uuid" uuid DEFAULT uuid_generate_v4() NOT NULL, + "inventory" uuid NOT NULL, + "identifier" text NOT NULL, + "quantity" integer NOT NULL, + PRIMARY KEY ("uuid"), + CONSTRAINT "inventory_items_unique_item" UNIQUE ("inventory", "identifier") +); +CREATE INDEX "inventory_items_idx_inventory" on "inventory_items" ("inventory"); + +; +-- +-- Table: skill_like_items +-- +CREATE TABLE "skill_like_items" ( + "identifier" text NOT NULL, + "owner_list" uuid NOT NULL, + "level" integer DEFAULT 1 NOT NULL, + PRIMARY KEY ("identifier", "owner_list") +); +CREATE INDEX "skill_like_items_idx_owner_list" on "skill_like_items" ("owner_list"); + +; +-- +-- Table: teams +-- +CREATE TABLE "teams" ( + "uuid" uuid NOT NULL, + "is_exploring" boolean DEFAULT false NOT NULL, + "explore_frame" integer DEFAULT 0 NOT NULL, + "leader" uuid, + "name" text NOT NULL, + "planet" text NOT NULL, + "super_area" text NOT NULL, + "area" text NOT NULL, + "location" text NOT NULL, + PRIMARY KEY ("uuid"), + CONSTRAINT "u_name" UNIQUE ("name") +); +CREATE INDEX "teams_idx_leader" on "teams" ("leader"); + +; +-- +-- Table: player_pjs +-- +CREATE TABLE "player_pjs" ( + "uuid" uuid DEFAULT uuid_generate_v4() NOT NULL, + "owner" uuid NOT NULL, + "full_name" text NOT NULL, + "short_name" text NOT NULL, + "nick" text NOT NULL, + "race" text NOT NULL, + "team" uuid NOT NULL, + "creation_date" timestamp DEFAULT NOW() NOT NULL, + "last_activity" timestamp DEFAULT NOW() NOT NULL, + "experience" integer DEFAULT 1 NOT NULL, + "equipment" uuid NOT NULL, + "born_stats" uuid NOT NULL, + "training_stats" uuid NOT NULL, + "skills" uuid NOT NULL, + "spells" uuid NOT NULL, + "inventory" uuid NOT NULL, + "health" integer NOT NULL, + "mana" integer NOT NULL, + PRIMARY KEY ("uuid") +); +CREATE INDEX "player_pjs_idx_born_stats" on "player_pjs" ("born_stats"); +CREATE INDEX "player_pjs_idx_equipment" on "player_pjs" ("equipment"); +CREATE INDEX "player_pjs_idx_inventory" on "player_pjs" ("inventory"); +CREATE INDEX "player_pjs_idx_owner" on "player_pjs" ("owner"); +CREATE INDEX "player_pjs_idx_skills" on "player_pjs" ("skills"); +CREATE INDEX "player_pjs_idx_spells" on "player_pjs" ("spells"); +CREATE INDEX "player_pjs_idx_team" on "player_pjs" ("team"); +CREATE INDEX "player_pjs_idx_training_stats" on "player_pjs" ("training_stats"); + +; +-- +-- Table: player_companion_npcs +-- +CREATE TABLE "player_companion_npcs" ( + "uuid" uuid DEFAULT uuid_generate_v4() NOT NULL, + "owner" uuid NOT NULL, + "identifier" text NOT NULL, + "nick" text, + "race" text NOT NULL, + "level" integer DEFAULT 1 NOT NULL, + "exp" integer DEFAULT 1 NOT NULL, + "equipment" uuid NOT NULL, + "stats" uuid NOT NULL, + "skills" uuid NOT NULL, + "spells" uuid NOT NULL, + "inventory" uuid NOT NULL, + PRIMARY KEY ("uuid") +); +CREATE INDEX "player_companion_npcs_idx_equipment" on "player_companion_npcs" ("equipment"); +CREATE INDEX "player_companion_npcs_idx_inventory" on "player_companion_npcs" ("inventory"); +CREATE INDEX "player_companion_npcs_idx_owner" on "player_companion_npcs" ("owner"); +CREATE INDEX "player_companion_npcs_idx_skills" on "player_companion_npcs" ("skills"); +CREATE INDEX "player_companion_npcs_idx_spells" on "player_companion_npcs" ("spells"); +CREATE INDEX "player_companion_npcs_idx_stats" on "player_companion_npcs" ("stats"); + +; +-- +-- Table: player_pjs_flags +-- +CREATE TABLE "player_pjs_flags" ( + "name" text NOT NULL, + "owner" uuid NOT NULL, + PRIMARY KEY ("name", "owner") +); +CREATE INDEX "player_pjs_flags_idx_owner" on "player_pjs_flags" ("owner"); +CREATE INDEX "index_flag" on "player_pjs_flags" ("owner", "name"); + +; +-- +-- Table: player_pjs_log +-- +CREATE TABLE "player_pjs_log" ( + "uuid" uuid NOT NULL, + "content" jsonb NOT NULL, + "owner" uuid NOT NULL, + "date" timestamp DEFAULT NOW() NOT NULL, + PRIMARY KEY ("uuid") +); +CREATE INDEX "player_pjs_log_idx_owner" on "player_pjs_log" ("owner"); +CREATE INDEX "index_log" on "player_pjs_log" ("owner", "date"); + +; +-- +-- Foreign Key Definitions +-- + +; +ALTER TABLE "equipment_items" ADD CONSTRAINT "equipment_items_fk_equipment" FOREIGN KEY ("equipment") + REFERENCES "equipment" ("uuid") ON DELETE CASCADE ON UPDATE CASCADE DEFERRABLE; + +; +ALTER TABLE "inventory_items" ADD CONSTRAINT "inventory_items_fk_inventory" FOREIGN KEY ("inventory") + REFERENCES "inventories" ("uuid") ON DELETE CASCADE ON UPDATE CASCADE DEFERRABLE; + +; +ALTER TABLE "skill_like_items" ADD CONSTRAINT "skill_like_items_fk_owner_list" FOREIGN KEY ("owner_list") + REFERENCES "skill_like_lists" ("uuid") ON DELETE CASCADE ON UPDATE CASCADE DEFERRABLE; + +; +ALTER TABLE "teams" ADD CONSTRAINT "teams_fk_leader" FOREIGN KEY ("leader") + REFERENCES "player_pjs" ("uuid") DEFERRABLE; + +; +ALTER TABLE "player_pjs" ADD CONSTRAINT "player_pjs_fk_born_stats" FOREIGN KEY ("born_stats") + REFERENCES "stats" ("uuid") DEFERRABLE; + +; +ALTER TABLE "player_pjs" ADD CONSTRAINT "player_pjs_fk_equipment" FOREIGN KEY ("equipment") + REFERENCES "equipment" ("uuid") DEFERRABLE; + +; +ALTER TABLE "player_pjs" ADD CONSTRAINT "player_pjs_fk_inventory" FOREIGN KEY ("inventory") + REFERENCES "inventories" ("uuid") DEFERRABLE; + +; +ALTER TABLE "player_pjs" ADD CONSTRAINT "player_pjs_fk_owner" FOREIGN KEY ("owner") + REFERENCES "players" ("uuid") ON DELETE CASCADE ON UPDATE CASCADE DEFERRABLE; + +; +ALTER TABLE "player_pjs" ADD CONSTRAINT "player_pjs_fk_skills" FOREIGN KEY ("skills") + REFERENCES "skill_like_lists" ("uuid") DEFERRABLE; + +; +ALTER TABLE "player_pjs" ADD CONSTRAINT "player_pjs_fk_spells" FOREIGN KEY ("spells") + REFERENCES "skill_like_lists" ("uuid") DEFERRABLE; + +; +ALTER TABLE "player_pjs" ADD CONSTRAINT "player_pjs_fk_team" FOREIGN KEY ("team") + REFERENCES "teams" ("uuid") ON DELETE CASCADE ON UPDATE CASCADE DEFERRABLE; + +; +ALTER TABLE "player_pjs" ADD CONSTRAINT "player_pjs_fk_training_stats" FOREIGN KEY ("training_stats") + REFERENCES "stats" ("uuid") DEFERRABLE; + +; +ALTER TABLE "player_companion_npcs" ADD CONSTRAINT "player_companion_npcs_fk_equipment" FOREIGN KEY ("equipment") + REFERENCES "equipment" ("uuid") DEFERRABLE; + +; +ALTER TABLE "player_companion_npcs" ADD CONSTRAINT "player_companion_npcs_fk_inventory" FOREIGN KEY ("inventory") + REFERENCES "inventories" ("uuid") DEFERRABLE; + +; +ALTER TABLE "player_companion_npcs" ADD CONSTRAINT "player_companion_npcs_fk_owner" FOREIGN KEY ("owner") + REFERENCES "player_pjs" ("uuid") ON DELETE CASCADE ON UPDATE CASCADE DEFERRABLE; + +; +ALTER TABLE "player_companion_npcs" ADD CONSTRAINT "player_companion_npcs_fk_skills" FOREIGN KEY ("skills") + REFERENCES "skill_like_lists" ("uuid") DEFERRABLE; + +; +ALTER TABLE "player_companion_npcs" ADD CONSTRAINT "player_companion_npcs_fk_spells" FOREIGN KEY ("spells") + REFERENCES "skill_like_lists" ("uuid") DEFERRABLE; + +; +ALTER TABLE "player_companion_npcs" ADD CONSTRAINT "player_companion_npcs_fk_stats" FOREIGN KEY ("stats") + REFERENCES "stats" ("uuid") DEFERRABLE; + +; +ALTER TABLE "player_pjs_flags" ADD CONSTRAINT "player_pjs_flags_fk_owner" FOREIGN KEY ("owner") + REFERENCES "player_pjs" ("uuid") ON DELETE CASCADE ON UPDATE CASCADE DEFERRABLE; + +; +ALTER TABLE "player_pjs_log" ADD CONSTRAINT "player_pjs_log_fk_owner" FOREIGN KEY ("owner") + REFERENCES "player_pjs" ("uuid") ON DELETE CASCADE ON UPDATE CASCADE DEFERRABLE; + +; diff --git a/dbicdh/PostgreSQL/upgrade/5-6/001-auto.sql b/dbicdh/PostgreSQL/upgrade/5-6/001-auto.sql new file mode 100644 index 0000000..ddc4da7 --- /dev/null +++ b/dbicdh/PostgreSQL/upgrade/5-6/001-auto.sql @@ -0,0 +1,18 @@ +-- Convert schema '/home/sergio/LasTres/script/../dbicdh/_source/deploy/5/001-auto.yml' to '/home/sergio/LasTres/script/../dbicdh/_source/deploy/6/001-auto.yml':; + +; +BEGIN; + +; +ALTER TABLE inventory_items ADD CONSTRAINT inventory_items_unique_item UNIQUE (inventory, identifier); + +; +ALTER TABLE teams ADD COLUMN is_exploring boolean DEFAULT false NOT NULL; + +; +ALTER TABLE teams ADD COLUMN explore_frame integer DEFAULT 0 NOT NULL; + +; + +COMMIT; + diff --git a/dbicdh/PostgreSQL/upgrade/6-7/001-auto.sql b/dbicdh/PostgreSQL/upgrade/6-7/001-auto.sql new file mode 100644 index 0000000..20d1ae0 --- /dev/null +++ b/dbicdh/PostgreSQL/upgrade/6-7/001-auto.sql @@ -0,0 +1,255 @@ +-- Convert schema '/home/sergio/LasTres/script/../dbicdh/_source/deploy/6/001-auto.yml' to '/home/sergio/LasTres/script/../dbicdh/_source/deploy/7/001-auto.yml':; + +; +BEGIN; + +; +CREATE TABLE "equipment" ( + "uuid" uuid NOT NULL, + PRIMARY KEY ("uuid") +); + +; +CREATE TABLE "equipment_items" ( + "kind" text NOT NULL, + "equipment" uuid NOT NULL, + "identifier" text NOT NULL, + "quantity" integer NOT NULL, + PRIMARY KEY ("kind", "equipment") +); +CREATE INDEX "equipment_items_idx_equipment" on "equipment_items" ("equipment"); + +; +CREATE TABLE "inventories" ( + "uuid" uuid NOT NULL, + PRIMARY KEY ("uuid") +); + +; +CREATE TABLE "inventory_items" ( + "uuid" uuid DEFAULT uuid_generate_v4() NOT NULL, + "inventory" uuid NOT NULL, + "identifier" text NOT NULL, + "quantity" integer NOT NULL, + PRIMARY KEY ("uuid"), + CONSTRAINT "inventory_items_unique_item" UNIQUE ("inventory", "identifier") +); +CREATE INDEX "inventory_items_idx_inventory" on "inventory_items" ("inventory"); + +; +CREATE TABLE "player_companion_npcs" ( + "uuid" uuid DEFAULT uuid_generate_v4() NOT NULL, + "owner" uuid NOT NULL, + "identifier" text NOT NULL, + "nick" text, + "race" text NOT NULL, + "level" integer DEFAULT 1 NOT NULL, + "exp" integer DEFAULT 1 NOT NULL, + "equipment" uuid NOT NULL, + "stats" uuid NOT NULL, + "skills" uuid NOT NULL, + "spells" uuid NOT NULL, + "inventory" uuid NOT NULL, + PRIMARY KEY ("uuid") +); +CREATE INDEX "player_companion_npcs_idx_equipment" on "player_companion_npcs" ("equipment"); +CREATE INDEX "player_companion_npcs_idx_inventory" on "player_companion_npcs" ("inventory"); +CREATE INDEX "player_companion_npcs_idx_owner" on "player_companion_npcs" ("owner"); +CREATE INDEX "player_companion_npcs_idx_skills" on "player_companion_npcs" ("skills"); +CREATE INDEX "player_companion_npcs_idx_spells" on "player_companion_npcs" ("spells"); +CREATE INDEX "player_companion_npcs_idx_stats" on "player_companion_npcs" ("stats"); + +; +CREATE TABLE "player_pjs" ( + "uuid" uuid DEFAULT uuid_generate_v4() NOT NULL, + "owner" uuid NOT NULL, + "full_name" text NOT NULL, + "short_name" text NOT NULL, + "nick" text NOT NULL, + "race" text NOT NULL, + "team" uuid NOT NULL, + "creation_date" timestamp DEFAULT NOW() NOT NULL, + "last_activity" timestamp DEFAULT NOW() NOT NULL, + "experience" integer DEFAULT 1 NOT NULL, + "equipment" uuid NOT NULL, + "born_stats" uuid NOT NULL, + "training_stats" uuid NOT NULL, + "skills" uuid NOT NULL, + "spells" uuid NOT NULL, + "inventory" uuid NOT NULL, + "health" integer NOT NULL, + "mana" integer NOT NULL, + PRIMARY KEY ("uuid") +); +CREATE INDEX "player_pjs_idx_born_stats" on "player_pjs" ("born_stats"); +CREATE INDEX "player_pjs_idx_equipment" on "player_pjs" ("equipment"); +CREATE INDEX "player_pjs_idx_inventory" on "player_pjs" ("inventory"); +CREATE INDEX "player_pjs_idx_owner" on "player_pjs" ("owner"); +CREATE INDEX "player_pjs_idx_skills" on "player_pjs" ("skills"); +CREATE INDEX "player_pjs_idx_spells" on "player_pjs" ("spells"); +CREATE INDEX "player_pjs_idx_team" on "player_pjs" ("team"); +CREATE INDEX "player_pjs_idx_training_stats" on "player_pjs" ("training_stats"); + +; +CREATE TABLE "player_pjs_flags" ( + "name" text NOT NULL, + "owner" uuid NOT NULL, + PRIMARY KEY ("name", "owner") +); +CREATE INDEX "player_pjs_flags_idx_owner" on "player_pjs_flags" ("owner"); +CREATE INDEX "index_flag" on "player_pjs_flags" ("owner", "name"); + +; +CREATE TABLE "player_pjs_log" ( + "uuid" uuid NOT NULL, + "content" jsonb NOT NULL, + "owner" uuid NOT NULL, + "date" timestamp DEFAULT NOW() NOT NULL, + PRIMARY KEY ("uuid") +); +CREATE INDEX "player_pjs_log_idx_owner" on "player_pjs_log" ("owner"); +CREATE INDEX "index_log" on "player_pjs_log" ("owner", "date"); + +; +CREATE TABLE "players" ( + "uuid" uuid NOT NULL, + "username" text NOT NULL, + "encrypted_password" text NOT NULL, + "email" text NOT NULL, + "verified" boolean NOT NULL, + "verification_token" text, + "register_date" timestamp DEFAULT NOW() NOT NULL, + "last_activity" timestamp DEFAULT NOW() NOT NULL, + PRIMARY KEY ("uuid"), + CONSTRAINT "unique_constraint_email" UNIQUE ("email"), + CONSTRAINT "unique_constraint_username" UNIQUE ("username") +); + +; +CREATE TABLE "skill_like_items" ( + "identifier" text NOT NULL, + "owner_list" uuid NOT NULL, + "level" integer DEFAULT 1 NOT NULL, + PRIMARY KEY ("identifier", "owner_list") +); +CREATE INDEX "skill_like_items_idx_owner_list" on "skill_like_items" ("owner_list"); + +; +CREATE TABLE "skill_like_lists" ( + "uuid" uuid DEFAULT uuid_generate_v4() NOT NULL, + PRIMARY KEY ("uuid") +); + +; +CREATE TABLE "stats" ( + "uuid" uuid NOT NULL, + "health" integer NOT NULL, + "mana" integer NOT NULL, + "strength" integer NOT NULL, + "resistance" integer NOT NULL, + "magic" integer NOT NULL, + "speed" integer NOT NULL, + "intelligence" integer NOT NULL, + PRIMARY KEY ("uuid") +); + +; +CREATE TABLE "teams" ( + "uuid" uuid NOT NULL, + "is_exploring" boolean DEFAULT false NOT NULL, + "explore_frame" integer DEFAULT 0 NOT NULL, + "leader" uuid, + "name" text NOT NULL, + "planet" text NOT NULL, + "super_area" text NOT NULL, + "area" text NOT NULL, + "location" text NOT NULL, + PRIMARY KEY ("uuid"), + CONSTRAINT "u_name" UNIQUE ("name") +); +CREATE INDEX "teams_idx_leader" on "teams" ("leader"); + +; +ALTER TABLE "equipment_items" ADD CONSTRAINT "equipment_items_fk_equipment" FOREIGN KEY ("equipment") + REFERENCES "equipment" ("uuid") ON DELETE CASCADE ON UPDATE CASCADE DEFERRABLE; + +; +ALTER TABLE "inventory_items" ADD CONSTRAINT "inventory_items_fk_inventory" FOREIGN KEY ("inventory") + REFERENCES "inventories" ("uuid") ON DELETE CASCADE ON UPDATE CASCADE DEFERRABLE; + +; +ALTER TABLE "player_companion_npcs" ADD CONSTRAINT "player_companion_npcs_fk_equipment" FOREIGN KEY ("equipment") + REFERENCES "equipment" ("uuid") DEFERRABLE; + +; +ALTER TABLE "player_companion_npcs" ADD CONSTRAINT "player_companion_npcs_fk_inventory" FOREIGN KEY ("inventory") + REFERENCES "inventories" ("uuid") DEFERRABLE; + +; +ALTER TABLE "player_companion_npcs" ADD CONSTRAINT "player_companion_npcs_fk_owner" FOREIGN KEY ("owner") + REFERENCES "player_pjs" ("uuid") ON DELETE CASCADE ON UPDATE CASCADE DEFERRABLE; + +; +ALTER TABLE "player_companion_npcs" ADD CONSTRAINT "player_companion_npcs_fk_skills" FOREIGN KEY ("skills") + REFERENCES "skill_like_lists" ("uuid") DEFERRABLE; + +; +ALTER TABLE "player_companion_npcs" ADD CONSTRAINT "player_companion_npcs_fk_spells" FOREIGN KEY ("spells") + REFERENCES "skill_like_lists" ("uuid") DEFERRABLE; + +; +ALTER TABLE "player_companion_npcs" ADD CONSTRAINT "player_companion_npcs_fk_stats" FOREIGN KEY ("stats") + REFERENCES "stats" ("uuid") DEFERRABLE; + +; +ALTER TABLE "player_pjs" ADD CONSTRAINT "player_pjs_fk_born_stats" FOREIGN KEY ("born_stats") + REFERENCES "stats" ("uuid") DEFERRABLE; + +; +ALTER TABLE "player_pjs" ADD CONSTRAINT "player_pjs_fk_equipment" FOREIGN KEY ("equipment") + REFERENCES "equipment" ("uuid") DEFERRABLE; + +; +ALTER TABLE "player_pjs" ADD CONSTRAINT "player_pjs_fk_inventory" FOREIGN KEY ("inventory") + REFERENCES "inventories" ("uuid") DEFERRABLE; + +; +ALTER TABLE "player_pjs" ADD CONSTRAINT "player_pjs_fk_owner" FOREIGN KEY ("owner") + REFERENCES "players" ("uuid") ON DELETE CASCADE ON UPDATE CASCADE DEFERRABLE; + +; +ALTER TABLE "player_pjs" ADD CONSTRAINT "player_pjs_fk_skills" FOREIGN KEY ("skills") + REFERENCES "skill_like_lists" ("uuid") DEFERRABLE; + +; +ALTER TABLE "player_pjs" ADD CONSTRAINT "player_pjs_fk_spells" FOREIGN KEY ("spells") + REFERENCES "skill_like_lists" ("uuid") DEFERRABLE; + +; +ALTER TABLE "player_pjs" ADD CONSTRAINT "player_pjs_fk_team" FOREIGN KEY ("team") + REFERENCES "teams" ("uuid") ON DELETE CASCADE ON UPDATE CASCADE DEFERRABLE; + +; +ALTER TABLE "player_pjs" ADD CONSTRAINT "player_pjs_fk_training_stats" FOREIGN KEY ("training_stats") + REFERENCES "stats" ("uuid") DEFERRABLE; + +; +ALTER TABLE "player_pjs_flags" ADD CONSTRAINT "player_pjs_flags_fk_owner" FOREIGN KEY ("owner") + REFERENCES "player_pjs" ("uuid") ON DELETE CASCADE ON UPDATE CASCADE DEFERRABLE; + +; +ALTER TABLE "player_pjs_log" ADD CONSTRAINT "player_pjs_log_fk_owner" FOREIGN KEY ("owner") + REFERENCES "player_pjs" ("uuid") ON DELETE CASCADE ON UPDATE CASCADE DEFERRABLE; + +; +ALTER TABLE "skill_like_items" ADD CONSTRAINT "skill_like_items_fk_owner_list" FOREIGN KEY ("owner_list") + REFERENCES "skill_like_lists" ("uuid") ON DELETE CASCADE ON UPDATE CASCADE DEFERRABLE; + +; +ALTER TABLE "teams" ADD CONSTRAINT "teams_fk_leader" FOREIGN KEY ("leader") + REFERENCES "player_pjs" ("uuid") DEFERRABLE; + +; + +COMMIT; + diff --git a/dbicdh/_source/deploy/6/001-auto.yml b/dbicdh/_source/deploy/6/001-auto.yml new file mode 100644 index 0000000..daff5c0 --- /dev/null +++ b/dbicdh/_source/deploy/6/001-auto.yml @@ -0,0 +1,1467 @@ +--- +schema: + procedures: {} + tables: + equipment: + constraints: + - deferrable: 1 + expression: '' + fields: + - uuid + match_type: '' + name: '' + on_delete: '' + on_update: '' + options: [] + reference_fields: [] + reference_table: '' + type: PRIMARY KEY + fields: + uuid: + data_type: uuid + default_value: ~ + is_nullable: 0 + is_primary_key: 1 + is_unique: 0 + name: uuid + order: 1 + size: + - 0 + indices: [] + name: equipment + options: [] + order: 1 + equipment_items: + constraints: + - deferrable: 1 + expression: '' + fields: + - kind + - equipment + match_type: '' + name: '' + on_delete: '' + on_update: '' + options: [] + reference_fields: [] + reference_table: '' + type: PRIMARY KEY + - deferrable: 1 + expression: '' + fields: + - equipment + match_type: '' + name: equipment_items_fk_equipment + on_delete: CASCADE + on_update: CASCADE + options: [] + reference_fields: + - uuid + reference_table: equipment + type: FOREIGN KEY + fields: + equipment: + data_type: uuid + default_value: ~ + is_nullable: 0 + is_primary_key: 1 + is_unique: 0 + name: equipment + order: 2 + size: + - 0 + identifier: + data_type: text + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: identifier + order: 3 + size: + - 0 + kind: + data_type: text + default_value: ~ + is_nullable: 0 + is_primary_key: 1 + is_unique: 0 + name: kind + order: 1 + size: + - 0 + quantity: + data_type: Integer + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: quantity + order: 4 + size: + - 0 + indices: + - fields: + - equipment + name: equipment_items_idx_equipment + options: [] + type: NORMAL + name: equipment_items + options: [] + order: 6 + inventories: + constraints: + - deferrable: 1 + expression: '' + fields: + - uuid + match_type: '' + name: '' + on_delete: '' + on_update: '' + options: [] + reference_fields: [] + reference_table: '' + type: PRIMARY KEY + fields: + uuid: + data_type: uuid + default_value: ~ + is_nullable: 0 + is_primary_key: 1 + is_unique: 0 + name: uuid + order: 1 + size: + - 0 + indices: [] + name: inventories + options: [] + order: 2 + inventory_items: + constraints: + - deferrable: 1 + expression: '' + fields: + - uuid + match_type: '' + name: '' + on_delete: '' + on_update: '' + options: [] + reference_fields: [] + reference_table: '' + type: PRIMARY KEY + - deferrable: 1 + expression: '' + fields: + - inventory + - identifier + match_type: '' + name: inventory_items_unique_item + on_delete: '' + on_update: '' + options: [] + reference_fields: [] + reference_table: '' + type: UNIQUE + - deferrable: 1 + expression: '' + fields: + - inventory + match_type: '' + name: inventory_items_fk_inventory + on_delete: CASCADE + on_update: CASCADE + options: [] + reference_fields: + - uuid + reference_table: inventories + type: FOREIGN KEY + fields: + identifier: + data_type: text + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 1 + name: identifier + order: 3 + size: + - 0 + inventory: + data_type: uuid + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 1 + name: inventory + order: 2 + size: + - 0 + quantity: + data_type: Integer + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: quantity + order: 4 + size: + - 0 + uuid: + data_type: uuid + default_value: !!perl/ref + =: uuid_generate_v4() + is_nullable: 0 + is_primary_key: 1 + is_unique: 0 + name: uuid + order: 1 + size: + - 0 + indices: + - fields: + - inventory + name: inventory_items_idx_inventory + options: [] + type: NORMAL + name: inventory_items + options: [] + order: 7 + player_companion_npcs: + constraints: + - deferrable: 1 + expression: '' + fields: + - uuid + match_type: '' + name: '' + on_delete: '' + on_update: '' + options: [] + reference_fields: [] + reference_table: '' + type: PRIMARY KEY + - deferrable: 1 + expression: '' + fields: + - equipment + match_type: '' + name: player_companion_npcs_fk_equipment + on_delete: '' + on_update: '' + options: [] + reference_fields: + - uuid + reference_table: equipment + type: FOREIGN KEY + - deferrable: 1 + expression: '' + fields: + - inventory + match_type: '' + name: player_companion_npcs_fk_inventory + on_delete: '' + on_update: '' + options: [] + reference_fields: + - uuid + reference_table: inventories + type: FOREIGN KEY + - deferrable: 1 + expression: '' + fields: + - owner + match_type: '' + name: player_companion_npcs_fk_owner + on_delete: CASCADE + on_update: CASCADE + options: [] + reference_fields: + - uuid + reference_table: player_pjs + type: FOREIGN KEY + - deferrable: 1 + expression: '' + fields: + - skills + match_type: '' + name: player_companion_npcs_fk_skills + on_delete: '' + on_update: '' + options: [] + reference_fields: + - uuid + reference_table: skill_like_lists + type: FOREIGN KEY + - deferrable: 1 + expression: '' + fields: + - spells + match_type: '' + name: player_companion_npcs_fk_spells + on_delete: '' + on_update: '' + options: [] + reference_fields: + - uuid + reference_table: skill_like_lists + type: FOREIGN KEY + - deferrable: 1 + expression: '' + fields: + - stats + match_type: '' + name: player_companion_npcs_fk_stats + on_delete: '' + on_update: '' + options: [] + reference_fields: + - uuid + reference_table: stats + type: FOREIGN KEY + fields: + equipment: + data_type: uuid + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: equipment + order: 8 + size: + - 0 + exp: + data_type: integer + default_value: !!perl/ref + =: 1 + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: exp + order: 7 + size: + - 0 + identifier: + data_type: text + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: identifier + order: 3 + size: + - 0 + inventory: + data_type: uuid + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: inventory + order: 12 + size: + - 0 + level: + data_type: integer + default_value: !!perl/ref + =: 1 + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: level + order: 6 + size: + - 0 + nick: + data_type: text + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: nick + order: 4 + size: + - 0 + owner: + data_type: uuid + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: owner + order: 2 + size: + - 0 + race: + data_type: text + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: race + order: 5 + size: + - 0 + skills: + data_type: uuid + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: skills + order: 10 + size: + - 0 + spells: + data_type: uuid + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: spells + order: 11 + size: + - 0 + stats: + data_type: uuid + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: stats + order: 9 + size: + - 0 + uuid: + data_type: uuid + default_value: !!perl/ref + =: uuid_generate_v4() + is_nullable: 0 + is_primary_key: 1 + is_unique: 0 + name: uuid + order: 1 + size: + - 0 + indices: + - fields: + - equipment + name: player_companion_npcs_idx_equipment + options: [] + type: NORMAL + - fields: + - inventory + name: player_companion_npcs_idx_inventory + options: [] + type: NORMAL + - fields: + - owner + name: player_companion_npcs_idx_owner + options: [] + type: NORMAL + - fields: + - skills + name: player_companion_npcs_idx_skills + options: [] + type: NORMAL + - fields: + - spells + name: player_companion_npcs_idx_spells + options: [] + type: NORMAL + - fields: + - stats + name: player_companion_npcs_idx_stats + options: [] + type: NORMAL + name: player_companion_npcs + options: [] + order: 11 + player_pjs: + constraints: + - deferrable: 1 + expression: '' + fields: + - uuid + match_type: '' + name: '' + on_delete: '' + on_update: '' + options: [] + reference_fields: [] + reference_table: '' + type: PRIMARY KEY + - deferrable: 1 + expression: '' + fields: + - born_stats + match_type: '' + name: player_pjs_fk_born_stats + on_delete: '' + on_update: '' + options: [] + reference_fields: + - uuid + reference_table: stats + type: FOREIGN KEY + - deferrable: 1 + expression: '' + fields: + - equipment + match_type: '' + name: player_pjs_fk_equipment + on_delete: '' + on_update: '' + options: [] + reference_fields: + - uuid + reference_table: equipment + type: FOREIGN KEY + - deferrable: 1 + expression: '' + fields: + - inventory + match_type: '' + name: player_pjs_fk_inventory + on_delete: '' + on_update: '' + options: [] + reference_fields: + - uuid + reference_table: inventories + type: FOREIGN KEY + - deferrable: 1 + expression: '' + fields: + - owner + match_type: '' + name: player_pjs_fk_owner + on_delete: CASCADE + on_update: CASCADE + options: [] + reference_fields: + - uuid + reference_table: players + type: FOREIGN KEY + - deferrable: 1 + expression: '' + fields: + - skills + match_type: '' + name: player_pjs_fk_skills + on_delete: '' + on_update: '' + options: [] + reference_fields: + - uuid + reference_table: skill_like_lists + type: FOREIGN KEY + - deferrable: 1 + expression: '' + fields: + - spells + match_type: '' + name: player_pjs_fk_spells + on_delete: '' + on_update: '' + options: [] + reference_fields: + - uuid + reference_table: skill_like_lists + type: FOREIGN KEY + - deferrable: 1 + expression: '' + fields: + - team + match_type: '' + name: player_pjs_fk_team + on_delete: CASCADE + on_update: CASCADE + options: [] + reference_fields: + - uuid + reference_table: teams + type: FOREIGN KEY + - deferrable: 1 + expression: '' + fields: + - training_stats + match_type: '' + name: player_pjs_fk_training_stats + on_delete: '' + on_update: '' + options: [] + reference_fields: + - uuid + reference_table: stats + type: FOREIGN KEY + fields: + born_stats: + data_type: uuid + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: born_stats + order: 12 + size: + - 0 + creation_date: + data_type: timestamp + default_value: !!perl/ref + =: NOW() + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: creation_date + order: 8 + size: + - 0 + equipment: + data_type: uuid + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: equipment + order: 11 + size: + - 0 + experience: + data_type: integer + default_value: !!perl/ref + =: 1 + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: experience + order: 10 + size: + - 0 + full_name: + data_type: text + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: full_name + order: 3 + size: + - 0 + health: + data_type: integer + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: health + order: 17 + size: + - 0 + inventory: + data_type: uuid + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: inventory + order: 16 + size: + - 0 + last_activity: + data_type: timestamp + default_value: !!perl/ref + =: NOW() + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: last_activity + order: 9 + size: + - 0 + mana: + data_type: integer + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: mana + order: 18 + size: + - 0 + nick: + data_type: text + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: nick + order: 5 + size: + - 0 + owner: + data_type: uuid + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: owner + order: 2 + size: + - 0 + race: + data_type: text + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: race + order: 6 + size: + - 0 + short_name: + data_type: text + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: short_name + order: 4 + size: + - 0 + skills: + data_type: uuid + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: skills + order: 14 + size: + - 0 + spells: + data_type: uuid + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: spells + order: 15 + size: + - 0 + team: + data_type: uuid + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: team + order: 7 + size: + - 0 + training_stats: + data_type: uuid + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: training_stats + order: 13 + size: + - 0 + uuid: + data_type: uuid + default_value: !!perl/ref + =: uuid_generate_v4() + is_nullable: 0 + is_primary_key: 1 + is_unique: 0 + name: uuid + order: 1 + size: + - 0 + indices: + - fields: + - born_stats + name: player_pjs_idx_born_stats + options: [] + type: NORMAL + - fields: + - equipment + name: player_pjs_idx_equipment + options: [] + type: NORMAL + - fields: + - inventory + name: player_pjs_idx_inventory + options: [] + type: NORMAL + - fields: + - owner + name: player_pjs_idx_owner + options: [] + type: NORMAL + - fields: + - skills + name: player_pjs_idx_skills + options: [] + type: NORMAL + - fields: + - spells + name: player_pjs_idx_spells + options: [] + type: NORMAL + - fields: + - team + name: player_pjs_idx_team + options: [] + type: NORMAL + - fields: + - training_stats + name: player_pjs_idx_training_stats + options: [] + type: NORMAL + name: player_pjs + options: [] + order: 10 + player_pjs_flags: + constraints: + - deferrable: 1 + expression: '' + fields: + - owner + - name + match_type: '' + name: '' + on_delete: '' + on_update: '' + options: [] + reference_fields: [] + reference_table: '' + type: PRIMARY KEY + - deferrable: 1 + expression: '' + fields: + - owner + match_type: '' + name: player_pjs_flags_fk_owner + on_delete: CASCADE + on_update: CASCADE + options: [] + reference_fields: + - uuid + reference_table: player_pjs + type: FOREIGN KEY + fields: + name: + data_type: text + default_value: ~ + is_nullable: 0 + is_primary_key: 1 + is_unique: 0 + name: name + order: 1 + size: + - 0 + owner: + data_type: uuid + default_value: ~ + is_nullable: 0 + is_primary_key: 1 + is_unique: 0 + name: owner + order: 2 + size: + - 0 + indices: + - fields: + - owner + name: player_pjs_flags_idx_owner + options: [] + type: NORMAL + - fields: + - owner + - name + name: index_flag + options: [] + type: NORMAL + name: player_pjs_flags + options: [] + order: 12 + player_pjs_log: + constraints: + - deferrable: 1 + expression: '' + fields: + - uuid + match_type: '' + name: '' + on_delete: '' + on_update: '' + options: [] + reference_fields: [] + reference_table: '' + type: PRIMARY KEY + - deferrable: 1 + expression: '' + fields: + - owner + match_type: '' + name: player_pjs_log_fk_owner + on_delete: CASCADE + on_update: CASCADE + options: [] + reference_fields: + - uuid + reference_table: player_pjs + type: FOREIGN KEY + fields: + content: + data_type: jsonb + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: content + order: 2 + size: + - 0 + date: + data_type: timestamp + default_value: !!perl/ref + =: NOW() + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: date + order: 4 + size: + - 0 + owner: + data_type: uuid + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: owner + order: 3 + size: + - 0 + uuid: + data_type: uuid + default_value: ~ + is_nullable: 0 + is_primary_key: 1 + is_unique: 0 + name: uuid + order: 1 + size: + - 0 + indices: + - fields: + - owner + name: player_pjs_log_idx_owner + options: [] + type: NORMAL + - fields: + - owner + - date + name: index_log + options: [] + type: NORMAL + name: player_pjs_log + options: [] + order: 13 + players: + constraints: + - deferrable: 1 + expression: '' + fields: + - uuid + match_type: '' + name: '' + on_delete: '' + on_update: '' + options: [] + reference_fields: [] + reference_table: '' + type: PRIMARY KEY + - deferrable: 1 + expression: '' + fields: + - email + match_type: '' + name: unique_constraint_email + on_delete: '' + on_update: '' + options: [] + reference_fields: [] + reference_table: '' + type: UNIQUE + - deferrable: 1 + expression: '' + fields: + - username + match_type: '' + name: unique_constraint_username + on_delete: '' + on_update: '' + options: [] + reference_fields: [] + reference_table: '' + type: UNIQUE + fields: + email: + data_type: text + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 1 + name: email + order: 4 + size: + - 0 + encrypted_password: + data_type: text + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: encrypted_password + order: 3 + size: + - 0 + last_activity: + data_type: timestamp + default_value: !!perl/ref + =: NOW() + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: last_activity + order: 8 + size: + - 0 + register_date: + data_type: timestamp + default_value: !!perl/ref + =: NOW() + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: register_date + order: 7 + size: + - 0 + username: + data_type: text + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 1 + name: username + order: 2 + size: + - 0 + uuid: + data_type: uuid + default_value: ~ + is_nullable: 0 + is_primary_key: 1 + is_unique: 0 + name: uuid + order: 1 + size: + - 0 + verification_token: + data_type: text + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: verification_token + order: 6 + size: + - 0 + verified: + data_type: boolean + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: verified + order: 5 + size: + - 0 + indices: [] + name: players + options: [] + order: 3 + skill_like_items: + constraints: + - deferrable: 1 + expression: '' + fields: + - identifier + - owner_list + match_type: '' + name: '' + on_delete: '' + on_update: '' + options: [] + reference_fields: [] + reference_table: '' + type: PRIMARY KEY + - deferrable: 1 + expression: '' + fields: + - owner_list + match_type: '' + name: skill_like_items_fk_owner_list + on_delete: CASCADE + on_update: CASCADE + options: [] + reference_fields: + - uuid + reference_table: skill_like_lists + type: FOREIGN KEY + fields: + identifier: + data_type: text + default_value: ~ + is_nullable: 0 + is_primary_key: 1 + is_unique: 0 + name: identifier + order: 1 + size: + - 0 + level: + data_type: integer + default_value: !!perl/ref + =: 1 + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: level + order: 3 + size: + - 0 + owner_list: + data_type: uuid + default_value: ~ + is_nullable: 0 + is_primary_key: 1 + is_unique: 0 + name: owner_list + order: 2 + size: + - 0 + indices: + - fields: + - owner_list + name: skill_like_items_idx_owner_list + options: [] + type: NORMAL + name: skill_like_items + options: [] + order: 8 + skill_like_lists: + constraints: + - deferrable: 1 + expression: '' + fields: + - uuid + match_type: '' + name: '' + on_delete: '' + on_update: '' + options: [] + reference_fields: [] + reference_table: '' + type: PRIMARY KEY + fields: + uuid: + data_type: uuid + default_value: !!perl/ref + =: uuid_generate_v4() + is_nullable: 0 + is_primary_key: 1 + is_unique: 0 + name: uuid + order: 1 + size: + - 0 + indices: [] + name: skill_like_lists + options: [] + order: 4 + stats: + constraints: + - deferrable: 1 + expression: '' + fields: + - uuid + match_type: '' + name: '' + on_delete: '' + on_update: '' + options: [] + reference_fields: [] + reference_table: '' + type: PRIMARY KEY + fields: + health: + data_type: integer + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: health + order: 2 + size: + - 0 + intelligence: + data_type: integer + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: intelligence + order: 8 + size: + - 0 + magic: + data_type: integer + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: magic + order: 6 + size: + - 0 + mana: + data_type: integer + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: mana + order: 3 + size: + - 0 + resistance: + data_type: integer + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: resistance + order: 5 + size: + - 0 + speed: + data_type: integer + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: speed + order: 7 + size: + - 0 + strength: + data_type: integer + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: strength + order: 4 + size: + - 0 + uuid: + data_type: uuid + default_value: ~ + is_nullable: 0 + is_primary_key: 1 + is_unique: 0 + name: uuid + order: 1 + size: + - 0 + indices: [] + name: stats + options: [] + order: 5 + teams: + constraints: + - deferrable: 1 + expression: '' + fields: + - uuid + match_type: '' + name: '' + on_delete: '' + on_update: '' + options: [] + reference_fields: [] + reference_table: '' + type: PRIMARY KEY + - deferrable: 1 + expression: '' + fields: + - name + match_type: '' + name: u_name + on_delete: '' + on_update: '' + options: [] + reference_fields: [] + reference_table: '' + type: UNIQUE + - deferrable: 1 + expression: '' + fields: + - leader + match_type: '' + name: teams_fk_leader + on_delete: '' + on_update: '' + options: [] + reference_fields: + - uuid + reference_table: player_pjs + type: FOREIGN KEY + fields: + area: + data_type: text + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: area + order: 8 + size: + - 0 + explore_frame: + data_type: integer + default_value: !!perl/ref + =: 0 + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: explore_frame + order: 3 + size: + - 0 + is_exploring: + data_type: boolean + default_value: !!perl/ref + =: false + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: is_exploring + order: 2 + size: + - 0 + leader: + data_type: uuid + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: leader + order: 4 + size: + - 0 + location: + data_type: text + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: location + order: 9 + size: + - 0 + name: + data_type: text + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 1 + name: name + order: 5 + size: + - 0 + planet: + data_type: text + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: planet + order: 6 + size: + - 0 + super_area: + data_type: text + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: super_area + order: 7 + size: + - 0 + uuid: + data_type: uuid + default_value: ~ + is_nullable: 0 + is_primary_key: 1 + is_unique: 0 + name: uuid + order: 1 + size: + - 0 + indices: + - fields: + - leader + name: teams_idx_leader + options: [] + type: NORMAL + name: teams + options: [] + order: 9 + triggers: {} + views: {} +translator: + add_drop_table: 0 + filename: ~ + no_comments: 0 + parser_args: + sources: + - CompanionNPC + - Equipment + - EquipmentItem + - Inventory + - InventoryItem + - PJ + - PJFlag + - PJLog + - Player + - SkillLikeItem + - SkillLikeList + - Stats + - Team + parser_type: SQL::Translator::Parser::DBIx::Class + producer_args: {} + producer_type: SQL::Translator::Producer::YAML + show_warnings: 0 + trace: 0 + version: 1.63 diff --git a/dbicdh/_source/deploy/7/001-auto.yml b/dbicdh/_source/deploy/7/001-auto.yml new file mode 100644 index 0000000..daff5c0 --- /dev/null +++ b/dbicdh/_source/deploy/7/001-auto.yml @@ -0,0 +1,1467 @@ +--- +schema: + procedures: {} + tables: + equipment: + constraints: + - deferrable: 1 + expression: '' + fields: + - uuid + match_type: '' + name: '' + on_delete: '' + on_update: '' + options: [] + reference_fields: [] + reference_table: '' + type: PRIMARY KEY + fields: + uuid: + data_type: uuid + default_value: ~ + is_nullable: 0 + is_primary_key: 1 + is_unique: 0 + name: uuid + order: 1 + size: + - 0 + indices: [] + name: equipment + options: [] + order: 1 + equipment_items: + constraints: + - deferrable: 1 + expression: '' + fields: + - kind + - equipment + match_type: '' + name: '' + on_delete: '' + on_update: '' + options: [] + reference_fields: [] + reference_table: '' + type: PRIMARY KEY + - deferrable: 1 + expression: '' + fields: + - equipment + match_type: '' + name: equipment_items_fk_equipment + on_delete: CASCADE + on_update: CASCADE + options: [] + reference_fields: + - uuid + reference_table: equipment + type: FOREIGN KEY + fields: + equipment: + data_type: uuid + default_value: ~ + is_nullable: 0 + is_primary_key: 1 + is_unique: 0 + name: equipment + order: 2 + size: + - 0 + identifier: + data_type: text + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: identifier + order: 3 + size: + - 0 + kind: + data_type: text + default_value: ~ + is_nullable: 0 + is_primary_key: 1 + is_unique: 0 + name: kind + order: 1 + size: + - 0 + quantity: + data_type: Integer + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: quantity + order: 4 + size: + - 0 + indices: + - fields: + - equipment + name: equipment_items_idx_equipment + options: [] + type: NORMAL + name: equipment_items + options: [] + order: 6 + inventories: + constraints: + - deferrable: 1 + expression: '' + fields: + - uuid + match_type: '' + name: '' + on_delete: '' + on_update: '' + options: [] + reference_fields: [] + reference_table: '' + type: PRIMARY KEY + fields: + uuid: + data_type: uuid + default_value: ~ + is_nullable: 0 + is_primary_key: 1 + is_unique: 0 + name: uuid + order: 1 + size: + - 0 + indices: [] + name: inventories + options: [] + order: 2 + inventory_items: + constraints: + - deferrable: 1 + expression: '' + fields: + - uuid + match_type: '' + name: '' + on_delete: '' + on_update: '' + options: [] + reference_fields: [] + reference_table: '' + type: PRIMARY KEY + - deferrable: 1 + expression: '' + fields: + - inventory + - identifier + match_type: '' + name: inventory_items_unique_item + on_delete: '' + on_update: '' + options: [] + reference_fields: [] + reference_table: '' + type: UNIQUE + - deferrable: 1 + expression: '' + fields: + - inventory + match_type: '' + name: inventory_items_fk_inventory + on_delete: CASCADE + on_update: CASCADE + options: [] + reference_fields: + - uuid + reference_table: inventories + type: FOREIGN KEY + fields: + identifier: + data_type: text + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 1 + name: identifier + order: 3 + size: + - 0 + inventory: + data_type: uuid + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 1 + name: inventory + order: 2 + size: + - 0 + quantity: + data_type: Integer + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: quantity + order: 4 + size: + - 0 + uuid: + data_type: uuid + default_value: !!perl/ref + =: uuid_generate_v4() + is_nullable: 0 + is_primary_key: 1 + is_unique: 0 + name: uuid + order: 1 + size: + - 0 + indices: + - fields: + - inventory + name: inventory_items_idx_inventory + options: [] + type: NORMAL + name: inventory_items + options: [] + order: 7 + player_companion_npcs: + constraints: + - deferrable: 1 + expression: '' + fields: + - uuid + match_type: '' + name: '' + on_delete: '' + on_update: '' + options: [] + reference_fields: [] + reference_table: '' + type: PRIMARY KEY + - deferrable: 1 + expression: '' + fields: + - equipment + match_type: '' + name: player_companion_npcs_fk_equipment + on_delete: '' + on_update: '' + options: [] + reference_fields: + - uuid + reference_table: equipment + type: FOREIGN KEY + - deferrable: 1 + expression: '' + fields: + - inventory + match_type: '' + name: player_companion_npcs_fk_inventory + on_delete: '' + on_update: '' + options: [] + reference_fields: + - uuid + reference_table: inventories + type: FOREIGN KEY + - deferrable: 1 + expression: '' + fields: + - owner + match_type: '' + name: player_companion_npcs_fk_owner + on_delete: CASCADE + on_update: CASCADE + options: [] + reference_fields: + - uuid + reference_table: player_pjs + type: FOREIGN KEY + - deferrable: 1 + expression: '' + fields: + - skills + match_type: '' + name: player_companion_npcs_fk_skills + on_delete: '' + on_update: '' + options: [] + reference_fields: + - uuid + reference_table: skill_like_lists + type: FOREIGN KEY + - deferrable: 1 + expression: '' + fields: + - spells + match_type: '' + name: player_companion_npcs_fk_spells + on_delete: '' + on_update: '' + options: [] + reference_fields: + - uuid + reference_table: skill_like_lists + type: FOREIGN KEY + - deferrable: 1 + expression: '' + fields: + - stats + match_type: '' + name: player_companion_npcs_fk_stats + on_delete: '' + on_update: '' + options: [] + reference_fields: + - uuid + reference_table: stats + type: FOREIGN KEY + fields: + equipment: + data_type: uuid + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: equipment + order: 8 + size: + - 0 + exp: + data_type: integer + default_value: !!perl/ref + =: 1 + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: exp + order: 7 + size: + - 0 + identifier: + data_type: text + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: identifier + order: 3 + size: + - 0 + inventory: + data_type: uuid + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: inventory + order: 12 + size: + - 0 + level: + data_type: integer + default_value: !!perl/ref + =: 1 + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: level + order: 6 + size: + - 0 + nick: + data_type: text + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: nick + order: 4 + size: + - 0 + owner: + data_type: uuid + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: owner + order: 2 + size: + - 0 + race: + data_type: text + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: race + order: 5 + size: + - 0 + skills: + data_type: uuid + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: skills + order: 10 + size: + - 0 + spells: + data_type: uuid + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: spells + order: 11 + size: + - 0 + stats: + data_type: uuid + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: stats + order: 9 + size: + - 0 + uuid: + data_type: uuid + default_value: !!perl/ref + =: uuid_generate_v4() + is_nullable: 0 + is_primary_key: 1 + is_unique: 0 + name: uuid + order: 1 + size: + - 0 + indices: + - fields: + - equipment + name: player_companion_npcs_idx_equipment + options: [] + type: NORMAL + - fields: + - inventory + name: player_companion_npcs_idx_inventory + options: [] + type: NORMAL + - fields: + - owner + name: player_companion_npcs_idx_owner + options: [] + type: NORMAL + - fields: + - skills + name: player_companion_npcs_idx_skills + options: [] + type: NORMAL + - fields: + - spells + name: player_companion_npcs_idx_spells + options: [] + type: NORMAL + - fields: + - stats + name: player_companion_npcs_idx_stats + options: [] + type: NORMAL + name: player_companion_npcs + options: [] + order: 11 + player_pjs: + constraints: + - deferrable: 1 + expression: '' + fields: + - uuid + match_type: '' + name: '' + on_delete: '' + on_update: '' + options: [] + reference_fields: [] + reference_table: '' + type: PRIMARY KEY + - deferrable: 1 + expression: '' + fields: + - born_stats + match_type: '' + name: player_pjs_fk_born_stats + on_delete: '' + on_update: '' + options: [] + reference_fields: + - uuid + reference_table: stats + type: FOREIGN KEY + - deferrable: 1 + expression: '' + fields: + - equipment + match_type: '' + name: player_pjs_fk_equipment + on_delete: '' + on_update: '' + options: [] + reference_fields: + - uuid + reference_table: equipment + type: FOREIGN KEY + - deferrable: 1 + expression: '' + fields: + - inventory + match_type: '' + name: player_pjs_fk_inventory + on_delete: '' + on_update: '' + options: [] + reference_fields: + - uuid + reference_table: inventories + type: FOREIGN KEY + - deferrable: 1 + expression: '' + fields: + - owner + match_type: '' + name: player_pjs_fk_owner + on_delete: CASCADE + on_update: CASCADE + options: [] + reference_fields: + - uuid + reference_table: players + type: FOREIGN KEY + - deferrable: 1 + expression: '' + fields: + - skills + match_type: '' + name: player_pjs_fk_skills + on_delete: '' + on_update: '' + options: [] + reference_fields: + - uuid + reference_table: skill_like_lists + type: FOREIGN KEY + - deferrable: 1 + expression: '' + fields: + - spells + match_type: '' + name: player_pjs_fk_spells + on_delete: '' + on_update: '' + options: [] + reference_fields: + - uuid + reference_table: skill_like_lists + type: FOREIGN KEY + - deferrable: 1 + expression: '' + fields: + - team + match_type: '' + name: player_pjs_fk_team + on_delete: CASCADE + on_update: CASCADE + options: [] + reference_fields: + - uuid + reference_table: teams + type: FOREIGN KEY + - deferrable: 1 + expression: '' + fields: + - training_stats + match_type: '' + name: player_pjs_fk_training_stats + on_delete: '' + on_update: '' + options: [] + reference_fields: + - uuid + reference_table: stats + type: FOREIGN KEY + fields: + born_stats: + data_type: uuid + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: born_stats + order: 12 + size: + - 0 + creation_date: + data_type: timestamp + default_value: !!perl/ref + =: NOW() + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: creation_date + order: 8 + size: + - 0 + equipment: + data_type: uuid + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: equipment + order: 11 + size: + - 0 + experience: + data_type: integer + default_value: !!perl/ref + =: 1 + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: experience + order: 10 + size: + - 0 + full_name: + data_type: text + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: full_name + order: 3 + size: + - 0 + health: + data_type: integer + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: health + order: 17 + size: + - 0 + inventory: + data_type: uuid + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: inventory + order: 16 + size: + - 0 + last_activity: + data_type: timestamp + default_value: !!perl/ref + =: NOW() + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: last_activity + order: 9 + size: + - 0 + mana: + data_type: integer + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: mana + order: 18 + size: + - 0 + nick: + data_type: text + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: nick + order: 5 + size: + - 0 + owner: + data_type: uuid + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: owner + order: 2 + size: + - 0 + race: + data_type: text + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: race + order: 6 + size: + - 0 + short_name: + data_type: text + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: short_name + order: 4 + size: + - 0 + skills: + data_type: uuid + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: skills + order: 14 + size: + - 0 + spells: + data_type: uuid + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: spells + order: 15 + size: + - 0 + team: + data_type: uuid + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: team + order: 7 + size: + - 0 + training_stats: + data_type: uuid + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: training_stats + order: 13 + size: + - 0 + uuid: + data_type: uuid + default_value: !!perl/ref + =: uuid_generate_v4() + is_nullable: 0 + is_primary_key: 1 + is_unique: 0 + name: uuid + order: 1 + size: + - 0 + indices: + - fields: + - born_stats + name: player_pjs_idx_born_stats + options: [] + type: NORMAL + - fields: + - equipment + name: player_pjs_idx_equipment + options: [] + type: NORMAL + - fields: + - inventory + name: player_pjs_idx_inventory + options: [] + type: NORMAL + - fields: + - owner + name: player_pjs_idx_owner + options: [] + type: NORMAL + - fields: + - skills + name: player_pjs_idx_skills + options: [] + type: NORMAL + - fields: + - spells + name: player_pjs_idx_spells + options: [] + type: NORMAL + - fields: + - team + name: player_pjs_idx_team + options: [] + type: NORMAL + - fields: + - training_stats + name: player_pjs_idx_training_stats + options: [] + type: NORMAL + name: player_pjs + options: [] + order: 10 + player_pjs_flags: + constraints: + - deferrable: 1 + expression: '' + fields: + - owner + - name + match_type: '' + name: '' + on_delete: '' + on_update: '' + options: [] + reference_fields: [] + reference_table: '' + type: PRIMARY KEY + - deferrable: 1 + expression: '' + fields: + - owner + match_type: '' + name: player_pjs_flags_fk_owner + on_delete: CASCADE + on_update: CASCADE + options: [] + reference_fields: + - uuid + reference_table: player_pjs + type: FOREIGN KEY + fields: + name: + data_type: text + default_value: ~ + is_nullable: 0 + is_primary_key: 1 + is_unique: 0 + name: name + order: 1 + size: + - 0 + owner: + data_type: uuid + default_value: ~ + is_nullable: 0 + is_primary_key: 1 + is_unique: 0 + name: owner + order: 2 + size: + - 0 + indices: + - fields: + - owner + name: player_pjs_flags_idx_owner + options: [] + type: NORMAL + - fields: + - owner + - name + name: index_flag + options: [] + type: NORMAL + name: player_pjs_flags + options: [] + order: 12 + player_pjs_log: + constraints: + - deferrable: 1 + expression: '' + fields: + - uuid + match_type: '' + name: '' + on_delete: '' + on_update: '' + options: [] + reference_fields: [] + reference_table: '' + type: PRIMARY KEY + - deferrable: 1 + expression: '' + fields: + - owner + match_type: '' + name: player_pjs_log_fk_owner + on_delete: CASCADE + on_update: CASCADE + options: [] + reference_fields: + - uuid + reference_table: player_pjs + type: FOREIGN KEY + fields: + content: + data_type: jsonb + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: content + order: 2 + size: + - 0 + date: + data_type: timestamp + default_value: !!perl/ref + =: NOW() + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: date + order: 4 + size: + - 0 + owner: + data_type: uuid + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: owner + order: 3 + size: + - 0 + uuid: + data_type: uuid + default_value: ~ + is_nullable: 0 + is_primary_key: 1 + is_unique: 0 + name: uuid + order: 1 + size: + - 0 + indices: + - fields: + - owner + name: player_pjs_log_idx_owner + options: [] + type: NORMAL + - fields: + - owner + - date + name: index_log + options: [] + type: NORMAL + name: player_pjs_log + options: [] + order: 13 + players: + constraints: + - deferrable: 1 + expression: '' + fields: + - uuid + match_type: '' + name: '' + on_delete: '' + on_update: '' + options: [] + reference_fields: [] + reference_table: '' + type: PRIMARY KEY + - deferrable: 1 + expression: '' + fields: + - email + match_type: '' + name: unique_constraint_email + on_delete: '' + on_update: '' + options: [] + reference_fields: [] + reference_table: '' + type: UNIQUE + - deferrable: 1 + expression: '' + fields: + - username + match_type: '' + name: unique_constraint_username + on_delete: '' + on_update: '' + options: [] + reference_fields: [] + reference_table: '' + type: UNIQUE + fields: + email: + data_type: text + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 1 + name: email + order: 4 + size: + - 0 + encrypted_password: + data_type: text + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: encrypted_password + order: 3 + size: + - 0 + last_activity: + data_type: timestamp + default_value: !!perl/ref + =: NOW() + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: last_activity + order: 8 + size: + - 0 + register_date: + data_type: timestamp + default_value: !!perl/ref + =: NOW() + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: register_date + order: 7 + size: + - 0 + username: + data_type: text + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 1 + name: username + order: 2 + size: + - 0 + uuid: + data_type: uuid + default_value: ~ + is_nullable: 0 + is_primary_key: 1 + is_unique: 0 + name: uuid + order: 1 + size: + - 0 + verification_token: + data_type: text + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: verification_token + order: 6 + size: + - 0 + verified: + data_type: boolean + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: verified + order: 5 + size: + - 0 + indices: [] + name: players + options: [] + order: 3 + skill_like_items: + constraints: + - deferrable: 1 + expression: '' + fields: + - identifier + - owner_list + match_type: '' + name: '' + on_delete: '' + on_update: '' + options: [] + reference_fields: [] + reference_table: '' + type: PRIMARY KEY + - deferrable: 1 + expression: '' + fields: + - owner_list + match_type: '' + name: skill_like_items_fk_owner_list + on_delete: CASCADE + on_update: CASCADE + options: [] + reference_fields: + - uuid + reference_table: skill_like_lists + type: FOREIGN KEY + fields: + identifier: + data_type: text + default_value: ~ + is_nullable: 0 + is_primary_key: 1 + is_unique: 0 + name: identifier + order: 1 + size: + - 0 + level: + data_type: integer + default_value: !!perl/ref + =: 1 + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: level + order: 3 + size: + - 0 + owner_list: + data_type: uuid + default_value: ~ + is_nullable: 0 + is_primary_key: 1 + is_unique: 0 + name: owner_list + order: 2 + size: + - 0 + indices: + - fields: + - owner_list + name: skill_like_items_idx_owner_list + options: [] + type: NORMAL + name: skill_like_items + options: [] + order: 8 + skill_like_lists: + constraints: + - deferrable: 1 + expression: '' + fields: + - uuid + match_type: '' + name: '' + on_delete: '' + on_update: '' + options: [] + reference_fields: [] + reference_table: '' + type: PRIMARY KEY + fields: + uuid: + data_type: uuid + default_value: !!perl/ref + =: uuid_generate_v4() + is_nullable: 0 + is_primary_key: 1 + is_unique: 0 + name: uuid + order: 1 + size: + - 0 + indices: [] + name: skill_like_lists + options: [] + order: 4 + stats: + constraints: + - deferrable: 1 + expression: '' + fields: + - uuid + match_type: '' + name: '' + on_delete: '' + on_update: '' + options: [] + reference_fields: [] + reference_table: '' + type: PRIMARY KEY + fields: + health: + data_type: integer + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: health + order: 2 + size: + - 0 + intelligence: + data_type: integer + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: intelligence + order: 8 + size: + - 0 + magic: + data_type: integer + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: magic + order: 6 + size: + - 0 + mana: + data_type: integer + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: mana + order: 3 + size: + - 0 + resistance: + data_type: integer + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: resistance + order: 5 + size: + - 0 + speed: + data_type: integer + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: speed + order: 7 + size: + - 0 + strength: + data_type: integer + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: strength + order: 4 + size: + - 0 + uuid: + data_type: uuid + default_value: ~ + is_nullable: 0 + is_primary_key: 1 + is_unique: 0 + name: uuid + order: 1 + size: + - 0 + indices: [] + name: stats + options: [] + order: 5 + teams: + constraints: + - deferrable: 1 + expression: '' + fields: + - uuid + match_type: '' + name: '' + on_delete: '' + on_update: '' + options: [] + reference_fields: [] + reference_table: '' + type: PRIMARY KEY + - deferrable: 1 + expression: '' + fields: + - name + match_type: '' + name: u_name + on_delete: '' + on_update: '' + options: [] + reference_fields: [] + reference_table: '' + type: UNIQUE + - deferrable: 1 + expression: '' + fields: + - leader + match_type: '' + name: teams_fk_leader + on_delete: '' + on_update: '' + options: [] + reference_fields: + - uuid + reference_table: player_pjs + type: FOREIGN KEY + fields: + area: + data_type: text + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: area + order: 8 + size: + - 0 + explore_frame: + data_type: integer + default_value: !!perl/ref + =: 0 + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: explore_frame + order: 3 + size: + - 0 + is_exploring: + data_type: boolean + default_value: !!perl/ref + =: false + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: is_exploring + order: 2 + size: + - 0 + leader: + data_type: uuid + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: leader + order: 4 + size: + - 0 + location: + data_type: text + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: location + order: 9 + size: + - 0 + name: + data_type: text + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 1 + name: name + order: 5 + size: + - 0 + planet: + data_type: text + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: planet + order: 6 + size: + - 0 + super_area: + data_type: text + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: super_area + order: 7 + size: + - 0 + uuid: + data_type: uuid + default_value: ~ + is_nullable: 0 + is_primary_key: 1 + is_unique: 0 + name: uuid + order: 1 + size: + - 0 + indices: + - fields: + - leader + name: teams_idx_leader + options: [] + type: NORMAL + name: teams + options: [] + order: 9 + triggers: {} + views: {} +translator: + add_drop_table: 0 + filename: ~ + no_comments: 0 + parser_args: + sources: + - CompanionNPC + - Equipment + - EquipmentItem + - Inventory + - InventoryItem + - PJ + - PJFlag + - PJLog + - Player + - SkillLikeItem + - SkillLikeList + - Stats + - Team + parser_type: SQL::Translator::Parser::DBIx::Class + producer_args: {} + producer_type: SQL::Translator::Producer::YAML + show_warnings: 0 + trace: 0 + version: 1.63 diff --git a/js-src/components/game.tsx b/js-src/components/game.tsx index 1a4d448..159a27b 100644 --- a/js-src/components/game.tsx +++ b/js-src/components/game.tsx @@ -77,7 +77,7 @@ export default function Game (props: GameProps): JSX.Element { } return websocket }) - }, 500) + }, 100) return ( <> post('/player/check_login')->to('Player#check_login'); $r->post('/pj/create')->to('PJ#create');; $r->websocket('/ws')->to('Websocket#ws'); + $self->hook(before_server_start => sub ($server, $self) { + require LasTres::EventLoop; + LasTres::EventLoop->new->loop; + }); } 1; diff --git a/lib/LasTres/EventLoop.pm b/lib/LasTres/EventLoop.pm new file mode 100644 index 0000000..18ffafc --- /dev/null +++ b/lib/LasTres/EventLoop.pm @@ -0,0 +1,75 @@ +package LasTres::EventLoop; + +use v5.36.0; + +use strict; +use warnings; + +use feature 'signatures'; + +use Moo; + +has _app => ( + is => 'lazy' +); + +has _schema => ( + is => 'lazy' +); + +has _redis => ( + is => 'lazy' +); + +sub _build__app { + require LasTres; + return LasTres->new; +} + +sub _build__schema { + require LasTres::Schema; + return LasTres::Schema->Schema; +} + +sub _build__redis { + require LasTres::Redis; + return LasTres::Redis->new; +} + +sub _exit_the_program { + exit 0; +} + +$SIG{CHLD} = 'IGNORE'; +$SIG{INT} = \&_exit_the_program; +$SIG{QUIT} = \&_exit_the_program; +$SIG{TERM} = \&_exit_the_program; + +sub loop($self) { + my $child_pid = fork; + if ($child_pid) { + $self->_real_loop; + } +} + +sub _work_frame($self) { + my $schema = $self->_schema; + say 'Starting frame work.'; + sleep int(rand(30)); + say 'Ending frame work.'; +} + +sub _real_loop($self) { + my $redis = $self->_redis; + while (1) { + if (!defined $redis->db->get($redis->executing_frame_key)) { + $redis->db->setex($redis->executing_frame_key, 10, 1); + $self->_work_frame; + } + my $ttl = $redis->db->ttl($redis->executing_frame_key); + if ($ttl > 0) { + sleep $ttl; + } + } +} +1; diff --git a/lib/LasTres/Redis.pm b/lib/LasTres/Redis.pm index eb423e0..d6e6dcf 100644 --- a/lib/LasTres/Redis.pm +++ b/lib/LasTres/Redis.pm @@ -40,4 +40,7 @@ sub publish($self, $topic, $message) { sub pj_subscription($class, $pj) { return prefix() . '::Subscriptions::PJ::' . $pj->uuid; } +sub executing_frame_key($class) { + return prefix() . '::Key::Frame'; +} 1; diff --git a/lib/LasTres/Schema/Result/Team.pm b/lib/LasTres/Schema/Result/Team.pm index 05b510e..1e3a5bc 100644 --- a/lib/LasTres/Schema/Result/Team.pm +++ b/lib/LasTres/Schema/Result/Team.pm @@ -16,6 +16,16 @@ __PACKAGE__->add_columns( data_type => 'uuid', is_nullable => 0, }, + is_exploring => { + data_type => 'boolean', + is_nullable => 0, + default_value => \'false', + }, + explore_frame => { + data_type => 'integer', + is_nullable => 0, + default_value => \'0', + }, leader => { data_type => 'uuid', is_nullable => 1, diff --git a/public/img/devota.png b/public/img/devota.png new file mode 100644 index 0000000000000000000000000000000000000000..664e146520bf4efff571de5b889f94e817a92f80 GIT binary patch literal 137253 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

`a%RvIH5@jFk2m=1ktthX^< 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 literal 0 HcmV?d00001 diff --git a/public/js/bundle.js b/public/js/bundle.js index ae4bf14..19d0091 100644 --- a/public/js/bundle.js +++ b/public/js/bundle.js @@ -96,7 +96,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac \************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ Game)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _lastres_components_upper_panel__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @lastres/components/upper-panel */ \"./js-src/components/upper-panel.tsx\");\n/* harmony import */ var _lastres_components_bottom_panel__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @lastres/components/bottom-panel */ \"./js-src/components/bottom-panel.tsx\");\n/* harmony import */ var _lastres_components_pj_selection_menu__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @lastres/components/pj-selection-menu */ \"./js-src/components/pj-selection-menu.tsx\");\n/* harmony import */ var _lastres_output_packet_init__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @lastres/output-packet/init */ \"./js-src/output-packet/init.ts\");\n/* harmony import */ var _lastres_output_packet_ping__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @lastres/output-packet/ping */ \"./js-src/output-packet/ping.ts\");\n/* harmony import */ var _lastres_input_packets__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @lastres/input-packets */ \"./js-src/input-packets.ts\");\n\n\n\n\n\n\n\nfunction Game(props) {\n const selectedPJ = props.selectedPJ;\n if (selectedPJ === null) {\n return (react__WEBPACK_IMPORTED_MODULE_0__.createElement(react__WEBPACK_IMPORTED_MODULE_0__.Fragment, null,\n react__WEBPACK_IMPORTED_MODULE_0__.createElement(_lastres_components_pj_selection_menu__WEBPACK_IMPORTED_MODULE_3__[\"default\"], { setSelectedPJ: props.setSelectedPJ, userWantsToCreatePJ: props.userWantsToCreatePJ, setUserWantsToCreatePJ: props.setUserWantsToCreatePJ, error: props.error, setError: props.setError })));\n }\n const [websocket, setWebsocket] = react__WEBPACK_IMPORTED_MODULE_0__.useState(null);\n const [teamPJs, setTeamPJs] = react__WEBPACK_IMPORTED_MODULE_0__.useState(null);\n const [currentLocation, setCurrentLocation] = react__WEBPACK_IMPORTED_MODULE_0__.useState(null);\n const [connectedLocations, setConnectedLocations] = react__WEBPACK_IMPORTED_MODULE_0__.useState(null);\n const [logLines, setLogLines] = react__WEBPACK_IMPORTED_MODULE_0__.useState(null);\n const [error, setError] = react__WEBPACK_IMPORTED_MODULE_0__.useState(null);\n const [scrollLog, setScrollLog] = react__WEBPACK_IMPORTED_MODULE_0__.useState(null);\n const logPresentationRef = react__WEBPACK_IMPORTED_MODULE_0__.useRef(null);\n window.setTimeout(() => {\n setWebsocket((websocket) => {\n if (websocket === null) {\n const locationProtocol = window.location.protocol;\n if (locationProtocol == null) {\n return null;\n }\n const protocol = locationProtocol.match(/https:/) != null ? 'wss' : 'ws';\n const webSocket = new WebSocket(`${protocol}://${window.location.host}/ws`);\n webSocket.onopen = () => {\n new _lastres_output_packet_init__WEBPACK_IMPORTED_MODULE_4__[\"default\"](selectedPJ.uuid).send(webSocket);\n let interval = 0;\n interval = window.setInterval(() => {\n if (webSocket.readyState === WebSocket.OPEN) {\n new _lastres_output_packet_ping__WEBPACK_IMPORTED_MODULE_5__[\"default\"]().send(webSocket);\n return;\n }\n window.clearInterval(interval);\n }, 250000);\n };\n const inputPackets = new _lastres_input_packets__WEBPACK_IMPORTED_MODULE_6__[\"default\"](setTeamPJs, setCurrentLocation, setConnectedLocations, logLines, setLogLines, setError, setScrollLog, logPresentationRef);\n webSocket.onmessage = (event) => {\n const packet = JSON.parse(event.data);\n inputPackets.handle(packet);\n };\n webSocket.onerror = (event) => {\n console.log(event);\n };\n return webSocket;\n }\n return websocket;\n });\n }, 500);\n return (react__WEBPACK_IMPORTED_MODULE_0__.createElement(react__WEBPACK_IMPORTED_MODULE_0__.Fragment, null,\n react__WEBPACK_IMPORTED_MODULE_0__.createElement(_lastres_components_upper_panel__WEBPACK_IMPORTED_MODULE_1__[\"default\"], { teamPJs: teamPJs, currentLocation: currentLocation, connectedLocations: connectedLocations, logLines: logLines, websocket: websocket, logPresentationRef: logPresentationRef }),\n react__WEBPACK_IMPORTED_MODULE_0__.createElement(_lastres_components_bottom_panel__WEBPACK_IMPORTED_MODULE_2__[\"default\"], null)));\n}\n\n\n//# sourceURL=webpack://LasTres/./js-src/components/game.tsx?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ Game)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _lastres_components_upper_panel__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @lastres/components/upper-panel */ \"./js-src/components/upper-panel.tsx\");\n/* harmony import */ var _lastres_components_bottom_panel__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @lastres/components/bottom-panel */ \"./js-src/components/bottom-panel.tsx\");\n/* harmony import */ var _lastres_components_pj_selection_menu__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @lastres/components/pj-selection-menu */ \"./js-src/components/pj-selection-menu.tsx\");\n/* harmony import */ var _lastres_output_packet_init__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @lastres/output-packet/init */ \"./js-src/output-packet/init.ts\");\n/* harmony import */ var _lastres_output_packet_ping__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @lastres/output-packet/ping */ \"./js-src/output-packet/ping.ts\");\n/* harmony import */ var _lastres_input_packets__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @lastres/input-packets */ \"./js-src/input-packets.ts\");\n\n\n\n\n\n\n\nfunction Game(props) {\n const selectedPJ = props.selectedPJ;\n if (selectedPJ === null) {\n return (react__WEBPACK_IMPORTED_MODULE_0__.createElement(react__WEBPACK_IMPORTED_MODULE_0__.Fragment, null,\n react__WEBPACK_IMPORTED_MODULE_0__.createElement(_lastres_components_pj_selection_menu__WEBPACK_IMPORTED_MODULE_3__[\"default\"], { setSelectedPJ: props.setSelectedPJ, userWantsToCreatePJ: props.userWantsToCreatePJ, setUserWantsToCreatePJ: props.setUserWantsToCreatePJ, error: props.error, setError: props.setError })));\n }\n const [websocket, setWebsocket] = react__WEBPACK_IMPORTED_MODULE_0__.useState(null);\n const [teamPJs, setTeamPJs] = react__WEBPACK_IMPORTED_MODULE_0__.useState(null);\n const [currentLocation, setCurrentLocation] = react__WEBPACK_IMPORTED_MODULE_0__.useState(null);\n const [connectedLocations, setConnectedLocations] = react__WEBPACK_IMPORTED_MODULE_0__.useState(null);\n const [logLines, setLogLines] = react__WEBPACK_IMPORTED_MODULE_0__.useState(null);\n const [error, setError] = react__WEBPACK_IMPORTED_MODULE_0__.useState(null);\n const [scrollLog, setScrollLog] = react__WEBPACK_IMPORTED_MODULE_0__.useState(null);\n const logPresentationRef = react__WEBPACK_IMPORTED_MODULE_0__.useRef(null);\n window.setTimeout(() => {\n setWebsocket((websocket) => {\n if (websocket === null) {\n const locationProtocol = window.location.protocol;\n if (locationProtocol == null) {\n return null;\n }\n const protocol = locationProtocol.match(/https:/) != null ? 'wss' : 'ws';\n const webSocket = new WebSocket(`${protocol}://${window.location.host}/ws`);\n webSocket.onopen = () => {\n new _lastres_output_packet_init__WEBPACK_IMPORTED_MODULE_4__[\"default\"](selectedPJ.uuid).send(webSocket);\n let interval = 0;\n interval = window.setInterval(() => {\n if (webSocket.readyState === WebSocket.OPEN) {\n new _lastres_output_packet_ping__WEBPACK_IMPORTED_MODULE_5__[\"default\"]().send(webSocket);\n return;\n }\n window.clearInterval(interval);\n }, 250000);\n };\n const inputPackets = new _lastres_input_packets__WEBPACK_IMPORTED_MODULE_6__[\"default\"](setTeamPJs, setCurrentLocation, setConnectedLocations, logLines, setLogLines, setError, setScrollLog, logPresentationRef);\n webSocket.onmessage = (event) => {\n const packet = JSON.parse(event.data);\n inputPackets.handle(packet);\n };\n webSocket.onerror = (event) => {\n console.log(event);\n };\n return webSocket;\n }\n return websocket;\n });\n }, 100);\n return (react__WEBPACK_IMPORTED_MODULE_0__.createElement(react__WEBPACK_IMPORTED_MODULE_0__.Fragment, null,\n react__WEBPACK_IMPORTED_MODULE_0__.createElement(_lastres_components_upper_panel__WEBPACK_IMPORTED_MODULE_1__[\"default\"], { teamPJs: teamPJs, currentLocation: currentLocation, connectedLocations: connectedLocations, logLines: logLines, websocket: websocket, logPresentationRef: logPresentationRef }),\n react__WEBPACK_IMPORTED_MODULE_0__.createElement(_lastres_components_bottom_panel__WEBPACK_IMPORTED_MODULE_2__[\"default\"], null)));\n}\n\n\n//# sourceURL=webpack://LasTres/./js-src/components/game.tsx?"); /***/ }), @@ -266,7 +266,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac \*********************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ InputPackets)\n/* harmony export */ });\n/* harmony import */ var _lastres_input_packet_info__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @lastres/input-packet/info */ \"./js-src/input-packet/info.ts\");\n/* harmony import */ var _lastres_input_packet_pong__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @lastres/input-packet/pong */ \"./js-src/input-packet/pong.ts\");\n\n\nclass InputPackets {\n constructor(setTeamPJs, setCurrentLocation, setConnectedLocations, logLines, setLogLines, setError, setScrollLog, logPresentationRef) {\n this.cachedHash = null;\n this.cachedArray = null;\n this.setTeamPJs = setTeamPJs;\n this.setCurrentLocation = setCurrentLocation;\n this.setConnectedLocations = setConnectedLocations;\n this.logLines = logLines;\n this.setLogLines = setLogLines;\n this.setError = setError;\n this.setScrollLog = setScrollLog;\n this.logPresentationRef = logPresentationRef;\n }\n handle(packet) {\n const hash = this.hashAvailablePackets();\n const identifier = packet.command;\n const inputPacket = hash[identifier];\n inputPacket.recv(packet);\n }\n listAvailablePackets() {\n let firstTime = true;\n if (this.cachedArray === null) {\n const infoPacket = new _lastres_input_packet_info__WEBPACK_IMPORTED_MODULE_0__[\"default\"]();\n const pongPacket = new _lastres_input_packet_pong__WEBPACK_IMPORTED_MODULE_1__[\"default\"]();\n infoPacket.onReceive((data) => {\n const logPresentationRef = this.logPresentationRef;\n let scrollData = [];\n function saveScroll() {\n if (logPresentationRef.current === null) {\n return;\n }\n scrollData = [logPresentationRef.current.scrollHeight, logPresentationRef.current.scrollTop, logPresentationRef.current.offsetHeight];\n }\n function applyScroll() {\n if (scrollData.length < 3) {\n return;\n }\n if (logPresentationRef.current === null) {\n return;\n }\n const logPresentation = logPresentationRef.current;\n const [scrollHeight, scrollTop, offsetHeight] = scrollData;\n if (firstTime) {\n firstTime = false;\n console.log(scrollHeight, logPresentation.scrollHeight);\n logPresentation.scrollTo(0, logPresentation.scrollHeight);\n return;\n }\n if (scrollHeight === offsetHeight) {\n logPresentation.scrollTo(0, logPresentation.scrollHeight);\n return;\n }\n if (scrollHeight <= scrollTop + offsetHeight) {\n logPresentation.scrollTo(0, logPresentation.scrollHeight);\n }\n }\n if (data.error !== undefined) {\n this.setError(data.error);\n return;\n }\n if (data.team_pjs !== undefined) {\n this.setTeamPJs(data.team_pjs);\n }\n if (data.location_data?.connected_places !== undefined) {\n this.setConnectedLocations(data.location_data.connected_places);\n }\n if (data.location_data?.current !== undefined) {\n this.setCurrentLocation(data.location_data.current);\n }\n if (data.set_log !== undefined) {\n saveScroll();\n this.setLogLines(data.set_log);\n window.setTimeout(() => {\n applyScroll();\n }, 10);\n }\n if (data.append_log !== undefined) {\n const logHash = {};\n saveScroll();\n this.setLogLines((logLines) => {\n if (logLines !== null) {\n for (const item of logLines) {\n logHash[item.uuid] = item;\n }\n logHash[data.append_log.uuid] = data.append_log;\n const outputLog = Object.keys(logHash).map((item, i) => {\n return logHash[item];\n });\n return outputLog;\n }\n return [];\n });\n window.setTimeout(() => {\n applyScroll();\n }, 10);\n }\n });\n this.cachedArray = [infoPacket, pongPacket];\n }\n return this.cachedArray;\n }\n hashAvailablePackets() {\n if (this.cachedHash === null) {\n this.cachedHash = {};\n for (const inputPacket of this.listAvailablePackets()) {\n this.cachedHash[inputPacket.identifier()] = inputPacket;\n }\n }\n return this.cachedHash;\n }\n}\n\n\n//# sourceURL=webpack://LasTres/./js-src/input-packets.ts?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ InputPackets)\n/* harmony export */ });\n/* harmony import */ var _lastres_input_packet_info__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @lastres/input-packet/info */ \"./js-src/input-packet/info.ts\");\n/* harmony import */ var _lastres_input_packet_pong__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @lastres/input-packet/pong */ \"./js-src/input-packet/pong.ts\");\n\n\nclass InputPackets {\n constructor(setTeamPJs, setCurrentLocation, setConnectedLocations, logLines, setLogLines, setError, setScrollLog, logPresentationRef) {\n this.cachedHash = null;\n this.cachedArray = null;\n this.setTeamPJs = setTeamPJs;\n this.setCurrentLocation = setCurrentLocation;\n this.setConnectedLocations = setConnectedLocations;\n this.logLines = logLines;\n this.setLogLines = setLogLines;\n this.setError = setError;\n this.setScrollLog = setScrollLog;\n this.logPresentationRef = logPresentationRef;\n }\n handle(packet) {\n const hash = this.hashAvailablePackets();\n const identifier = packet.command;\n const inputPacket = hash[identifier];\n inputPacket.recv(packet);\n }\n listAvailablePackets() {\n let firstTime = true;\n if (this.cachedArray === null) {\n const infoPacket = new _lastres_input_packet_info__WEBPACK_IMPORTED_MODULE_0__[\"default\"]();\n const pongPacket = new _lastres_input_packet_pong__WEBPACK_IMPORTED_MODULE_1__[\"default\"]();\n infoPacket.onReceive((data) => {\n const logPresentationRef = this.logPresentationRef;\n let scrollData = [];\n function saveScroll() {\n if (logPresentationRef.current === null) {\n return;\n }\n scrollData = [logPresentationRef.current.scrollHeight, logPresentationRef.current.scrollTop, logPresentationRef.current.offsetHeight];\n }\n function applyScroll() {\n if (scrollData.length < 3) {\n return;\n }\n if (logPresentationRef.current === null) {\n console.log('Not defined');\n return;\n }\n const logPresentation = logPresentationRef.current;\n const [scrollHeight, scrollTop, offsetHeight] = scrollData;\n if (firstTime) {\n firstTime = false;\n console.log(scrollHeight, logPresentation.scrollHeight);\n logPresentation.scrollTo(0, logPresentation.scrollHeight);\n return;\n }\n if (scrollHeight === offsetHeight) {\n logPresentation.scrollTo(0, logPresentation.scrollHeight);\n return;\n }\n if (scrollHeight <= scrollTop + offsetHeight) {\n logPresentation.scrollTo(0, logPresentation.scrollHeight);\n }\n }\n if (data.error !== undefined) {\n this.setError(data.error);\n return;\n }\n if (data.team_pjs !== undefined) {\n this.setTeamPJs(data.team_pjs);\n }\n if (data.location_data?.connected_places !== undefined) {\n this.setConnectedLocations(data.location_data.connected_places);\n }\n if (data.location_data?.current !== undefined) {\n this.setCurrentLocation(data.location_data.current);\n }\n if (data.set_log !== undefined) {\n saveScroll();\n this.setLogLines(data.set_log);\n window.setTimeout(() => {\n applyScroll();\n }, 10);\n }\n if (data.append_log !== undefined) {\n const logHash = {};\n saveScroll();\n this.setLogLines((logLines) => {\n if (logLines !== null) {\n for (const item of logLines) {\n logHash[item.uuid] = item;\n }\n logHash[data.append_log.uuid] = data.append_log;\n const outputLog = Object.keys(logHash).map((item, i) => {\n return logHash[item];\n });\n return outputLog;\n }\n return [];\n });\n window.setTimeout(() => {\n applyScroll();\n }, 10);\n }\n });\n this.cachedArray = [infoPacket, pongPacket];\n }\n return this.cachedArray;\n }\n hashAvailablePackets() {\n if (this.cachedHash === null) {\n this.cachedHash = {};\n for (const inputPacket of this.listAvailablePackets()) {\n this.cachedHash[inputPacket.identifier()] = inputPacket;\n }\n }\n return this.cachedHash;\n }\n}\n\n\n//# sourceURL=webpack://LasTres/./js-src/input-packets.ts?"); /***/ }), diff --git a/script/las_tres b/script/las_tres index 9c7e5a5..354be73 100755 --- a/script/las_tres +++ b/script/las_tres @@ -1,5 +1,7 @@ #!/usr/bin/env perl +use v5.36.0; + use strict; use warnings;