diff --git a/data/dfndata/house/house_addons_ml.dfn b/data/dfndata/house/house_addons_ml.dfn new file mode 100644 index 000000000..57d6fe89d --- /dev/null +++ b/data/dfndata/house/house_addons_ml.dfn @@ -0,0 +1,828 @@ +// House Addon - Alchemist Table (East) +[HOUSE 300] +{ +ID=0x14F0 +SPACEX=1 +SPACEY=2 +CHARX=0 +CHARY=0 +CHARZ=0 +HOUSE_DEED=alchemisttabledeedeast +HOUSE_ITEM=1000 +HOUSE_ITEM=1001 +} + +// House Addon - Alchemist Table (South) +[HOUSE 301] +{ +ID=0x14F0 +SPACEX=2 +SPACEY=1 +CHARX=0 +CHARY=0 +CHARZ=0 +HOUSE_DEED=alchemisttablesouthdeed +HOUSE_ITEM=1002 +HOUSE_ITEM=1003 +} + +// House Addon - Elven Bed (East) +[HOUSE 302] +{ +ID=0x14F0 +SPACEX=2 +SPACEY=1 +CHARX=0 +CHARY=0 +CHARZ=0 +HOUSE_DEED=elvenbedeastdeed +HOUSE_ITEM=1004 +HOUSE_ITEM=1005 +} + +// House Addon - Elven Bed (South) +[HOUSE 303] +{ +ID=0x14F0 +SPACEX=1 +SPACEY=2 +CHARX=0 +CHARY=0 +CHARZ=0 +HOUSE_DEED=elvenbedsouthdeed +HOUSE_ITEM=1006 +HOUSE_ITEM=1007 +} + +// House Addon - Elven Loveseat (East) +[HOUSE 304] +{ +ID=0x14F0 +SPACEX=2 +SPACEY=1 +CHARX=0 +CHARY=0 +CHARZ=0 +HOUSE_DEED=elvenloveseateastdeed +HOUSE_ITEM=1008 +HOUSE_ITEM=1009 +} + +// House Addon - Elven Loveseat (South) +[HOUSE 305] +{ +ID=0x14F0 +SPACEX=1 +SPACEY=2 +CHARX=0 +CHARY=0 +CHARZ=0 +HOUSE_DEED=elvenloveseatsouthdeed +HOUSE_ITEM=1010 +HOUSE_ITEM=1011 +} + +// House Addon - Elven Wash Basin (East) +[HOUSE 306] +{ +ID=0x14F0 +SPACEX=1 +SPACEY=2 +CHARX=0 +CHARY=0 +CHARZ=0 +HOUSE_DEED=elvenwashbasineastdeed +HOUSE_ITEM=1012 +HOUSE_ITEM=1013 +} + +// House Addon - Elven Wash Basin (South) +[HOUSE 307] +{ +ID=0x14F0 +SPACEX=2 +SPACEY=1 +CHARX=0 +CHARY=0 +CHARZ=0 +HOUSE_DEED=elvenwashbasinsouthdeed +HOUSE_ITEM=1014 +HOUSE_ITEM=1015 +} + +// House Addon - Fancy Couch (East) +[HOUSE 308] +{ +ID=0x14F0 +SPACEX=1 +SPACEY=3 +CHARX=0 +CHARY=0 +CHARZ=0 +HOUSE_DEED=fancycoucheastdeed +HOUSE_ITEM=1016 +HOUSE_ITEM=1017 +HOUSE_ITEM=1018 +} + +// House Addon - Fancy Couch (North) +[HOUSE 309] +{ +ID=0x14F0 +SPACEX=3 +SPACEY=1 +CHARX=0 +CHARY=0 +CHARZ=0 +HOUSE_DEED=fancycouchnorthdeed +HOUSE_ITEM=1019 +HOUSE_ITEM=1020 +HOUSE_ITEM=1021 +} + +// House Addon - Fancy Couch (South) +[HOUSE 310] +{ +ID=0x14F0 +SPACEX=3 +SPACEY=1 +CHARX=0 +CHARY=0 +CHARZ=0 +HOUSE_DEED=fancycouchsouthdeed +HOUSE_ITEM=1022 +HOUSE_ITEM=1023 +HOUSE_ITEM=1024 +} + +// House Addon - Fancy Couch (West) +[HOUSE 311] +{ +ID=0x14F0 +SPACEX=1 +SPACEY=3 +CHARX=0 +CHARY=0 +CHARZ=0 +HOUSE_DEED=fancycouchwestdeed +HOUSE_ITEM=1025 +HOUSE_ITEM=1026 +HOUSE_ITEM=1027 +} + +// House Addon - Hardwood Table (East) +[HOUSE 312] +{ +ID=0x14F0 +SPACEX=3 +SPACEY=1 +CHARX=0 +CHARY=0 +CHARZ=0 +HOUSE_DEED=hardwoodtableeastdeed +HOUSE_ITEM=1028 +HOUSE_ITEM=1029 +HOUSE_ITEM=1030 +} + +// House Addon - Hardwood Table (South) +[HOUSE 313] +{ +ID=0x14F0 +SPACEX=1 +SPACEY=3 +CHARX=0 +CHARY=0 +CHARZ=0 +HOUSE_DEED=hardwoodtablesouthdeed +HOUSE_ITEM=1031 +HOUSE_ITEM=1032 +HOUSE_ITEM=1033 +} + +// House Addon - Fancy Loveseat (East) +[HOUSE 314] +{ +ID=0x14F0 +SPACEX=1 +SPACEY=2 +CHARX=0 +CHARY=0 +CHARZ=0 +HOUSE_DEED=fancyloveseateastdeed +HOUSE_ITEM=1034 +HOUSE_ITEM=1035 +} + +// House Addon - Fancy Loveseat (North) +[HOUSE 315] +{ +ID=0x14F0 +SPACEX=2 +SPACEY=1 +CHARX=0 +CHARY=0 +CHARZ=0 +HOUSE_DEED=fancyloveseatnorthdeed +HOUSE_ITEM=1036 +HOUSE_ITEM=1037 +} + +// House Addon - Fancy Loveseat (South) +[HOUSE 316] +{ +ID=0x14F0 +SPACEX=2 +SPACEY=1 +CHARX=0 +CHARY=0 +CHARZ=0 +HOUSE_DEED=fancyloveseatsouthdeed +HOUSE_ITEM=1038 +HOUSE_ITEM=1039 +} + +// House Addon - Fancy Loveseat (West) +[HOUSE 317] +{ +ID=0x14F0 +SPACEX=1 +SPACEY=2 +CHARX=0 +CHARY=0 +CHARZ=0 +HOUSE_DEED=fancyloveseatwestdeed +HOUSE_ITEM=1040 +HOUSE_ITEM=1041 +} + +// House Addon - Ornate Table (East) +[HOUSE 318] +{ +ID=0x14F0 +SPACEX=1 +SPACEY=3 +CHARX=0 +CHARY=0 +CHARZ=0 +HOUSE_DEED=ornatetableeastdeed +HOUSE_ITEM=1042 +HOUSE_ITEM=1043 +HOUSE_ITEM=1044 +} + +// House Addon - Ornate Table (South) +[HOUSE 319] +{ +ID=0x14F0 +SPACEX=3 +SPACEY=1 +CHARX=0 +CHARY=0 +CHARZ=0 +HOUSE_DEED=ornatetablesouthdeed +HOUSE_ITEM=1045 +HOUSE_ITEM=1046 +HOUSE_ITEM=1047 +} + +// House Addon - Plush Loveseat (East) +[HOUSE 320] +{ +ID=0x14F0 +SPACEX=1 +SPACEY=2 +CHARX=0 +CHARY=0 +CHARZ=0 +HOUSE_DEED=plushloveseateastdeed +HOUSE_ITEM=1048 +HOUSE_ITEM=1049 +} + +// House Addon - Plush Loveseat (South) +[HOUSE 321] +{ +ID=0x14F0 +SPACEX=2 +SPACEY=1 +CHARX=0 +CHARY=0 +CHARZ=0 +HOUSE_DEED=plushloveseatsouthdeed +HOUSE_ITEM=1050 +HOUSE_ITEM=1051 +} + +// House Addon - Tall Elven Bed (East) +[HOUSE 322] +{ +ID=0x14F0 +SPACEX=3 +SPACEY=2 +CHARX=0 +CHARY=0 +CHARZ=0 +HOUSE_DEED=tallelvenbedeastdeed +HOUSE_ITEM=1052 +HOUSE_ITEM=1053 +HOUSE_ITEM=1054 +HOUSE_ITEM=1055 +} + +// House Addon - Tall Elven Bed (South) +[HOUSE 323] +{ +ID=0x14F0 +SPACEX=2 +SPACEY=3 +CHARX=0 +CHARY=0 +CHARZ=0 +HOUSE_DEED=tallelvenbedsouthdeed +HOUSE_ITEM=1056 +HOUSE_ITEM=1057 +HOUSE_ITEM=1058 +HOUSE_ITEM=1059 +} + +[HOUSE ITEM 1000] +{ alchemist table part 1 (east) +ITEM=0x3077 +X=0 +Y=0 +Z=0 +} + +[HOUSE ITEM 1001] +{ alchemist table part 2 (east) +ITEM=0x3078 +X=0 +Y=-1 +Z=0 +} + +[HOUSE ITEM 1002] +{ alchemist table part 1 (south) +ITEM=0x3079 +X=0 +Y=0 +Z=0 +} + +[HOUSE ITEM 1003] +{ alchemist table part 2 (south) +ITEM=0x307A +X=-1 +Y=0 +Z=0 +} + +[HOUSE ITEM 1004] +{ elven bed part 1 (east) +ITEM=0x304D +X=0 +Y=0 +Z=0 +} + +[HOUSE ITEM 1005] +{ elven bed part 2 (east) +ITEM=0x304C +X=1 +Y=0 +Z=0 +} + +[HOUSE ITEM 1006] +{ elven bed part 1 (south) +ITEM=0x3050 +X=0 +Y=0 +Z=0 +} + +[HOUSE ITEM 1007] +{ +elven bed part 2 (south) +ITEM=0x3051 +X=0 +Y=-1 +Z=0 +} + +[HOUSE ITEM 1008] +{ elven loveseat part 1 (east) +ITEM=0x3089 +X=0 +Y=0 +Z=0 +} + +[HOUSE ITEM 1009] +{ elven loveseat part 2 (east) +ITEM=0x3088 +X=1 +Y=0 +Z=0 +} + +[HOUSE ITEM 1010] +{ elven loveseat part 1 (south) +ITEM=0x308A +X=0 +Y=0 +Z=0 +} + +[HOUSE ITEM 1011] +{ elven loveseat part 2 (south) +ITEM=0x308B +X=0 +Y=-1 +Z=0 +} + +[HOUSE ITEM 1012] +{ elven wash basin part 1 (east) +ITEM=0x30DF +X=0 +Y=0 +Z=0 +} + +[HOUSE ITEM 1013] +{ elven wash basin part 2 (east) +ITEM=0x30E0 +X=0 +Y=1 +Z=0 +} + +[HOUSE ITEM 1014] +{ elven wash basin part 1 (south) +ITEM=0x30E1 +X=0 +Y=0 +Z=0 +} + +[HOUSE ITEM 1015] +{ elven wash basin part 2 (south) +ITEM=0x30E2 +X=1 +Y=0 +Z=0 +} + +[HOUSE ITEM 1016] +{ fancy couch part 1 (east) +ITEM=0x4C8C +X=0 +Y=-1 +Z=0 +} + +[HOUSE ITEM 1017] +{ fancy couch part 2 (east) +ITEM=0x4C8A +X=0 +Y=0 +Z=0 +} + +[HOUSE ITEM 1018] +{ fancy couch part 3 (east) +ITEM=0x4C8B +X=0 +Y=1 +Z=0 +} + +[HOUSE ITEM 1019] +{ fancy couch part 1 (north) +ITEM=0x9C62 +X=-1 +Y=0 +Z=0 +} + +[HOUSE ITEM 1020] +{ fancy couch part 2 (north) +ITEM=0x9C61 +X=0 +Y=0 +Z=0 +} + +[HOUSE ITEM 1021] +{ fancy couch part 3 (north) +ITEM=0x9C60 +X=1 +Y=0 +Z=0 +} + +[HOUSE ITEM 1022] +{ fancy couch part 1 (south) +ITEM=0x4C8D +X=0 +Y=0 +Z=0 +} + +[HOUSE ITEM 1023] +{ fancy couch part 2 (south) +ITEM=0x4C8E +X=-1 +Y=0 +Z=0 +} + +[HOUSE ITEM 1024] +{ fancy couch part 3 (south) +ITEM=0x4C8F +X=1 +Y=0 +Z=0 +} + +[HOUSE ITEM 1025] +{ fancy couch part 1 (west) +ITEM=0x9C5F +X=0 +Y=-1 +Z=0 +} + +[HOUSE ITEM 1026] +{ fancy couch part 2 (west) +ITEM=0x9C5E +X=0 +Y=0 +Z=0 +} + +[HOUSE ITEM 1027] +{ fancy couch part 3 (west) +ITEM=0x9C5D +X=0 +Y=1 +Z=0 +} + +[HOUSE ITEM 1028] +{ hardwood table part 1 (east) +ITEM=0x3094 +X=-1 +Y=0 +Z=0 +} + +[HOUSE ITEM 1029] +{ hardwood table part 2 (east) +ITEM=0x3093 +X=0 +Y=0 +Z=0 +} + +[HOUSE ITEM 1030] +{ hardwood table part 3 (east) +ITEM=0x3092 +X=1 +Y=0 +Z=0 +} + +[HOUSE ITEM 1031] +{ hardwood table part 1 (south) +ITEM=0x3095 +X=0 +Y=1 +Z=0 +} + +[HOUSE ITEM 1032] +{ hardwood table part 2 (south) +ITEM=0x3096 +X=0 +Y=0 +Z=0 +} + +[HOUSE ITEM 1033] +{ hardwood table part 3 (south) +ITEM=0x3097 +X=0 +Y=-1 +Z=0 +} + +[HOUSE ITEM 1034] +{ fancy loveseat part 1 (east) +ITEM=0x4C88 +X=0 +Y=0 +Z=0 +} + +[HOUSE ITEM 1035] +{ fancy loveseat part 2 (east) +ITEM=0x4C89 +X=0 +Y=1 +Z=0 +} + +[HOUSE ITEM 1036] +{ fancy loveseat part 1 (north) +ITEM=0x9C5A +X=0 +Y=0 +Z=0 +} + +[HOUSE ITEM 1037] +{ fancy loveseat part 2 (north) +ITEM=0x9C59 +X=1 +Y=0 +Z=0 +} + +[HOUSE ITEM 1038] +{ fancy loveseat part 1 (south) +ITEM=0x4C87 +X=0 +Y=0 +Z=0 +} + +[HOUSE ITEM 1039] +{ fancy loveseat part 2 (south) +ITEM=0x4C86 +X=1 +Y=0 +Z=0 +} + +[HOUSE ITEM 1040] +{ fancy loveseat part 1 (west) +ITEM=0x9C58 +X=0 +Y=0 +Z=0 +} + +[HOUSE ITEM 1041] +{ fancy loveseat part 2 (west) +ITEM=0x9C57 +X=0 +Y=1 +Z=0 +} + +[HOUSE ITEM 1042] +{ ornate table part 1 (east) +ITEM=0x308F +X=0 +Y=1 +Z=0 +} + +[HOUSE ITEM 1043] +{ ornate table part 2 (east) +ITEM=0x3090 +X=0 +Y=0 +Z=0 +} + +[HOUSE ITEM 1044] +{ ornate table part 3 (east) +ITEM=0x3091 +X=0 +Y=-1 +Z=0 +} + +[HOUSE ITEM 1045] +{ ornate table part 1 (south) +ITEM=0x308E +X=-1 +Y=0 +Z=0 +} + +[HOUSE ITEM 1046] +{ ornate table part 2 (south) +ITEM=0x308D +X=0 +Y=0 +Z=0 +} + +[HOUSE ITEM 1047] +{ ornate table part 3 (south) +ITEM=0x308C +X=1 +Y=0 +Z=0 +} + +[HOUSE ITEM 1048] +{ plush loveseat part 1 (east) +ITEM=0x4C84 +X=0 +Y=0 +Z=0 +} + +[HOUSE ITEM 1049] +{ plush loveseat part 2 (east) +ITEM=0x4C85 +X=0 +Y=1 +Z=0 +} + +[HOUSE ITEM 1050] +{ plush loveseat part 1 (south) +ITEM=0x4C83 +X=0 +Y=0 +Z=0 +} + +[HOUSE ITEM 1051] +{ plush loveseat part 2 (south) +ITEM=0x4C82 +X=1 +Y=0 +Z=0 +} + +[HOUSE ITEM 1052] +{ tall elven bed part 1 (east) +ITEM=0x3054 +X=0 +Y=0 +Z=0 +} + +[HOUSE ITEM 1053] +{ tall elven bed part 2 (east) +ITEM=0x3053 +X=1 +Y=0 +Z=0 +} + +[HOUSE ITEM 1054] +{ tall elven bed part 3 (east) +ITEM=0x3055 +X=2 +Y=-1 +Z=0 +} + +[HOUSE ITEM 1055] +{ tall elven bed part 4 (east) +ITEM=0x3052 +X=2 +Y=0 +Z=0 +} + +[HOUSE ITEM 1056] +{ tall elven bed part 1 (south) +ITEM=0x3058 +X=0 +Y=0 +Z=0 +} + +[HOUSE ITEM 1057] +{ tall elven bed part 2 (south) +ITEM=0x3057 +X=-1 +Y=1 +Z=0 +} + +[HOUSE ITEM 1058] +{ tall elven bed part 3 (south) +ITEM=0x3059 +X=0 +Y=-1 +Z=0 +} + +[HOUSE ITEM 1059] +{ tall elven bed part 4 (south) +ITEM=0x3056 +X=0 +Y=1 +Z=0 +} \ No newline at end of file diff --git a/data/dfndata/house/house_aos.dfn b/data/dfndata/house/house_aos.dfn new file mode 100644 index 000000000..b601740ca --- /dev/null +++ b/data/dfndata/house/house_aos.dfn @@ -0,0 +1,290 @@ +// House Addon - Mini House: Stone and Plaster +[HOUSE 500] +{ +ID=0x14F0 +SPACEX=1 +SPACEY=1 +CHARX=0 +CHARY=0 +CHARZ=0 +HOUSE_DEED=stoneandplastermini +HOUSE_ITEM=1500 +} + +// House Addon - Mini House: Field Stone +[HOUSE 501] +{ +ID=0x14F0 +SPACEX=1 +SPACEY=1 +CHARX=0 +CHARY=0 +CHARZ=0 +HOUSE_DEED=fieldstonemini +HOUSE_ITEM=1501 +} + +// House Addon - Mini House: Small Brick +[HOUSE 502] +{ +ID=0x14F0 +SPACEX=1 +SPACEY=1 +CHARX=0 +CHARY=0 +CHARZ=0 +HOUSE_DEED=smallbrickmini +HOUSE_ITEM=1502 +} + +// House Addon - Mini House: Wooden +[HOUSE 503] +{ +ID=0x14F0 +SPACEX=1 +SPACEY=1 +CHARX=0 +CHARY=0 +CHARZ=0 +HOUSE_DEED=woodenmini +HOUSE_ITEM=1503 +} + +// House Addon - Mini House: Wood and Plaster +[HOUSE 504] +{ +ID=0x14F0 +SPACEX=1 +SPACEY=1 +CHARX=0 +CHARY=0 +CHARZ=0 +HOUSE_DEED=woodandplastermini +HOUSE_ITEM=1504 +} + +// House Addon - Mini House: Thatched-Roof Cottage +[HOUSE 505] +{ +ID=0x14F0 +SPACEX=1 +SPACEY=1 +CHARX=0 +CHARY=0 +CHARZ=0 +HOUSE_DEED=thatchedroofcottage +HOUSE_ITEM=1505 +} + +// House Addon - Mini House: Brick +[HOUSE 506] +{ +ID=0x14F0 +SPACEX=4 +SPACEY=1 +CHARX=0 +CHARY=0 +CHARZ=0 +HOUSE_DEED=brickmini +HOUSE_ITEM=1506 +HOUSE_ITEM=1507 +HOUSE_ITEM=1508 +HOUSE_ITEM=1509 +} + +// House Addon - Mini House: Two-Story Wood and Plaster +[HOUSE 507] +{ +ID=0x14F0 +SPACEX=2 +SPACEY=2 +CHARX=0 +CHARY=0 +CHARZ=0 +HOUSE_DEED=twostorywoodandplastermini +HOUSE_ITEM=1510 +HOUSE_ITEM=1511 +HOUSE_ITEM=1512 +HOUSE_ITEM=1513 +} + +// House Addon - Mini House: Malas Mountain Pass +[HOUSE 508] +{ +ID=0x14F0 +SPACEX=2 +SPACEY=2 +CHARX=0 +CHARY=0 +CHARZ=0 +HOUSE_DEED=malasmountainpassmini +HOUSE_ITEM=1514 +HOUSE_ITEM=1515 +HOUSE_ITEM=1516 +HOUSE_ITEM=1517 +} + +// House Addon - Mini House: Church at Night +[HOUSE 509] +{ +ID=0x14F0 +SPACEX=1 +SPACEY=1 +CHARX=0 +CHARY=0 +CHARZ=0 +HOUSE_DEED=churchatnightmini +HOUSE_ITEM=1518 +} + +[HOUSE ITEM 1500] +{ mini house part 1 (Stone and Plaster) +ITEM=0x22C4 +X=0 +Y=0 +Z=0 +} + +[HOUSE ITEM 1501] +{ mini house part 1 (Field Stone) +ITEM=0x22DE +X=0 +Y=0 +Z=0 +} + +[HOUSE ITEM 1502] +{ mini house part 1 (Small Brick) +ITEM=0x22DF +X=0 +Y=0 +Z=0 +} + +[HOUSE ITEM 1503] +{ mini house part 1 (Wooden) +ITEM=0x22C9 +X=0 +Y=0 +Z=0 +} + +[HOUSE ITEM 1504] +{ mini house part 1 (Wood and Plaster) +ITEM=0x22E0 +X=0 +Y=0 +Z=0 +} + +[HOUSE ITEM 1505] +{ mini house part 1 (Thatched-Roof Cottage) +ITEM=0x22E1 +X=0 +Y=0 +Z=0 +} + +[HOUSE ITEM 1506] +{ mini house part 1 (Brick) +ITEM=0x22CD +X=0 +Y=0 +Z=0 +} + +[HOUSE ITEM 1507] +{ mini house part 2 (Brick) +ITEM=0x22CB +X=1 +Y=0 +Z=0 +} + +[HOUSE ITEM 1508] +{ mini house part 3 (Brick) +ITEM=0x22CC +X=2 +Y=0 +Z=0 +} + +[HOUSE ITEM 1509] +{ mini house part 4 (Brick) +ITEM=0x22CA +X=3 +Y=0 +Z=0 +} + +[HOUSE ITEM 1510] +{ mini house part 1 (Two-Story Wood and Plaster) +ITEM=0x2301 +X=0 +Y=0 +Z=0 +} + +[HOUSE ITEM 1511] +{ mini house part 2 (Two-Story Wood and Plaster) +ITEM=0x2302 +X=1 +Y=0 +Z=0 +} + +[HOUSE ITEM 1512] +{ mini house part 3 (Two-Story Wood and Plaster) +ITEM=0x2304 +X=0 +Y=1 +Z=0 +} + +[HOUSE ITEM 1513] +{ mini house part 4 (Two-Story Wood and Plaster) +ITEM=0x2303 +X=1 +Y=1 +Z=0 +} + +[HOUSE ITEM 1514] +{ mini house part 1 (Malas Mountain Pass) +ITEM=0x2316 +X=0 +Y=0 +Z=0 +} + +[HOUSE ITEM 1515] +{ mini house part 2 (Malas Mountain Pass) +ITEM=0x2315 +X=1 +Y=0 +Z=0 +} + +[HOUSE ITEM 1516] +{ mini house part 3 (Malas Mountain Pass) +ITEM=0x2314 +X=0 +Y=1 +Z=0 +} + +[HOUSE ITEM 1517] +{ mini house part 4 (Malas Mountain Pass) +ITEM=0x2313 +X=1 +Y=1 +Z=0 +} + +[HOUSE ITEM 1518] +{ mini house part 1 (Church at Night) +ITEM=0x2318 +X=0 +Y=0 +Z=0 +} \ No newline at end of file diff --git a/data/dfndata/items/ItemMenu.bulk.dfn b/data/dfndata/items/ItemMenu.bulk.dfn index 0da06b87d..7c3e65809 100644 --- a/data/dfndata/items/ItemMenu.bulk.dfn +++ b/data/dfndata/items/ItemMenu.bulk.dfn @@ -9097,6 +9097,8 @@ ADDITEM=0x0e7c ADDITEM=0x0e40 0x0e41=metal chest ADDITEM=0x0e41 +0x0e41=Puzzle Chest +ADDITEM=puzzlechest <=Previous Menu ITEMMENU=3 } @@ -14253,3 +14255,85 @@ ADDITEM=mapmakerspen <=Previous Menu ITEMMENU=127 } + +[ITEMMENU 260] +{ +Houseaddon_ML_Deeds.dfn +0x14F0=Elven Bed (East) +ADDITEM=elvenbedeastdeed +0x14F0=Elven Bed (South) +ADDITEM=elvenbedsouthdeed +0x14F0=Alchemist Table (East) +ADDITEM=alchemisttabledeedeast +0x14F0=Alchemist Table (South) +ADDITEM=alchemisttablesouthdeed +0x14F0=Elven Loveseat (East) +ADDITEM=elvenloveseateastdeed +0x14F0=Elven Loveseat (South) +ADDITEM=elvenloveseatsouthdeed +0x14F0=Elven Wash Basin (East) +ADDITEM=elvenwashbasineastdeed +0x14F0=Elven Wash Basin (South) +ADDITEM=elvenwashbasinsouthdeed +0x14F0=Fancy Couch (East) +ADDITEM=fancycoucheastdeed +0x14F0=Fancy Couch (North) +ADDITEM=fancycouchnorthdeed +0x14F0=Fancy Couch (South) +ADDITEM=fancycouchsouthdeed +0x14F0=Fancy Couch (West) +ADDITEM=fancycouchwestdeed +0x14F0=Hardwood Table (East) +ADDITEM=hardwoodtableeastdeed +0x14F0=Hardwood Table (South) +ADDITEM=hardwoodtablesouthdeed +0x14F0=Fancy Loveseat (East) +ADDITEM=fancyloveseateastdeed +0x14F0=Fancy Loveseat (North) +ADDITEM=fancyloveseatnorthdeed +0x14F0=Fancy Loveseat (South) +ADDITEM=fancyloveseatsouthdeed +0x14F0=Fancy Loveseat (West) +ADDITEM=fancyloveseatwestdeed +0x14F0=Ornate Table (East) +ADDITEM=ornatetableeastdeed +0x14F0=Ornate Table (South) +ADDITEM=ornatetablesouthdeed +0x14F0=Plush Loveseat (East) +ADDITEM=plushloveseateastdeed +0x14F0=Plush Loveseat (South) +ADDITEM=plushloveseatsouthdeed +0x14F0=Tall Elven Bed (East) +ADDITEM=tallelvenbedeastdeed +0x14F0=Tall Elven Bed (South) +ADDITEM=tallelvenbedsouthdeed +<=Previous Menu +ITEMMENU=4 +} + +[ITEMMENU 261] +{ +minihouseaddon_deeds.dfn +0x14F0=Mini House: Stone and Plaster +ADDITEM=stoneandplastermini +0x14F0=Mini House: Field Stone +ADDITEM=fieldstonemini +0x14F0=Mini House: Small Brick +ADDITEM=smallbrickmini +0x14F0=Mini House: Wooden +ADDITEM=woodenmini +0x14F0=Mini House: Wood and Plaster +ADDITEM=woodandplastermini +0x14F0=Mini House: Thatched-Roof Cottage +ADDITEM=thatchedroofcottage +0x14F0=Mini House: Brick +ADDITEM=brickmini +0x14F0=Mini House: Two-Story Wood and Plaster +ADDITEM=twostorywoodandplastermini +0x14F0=Mini House: Malas Mountain Pass +ADDITEM=malasmountainpassmini +0x14F0=Mini House: Church at Night +ADDITEM=churchatnightmini +<=Previous Menu +ITEMMENU=4 +} diff --git a/data/dfndata/items/ItemMenu.dfn b/data/dfndata/items/ItemMenu.dfn index 7815ab7f7..8b0ffc0ac 100644 --- a/data/dfndata/items/ItemMenu.dfn +++ b/data/dfndata/items/ItemMenu.dfn @@ -303,6 +303,10 @@ ITEMMENU=68 ITEMMENU=69 <=Houseaddon Deeds ITEMMENU=71 +<=Houseaddon ML Deeds +ITEMMENU=260 +<=Mini Houseaddon Deeds +ITEMMENU=261 <=Misc Deeds ITEMMENU=70 <=Previous Menu diff --git a/data/dfndata/items/building/furniture/furniture_ml.dfn b/data/dfndata/items/building/furniture/furniture_ml.dfn new file mode 100644 index 000000000..89bfaff42 --- /dev/null +++ b/data/dfndata/items/building/furniture/furniture_ml.dfn @@ -0,0 +1,539 @@ +// Elven Bed (East) +[0x304D] +{ +get=base_item +name=Elven Bed (East) Part 1 +id=0x304D +weight=1000 +movable=1 +origin=ml +} + +[0x304C] +{ +get=base_item +name=Elven Bed (East) Part 2 +id=0x304C +weight=1000 +movable=1 +origin=ml +} + +// Elven Bed (South) +[0x3050] +{ +get=base_item +name=Elven Bed (South) Part 1 +id=0x3050 +weight=1000 +movable=1 +origin=ml +} + +[0x3051] +{ +get=base_item +name=Elven Bed (South) Part 2 +id=0x3051 +weight=1000 +movable=1 +origin=ml +} + +// Alchemist Table (East) +[0x3077] +{ +get=base_item +name=Alchemist Table (East) Part 1 +id=0x3077 +weight=1000 +movable=1 +origin=ml +} + +[0x3078] +{ +get=base_item +name=Alchemist Table (East) Part 2 +id=0x3078 +weight=1000 +movable=1 +origin=ml +} + +// Alchemist Table (South) +[0x3079] +{ +get=base_item +name=Alchemist Table (South) Part 1 +id=0x3079 +weight=1000 +movable=1 +origin=ml +} + +[0x307A] +{ +get=base_item +name=Alchemist Table (South) Part 2 +id=0x307A +weight=1000 +movable=1 +origin=ml +} + +// Elven Loveseat (East) +[0x3089] +{ +get=base_item +name=Elven Loveseat (East) Part 1 +id=0x3089 +weight=1000 +movable=1 +origin=ml +} + +[0x3088] +{ +get=base_item +name=Elven Loveseat (East) Part 2 +id=0x3088 +weight=1000 +movable=1 +origin=ml +} + +// Elven Loveseat (South) +[0x308A] +{ +get=base_item +name=Elven Loveseat (South) Part 1 +id=0x308A +weight=1000 +movable=1 +origin=ml +} + +[0x308B] +{ +get=base_item +name=Elven Loveseat (South) Part 2 +id=0x308B +weight=1000 +movable=1 +origin=ml +} + +// Elven Wash Basin (East) +[0x30DF] +{ +get=base_item +name=Elven Wash Basin (East) Part 1 +id=0x30DF +weight=1000 +movable=1 +origin=ml +} + +[0x30E0] +{ +get=base_item +name=Elven Wash Basin (East) Part 2 +id=0x30E0 +weight=1000 +movable=1 +origin=ml +} + +// Elven Wash Basin (South) +[0x30E1] +{ +get=base_item +name=Elven Wash Basin (South) Part 1 +id=0x30E1 +weight=1000 +movable=1 +origin=ml +} + +[0x30E2] +{ +get=base_item +name=Elven Wash Basin (South) Part 2 +id=0x30E2 +weight=1000 +movable=1 +origin=ml +} + +// Fancy Couch (East) +[0x4C8C] +{ +get=base_item +name=Fancy Couch (East) Part 1 +id=0x4C8C +weight=1000 +movable=1 +origin=ml +} + +[0x4C8A] +{ +get=base_item +name=Fancy Couch (East) Part 2 +id=0x4C8A +weight=1000 +movable=1 +origin=ml +} + +[0x4C8B] +{ +get=base_item +name=Fancy Couch (East) Part 3 +id=0x4C8B +weight=1000 +movable=1 +origin=ml +} + +// Fancy Couch (North) +[0x9C62] +{ +get=base_item +name=Fancy Couch (North) Part 1 +id=0x9C62 +weight=1000 +movable=1 +origin=ml +} + +[0x9C61] +{ +get=base_item +name=Fancy Couch (North) Part 2 +id=0x9C61 +weight=1000 +movable=1 +origin=ml +} + +[0x9C60] +{ +get=base_item +name=Fancy Couch (North) Part 3 +id=0x9C60 +weight=1000 +movable=1 +origin=ml +} + +// Fancy Couch (South) +[0x4C8D] +{ +get=base_item +name=Fancy Couch (South) Part 1 +id=0x4C8D +weight=1000 +movable=1 +origin=ml +} + +[0x4C8E] +{ +get=base_item +name=Fancy Couch (South) Part 2 +id=0x4C8E +weight=1000 +movable=1 +origin=ml +} + +[0x4C8F] +{ +get=base_item +name=Fancy Couch (South) Part 3 +id=0x4C8F +weight=1000 +movable=1 +origin=ml +} + +// Fancy Couch (West) +[0x9C5F] +{ +get=base_item +name=Fancy Couch (West) Part 1 +id=0x9C5F +weight=1000 +movable=1 +origin=ml +} + +[0x9C5E] +{ +get=base_item +name=Fancy Couch (West) Part 2 +id=0x9C5E +weight=1000 +movable=1 +origin=ml +} + +[0x9C5D] +{ +get=base_item +name=Fancy Couch (West) Part 3 +id=0x9C5D +weight=1000 +movable=1 +origin=ml +} + +// Hardwood Table (East) +[0x3094] +{ +get=base_item +name=Hardwood Table (East) Part 1 +id=0x3094 +weight=1000 +movable=1 +origin=ml +} + +[0x3093] +{ +get=base_item +name=Hardwood Table (East) Part 2 +id=0x3093 +weight=1000 +movable=1 +origin=ml +} + +[0x3092] +{ +get=base_item +name=Hardwood Table (East) Part 3 +id=0x3092 +weight=1000 +movable=1 +origin=ml +} + +// Hardwood Table (South) +[0x3095] +{ +get=base_item +name=Hardwood Table (South) Part 1 +id=0x3095 +weight=1000 +movable=1 +origin=ml +} + +[0x3096] +{ +get=base_item +name=Hardwood Table (South) Part 2 +id=0x3096 +weight=1000 +movable=1 +origin=ml +} + +[0x3097] +{ +get=base_item +name=Hardwood Table (South) Part 3 +id=0x3097 +weight=1000 +movable=1 +origin=ml +} + +// Ornate Table (East) +[0x308F] +{ +get=base_item +name=Ornate Table (East) Part 1 +id=0x308F +weight=1000 +movable=1 +origin=ml +} + +[0x3090] +{ +get=base_item +name=Ornate Table (East) Part 2 +id=0x3090 +weight=1000 +movable=1 +origin=ml +} + +[0x3091] +{ +get=base_item +name=Ornate Table (East) Part 3 +id=0x3091 +weight=1000 +movable=1 +origin=ml +} + +// Ornate Table (South) +[0x308E] +{ +get=base_item +name=Ornate Table (South) Part 1 +id=0x308E +weight=1000 +movable=1 +origin=ml +} + +[0x308D] +{ +get=base_item +name=Ornate Table (South) Part 2 +id=0x308D +weight=1000 +movable=1 +origin=ml +} + +[0x308C] +{ +get=base_item +name=Ornate Table (South) Part 3 +id=0x308C +weight=1000 +movable=1 +origin=ml +} + +// Plush Loveseat (East) +[0x4C84] +{ +get=base_item +name=Plush Loveseat (East) Part 1 +id=0x4C84 +weight=1000 +movable=1 +origin=ml +} + +[0x4C85] +{ +get=base_item +name=Plush Loveseat (East) Part 2 +id=0x4C85 +weight=1000 +movable=1 +origin=ml +} + +// Plush Loveseat (South) +[0x4C83] +{ +get=base_item +name=Plush Loveseat (South) Part 1 +id=0x4C83 +weight=1000 +movable=1 +origin=ml +} + +[0x4C82] +{ +get=base_item +name=Plush Loveseat (South) Part 2 +id=0x4C82 +weight=1000 +movable=1 +origin=ml +} + +// Tall Elven Bed (East) +[0x3054] +{ +get=base_item +name=Tall Elven Bed (East) Part 1 +id=0x3054 +weight=1000 +movable=1 +origin=ml +} + +[0x3053] +{ +get=base_item +name=Tall Elven Bed (East) Part 2 +id=0x3053 +weight=1000 +movable=1 +origin=ml +} + +[0x3055] +{ +get=base_item +name=Tall Elven Bed (East) Part 3 +id=0x3055 +weight=1000 +movable=1 +origin=ml +} + +[0x3052] +{ +get=base_item +name=Tall Elven Bed (East) Part 4 +id=0x3052 +weight=1000 +movable=1 +origin=ml +} + +// Tall Elven Bed (South) +[0x3058] +{ +get=base_item +name=Tall Elven Bed (South) Part 1 +id=0x3058 +weight=1000 +movable=1 +origin=ml +} + +[0x3057] +{ +get=base_item +name=Tall Elven Bed (South) Part 2 +id=0x3057 +weight=1000 +movable=1 +origin=ml +} + +[0x3059] +{ +get=base_item +name=Tall Elven Bed (South) Part 3 +id=0x3059 +weight=1000 +movable=1 +origin=ml +} + +[0x3056] +{ +get=base_item +name=Tall Elven Bed (South) Part 4 +id=0x3056 +weight=1000 +movable=1 +origin=ml +} \ No newline at end of file diff --git a/data/dfndata/items/building/furniture/minihouse_parts.dfn b/data/dfndata/items/building/furniture/minihouse_parts.dfn new file mode 100644 index 000000000..9385ee133 --- /dev/null +++ b/data/dfndata/items/building/furniture/minihouse_parts.dfn @@ -0,0 +1,199 @@ +// Base Item for Mini House: Stone and Plaster +[0x22C4] +{ +get=base_item +name=Mini House: Stone and Plaster +id=0x22C4 +weight=1000 +movable=1 +origin=aos +} + +// Base Item for Mini House: Field Stone +[0x22DE] +{ +get=base_item +name=Mini House: Field Stone +id=0x22DE +weight=1000 +movable=1 +origin=aos +} + +// Base Item for Mini House: Small Brick +[0x22DF] +{ +get=base_item +name=Mini House: Small Brick +id=0x22DF +weight=1000 +movable=1 +origin=aos +} + +// Base Item for Mini House: Wooden +[0x22C9] +{ +get=base_item +name=Mini House: Wooden +id=0x22C9 +weight=1000 +movable=1 +origin=aos +} + +// Base Item for Mini House: Wood and Plaster +[0x22E0] +{ +get=base_item +name=Mini House: Wood and Plaster +id=0x22E0 +weight=1000 +movable=1 +origin=aos +} + +// Base Item for Mini House: Thatched-Roof Cottage +[0x22E1] +{ +get=base_item +name=Mini House: Thatched-Roof Cottage +id=0x22E1 +weight=1000 +movable=1 +origin=aos +} + +// Base Items for Mini House: Brick +[0x22CD] +{ +get=base_item +name=Mini House: Brick Part 1 +id=0x22CD +weight=1000 +movable=1 +origin=aos +} + +[0x22CB] +{ +get=base_item +name=Mini House: Brick Part 2 +id=0x22CB +weight=1000 +movable=1 +origin=aos +} + +[0x22CC] +{ +get=base_item +name=Mini House: Brick Part 3 +id=0x22CC +weight=1000 +movable=1 +origin=aos +} + +[0x22CA] +{ +get=base_item +name=Mini House: Brick Part 4 +id=0x22CA +weight=1000 +movable=1 +origin=aos +} + +// Base Items for Mini House: Two-Story Wood and Plaster +[0x2301] +{ +get=base_item +name=Mini House: Two-Story Wood and Plaster Part 1 +id=0x2301 +weight=1000 +movable=1 +origin=aos +} + +[0x2302] +{ +get=base_item +name=Mini House: Two-Story Wood and Plaster Part 2 +id=0x2302 +weight=1000 +movable=1 +origin=aos +} + +[0x2304] +{ +get=base_item +name=Mini House: Two-Story Wood and Plaster Part 3 +id=0x2304 +weight=1000 +movable=1 +origin=aos +} + +[0x2303] +{ +get=base_item +name=Mini House: Two-Story Wood and Plaster Part 4 +id=0x2303 +weight=1000 +movable=1 +origin=aos +} + +// Base Items for Mini House: Malas Mountain Pass +[0x2316] +{ +get=base_item +name=Mini House: Malas Mountain Pass Part 1 +id=0x2316 +weight=1000 +movable=1 +origin=aos +} + +[0x2315] +{ +get=base_item +name=Mini House: Malas Mountain Pass Part 2 +id=0x2315 +weight=1000 +movable=1 +origin=aos +} + +[0x2314] +{ +get=base_item +name=Mini House: Malas Mountain Pass Part 3 +id=0x2314 +weight=1000 +movable=1 +origin=aos +} + +[0x2313] +{ +get=base_item +name=Mini House: Malas Mountain Pass Part 4 +id=0x2313 +weight=1000 +movable=1 +origin=aos +} + +// Base Item for Mini House: Church at Night +[0x2318] +{ +get=base_item +name=Mini House: Church at Night +id=0x2318 +weight=1000 +movable=1 +origin=aos +} \ No newline at end of file diff --git a/data/dfndata/items/containers/metal.dfn b/data/dfndata/items/containers/metal.dfn index d891d69a2..e4309af33 100644 --- a/data/dfndata/items/containers/metal.dfn +++ b/data/dfndata/items/containers/metal.dfn @@ -134,3 +134,13 @@ maxitems=125 { get=0x0e40 0x0e41 } + +[puzzlechest] +{ +get=base_item +name=metal chest +id=0x0e41 +movable=2 +script=5061 +origin=uor +} diff --git a/data/dfndata/items/deeds/houseaddon_deeds_ml.dfn b/data/dfndata/items/deeds/houseaddon_deeds_ml.dfn new file mode 100644 index 000000000..59ffb2c8e --- /dev/null +++ b/data/dfndata/items/deeds/houseaddon_deeds_ml.dfn @@ -0,0 +1,215 @@ +// Elven Bed (East) Deed +[elvenbedeastdeed] +{ +name=Elven Bed (East) +id=0x14F0 +morex=300 +origin=ml +} + +// Elven Bed (South) Deed +[elvenbedsouthdeed] +{ +name=Elven Bed (South) +id=0x14F0 +morex=301 +origin=ml +} + +// Alchemist Table (East) Deed +[alchemisttabledeedeast] +{ +name=Alchemist Table (East) +id=0x14F0 +morex=300 +origin=ml +} + +// Alchemist Table (South) Deed +[alchemisttablesouthdeed] +{ +name=Alchemist Table (South) +id=0x14F0 +morex=301 +origin=ml +} + +// Elven Loveseat (East) Deed +[elvenloveseateastdeed] +{ +name=Elven Loveseat (East) +id=0x14F0 +morex=304 +origin=ml +} + +// Elven Loveseat (South) Deed +[elvenloveseatsouthdeed] +{ +name=Elven Loveseat (South) +id=0x14F0 +morex=305 +origin=ml +} + +// Elven Wash Basin (East) Deed +[elvenwashbasineastdeed] +{ +name=Elven Wash Basin (East) +id=0x14F0 +morex=306 +origin=ml +} + +// Elven Wash Basin (South) Deed +[elvenwashbasinsouthdeed] +{ +name=Elven Wash Basin (South) +id=0x14F0 +morex=307 +origin=ml +} + +// Fancy Couch (East) Deed +[fancycoucheastdeed] +{ +name=Fancy Couch (East) +id=0x14F0 +morex=308 +origin=ml +} + +// Fancy Couch (North) Deed +[fancycouchnorthdeed] +{ +name=Fancy Couch (North) +id=0x14F0 +morex=309 +origin=ml +} + +// Fancy Couch (South) Deed +[fancycouchsouthdeed] +{ +name=Fancy Couch (South) +id=0x14F0 +morex=310 +origin=ml +} + +// Fancy Couch (West) Deed +[fancycouchwestdeed] +{ +name=Fancy Couch (West) +id=0x14F0 +morex=311 +origin=ml +} + +// Hardwood Table (East) Deed +[hardwoodtableeastdeed] +{ +name=Hardwood Table (East) +id=0x14F0 +morex=312 +origin=ml +} + +// Hardwood Table (South) Deed +[hardwoodtablesouthdeed] +{ +name=Hardwood Table (South) +id=0x14F0 +morex=313 +origin=ml +} + +// Fancy Loveseat (East) Deed +[fancyloveseateastdeed] +{ +name=Fancy Loveseat (East) +id=0x14F0 +morex=314 +origin=ml +} + +// Fancy Loveseat (North) Deed +[fancyloveseatnorthdeed] +{ +name=Fancy Loveseat (North) +id=0x14F0 +morex=315 +origin=ml +} + +// Fancy Loveseat (South) Deed +[fancyloveseatsouthdeed] +{ +name=Fancy Loveseat (South) +id=0x14F0 +morex=316 +origin=ml +} + +// Fancy Loveseat (West) Deed +[fancyloveseatwestdeed] +{ +name=Fancy Loveseat (West) +id=0x14F0 +morex=317 +origin=ml +} + +// Ornate Table (East) Deed +[ornatetableeastdeed] +{ +name=Ornate Table (East) +id=0x14F0 +morex=318 +origin=ml +} + +// Ornate Table (South) Deed +[ornatetablesouthdeed] +{ +name=Ornate Table (South) +id=0x14F0 +morex=319 +origin=ml +} + +// Plush Loveseat (East) Deed +[plushloveseateastdeed] +{ +name=Plush Loveseat (East) +id=0x14F0 +morex=320 +origin=ml +} + +// Plush Loveseat (South) Deed +[plushloveseatsouthdeed] +{ +name=Plush Loveseat (South) +id=0x14F0 +morex=321 +origin=ml +} + +// Tall Elven Bed (East) Deed +[tallelvenbedeastdeed] +{ +name=Tall Elven Bed (East) +id=0x14F0 +morex=322 +origin=ml +} + +// Tall Elven Bed (South) Deed +[tallelvenbedsouthdeed] +{ +name=Tall Elven Bed (South) +id=0x14F0 +morex=323 +origin=ml +} \ No newline at end of file diff --git a/data/dfndata/items/deeds/minihouseaddon_deeds.dfn b/data/dfndata/items/deeds/minihouseaddon_deeds.dfn new file mode 100644 index 000000000..e9fa79f11 --- /dev/null +++ b/data/dfndata/items/deeds/minihouseaddon_deeds.dfn @@ -0,0 +1,89 @@ +// Deed for Stone and Plaster Mini House +[stoneandplastermini] +{ +name=Mini House: Stone and Plaster +id=0x14F0 +morex=500 +origin=aos +} + +// Deed for Field Stone Mini House +[fieldstonemini] +{ +name=Mini House: Field Stone +id=0x14F0 +morex=501 +origin=aos +} + +// Deed for Small Brick Mini House +[smallbrickmini] +{ +name=Mini House: Small Brick +id=0x14F0 +morex=502 +origin=aos +} + +// Deed for Wooden Mini House +[woodenmini] +{ +name=Mini House: Wooden +id=0x14F0 +morex=503 +origin=aos +} + +// Deed for Wood and Plaster Mini House +[woodandplastermini] +{ +name=Mini House: Wood and Plaster +id=0x14F0 +morex=504 +origin=aos +} + +// Deed for Thatched-Roof Cottage Mini House +[thatchedroofcottage] +{ +name=Mini House: Thatched-Roof Cottage +id=0x14F0 +morex=505 +origin=aos +} + +// Deed for Brick Mini House +[brickmini] +{ +name=Mini House: Brick +id=0x14F0 +morex=506 +origin=aos +} + +// Deed for Two-Story Wood and Plaster Mini House +[twostorywoodandplastermini] +{ +name=Mini House: Two-Story Wood and Plaster +id=0x14F0 +morex=507 +origin=aos +} + +// Deed for Malas Mountain Pass Mini House +[malasmountainpassmini] +{ +name=Mini House: Malas Mountain Pass +id=0x14F0 +morex=508 +origin=aos +} + +// Deed for Church at Night Mini House +[churchatnightmini] +{ +name=Mini House: Church at Night +id=0x14F0 +morex=509 +origin=aos +} \ No newline at end of file diff --git a/data/js/item/puzzlechest.js b/data/js/item/puzzlechest.js new file mode 100644 index 000000000..37e2f5fed --- /dev/null +++ b/data/js/item/puzzlechest.js @@ -0,0 +1,444 @@ +const PuzzleChestCylinder = { + None: 0xE73, + LightBlue: 0x186F, + Blue: 0x186A, + Green: 0x186B, + Orange: 0x186C, + Purple: 0x186D, + Red: 0x186E, + DarkBlue: 0x1869, + Yellow: 0x1870 +}; + +function PuzzleChestSolution( cylinders ) +{ + this.cylinders = cylinders || [ + RandomCylinder(), + RandomCylinder(), + RandomCylinder(), + RandomCylinder(), + RandomCylinder() + ]; +} + +function RandomCylinder() +{ + var randomValue = RandomNumber( 0, 8 ); + switch ( randomValue ) + { + case 0: return PuzzleChestCylinder.LightBlue; + case 1: return PuzzleChestCylinder.Blue; + case 2: return PuzzleChestCylinder.Green; + case 3: return PuzzleChestCylinder.Orange; + case 4: return PuzzleChestCylinder.Purple; + case 5: return PuzzleChestCylinder.Red; + case 6: return PuzzleChestCylinder.DarkBlue; + default: return PuzzleChestCylinder.Yellow; + } +} + +function CompareSolutions( solutionCylinders, guessCylinders ) +{ + var correctCylinders = 0; + var correctColors = 0; + var matchesSrc = [false, false, false, false, false]; + var matchesDst = [false, false, false, false, false]; + + // Check for exact matches ( correct position and color ) + for ( var i = 0; i < solutionCylinders.length; i++ ) + { + if( solutionCylinders[i] == guessCylinders[i] ) + { + correctCylinders++; + matchesSrc[i] = true; + matchesDst[i] = true; + } + } + + // Check for color matches ( wrong position ) + for ( var i = 0; i < solutionCylinders.length; i++ ) + { + if( !matchesSrc[i] ) + { + for ( var j = 0; j < guessCylinders.length; j++ ) + { + if( solutionCylinders[i] == guessCylinders[j] && !matchesDst[j] ) + { + correctColors++; + matchesDst[j] = true; + break; + } + } + } + } + + return { + correctCylinders: correctCylinders, + correctColors: correctColors + }; +} + +function onCreateDFN( objMade, objType ) +{ + if( objType == 0 ) + { + objMade.SetTag( "locked", "true" ); // Lock the chest by default + var solution = new PuzzleChestSolution(); + objMade.SetTag( "solution", SerializeSolution( solution )); // Store the solution as a serialized string + } +} + +function onUseChecked( pUser, pItem ) +{ + var socket = pUser.socket; + socket.tempObj = pItem; + + if( pItem.GetTag( "locked" ) == "true" ) + { + var serializedSolution = pItem.GetTag( "solution" ); + var solution = DeserializeSolution( serializedSolution ); + var lastGuess = pUser.GetTag( "lastGuess" ); + + // Initialize lastGuess if it doesn't exist + if( !lastGuess ) + { + lastGuess = new PuzzleChestSolution(); + pUser.SetTag( "lastGuess", SerializeSolution( lastGuess )); + } + else + { + lastGuess = DeserializeSolution( pUser.GetTag( "lastGuess" )); + } + + // Calculate the number of correct cylinders and colors + var result = CompareSolutions( solution.cylinders, lastGuess.cylinders ); + + // Generate hints based on player's lockpicking skill + var hints = GenerateHints( pUser, result.correctCylinders, result.correctColors ); + + // Show the puzzle gump to the player + ShowPuzzleGump( pUser, pItem, solution, 0 ); // Pass the solution and default check = 0 + } +} + +function onGumpPress( pSock, pButton, gumpData ) +{ + var pUser = pSock.currentChar; + var pItem = pSock.tempObj; // Access the temporary object from the socket + + // Deserialize the puzzle solution and the last guess from the player's tags + var solution = DeserializeSolution( pItem.GetTag( "solution" )); + var lastGuess = DeserializeSolution( pUser.GetTag( "lastGuess" )); + + if( pButton == 1 ) + { + // Submit button ( ID 1 ) + var result = CompareSolutions( solution.cylinders, lastGuess.cylinders ); + if( result.correctCylinders == 5 ) + { + // Unlock the chest ifthe guess is correct + pItem.SetTag( "locked", "false" ); + pUser.SysMessage( "The chest unlocks!" ); + pUser.SoundEffect( 0x241, true ); // Play unlock sound effect + + // Reward the player and clear the puzzle + RewardPlayer( pUser, pItem ); + pUser.SetTag( "lastGuess", null ); + pItem.Delete( ); // Delete the chest after it's unlocked + } + else + { + // Generate hints for incorrect guesses + var hints = GenerateHints( pUser, result.correctCylinders, result.correctColors ); + + // Show a status gump with hints and apply damage for incorrect guess + ShowStatusGump( pUser, result.correctCylinders, result.correctColors, hints.hint1, hints.hint2 ); + DamagePlayer( pUser ); // Apply damage to the player for incorrect guesses + } + } + else if( pButton >= 10 && pButton <= 17 ) + { + // Handle left and right buttons to change cylinder color + var selectedCylinderIndex = gumpData.getButton( 0 ); // Determine which cylinder was selected via radio buttons + + if( selectedCylinderIndex >= 0 && selectedCylinderIndex <= 4 ) + { + // Handle the color change based on which button was pressed ( cylinder color buttons 10-17 ) + switch ( pButton ) + { + case 10: + lastGuess.cylinders[selectedCylinderIndex] = PuzzleChestCylinder.LightBlue; + break; + case 11: + lastGuess.cylinders[selectedCylinderIndex] = PuzzleChestCylinder.Blue; + break; + case 12: + lastGuess.cylinders[selectedCylinderIndex] = PuzzleChestCylinder.Green; + break; + case 13: + lastGuess.cylinders[selectedCylinderIndex] = PuzzleChestCylinder.Orange; + break; + case 14: + lastGuess.cylinders[selectedCylinderIndex] = PuzzleChestCylinder.Purple; + break; + case 15: + lastGuess.cylinders[selectedCylinderIndex] = PuzzleChestCylinder.Red; + break; + case 16: + lastGuess.cylinders[selectedCylinderIndex] = PuzzleChestCylinder.DarkBlue; + break; + case 17: + lastGuess.cylinders[selectedCylinderIndex] = PuzzleChestCylinder.Yellow; + break; + } + } + + // Update the player's last guess + pUser.SetTag( "lastGuess", SerializeSolution( lastGuess )); + + // Redraw the puzzle gump to reflect the updated guess + ShowPuzzleGump( pUser, pItem, lastGuess, selectedCylinderIndex ); + } + else if( pButton == 100 ) + { + // OK button in status gump ( ID 100 ) + // Reshow the puzzle gump after closing the status gump + ShowPuzzleGump( pUser, pItem, lastGuess, 0 ); // Reshow the puzzle with the correct solution + } +} + +function ShowPuzzleGump( pUser, pItem, lastGuess, check ) +{ + var myGump = new Gump; + + // Add the main background and title + myGump.AddBackground( 25, 0, 500, 410, 0x53 ); + myGump.AddGump( 62, 20, 0x67, 0 ); // Title image + myGump.AddHTMLGump( 80, 36, 110, 70, false, false, "A Puzzle Lock" ); + + // Instructions + myGump.AddHTMLGump( 214, 26, 270, 90, false, false, + "Correctly choose the sequence of cylinders needed to open the latch. Each cylinder may potentially be used more than once. Beware! A false attempt could be deadly!" ); + + // Left cylinder buttons + AddLeftCylinderButton( myGump, 62, 130, PuzzleChestCylinder.LightBlue, 10 ); + AddLeftCylinderButton( myGump, 62, 180, PuzzleChestCylinder.Blue, 11 ); + AddLeftCylinderButton( myGump, 62, 230, PuzzleChestCylinder.Green, 12 ); + AddLeftCylinderButton( myGump, 62, 280, PuzzleChestCylinder.Orange, 13 ); + + // Right cylinder buttons + AddRightCylinderButton( myGump, 451, 130, PuzzleChestCylinder.Purple, 14 ); + AddRightCylinderButton( myGump, 451, 180, PuzzleChestCylinder.Red, 15 ); + AddRightCylinderButton( myGump, 451, 230, PuzzleChestCylinder.DarkBlue, 16 ); + AddRightCylinderButton( myGump, 451, 280, PuzzleChestCylinder.Yellow, 17 ); + + var solution = DeserializeSolution( pItem.GetTag( "solution" )); + // Call AddLockpickingHints with the solution from the chest + AddLockpickingHints( myGump, pUser, solution ); + + // Previous guess + var lastGuess = DeserializeSolution( pUser.GetTag( "lastGuess" )); + if( lastGuess ) + { + myGump.AddHTMLGump( 127, 249, 170, 20, false, false, "Thy previous guess:" ); + myGump.AddBackground( 290, 247, 115, 25, 0x13EC ); + + // Add each cylinder of the previous guess + for ( var i = 0; i < lastGuess.cylinders.length; i++ ) + { + AddCylinder( myGump, 281 + ( i * 22 ), 254, lastGuess.cylinders[i] ); + } + } + + // Pedestals for current guess + AddPedestal( myGump, 140, 270, lastGuess.cylinders[0], 0, check == 0 ); + AddPedestal( myGump, 195, 270, lastGuess.cylinders[1], 1, check == 1 ); + AddPedestal( myGump, 250, 270, lastGuess.cylinders[2], 2, check == 2 ); + AddPedestal( myGump, 305, 270, lastGuess.cylinders[3], 3, check == 3 ); + AddPedestal( myGump, 360, 270, lastGuess.cylinders[4], 4, check == 4 ); + + // Submit button + myGump.AddButton( 258, 370, 0xFA5, 0xFA7, 1, 0, 1 ); + + // Send the gump to the player + myGump.Send( pUser ); + myGump.Free( ); // Clear this gump from UOX memory +} + +function AddLockpickingHints( myGump, pUser, pChestSolution ) +{ + var lockpickingSkill = pUser.baseskills.lockpicking; // Lockpicking skill in UOX3 + + if( lockpickingSkill >= 600 ) + { + myGump.AddHTMLGump( 160, 125, 230, 24, false, false, "Lockpicking hint:" ); // Display the hint header + myGump.AddBackground( 159, 150, 230, 95, 0x13EC ); // Hint background + + // Add hints based on lockpicking skill thresholds + if( lockpickingSkill >= 800 ) + { + // Show the first correct cylinder from the chest solution + myGump.AddHTMLGump( 165, 157, 200, 40, false, false, "In the first slot:" ); + AddCylinder( myGump, 350, 165, pChestSolution.cylinders[0] ); // Show the first cylinder + + // Indicate that a cylinder is used in an unknown slot + myGump.AddHTMLGump( 165, 197, 200, 40, false, false, "Used in an unknown slot:" ); + AddCylinder( myGump, 350, 200, pChestSolution.cylinders[1] ); // Show the second cylinder as a hint + + if( lockpickingSkill >= 900 ) + { + // Add a hint for the third correct cylinder + AddCylinder( myGump, 350, 212, pChestSolution.cylinders[2] ); // Add third hint + } + if( lockpickingSkill >= 1000 ) + { + // Add a hint for the fourth correct cylinder + AddCylinder( myGump, 350, 224, pChestSolution.cylinders[3] ); // Add fourth hint + } + } + else + { + // Provide a basic hint ifthe player's skill is between 600-799 + myGump.AddHTMLGump( 165, 157, 200, 40, false, false, "Used in an unknown slot:" ); + AddCylinder( myGump, 350, 160, pChestSolution.cylinders[0] ); // Show the first cylinder as a basic hint + + if( lockpickingSkill >= 700 ) + { + // Add a second hint ifthe player's skill is 700-799 + AddCylinder( myGump, 350, 172, pChestSolution.cylinders[1] ); // Add second hint for 700+ skill + } + } + } +} + +function AddLeftCylinderButton( myGump, x, y, cylinder, buttonID ) +{ + myGump.AddBackground( x, y, 30, 30, 0x13EC ); + AddCylinder( myGump, x - 7, y + 10, cylinder ); + myGump.AddButton( x + 38, y + 9, 0x13A8, 0x13A9, 1, 0, buttonID ); +} + +function AddRightCylinderButton( myGump, x, y, cylinder, buttonID ) +{ + myGump.AddBackground( x, y, 30, 30, 0x13EC ); + AddCylinder( myGump, x - 7, y + 10, cylinder ); + myGump.AddButton( x - 26, y + 9, 0x13A8, 0x13A9, 1, 0, buttonID ); +} + +function AddCylinder( myGump, x, y, cylinder ) +{ + if( cylinder != PuzzleChestCylinder.None ) + { + myGump.AddPicture( x, y, cylinder ); + } + else + { + myGump.AddPicture( x + 9, y, cylinder ); + } +} + +function AddPedestal( myGump, x, y, cylinder, switchID, initialState ) +{ + myGump.AddPicture( x, y, 0xB10 ); + myGump.AddPicture( x - 23, y + 12, 0xB12 ); + myGump.AddPicture( x + 23, y + 12, 0xB13 ); + myGump.AddPicture( x, y + 23, 0xB11 ); + + if( cylinder != PuzzleChestCylinder.None ) + { + myGump.AddPicture( x, y + 2, 0x51A ); + AddCylinder( myGump, x - 1, y + 19, cylinder ); + } else { + myGump.AddPicture( x, y + 2, 0x521 ); + } + + // Use AddRadio to allow selection of one cylinder at a time + myGump.AddRadio( x + 7, y + 65, 0x868, initialState ? 1 : 0, switchID ); +} + +function ShowStatusGump( pUser, correctCylinders, correctColors ) +{ + var myGump = new Gump; + + myGump.AddBackground( 50, 50, 300, 200, 0x13BE ); // Add background + myGump.AddHTMLGump( 60, 60, 250, 25, false, false, "
Incorrect Guess!
" ); // Title text + + // Display number of correct guesses + myGump.AddHTMLGump( 60, 90, 250, 25, false, false, "Correct Cylinders: " + correctCylinders ); + myGump.AddHTMLGump( 60, 120, 250, 25, false, false, "Correct Colors ( wrong position ): " + correctColors ); + + // Add OK button + myGump.AddButton( 150, 170, 0xFA5, 0xFA7, 1, 0, 100 ); // OK button + + // Send the gump to the player + myGump.Send( pUser ); + myGump.Free( ); +} + +function RewardPlayer( pUser, pItem ) +{ + pUser.SysMessage( "You find some treasure inside the chest!" ); + CreateDFNItem( pUser.socket, pUser, "0x0eed", 500, "ITEM", true ); // Drop 500 gold +} + +function GenerateHints( pUser, correctCylinders, correctColors ) +{ + var lockpickingSkill = pUser.CheckSkill( 24, 0, 1000 ); + var hint1 = ""; + var hint2 = ""; + + if( RandomNumber( 0, 1000 ) < lockpickingSkill ) + { + if( correctCylinders > 0 ) + { + hint1 = "One of the cylinders is in the first slot."; + } + if( correctColors > 0 ) + { + hint2 = "Some colors are used, but thou art not certain where."; + } + } + + return { hint1: hint1, hint2: hint2 }; +} + +function DamagePlayer( pUser ) +{ + var randomEffect = RandomNumber( 0, 3 ); + switch ( randomEffect ) + { + case 0: + pUser.SysMessage( "A toxic vapor envelops thee." ); + pUser.Damage( RandomNumber( 10, 40 )); + break; + case 1: + pUser.SysMessage( "Searing heat scorches thy skin." ); + pUser.Damage( RandomNumber( 10, 40 )); + break; + case 2: + pUser.SysMessage( "Pain lances through thee from a sharp metal blade." ); + pUser.Damage( RandomNumber( 10, 40 )); + break; + default: + pUser.SysMessage( "Lightning arcs through thy body." ); + pUser.Damage( RandomNumber( 10, 40 )); + break; + } +} + +function SerializeSolution( solution ) +{ + return solution.cylinders.join( "," ); +} + +function DeserializeSolution( data ) +{ + var cylinderStrings = data.split( "," ); + var cylinders = []; + + for ( var i = 0; i < cylinderStrings.length; i++ ) { + cylinders.push( parseInt( cylinderStrings[i], 10 )); + } + + return new PuzzleChestSolution( cylinders ); +} diff --git a/data/js/jse_fileassociations.scp b/data/js/jse_fileassociations.scp index e5ea63668..84b69d1f9 100644 --- a/data/js/jse_fileassociations.scp +++ b/data/js/jse_fileassociations.scp @@ -286,6 +286,7 @@ 5058=item/bagofsending.js 5059=item/powderoftranslocation.js 5060=item/elixirofingots.js +5061=item/puzzlechest.js 19100=item/plant_growing/plantsystem.js 19101=item/plant_growing/plantbowl.js diff --git a/docs/jsdocs.html b/docs/jsdocs.html index 6e5a9d53a..34762505c 100644 --- a/docs/jsdocs.html +++ b/docs/jsdocs.html @@ -5564,6 +5564,35 @@

January 9th, 2022

+
+ + +
+
+

Prototype

+

JSBool CheckInstaLog( x, y, world, instanceID );

+
+
+

Purpose

+

Checks if a specific location ( x, y, world, instanceID ) is within an instant logout zone.

+
+
+

Example of usage

+
// Check if the player is in an instant logout zone
+var isInstaLog = CheckInstaLog(targX, targY, worldNumber, instanceID);
+
+if( isInstaLog )
+{
+	// Handle instant logout
+}
+else
+{
+	// Handle other logout scenarios
+}
+
+
+
+
diff --git a/source/Changelog.txt b/source/Changelog.txt index 95b80c53e..c5a785ad5 100644 --- a/source/Changelog.txt +++ b/source/Changelog.txt @@ -19,6 +19,18 @@ Corrected a misspelling of IsBoat in magic.js. Added support for iterating through items in boats using FirstItem(), NextItem() and FinishedItems() methods +14/10/2024 - Dragon Slayer +    Added the CheckInstaLog JS function to allow checking if a specific location is within an instant logout zone (SEFunctions.cpp). (thanks, Xuri) + +12/10/2024 - Dragon Slayer + Added Mini-House Addons from AOS Expansion. + +11/10/2024 - Dragon Slayer + Added ML House Addons. + +10/09/2024 - Dragon Slayer + Added base functionality for Khaldun Puzzle Chests, which can be unlocked by solving a puzzle, with bonus hints for the solution given based on player's lockpicking skill + 13/08/2024 - Dragon Slayer/Xuri The onAttack/onDefense JS Events have been updated with three new parameters (hitStatus, hitLocation, damage) and will now also trigger when attacks miss. diff --git a/source/SEFunctions.cpp b/source/SEFunctions.cpp index 6ec92ec01..24d815aaa 100644 --- a/source/SEFunctions.cpp +++ b/source/SEFunctions.cpp @@ -287,6 +287,46 @@ JSBool SE_CalcCharFromSer( JSContext *cx, [[maybe_unused]] JSObject *obj, uintN return JS_TRUE; } +//o------------------------------------------------------------------------------------------------o +//| Function - SE_CheckInstaLog() +//o------------------------------------------------------------------------------------------------o +//| Purpose - Checks if a specific location is within an instant logout zone +//o------------------------------------------------------------------------------------------------o +JSBool SE_CheckInstaLog( JSContext *cx, [[maybe_unused]] JSObject *obj, uintN argc, jsval *argv, jsval *rval ) +{ + if( argc != 4 ) + { + ScriptError( cx, "CheckInstaLog: Invalid number of parameters (4)" ); + return JS_FALSE; + } + + SI16 targX = static_cast( JSVAL_TO_INT( argv[0] )); + SI16 targY = static_cast( JSVAL_TO_INT( argv[1] )); + UI08 targWorld = static_cast( JSVAL_TO_INT( argv[2] )); + UI16 targInstanceId = static_cast( JSVAL_TO_INT( argv[3] )); + + auto logLocs = cwmWorldState->logoutLocs; + + *rval = JSVAL_FALSE; + + if( logLocs.size() > 0 ) + { + for( size_t i = 0; i < logLocs.size(); ++i ) + { + if( logLocs[i].worldNum == targWorld && logLocs[i].instanceId == targInstanceId ) + { + if(( targX >= logLocs[i].x1 && targX <= logLocs[i].x2 ) && ( targY >= logLocs[i].y1 && targY <= logLocs[i].y2 )) + { + *rval = JSVAL_TRUE; + return JS_TRUE; + } + } + } + } + + return JS_TRUE; +} + //o------------------------------------------------------------------------------------------------o //| Function - SE_DoMovingEffect() //o------------------------------------------------------------------------------------------------o diff --git a/source/SEFunctions.h b/source/SEFunctions.h index 904a1fabd..adde69ee0 100644 --- a/source/SEFunctions.h +++ b/source/SEFunctions.h @@ -47,6 +47,8 @@ SEngineFunc SE_CalcCharFromSer; // *** SEngineFunc SE_CalcItemFromSer; // *** SEngineFunc SE_CalcMultiFromSer; // *** +SEngineFunc SE_CheckInstaLog; + SEngineFunc SE_MakeItem; // *** SEngineFunc SE_CommandLevelReq; // * diff --git a/source/cScript.cpp b/source/cScript.cpp index bcc7c9d10..82aa93790 100644 --- a/source/cScript.cpp +++ b/source/cScript.cpp @@ -55,6 +55,7 @@ static JSFunctionSpec my_functions[] = { "CalcCharFromSer", SE_CalcCharFromSer, 1, 0, 0 }, { "CalcItemFromSer", SE_CalcItemFromSer, 1, 0, 0 }, { "CalcMultiFromSer", SE_CalcMultiFromSer, 1, 0, 0 }, + { "CheckInstaLog", SE_CheckInstaLog, 4, 0, 0 }, { "GetHour", SE_GetHour, 0, 0, 0 }, { "GetMinute", SE_GetMinute, 0, 0, 0 }, { "GetDay", SE_GetDay, 0, 0, 0 },