View difference between Paste ID: UQ1F8sZD and hprtHKhU
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>&#29609;&#20855;&#24037;&#21378;",give="<J>&#21734;&#65281;&#20320;&#24102;&#26469;&#20102; %s &#20010;&#29609;&#20855;&#65281;&#35874;&#35874;&#65281;",empty="<J>&#20320;&#30340;&#21253;&#27809;&#26377;&#29609;&#20855; :(",full="<J>&#20320;&#30340;&#21253;&#24050;&#32463;&#28385;&#20102; ^_^",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)