mirror of
https://github.com/Mezeporta/Erupe.git
synced 2026-03-22 07:32:32 +01:00
feat(campaign): implement Event Tent campaign system
Adds the full campaign/event-tent feature: Packet layer: - MsgMhfApplyCampaign: Unk0/Unk1/Unk2 → CampaignID/Code (null-terminated 16-byte string) - MsgMhfAcquireItem: Unk0/Length/Unk1 → RewardIDs []uint32 - MsgMhfEnumerateItem: remove Unk0/Unk1 (RE'd: zeroed + always-2, ignored) - MsgMhfStateCampaign: Unk1 → NullPadding (RE'd: always zero) - MsgMhfTransferItem: Unk0/Unk1/Unk2 → QuestID/ItemType/Quantity (RE'd) Handler layer (handlers_campaign.go): - handleMsgMhfEnumerateCampaign: reads campaigns, categories, links from DB; prefix moved into pascal string slot 3 of each event entry (RE confirmed 3-section response format — removes spurious intermediate section) - handleMsgMhfStateCampaign: returns stamp count and redeemable flag - handleMsgMhfApplyCampaign: validates and records code redemption - handleMsgMhfEnumerateItem: lists rewards gated by stamp count - handleMsgMhfAcquireItem: marks rewards as claimed - handleMsgMhfTransferItem: records campaign quest completion (item_type=9) Quest gating (handlers_quest.go): - makeEventQuest: for QuestTypeSpecialTool, check campaign stamp count and deadline before allowing the quest (WriteBool true/false) Database: - 0010_campaign.sql: 8-table schema (campaigns, categories, links, rewards, claimed, state, codes, quest) - CampaignDemo.sql: community-researched live game campaign data
This commit is contained in:
5169
server/migrations/seed/CampaignDemo.sql
Normal file
5169
server/migrations/seed/CampaignDemo.sql
Normal file
File diff suppressed because it is too large
Load Diff
69
server/migrations/sql/0010_campaign.sql
Normal file
69
server/migrations/sql/0010_campaign.sql
Normal file
@@ -0,0 +1,69 @@
|
||||
BEGIN;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS public.campaigns (
|
||||
id INTEGER PRIMARY KEY,
|
||||
min_hr INTEGER,
|
||||
max_hr INTEGER,
|
||||
min_sr INTEGER,
|
||||
max_sr INTEGER,
|
||||
min_gr INTEGER,
|
||||
max_gr INTEGER,
|
||||
reward_type INTEGER,
|
||||
stamps INTEGER,
|
||||
receive_type INTEGER,
|
||||
background_id INTEGER,
|
||||
start_time TIMESTAMP WITH TIME ZONE,
|
||||
end_time TIMESTAMP WITH TIME ZONE,
|
||||
title TEXT,
|
||||
reward TEXT,
|
||||
link TEXT,
|
||||
code_prefix TEXT
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS public.campaign_categories (
|
||||
id SERIAL PRIMARY KEY,
|
||||
type INTEGER,
|
||||
title TEXT,
|
||||
description TEXT
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS public.campaign_category_links (
|
||||
id SERIAL PRIMARY KEY,
|
||||
campaign_id INTEGER REFERENCES public.campaigns(id) ON DELETE CASCADE,
|
||||
category_id INTEGER REFERENCES public.campaign_categories(id) ON DELETE CASCADE
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS public.campaign_rewards (
|
||||
id SERIAL PRIMARY KEY,
|
||||
campaign_id INTEGER REFERENCES public.campaigns(id) ON DELETE CASCADE,
|
||||
item_type INTEGER,
|
||||
quantity INTEGER,
|
||||
item_id INTEGER
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS public.campaign_rewards_claimed (
|
||||
character_id INTEGER REFERENCES public.characters(id) ON DELETE CASCADE,
|
||||
reward_id INTEGER REFERENCES public.campaign_rewards(id) ON DELETE CASCADE,
|
||||
PRIMARY KEY (character_id, reward_id)
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS public.campaign_state (
|
||||
id SERIAL PRIMARY KEY,
|
||||
campaign_id INTEGER REFERENCES public.campaigns(id) ON DELETE CASCADE,
|
||||
character_id INTEGER REFERENCES public.characters(id) ON DELETE CASCADE,
|
||||
code TEXT
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS public.campaign_codes (
|
||||
code TEXT PRIMARY KEY,
|
||||
campaign_id INTEGER REFERENCES public.campaigns(id) ON DELETE CASCADE,
|
||||
multi BOOLEAN NOT NULL DEFAULT FALSE
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS public.campaign_quest (
|
||||
campaign_id INTEGER REFERENCES public.campaigns(id) ON DELETE CASCADE,
|
||||
character_id INTEGER REFERENCES public.characters(id) ON DELETE CASCADE,
|
||||
PRIMARY KEY (campaign_id, character_id)
|
||||
);
|
||||
|
||||
END;
|
||||
Reference in New Issue
Block a user