From 1b6eb9152c10b8a06555d8c6db740ca6eb00f795 Mon Sep 17 00:00:00 2001 From: Haapy Date: Fri, 1 May 2026 17:43:39 +0200 Subject: [PATCH] Add new maps and tileset for the game world - Created room1.tmx and room1.lua for the first room in the game, including tiles, collision objects, and NPCs. - Added room2.tmx and room2.lua for the second room, featuring tiles, collision objects, and an enemy. - Introduced a world template to manage map transitions and layout. - Implemented a new tileset (castle.tsx and castle.lua) for the castle theme, including tile properties and image references. --- .gitignore | 2 + .gitmodules | 3 - Kristal | 1 - assets/sounds/squeak.wav | Bin 0 -> 6284 bytes assets/sprites/bullets/arenahazard.png | Bin 0 -> 183 bytes assets/sprites/bullets/smallbullet.png | Bin 0 -> 159 bytes assets/sprites/enemies/dummy/idle.png | Bin 0 -> 652 bytes assets/sprites/npcs/starwalker.png | Bin 0 -> 448 bytes assets/sprites/npcs/wall_1.png | Bin 0 -> 1255 bytes assets/sprites/npcs/wall_2.png | Bin 0 -> 1243 bytes assets/sprites/tilesets/castle.png | Bin 0 -> 1691 bytes halloween_hack.tiled-project | 12 + mod.json | 70 ++++ mod.lua | 6 + scripts/battle/bullets/arenahazard.lua | 30 ++ scripts/battle/bullets/smallbullet.lua | 24 ++ scripts/battle/cutscenes/dummy.lua | 24 ++ scripts/battle/encounters/dummy.lua | 21 + scripts/battle/enemies/dummy.lua | 96 +++++ scripts/battle/waves/aiming.lua | 30 ++ scripts/battle/waves/basic.lua | 25 ++ scripts/battle/waves/movingarena.lua | 38 ++ scripts/data/actors/dummy.lua | 54 +++ scripts/data/actors/starwalker.lua | 47 +++ scripts/data/actors/wall.lua | 49 +++ scripts/data/items/ultimate_candy.lua | 58 +++ scripts/objects/Squeak.lua | 13 + scripts/world/cutscenes/room1.lua | 74 ++++ scripts/world/maps/room1.lua | 550 +++++++++++++++++++++++++ scripts/world/maps/room1.tmx | 140 +++++++ scripts/world/maps/room2.lua | 255 ++++++++++++ scripts/world/maps/room2.tmx | 71 ++++ scripts/world/template.world | 20 + scripts/world/tilesets/castle.lua | 31 ++ scripts/world/tilesets/castle.tsx | 7 + 35 files changed, 1747 insertions(+), 4 deletions(-) create mode 100644 .gitignore delete mode 100644 .gitmodules delete mode 160000 Kristal create mode 100644 assets/sounds/squeak.wav create mode 100644 assets/sprites/bullets/arenahazard.png create mode 100644 assets/sprites/bullets/smallbullet.png create mode 100644 assets/sprites/enemies/dummy/idle.png create mode 100644 assets/sprites/npcs/starwalker.png create mode 100644 assets/sprites/npcs/wall_1.png create mode 100644 assets/sprites/npcs/wall_2.png create mode 100644 assets/sprites/tilesets/castle.png create mode 100644 halloween_hack.tiled-project create mode 100644 mod.json create mode 100644 mod.lua create mode 100644 scripts/battle/bullets/arenahazard.lua create mode 100644 scripts/battle/bullets/smallbullet.lua create mode 100644 scripts/battle/cutscenes/dummy.lua create mode 100644 scripts/battle/encounters/dummy.lua create mode 100644 scripts/battle/enemies/dummy.lua create mode 100644 scripts/battle/waves/aiming.lua create mode 100644 scripts/battle/waves/basic.lua create mode 100644 scripts/battle/waves/movingarena.lua create mode 100644 scripts/data/actors/dummy.lua create mode 100644 scripts/data/actors/starwalker.lua create mode 100644 scripts/data/actors/wall.lua create mode 100644 scripts/data/items/ultimate_candy.lua create mode 100644 scripts/objects/Squeak.lua create mode 100644 scripts/world/cutscenes/room1.lua create mode 100644 scripts/world/maps/room1.lua create mode 100644 scripts/world/maps/room1.tmx create mode 100644 scripts/world/maps/room2.lua create mode 100644 scripts/world/maps/room2.tmx create mode 100644 scripts/world/template.world create mode 100644 scripts/world/tilesets/castle.lua create mode 100644 scripts/world/tilesets/castle.tsx diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..11d6ad4 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +.vscode/ +*.tiled-session \ No newline at end of file diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index 9d9cd18..0000000 --- a/.gitmodules +++ /dev/null @@ -1,3 +0,0 @@ -[submodule "Kristal"] - path = Kristal - url = https://github.com/KristalTeam/Kristal diff --git a/Kristal b/Kristal deleted file mode 160000 index 4f6de32..0000000 --- a/Kristal +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 4f6de329a7336d85c732aaef704533dc37544c98 diff --git a/assets/sounds/squeak.wav b/assets/sounds/squeak.wav new file mode 100644 index 0000000000000000000000000000000000000000..2d6c49421a0dcf371c012964aed756c5a4ed75d2 GIT binary patch literal 6284 zcmeI0$!=T86^2V3M2!?FTaqos?g5?gEdnGBWSd2jWf};w%dQ_Gi#$x8BS3&GIziAu zx7~?t+16x>lt_^j$9!KM-@cOJ4v@WdLGs?JQ~&wTSatQwUwr!MAMd5~>!1GW=fD5M z=O4CGN=sZn`*TWv`pr_Rq*nUfXPVTA*o=F4OCD0(OnDetHFF zpa$+SBR%9RX$8DGR|CmeYNu6rj97gRtIgC*TbR;D>KJZYX(w%Bdr8awIl z>1$Yvwt>br_ARsWBY56rjo#|AZi_juEi`_^+8?A3(9z5i9qim?#R`bWXn2&q!j37N z=Xj^a>Pr~@D18j(0X&Vta=Oo*7L4%ZIUoHRtY4*nVbyy25a}jNdwA{)NqyTv!!vT> z6#EXi_POS0ScA_#cD7ho#jXmBwi&Hv4P6*CxL#Jq)+RA9o3Hr|ls5LA;^BR`1?HH!hm6$V za)uvAjEmSH>%W3?RMB-_*I?B)b5)p+zC~Q6x`udkkGV~_S;y9vEYI=aV^-_9v7DHAg3=oxgPC@>u~O*zrxyD3~yfYYpu1> zCgKWr;V&N4thgcFZ8Kf`3w~J2kMW4Ev zXOC?nuLpNC-X^2ZVPw{rQ&#Lc2y2X+QO|e|yd%2K1ooo2+ZpdQF88=;USrj*V67I} z&8^=F*!rOgXLkVe%Z}Tp)ATcsA;0IuY7Va|ml14`1v08LGkKFM=IfXdt8f{d9&3!` zHJ)(y(nlkr(!3<9+`O-acShL=i0H0TLC!uq%ZQtJy9z^}*150qG(+14`0k!& z#0eVgeTl4j%t&;4t+unYnOn<<3)Xuw_3EQ>HRp76^~9L9H~_B;LY;f-zDvhAMWZaI zpe-R~&dbH<43YGzA>TnlOIP?<9YdanNJV|T#KKDu`^Y`zW0$t(%~CP#!REYqZl&l4 z>vRcAtzG?o&Yfr90hYQWy#!B002zC(d?ZQ%f?YTu%&1U^z^;L2#MDwgs`Y$YwJ;W1Z)LmE{yN7)xvLx`jIUeSf z(UqYVmke(r&S7ZpboaY}nZ3cc)!TUH@&s1VJw&wHZX?Rj2y3%34#dl>I}r7r_F5q& zq88ugSj443jI6QSXmtm9E6CkC;!z-8F>1{hR>wQ=O_n91d2M8ZrQWyy`HnBc0`Zcu zuv?DrVp$?aY&@03o@4Kcn!b%_Hkzryvh?NKJk8JOSz-py3hRPr$uT;$8I20=!2h1sJ zDb5J)F|pscvlQ051A2a&e(QsRZFshfSb-Wj5WBj*b;m7m3)Fr_b!RmT^s2kE-$wd2 zNn{1`ISV`@iy0XBj({-ZRBb+KprDVZi(`m~_uDImTnq|4%m=Rh{~y^M@$W$%y&Bfvw{zO(RomK2PH&x~ ay_r=dp@5^y#eWXaTn0~9KbLh*2~7Y2Sv^|- literal 0 HcmV?d00001 diff --git a/assets/sprites/bullets/smallbullet.png b/assets/sprites/bullets/smallbullet.png new file mode 100644 index 0000000000000000000000000000000000000000..2eff0db5ed3bed4a6be6d9f2a64a4fd30aa8481a GIT binary patch literal 159 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucK@(3G#}JL+|2Hz6YGH75 z>#*rKGNFZWf|8nswEBV=#=yQ7MxA>p2@DJc-}tzHl+20+>SyqD^>bP0l+XkKo!cuj literal 0 HcmV?d00001 diff --git a/assets/sprites/enemies/dummy/idle.png b/assets/sprites/enemies/dummy/idle.png new file mode 100644 index 0000000000000000000000000000000000000000..280f9dd03254f677533e7a37058d3aa19abe780f GIT binary patch literal 652 zcmV;70(1R|P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0wGC6K~z{ry_D;5 z+dvS5RY8hK6)qw*q=s~pI?`PJCWk#Nj9V@#lG6B_!RT%ufGKnIxXQl)kN3d-Ng)Uy zp!N#PVB5Qf7ZsAoif@y=e4RD0IrK`eM z>Msv+0-UJ;C08zXrYSdfk#Qurm}1C{aKEBL_=+r0dJ44m0<+%rAR=F3#TZNj|8!Ho z*ItUqTUap$)4)~hdG|WbDI#yd!ZMr&)ui@ZK10rhJ=0MTMBWqjOk_7KCUAXK#C=DZ zltzH^U6I9C)CLuc^;aQ(DN=vG{SM_Esa~T+y5>+Ur`cIeyI}DXwJ{V+{+FNCvMda|_{|6g;**!<>v)HjAb>Lq?ZO@9*EsFhuuagFC+ucvn?z2)+oH~3?+@s9 za3?s7D`8;)a~60+76X+Y24TkI`72U@8bUo?977`9&-QaqYBu0;-ub`qJCjbP;p;B( zdaljRX>qf?%9iN8-W8W-eOtWxenZmq<5R0de?=Zk{e99nHsH;N9YJ9ycC41@3Y81@ z;=UWnbF?Q?@o|=+NT;AkVY;CRFW23}amRlPCU0Tx{x;+H^Le%}9?vLyvupR|WA0pC z$3EUzGUK?3?X#bA72OxCxRJb`{dGfH@Oe)9OS;(o+_`s$S3B z)xwsQ@vPio;t40?{Xkw@RsxV0c+r9Ds^nMe1uIe-UtRWL7qOk{FgI{Ncb6RRk^nHH ztt~Jib=m3rsk?ES9^c9r(0T#BsNvM%W55 jsXy5(wRTBw*4xi@QSQT`kOzl=q0Zpx>gTe~DWM4f>=3ws literal 0 HcmV?d00001 diff --git a/assets/sprites/npcs/wall_1.png b/assets/sprites/npcs/wall_1.png new file mode 100644 index 0000000000000000000000000000000000000000..174a9fb52180c2b69d11429080cd1d50f8fd317a GIT binary patch literal 1255 zcmVPx(p-DtRRCt`_TRm>;Fbt+2I&{nOwg6rN?~c!*Iwx6T%q3y6Nd9XadlY zh(KhtaMAU}K}MD=N3QYYi0~i`0BNNx@gss}=?MT}xBYU{_v7eB`u#Y9W_#wRr1x$EGRx{AI za1qzb{26H(+HDW8S|>%B^caSNIM!kvPLZ(8GyuSA4aHW)$W1JOeoww2EWH@Qs2aEx zyjBD3w9!%ZUQ{Z!@l3U$&!$) zr8P5p4<$F70nX<)7g;P}jn$-QHk+YNqs*AKAv7awb3bgifWohX33RpKgOU8gy>=Jb$I)d1iIpjL?r zdAL94rg4I`^3A)Y-_U);Iw-i*UhBf7OIhD%&kBd=7Jlm|i>7t325t2k-ZW^2w(YbH?>9wCfvvb1KCLEE-g;w6bI zgt6_V7Rlwf9yQ)ANv=-cD>0I(mcCx*gXT)S(ru*F9gSPY)!I%r>iU9z$O&1km!w-X z0cyLWf+1#wNB8~Ut)`ZUV5{w*UB|=HD@zfipfTJ5z|{A9)e=qfq@B_t3)7dm!MwJL(wNe?7}mBh z7ubs;1n)B=K0X6bU`09Nx%iFlthJVd5k-!B?mWmeVQL5w8 z5_o6P)=&}V>TJ*LWJBa#`p$|>wdczy7pN|;akVsuYQ-Xuf~LupLgQPW`lepWrDqCh zViA|28sIEnc?2uo%c2l3wE+0m%A|+Y0l<{n=$C-W56KvIzbKmMTO|ooluW?s6j*nk z9i~N>EL}>JdtLL*SS(i}uMMYL4CADPU(S*D+R$rpz3>|sEwbydG;@Dn^hbT^ zYmKESuCzWrLzXllN?m!DKcveo-Y6!VBAX$~;r0x^vfP6Ft>VEyYKja>xPW91i@To@ zsTgK3P)Px(l}SWFRCt{2TCr~9Fbri59lB+?&48Bx{eb*|f&7){{8a({K|dfsmH^qhWb5V| z8m1IYN~9zwz3aWDjbT%KA}Lao0RH3O#_B=iPR93|>(^4Cl>`6)48uPAP6#9Y*+kc; z7DC`k)-N2MW-8W(wlg&*qDeAW9O3H1W9hQ; z>h_D)(lp&XszJcvO@XT3obUtyuzmTo+S_4VEZ2rGnl~M&j|Fds5#VcrX2dDsh^%Fx zt8f*UbNW48rMEA8Sa(TLE_slE zrJ$uIHHI(e`2_G-t|7_E@RYai;antppBtH za%)Ks4ORPLX#j2&RH#MzlH3$0*ec(>J^T*MII4poRYvuN%fcSlvC0DYbZ;KZNQ8$- zs!ryR-bKRhT@e+86QISfR#wu9(_)#|;~H6O*kIXZ-pJRU1X4M<6GzEHmQzYv7V{F* zO;{VmsuUuXLL~38>X2v_t^g`lX|#ZpBD@L{rA*&>-sLDF>^Te8lv{Up#kIA;>6H@z ztg-#b$#(xQ)@)1)wZx)$I{a}N)hDXF}wnRsqc5D6jb7} zQv8;H>c=N1)$mgnEh?ntwlIg>u?$5?15qSQdsW9{PzPOV0+0wFFV)7SD6%mBSQ@O= zR#6*M8<)b{NR$G5R)o-fCgS}g00&i6BA$z1bZ4t2HKY#F`9rnhl1NkV36R_>b^4eh z>$ReGt|UE3mYBQ`mBRZ+$R3YS8E=QNX=7irvWqYiCX(i>tmdB5Wc2;6*$GBd!bIQ< zC8=VGV;a+OX$e}dqD#X>SgNyIZYLK+-lgxT$OKS-+mrDJl@D zu(--ouPJe;1OarnrRAm<#3EB_-&+D9T#_!`{2F1RjgutIQ8EF?V-VdvI$J`^m9DJD zt)KfkBbBR>w|dvQmF& zgGm$c`+1OJbEymEk=2oKV*9D;VO20ya^CaSyrhR~{6Em`Z+(++&BFiy002ovPDHLk FV1n*RSOfq7 literal 0 HcmV?d00001 diff --git a/assets/sprites/tilesets/castle.png b/assets/sprites/tilesets/castle.png new file mode 100644 index 0000000000000000000000000000000000000000..e1f9d818de1b3e09eff0b212ab1ab00062ed0036 GIT binary patch literal 1691 zcmcgtSyWS36b;P_m;eR?0ZJhlL=8jJh(&7!;e`NU5JH$0Y_veMpeP_BQ}kg(#l^59 zlMH>7F@Ow4W++CASWp6rN`MMVgQy@;84D#1x>ohWkAC&8b@o1ct$Xh|AN$;Uk>O&m ziqXL!5C~NVI*lo37=choU5Aus1l=4(IVprQ?Wu^WUfmaR0kFZnAOcaFqP%htCD$qp zXAfHtpsHfvfWooAwJ(P(c~Kj9xjf!dX(mS&nA&~O1Kmug zTmlN|lx_jgj(pQqvq$e)N^PfX^Clq)ciBKlI;9a%VvTl*HMP3)2e2&%_DhAGc$Ykp z?nqoj8taO!vE5f$8L-GmIAgtH0~i&b*a{kxPjUf0Lv35g?b6uKF69$i8)a%4&uvzT z^%C1qd^P`qM>jprGL328W#$x5_zI?9F8D3OY&H^4yT1EdC%I0Rom`$7T3S3AlO-<(BoJud7h3t>f{p&HX>5(PAfKy#9s z{TrgEBbp?Ks`vSp+!sW3Q8YCLOpR;J~C~!eIQQQ-aTi1kpsbBp+Jh z(5AP$;{LSF>DB|LT_-(>Esw0mz4__S=56EKH+uVEu1OXvOT$8i=Ceg%R-j27l<)D{ z;4n7BaaYjoj`PeW9;^(#+L_3)cQqEN=@x92d!Q+iWl5X*!9-kVmi&eX+i&o@9^2Sc z3%VMA@ZN@R@w*vQEWWxV_DfO_gB{kCG&X-Cx{oKf?1+7hQZ!R;!QJcT4Zut+e_X3| z^LtMc>*Du&hE9BQy3VXu8y6uiA}b4WiD0I`P!ru8!W`~ura|PSfv_Q!0h^Ls^NxpQ z;kbxw=J4Wt)t*Rna|GJUaMG-}zAFi6G2)NAF;gthZW`R;_>si*nR>Ev7C)79VRW?zXczKO&%0{u{U5d@ z=b&(v6^2ngI~~@S0vAN(5L!w_c9QJ_Z^}14g^bH zKvS*I?|MFi6vB=fTrLqsdV8&P+ig*L+B_Uz4TA=iGi{FC$SA=W6K<=B!ZzM8Z{2_V z%D!ZFr5FBj=;h6!T7Jw*O~#%vRcJm-`!)0!koZq*YJ2Mp4xbm2rwiUL9jy&$d)ET& zO(5RA6l__sEhH)lUf5woK#sh=#bl@4Q@S;0*nXg|{t&`YlN5I@5al>V3b(v>4-n~+ zVuD8v2anke0fAZ>&J2R|uYA)S7NFyisD zcV9!^_>`6>o1$!MOUL&@Z2YoUyOZ?tp_%Rm^gii{2+`HF1vKGrZB}%QmBqEwh44Y_ zi3&H4nxur+fYI3^IL}va^_8+yKl6MpNg&SZ3btA)d$5eKV!HN$IM}+-s;DgJA39_8 A`~Uy| literal 0 HcmV?d00001 diff --git a/halloween_hack.tiled-project b/halloween_hack.tiled-project new file mode 100644 index 0000000..7b0999c --- /dev/null +++ b/halloween_hack.tiled-project @@ -0,0 +1,12 @@ +{ + "automappingRulesFile": "", + "commands": [ + ], + "extensionsPath": "extensions", + "folders": [ + "scripts/world" + ], + "objectTypesFile": "", + "propertyTypes": [ + ] +} diff --git a/mod.json b/mod.json new file mode 100644 index 0000000..61445f0 --- /dev/null +++ b/mod.json @@ -0,0 +1,70 @@ +{ + // The ID of your project. Should be unique!! + "id": "halloween_hack", + // Displays on the main menu. + "name": "Halloween_hack", + // Displays underneath the name. Optional. + "subtitle": "", + + // The version of your project. + "version": "v1.0.0", + // What version of the engine your project was made with. + "engineVer": "v0.10.0-dev", + + // The Deltarune chapter you'd like to base your project off of. + // Do keep in mind that you can control chapter-specific features + // one by one using the config below. + "chapter": 4, + + // The map that you start in when first starting the project. + "map": "room1", + + // The party. The first character is the player. + "party": ["kris", "susie", "ralsei"], + + // The inventory. Contains three darkburgers, a cell phone and a shadow crystal by default. + "inventory": { + "items": ["glowshard", "darkburger", "darkburger", "darkburger"], + "key_items": ["cell_phone", "shadowcrystal"] + }, + + // Equipment for your party. Not specifying equipment defaults to the following. + "equipment": { + "kris": { + "weapon": "wood_blade", + "armor": ["amber_card", "amber_card"] + }, + "susie": { + "weapon": "mane_ax", + "armor": ["amber_card", "amber_card"] + }, + "ralsei": { + "weapon": "red_scarf", + "armor": ["amber_card", "amber_card"] + } + }, + + // Should never be true, but just in case. Restarts the entire engine when leaving the project. + // If you need this, you're most likely doing something wrong. + "hardReset": false, + + // Whether the project is hidden from the project selection. + "hidden": false, + + // Whether the game window's title should be set to the project's name, and the icon to the image + // in the file `window_icon.png`. + // When your project is configured as the engine's target project, it's automatically done unless if + // this option is explicitly set to false; else, it's done if this is set to true. + "setWindowTitleAndIcon": null, + + // Config values for the engine and any libraries you may have. + // These config values can control chapter-specific features as well. + "config": { + "kristal": { + // End of config + } + }, + + // Whether or not to enable dev mode. Dev mode enables debug keys and the console. + "dev": true +} \ No newline at end of file diff --git a/mod.lua b/mod.lua new file mode 100644 index 0000000..cc2ed5d --- /dev/null +++ b/mod.lua @@ -0,0 +1,6 @@ +function Mod:init() + Game:registerEvent("squeak", function(data) + return Squeak(data.x, data.y, {data.width, data.height, data.polygon}) + end) + print("Loaded " .. self.info.name .. "!") +end diff --git a/scripts/battle/bullets/arenahazard.lua b/scripts/battle/bullets/arenahazard.lua new file mode 100644 index 0000000..a901f33 --- /dev/null +++ b/scripts/battle/bullets/arenahazard.lua @@ -0,0 +1,30 @@ +---@class ArenaHazard : Bullet +local ArenaHazard, super = Class(Bullet) + +---@param x number # The X position of the bullet +---@param y number # The Y position of the bullet +---@param rot number # The rotation (in radians) of the bullet +function ArenaHazard:init(x, y, rot) + -- Last argument = sprite path + super.init(self, x, y, "bullets/arenahazard") + + -- Top-center origin point (will be rotated around it) + self:setOrigin(0.5, 0) + + -- The hitbox where the player will be damaged by the bullet (affected by scale and rotation) + self:setHitbox(0, 0, self.width, 8) + + -- Rotation of the bullet (in radians) + self.rotation = rot + + -- Don't destroy this bullet when it damages the player + self.destroy_on_hit = false +end + +function ArenaHazard:update() + -- For more complicated bullet behaviours, code here gets called every update + + super.update(self) +end + +return ArenaHazard diff --git a/scripts/battle/bullets/smallbullet.lua b/scripts/battle/bullets/smallbullet.lua new file mode 100644 index 0000000..4eb9582 --- /dev/null +++ b/scripts/battle/bullets/smallbullet.lua @@ -0,0 +1,24 @@ +---@class SmallBullet : Bullet +local SmallBullet, super = Class(Bullet) + +---@param x number # The X position of the bullet +---@param y number # The Y position of the bullet +---@param dir number # The dir (in radians) of the bullet +---@param speed number # The speed the bullet will move at in the specified direction +function SmallBullet:init(x, y, dir, speed) + -- Last argument = sprite path + super.init(self, x, y, "bullets/smallbullet") + + -- Move the bullet in dir radians (0 = right, pi = left, clockwise rotation) + self.physics.direction = dir + -- Speed the bullet moves (pixels per frame at 30FPS) + self.physics.speed = speed +end + +function SmallBullet:update() + -- For more complicated bullet behaviours, code here gets called every update + + super.update(self) +end + +return SmallBullet diff --git a/scripts/battle/cutscenes/dummy.lua b/scripts/battle/cutscenes/dummy.lua new file mode 100644 index 0000000..353c28d --- /dev/null +++ b/scripts/battle/cutscenes/dummy.lua @@ -0,0 +1,24 @@ +return { + -- The inclusion of the below line tells the language server that the first parameter of the cutscene is `BattleCutscene`. + -- This allows it to fetch us useful documentation that shows all of the available cutscene functions while writing our cutscenes! + + ---@param cutscene BattleCutscene + susie_punch = function(cutscene, battler, enemy) + -- Open textbox and wait for completion + cutscene:text("* Susie threw a punch at\nthe dummy.") + + -- Hurt the target enemy for 1 damage + Assets.playSound("damage") + enemy:hurt(1, battler) + -- Wait 1 second + cutscene:wait(1) + + -- Susie text + cutscene:text("* You,[wait:5] uh,[wait:5] look like a weenie.[wait:5]\n* I don't like beating up\npeople like that.", "nervous_side", "susie") + + if cutscene:getCharacter("ralsei") then + -- Ralsei text, if he's in the party + cutscene:text("* Aww,[wait:5] Susie!", "blush_pleased", "ralsei") + end + end +} \ No newline at end of file diff --git a/scripts/battle/encounters/dummy.lua b/scripts/battle/encounters/dummy.lua new file mode 100644 index 0000000..9ba7cae --- /dev/null +++ b/scripts/battle/encounters/dummy.lua @@ -0,0 +1,21 @@ +local Dummy, super = Class(Encounter) + +function Dummy:init() + super.init(self) + + -- Text displayed at the bottom of the screen at the start of the encounter + self.text = "* The tutorial begins...?" + + -- Battle music ("battle" is rude buster) + self.music = "battle" + -- Enables the purple grid battle background + self.background = true + + -- Add the dummy enemy to the encounter + self:addEnemy("dummy") + + --- Uncomment this line to add another! + --self:addEnemy("dummy") +end + +return Dummy diff --git a/scripts/battle/enemies/dummy.lua b/scripts/battle/enemies/dummy.lua new file mode 100644 index 0000000..f3d5fbc --- /dev/null +++ b/scripts/battle/enemies/dummy.lua @@ -0,0 +1,96 @@ +local Dummy, super = Class(EnemyBattler) + +function Dummy:init() + super.init(self) + + -- Enemy name + self.name = "Dummy" + -- Sets the actor, which handles the enemy's sprites (see scripts/data/actors/dummy.lua) + self:setActor("dummy") + + -- Enemy health + self.max_health = 450 + self.health = 450 + -- Enemy attack (determines bullet damage) + self.attack = 4 + -- Enemy defense (usually 0) + self.defense = 0 + -- Enemy reward + self.money = 100 + + -- Mercy given when sparing this enemy before its spareable (20% for basic enemies) + self.spare_points = 20 + + -- List of possible wave ids, randomly picked each turn + self.waves = { + "basic", + "aiming", + "movingarena" + } + + -- Dialogue randomly displayed in the enemy's speech bubble + self.dialogue = { + "..." + } + + -- Check text (automatically has "ENEMY NAME - " at the start) + self.check = "AT 4 DF 0\n* Cotton heart and button eye\n* Looks just like a fluffy guy." + + -- Text randomly displayed at the bottom of the screen each turn + self.text = { + "* The dummy gives you a soft\nsmile.", + "* The power of fluffy boys is\nin the air.", + "* Smells like cardboard.", + } + -- Text displayed at the bottom of the screen when the enemy has low health + self.low_health_text = "* The dummy looks like it's\nabout to fall over." + + -- Register act called "Smile" + self:registerAct("Smile") + -- Register party act with Ralsei called "Tell Story" + -- (second argument is description, usually empty) + self:registerAct("Tell Story", "", {"ralsei"}) +end + +function Dummy:onAct(battler, name) + if name == "Smile" then + -- Give the enemy 100% mercy + self:addMercy(100) + -- Change this enemy's dialogue for 1 turn + self.dialogue_override = "... ^^" + -- Act text (since it's a list, multiple textboxes) + return { + "* You smile.[wait:5]\n* The dummy smiles back.", + "* It seems the dummy just wanted\nto see you happy." + } + + elseif name == "Tell Story" then + -- Loop through all enemies + for _, enemy in ipairs(Game.battle.enemies) do + -- Make the enemy tired + enemy:setTired(true) + end + return "* You and Ralsei told the dummy\na bedtime story.\n* The enemies became [color:blue]TIRED[color:reset]..." + + elseif name == "Standard" then --X-Action + -- Give the enemy 50% mercy + self:addMercy(50) + if battler.chara.id == "ralsei" then + -- R-Action text + return "* Ralsei bowed politely.\n* The dummy spiritually bowed\nin return." + elseif battler.chara.id == "susie" then + -- S-Action: start a cutscene (see scripts/battle/cutscenes/dummy.lua) + Game.battle:startActCutscene("dummy", "susie_punch") + return + else + -- Text for any other character (like Noelle) + return "* "..battler.chara:getName().." straightened the\ndummy's hat." + end + end + + -- If the act is none of the above, run the base onAct function + -- (this handles the Check act) + return super.onAct(self, battler, name) +end + +return Dummy \ No newline at end of file diff --git a/scripts/battle/waves/aiming.lua b/scripts/battle/waves/aiming.lua new file mode 100644 index 0000000..df83723 --- /dev/null +++ b/scripts/battle/waves/aiming.lua @@ -0,0 +1,30 @@ +local Aiming, super = Class(Wave) + +function Aiming:onStart() + -- Every 0.5 seconds... + self.timer:every(1 / 2, function() + -- Get all enemies that selected this wave as their attack + local attackers = self:getAttackers() + + -- Loop through all attackers + for _, attacker in ipairs(attackers) do + + -- Get the attacker's center position + local x, y = attacker:getRelativePos(attacker.width / 2, attacker.height / 2) + + -- Get the angle between the bullet position and the soul's position + local angle = MathUtils.angle(x, y, Game.battle.soul.x, Game.battle.soul.y) + + -- Spawn smallbullet angled towards the player with speed 8 (see scripts/battle/bullets/smallbullet.lua) + self:spawnBullet("smallbullet", x, y, angle, 8) + end + end) +end + +function Aiming:update() + -- Code here gets called every frame + + super.update(self) +end + +return Aiming diff --git a/scripts/battle/waves/basic.lua b/scripts/battle/waves/basic.lua new file mode 100644 index 0000000..02db057 --- /dev/null +++ b/scripts/battle/waves/basic.lua @@ -0,0 +1,25 @@ +local Basic, super = Class(Wave) + +function Basic:onStart() + -- Every 0.33 seconds... + self.timer:every(1 / 3, function() + -- Our X position is offscreen, to the right + local x = SCREEN_WIDTH + 20 + -- Get a random Y position between the top and the bottom of the arena + local y = MathUtils.random(Game.battle.arena.top, Game.battle.arena.bottom) + + -- Spawn smallbullet going left with speed 8 (see scripts/battle/bullets/smallbullet.lua) + local bullet = self:spawnBullet("smallbullet", x, y, math.rad(180), 8) + + -- Dont remove the bullet offscreen, because we spawn it offscreen + bullet.remove_offscreen = false + end) +end + +function Basic:update() + -- Code here gets called every frame + + super.update(self) +end + +return Basic diff --git a/scripts/battle/waves/movingarena.lua b/scripts/battle/waves/movingarena.lua new file mode 100644 index 0000000..18d4f8d --- /dev/null +++ b/scripts/battle/waves/movingarena.lua @@ -0,0 +1,38 @@ +local MovingArena, super = Class(Wave) + +function MovingArena:init() + super.init(self) + + -- Initialize timer + self.siner = 0 +end + +function MovingArena:onStart() + -- Get the arena object + local arena = Game.battle.arena + + -- Spawn spikes on top of arena + self:spawnBulletTo(Game.battle.arena, "arenahazard", arena.width / 2, 0, math.rad(0)) + + -- Spawn spikes on bottom of arena (rotated 180 degrees) + self:spawnBulletTo(Game.battle.arena, "arenahazard", arena.width / 2, arena.height, math.rad(180)) + + -- Store starting arena position + self.arena_start_x = arena.x + self.arena_start_y = arena.y +end + +function MovingArena:update() + -- Increment timer for arena movement + self.siner = self.siner + DT + + -- Calculate the arena Y offset + local offset = math.sin(self.siner * 1.5) * 60 + + -- Move the arena + Game.battle.arena:setPosition(self.arena_start_x, self.arena_start_y + offset) + + super.update(self) +end + +return MovingArena diff --git a/scripts/data/actors/dummy.lua b/scripts/data/actors/dummy.lua new file mode 100644 index 0000000..c97eb8f --- /dev/null +++ b/scripts/data/actors/dummy.lua @@ -0,0 +1,54 @@ +local actor, super = Class(Actor, "dummy") + +function actor:init() + super.init(self) + + -- Display name (optional) + self.name = "Dummy" + + -- Width and height for this actor, used to determine its center + self.width = 27 + self.height = 45 + + -- Hitbox for this actor in the overworld (optional, uses width and height by default) + self.hitbox = { 0, 25, 19, 14 } + + -- Color for this actor used in outline areas (optional, defaults to red) + self.color = { 1, 0, 0 } + + -- Whether this actor flips horizontally (optional, values are "right" or "left", indicating the flip direction) + self.flip = nil + + -- Path to this actor's sprites (defaults to "") + self.path = "enemies/dummy" + -- This actor's default sprite or animation, relative to the path (defaults to "") + self.default = "idle" + + -- Sound to play when this actor speaks (optional) + self.voice = nil + -- Path to this actor's portrait for dialogue (optional) + self.portrait_path = nil + -- Offset position for this actor's portrait (optional) + self.portrait_offset = nil + + -- Whether this actor as a follower will blush when close to the player + self.can_blush = false + + -- Table of talk sprites and their talk speeds (default 0.25) + self.talk_sprites = {} + + -- Table of sprite animations + self.animations = { + -- Looping animation with 0.25 seconds between each frame + -- (even though there's only 1 idle frame) + ["idle"] = { "idle", 0.25, true }, + } + + -- Table of sprite offsets (indexed by sprite name) + self.offsets = { + -- Since the width and height is the idle sprite size, the offset is 0,0 + ["idle"] = { 0, 0 }, + } +end + +return actor diff --git a/scripts/data/actors/starwalker.lua b/scripts/data/actors/starwalker.lua new file mode 100644 index 0000000..d435adf --- /dev/null +++ b/scripts/data/actors/starwalker.lua @@ -0,0 +1,47 @@ +local actor, super = Class(Actor, "starwalker") + +function actor:init() + super.init(self) + + -- Display name (optional) + self.name = "Starwalker" + + -- Width and height for this actor, used to determine its center + self.width = 37 + self.height = 36 + + -- Hitbox for this actor in the overworld (optional, uses width and height by default) + self.hitbox = { 2, 26, 27, 10 } + + -- Color for this actor used in outline areas (optional, defaults to red) + self.color = { 1, 1, 0 } + + -- Whether this actor flips horizontally (optional, values are "right" or "left", indicating the flip direction) + self.flip = nil + + -- Path to this actor's sprites (defaults to "") + self.path = "npcs/starwalker" + -- This actor's default sprite or animation, relative to the path (defaults to "") + self.default = "" + + -- Sound to play when this actor speaks (optional) + self.voice = nil + -- Path to this actor's portrait for dialogue (optional) + self.portrait_path = nil + -- Offset position for this actor's portrait (optional) + self.portrait_offset = nil + + -- Whether this actor as a follower will blush when close to the player + self.can_blush = false + + -- Table of talk sprites and their talk speeds (default 0.25) + self.talk_sprites = {} + + -- Table of sprite animations + self.animations = {} + + -- Table of sprite offsets (indexed by sprite name) + self.offsets = {} +end + +return actor diff --git a/scripts/data/actors/wall.lua b/scripts/data/actors/wall.lua new file mode 100644 index 0000000..5a66215 --- /dev/null +++ b/scripts/data/actors/wall.lua @@ -0,0 +1,49 @@ +local actor, super = Class(Actor, "wall") + +function actor:init() + super.init(self) + + -- Display name (optional) + self.name = "Wall" + + -- Width and height for this actor, used to determine its center + self.width = 60 + self.height = 70 + + -- Hitbox for this actor in the overworld (optional, uses width and height by default) + self.hitbox = { 0, 50, 60, 20 } + + -- Color for this actor used in outline areas (optional, defaults to red) + self.color = { 1, 0, 0 } + + -- Whether this actor flips horizontally (optional, values are "right" or "left", indicating the flip direction) + self.flip = nil + + -- Path to this actor's sprites (defaults to "") + self.path = "npcs/wall" + -- This actor's default sprite or animation, relative to the path (defaults to "") + self.default = "" + + -- Sound to play when this actor speaks (optional) + self.voice = nil + -- Path to this actor's portrait for dialogue (optional) + self.portrait_path = nil + -- Offset position for this actor's portrait (optional) + self.portrait_offset = nil + + -- Whether this actor as a follower will blush when close to the player + self.can_blush = false + + -- Table of talk sprites and their talk speeds (default 0.25) + self.talk_sprites = { + [""] = 0.2 + } + + -- Table of sprite animations + self.animations = {} + + -- Table of sprite offsets (indexed by sprite name) + self.offsets = {} +end + +return actor diff --git a/scripts/data/items/ultimate_candy.lua b/scripts/data/items/ultimate_candy.lua new file mode 100644 index 0000000..2a8a0a0 --- /dev/null +++ b/scripts/data/items/ultimate_candy.lua @@ -0,0 +1,58 @@ +-- Instead of Item, create a HealItem, a convenient class for consumable healing items +local item, super = Class(HealItem, "ultimate_candy") + +function item:init() + super.init(self) + + -- Display name + self.name = "UltimatCandy" + -- Name displayed when used in battle (optional) + self.use_name = "ULTIMATE CANDY" + + -- Item type (item, key, weapon, armor) + self.type = "item" + -- Item icon (for equipment) + self.icon = nil + + -- Battle description + self.effect = "Best\nhealing" + -- Shop description + self.shop = "Perfection" + -- Menu description + self.description = "Sparkles with perfection.\nMust be shared with everyone. +??HP" + + -- Amount healed (HealItem variable) + self.heal_amount = 1 + + -- Default shop price (sell price is halved) + self.price = 100 + -- Whether the item can be sold + self.can_sell = true + + -- Consumable target mode (ally, party, enemy, enemies, or none) + self.target = "party" + -- Where this item can be used (world, battle, all, or none) + self.usable_in = "all" + -- Item this item will get turned into when consumed + self.result_item = nil + -- Will this item be instantly consumed in battles? + self.instant = false + + -- Equip bonuses (for weapons and armor) + self.bonuses = {} + -- Bonus name and icon (displayed in equip menu) + self.bonus_name = nil + self.bonus_icon = nil + + -- Equippable characters (default true for armors, false for weapons) + self.can_equip = {} + + -- Character reactions (key = party member id) + self.reactions = { + susie = "Hey! It's hollow inside!", + ralsei = "I like the texture!", + noelle = "That was underwhelming...", + } +end + +return item diff --git a/scripts/objects/Squeak.lua b/scripts/objects/Squeak.lua new file mode 100644 index 0000000..820824c --- /dev/null +++ b/scripts/objects/Squeak.lua @@ -0,0 +1,13 @@ +---@class Squeak : Event +local Squeak, super = Class(Event) + +function Squeak:init(x, y, shape) + super.init(self, x, y, shape) +end + +function Squeak:onInteract(player, dir) + Assets.playSound("squeak") + return true +end + +return Squeak diff --git a/scripts/world/cutscenes/room1.lua b/scripts/world/cutscenes/room1.lua new file mode 100644 index 0000000..dd97b09 --- /dev/null +++ b/scripts/world/cutscenes/room1.lua @@ -0,0 +1,74 @@ +return { + -- The inclusion of the below line tells the language server that the first parameter of the cutscene is `WorldCutscene`. + -- This allows it to fetch us useful documentation that shows all of the available cutscene functions while writing our cutscenes! + + ---@param cutscene WorldCutscene + wall = function(cutscene, event) + -- Open textbox and wait for completion + cutscene:text("* The wall seems cracked.") + + -- If we have Susie, play a cutscene + local susie = cutscene:getCharacter("susie") + if susie then + -- Detach camera and followers (since characters will be moved) + cutscene:detachCamera() + cutscene:detachFollowers() + + -- All text from now is spoken by Susie + cutscene:setSpeaker(susie) + cutscene:text("* Hey,[wait:5] think I can break\nthis wall?", "smile") + + -- Get the bottom-center of the broken wall + local x = event.x + event.width / 2 + local y = event.y + event.height / 2 + + -- Move Susie up to the wall over 0.75 seconds + cutscene:walkTo(susie, x, y + 40, 0.75, "up") + -- Move other party members behind Susie + cutscene:walkTo(Game.world.player, x, y + 100, 0.75, "up") + if cutscene:getCharacter("ralsei") then + cutscene:walkTo("ralsei", x + 60, y + 100, 0.75, "up") + end + if cutscene:getCharacter("noelle") then + cutscene:walkTo("noelle", x - 60, y + 100, 0.75, "up") + end + + -- Wait 1.5 seconds + cutscene:wait(1.5) + + -- Walk back, + cutscene:wait(cutscene:walkTo(susie, x, y + 60, 0.5, "up", true)) + -- and run forward! + cutscene:wait(cutscene:walkTo(susie, x, y + 20, 0.2)) + + -- Slam!! + Assets.playSound("impact") + susie:shake(4) + susie:setSprite("shock_up") + + -- Slide back a bit + cutscene:slideTo(susie, x, y + 40, 0.1) + cutscene:wait(1.5) + + -- owie + susie:setAnimation({ "away_scratch", 0.25, true }) + susie:shake(4) + Assets.playSound("wing") + + cutscene:wait(1) + cutscene:text("* Guess not.", "nervous") + + -- Reset Susie's sprite + susie:resetSprite() + + -- Reattach the camera + cutscene:attachCamera() + + -- Align the follower positions behind Kris's current position + cutscene:alignFollowers() + -- And reattach them, making them return to their target positions + cutscene:attachFollowers() + Game:setFlag("wall_hit", true) + end + end +} diff --git a/scripts/world/maps/room1.lua b/scripts/world/maps/room1.lua new file mode 100644 index 0000000..29cb11f --- /dev/null +++ b/scripts/world/maps/room1.lua @@ -0,0 +1,550 @@ +return { + version = "1.5", + luaversion = "5.1", + tiledversion = "1.8.4", + orientation = "orthogonal", + renderorder = "right-down", + width = 20, + height = 24, + tilewidth = 40, + tileheight = 40, + nextlayerid = 6, + nextobjectid = 37, + properties = { + ["name"] = "Test Map - Room 1" + }, + tilesets = { + { + name = "castle", + firstgid = 1, + filename = "../tilesets/castle.tsx" + } + }, + layers = { + { + type = "tilelayer", + x = 0, + y = 0, + width = 20, + height = 24, + id = 1, + name = "tiles", + visible = true, + opacity = 1, + offsetx = 0, + offsety = 0, + parallaxx = 1, + parallaxy = 1, + properties = {}, + encoding = "lua", + data = { + 0, 22, 13, 23, 23, 13, 23, 23, 23, 13, 23, 23, 13, 24, 0, 0, 0, 0, 0, 0, + 0, 22, 23, 23, 23, 23, 23, 21, 23, 23, 23, 23, 23, 24, 0, 0, 0, 0, 0, 0, + 0, 26, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 28, 0, 0, 0, 0, 0, 0, + 0, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 0, 0, 0, 0, 0, 0, + 0, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12, 0, 0, 0, 0, 0, 0, + 0, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 7, 7, 7, 7, 7, 7, + 0, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 15, 15, 15, 15, 15, 15, + 0, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12, 0, 0, 0, 0, 0, 0, + 0, 14, 15, 15, 11, 11, 11, 11, 11, 11, 11, 15, 15, 16, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 14, 15, 11, 11, 11, 15, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2, 3, 4, 0, 0, 0, 0, 0, 0, 0, 18, 19, 20, 0, + 0, 0, 0, 0, 0, 0, 2, 3, 4, 0, 0, 0, 0, 0, 0, 0, 22, 23, 24, 0, + 0, 0, 0, 0, 0, 0, 2, 3, 4, 0, 0, 0, 0, 0, 0, 0, 22, 9, 24, 0, + 0, 0, 0, 0, 0, 0, 2, 3, 4, 0, 0, 0, 0, 0, 0, 0, 10, 11, 12, 0, + 0, 0, 0, 0, 0, 0, 2, 3, 4, 0, 0, 0, 0, 0, 0, 0, 10, 11, 12, 0, + 0, 6, 7, 7, 7, 7, 11, 11, 11, 7, 7, 7, 7, 7, 7, 7, 11, 11, 12, 0, + 0, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 15, 15, 15, 15, 16, 0, + 0, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12, 0, 0, 0, 0, 0, 0, + 0, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12, 0, 0, 0, 0, 0, 0, + 0, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + } + }, + { + type = "tilelayer", + x = 0, + y = 0, + width = 20, + height = 24, + id = 2, + name = "decal", + visible = true, + opacity = 1, + offsetx = 0, + offsety = 0, + parallaxx = 1, + parallaxy = 1, + properties = {}, + encoding = "lua", + data = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 30, 31, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 34, 35, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 38, 39, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + } + }, + { + type = "objectgroup", + draworder = "topdown", + id = 3, + name = "collision", + visible = true, + opacity = 0.5, + offsetx = 0, + offsety = 0, + parallaxx = 1, + parallaxy = 1, + properties = {}, + objects = { + { + id = 1, + name = "", + type = "", + shape = "rectangle", + x = 40, + y = 80, + width = 520, + height = 40, + rotation = 0, + visible = true, + properties = {} + }, + { + id = 2, + name = "", + type = "", + shape = "rectangle", + x = 560, + y = 120, + width = 40, + height = 80, + rotation = 0, + visible = true, + properties = {} + }, + { + id = 3, + name = "", + type = "", + shape = "rectangle", + x = 600, + y = 160, + width = 200, + height = 40, + rotation = 0, + visible = true, + properties = {} + }, + { + id = 4, + name = "", + type = "", + shape = "rectangle", + x = 560, + y = 280, + width = 40, + height = 80, + rotation = 0, + visible = true, + properties = {} + }, + { + id = 5, + name = "", + type = "", + shape = "rectangle", + x = 600, + y = 280, + width = 200, + height = 40, + rotation = 0, + visible = true, + properties = {} + }, + { + id = 6, + name = "", + type = "", + shape = "rectangle", + x = 440, + y = 360, + width = 120, + height = 40, + rotation = 0, + visible = true, + properties = {} + }, + { + id = 7, + name = "", + type = "", + shape = "rectangle", + x = 360, + y = 400, + width = 80, + height = 40, + rotation = 0, + visible = true, + properties = {} + }, + { + id = 8, + name = "", + type = "", + shape = "rectangle", + x = 360, + y = 680, + width = 280, + height = 40, + rotation = 0, + visible = true, + properties = {} + }, + { + id = 9, + name = "", + type = "", + shape = "rectangle", + x = 560, + y = 800, + width = 40, + height = 120, + rotation = 0, + visible = true, + properties = {} + }, + { + id = 10, + name = "", + type = "", + shape = "rectangle", + x = 40, + y = 920, + width = 520, + height = 40, + rotation = 0, + visible = true, + properties = {} + }, + { + id = 11, + name = "", + type = "", + shape = "rectangle", + x = 0, + y = 720, + width = 40, + height = 200, + rotation = 0, + visible = true, + properties = {} + }, + { + id = 12, + name = "", + type = "", + shape = "rectangle", + x = 40, + y = 680, + width = 200, + height = 40, + rotation = 0, + visible = true, + properties = {} + }, + { + id = 14, + name = "", + type = "", + shape = "rectangle", + x = 160, + y = 400, + width = 80, + height = 40, + rotation = 0, + visible = true, + properties = {} + }, + { + id = 15, + name = "", + type = "", + shape = "rectangle", + x = 40, + y = 360, + width = 120, + height = 40, + rotation = 0, + visible = true, + properties = {} + }, + { + id = 16, + name = "", + type = "", + shape = "rectangle", + x = 0, + y = 120, + width = 40, + height = 240, + rotation = 0, + visible = true, + properties = {} + }, + { + id = 17, + name = "", + type = "", + shape = "rectangle", + x = 200, + y = 440, + width = 40, + height = 240, + rotation = 0, + visible = true, + properties = {} + }, + { + id = 18, + name = "", + type = "", + shape = "rectangle", + x = 360, + y = 440, + width = 40, + height = 240, + rotation = 0, + visible = true, + properties = {} + }, + { + id = 23, + name = "", + type = "", + shape = "rectangle", + x = 600, + y = 640, + width = 40, + height = 40, + rotation = 0, + visible = true, + properties = {} + }, + { + id = 24, + name = "", + type = "", + shape = "rectangle", + x = 640, + y = 600, + width = 120, + height = 40, + rotation = 0, + visible = true, + properties = {} + }, + { + id = 25, + name = "", + type = "", + shape = "rectangle", + x = 760, + y = 640, + width = 40, + height = 160, + rotation = 0, + visible = true, + properties = {} + }, + { + id = 26, + name = "", + type = "", + shape = "rectangle", + x = 600, + y = 800, + width = 160, + height = 40, + rotation = 0, + visible = true, + properties = {} + } + } + }, + { + type = "objectgroup", + draworder = "topdown", + id = 4, + name = "objects", + visible = true, + opacity = 1, + offsetx = 0, + offsety = 0, + parallaxx = 1, + parallaxy = 1, + properties = {}, + objects = { + { + id = 19, + name = "npc", + type = "", + shape = "rectangle", + x = 480, + y = 840, + width = 40, + height = 40, + rotation = 0, + visible = true, + properties = { + ["actor"] = "starwalker", + ["text1"] = "* These [color:yellow]stairs[color:reset] are [color:yellow]Pissing[color:reset] me\noff...", + ["text2"] = "* I'm the original [color:yellow]Starwalker[color:reset]" + } + }, + { + id = 27, + name = "savepoint", + type = "", + shape = "rectangle", + x = 80, + y = 210, + width = 40, + height = 40, + rotation = 0, + visible = true, + properties = { + ["text1"] = "* Silence echoes in the darkness\nof this familiar-yet-different\nscenery.", + ["text2"] = "* The power of avoiding copying\nofficial music shines within\nyou." + } + }, + { + id = 28, + name = "squeak", + type = "", + shape = "rectangle", + x = 680, + y = 600, + width = 40, + height = 40, + rotation = 0, + visible = true, + properties = {} + }, + { + id = 29, + name = "transition", + type = "", + shape = "rectangle", + x = 800, + y = 200, + width = 40, + height = 80, + rotation = 0, + visible = true, + properties = { + ["map"] = "room2", + ["marker"] = "entry" + } + }, + { + id = 33, + name = "interactable", + type = "", + shape = "rectangle", + x = 280, + y = 80, + width = 40, + height = 40, + rotation = 0, + visible = true, + properties = { + ["cutscene"] = "room1.wall", + ["once"] = true + } + }, + { + id = 35, + name = "npc", + type = "", + shape = "point", + x = 300, + y = 160, + width = 0, + height = 0, + rotation = 0, + visible = true, + properties = { + ["actor"] = "wall", + ["flagcheck"] = "wall_hit", + ["text1"] = "* I Am the Wall Guardian.[wait:5]\n* This Wall is Off Limits for you\nno-good wall slammers." + } + } + } + }, + { + type = "objectgroup", + draworder = "topdown", + id = 5, + name = "markers", + visible = true, + opacity = 1, + offsetx = 0, + offsety = 0, + parallaxx = 1, + parallaxy = 1, + properties = {}, + objects = { + { + id = 20, + name = "spawn", + type = "", + shape = "point", + x = 300, + y = 250, + width = 0, + height = 0, + rotation = 0, + visible = true, + properties = {} + }, + { + id = 30, + name = "entry", + type = "", + shape = "point", + x = 760, + y = 240, + width = 0, + height = 0, + rotation = 0, + visible = true, + properties = {} + } + } + } + } +} diff --git a/scripts/world/maps/room1.tmx b/scripts/world/maps/room1.tmx new file mode 100644 index 0000000..60ca6ca --- /dev/null +++ b/scripts/world/maps/room1.tmx @@ -0,0 +1,140 @@ + + + + + + + + + + + +0,22,13,23,23,13,23,23,23,13,23,23,13,24,0,0,0,0,0,0, +0,22,23,23,23,23,23,21,23,23,23,23,23,24,0,0,0,0,0,0, +0,26,27,27,27,27,27,27,27,27,27,27,27,28,0,0,0,0,0,0, +0,6,7,7,7,7,7,7,7,7,7,7,7,8,0,0,0,0,0,0, +0,10,11,11,11,11,11,11,11,11,11,11,11,12,0,0,0,0,0,0, +0,10,11,11,11,11,11,11,11,11,11,11,11,11,7,7,7,7,7,7, +0,10,11,11,11,11,11,11,11,11,11,11,11,11,15,15,15,15,15,15, +0,10,11,11,11,11,11,11,11,11,11,11,11,12,0,0,0,0,0,0, +0,14,15,15,11,11,11,11,11,11,11,15,15,16,0,0,0,0,0,0, +0,0,0,0,14,15,11,11,11,15,16,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,2,3,4,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,2,3,4,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,2,3,4,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,2,3,4,0,0,0,0,0,0,0,18,19,20,0, +0,0,0,0,0,0,2,3,4,0,0,0,0,0,0,0,22,23,24,0, +0,0,0,0,0,0,2,3,4,0,0,0,0,0,0,0,22,9,24,0, +0,0,0,0,0,0,2,3,4,0,0,0,0,0,0,0,10,11,12,0, +0,0,0,0,0,0,2,3,4,0,0,0,0,0,0,0,10,11,12,0, +0,6,7,7,7,7,11,11,11,7,7,7,7,7,7,7,11,11,12,0, +0,10,11,11,11,11,11,11,11,11,11,11,11,11,15,15,15,15,16,0, +0,10,11,11,11,11,11,11,11,11,11,11,11,12,0,0,0,0,0,0, +0,10,11,11,11,11,11,11,11,11,11,11,11,12,0,0,0,0,0,0, +0,14,15,15,15,15,15,15,15,15,15,15,15,16,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,30,31,32,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,34,35,36,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,38,39,40,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + * These [color:yellow]stairs[color:reset] are [color:yellow]Pissing[color:reset] me +off... + + + + + + * Silence echoes in the darkness +of this familiar-yet-different +scenery. + * The power of avoiding copying +official music shines within +you. + + + + + + + + + + + + + + + + + + + + * I Am the Wall Guardian.[wait:5] +* This Wall is Off Limits for you +no-good wall slammers. + + + + + + + + + + + + + diff --git a/scripts/world/maps/room2.lua b/scripts/world/maps/room2.lua new file mode 100644 index 0000000..ca1b109 --- /dev/null +++ b/scripts/world/maps/room2.lua @@ -0,0 +1,255 @@ +return { + version = "1.5", + luaversion = "5.1", + tiledversion = "1.8.4", + orientation = "orthogonal", + renderorder = "right-down", + width = 20, + height = 12, + tilewidth = 40, + tileheight = 40, + nextlayerid = 6, + nextobjectid = 12, + properties = { + ["name"] = "Test Map - Room 2" + }, + tilesets = { + { + name = "castle", + firstgid = 1, + filename = "../tilesets/castle.tsx" + } + }, + layers = { + { + type = "tilelayer", + x = 0, + y = 0, + width = 20, + height = 12, + id = 1, + name = "tiles", + visible = true, + opacity = 1, + offsetx = 0, + offsety = 0, + parallaxx = 1, + parallaxy = 1, + properties = {}, + encoding = "lua", + data = { + 0, 0, 0, 0, 22, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 24, 0, + 0, 0, 0, 0, 22, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 24, 0, + 0, 0, 0, 0, 26, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 28, 0, + 0, 0, 0, 0, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 0, + 0, 0, 0, 0, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12, 0, + 0, 0, 0, 0, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12, 0, + 0, 0, 0, 0, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12, 0, + 0, 0, 0, 0, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12, 0, + 7, 7, 7, 7, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + } + }, + { + type = "tilelayer", + x = 0, + y = 0, + width = 20, + height = 12, + id = 2, + name = "decal", + visible = true, + opacity = 1, + offsetx = 0, + offsety = 0, + parallaxx = 1, + parallaxy = 1, + properties = {}, + encoding = "lua", + data = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 31, 32, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 35, 36, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 38, 39, 40, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + } + }, + { + type = "objectgroup", + draworder = "topdown", + id = 3, + name = "collision", + visible = true, + opacity = 0.5, + offsetx = 0, + offsety = 0, + parallaxx = 1, + parallaxy = 1, + properties = {}, + objects = { + { + id = 1, + name = "", + type = "", + shape = "rectangle", + x = 120, + y = 120, + width = 40, + height = 200, + rotation = 0, + visible = true, + properties = {} + }, + { + id = 2, + name = "", + type = "", + shape = "rectangle", + x = 0, + y = 400, + width = 760, + height = 40, + rotation = 0, + visible = true, + properties = {} + }, + { + id = 3, + name = "", + type = "", + shape = "rectangle", + x = 760, + y = 120, + width = 40, + height = 280, + rotation = 0, + visible = true, + properties = {} + }, + { + id = 4, + name = "", + type = "", + shape = "rectangle", + x = 160, + y = 80, + width = 600, + height = 40, + rotation = 0, + visible = true, + properties = {} + }, + { + id = 7, + name = "", + type = "", + shape = "rectangle", + x = 0, + y = 280, + width = 120, + height = 40, + rotation = 0, + visible = true, + properties = {} + } + } + }, + { + type = "objectgroup", + draworder = "topdown", + id = 4, + name = "markers", + visible = true, + opacity = 1, + offsetx = 0, + offsety = 0, + parallaxx = 1, + parallaxy = 1, + properties = {}, + objects = { + { + id = 5, + name = "spawn", + type = "", + shape = "point", + x = 360, + y = 240, + width = 0, + height = 0, + rotation = 0, + visible = true, + properties = {} + }, + { + id = 8, + name = "entry", + type = "", + shape = "point", + x = 40, + y = 360, + width = 0, + height = 0, + rotation = 0, + visible = true, + properties = {} + } + } + }, + { + type = "objectgroup", + draworder = "topdown", + id = 5, + name = "objects", + visible = true, + opacity = 1, + offsetx = 0, + offsety = 0, + parallaxx = 1, + parallaxy = 1, + properties = {}, + objects = { + { + id = 6, + name = "enemy", + type = "", + shape = "rectangle", + x = 530, + y = 220, + width = 40, + height = 40, + rotation = 0, + visible = true, + properties = { + ["actor"] = "dummy", + ["encounter"] = "dummy" + } + }, + { + id = 9, + name = "transition", + type = "", + shape = "rectangle", + x = -40, + y = 320, + width = 40, + height = 80, + rotation = 0, + visible = true, + properties = { + ["map"] = "room1", + ["marker"] = "entry" + } + } + } + } + } +} diff --git a/scripts/world/maps/room2.tmx b/scripts/world/maps/room2.tmx new file mode 100644 index 0000000..482313b --- /dev/null +++ b/scripts/world/maps/room2.tmx @@ -0,0 +1,71 @@ + + + + + + + + + + + +0,0,0,0,22,23,23,23,23,23,23,23,23,23,23,23,23,23,24,0, +0,0,0,0,22,23,23,23,23,23,23,23,23,23,23,23,23,23,24,0, +0,0,0,0,26,27,27,27,27,27,27,27,27,27,27,27,27,27,28,0, +0,0,0,0,6,7,7,7,7,7,7,7,7,7,7,7,7,7,8,0, +0,0,0,0,10,11,11,11,11,11,11,11,11,11,11,11,11,11,12,0, +0,0,0,0,10,11,11,11,11,11,11,11,11,11,11,11,11,11,12,0, +0,0,0,0,10,11,11,11,11,11,11,11,11,11,11,11,11,11,12,0, +0,0,0,0,10,11,11,11,11,11,11,11,11,11,11,11,11,11,12,0, +7,7,7,7,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,0, +15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,16,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,30,31,32,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,34,35,36,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,38,39,40,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/scripts/world/template.world b/scripts/world/template.world new file mode 100644 index 0000000..1cc12c8 --- /dev/null +++ b/scripts/world/template.world @@ -0,0 +1,20 @@ +{ + "maps": [ + { + "fileName": "maps/room1.tmx", + "height": 960, + "width": 800, + "x": 0, + "y": 0 + }, + { + "fileName": "maps/room2.tmx", + "height": 480, + "width": 800, + "x": 880, + "y": -120 + } + ], + "onlyShowAdjacentMaps": false, + "type": "world" +} diff --git a/scripts/world/tilesets/castle.lua b/scripts/world/tilesets/castle.lua new file mode 100644 index 0000000..ff30464 --- /dev/null +++ b/scripts/world/tilesets/castle.lua @@ -0,0 +1,31 @@ +return { + version = "1.10", + luaversion = "5.1", + tiledversion = "1.10.2", + name = "castle", + class = "", + tilewidth = 40, + tileheight = 40, + spacing = 0, + margin = 0, + columns = 4, + image = "../../../assets/sprites/tilesets/castle.png", + imagewidth = 160, + imageheight = 400, + objectalignment = "unspecified", + tilerendersize = "tile", + fillmode = "stretch", + tileoffset = { + x = 0, + y = 0 + }, + grid = { + orientation = "orthogonal", + width = 40, + height = 40 + }, + properties = {}, + wangsets = {}, + tilecount = 40, + tiles = {} +} diff --git a/scripts/world/tilesets/castle.tsx b/scripts/world/tilesets/castle.tsx new file mode 100644 index 0000000..2254cc7 --- /dev/null +++ b/scripts/world/tilesets/castle.tsx @@ -0,0 +1,7 @@ + + + + + + +