From 38650369e678a64e456280f83c1c565104ec84dd Mon Sep 17 00:00:00 2001 From: Bye <bye@byecorps.com> Date: Mon, 29 Aug 2022 17:24:30 +0100 Subject: [PATCH] a good day's worth of progress --- #foo.bar# | 1 + .swp | Bin 0 -> 12288 bytes game.js | 274 ++++++++++++++++++++++++++++++++++++++++++++++------- index.html | 11 +++ t.aseprite | Bin 2419 -> 3191 bytes t.png | Bin 765 -> 1390 bytes test.html | 24 +++++ 7 files changed, 278 insertions(+), 32 deletions(-) create mode 100644 #foo.bar# create mode 100644 .swp create mode 100644 test.html diff --git a/#foo.bar# b/#foo.bar# new file mode 100644 index 0000000..ce7c795 --- /dev/null +++ b/#foo.bar# @@ -0,0 +1 @@ +ByeMC is awesome \ No newline at end of file diff --git a/.swp b/.swp new file mode 100644 index 0000000000000000000000000000000000000000..3bffb92fcf05120f22984d74137996aeb902964e GIT binary patch literal 12288 zcmYc?2=nw+u+TGNU|?Vn01*)Uy^Vn(sWKJ9AwXv2mlmh$7UUNYP&X<)8UmvsFpwd@ z8ER}~XaI77vXY{Luuv$7If_R^U^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qNC=b^Ff!CL zFfcGd{mY1hh6;~TqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd70wFa#1) z7#Pm;Gcdg8hs^)O`u|}55cJQelSe~fGz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0q ZLtr!nKuh{_lNB<H6%xx+i}Q0+82|<d75)GK literal 0 HcmV?d00001 diff --git a/game.js b/game.js index ee76db8..4b69b43 100644 --- a/game.js +++ b/game.js @@ -13,7 +13,20 @@ const log = (logType, msg) => { const fontStack = '"Comic Sans MS"'; var id = 0; var pi = Math.PI; -var customLevel = document.location.hash; +gPar = (key) => { + + // Address of the current window + let address = window.location.search + + // Returns a URLSearchParams object instance + let parameterList = new URLSearchParams(address) + + // Returning the respected value associated + // with the provided key + return parameterList.get(key) +} + +var customLv = gPar("lv"); class Canvas { constructor(id) { @@ -209,7 +222,7 @@ class Canvas { } // Camera stuff - mvCamera(x, y, s) { + mvCamera(x, y) { this.camera.x += x; this.camera.y += y; } @@ -285,6 +298,9 @@ class Room { click(x, y) { // console.log(x, y); } + mHeld(x,y){ + + } start() { @@ -385,33 +401,35 @@ for (var key in images) { var levels = [ { - "name": "The First One", - "data": `@R>1!""!#"!$"!&""""#""$""%""&""&#"&$"&%"&&"&'"%'"$'"#'""'"!'""#!##!$#!%#!%$!%%!%&!$&!#&!"%!!%""$!#$!$$!$%!#%!"&!`, - "tile": images.level.tileset, - } + "name": "Tutorial", + "data": "[[1,1,2],[1,1,3],[5,1,4],[1,1,1],[2,0,3],[2,0,2],[2,0,1],[4,0,0],[5,1,0],[5,2,0],[5,3,0],[5,4,0],[5,6,0],[5,5,0],[5,7,0],[6,8,0],[0,9,0],[0,10,0],[2,8,1],[2,8,2],[2,8,3],[8,8,4],[5,7,4],[5,5,4],[5,6,4],[5,4,4],[5,2,4],[5,3,4],[7,0,4],[1,2,3],[9,2,2],[1,2,1],[1,3,1],[1,3,2],[1,3,3],[1,4,3],[1,4,2],[1,4,1],[1,5,1],[1,5,2],[1,5,3],[1,6,3],[10,6,2],[1,6,1],[1,7,1],[1,7,2],[1,7,3]]" + }, + { + "name": "First Floor" + }, ] hamsterRef = { "file": images.player.car, - "nolights": { + "nl": { "x": 1, "y": 1, "w": 32, "h": 16, }, - "brake": { + "b": { "x": 35, "y": 1, "w": 32, "h": 16, }, - "brakereverse": { + "br": { "x": 1, "y": 20, "w": 32, "h": 16, }, - "reverse": { + "r": { "x": 35, "y": 20, "w": 32, @@ -436,6 +454,30 @@ var levelRef = { { "x": 64, }, + { + "x": 96, + }, + { + "x": 128, + }, + { + "x": 160, + }, + { + "x": 192, + }, + { + "x": 224, + }, + { + "x": 256, + }, + { // player + "x": 32 + }, + { // human + "x": 32 + } ] } @@ -459,7 +501,7 @@ menu.s = 0 menu.o = [ { "t": "Play", - "a": _=>{ setRoom(2) } // go to game room + "a": _=>{ setRoom(4) } // go to game room }, { "t": "Editor", @@ -535,9 +577,9 @@ player.direction = 0; player.accel = 1; player.sprite = images.player.car; console.debug(player.sprite); -player.crop = hamsterRef.nolights; -player.x = c.w/2; -player.y = c.h/2; +player.crop = hamsterRef.nl; +player.x = 0; +player.y = 0; player.w = player.crop.w*2; player.h = player.crop.h*2; @@ -561,7 +603,7 @@ player.draw = () => { // canvas.strokeRect(player.x, player.y, player.w, player.h, "white"); let gun = images.player.gun; - let gunOx = 14; + let gunOx = 13; let gunOy = 0; let carCx = player.x + player.w/2; @@ -675,17 +717,24 @@ gameRoom.click = (e) => { player.shoot(); } -gameRoom.start = () => { - gameRoom.level = load_level(gameRoom.level.data); - if (customLevel) { - gameRoom.level = load_level(customLevel); +gameRoom.start = () =>{ + if (customLv) { + gameRoom.level = customLv + } + gameRoom.level = JSON.parse(gameRoom.level); + + for (let tile of gameRoom.level) { + if (tile[0] === 9) { + player.x = tile[1]*64 + player.y = tile[2]*64 + } } } gameRoom.draw = () => { - for (let tile of gameRoom.level.m) { + for (let tile of gameRoom.level) { // [index, x, y] - c.sliceImage(levelRef.file, tile[1]*32, tile[2]*32, 32,32, tile[0]*32, 0, 32, 32); + c.sliceImage(levelRef.file, (tile[1]*32)*2, (tile[2]*32)*2, 32*2,32*2, levelRef.tiles[tile[0]].x, 0, 32, 32); } for (let i = 0; i < cRoom.objects.length; i++) { @@ -694,17 +743,159 @@ gameRoom.draw = () => { } let editor = new Room("Editor"); +editor.i = 0; +editor.t = levelRef; +editor.l = [] +editor.n = "LV1" +editor.saving = false +editor.sa = 0 + +editor.start = _=>{ + editor.dPos = [15,65] +} +editor.draw = _=>{ + for (let tile of editor.l) { + // [index, x, y] + c.sliceImage(levelRef.file, (tile[1]*32)+editor.dPos[0], tile[2]*32+editor.dPos[1], 32,32, tile[0]*32, 0, 32, 32); + c.drawRect(editor.dPos[0], editor.dPos[1], 1,1, "red") + } +} +editor.step = _=>{ + if (editor.i < 0) { + editor.i = levelRef.tiles.length-1; + } + if (editor.i > levelRef.tiles.length-1) { + editor.i = 0; + } +} +editor.generate = _=>{ + editor.saving=1 + let encodedLevel = encodeURIComponent(JSON.stringify(editor.l)) + if (encodedLevel != editor.data){ + encodedLevel = "?lvl=" + encodedLevel; + document.getElementById("leveltext").innerText = encodedLevel + } + editor.data = encodedLevel; + editor.saving=0; + editor.sa = 1; +} +editor.click = (x,y)=>{ + if (y < 50) { + if (x> 516 && y < 50) { + if (!editor.saving){ + editor.generate() + } + editor.saveclick = true + } + } + else { + x = Math.floor((x-editor.dPos[0])/32) + y = Math.floor((y-editor.dPos[1])/32) + // console.debug(x,y) + for (let t in editor.l) { + if (editor.l[t][1] == x && editor.l[t][2] == y) { + editor.l[t] = [editor.i, x, y]; + return; + } + } + editor.l.push([editor.i,x,y]) + editor.sa = 0 + } +} +editor.keyHeld = (key) => { + switch (key) { + case "KeyW": + case "ArrowUp": + editor.dPos[1] += 4 + break; + case "KeyS": + case "ArrowDown": + editor.dPos[1] -= 4 + break; + case "KeyA": + case "ArrowLeft": + editor.dPos[0] += 4 + break; + case "KeyD": + case "ArrowRight": + editor.dPos[0] -= 4 + break; + } +} + editor.drawGUI = _=>{ - c.dT("bye", c.w/2,c.h/2,1,1,"#fff") + c.drawRect(0,0,c.w,50,"gray") + c.dT(`DBH Editor::${editor.n}`, 15,25,2,2,"#fff","start","middle"); + let s = c.dT(`Save`, c.w-15,25,2,2,"#fff","end","middle"); + if (c.mousePos.x > (c.w-30)-s.w && c.mousePos.y < 50) { + // console.debug((c.w-30)-s.w) + c.dT(`Save`, c.w-15,25,2,2,"#e5e5e5","end","middle"); + } + if (editor.sa) { + c.dT(`Save`, c.w-15,25,2,2,"#1fdc2f","end","middle"); + } if (editor.saving) { + c.dT(`Save`, c.w-15,25,2,2,"#1fccdc","end","middle"); + } + + c.sliceImage(editor.t.file, c.mousePos.x+16,c.mousePos.y+16,32,32,32*editor.i,0,32,32); +} + +let lvlS = new Room("Level Select") +lvlS.s = 0 +lvlS.o = levels + +lvlS.drawGUI = () => { + c.dT("Death by Hamster", c.w/2, 25, 2, 2, "white", "middle", "top"); + c.dT("Level Select", c.w/2, 44, 1,1,"gray","middle","middle"); + for (let o in lvlS.o) { + let n = parseInt(o)+1 + let slice = 15 + if (n >= 100){ + let slice = 13; + } else if (n >= 10) { + let slice = 14; + } + let txt = c.dT(`${n}.${lvlS.o[o].name.slice(0,slice)}`, 40, (70)+(o*20), 2,2,"#fff"); + if (lvlS.s == o) { + let a = images.ui.a; + let ap = (40)-a.width-4; + let ap2 = (40+txt.w)+a.width-4; + c.drawImg(a, ap, (70)+(o*20), a.width*2, a.height*2) + c.drawImg(a, ap2, (70)+(o*20), a.width*2, a.height*2, 180) + } + } + c.drawLine(c.w/2, 60, c.w/2, c.h-20, "white") +} + +lvlS.keyDown = (key) => { + if (key == "ArrowUp" || key == "KeyW") { + lvlS.s -= 1 + if (lvlS.s < 0) { + lvlS.s = lvlS.o.length-1 + } + } + if (key == "ArrowDown" || key == "KeyS") { + lvlS.s += 1 + if (lvlS.s > lvlS.o.length-1) { + lvlS.s = 0 + } + } + if (key == "Space" || key == "Enter") { + gameRoom.level = lvlS.o[lvlS.s].data; + setRoom(2) + } } -rooms.push(loader) +rooms.push(loader); rooms.push(menu); rooms.push(gameRoom); -rooms.push(editor) -var roomI = 0; +rooms.push(editor); +rooms.push(lvlS); +var roomI = !gPar("goto") ? 0 : gPar("goto"); + var cRoom = rooms[roomI]; + var keysPressed = {}; var keysLastPressed = {}; @@ -720,18 +911,36 @@ var lastTime = 0; var mse = {x: 0, y: 0}; var lastClick = {x: 0, y: 0}; -var clicked = false; +var startclicked = false; +var endclicked = false c.c.addEventListener('mousemove', (e) => { mse = c.getMousePos(e); } ); -c.c.addEventListener("click", (e) => { - console.log(e); +c.c.addEventListener("mousedown", (e) => { + // console.log(e); lastClick = c.getMousePos(e); mse = c.getMousePos(e); - clicked = true; + startclicked = true; }); +c.c.addEventListener("mouseup", (e)=>{ + // console.log(e); + lastClick = c.getMousePos(e); + mse = c.getMousePos(e); + endclicked = true; +}) + +window.onwheel = (e)=>{ + if (e.deltaY > 0) { + editor.i += 1; + } + if (e.deltaY < 0) { + editor.i -= 1; + } +} + +cRoom.start(); var gameLoop = setInterval(() => { c.tW = c.c.offsetWidth; @@ -750,11 +959,11 @@ var gameLoop = setInterval(() => { } } } - if (clicked) { + if (startclicked) { cRoom.click(lastClick.x, lastClick.y); - clicked = false; + startclicked = false; } - + cRoom.step(); cRoom.draw(); cRoom.drawGUI(); @@ -764,6 +973,7 @@ var gameLoop = setInterval(() => { switch (cRoom.name) { case "menu": + case "Editor": c.ctx.drawImage(images.mouse.cursor, Math.round(mse.x), Math.round(mse.y), images.mouse.cursor.width*2, images.mouse.cursor.height*2); break; case "Game": diff --git a/index.html b/index.html index f41d3a4..30b0ff2 100644 --- a/index.html +++ b/index.html @@ -16,13 +16,24 @@ cursor: none; } /* if the canvas can't fit the screen, shrink it, maintaining the aspect ratio */ + aside { + float:left; + } + aside pre { + color: white; + } + @media screen and (max-height: 800px) { #gameCanvas { width: auto; height: 100%; } } + </style> +<aside > + <pre id="leveltext"> </pre> +</aside> <canvas width="600" height="400" id="gameCanvas"> </canvas> <script id="fontScript" src="./letters.js"></script> diff --git a/t.aseprite b/t.aseprite index 3b8a3293977887579da088b9a0a92661fcca0b73..52c9e7b9b68564b35e02721e04dabb65ee07f358 100644 GIT binary patch delta 586 zcmew?^j(6zoQHwo!BXyx>~d_34<_5Ox--t0ypdVD{_S)}t^)=fEPwwO|4H!5Uz)Hf zZR@s>ME{d#*zyG@D$ccEzPuo$bWY-pSoXvBBiA=4ZvGW`FDcMnb$^m_#p%XPl7HUF zy>|Ga|1DnD`niVmM)@@JK)!AFA9tiFR~#`+zG$BEZM_Un|Azb*+hus(CsxbNef8gc zxdD4?{^3{m85kxzu(~o%hq&a5BVU68kITh-|1I_|$cvqEgRfpdStWMA<`lOhg1i64 zY(D=@f9lL{xBl(=cS3>F>>0P-qi$Q}e+#sKJDlIde|yFKlEU~iA6EWepH^_LUcLQt zdy&u0{qO$XKl$*Bw&a|D(SO75?|<<4_lt-89(E7B>|WgZv#9#@eAkU_Zci8(7$!Ti zx-iaxxa3+aUxNV$bHclN89j^nrfS+3_=F=bxqrSo-|%eCP1_Ge-?yGVo$9auMtR*K z{au;!pS0C(>i)+0lXd$W;Wv}k@2lU^{OYfJwMK0s|II(aKPSq0$-i9itz33W-Sf}y z|NPtaZGHw@;IsHct$&!)1)ly_p8awEYx$_h{&lmtH6FAvxxE5M&?1Oqt{CziP~c%c z@aMl}%>=#JgoAy_w-hJZgr#eFxSWaDd`2R9-lqEE8FwewZeo8bUA5%TA-O5(F9IJK z+s?7Obns<;Y28D<Q~Q3fU9P*xx2X2>zsb25w*FWW`%3*y(Enrq%}X}ywcp-f!cY}+ obAO)v%Z4}gCEGPK|L?aef9$pFuOIvKv&@tA+uSy<V>`+O09Ya_O8@`> delta 80 zcmew^@mYwyn3I9w!BUQm>~d_3os;cY-5DJxZ)6tN;%2Crlbn$7<GewayCKtM>7I<= m=DD}N$hW=BmEZgJ*z>lDS@sOqY|cBUPnP2L*!-Kbh6w<kMIY|~ diff --git a/t.png b/t.png index 3e8190fc4f3c8292230fa528fd6bde5f9c911aa8..bd2c211e511e380f3b330f03afbe694c702de509 100644 GIT binary patch literal 1390 zcmeAS@N?(olHy`uVBq!ia0y~yU`$|OU{K&-V_;y=@mn;7fq{XsILO_JVcj{ImkbQ7 z8lEnWAr*7p&OMv^*g&B5<x#N(YBlFo+eIdpBrq0oYO1KJG+c5FYT@7c<el1;#_t;@ zC>s8mshDn|TxplEahlJ^K(4<wQj<QN<1Du17x(;ocVB!C|KWypi(l`0QT^CLZ`<#E z{ZmYMV*Y!7-OZWv|MORGlb|2JrW^nJyiN6=mwCcj2dm|Y0gKn(_kDX%;^Un4zpo$t z_V~MZ>1+e5<ChaR{(t+h+0}kYGFuEsX-a~GrNJ@ptKXMZDcsuXR?|I$QGCMdo@<P} zUMfB2VfxDj?R)M2$G@px?y2|uVfe0sTlR+a_ET=nc=i9yyQW|7|GxYGzwx`qm*v0a zr$>exC$Q))x;IJ2ge`~f!U9%fwgZWKw${gYcVrqevn2(tUnsb;uHEpFO#glTgD->* zmB^$SywCg-Ii<e(N5-oE_uj92dbYthV%_x%U2S#deab%<C>%MHq}jOj<!nav31;!D z`eJV#o3{9^YVMcY?Q0ib{aN^R;=0#Id}lnC`gKgq$fe`w)1pmMU;Z~lr|L)?58U%P zpYsj7Wr$pG`?i%aiVA;MzqXoK-1y4LUU})~M*ZiFDS8{H?2{}|%>Kb3{hIxk>-|mk zPQBB$93Fa^W?a}V;=(GG$GDy4OVu(ShM?n8`)w4P<L+$c+Yww;r!v#Xu1~Z?=vUeS zP6cM3IdkQ#4ji=nJ~{gS`uV@T*P7+eS*6YLb*IM{&llohy>g{fUS6NRI^OGkkbvZp zd`87za|GvZsp|||!;@;Qcv;ADzeM!clh<Ch30%l94mo!}eA4EpSIn8&m`s)Yl&4+F zTYEln!Ia#~M(Q!nzr3BLuk|cdnBcKYbwQ=W$)_tK{@(by#+JYD^@5`nwZ1Fom_7aJ z^!(nmDG%4|4!f`PfXQTuYSFIf&NkBpny=<6*Unw}wfuM8$NXF3+UEEB_RhQhSYAB4 z`M=e6{iU<B<`<_O2=%yE=jrd8wb0()E-c))Z`LcBC1=dpU3W))-yG9dw*CG3)Sxsg zee?CRC(Uqdzm?uxAnj6R$T8J!dgC%BlT~HeCh@Pzw#sz0x~vqin6C9(%G7(hE_+PJ zwCJ3dWdVBA*G1k{o5-DO%O7JUbv`z^Ya@Th%+_gK?LkZnEBC5?U4B3(m~ZQ4r3953 zd&IxD7i&MWZj{}Vy>Rm4tM?s>Zb^r=|DM%yNo2yy)C((ilvNr&tLScM%&5@#*78N1 zVR~Ke-U%8Kx7A)AwYU_R@3r~rsy%m<<(>KW&YYc_`)>LsJ$d5?JhOVPTmIx%S-$Vd zlvN@Z((eZ?S6Oh~>9OhT12MucoY?-Co)Ixj4L<(lmf&jpt@(#|EE-FeSf-yo_WJt7 zOQ$lI^sUdG-}c;4;`Sk)9Zb5%Uf=n3i8tHLN_V4c5Oem<#&vhzZ<=azfBV#ZyoWU1 zs$};~sna?hU1j4gz4Up~eXWhI0vFgHT=DZ?d}TYw4yKpK1HIhC?*z|N=|BF$V{OG9 zr5TRvuIP&<fAfA7%`%5U>Y<0L<)w>Lx9nqkBXz-PtAKLY_TtRRxoh*;<~aUd`|R30 z_6=frU-wx4*i~OT|88vX-u1t)zy9{Iq~QGFr8ED1EGamC`JiRGCWnEL@`DR6{bg>& z{HoRe{n^N}O|h2yl&x;y@2?M+l^oCxySIL~3hTj@`GN*Qom*Ja7IZ5cO}=)Wp^Wv3 z?z8;tpKsoYP0ZvuA#>+Knck&3Ilb#Ara0S+WJa^ZG+a6IN7wDht&7_Po=@|5nx)vS z|EE@<`1uw4d3Dpxnb$dFJrz5~v3<pQUgLXKa{J?5O7F?p&3e&Z@{h4y-7jnH-ctt| Q7#J8lUHx3vIVCg!0A%)~yZ`_I literal 765 zcmeAS@N?(olHy`uVBq!ia0y~yU|7Jwz@Wgv#=yWZwZ8Z(0|NtNage(c!@6@aFBuq^ zwtKobhE&XXJI6au$&sgRwfoMXz6l<YlbAO?a5!9~QpCb{_2v?x{?EJR-mTikSRcf4 z<#g|ljj?)G-bQJA<HEduzyBYnb9VXueEDVH*8WVcWjvTH%*5kUxoKa+gZ8ICL*GQN z7r(JTPQSn|_xhLjsrEJr30@o*I91;V&t5+F^})K9g!Tm=T95Sz%-i}`V1e@w_S>`9 zFErF$v}uF9;tft)riY)m6x-h5XS~O-*=a5NZ^0(ngSMV)b&B}E9cHd8w9|X^`g7sW zue;3VZ~N%(a?khDe%%j0w|-sorkz21PQSO+oNFZ(Yh4-7F1dPpLE#?X$(zq^c^}m9 z;<nMMd!dKDQu@1g%UrN}=$7GHX|eW$;Kiuw%RMu9ehd4pXS;ya^2jCkTgQ)1{_HeG z+iPdM?+Fd|>`u0&&r9Y`(`dT3YU|WD)7I&$w#!`*db09D@spEYxw>)&llQi&OnLhA z>wd#Y<&L$B{rxxb>KT;OUfSBmUUF<jO!>1w+3g#jzIdl*v*7ri0x?~AH7hM=MZv3I zO<qrbVY$rtdS$TO29dk~zM$;O3vN#6xfi)O$jiHO=~eAK+ql;=-(O?S;ybdmWiR_K z#)XF#{*=D8=0k7ymW3B5+;@J-J>z8ZiW}SJMfJpVC&ztRWUlI&AH*eFV&mJfRAt7E zKXrcjUXK<zK5|SBI<z~(^T3oHnlBkAIu))yzN*sU-uA1^_l)zL3~pUoT=&ar>AndU zjKZ`IUitO&M%>4#W@5JA%NLaST5X<QD=xQT+VYR)H>x)1tu>sr*LKd7-`oB%BwXX? zHTf1>ap0bn(BHIPu~}1Yr>1qUy}o!c|IY1qFYV)I+}7m9ue`D|pFi!bS@iXLxA%1m zylD+g6@DKf{_SpS!l^ScYgy0!eCx4=bHB;F^=ml~8ozC4-{ZI>B&Dp&=<vSPPFq+% j-rtzR$uBYE6Q}#stnK>8{goLQ7#KWV{an^LB{Ts5a$<EN diff --git a/test.html b/test.html new file mode 100644 index 0000000..062cd98 --- /dev/null +++ b/test.html @@ -0,0 +1,24 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8"> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <title>Document</title> +</head> +<body> + <li>Lorem ipsum, dolor sit amet consectetur adipisicing elit. Sed accusamus id architecto fugiat enim eveniet dolor labore odio quas. Exercitationem ea mollitia quisquam laudantium! Cumque sunt dignissimos dolorem sed suscipit.</li> + <li>Dolorem, vitae. Tempora earum iure autem error quia eum, eligendi neque quidem ea quasi tenetur nobis. Exercitationem, architecto impedit? Architecto ex adipisci ducimus odit esse quia perferendis at voluptas minima?</li> + <li>Fugiat nulla id accusamus iusto dolorem labore facilis est quibusdam, accusantium, tempora cumque culpa minus? Cumque fugiat veritatis, officiis eaque fuga nostrum aliquam? Architecto explicabo cumque fugiat. Laborum, omnis asperiores!</li> + <li>Ducimus praesentium consequuntur cum suscipit velit quam aut corrupti debitis in necessitatibus quasi possimus quisquam nihil tenetur veritatis amet molestias dolor quia ratione sit eveniet, quaerat at. Quam, eos libero.</li> + <li>Natus, dolore. Mollitia doloribus in molestias iusto est temporibus non quas vero, debitis eveniet eaque nam voluptates sed ducimus aut facere obcaecati dolorem beatae repudiandae eum, sapiente tempora perferendis cum!</li> + <li>Itaque, quo nam architecto placeat reiciendis expedita quibusdam eos tempora accusantium aliquid commodi accusamus repellat? Tempore blanditiis eos, magnam sequi, perspiciatis impedit eveniet placeat alias velit praesentium voluptates. Totam, minus.</li> + <li>Iusto recusandae sint accusantium voluptatibus quo illum molestias, amet, at voluptates ducimus tempora tempore error nemo impedit quos architecto esse fugiat eaque molestiae unde dolorem laudantium. Aspernatur suscipit sint adipisci?</li> + <li>Vel optio quod quas. Perferendis, dolorum. Minima nihil ipsa eligendi temporibus! Sit praesentium maxime expedita, dolorem libero consequatur error quae quisquam iste vel possimus temporibus culpa repellendus molestiae eum aliquam?</li> + <li>Repellat distinctio, necessitatibus minima ipsa debitis unde quidem nobis consequatur aliquam deleniti perferendis ullam nostrum maiores ea voluptate obcaecati optio aliquid vero nihil. Nesciunt culpa molestias quisquam cum? Blanditiis, amet.</li> + <li>Harum velit accusantium aspernatur perspiciatis labore blanditiis facere fugiat non repudiandae, animi nostrum quidem necessitatibus officia perferendis fugit? Vitae fugit enim facilis animi quasi in magnam atque sed esse sit.</li> + <li>Molestiae atque, vitae earum similique voluptas dolorem ea pariatur veniam cupiditate eius debitis, qui dolores cum quis est. At aperiam quisquam sed atque rem animi et tempora excepturi quos minima.</li> + <li>Sunt quos tempore fugit ab modi, eligendi amet cumque ipsum excepturi aperiam consectetur autem accusantium? Quas qui exercitationem iusto harum voluptatum odit illo quidem deleniti. Voluptatem eaque fuga cumque laboriosam?</li> + <li>Quos officia inventore rerum assumenda! Aliquam quasi, libero molestiae dignissimos delectus quos ipsa minima mollitia qui dolorum quibusdam maiores accusamus? Voluptates autem, placeat eaque laudantium tempora quisquam minima at explicabo.</li> +</body> +</html> \ No newline at end of file -- GitLab