Files
gen1recomp/tests/game3_gift_catalog_test.lua
T

154 lines
36 KiB
Lua

#!/usr/bin/env luajit
package.path = "./?.lua;./?/init.lua;" .. package.path
require("tests.fixture_data.game3_items").install()
love = love or require("tests.love_stub")
local T = require("tests.harness")
local check, eq = T.check, T.eq
local romBundle = require("tests.game3_cache").bundle()
local FIXTURE_PUB = "72184f81ec076cc56ddc93d4cc2230433d1e81374126419ddd06593381c60edd"
local FEED_FRLG = [==[{"v":1,"payload":"{\"cards\":[{\"bgType\":2,\"bodyText\":[\"Thank you for using the MYSTERY\",\"GIFT System.\",\"There is a ticket here for you.\",\"It is for use at VERMILION CITY port.\"],\"family\":\"frlg\",\"flagId\":1001,\"footerLine1Text\":\"Speak to the deliveryman\",\"footerLine2Text\":\"at a POKéMON CENTER.\",\"gift\":{\"haveFlags\":[680,754,755],\"item\":370,\"kind\":\"item\",\"quantity\":1,\"setFlags\":[2122,680]},\"iconSpecies\":0,\"idNumber\":1,\"key\":\"mystic_ticket\",\"maxStamps\":0,\"sendType\":0,\"subtitleText\":\"MYSTERY GIFT\",\"titleText\":\"MYSTIC TICKET\",\"type\":0,\"versions\":[\"firered\",\"leafgreen\"]},{\"bgType\":3,\"bodyText\":[\"Thank you for using the MYSTERY\",\"GIFT System.\",\"There is a ticket here for you.\",\"It is for use at VERMILION CITY port.\"],\"family\":\"frlg\",\"flagId\":1000,\"footerLine1Text\":\"Speak to the deliveryman\",\"footerLine2Text\":\"at a POKéMON CENTER.\",\"gift\":{\"haveFlags\":[679,740],\"item\":371,\"kind\":\"item\",\"quantity\":1,\"setFlags\":[2123,679]},\"iconSpecies\":0,\"idNumber\":2,\"key\":\"aurora_ticket\",\"maxStamps\":0,\"sendType\":0,\"subtitleText\":\"MYSTERY GIFT\",\"titleText\":\"AURORA TICKET\",\"type\":0,\"versions\":[\"firered\",\"leafgreen\"]},{\"bgType\":1,\"bodyText\":[\"From the POKéMON CENTER we\",\"have a gift, a POKéMON EGG!\",\"Please raise it with love and\",\"kindness.\"],\"family\":\"frlg\",\"flagId\":1003,\"footerLine1Text\":\"Speak to the deliveryman\",\"footerLine2Text\":\"at a POKéMON CENTER.\",\"gift\":{\"doneFlag\":984,\"kind\":\"egg\",\"moves\":{\"3\":57},\"slotVar\":16565,\"species\":172},\"iconSpecies\":172,\"idNumber\":3,\"key\":\"surf_pichu\",\"maxStamps\":0,\"sendType\":0,\"subtitleText\":\"MYSTERY GIFT\",\"titleText\":\"POKéMON EGG\",\"type\":0,\"versions\":[\"firered\",\"leafgreen\"]},{\"bgType\":4,\"bodyText\":[\"Thank you for using the STAMP CARD\",\"System.\",\"Trade with other TRAINERS to fill\",\"your STAMP CARD.\"],\"family\":\"frlg\",\"flagId\":1004,\"footerLine1Text\":\"Speak to the deliveryman\",\"footerLine2Text\":\"at a POKéMON CENTER.\",\"gift\":{\"kind\":\"none\"},\"iconSpecies\":0,\"idNumber\":4,\"key\":\"stamp_card\",\"maxStamps\":7,\"sendType\":1,\"subtitleText\":\"MYSTERY GIFT\",\"titleText\":\"STAMP CARD\",\"type\":1,\"versions\":[\"firered\",\"leafgreen\"]},{\"bgType\":5,\"bodyText\":[\"Your BATTLE COUNT CARD keeps\",\"track of your battle record against\",\"TRAINERS with the same CARD.\",\"Look for them and battle!\"],\"family\":\"frlg\",\"flagId\":1005,\"footerLine1Text\":\"Speak to the deliveryman\",\"footerLine2Text\":\"at a POKéMON CENTER.\",\"gift\":{\"doneFlag\":984,\"item\":13,\"kind\":\"item\",\"quantity\":1,\"requireStat\":0,\"requireValue\":3},\"iconSpecies\":0,\"idNumber\":5,\"key\":\"battle_card\",\"maxStamps\":0,\"sendType\":1,\"subtitleText\":\"MYSTERY GIFT\",\"titleText\":\"BATTLE COUNT CARD\",\"type\":2,\"versions\":[\"firered\",\"leafgreen\"]},{\"bgType\":6,\"bodyText\":[\"The POKéMON living in ALTERING\",\"CAVE have changed.\",\"Go and see what turns up\",\"on SIX ISLAND.\"],\"family\":\"frlg\",\"flagId\":1006,\"footerLine1Text\":\"Speak to the deliveryman\",\"footerLine2Text\":\"at a POKéMON CENTER.\",\"gift\":{\"kind\":\"var\",\"slotVar\":16420,\"varAdd\":1,\"varWrap\":10},\"iconSpecies\":0,\"idNumber\":6,\"key\":\"altering_cave\",\"maxStamps\":0,\"sendType\":0,\"subtitleText\":\"MYSTERY GIFT\",\"titleText\":\"ALTERING CAVE\",\"type\":0,\"versions\":[\"firered\",\"leafgreen\"]},{\"bgType\":0,\"bodyText\":[\"A POKéMON has been sent\",\"to you from the\",\"POKéMON CENTER.\",\"Please take good care of it.\"],\"family\":\"frlg\",\"flagId\":1019,\"footerLine1Text\":\"Speak to the deliveryman\",\"footerLine2Text\":\"at a POKéMON CENTER.\",\"gift\":{\"ball\":4,\"kind\":\"mon\",\"language\":2,\"level\":10,\"metGame\":2,\"metLevel\":10,\"metLocation\":255,\"moves\":{\"1\":1,\"2\":144},\"movesOnly\":true,\"otGender\":2,\"otId\":6930,\"otName\":\"MYSTRY\",\"shiny\":\"never\",\"species\":151},\"iconSpecies\":151,\"idNumber\":1000,\"key\":\"ev000_mew\",\"maxStamps\":0,\"sendType\":0,\"subtitleText\":\"MYSTERY GIFT\",\"titleText\":\"MEW\",\"type\":0,\"versions\":[\"firered\",\"leafgreen\"]},{\"bgType\":1,\"bodyText\":[\"A POKéMON has been sent\",\"to you from the\",\"POKéMON CENTER.\",\"Please take good care of it.\"],\"family\":\"frlg\",\"flagId\":1019,\"footerLine1Text\":\"Speak to the deliveryman\",\"footerLine2Text\":\"at a POKéMON CENTER.\",\"gift\":{\"ball\":4,\"fateful\":false,\"kind\":\"mon\",\"language\":2,\"level\":5,\"metGame\":2,\"metLevel\":5,\"metLocation\":255,\"moves\":{\"1\":273,\"2\":93,\"3\":156},\"movesOnly\":true,\"otGender\":0,\"otId\":20043,\"otName\":\"WISHMKR\",\"shiny\":\"random\",\"species\":409},\"iconSpecies\":409,\"idNumber\":1001,\"key\":\"ev001_jirachi\",\"maxStamps\":0,\"sendType\":0,\"subtitleText\":\"MYSTERY GIFT\",\"titleText\":\"JIRACHI\",\"type\":0,\"versions\":[\"firered\",\"leafgreen\"]},{\"bgType\":2,\"bodyText\":[\"A POKéMON has been sent\",\"to you from the\",\"POKéMON CENTER.\",\"Please take good care of it.\"],\"family\":\"frlg\",\"flagId\":1019,\"footerLine1Text\":\"Speak to the deliveryman\",\"footerLine2Text\":\"at a POKéMON CENTER.\",\"gift\":{\"ball\":4,\"fateful\":false,\"kind\":\"mon\",\"language\":2,\"level\":5,\"metLevel\":0,\"metLocation\":255,\"moves\":{\"1\":273,\"2\":93,\"3\":156},\"movesOnly\":true,\"otGender\":2,\"otId\":40122,\"otName\":\"CHANNEL\",\"secretIdRandom\":true,\"shiny\":\"random\",\"species\":409},\"iconSpecies\":409,\"idNumber\":1002,\"key\":\"ev002_jirachi\",\"maxStamps\":0,\"sendType\":0,\"subtitleText\":\"MYSTERY GIFT\",\"titleText\":\"JIRACHI\",\"type\":0,\"versions\":[\"firered\",\"leafgreen\"]},{\"bgType\":3,\"bodyText\":[\"A POKéMON has been sent\",\"to you from the\",\"POKéMON CENTER.\",\"Please take good care of it.\"],\"family\":\"frlg\",\"flagId\":1019,\"footerLine1Text\":\"Speak to the deliveryman\",\"footerLine2Text\":\"at a POKéMON CENTER.\",\"gift\":{\"ball\":4,\"fateful\":false,\"kind\":\"mon\",\"language\":1,\"level\":5,\"metGame\":1,\"metLevel\":5,\"metLocation\":255,\"moves\":{\"1\":33,\"2\":45,\"3\":39},\"movesOnly\":true,\"nickname\":\"ジグザグマ\",\"otGender\":1,\"otId\":21121,\"otName\":\"ルビー\",\"shiny\":\"always\",\"species\":288},\"iconSpecies\":288,\"idNumber\":1003,\"key\":\"ev003_zigzagoon\",\"maxStamps\":0,\"sendType\":0,\"subtitleText\":\"MYSTERY GIFT\",\"titleText\":\"ZIGZAGOON\",\"type\":0,\"versions\":[\"firered\",\"leafgreen\"]},{\"bgType\":6,\"bodyText\":[\"A POKéMON has been sent\",\"to you from the\",\"POKéMON CENTER.\",\"Please take good care of it.\"],\"family\":\"frlg\",\"flagId\":1019,\"footerLine1Text\":\"Speak to the deliveryman\",\"footerLine2Text\":\"at a POKéMON CENTER.\",\"gift\":{\"ball\":4,\"kind\":\"mon\",\"language\":2,\"level\":10,\"metGame\":2,\"metLevel\":10,\"metLocation\":255,\"moves\":{\"1\":1,\"2\":144},\"movesOnly\":true,\"otGender\":2,\"otId\":20078,\"otName\":\"Aura\",\"shiny\":\"never\",\"species\":151},\"iconSpecies\":151,\"idNumber\":1078,\"key\":\"ev078_mew\",\"maxStamps\":0,\"sendType\":0,\"subtitleText\":\"MYSTERY GIFT\",\"titleText\":\"MEW\",\"type\":0,\"versions\":[\"firered\",\"leafgreen\"]},{\"bgType\":7,\"bodyText\":[\"A POKéMON has been sent\",\"to you from the\",\"POKéMON CENTER.\",\"Please take good care of it.\"],\"family\":\"frlg\",\"flagId\":1019,\"footerLine1Text\":\"Speak to the deliveryman\",\"footerLine2Text\":\"at a POKéMON CENTER.\",\"gift\":{\"ball\":4,\"fateful\":false,\"kind\":\"mon\",\"language\":2,\"level\":30,\"metGame\":2,\"metLevel\":30,\"metLocation\":255,\"moves\":{\"1\":36,\"2\":93,\"3\":232,\"4\":287},\"movesOnly\":true,\"nationalRibbon\":true,\"otGender\":0,\"otId\":2005,\"otName\":\"ROCKS\",\"shiny\":\"never\",\"species\":399},\"iconSpecies\":399,\"idNumber\":1079,\"key\":\"ev079_metang\",\"maxStamps\":0,\"sendType\":0,\"subtitleText\":\"MYSTERY GIFT\",\"titleText\":\"METANG\",\"type\":0,\"versions\":[\"firered\",\"leafgreen\"]},{\"bgType\":7,\"bodyText\":[\"From the POKéMON CENTER we\",\"have a gift, a POKéMON EGG!\",\"Please raise it with love and\",\"kindness.\"],\"family\":\"frlg\",\"flagId\":1019,\"footerLine1Text\":\"Speak to the deliveryman\",\"footerLine2Text\":\"at a POKéMON CENTER.\",\"gift\":{\"ball\":4,\"fateful\":false,\"kind\":\"egg\",\"language\":1,\"metGame\":2,\"moves\":{\"1\":84,\"2\":204,\"3\":298},\"movesOnly\":true,\"otGender\":0,\"otName\":\"オヤNAME\",\"shiny\":\"always\",\"species\":172},\"iconSpecies\":172,\"idNumber\":1127,\"key\":\"ev127_pichu\",\"maxStamps\":0,\"sendType\":0,\"subtitleText\":\"MYSTERY GIFT\",\"titleText\":\"POKéMON EGG\",\"type\":0,\"versions\":[\"firered\",\"leafgreen\"]},{\"bgType\":5,\"bodyText\":[\"From the POKéMON CENTER we\",\"have a gift, a POKéMON EGG!\",\"Please raise it with love and\",\"kindness.\"],\"family\":\"frlg\",\"flagId\":1019,\"footerLine1Text\":\"Speak to the deliveryman\",\"footerLine2Text\":\"at a POKéMON CENTER.\",\"gift\":{\"ball\":4,\"kind\":\"egg\",\"moves\":{\"1\":281,\"2\":273},\"movesOnly\":true,\"shiny\":\"random\",\"species\":83},\"iconSpecies\":83,\"idNumber\":1141,\"key\":\"ev141_farfetch_d\",\"maxStamps\":0,\"sendType\":0,\"subtitleText\":\"MYSTERY GIFT\",\"titleText\":\"POKéMON EGG\",\"type\":0,\"versions\":[\"firered\",\"leafgreen\"]},{\"bgType\":2,\"bodyText\":[\"A POKéMON has been sent\",\"to you from the\",\"POKéMON CENTER.\",\"Please take good care of it.\"],\"family\":\"frlg\",\"flagId\":1019,\"footerLine1Text\":\"Speak to the deliveryman\",\"footerLine2Text\":\"at a POKéMON CENTER.\",\"gift\":{\"ball\":4,\"fateful\":false,\"kind\":\"mon\",\"language\":1,\"level\":10,\"metGame\":2,\"metLevel\":10,\"metLocation\":255,\"nickname\":\"セレビィ\",\"otGender\":1,\"otId\":31121,\"otName\":\"アゲト\",\"shiny\":\"never\",\"species\":251},\"iconSpecies\":251,\"idNumber\":1178,\"key\":\"ev178_celebi\",\"maxStamps\":0,\"sendType\":0,\"subtitleText\":\"MYSTERY GIFT\",\"titleText\":\"CELEBI\",\"type\":0,\"versions\":[\"firered\",\"leafgreen\"]},{\"bgType\":3,\"bodyText\":[\"A POKéMON has been sent\",\"to you from the\",\"POKéMON CENTER.\",\"Please take good care of it.\"],\"family\":\"frlg\",\"flagId\":1019,\"footerLine1Text\":\"Speak to the deliveryman\",\"footerLine2Text\":\"at a POKéMON CENTER.\",\"gift\":{\"ball\":4,\"fateful\":false,\"kind\":\"mon\",\"language\":2,\"level\":50,\"metLevel\":50,\"metLocation\":255,\"moves\":{\"1\":85,\"2\":97,\"3\":87,\"4\":113},\"movesOnly\":true,\"otIdMax\":2999,\"otNames\":[\"PCNYb\",\"PCNYc\"],\"shiny\":\"never\",\"species\":25},\"iconSpecies\":25,\"idNumber\":1179,\"key\":\"ev179_pikachu\",\"maxStamps\":0,\"sendType\":0,\"subtitleText\":\"MYSTERY GIFT\",\"titleText\":\"PIKACHU\",\"type\":0,\"versions\":[\"firered\",\"leafgreen\"]},{\"bgType\":5,\"bodyText\":[\"A POKéMON has been sent\",\"to you from the\",\"POKéMON CENTER.\",\"Please take good care of it.\"],\"family\":\"frlg\",\"flagId\":1019,\"footerLine1Text\":\"Speak to the deliveryman\",\"footerLine2Text\":\"at a POKéMON CENTER.\",\"gift\":{\"ball\":4,\"fateful\":false,\"kind\":\"mon\",\"language\":1,\"level\":10,\"metGame\":2,\"metLevel\":10,\"metLocation\":255,\"nickname\":\"キモリ\",\"otId\":51126,\"otNames\":[\"トウキョー\",\"ヨコハマ\",\"ナゴヤ\",\"オーサカ\",\"フクオカ\",\"サッポロ\"],\"shiny\":\"never\",\"species\":277},\"iconSpecies\":277,\"idNumber\":1229,\"key\":\"ev229_treecko\",\"maxStamps\":0,\"sendType\":0,\"subtitleText\":\"MYSTERY GIFT\",\"titleText\":\"TREECKO\",\"type\":0,\"versions\":[\"firered\",\"leafgreen\"]}],\"family\":\"frlg\",\"issued\":5,\"news\":[{\"bgType\":0,\"bodyText\":[\"Every game reads this.\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\"],\"family\":\"frlg\",\"id\":9,\"key\":\"relay_news\",\"sendType\":0,\"titleText\":\"RELAY NEWS\"}],\"v\":1}","sig":"761fa0e8df514a1dd630cef130d7129a627f3742a509d5446dc2228f743238ec28e7247fe15d8f76596f936b3c77d2b38e5524d07fcf434da066027f573c2304","key":"72184f81ec076cc56ddc93d4cc2230433d1e81374126419ddd06593381c60edd"}]==]
local FEED_RSE = [==[{"v":1,"payload":"{\"cards\":[{\"bgType\":1,\"bodyText\":[\"Thank you for using the MYSTERY\",\"GIFT System.\",\"There is a ticket here for you.\",\"It is for use at LILYCOVE CITY port.\"],\"family\":\"rse\",\"flagId\":1003,\"footerLine1Text\":\"Speak to the deliveryman\",\"footerLine2Text\":\"at a POKéMON CENTER.\",\"gift\":{\"haveFlags\":[2227],\"item\":275,\"kind\":\"item\",\"quantity\":1,\"setFlags\":[2227]},\"iconSpecies\":0,\"idNumber\":101,\"key\":\"rse_eon_ticket\",\"maxStamps\":0,\"sendType\":0,\"subtitleText\":\"MYSTERY GIFT\",\"titleText\":\"EON TICKET\",\"type\":0,\"versions\":[\"emerald\"]},{\"bgType\":3,\"bodyText\":[\"Thank you for using the MYSTERY\",\"GIFT System.\",\"There is a ticket here for you.\",\"It is for use at LILYCOVE CITY port.\"],\"family\":\"rse\",\"flagId\":1000,\"footerLine1Text\":\"Speak to the deliveryman\",\"footerLine2Text\":\"at a POKéMON CENTER.\",\"gift\":{\"haveFlags\":[314,429],\"item\":371,\"kind\":\"item\",\"quantity\":1,\"setFlags\":[2261,314]},\"iconSpecies\":0,\"idNumber\":102,\"key\":\"rse_aurora_ticket\",\"maxStamps\":0,\"sendType\":0,\"subtitleText\":\"MYSTERY GIFT\",\"titleText\":\"AURORA TICKET\",\"type\":0,\"versions\":[\"emerald\"]},{\"bgType\":2,\"bodyText\":[\"Thank you for using the MYSTERY\",\"GIFT System.\",\"There is a ticket here for you.\",\"It is for use at LILYCOVE CITY port.\"],\"family\":\"rse\",\"flagId\":1001,\"footerLine1Text\":\"Speak to the deliveryman\",\"footerLine2Text\":\"at a POKéMON CENTER.\",\"gift\":{\"haveFlags\":[315,145,146],\"item\":370,\"kind\":\"item\",\"quantity\":1,\"setFlags\":[2272,315]},\"iconSpecies\":0,\"idNumber\":103,\"key\":\"rse_mystic_ticket\",\"maxStamps\":0,\"sendType\":0,\"subtitleText\":\"MYSTERY GIFT\",\"titleText\":\"MYSTIC TICKET\",\"type\":0,\"versions\":[\"emerald\"]},{\"bgType\":6,\"bodyText\":[\"Thank you for using the MYSTERY\",\"GIFT System.\",\"We received this OLD SEA MAP\",\"addressed to you.\"],\"family\":\"rse\",\"flagId\":1002,\"footerLine1Text\":\"Speak to the deliveryman\",\"footerLine2Text\":\"at a POKéMON CENTER.\",\"gift\":{\"haveFlags\":[316,458],\"item\":376,\"kind\":\"item\",\"quantity\":1,\"setFlags\":[2262,316]},\"iconSpecies\":0,\"idNumber\":104,\"key\":\"rse_old_sea_map\",\"maxStamps\":0,\"sendType\":0,\"subtitleText\":\"MYSTERY GIFT\",\"titleText\":\"OLD SEA MAP\",\"type\":0,\"versions\":[\"emerald\"]},{\"bgType\":1,\"bodyText\":[\"From the POKéMON CENTER we\",\"have a gift, a POKéMON EGG!\",\"Please raise it with love and\",\"kindness.\"],\"family\":\"rse\",\"flagId\":1004,\"footerLine1Text\":\"Speak to the deliveryman\",\"footerLine2Text\":\"at a POKéMON CENTER.\",\"gift\":{\"doneFlag\":484,\"kind\":\"egg\",\"moves\":{\"3\":57},\"script\":\"surfPichu\",\"slotVar\":16605,\"species\":172},\"iconSpecies\":172,\"idNumber\":105,\"key\":\"rse_surf_pichu\",\"maxStamps\":0,\"sendType\":0,\"subtitleText\":\"MYSTERY GIFT\",\"titleText\":\"POKéMON EGG\",\"type\":0,\"versions\":[\"emerald\"]},{\"bgType\":4,\"bodyText\":[\"Thank you for using the STAMP CARD\",\"System.\",\"Trade with other TRAINERS to fill\",\"your STAMP CARD.\"],\"family\":\"rse\",\"flagId\":1005,\"footerLine1Text\":\"Speak to the deliveryman\",\"footerLine2Text\":\"at a POKéMON CENTER.\",\"gift\":{\"kind\":\"none\",\"script\":\"stampCard\"},\"iconSpecies\":0,\"idNumber\":106,\"key\":\"rse_stamp_card\",\"maxStamps\":7,\"sendType\":1,\"subtitleText\":\"MYSTERY GIFT\",\"titleText\":\"STAMP CARD\",\"type\":1,\"versions\":[\"emerald\"]},{\"bgType\":5,\"bodyText\":[\"Your BATTLE COUNT CARD keeps\",\"track of your battle record against\",\"TRAINERS with the same CARD.\",\"Look for them and battle!\"],\"family\":\"rse\",\"flagId\":1006,\"footerLine1Text\":\"Speak to the deliveryman\",\"footerLine2Text\":\"at a POKéMON CENTER.\",\"gift\":{\"doneFlag\":484,\"item\":13,\"kind\":\"item\",\"quantity\":1,\"requireStat\":0,\"requireValue\":3,\"script\":\"battleCard\"},\"iconSpecies\":0,\"idNumber\":107,\"key\":\"rse_battle_card\",\"maxStamps\":0,\"sendType\":1,\"subtitleText\":\"MYSTERY GIFT\",\"titleText\":\"BATTLE COUNT CARD\",\"type\":2,\"versions\":[\"emerald\"]},{\"bgType\":6,\"bodyText\":[\"The POKéMON living in ALTERING\",\"CAVE have changed.\",\"Go and see what turns up\",\"on ROUTE 103.\"],\"family\":\"rse\",\"flagId\":1007,\"footerLine1Text\":\"Speak to the deliveryman\",\"footerLine2Text\":\"at a POKéMON CENTER.\",\"gift\":{\"kind\":\"var\",\"script\":\"alteringCave\",\"slotVar\":16446,\"varAdd\":1,\"varWrap\":10},\"iconSpecies\":0,\"idNumber\":108,\"key\":\"rse_altering_cave\",\"maxStamps\":0,\"sendType\":0,\"subtitleText\":\"MYSTERY GIFT\",\"titleText\":\"ALTERING CAVE\",\"type\":0,\"versions\":[\"emerald\"]},{\"bgType\":0,\"bodyText\":[\"A POKéMON has been sent\",\"to you from the\",\"POKéMON CENTER.\",\"Please take good care of it.\"],\"family\":\"rse\",\"flagId\":1019,\"footerLine1Text\":\"Speak to the deliveryman\",\"footerLine2Text\":\"at a POKéMON CENTER.\",\"gift\":{\"ball\":4,\"kind\":\"mon\",\"language\":2,\"level\":10,\"metGame\":2,\"metLevel\":10,\"metLocation\":255,\"moves\":{\"1\":1,\"2\":144},\"movesOnly\":true,\"otGender\":2,\"otId\":6930,\"otName\":\"MYSTRY\",\"shiny\":\"never\",\"species\":151},\"iconSpecies\":151,\"idNumber\":1000,\"key\":\"rse_ev000_mew\",\"maxStamps\":0,\"sendType\":0,\"subtitleText\":\"MYSTERY GIFT\",\"titleText\":\"MEW\",\"type\":0,\"versions\":[\"emerald\"]},{\"bgType\":1,\"bodyText\":[\"A POKéMON has been sent\",\"to you from the\",\"POKéMON CENTER.\",\"Please take good care of it.\"],\"family\":\"rse\",\"flagId\":1019,\"footerLine1Text\":\"Speak to the deliveryman\",\"footerLine2Text\":\"at a POKéMON CENTER.\",\"gift\":{\"ball\":4,\"fateful\":false,\"kind\":\"mon\",\"language\":2,\"level\":5,\"metGame\":2,\"metLevel\":5,\"metLocation\":255,\"moves\":{\"1\":273,\"2\":93,\"3\":156},\"movesOnly\":true,\"otGender\":0,\"otId\":20043,\"otName\":\"WISHMKR\",\"shiny\":\"random\",\"species\":409},\"iconSpecies\":409,\"idNumber\":1001,\"key\":\"rse_ev001_jirachi\",\"maxStamps\":0,\"sendType\":0,\"subtitleText\":\"MYSTERY GIFT\",\"titleText\":\"JIRACHI\",\"type\":0,\"versions\":[\"emerald\"]},{\"bgType\":2,\"bodyText\":[\"A POKéMON has been sent\",\"to you from the\",\"POKéMON CENTER.\",\"Please take good care of it.\"],\"family\":\"rse\",\"flagId\":1019,\"footerLine1Text\":\"Speak to the deliveryman\",\"footerLine2Text\":\"at a POKéMON CENTER.\",\"gift\":{\"ball\":4,\"fateful\":false,\"kind\":\"mon\",\"language\":2,\"level\":5,\"metLevel\":0,\"metLocation\":255,\"moves\":{\"1\":273,\"2\":93,\"3\":156},\"movesOnly\":true,\"otGender\":2,\"otId\":40122,\"otName\":\"CHANNEL\",\"secretIdRandom\":true,\"shiny\":\"random\",\"species\":409},\"iconSpecies\":409,\"idNumber\":1002,\"key\":\"rse_ev002_jirachi\",\"maxStamps\":0,\"sendType\":0,\"subtitleText\":\"MYSTERY GIFT\",\"titleText\":\"JIRACHI\",\"type\":0,\"versions\":[\"emerald\"]},{\"bgType\":3,\"bodyText\":[\"A POKéMON has been sent\",\"to you from the\",\"POKéMON CENTER.\",\"Please take good care of it.\"],\"family\":\"rse\",\"flagId\":1019,\"footerLine1Text\":\"Speak to the deliveryman\",\"footerLine2Text\":\"at a POKéMON CENTER.\",\"gift\":{\"ball\":4,\"fateful\":false,\"kind\":\"mon\",\"language\":1,\"level\":5,\"metGame\":1,\"metLevel\":5,\"metLocation\":255,\"moves\":{\"1\":33,\"2\":45,\"3\":39},\"movesOnly\":true,\"nickname\":\"ジグザグマ\",\"otGender\":1,\"otId\":21121,\"otName\":\"ルビー\",\"shiny\":\"always\",\"species\":288},\"iconSpecies\":288,\"idNumber\":1003,\"key\":\"rse_ev003_zigzagoon\",\"maxStamps\":0,\"sendType\":0,\"subtitleText\":\"MYSTERY GIFT\",\"titleText\":\"ZIGZAGOON\",\"type\":0,\"versions\":[\"emerald\"]},{\"bgType\":6,\"bodyText\":[\"A POKéMON has been sent\",\"to you from the\",\"POKéMON CENTER.\",\"Please take good care of it.\"],\"family\":\"rse\",\"flagId\":1019,\"footerLine1Text\":\"Speak to the deliveryman\",\"footerLine2Text\":\"at a POKéMON CENTER.\",\"gift\":{\"ball\":4,\"kind\":\"mon\",\"language\":2,\"level\":10,\"metGame\":2,\"metLevel\":10,\"metLocation\":255,\"moves\":{\"1\":1,\"2\":144},\"movesOnly\":true,\"otGender\":2,\"otId\":20078,\"otName\":\"Aura\",\"shiny\":\"never\",\"species\":151},\"iconSpecies\":151,\"idNumber\":1078,\"key\":\"rse_ev078_mew\",\"maxStamps\":0,\"sendType\":0,\"subtitleText\":\"MYSTERY GIFT\",\"titleText\":\"MEW\",\"type\":0,\"versions\":[\"emerald\"]},{\"bgType\":7,\"bodyText\":[\"A POKéMON has been sent\",\"to you from the\",\"POKéMON CENTER.\",\"Please take good care of it.\"],\"family\":\"rse\",\"flagId\":1019,\"footerLine1Text\":\"Speak to the deliveryman\",\"footerLine2Text\":\"at a POKéMON CENTER.\",\"gift\":{\"ball\":4,\"fateful\":false,\"kind\":\"mon\",\"language\":2,\"level\":30,\"metGame\":2,\"metLevel\":30,\"metLocation\":255,\"moves\":{\"1\":36,\"2\":93,\"3\":232,\"4\":287},\"movesOnly\":true,\"nationalRibbon\":true,\"otGender\":0,\"otId\":2005,\"otName\":\"ROCKS\",\"shiny\":\"never\",\"species\":399},\"iconSpecies\":399,\"idNumber\":1079,\"key\":\"rse_ev079_metang\",\"maxStamps\":0,\"sendType\":0,\"subtitleText\":\"MYSTERY GIFT\",\"titleText\":\"METANG\",\"type\":0,\"versions\":[\"emerald\"]},{\"bgType\":7,\"bodyText\":[\"From the POKéMON CENTER we\",\"have a gift, a POKéMON EGG!\",\"Please raise it with love and\",\"kindness.\"],\"family\":\"rse\",\"flagId\":1019,\"footerLine1Text\":\"Speak to the deliveryman\",\"footerLine2Text\":\"at a POKéMON CENTER.\",\"gift\":{\"ball\":4,\"fateful\":false,\"kind\":\"egg\",\"language\":1,\"metGame\":2,\"moves\":{\"1\":84,\"2\":204,\"3\":298},\"movesOnly\":true,\"otGender\":0,\"otName\":\"オヤNAME\",\"shiny\":\"always\",\"species\":172},\"iconSpecies\":172,\"idNumber\":1127,\"key\":\"rse_ev127_pichu\",\"maxStamps\":0,\"sendType\":0,\"subtitleText\":\"MYSTERY GIFT\",\"titleText\":\"POKéMON EGG\",\"type\":0,\"versions\":[\"emerald\"]},{\"bgType\":2,\"bodyText\":[\"A POKéMON has been sent\",\"to you from the\",\"POKéMON CENTER.\",\"Please take good care of it.\"],\"family\":\"rse\",\"flagId\":1019,\"footerLine1Text\":\"Speak to the deliveryman\",\"footerLine2Text\":\"at a POKéMON CENTER.\",\"gift\":{\"ball\":4,\"fateful\":false,\"kind\":\"mon\",\"language\":1,\"level\":10,\"metGame\":2,\"metLevel\":10,\"metLocation\":255,\"nickname\":\"セレビィ\",\"otGender\":1,\"otId\":31121,\"otName\":\"アゲト\",\"shiny\":\"never\",\"species\":251},\"iconSpecies\":251,\"idNumber\":1178,\"key\":\"rse_ev178_celebi\",\"maxStamps\":0,\"sendType\":0,\"subtitleText\":\"MYSTERY GIFT\",\"titleText\":\"CELEBI\",\"type\":0,\"versions\":[\"emerald\"]},{\"bgType\":3,\"bodyText\":[\"A POKéMON has been sent\",\"to you from the\",\"POKéMON CENTER.\",\"Please take good care of it.\"],\"family\":\"rse\",\"flagId\":1019,\"footerLine1Text\":\"Speak to the deliveryman\",\"footerLine2Text\":\"at a POKéMON CENTER.\",\"gift\":{\"ball\":4,\"fateful\":false,\"kind\":\"mon\",\"language\":2,\"level\":50,\"metLevel\":50,\"metLocation\":255,\"moves\":{\"1\":85,\"2\":97,\"3\":87,\"4\":113},\"movesOnly\":true,\"otIdMax\":2999,\"otNames\":[\"PCNYb\",\"PCNYc\"],\"shiny\":\"never\",\"species\":25},\"iconSpecies\":25,\"idNumber\":1179,\"key\":\"rse_ev179_pikachu\",\"maxStamps\":0,\"sendType\":0,\"subtitleText\":\"MYSTERY GIFT\",\"titleText\":\"PIKACHU\",\"type\":0,\"versions\":[\"emerald\"]},{\"bgType\":5,\"bodyText\":[\"A POKéMON has been sent\",\"to you from the\",\"POKéMON CENTER.\",\"Please take good care of it.\"],\"family\":\"rse\",\"flagId\":1019,\"footerLine1Text\":\"Speak to the deliveryman\",\"footerLine2Text\":\"at a POKéMON CENTER.\",\"gift\":{\"ball\":4,\"fateful\":false,\"kind\":\"mon\",\"language\":1,\"level\":10,\"metGame\":2,\"metLevel\":10,\"metLocation\":255,\"nickname\":\"キモリ\",\"otId\":51126,\"otNames\":[\"トウキョー\",\"ヨコハマ\",\"ナゴヤ\",\"オーサカ\",\"フクオカ\",\"サッポロ\"],\"shiny\":\"never\",\"species\":277},\"iconSpecies\":277,\"idNumber\":1229,\"key\":\"rse_ev229_treecko\",\"maxStamps\":0,\"sendType\":0,\"subtitleText\":\"MYSTERY GIFT\",\"titleText\":\"TREECKO\",\"type\":0,\"versions\":[\"emerald\"]}],\"family\":\"rse\",\"issued\":5,\"news\":[{\"bgType\":0,\"bodyText\":[\"Every game reads this.\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\"],\"family\":\"frlg\",\"id\":9,\"key\":\"relay_news\",\"sendType\":0,\"titleText\":\"RELAY NEWS\"}],\"v\":1}","sig":"802db621006837278b5fb0f24a8c6c9a77a339e4794644fdf7ebfb22815d41d69c5e1a25ebd78938a86fb02393bfb09524a294c968a0cee693d1134204f5350c","key":"72184f81ec076cc56ddc93d4cc2230433d1e81374126419ddd06593381c60edd"}]==]
local FEED_RS = [==[{"v":1,"payload":"{\"cards\":[],\"events\":[{\"family\":\"rs\",\"key\":\"rs_eon_ticket\",\"payload\":\"AQAAAAICAAIAAAAEAIABAAAQfhYAAB4AAAKaAgACBggBAWEAAAL7AQACCwEFEwEF+wEAAgLB4wDn2dkA7ePp5gDa1ejc2eYA1egA6NzZAMHTxwDd4v7Kv867xrzPzMGt/7hhAAACRxMBAQAhDYABALsBvwAAAkoTAQEAIQ2AAQC7Ab8AAAIrzgC7Ab8AAAJqWr3JAAACZm1GEwEBACENgAAAuwHAAAACGgCAEwEaAYABAAkAKVMIvQYBAAJmbWwNvYYBAAJmbWwCvru+8AD9AasAwePj2ADo4wDn2dkA7ePpq/7O3Nnm2bTnANUA4Nno6NnmANzZ5tkA2uPmAO3j6bgA/QGt/767vvAAw+gA1eTk2dXm5wDo4wDW2QDVANrZ5ubtAM7DvcW/zrj+1unoAMO06tkA4tnq2eYA59nZ4gDj4tkA4N3f2QDd6ADW2drj5tmt+9Pj6QDn3OPp4NgA6t3n3egAxsPG073J0L8A1eLYANXn3/7V1uPp6ADd6ADo3Nnm2a3/vru+8AD9AbgA6NzZAMW/0wDDzr/HzQDKyb3Fv84A3eL+7ePp5gC8u8EA3ecA2ung4K37x+Pq2QDn4+HZAN/Z7QDd6Nnh5wDa4+YA59Xa2d/Z2eTd4tv+3eIA7ePp5gDKvbgA6NzZ4gDX4+HZAOfZ2QDh2a3/uPsBAAJHEwEBACENgAEAuwFBAgACShMBAQAhDYABALsBQQIAAivOALsBQQIAAkYTAQEAIQ2AAAC7AUkCAAK+NQAAAg4CAr5RAgACDgMCvnUCAAIOAwLO3N3nAL/Qv8jOAOHV7QDW2QDk4NXt2dgA4+Lg7QDj4tfZrf/T4+nmALy7wbTnAMW/0wDDzr/HzQDKyb3Fv84A3ecA2ung4K3/\",\"title\":\"EON TICKET\",\"versions\":[\"ruby\",\"sapphire\"]},{\"family\":\"rs\",\"key\":\"rs_gift_ribbon\",\"payload\":\"AZsIAAICAAIAAAAEAIABAAAQTGwAALkIAAK9CAACCAABAg==\",\"title\":\"GIFT RIBBON\",\"versions\":[\"ruby\",\"sapphire\"]},{\"family\":\"rs\",\"key\":\"rs_ev000_mew\",\"payload\":\"AQAAAAICAAIAAAAEAIABAAAQDIYAAB4AAAKsAAACDCQAAAIC6rS/fxIbAADHv9H/////////AgLH083OzNP/AEt4AAD4ULVeM5lEUPivv/9vr79/yK2/f/jLv3/5ry9/+K+/f9ulv3/4r79/+K+/f/ivv38AAAAACv8pACkAGwAaABgAHAAdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==\",\"title\":\"MEW\",\"versions\":[\"ruby\",\"sapphire\"]},{\"family\":\"rs\",\"key\":\"rs_ev001_jirachi\",\"payload\":\"AQAAAAICAAIAAAAEAIABAAAQ26MAAB4AAAKsAAACDCQAAAICsPZhQktOAADEw8y7vcLD////AgLRw83Cx8XMAJ//AABiuWFCZ7hhQvvcYULquTxCZ7hhQvGha0L7uGFC+7hhQvu4YUL7R2Rjsg+fZPu4YcIAAAAABf8ZABkAEAAPABAADwAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==\",\"title\":\"JIRACHI\",\"versions\":[\"ruby\",\"sapphire\"]},{\"family\":\"rs\",\"key\":\"rs_ev002_jirachi\",\"payload\":\"AQAAAAICAAIAAAAEAIABAAAQ47EAAB4AAAKsAAACDCQAAAICdjgEBbqcnsnEw8y7vcLD////AgK9wrvIyL/GABt3AADdpcfMUKSazMa9kMxVpZrMUKSazMzAmszMpJrMzKSazMykmszMW5ptCxOb0sykmkwAAAAABf8ZABkAEQAPAA8ADQAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==\",\"title\":\"JIRACHI\",\"versions\":[\"ruby\",\"sapphire\"]},{\"family\":\"rs\",\"key\":\"rs_ev003_zigzagoon\",\"payload\":\"AQAAAAICAAIAAAAEAIABAAAQv1oAAB4AAAKsAAACDCQAAAICJJWnx4FSAACNiYyJb///////AQJ5l67/////ACHdAAClOCJn4f+i0qXHp0eEx4rHgsenx4bvuceFxqfH2Menx6WBp8elx6fHpcenx6XHp8cAAAAABf8TABMACAAIAAsACAAJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==\",\"title\":\"ZIGZAGOON\",\"versions\":[\"ruby\",\"sapphire\"]},{\"family\":\"rs\",\"key\":\"rs_ev078_mew\",\"payload\":\"AQAAAAICAAIAAAAEAIABAAAQ3ekAAB4AAAKsAAACDCQAAAICVb9KzW5OAADHv9H/////////AgK76ebV////AJghAAA7DkDsICyy/zvxSk068drNO/FKzRj7Ss078UrNO/FKzTvxSs2s8UrNC/NKzTuVSs0AAAAACv8qACoAGQAbABoAGgAbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==\",\"title\":\"MEW\",\"versions\":[\"ruby\",\"sapphire\"]},{\"family\":\"rs\",\"key\":\"rs_ev079_metang\",\"payload\":\"AQAAAAICAAIAAAAEAIABAAAQooIAAB4AAAKsAAACDCQAAAICHAHtj9UHAADHv867yMH/////AgLMyb3Fzf//ANYAAABGB+2PH4Xtj8kl7Y/J+fOuUVsRpskG7Q7tBrCPIQbyjt0fzpvJBu2PyQbtj8kG7Y8AAAAAHv9TAFMAOgBHACoALwA1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==\",\"title\":\"METANG\",\"versions\":[\"ruby\",\"sapphire\"]},{\"family\":\"rs\",\"key\":\"rs_ev127_pichu\",\"payload\":\"AQAAAAICAAIAAAAEAIABAAAQyzQAAB4AAAKsAAACDCQAAAICag5pDgAAAABgb4v/////////AQZVdMi7x7//AG1tAADGDmkOFw5pDmpIaQ5qDmkOag5pDmoOaQ4+DqUOQA9pDnQafQ5q8WwvRvv+dGoOaY4AAAAABf8RABEACQAHAAsACAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==\",\"title\":\"POKéMON EGG\",\"versions\":[\"ruby\",\"sapphire\"]},{\"family\":\"rs\",\"key\":\"rs_ev178_celebi\",\"payload\":\"AQAAAAICAAIAAAAEAIABAAAQLaQAAB4AAAKsAAACDCQAAAICzHDO1JF5AABeepeA////////AQJRimT/////AEB1AABd9sR1ZYfz5F0JzlQACafUigkV1EQdy82mCc7UbQvO1F1tztRdCc7UXQnO1F0JztQAAAAACv8qACoAGgAbABsAGQAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==\",\"title\":\"CELEBI\",\"versions\":[\"ruby\",\"sapphire\"]},{\"family\":\"rs\",\"key\":\"rs_ev179_pikachu\",\"payload\":\"AQAAAAICAAIAAAAEAIABAAAQvXkAAB4AAAKsAAACDCQAAAICkrJxl94CAADKw8W7vcLP////AgLKvcjT1///ACHCAABMT0O2+j4xsEywcRdVsHGXBFhwl0z2cZcZsBCXG7AAl0Oue4lMsHGXTLBxl0ywcZcAAAAAMv9qAGoARgAkAF8AOgA7AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==\",\"title\":\"PIKACHU\",\"versions\":[\"ruby\",\"sapphire\"]},{\"family\":\"rs\",\"key\":\"rs_ev229_treecko\",\"payload\":\"AQAAAAICAAIAAAAEAIABAAAQVTcAAB4AAAKsAAACDCQAAAICToszm7bHAABXc3j/////////AQJ2Wmpv////ACFVAAD5TBibv0wzm9tSJ5vtTTObyE4zm/gKM5v4TDOb+Ewzm/hMM5v4szm6vWvQvvhMMxsAAAAACv8cABwAEQAMABMAEgARAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==\",\"title\":\"TREECKO\",\"versions\":[\"ruby\",\"sapphire\"]}],\"family\":\"rs\",\"issued\":5,\"news\":[{\"bgType\":0,\"bodyText\":[\"Every game reads this.\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\"],\"family\":\"frlg\",\"id\":9,\"key\":\"relay_news\",\"sendType\":0,\"titleText\":\"RELAY NEWS\"}],\"v\":1}","sig":"0b977696d237074135c5d95c5b957f45f523552aa596c56ed28ce590808e4b99128b792c91545f9e0bdfe20c9ff75ae8bdd44fbbffb8b76eb42e1f67140ce308","key":"72184f81ec076cc56ddc93d4cc2230433d1e81374126419ddd06593381c60edd"}]==]
local Json = require("src.link.Json")
local MysteryGift = require("src.core.game3.mystery_gift")
local Bag = require("src.core.game3.bag")
local Schema = require("src.core.game3.save_schema_firered")
MysteryGift.GIFT_PUBKEY = FIXTURE_PUB
local FEEDS = { frlg = FEED_FRLG, rse = FEED_RSE, rs = FEED_RS }
local FAMILY_GAMES = { frlg = { "firered", "leafgreen" }, rse = { "emerald" }, rs = { "ruby", "sapphire" } }
local function raw(family)
return Json.decode(Json.decode(FEEDS[family]).payload)
end
local function session(version)
local s = Schema.newGame({ rngSeed = 0x99 })
s.version = version
s.store = { flags = {}, vars = {} }
s.bag = Bag.new()
s.party = {}
return s
end
print("[test] 1. Every card preset reaches exactly the games it lists")
for _, family in ipairs({ "frlg", "rse" }) do
for _, row in ipairs(raw(family).cards) do
for _, game in ipairs(FAMILY_GAMES[family]) do
local list = assert(MysteryGift.verifyFeed(Json.decode(FEEDS[family]), family, game))
local found = false
for _, e in ipairs(list.cards) do if e.key == row.key then found = true end end
eq(found, MysteryGift.offeredIn(row.versions, game), row.key .. " on " .. game)
end
end
end
print("[test] 2. Every non-mon card preset delivers on its own game")
for _, family in ipairs({ "frlg", "rse" }) do
for _, row in ipairs(raw(family).cards) do
local game = row.versions[1]
local s = session(game)
local list = MysteryGift.verifyFeed(Json.decode(FEEDS[family]), family, game)
local entry
for _, e in ipairs(list.cards) do if e.key == row.key then entry = e end end
check(entry ~= nil, row.key .. " parses on " .. game)
if entry then
check(MysteryGift.receiveCard(s, entry.card), row.key .. " is saved")
local kind = entry.card.gift.kind
local script = MysteryGift.ramScriptId(s, entry.card)
if script then
-- pokeemerald/src/script.c:441 GetSavedRamScriptIfValid
local known = { eon = true, aurora = true, mystic = true, oldSeaMap = true, surfPichu = true,
stampCard = true, battleCard = true, alteringCave = true }
check(known[script] == true, row.key .. " runs the Emerald ROM gift script " .. tostring(script))
elseif kind == "item" and not entry.card.gift.requireStat then
eq(MysteryGift.deliverGift(s, entry.card), MysteryGift.DELIVER_GIVEN, row.key .. " is handed over")
check(Bag.has(s.bag, entry.card.gift.item, 1), row.key .. " lands in the bag")
elseif kind == "var" then
eq(MysteryGift.deliverGift(s, entry.card), MysteryGift.DELIVER_GIVEN, row.key .. " bumps its variable")
elseif kind == "none" or entry.card.gift.requireStat then
eq(MysteryGift.deliverGift(s, entry.card), MysteryGift.DELIVER_NOTHING, row.key .. " is a card only until earned")
end
end
end
end
print("[test] 3. Event Pokémon cards follow their PKHeX templates")
local bit = require("bit")
local function shinyValue(mon)
local p = mon.personality % 4294967296
return bit.bxor(bit.bxor(mon.otId % 65536, (mon.otSecretId or 0) % 65536),
bit.bxor(math.floor(p / 65536), p % 65536))
end
if not romBundle then
print("[skip] no FireRed cache for the species data")
else
local Ribbons = require("src.core.game3.rse.ribbons")
for _, family in ipairs({ "frlg", "rse" }) do
for _, row in ipairs(raw(family).cards) do
local g = row.gift
if (g.kind == "mon" or g.kind == "egg") and g.shiny then
local game = row.versions[1]
for round = 1, 8 do
local s = session(game)
require("src.core.game3.rng").SeedRng(round * 7919)
local list = MysteryGift.verifyFeed(Json.decode(FEEDS[family]), family, game)
local entry
for _, e in ipairs(list.cards) do if e.key == row.key then entry = e end end
check(MysteryGift.receiveCard(s, entry.card), row.key .. " is saved")
eq(MysteryGift.deliverGift(s, entry.card), MysteryGift.DELIVER_GIVEN, row.key .. " joins the party")
eq(MysteryGift.deliverGift(s, entry.card), MysteryGift.DELIVER_ALREADY, row.key .. " only once")
local mon = s.party[#s.party]
eq(mon and mon.species, g.species, row.key .. " species")
if round == 1 then
if g.kind == "mon" then eq(mon.level, g.level, row.key .. " level") end
if g.otName then eq(mon.otName, g.otName, row.key .. " OT " .. g.otName) end
if g.otNames then
local hit = false
for _, n in ipairs(g.otNames) do if n == mon.otName then hit = true end end
check(hit, row.key .. " OT is one of its choices: " .. tostring(mon.otName))
end
if g.otIdMax then check(mon.otId >= 1 and mon.otId <= g.otIdMax, row.key .. " TID rolled in range")
elseif g.otId then eq(mon.otId, g.otId % 65536, row.key .. " TID") end
if g.otId and not g.secretIdRandom then eq(mon.otSecretId, 0, row.key .. " SID 0") end
if g.language then eq(mon.language, g.language, row.key .. " language") end
if g.otGender == 0 or g.otGender == 1 then eq(mon.otGender, g.otGender, row.key .. " OT gender") end
eq(mon.modernFatefulEncounter, g.fateful ~= false, row.key .. " fateful flag")
if g.nationalRibbon then eq(Ribbons.get(mon, "national"), 1, row.key .. " National Ribbon") end
if g.movesOnly then
for slot = 1, 4 do eq(mon.moves[slot], g.moves[tostring(slot)], row.key .. " move " .. slot) end
end
if g.nickname then eq(mon.nickname, g.nickname, row.key .. " nickname") end
end
if g.shiny == "never" then check(shinyValue(mon) >= 8, row.key .. " is never shiny") end
if g.shiny == "always" then check(shinyValue(mon) < 8, row.key .. " is always shiny") end
end
end
end
end
end
print("[test] 4. Every Ruby/Sapphire event passes the cart header on both games")
for _, game in ipairs({ "ruby", "sapphire" }) do
local list = assert(MysteryGift.verifyFeed(Json.decode(FEED_RS), "rs", game))
eq(#list.events, #raw("rs").events, "every rs event is listed on " .. game)
for _, ev in ipairs(list.events) do
check(MysteryGift.eventHeaderOk(ev.bytes, game), ev.key .. " passes me_checkcompat on " .. game)
end
end
print("[test] 5. News reaches every game")
for family, games in pairs(FAMILY_GAMES) do
for _, game in ipairs(games) do
local list = MysteryGift.verifyFeed(Json.decode(FEEDS[family]), family, game)
eq(list and #list.news, 1, "the news reaches " .. game)
end
end
T.finish("game3_gift_catalog")