SHOW:
|
|
- or go back to the newest paste.
| 1 | system.disableChatCommandDisplay("help",true)
| |
| 2 | tfm.exec.disableAutoShaman(true) | |
| 3 | tfm.exec.disableAutoNewGame(true) | |
| 4 | tfm.exec.disableAutoTimeLeft(true) | |
| 5 | ||
| 6 | sin=math.sin | |
| 7 | cos=math.cos | |
| 8 | exp=math.exp | |
| 9 | pow=math.pow | |
| 10 | random=math.random | |
| 11 | sqrt=math.sqrt | |
| 12 | atan2=math.atan2 | |
| 13 | ||
| 14 | images={bell={img="RYDr1bs.png",x=-63,y=-85},heart={img="xkXRpBD.png",x=10,y=30},full={img="SngMG3F.png",x=7,y=55},toys={img={"RGFcIjz.png","7qwZeWD.png","5oDZUVp.png","wUjtCfa.png","ZjAWge2.png"},x={-10,-13,-5,-10,-10},y={-3,-20,-22,-5,-10}},jingle={img={"Irj5Jr7.png","0qnwm23.png","NlBfXFc.png","xoDTQqV.png"},x={-30,-20,-26,-20},y={-35,-34,-34,-35}},barrelBig={img={"f1VWEbt.png","jeLpl8e.png"},imgFlash={"0pNTLJK.png","L92T4yP.png"},x={-29,-29},y={-28,-28}},barrelLittle={img={"jFavdFn.jpg","UzCNqBy.jpg"},imgFlash={"7XPuAGy.jpg","znT4QCH.jpg"},x={-15,-15},y={-15,-15}},fireworks={img={"sHQtkLP.png","SGNDjGy.png"},imgFlash={"28Y3L3w.png","28Y3L3w.png"},x={-27,-27},y={-6,-6}},numbers={"7OTfA2O.png","aIap6r2.png","1mVCFSC.png","TipiF3Y.png","O7T8836.png","ym778Bo.png","Q7fnIlX.png","6Y7Bjsk.png","asWg9Tz.png","BpNdwFQ.png","oWtyTh5.png"},help={{img="DgigJ4B.png",x=112,y=33},{img="WgQuEc0.png",x=614,y=34},{img="NeoqaqN.png",x=596,y=40},{img="nS1NIp6.png",x=596,y=65}},elves={x=-32,y=-60},boxletter={img="Eus9r3H.png",x=0,y=0},letter={img="44O0SPP.png",x=150,y=25},gift={img="3v4KgmE.png",x=-5,y=-15},rocket={{img="GpOKrbg.png",x=151,y=30},{img="xLgyAVh.png",x=609,y=74},{img="Ng5pX6d.png",x=609,y=30},{img="EaCRTo8.png",x=639,y=43}}}
| |
| 15 | ||
| 16 | boxPattern={{{id=2,x=0,y=0,angle=0,time=0}},{{id=60,x=-30,y=10,angle=-60,time=0},{id=60,x=-20,y=10,angle=-90,time=0},{id=2,x=0,y=0,angle=0,time=0}},{{id=60,x=30,y=10,angle=-120,time=0},{id=60,x=20,y=10,angle=-90,time=0},{id=2,x=0,y=0,angle=0,time=0}},{{id=60,x=-20,y=10,angle=-90,time=0},{id=2,x=0,y=0,angle=0,time=0}},{{id=60,x=-55,y=10,angle=0,time=0},{id=60,x=-55,y=5,angle=0,time=0},{id=60,x=-55,y=0,angle=0,time=0},{id=2,x=0,y=0,angle=0,time=0}}, {{id=60,x=-20,y=0,angle=-60,time=0},{id=60,x=0,y=0,angle=-90,time=0},{id=60,x=20,y=0,angle=-120,time=0}},{{id=60,x=0,y=10,angle=0,time=0},{id=60,x=0,y=5,angle=0,time=0},{id=60,x=-30,y=0,angle=-60,time=0}},{{id=1,x=0,y=0,angle=0,time=0},{id=1,x=30,y=0,angle=0,time=0},{id=1,x=0,y=-20,angle=0,time=0}},{{id=60,x=-20,y=0,angle=-60,time=0},{id=60,x=0,y=0,angle=-90,time=0},{id=60,x=20,y=0,angle=-120,time=0}},{{id=60,x=0,y=10,angle=0,time=0},{id=60,x=0,y=5,angle=0,time=0},{id=60,x=-30,y=0,angle=-60,time=0}},{{id=1,x=0,y=0,angle=0,time=0},{id=1,x=30,y=0,angle=0,time=0},{id=1,x=20,y=-20,angle=0,time=0}},{{id=1,x=0,y=0,angle=0,time=0}},{{id=60,x=0,y=0,angle=0,time=0}},{{id=60,x=0,y=0,angle=0,time=0},{id=60,x=0,y=-10,angle=0,time=0}},{{id=60,x=-30,y=0,angle=-60,time=0},{id=1,x=0,y=0,angle=0,time=0}},}
| |
| 17 | ||
| 18 | map={
| |
| 19 | code='<C><P L="1600" Ca="" H="800" /><Z><S><S P="0,0,0.3,0.2,0,0,0,0" L="1500" o="ffffffffffff" X="850" Y="788" T="12" H="25" /><S L="104" X="52" H="416" Y="593" T="11" P="0,0,0.3,0.2,0,0,0,0" /><S P="0,0,0.3,0.2,0,0,0,0" L="120" o="ffffffffffff" H="32" c="3" Y="699" T="12" X="291" /><S P="0,0,0.3,0.2,0,0,0,0" L="524" o="ffffffffffff" X="365" Y="371" T="12" H="27" /><S P="0,0,0.3,0.2,0,0,0,0" L="74" o="ffffffffffff" X="139" Y="765" T="12" H="25" /><S L="728" X="1236" H="24" Y="374" T="11" P="0,0,0.3,0.2,0,0,0,0" /><S P="0,0,0.8,0.2,0,0,0,0" L="31" o="ffffffffffff" X="181" Y="152" T="12" H="304" /><S P="0,0,0.3,0.2,0,0,0,0" L="632" o="ffffffffffff" X="512" Y="13" T="12" H="26" /><S P="0,0,0.3,0.2,0,0,0,0" L="146" o="ffffffffffff" X="799" Y="371" T="12" H="27" /><S P="0,0,0.3,0.2,-37,0,0,0" L="500" o="ffffffffffff" X="539" Y="550" T="12" H="37" /><S P="0,0,0.8,0.2,0,0,0,0" L="30" o="ffffffffffff" X="815" Y="213" T="12" H="206" /><S P="0,0,0.3,0.2,0,0,0,0" L="154" o="ffffffffffff" H="36" Y="130" T="12" X="906" /><S P="0,0,0.3,0.2,0,0,0,0" L="34" o="ffffffffffff" H="53" Y="27" T="12" X="813" /><S P="0,0,0.3,0.8,0,0,0,0" L="35" o="ffffffffffff" H="10" Y="174" T="13" X="1165" /><S P="0,0,0.3,0.8,0,0,0,0" L="25" o="ffffffffffff" H="10" Y="216" T="13" X="1107" /><S L="25" o="ffffffffffff" H="10" X="1218" Y="233" T="13" P="0,0,0.3,0.8,0,0,0,0" /><S P="0,0,0.3,0.2,0,0,0,0" L="216" o="ffffffffffff" H="18" Y="153" T="12" X="352" /><S P="0,0,0.3,0.2,0,0,0,0" L="170" o="ffffffffffff" H="11" Y="332" T="12" X="407" /><S P="0,0,0.3,0.2,0,0,0,0" L="77" o="ffffffffffff" H="13" Y="196" T="12" X="546" /><S P="0,0,0.3,0.2,0,0,0,0" L="103" o="ffffffffffff" H="14" Y="158" T="12" X="646" /><S P="0,0,0.3,0.2,0,0,0,0" L="132" o="ffffffffffff" H="10" Y="562" T="12" X="290" /><S L="132" o="ffffffffffff" H="10" X="290" Y="509" T="12" P="0,0,0.3,0.2,0,0,0,0" /><S P="0,0,0.3,0.2,0,0,0,0" L="132" o="ffffffffffff" X="290" Y="450" T="12" H="10" /><S P="0,0,0.3,0.2,0,0,0,0" L="15" o="ffffffffffff" H="10" Y="479" T="13" X="742" /><S P="0,0,0.3,0.2,0,0,0,0" L="10" o="ffffffffffff" H="10" Y="499" T="13" X="777" /><S P="0,0,0.3,0.2,0,0,0,0" L="10" o="ffffffffffff" H="10" Y="485" T="13" X="814" /><S P="0,0,0.3,0.2,0,0,0,0" L="262" o="ffffffffffff" H="10" Y="732" T="12" X="741" /><S P="0,0,0.3,0.2,0,0,0,0" L="221" o="ffffffffffff" H="11" Y="687" T="12" X="769" /><S P="0,0,0.3,0.2,0,0,0,0" L="132" o="ffffffffffff" H="10" Y="457" T="12" X="914" /><S P="0,0,0.3,0.2,0,0,0,0" L="105" o="ffffffffffff" H="16" Y="659" T="12" X="936" /><S P="0,0,0.3,0.2,0,0,0,0" L="93" o="ffffffffffff" H="17" Y="607" T="12" X="1027" /><S P="0,0,0.8,0.2,0,0,0,0" L="43" o="ffffffffffff" H="318" Y="544" T="12" X="1094" /><S P="0,0,0.3,0.2,0,0,0,0" L="107" o="ffffffffffff" H="16" Y="469" T="12" X="1169" /><S P="0,0,0.3,0.2,0,0,0,0" L="169" o="ffffffffffff" H="15" Y="477" T="12" X="1410" /><S P="0,0,0.3,0.2,0,0,0,0" L="147" o="ffffffffffff" H="15" Y="542" T="12" X="1496" /><S P="0,0,0.3,0.2,0,0,0,0" L="151" o="ffffffffffff" H="16" Y="580" T="12" X="1292" /><S P="0,0,0.3,0.2,0,0,0,0" L="196" o="ffffffffffff" H="16" Y="664" T="12" X="1211" /><S P="0,0,0.8,0.2,0,0,0,0" L="31" o="ffffffffffff" H="392" Y="581" T="12" X="1585" /><S P="0,0,0.3,0.2,0,0,0,0" L="127" o="ffffffffffff" H="15" Y="680" T="12" X="1507" /><S P="0,0,0.3,0.2,-40,0,0,0" L="90" o="ffffffffffff" H="15" Y="707" T="12" X="1415" /><S L="51" o="ffffffffffffff" H="816" X="-26" Y="395" T="12" P="0,0,0,0.2,0,0,0,0" /><S P="0,0,0,0.2,0,0,0,0" L="51" o="ffffffffffffff" X="1626" Y="380" T="12" H="816" /><S L="1600" o="ffffffffffffff" H="50" X="800" Y="-25" T="12" P="0,0,0,0.2,0,0,0,0" /><S P="0,0,0.3,0.2,0,0,0,0" L="10" o="ffffffffffff" X="434" c="2" Y="689" T="12" H="90" /><S P="0,0,0.3,0.2,45,0,0,0" L="90" o="ffffffffffff" X="1395" c="2" Y="766" T="12" H="90" /><S P="0,0,0.3,0.2,0,0,0,0" L="90" o="ffffffffffff" X="845" c="2" Y="316" T="12" H="90" /><S H="150" L="10" o="ffffffffffff" X="766" c="2" Y="296" T="12" P="0,0,0.3,0.2,30,0,0,0" /></S><D><DS Y="369" X="28" /></D><O /></Z></C>', | |
| 20 | background={img="mRKhmjS.png",x=0,y=0},
| |
| 21 | posJingle={x={1424,178,256,964},y={348,343,668,761},img={4,2,3,1}},
| |
| 22 | mistletoe={x={840,320},y={97,668},r={50,50},kiss={{},{}}},
| |
| 23 | toysPos={
| |
| 24 | x={330,510,256,520,1493,609,842,883,1163,1220,1105,736,240,240,240,300,1041,630,673,902,995,866,745,1458,1130,1235,1437,1346,1130},
| |
| 25 | y={311,342,129,174,346,136,97,346,124,193,176,342,542,489,430,761,761,712,666,636,583,437,449,657,641,557,519,454,446},
| |
| 26 | l={145,100,185,60,90,75,128,460,2,2,2,123,99,99,99,541,510,230,191,77,62,100,2,94,160,116,113,132,76}
| |
| 27 | }, | |
| 28 | barrels={
| |
| 29 | x={284,549,633,878,900,240,240,240,118,400,626,630,681,989,856,749,1190,1130,1235,1522,1346,1130,340,507},
| |
| 30 | y={129,174,136,97,348,542,489,430,737,761,737,712,666,583,437,450,761,641,557,519,454,446,311,342},
| |
| 31 | l={134,5,10,60,405,99,99,99,30,152,264,218,175,68,110,60,369,160,116,30,132,76,130,105},
| |
| 32 | w={1,6,6,1,1,12,12,12,12,6,12,12,1,6,12,12,12,12,1,6,1,1,6,6}}
| |
| 33 | } | |
| 34 | ||
| 35 | settings={life=3,bagMax=3,toysNum=30,timestamp=8000,radius=75,barrels=36,explosionPower=42}
| |
| 36 | players={}
| |
| 37 | toys={}
| |
| 38 | barrels={}
| |
| 39 | boxTimers={}
| |
| 40 | globalTime=0 | |
| 41 | ||
| 42 | text={
| |
| 43 | name="<J>The Toy Factory",give="<J>Oh! %s more toy(s)! Thank you!",empty="<J>Your bag is empty :(",full="<J>Your bag is full ^_^",elf="UDYkbja.png",
| |
| 44 | RU={name="<J> Игрушечная фабрика",give="<J>Ох! %s большие игрушки! Спасибо!",empty="<J>Ваша сумка пуста :(",full="<J> Ваша сумка полная ^_^",elf="KVxylyj.png"},
| |
| 45 | HU={name="<J>A Játékgyár",give="<J>Ó! Még %s játék! Köszönjük!",empty="<J>A táskád üres :(",full="<J>Tele a táskád ^_^",elf="UDYkbja.png"},
| |
| 46 | FR={name="<J>La Fabrique de Jouets",give="<J>Oh ! %s jouet(s) en plus ! Merci !",empty="<J>Ton sac est vide :(",full="<J>Ton sac est plein ^_^",elf="UAqX7CF.png"},
| |
| 47 | ES={name="<J>La Fábrica de Juguetes",give="<J>¡Oh! %s ¡más juguetes! ¡Gracias!",empty="<J>Tu bolsa está vacia :(",full="<J>Tu bolsa está llena ^_^",elf="Ta5bjeI.png"},
| |
| 48 | BR={name="<J>A Fabrica de Brinquedos",give="<J>Oh! Mais %s brinquedos! Obrigado!!",empty="<J>Sua bolsa é vazia :(",full="<J>Sua bolsa é cheia ^_^",elf="emrREal.png"},
| |
| 49 | RO={name="Fabrica de Jucării",give="<J> Vai! Încă %s jucării! Mulțumesc!",empty="<J>Sacul tău e gol :(",full="<J> Sacul tău e plin ^_^",elf="UDYkbja.png"},
| |
| 50 | VK={name="Leketøy fabrikken",give="<J>Du ga meg %s flere leker. Tusen takk.",empty="<J>Sekken din er tom :(",full="<J>Sekken din er full ^_^",elf="Nl9PMWh.png"},
| |
| 51 | DE={name="Die Spielzeugfabrik",give="<J>Ach! %s mehr Spielzeuge!Danke dir!",empty="<J>Deine Tüte ist leer :(",full="<J>Deine Tüte ist voll! ^_^",elf="UDYkbja.png"},
| |
| 52 | NL={name="<J>Het Speelgoedfabriek",give="<J>Ooh! %s meer speelgoed! Dankje wel!",empty="<J>Je tas is leeg :(",full="<J>Je tas is vol ^_^",elf="ir5mPsN.png"},
| |
| 53 | NL={name="<J>Het Speelgoedfabriek",give="<J>Ooh! %s meer speelgoed! Dankje wel!",empty="<J>Je tas is leeg :(",full="<J>Je tas is vol ^_^",elf="ir5mPsN.png"},
| |
| 54 | ID={name="<J>Pabrik Mainan",give="<J>Oh! %s tambahan mainan! Terima kasih!",empty="<J>Tas kamu kosong :(",full="<J>Tas kamu penuh ^_^",elf="kM9rblM.png"},
| |
| 55 | PL={name="<J>Fabryka Zabawek",give="<J>Oh! %s więcej zabawek! Dzięki!",empty="<J>Twoja torba jest pusta :(",full="<J>Twoja torba jest pełna ^_^",elf="wRajSrK.png"},
| |
| 56 | CN={name="<J>玩具工厂",give="<J>哦!你带来了 %s 个玩具!谢谢!",empty="<J>你的包没有玩具 :(",full="<J>你的包已经满了 ^_^",elf="jZaeS2r.png"},
| |
| 57 | TR={name="<J>Oyuncak Atölyesi",give="<J>Oh! %s tane daha oyuncak! Teşekkürler!",empty="<J>Çantan boş :(",full="<J>Çantan dolu ^_^",elf="UDYkbja.png"}}
| |
| 58 | ||
| 59 | lang=tfm.get.room.community | |
| 60 | if text[lang] then | |
| 61 | for id,message in pairs(text[lang]) do | |
| 62 | text[id]=message | |
| 63 | end | |
| 64 | end | |
| 65 | ||
| 66 | --Utils | |
| 67 | ||
| 68 | function table.contains(t,element) | |
| 69 | for key,value in ipairs(t) do | |
| 70 | if value==element then | |
| 71 | return true | |
| 72 | end | |
| 73 | end | |
| 74 | return false | |
| 75 | end | |
| 76 | ||
| 77 | function string.split(str,s) | |
| 78 | local res = {}
| |
| 79 | for part in string.gmatch(str, "[^" .. s .. "]+") do | |
| 80 | table.insert(res, part) | |
| 81 | end | |
| 82 | return res | |
| 83 | end | |
| 84 | ||
| 85 | function table.random(t) | |
| 86 | return t[random(1,#t)] | |
| 87 | end | |
| 88 | ||
| 89 | function tfm.get.room.isAlive() | |
| 90 | for name,player in pairs(tfm.get.room.playerList) do | |
| 91 | if not player.isDead then return true end | |
| 92 | end | |
| 93 | return false | |
| 94 | end | |
| 95 | ||
| 96 | -- Collision | |
| 97 | ||
| 98 | function pythag(x1,y1,x2,y2,r) | |
| 99 | local x=x2-x1 | |
| 100 | local y=y2-y1 | |
| 101 | local r=r+r | |
| 102 | return x*x+y*y<r*r | |
| 103 | end | |
| 104 | ||
| 105 | function nearObject(x1,y1,nearPixel,table) | |
| 106 | for id,pos in ipairs(table) do | |
| 107 | if pythag(x1,y1,pos.x,pos.y,nearPixel) then return id end | |
| 108 | end | |
| 109 | return nil | |
| 110 | end | |
| 111 | ||
| 112 | -- Ui | |
| 113 | ||
| 114 | function ui.updateScores(name) | |
| 115 | local str=players[name].bag.."/"..settings.bagMax | |
| 116 | local x,y,num=0,0,0 | |
| 117 | for i,k in pairs(players[name].scoreImg) do | |
| 118 | tfm.exec.removeImage(k) | |
| 119 | end | |
| 120 | players[name].scoreImg={}
| |
| 121 | for i=1,#str do | |
| 122 | num=((tonumber(str:sub(i,i)))or 10)+1 | |
| 123 | if num==11 then x,y=1,-1 else x,y=0,0 end | |
| 124 | table.insert(players[name].scoreImg,tfm.exec.addImage(images.numbers[num],"&3",40+(i-1)*14+x,60+y,name,true)) | |
| 125 | end | |
| 126 | tfm.exec.addImage(images.full.img,"&3",images.full.x,images.full.y,name,true) | |
| 127 | ui.addTextArea(-2, "<J><b><font size='12'> "..players[name].toys.."</font></b>", name, 735, 350, 100, 20,nil,nil, 0.6,true) | |
| 128 | tfm.exec.addImage(images.toys.img[1],"&3",745+images.toys.x[1],353+images.toys.y[1],name,true) | |
| 129 | end | |
| 130 | ||
| 131 | function ui.updateHeart(name) | |
| 132 | tfm.exec.removeImage(players[name].life[#players[name].life] or -500) | |
| 133 | table.remove(players[name].life,#players[name].life) | |
| 134 | end | |
| 135 | ||
| 136 | function ui.help(name) | |
| 137 | if not players[name].help[1] then | |
| 138 | for i=1,#images.help do | |
| 139 | table.insert(players[name].help,tfm.exec.addImage(images.help[i].img,"&5",images.help[i].x,images.help[i].y,name)) | |
| 140 | end | |
| 141 | ui.addTextArea(50,"<a href='event:help'><b><font size='2'> </font><font color='#040404'>X</font></b></a>", name, 598,49,15,15,0x7E8182,0x7E8182,1,true) | |
| 142 | end | |
| 143 | end | |
| 144 | ||
| 145 | -- Explosions | |
| 146 | ||
| 147 | function spawnBoxes(boxTable,x,y) | |
| 148 | local boxId,imgTale,imgId= 0,0,0 | |
| 149 | for id,box in ipairs(boxTable) do | |
| 150 | boxId=tfm.exec.addShamanObject(box.id, x+box.x, y+box.y, box.angle, 0, 0,false) | |
| 151 | if box.id==2 then imgTable=images.barrelBig | |
| 152 | elseif box.id==1 then imgTable=images.barrelLittle | |
| 153 | elseif box.id==60 then imgTable=images.fireworks end | |
| 154 | imgId=random(1,#imgTable.img) | |
| 155 | tfm.exec.addImage(imgTable.img[imgId],"#"..boxId,imgTable.x[imgId],imgTable.y[imgId]) | |
| 156 | table.insert(boxTimers,{boxId,os.time(),random(6,90)*1000,0,box.id,imgId,false,false})
| |
| 157 | end | |
| 158 | end | |
| 159 | ||
| 160 | function explosionFlash(id,box,remove) | |
| 161 | local imgTable=nil | |
| 162 | if box[5]==2 then imgTable=images.barrelBig | |
| 163 | elseif box[5]==1 then imgTable=images.barrelLittle | |
| 164 | elseif box[5]==60 then imgTable=images.fireworks end | |
| 165 | if imgTable then | |
| 166 | if remove then tfm.exec.addImage(imgTable.img[box[6]],"#"..box[1],imgTable.x[box[6]],imgTable.y[box[6]]) | |
| 167 | else tfm.exec.addImage(imgTable.imgFlash[box[6]],"#"..box[1],imgTable.x[box[6]],imgTable.y[box[6]]) end | |
| 168 | end | |
| 169 | end | |
| 170 | ||
| 171 | -- Events | |
| 172 | ||
| 173 | function eventChatCommand(name,msg) | |
| 174 | if msg=="help" then ui.help(name) end | |
| 175 | end | |
| 176 | ||
| 177 | function eventNewPlayer(name) | |
| 178 | tfm.exec.addImage(map.background.img,"?1",map.background.x,map.background.y,name) | |
| 179 | tfm.exec.setUIMapName(text.name) | |
| 180 | end | |
| 181 | ||
| 182 | function eventMouse(name,x,y) | |
| 183 | if players[name].letter[1] then | |
| 184 | tfm.exec.removeImage(players[name].letter[1]) | |
| 185 | players[name].letter[1]=nil | |
| 186 | end | |
| 187 | if players[name].power[1] then | |
| 188 | if os.difftime(os.time(),players[name].power[1])>=15000 and os.difftime(os.time(),globalTime)>=2000 then | |
| 189 | tfm.exec.removeImage(players[name].power[2]) | |
| 190 | local choice=random(1,3) | |
| 191 | local glitter={13,11,9,2,21,23,24}
| |
| 192 | drawParam2(0,{x,y,-10,9.8955,7,{13,11,9,2,1}})
| |
| 193 | drawCircle(0,{{x=x,y=y},{x=x,y=y+40},{13,11,9,2,1}})
| |
| 194 | if choice==1 then | |
| 195 | drawButterfly(0,{x,y,{table.random(glitter)}})
| |
| 196 | elseif choice==2 then | |
| 197 | drawParam2(0,{x,y,5,0.5,60,{table.random(glitter)}})
| |
| 198 | drawParam2(0,{x,y,1.6,0.5,25,{table.random(glitter)}})
| |
| 199 | elseif choice==3 then | |
| 200 | drawParam1(0,{x,y,5,1,5,1,{table.random(glitter)}})
| |
| 201 | end | |
| 202 | players[name].power[1]=os.time() | |
| 203 | globalTime=os.time() | |
| 204 | end | |
| 205 | end | |
| 206 | end | |
| 207 | ||
| 208 | function eventKeyboard(name,key,down,x,y) | |
| 209 | if key==32 or key==83 or key==40 then | |
| 210 | local near=nearObject(x,y,20,toys) | |
| 211 | for id=1,#map.posJingle.x do | |
| 212 | if pythag(x,y,map.posJingle.x[id],map.posJingle.y[id],20) then | |
| 213 | if players[name].bag>0 then | |
| 214 | tfm.exec.chatMessage(string.format(text.give,players[name].bag),name) | |
| 215 | players[name].spam=os.time() | |
| 216 | local particleHearts={{x=0,y=-0.5},{x=0.5,y=-0.5},{x=-0.5,y=-0.5}}
| |
| 217 | for i=1,players[name].bag do | |
| 218 | tfm.exec.displayParticle(5, map.posJingle.x[id], map.posJingle.y[id]-20, particleHearts[i].x, particleHearts[i].y, 0, 0,name) | |
| 219 | end | |
| 220 | eventTextAreaCallback(0,name,"jingle") | |
| 221 | near=nil | |
| 222 | else | |
| 223 | if os.difftime(os.time(),players[name].spam)>1000 then | |
| 224 | tfm.exec.chatMessage(text.empty,name) | |
| 225 | players[name].spam=os.time() | |
| 226 | end | |
| 227 | end | |
| 228 | end | |
| 229 | end | |
| 230 | if near and not table.contains(players[name].toysTaken,near)then | |
| 231 | if not (players[name].bag>=settings.bagMax) then | |
| 232 | table.insert(players[name].toysTaken,near) | |
| 233 | tfm.exec.removeImage(players[name].toysList[near]) | |
| 234 | players[name].bag=players[name].bag+1 | |
| 235 | tfm.exec.displayParticle(15,x+15,y-15,0,-1,0,0,name) | |
| 236 | ui.updateScores(name) | |
| 237 | end | |
| 238 | if players[name].bag>=settings.bagMax then | |
| 239 | if os.difftime(os.time(),players[name].spam)>1000 then | |
| 240 | tfm.exec.chatMessage(text.full,name) | |
| 241 | players[name].spam=os.time() | |
| 242 | end | |
| 243 | end | |
| 244 | end | |
| 245 | if pythag(87,370,x,y,20) and players[name].toys>=115 and not players[name].letter[2] then | |
| 246 | players[name].letter[1],players[name].letter[2]=tfm.exec.addImage(images.letter.img,"&1",images.letter.x,images.letter.y,name),true | |
| 247 | players[name].gift=1 | |
| 248 | saveData(name) | |
| 249 | tfm.exec.removeImage(players[name].letter[3]) | |
| 250 | system.newTimer(function(timeId,arg1) if arg1[1] then tfm.exec.removeImage(arg1[1]) end end,6000,false,players[name].letter) | |
| 251 | if players[name].toys>=200 and not players[name].power[1] then | |
| 252 | players[name].power[2]=tfm.exec.addImage(images.gift.img,"?10",291+images.gift.x,342+images.gift.y,name) | |
| 253 | end | |
| 254 | end | |
| 255 | if pythag(291,342,x,y,20) and players[name].toys>=200 and players[name].gift==1 and not players[name].power[1] then | |
| 256 | players[name].power[1]=0 | |
| 257 | tfm.exec.addImage(images.bell.img,"$"..name,images.bell.x,images.bell.y,name) | |
| 258 | saveData(name) | |
| 259 | for i=1,#images.rocket do | |
| 260 | table.insert(players[name].rocket,tfm.exec.addImage(images.rocket[i].img,"&2",images.rocket[i].x,images.rocket[i].y,name)) | |
| 261 | end | |
| 262 | ui.addTextArea(50,"<a href='event:rocket'><b><font size='6'> </font><font size='15' color='#ffffff'> X</font></b></a>", name, 609,47,30,31,0x00000a,0x00000a,0.95,true) | |
| 263 | tfm.exec.removeImage(players[name].power[2]) | |
| 264 | end | |
| 265 | end | |
| 266 | end | |
| 267 | ||
| 268 | function eventTextAreaCallback(id,name,callback) | |
| 269 | if callback=="jingle" then | |
| 270 | players[name].toys=players[name].toys+players[name].bag | |
| 271 | if players[name].toys>999 then players[name].toys=999 end | |
| 272 | if players[name].toys>=100 and players[name].toys-players[name].bag<100 then | |
| 273 | system.giveEventGift(name,"titre_elfette") | |
| 274 | elseif players[name].toys>=50 and players[name].toys-players[name].bag<50 then | |
| 275 | system.giveEventGift(name,"nezrouge_noel2013") | |
| 276 | elseif players[name].toys>=150 and players[name].toys-players[name].bag<150 then | |
| 277 | system.giveEventGift(name,"echarpe_noel2013") | |
| 278 | elseif players[name].toys>=200 and players[name].toys-players[name].bag<200 and players[name].gift==1 then | |
| 279 | players[name].power[2]=tfm.exec.addImage(images.gift.img,"?10",291+images.gift.x,342+images.gift.y,name) | |
| 280 | end | |
| 281 | if #players[name].toysList == #players[name].toysTaken then | |
| 282 | tfm.exec.giveCheese(name) | |
| 283 | tfm.exec.playerVictory(name) | |
| 284 | end | |
| 285 | players[name].bag=0 | |
| 286 | saveData(name) | |
| 287 | ui.updateScores(name) | |
| 288 | elseif callback=="help" then | |
| 289 | for k,v in pairs(players[name].help) do | |
| 290 | tfm.exec.removeImage(v) | |
| 291 | end | |
| 292 | players[name].help={}
| |
| 293 | ui.removeTextArea(id,name) | |
| 294 | elseif callback=="rocket" then | |
| 295 | for k,v in pairs(players[name].rocket) do | |
| 296 | tfm.exec.removeImage(v) | |
| 297 | end | |
| 298 | players[name].rocket={}
| |
| 299 | ui.removeTextArea(id,name) | |
| 300 | end | |
| 301 | end | |
| 302 | ||
| 303 | function eventPlayerDataLoaded(name,data) | |
| 304 | players[name].gift=tonumber(string.sub(data,1,1)) or 0 | |
| 305 | players[name].toys=tonumber(string.sub(data,2,4)) or 0 | |
| 306 | players[name].power[1]=tonumber(string.sub(data,5,5)) or nil | |
| 307 | ui.updateScores(name) | |
| 308 | if players[name].power[1] then tfm.exec.addImage(images.bell.img,"$"..name,images.bell.x,images.bell.y,name) end | |
| 309 | if players[name].toys==0 then ui.help(name) | |
| 310 | elseif players[name].toys>=115 then | |
| 311 | system.bindMouse(name,true) | |
| 312 | players[name].letter[3]=tfm.exec.addImage(images.boxletter.img,"?1",images.boxletter.x,images.boxletter.y,name) | |
| 313 | end | |
| 314 | if players[name].toys>=200 and players[name].gift==1 and not players[name].power[1] then players[name].power[2]=tfm.exec.addImage(images.gift.img,"?10",291+images.gift.x,342+images.gift.y,name) end | |
| 315 | end | |
| 316 | ||
| 317 | function eventPlayerDied(name) | |
| 318 | if not tfm.get.room.isAlive() then system.exit() end | |
| 319 | end | |
| 320 | ||
| 321 | function eventPlayerWon(name) | |
| 322 | eventPlayerDied(name) | |
| 323 | end | |
| 324 | ||
| 325 | function eventLoop(time,remain) | |
| 326 | if remain<500 then | |
| 327 | system.exit() | |
| 328 | end | |
| 329 | for id,box in ipairs(boxTimers) do | |
| 330 | local object = tfm.get.room.objectList[box[1]] or nil | |
| 331 | if object then | |
| 332 | local difftime=os.difftime(os.time(),box[2]) | |
| 333 | if difftime>=box[3] then | |
| 334 | tfm.exec.explosion(object.x,object.y,settings.explosionPower,settings.radius, true) | |
| 335 | for name,player in pairs(tfm.get.room.playerList) do | |
| 336 | if pythag(player.x,player.y,object.x,object.y,settings.radius/2) and os.difftime(os.time(),players[name].timestamp)>=settings.timestamp then | |
| 337 | ui.updateHeart(name) | |
| 338 | players[name].timestamp=os.time() | |
| 339 | if #players[name].life == 0 then tfm.exec.killPlayer(name) end | |
| 340 | end | |
| 341 | end | |
| 342 | tfm.exec.removeObject(box[1]) | |
| 343 | tfm.get.room.objectList[box[1]]=object | |
| 344 | table.remove(boxTimers,id) | |
| 345 | elseif difftime>=box[3]-1700 and difftime<box[3]-1000 and not box[8]then | |
| 346 | box[8]=true | |
| 347 | system.newTimer(function(timerId,arg1) arg1=tfm.get.room.objectList[arg1] tfm.exec.removeObject(tfm.exec.addShamanObject(32,arg1.x+random(10,20),arg1.y+random(10,20))) for i=1,3 do tfm.exec.displayParticle(random(0,2),arg1.x+random(-5,5),arg1.y+random(0,15),random(-0.1,0.1),-0.5,0,-0.3) end end,box[3]-difftime+100,false,box[1]) | |
| 348 | fireworks(box[1],box[3]-difftime) | |
| 349 | elseif difftime>=box[3]-2700 and difftime<box[3]-2000 and not box[7]then | |
| 350 | box[7]=true | |
| 351 | system.newTimer(explosionFlash,1000,false,box) | |
| 352 | system.newTimer(explosionFlash,1700,false,box,true) | |
| 353 | system.newTimer(explosionFlash,2000,false,box) | |
| 354 | end | |
| 355 | end | |
| 356 | end | |
| 357 | ||
| 358 | end | |
| 359 | ||
| 360 | function eventEmotePlayed(name,emote) | |
| 361 | if emote==3 then | |
| 362 | local player=tfm.get.room.playerList[name] | |
| 363 | for i=1,#map.mistletoe.x do | |
| 364 | if pythag(player.x,player.y,map.mistletoe.x[i],map.mistletoe.y[i],map.mistletoe.r[i]) then | |
| 365 | for id,arg in ipairs(map.mistletoe.kiss[i]) do | |
| 366 | if os.difftime(os.time(),arg[1])<2000 and name~=arg[2] then | |
| 367 | x=(player.x+(tfm.get.room.playerList[arg[2]].x or player.x))/2 | |
| 368 | for j=1,10 do | |
| 369 | tfm.exec.displayParticle(table.random({30,30,31,31,32,33}),x+(j*5)*pow(-1,j),map.mistletoe.y[i]-40+cos(j)*20,table.random({-0.5,0.5}),0.5, 0,0)
| |
| 370 | end | |
| 371 | table.remove(map.mistletoe.kiss[i],id) | |
| 372 | return nil | |
| 373 | else | |
| 374 | table.remove(map.mistletoe.kiss[i],id) | |
| 375 | end | |
| 376 | end | |
| 377 | table.insert(map.mistletoe.kiss[i],{os.time(),name})
| |
| 378 | end | |
| 379 | end | |
| 380 | end | |
| 381 | end | |
| 382 | ||
| 383 | -- Database | |
| 384 | ||
| 385 | function saveData(name) | |
| 386 | if players[name].toys>999 then players[name].toys=999 end | |
| 387 | local toys=tostring(players[name].toys) | |
| 388 | if #toys==2 then toys="0"..toys | |
| 389 | elseif #toys==1 then toys="00"..toys end | |
| 390 | if players[name].power[1] then | |
| 391 | system.savePlayerData(name,players[name].gift..toys.."0") | |
| 392 | else | |
| 393 | system.savePlayerData(name,players[name].gift..toys) | |
| 394 | end | |
| 395 | end | |
| 396 | ||
| 397 | --Fireworks | |
| 398 | ||
| 399 | function drawCircle(id,arg) | |
| 400 | local point1,point2,particle=arg[1],arg[2],arg[3] | |
| 401 | r=sqrt(pow((point1.x-point2.x),2)+pow((point1.y-point2.y),2)) | |
| 402 | res=1-r*pow(10,-2) | |
| 403 | if(res<0.1)then res =0.04 end | |
| 404 | for i=0,2*math.pi,res do | |
| 405 | tfm.exec.displayParticle(particle,point1.x+r*cos(i),point1.y+r*sin(i),random(-1,1),random(-1,1),0,0) | |
| 406 | end | |
| 407 | end | |
| 408 | ||
| 409 | function drawButterfly(id,arg) | |
| 410 | local x,y,particles=arg[1],arg[2],arg[3] | |
| 411 | for t=0,10,0.09 do | |
| 412 | velocityEffect(x,y,x+(sin(t)*(exp(cos(t))-2*cos(4*t)-5*pow(sin(t/12),5))*-15),y+(cos(t)*(exp(cos(t))-2*cos(4*t)-5*pow(sin(t/12),5))*-15),particles) | |
| 413 | end | |
| 414 | end | |
| 415 | ||
| 416 | function drawParam1(id,arg) | |
| 417 | local x,y,a,b,c,d,particles=arg[1],arg[2],arg[3],arg[4],arg[5],arg[6],arg[7] | |
| 418 | local j,k=3,3 | |
| 419 | for t=0,10,0.1 do | |
| 420 | velocityEffect(x,y,x+(cos(a*t)-pow(cos(b*t),j))*20,y+(sin(c*t)-pow(sin(d*t),k))*20,particles) | |
| 421 | end | |
| 422 | end | |
| 423 | ||
| 424 | function drawParam2(id,arg) | |
| 425 | local x,y,k,a,m,particles=arg[1],arg[2],arg[3],arg[4],arg[5],arg[6] | |
| 426 | local b=a/k | |
| 427 | for t=0,30,0.5 do | |
| 428 | velocityEffect(x,y,x+((a-b)*cos(t)+b*cos(t*((a/b)-1)))*m,y+((a-b)*sin(t)-b*sin(t*((a/b)-1)))*m,particles) | |
| 429 | end | |
| 430 | end | |
| 431 | ||
| 432 | function drawLines(id,arg) | |
| 433 | local x,y=arg[1],arg[2] | |
| 434 | local particles={13,11,9,2,1}
| |
| 435 | for t=-50,50,3 do | |
| 436 | tfm.exec.displayParticle(table.random(particles),x+t,y+t-30,random(-1,1),random(-1,1),0,0) | |
| 437 | tfm.exec.displayParticle(table.random(particles),x+t,y-t+30,random(-1,1),random(-1,1),0,0) | |
| 438 | tfm.exec.displayParticle(table.random(particles),x+t,y-t-30,random(-1,1),random(-1,1),0,0) | |
| 439 | tfm.exec.displayParticle(table.random(particles),x+t,y+t+30,random(-1,1),random(-1,1),0,0) | |
| 440 | end | |
| 441 | end | |
| 442 | ||
| 443 | function drawCircleVelocity(id,arg) | |
| 444 | local x,y,particles=arg[1],arg[2],{13,11,9,2,1}
| |
| 445 | for i=0,360,20 do | |
| 446 | tfm.exec.displayParticle(table.random(particles),x,y,cos(math.pi*i/180)*-2,-sin(math.pi*i/180)*-2,0,0) | |
| 447 | end | |
| 448 | x,y=x+random(-40,40),y+random(-40,40) | |
| 449 | for i=0,360,20 do | |
| 450 | tfm.exec.displayParticle(table.random(particles),x,y,cos(math.pi*i/180)*-3,-sin(math.pi*i/180)*-3,0,0) | |
| 451 | end | |
| 452 | end | |
| 453 | ||
| 454 | function drawHeart(id,arg) | |
| 455 | local x,y,particles=arg[1],arg[2],{13,11,9,2,1,30,31}
| |
| 456 | for t=-60,60,3 do | |
| 457 | if t<0 then | |
| 458 | l=-t | |
| 459 | x1=0.01*((-pow(l,2))+40*l+1200)*sin(math.pi*l/180) | |
| 460 | y1=-0.01*((-pow(l,2))+40*l+1200)*cos(math.pi*l/180) | |
| 461 | else | |
| 462 | x1=-0.01*((-pow(t,2))+40*t+1200)*sin(math.pi*t/180) | |
| 463 | y1=-0.01*((-pow(t,2))+40*t+1200)*cos(math.pi*t/180) | |
| 464 | end | |
| 465 | tfm.exec.displayParticle(table.random(particles),x1*5+x,y1*5+y,table.random({-0.5,0.5}),table.random({-0.5,0.5}),0,0)
| |
| 466 | end | |
| 467 | end | |
| 468 | ||
| 469 | function drawCurve(id,arg) | |
| 470 | local x,y,particles=arg[1],arg[2],arg[3] | |
| 471 | for j=1,random(2,3) do | |
| 472 | for i=0,100,2 do | |
| 473 | tfm.exec.displayParticle(table.random(particles),x+cos(i)*10,y-i,table.random({-0.5,0.5}),random(-1,1),0,0)
| |
| 474 | end | |
| 475 | end | |
| 476 | end | |
| 477 | ||
| 478 | function drawBasic(id,arg) | |
| 479 | tfm.exec.displayParticle(10,arg[1],arg[2],0,0,0,0) | |
| 480 | tfm.exec.displayParticle(12,arg[1]+random(-20,20),arg[2]+random(-20,20),0,0,0,0) | |
| 481 | end | |
| 482 | ||
| 483 | function drawCirclePlus(id,arg) | |
| 484 | local last,particles=0,arg[3] | |
| 485 | for j=1,random(2,3)do | |
| 486 | rand=random(-40,40) | |
| 487 | for i=1,random(2,3) do | |
| 488 | repeat | |
| 489 | particleId=table.random(particles) | |
| 490 | until particleId~=last | |
| 491 | last=particleId | |
| 492 | drawCircle(id,{{x=arg[1]+rand,y=arg[2]},{x=arg[1]+rand+(i+1)*10,y=arg[2]},last})
| |
| 493 | end | |
| 494 | arg[1]=arg[1]+random(-40,40) | |
| 495 | end | |
| 496 | end | |
| 497 | ||
| 498 | function velocityEffect(xS,yS,xE,yE,particles) | |
| 499 | local angle = atan2(yE - yS, xE - xS) | |
| 500 | tfm.exec.displayParticle(table.random(particles),xE,yE,cos(angle),sin(angle),0,0) | |
| 501 | end | |
| 502 | ||
| 503 | fireworksTable={drawBasic,drawHeart,drawLines,drawParam1,drawParam1,drawParam1,drawCurve,drawCirclePlus,drawCircleVelocity,drawParam1,drawParam1,drawParam1,drawParam1,drawParam1,drawParam1}
| |
| 504 | glitter={13,11,9,2,1}
| |
| 505 | fireworksArgs={{0,-130},{0,-130},{0,-130},{0,-130,7,1,7,1,glitter},{0,-130,1,5,1,5,glitter},{0,-130,1,3,3,1,glitter},{0,-130,glitter},{0,-130,glitter},{0,-130},{0,-130,4,1,4,1,glitter},
| |
| 506 | {0,-130,2,1,2,1,glitter},{0,-130,1,2,1,2,glitter},{0,-130,1,4,1,4,glitter},{0,-130,4,1,4,1,glitter},{0,-130,1,3,3,1,glitter}}
| |
| 507 | ||
| 508 | function fireworks(boxId,time) | |
| 509 | for i=0,math.random(0,1) do | |
| 510 | local choice,args=random(1,#fireworksTable),{}
| |
| 511 | for k,v in pairs(fireworksArgs[choice])do table.insert(args,v) end | |
| 512 | args[1],args[2]=tfm.get.room.objectList[boxId].x+math.random(-40*i,40*i)+fireworksArgs[choice][1],tfm.get.room.objectList[boxId].y+math.random(-40*i,-20*i)+fireworksArgs[choice][2] | |
| 513 | system.newTimer(fireworksTable[choice],time+400+i*200,false,args) | |
| 514 | end | |
| 515 | end | |
| 516 | ||
| 517 | -- Main | |
| 518 | ||
| 519 | function newRound() | |
| 520 | tfm.exec.newGame(map.code) | |
| 521 | tfm.exec.addImage(map.background.img,"?1",map.background.x,map.background.y) | |
| 522 | tfm.exec.setUIMapName("[Fierying & Thewav] "..text.name)
| |
| 523 | tfm.exec.setGameTime(180) | |
| 524 | for name,player in pairs(tfm.get.room.playerList) do | |
| 525 | tfm.exec.bindKeyboard(name,83,true,true) | |
| 526 | tfm.exec.bindKeyboard(name,40,true,true) | |
| 527 | tfm.exec.bindKeyboard(name,32,true,true) | |
| 528 | players[name]={life={},toys=0,toysList={},toysTaken={},scoreImg={-2,-2,-2},timestamp=0,spam=0,bag=0,help={},rocket={},letter={nil,false,nil},power={nil,-800},gift=false}
| |
| 529 | system.loadPlayerData(name) | |
| 530 | ui.updateScores(name) | |
| 531 | for i=0,settings.life-1 do | |
| 532 | table.insert(players[name].life,tfm.exec.addImage(images.heart.img,"&4",images.heart.x+i*21,images.heart.y,name)) | |
| 533 | end | |
| 534 | end | |
| 535 | for id=1,#map.posJingle.x do | |
| 536 | local info={map.posJingle.img[id],map.posJingle.x[id],map.posJingle.y[id]}
| |
| 537 | tfm.exec.addImage(images.jingle.img[info[1]],"?2",info[2]+images.jingle.x[info[1]],info[3]+images.jingle.y[info[1]]) | |
| 538 | tfm.exec.addImage(text.elf,"?2",info[2]+images.elves.x,info[3]+images.elves.y) | |
| 539 | end | |
| 540 | for i=1,settings.toysNum do | |
| 541 | local j=0 | |
| 542 | repeat | |
| 543 | id=random(1,#map.toysPos.x) | |
| 544 | toysTemp={y=map.toysPos.y[id],x=random(map.toysPos.x[id],map.toysPos.x[id]+map.toysPos.l[id])}
| |
| 545 | j=j+1 | |
| 546 | until not nearObject(toysTemp.x,toysTemp.y,60,toys) or j>100 | |
| 547 | if j<=100 then | |
| 548 | table.insert(toys,toysTemp) | |
| 549 | local idTemp = random(1,#images.toys.img) | |
| 550 | for name,player in pairs(tfm.get.room.playerList) do | |
| 551 | local idImg=tfm.exec.addImage(images.toys.img[idTemp],"!2",toysTemp.x+images.toys.x[idTemp],toysTemp.y+images.toys.y[idTemp],name) | |
| 552 | table.insert(players[name].toysList,idImg) | |
| 553 | end | |
| 554 | ||
| 555 | end | |
| 556 | end | |
| 557 | for i=1,settings.barrels do | |
| 558 | local j=0 | |
| 559 | repeat | |
| 560 | id=random(1,#map.barrels.x) | |
| 561 | barrelTemp={y=map.barrels.y[id],x=random(map.barrels.x[id],map.barrels.x[id]+map.barrels.l[id]),w=map.barrels.w[id]}
| |
| 562 | j=j+1 | |
| 563 | until not nearObject(barrelTemp.x,barrelTemp.y,40,barrels) or j>100 | |
| 564 | if j<=100 then | |
| 565 | table.insert(barrels,barrelTemp) | |
| 566 | spawnBoxes(boxPattern[random(barrelTemp.w,#boxPattern)],barrelTemp.x,barrelTemp.y) | |
| 567 | end | |
| 568 | end | |
| 569 | end | |
| 570 | ||
| 571 | system.newTimer( | |
| 572 | function() | |
| 573 | for id,barrel in pairs(barrels) do | |
| 574 | spawnBoxes(boxPattern[random(barrel.w,#boxPattern)],barrel.x,barrel.y) | |
| 575 | end | |
| 576 | end,90500) | |
| 577 | ||
| 578 | system.newTimer(newRound,1000) |