Advertisement
Guest User

Untitled

a guest
Jan 17th, 2019
121
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. --Creator: Bolodefchoco
  2. --Made in: 06/02/2017
  3. --Last update: 14/07/2017
  4.  
  5. --[[ Module ]]--
  6. local module = {
  7. _VERSION = "3.6",
  8. _NAME = "grounds",
  9. _STATUS = "semi-official",
  10. _AUTHOR = "Bolodefchoco",
  11. _LICENSE = [[
  12. MIT LICENSE
  13.  
  14. Copyright (c) 2017 @Transformice + @Bolodefchoco
  15.  
  16. Permission is hereby granted, free of charge, to any person obtaining
  17. a copy of this software and associated documentation files (the
  18. "Software"), to deal in the Software without restriction, including
  19. without limitation the rights to use, copy, modify, merge, and to
  20. permit persons to whom the Software is furnished to do so, subject to
  21. the following conditions:
  22.  
  23. The above copyright notice and this permission notice shall be included
  24. in all copies or substantial portions of the Software.
  25.  
  26. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
  27. OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF FITNESS FOR
  28. A PARTICULAR PURPOSE AND NONINFRINGEMENT.
  29. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
  30. CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
  31. TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
  32. SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  33. ]],
  34. _FREEACCESS = { -- Verified players
  35. -- 3 : Commands + Room admin + Debug
  36. Bolodefchoco = 3,
  37. -- 2 : Commands
  38. Bodykudo = 2,
  39. Error_404 = 2,
  40. Jordynl = 2,
  41. Laagaadoo = 2,
  42. Sebafrancuz = 2,
  43. Tocutoeltuco = 2,
  44. -- 1 : Some commands
  45. Artinoe = 1,
  46. Bapereira = 1,
  47. Barberserk = 1,
  48. Byontr = 1,
  49. Claumiau = 1,
  50. Drescen = 1,
  51. Ekull = 1,
  52. Elvismouse = 1,
  53. Grastfetry = 1,
  54. Mcqv = 1,
  55. Mescouleur = 1,
  56. Mquk = 1,
  57. Reshman = 1,
  58. Rikkeshang = 1,
  59. Ruamorangos = 1,
  60. Sammynya = 1,
  61. },
  62. }
  63.  
  64. --[[ Optimization ]]--
  65. --[[ String ]]--
  66. local stringlen,stringfind,stringgmatch,stringbyte,stringdump,stringreverse,stringupper,stringformat,stringrep,stringlower,stringsub,stringgsub,stringmatch,stringchar = string.len,string.find,string.gmatch,string.byte,string.dump,string.reverse,string.upper,string.format,string.rep,string.lower,string.sub,string.gsub,string.match,string.char
  67. --[[ Math ]]--
  68. local mathdeg,mathfmod,mathrandom,mathasin,mathmax,mathmodf,mathfloor,mathcosh,mathldexp,mathatan2,mathpow,mathrandomseed,mathfrexp,mathabs,mathtanh,mathacos,mathlog,mathtan,mathmin,mathceil,mathsinh,mathsqrt,mathhuge,mathrad,mathsin,mathexp,mathcos,mathatan,mathpi = math.deg,math.fmod,math.random,math.asin,math.max,math.modf,math.floor,math.cosh,math.ldexp,math.atan2,math.pow,math.randomseed,math.frexp,math.abs,math.tanh,math.acos,math.log,math.tan,math.min,math.ceil,math.sinh,math.sqrt,math.huge,math.rad,math.sin,math.exp,math.cos,math.atan,math.pi
  69. --[[ Table ]]--
  70. local tablepack,tableforeachi,tableforeach,tableremove,tableinsert,tableunpack,tableconcat,tablesort = table.pack,table.foreachi,table.foreach,table.remove,table.insert,table.unpack,table.concat,table.sort
  71.  
  72. --[[ API ]]--
  73. -- Timers
  74. system.newGameTimer = 0
  75.  
  76. -- Control
  77. system.officialMode = {"",""}
  78. system.setAdmins = function()
  79. local out = {}
  80. for k,v in next,module._FREEACCESS do
  81. if v > 2 then
  82. out[k] = true
  83. end
  84. end
  85. return out
  86. end
  87.  
  88. -- Improvements
  89. tableconcat = function(list,sep,f,i,j)
  90. local txt = ""
  91. sep = sep or ""
  92. i,j = i or 1,j or #list
  93. for k,v in next,list do
  94. if type(k) ~= "number" and true or (k >= i and k <= j) then
  95. txt = txt .. (f and f(k,v) or v) .. sep
  96. end
  97. end
  98. return stringsub(txt,1,-1-#sep)
  99. end
  100. do
  101. local newGame = tfm.exec.newGame
  102. tfm.exec.newGame = function(code)
  103. if os.time() > system.newGameTimer then
  104. system.newGameTimer = os.time() + 6000
  105. newGame(code)
  106. return true
  107. end
  108. return false
  109. end
  110.  
  111. local addImage = tfm.exec.addImage
  112. local removeImage = tfm.exec.removeImage
  113. tfm.exec.addImage = function(...)
  114. local id = addImage(...)
  115. if id then
  116. system.objects.image[id] = true
  117. end
  118. return id
  119. end
  120. tfm.exec.removeImage = function(id)
  121. removeImage(id)
  122. if system.objects.image[id] then
  123. system.objects.image[id] = nil
  124. end
  125. end
  126.  
  127. local addTextArea = ui.addTextArea
  128. ui.addTextArea = function(id,...)
  129. addTextArea(id,...)
  130. if not system.objects.textarea[id] then
  131. system.objects.textarea[id] = true
  132. end
  133. end
  134.  
  135. local chatMessage = tfm.exec.chatMessage
  136. tfm.exec.chatMessage = function(txt,n)
  137. if #txt > 1000 then
  138. local total = 0
  139. while #txt > total do
  140. chatMessage(stringsub(txt,total,total + 1000),n)
  141. total = total + 1001
  142. end
  143. else
  144. chatMessage(txt,n)
  145. end
  146. end
  147.  
  148. local loadPlayerData = system.loadPlayerData
  149. system.loadPlayerData = function(n)
  150. if module._STATUS == "official" then
  151. return loadPlayerData(n)
  152. else
  153. if _G["eventPlayerDataLoaded"] then
  154. eventPlayerDataLoaded(n,"")
  155. end
  156. return true
  157. end
  158. end
  159.  
  160. local savePlayerData = system.savePlayerData
  161. system.savePlayerData = function(n,data)
  162. if module._STATUS == "official" then
  163. savePlayerData(n,data)
  164. return true
  165. else
  166. return false
  167. end
  168. end
  169. end
  170.  
  171. -- Room
  172. system.isRoom = stringbyte(tfm.get.room.name,2) ~= 3
  173. system.roomAdmins = system.setAdmins()
  174. system.miscAttrib = 0
  175. system.roomNumber,system.roomAttributes = (function()
  176. if system.isRoom then
  177. local number,attribute = stringmatch(tfm.get.room.name,"%*?#"..module._NAME.."(%d+)(.*)")
  178. return tonumber(number) or "",attribute or ""
  179. else
  180. return "",""
  181. end
  182. end)()
  183.  
  184. -- Player
  185. system.isPlayer = function(n)
  186. --[[
  187. The player must not be a souris;
  188. The player must have played Transformice for at least 5 days
  189. ]]
  190. return tfm.get.room.playerList[n] and stringsub(n,1,1) ~= "*" and tfm.get.room.playerList[n].registrationDate and (os.time() - (tfm.get.room.playerList[n].registrationDate or 0) >= 432e6) or false
  191. end
  192. system.players = function(alivePlayers)
  193. local alive,total = 0,0
  194. if alivePlayers then
  195. alive = {}
  196. end
  197. for k,v in next,tfm.get.room.playerList do
  198. if system.isPlayer(k) then
  199. if not v.isDead and not v.isVampire then
  200. if alivePlayers then
  201. alive[#alive + 1] = k
  202. else
  203. alive = alive + 1
  204. end
  205. end
  206. total = total + 1
  207. end
  208. end
  209. if alivePlayers then
  210. return alive
  211. else
  212. return alive,total
  213. end
  214. end
  215.  
  216. -- System
  217. currentTime,leftTime = 0,0
  218. system.loadTable = function(s)
  219. -- "a.b.c.1" returns a[b][c][1]
  220. local list
  221. for tbl in stringgmatch(s,"[^%.]+") do
  222. tbl = tonumber(tbl) and tonumber(tbl) or tbl
  223. list = (list and list[tbl] or _G[tbl])
  224. end
  225. return list
  226. end
  227. system.getTranslation = function(index,n)
  228. local t = stringformat("mode.%s.translations.%s.%s",system.gameMode,(n and mode[system.gameMode].info[n].langue or mode[system.gameMode].langue),index)
  229. return system.loadTable(t) or system.loadTable(stringgsub(t,"translations%..-%.",function() return "translations.en." end))
  230. end
  231. system.looping = function(f,tick)
  232. local s = 1000 / tick
  233. local t = {}
  234. for timer = 0,1000 - s,s do
  235. system.newTimer(function()
  236. t[#t+1] = system.newTimer(f,1000,true)
  237. end,1000 + timer,false)
  238. end
  239. return t
  240. end
  241.  
  242. -- Math
  243. mathisNegative = function(x,iN,iP)
  244. return (x<0 and (iN or x) or (iP or x))
  245. end
  246. mathpercent = function(x,y,v)
  247. v = (v or 100)
  248. local m = x/y * v
  249. return mathmin(m,v)
  250. end
  251. mathpythag = function(x1,y1,x2,y2,range)
  252. return (x1-x2)^2 + (y1-y2)^2 <= (range^2)
  253. end
  254. mathsetLim = function(value,min,max)
  255. return mathmax(min,mathmin(max,value))
  256. end
  257.  
  258. -- String
  259. stringsplit = function(value,pattern,f)
  260. local out = {}
  261. for v in stringgmatch(value,pattern) do
  262. out[#out + 1] = (f and f(v) or v)
  263. end
  264. return out
  265. end
  266. stringnick = function(player)
  267. return stringgsub(stringlower(player),"%a",stringupper,1)
  268. end
  269.  
  270. -- Table
  271. tablefind = function(list,value,index,f)
  272. for k,v in next,list do
  273. local i = (type(v) == "table" and index and v[index] or v)
  274. if (f and f(i) or i) == value then
  275. return true,k
  276. end
  277. end
  278. return false,0
  279. end
  280. tableturnTable = function(x)
  281. return (type(x)=="table" and x or {x})
  282. end
  283. tablerandom = function(t)
  284. return (type(t) == "table" and t[mathrandom(#t)] or mathrandom())
  285. end
  286. tableshuffle = function(t)
  287. local randomized = {}
  288. for v = 1,#t do
  289. end
  290. return randomized
  291. end
  292.  
  293. -- Others
  294. deactivateAccents=function(str)
  295. local letters = {a = {"á","â","à","å","ã","ä"},e = {"é","ê","è","ë"},i = {"í","î","ì","ï"},o = {"ó","ô","ò","õ","ö"},u = {"ú","û","ù","ü"}}
  296. for k,v in next,letters do
  297. for i = 1,#v do
  298. str = stringgsub(str,v[i],tostring(k))
  299. end
  300. end
  301. return str
  302. end
  303. normalizeTime = function(time)
  304. return mathfloor(time) + ((time - mathfloor(time)) >= .5 and .5 or 0)
  305. end
  306. disableChatCommand = function(command)
  307. system.disableChatCommandDisplay(command,true)
  308. system.disableChatCommandDisplay(stringlower(command),true)
  309. system.disableChatCommandDisplay(stringupper(command),true)
  310. end
  311. normalizeTranslation = function()
  312. local t = mode[system.gameMode].translations
  313.  
  314. for k,v in next,t.en do
  315. for i,j in next,t do
  316. if i ~= "en" then
  317. if not j[k] then
  318. j[k] = v
  319. end
  320. end
  321. end
  322. end
  323. end
  324.  
  325. -- XML Dealer
  326. xml = {}
  327. xml.parse = function(currentXml)
  328. currentXml = stringmatch(currentXml,"<P (.-)/>") or ""
  329. local out = {}
  330. for tag,_,value in stringgmatch(currentXml,"([%-%w]+)=([\"'])(.-)%2") do
  331. out[tag] = value
  332. end
  333. return out
  334. end
  335. xml.attribFunc = function(currentXml,funcs)
  336. local attributes = xml.parse(currentXml)
  337. for k,v in next,funcs do
  338. if attributes[v.attribute] then
  339. v.func(attributes[v.attribute])
  340. end
  341. end
  342. end
  343. xml.addAttrib = function(currentXml,out,launch)
  344. local parameters = stringmatch(currentXml,"<P (.-)/>") or ""
  345. for k,v in next,out do
  346. if not stringfind(parameters,v.tag) then
  347. currentXml = stringgsub(currentXml,"<P (.-)/>",function(attribs)
  348. return stringformat("<P %s=\"%s\" %s/>",v.tag,v.value,attribs)
  349. end)
  350. end
  351. end
  352. if launch then
  353. tfm.exec.newGame(currentXml)
  354. else
  355. return currentXml
  356. end
  357. end
  358. xml.getCoordinates = function(s)
  359. if stringfind(s,";") then
  360. local x,y
  361. local axis,value = stringmatch(s,"(%a);(%d+)")
  362. value = tonumber(value)
  363. if value then
  364. if axis == "x" then x = value else y = value end
  365. end
  366. return x or 0,y or 0
  367. else
  368. local pos = {}
  369. for x,y in stringgmatch(s,"(%d+) ?, ?(%d+)") do
  370. pos[#pos+1] = {x = x,y = y}
  371. end
  372. return pos
  373. end
  374. end
  375.  
  376. --[[ Game Mode System ]]--
  377. system.normalizedModeName = function(name,back)
  378. if back then
  379. name = stringgsub(name,"%+","P") -- Test+ = TestP
  380. else
  381. name = stringgsub(name,"P$","+") -- TestP = Test+
  382. end
  383. return name
  384. end
  385.  
  386. system.submodes = {}
  387.  
  388. system.gameMode = module._NAME
  389. system.modeChanged = os.time() + 10e3
  390.  
  391. system.getGameMode = function(value,notFirst)
  392. local found,submode = tablefind(system.submodes,stringlower(value),nil,stringlower)
  393. if found then
  394. system.gameMode = system.normalizedModeName(system.submodes[submode],true)
  395.  
  396. if notFirst then
  397. eventModeChanged()
  398. end
  399.  
  400. system.modeChanged = os.time() + 10e3
  401. end
  402. return found
  403. end
  404.  
  405. --[[ Modes ]]--
  406. mode = setmetatable({},{
  407. __newindex = function(list,key,value)
  408. rawset(list,key,value)
  409. system.submodes[#system.submodes+1] = system.normalizedModeName(key,false)
  410. end
  411. })
  412.  
  413. --[[ Grounds ]]--
  414. mode.grounds = {
  415. -- Translations
  416. translations = {
  417. en = {
  418. -- Data
  419. grounds = {
  420. -- Ground, Description
  421. [0] = {"Wood","?","?"},
  422. [1] = {"Ice","Increases your speed by pressing spacebar","Increases the speed in <BL>%s%%</BL>"},
  423. [2] = {"Trampoline","?","?"},
  424. [3] = {"Lava","Teleports you to the last Z indexed ground","?"},
  425. [4] = {"Chocolate","?","?"},
  426. [5] = {"Earth","?","?"},
  427. [6] = {"Grass","?","?"},
  428. [7] = {"Sand","Creates a sand storm","Decreases the storm in <BL>%s%%</BL>"},
  429. [8] = {"Cloud","Enables you to fly by pressing spacebar","Increases the fly in <BL>%s%%</BL>"},
  430. [9] = {"Water","Drowns you","Drowns you <BL>%s%%</BL> slower"},
  431. [10] = {"Stone","Creates a block of stone by pressing spacebar","Increases the block size in <BL>%s%%</BL>"},
  432. [11] = {"Snow","Shoots snowballs by pressing spacebar","Increases the snowball speed in <BL>%s%%</BL>"},
  433. [12] = {"Rectangle","Each color has its own function","?",{
  434. ["C90909"] = "Kills you",
  435. ["18C92B"] = "Revives all the enemies",
  436. ["555D77"] = "Respawning Checkpoint",
  437. }},
  438. [13] = {"Circle","Each color has its own function","?"},
  439. [14] = {"Invisible","?","?"},
  440. [15] = {"Spiderweb","Teleports you to the spawn point","?"},
  441. },
  442. categories = {
  443. [1] = "Often long maps that, in most of the cases, the players must pass the same obstacles more than once.",
  444. [2] = "Usually long maps with dodgeable spiderwebs or lavas, sometimes using invisible waters to simule a fly.",
  445. [3] = "Harder maps that requires multiple skills to be completed.",
  446. [4] = "Maps that has as main obstacle the water drowning.",
  447. [5] = "Maps based mainly on lava teleports.",
  448. [6] = "Maps that requires a new skill, with mechanisms or something that makes you think before act.",
  449. [7] = "Maps based on speed and agility, built mostly with ice grounds.",
  450. [8] = "Maps based on snowball mechanisms/technics.",
  451. [9] = "Maps with different gameplays that doesn't fit any other category, also locates the <i>vanilla maps</i>.",
  452. [10] = "Soloable (mostly) maps, but with faster paths when the players work together.",
  453. [11] = "Maps with vampires.",
  454. [12] = "Houses without gameplay, only a place for noobs.",
  455. },
  456.  
  457. -- Init
  458. welcome = "Welcome to #%s! Can you be the fastest mouse using the ground effects? Try it!\n<PS>Press H for more info!",
  459. developer = "Developed by %s",
  460.  
  461. -- Shop
  462. shop = {
  463. coin = "Coins",
  464. power = "Ground power",
  465. upgrade = "Upgrade",
  466. price = "Upgrade price",
  467. close = "Close",
  468. },
  469. bought = "You just spent %s coins for the ground %s!",
  470. cantbuy = "You haven't coins enough in order to buy this upgrade! :(",
  471.  
  472. -- Profile
  473. profile = "Leaderboard : %s\n\n<N>Rounds : %s\n<N>Podiums : %s\n\n<N>Deaths : %s\n\n<N>Shop Coins : %s",
  474.  
  475. -- Gameplay
  476. gotcoin = "You just got %s coins! :D",
  477. zombie = "Now you are a zombie!",
  478. countstats = {
  479. mice = "At least 5 mice are needed to stats count",
  480. tribe = "Stats do not count in tribe houses"
  481. },
  482.  
  483. -- New map
  484. powersenabled = "The ground powers were enabled! Good luck!",
  485. tribehouse = "This is a House place. No stats, no gameplay. Enjoy with your friends",
  486.  
  487. -- Language
  488. language = "Current language : <J>%s",
  489.  
  490. -- Settings
  491. password = {
  492. on = "New password : %s",
  493. off = "Password disabled!"
  494. },
  495.  
  496. -- Commands
  497. commands = {
  498. shop = "shop",
  499. profile = "profile",
  500. help = "help",
  501. langue = "langue",
  502. leaderboard = "leaderboard",
  503. info = "info",
  504. pw = "password",
  505. mapinfo = "mapinfo",
  506. },
  507.  
  508. -- Menu
  509. menu = {
  510. [1] = {"%s","\tYour aim in this minigame is to collect the cheese the faster you can, using the effects each ground offers."},
  511. [2] = {"Ground effects","Click in the ground's name to read more.\n\n%s"},
  512. [3] = {"Commands",{
  513. [1] = {"\t<J>» User</J>\n",{
  514. [1] = "<VP>!%s</VP> <PS>playerName</PS> <R>or</R> <VP>Key P</VP> - Opens the profile!",
  515. [2] = "<VP>!%s</VP> <R>or</R> <VP>Key O</VP> - Opens the shop!",
  516. [3] = "<VP>!%s</VP> - Changes the language!",
  517. }},
  518. [2] = {"\n\t<J>» Others</J>\n",{
  519. [1] = "<VP>!%s</VP> <R>or</R> <VP>Key H</VP> - Opens the help menu!",
  520. [2] = "<VP>!%s</VP> - Opens the leaderboard!",
  521. [3] = "<VP>!%s</VP> - Opens the help according to the ground you are on!",
  522. [4] = "<VP>!%s</VP> - Displays the map info if it is in the rotation!",
  523. }},
  524. [3] = {"\n\t<J>» Room admin</J>\n",{
  525. [1] = "<VP>!%s</VP> <PS>password</PS> - Adds or removes a password in the room!",
  526. }},
  527. }},
  528. [4] = {"Maps","<J>Maps : %s\n\n\tAccess %s and send your map. Do not forget to read all the rules before!"},
  529. [5] = {"Thanks for","<R>%s <G>- <N>Developer\n%s <G>- <N>Translators\n%s <G>- <N>Map evaluators"},
  530. },
  531. max = "15a2df47d2e",
  532. },
  533. br = {
  534. grounds = {
  535. [0] = {"Madeira","?","?"},
  536. [1] = {"Gelo","Aumenta sua velocidade ao pressionar a barra de espaço","Aumenta a velocidade em <BL>%s%%</BL>"},
  537. [2] = {"Trampolim","?","?"},
  538. [3] = {"Lava","Teletransporta-o para o piso de Z anterior","?"},
  539. [4] = {"Chocolate","?","?"},
  540. [5] = {"Terra","?","?"},
  541. [6] = {"Grama","?","?"},
  542. [7] = {"Areia","Cria uma tempestade de areia","Diminui a tempestade em <BL>%s%%</BL>"},
  543. [8] = {"Nuvem","Permite o voo ao pressionar a barra de espaço","Aumenta o voo em <BL>%s%%</BL>"},
  544. [9] = {"Água","Afoga-o","Afoga-o <BL>%s%%</BL> mais devagar"},
  545. [10] = {"Pedra","Cria um bloco de pedra ao pressionar a barra de espaço","Aumenta o tamanho do bloco em <BL>%s%%</BL>"},
  546. [11] = {"Neve","Atira bolas de neve ao pressionar a barra de espaço","Aumenta a velocidade da bola de neve em <BL>%s%%</BL>"},
  547. [12] = {"Retângulo","Cada cor tem sua própria função","?",{
  548. ["C90909"] = "Mata-o",
  549. ["18C92B"] = "Revive todos os inimigos",
  550. ["555D77"] = "Checkpoint para reviver",
  551. }},
  552. [13] = {"Círculo","Cada cor tem sua própria função","?","?"},
  553. [14] = {"Invisível","?","?"},
  554. [15] = {"Teia de aranha","Teletransporta-o para o ponto de spawn","?"},
  555. },
  556. categories = {
  557. [1] = "Geralmente mapas longos que, na maioria dos casos, os jogadores devem passar pelo mesmo obstáculo mais de uma vez.",
  558. [2] = "Geralmente mapas grandes com teias de aranha ou lavas desviáveis, às vezes usando águas invisíveis para simular voo.",
  559. [3] = "Mapas mais difíceis que requem múltiplas habilidades para serem completados.",
  560. [4] = "Mapas que tem como obstáculo principal o afogamento na água.",
  561. [5] = "Mapas baseados principalmente em teleportes de lava.",
  562. [6] = "Mapas que requerem novas habilidades, com mecanismos ou algo que o faça pensar antes de agir.",
  563. [7] = "Mapas baseados em velocidade e agilidade, construídos em sua maioria por pisos de gelo.",
  564. [8] = "Mapas baseados em mecanismos/técnicas com bolas de neve.",
  565. [9] = "Mapas com gameplays diferentes que não se encaixam em nenhuma outra categoria, também dá espaço aos <i>mapas vanilla</i>.",
  566. [10] = "Mapas em que você pode completar sozinho (em maioria), mas com caminhos mais rápidos quando há trabalho em equipe entre os jogadores.",
  567. [11] = "Mapas com vampiros.",
  568. [12] = "Casas sem jogabilidade, apenas um lugar para noobs.",
  569. },
  570.  
  571. welcome = "Bem-vindo ao #%s! Você pode ser o rato mais rápido usando os efeitos dos pisos? Prove!\n<PS>Pressione H para mais informações!",
  572. developer = "Desenvolvido por %s",
  573.  
  574. shop = {
  575. coin = "Moedas",
  576. power = "Poder do piso",
  577. upgrade = "Melhorar",
  578. price = "Preço de aprimoramento",
  579. close = "Fechar",
  580. },
  581. bought = "Você acaba de gastar %s moedas pelo piso %s!",
  582. cantbuy = "Você não tem moedas suficientes para comprar esta atualização! :(",
  583.  
  584. profile = "Rank : %s\n\n<N>Partidas : %s\n<N>Pódios : %s\n\n<N>Mortes : %s\n\n<N>Moedas na loja : %s",
  585.  
  586. gotcoin = "Você acaba de conseguir %s moedas! :D",
  587. zombie = "Agora você é um zumbi!",
  588. countstats = {
  589. mice = "Ao menos 5 ratos são necessários para as estatísticas serem contabilizadas",
  590. tribe = "Estatísticas não são contabilizadas em cafofos de tribo"
  591. },
  592.  
  593. powersenabled = "Os poderes dos pisos foram ativados! Boa sorte!",
  594. tribehouse = "Este lugar é uma casa. Sem estatísticas, sem gameplay. Divirta-se com seus amigos",
  595.  
  596. language = "Idioma atual : <J>%s",
  597.  
  598. password = {
  599. on = "Nova senha : %s",
  600. off = "Senha desativada!"
  601. },
  602.  
  603. commands = {
  604. shop = "loja",
  605. profile = "perfil",
  606. help = "ajuda",
  607. langue = "idioma",
  608. leaderboard = "rank",
  609. info = "info",
  610. pw = "senha",
  611. },
  612.  
  613. menu = {
  614. [1] = {"%s","\tSeu objetivo neste mini-game é coletar o queijo o mais rápido possível, utilizando os efeitos que cada piso oferecer."},
  615. [2] = {"Efeitos dos pisos","Clique no nome do piso para ler mais.\n\n%s"},
  616. [3] = {"Comandos",{
  617. [1] = {"\t<J>» Usuário</J>\n",{
  618. [1] = "<VP>!%s</VP> <PS>nomeDoJogador</PS> <R>ou</R> <VP>Tecla P</VP> - Abre o perfil!",
  619. [2] = "<VP>!%s</VP> <R>ou</R> <VP>Tecla O</VP> - Abre a loja!",
  620. [3] = "<VP>!%s</VP> - Altera o idioma!",
  621. }},
  622. [2] = {"\n\t<J>» Outros</J>\n",{
  623. [1] = "<VP>!%s</VP> <R>ou</R> <VP>Tecla H</VP> - Abre o menu de ajuda!",
  624. [2] = "<VP>!%s</VP> - Abre o ranking!",
  625. [3] = "<VP>!%s</VP> - Abre a ajuda de acordo com o piso que você está pisando!",
  626. [4] = "<VP>!%s</VP> - Mostra as informações do mapa se estiver na rotação!",
  627. }},
  628. [3] = {"\n\t<J>» Administrador da sala</J>\n",{
  629. [1] = "<VP>!%s</VP> <PS>senha</PS> - Adiciona ou remove uma senha na sala!",
  630. }},
  631. }},
  632. [4] = {"Mapas","<J>Mapas : %s\n\n\tAcesse %s e envie seu mapa. Não se esqueça de ler todas as regras antes!"},
  633. [5] = {"Agradecimentos","<R>%s <G>- <N>Desenvolvedor\n%s <G>- <N>Tradutores\n%s <G>- <N>Avaliadores de mapa"},
  634. },
  635. max = "15a2df3e699",
  636. },
  637. es = {
  638. grounds = {
  639. [0] = {"Madera","?","?"},
  640. [1] = {"Hielo","Incrementa tu velocidad apretando espacio","Aumenta la velocidad en <BL>%s%%</BL>"},
  641. [2] = {"Trampolín","?","?"},
  642. [3] = {"Lava","Te teletransporta al suelo que tenga el último Z index","?"},
  643. [4] = {"Chocolate","?","?"},
  644. [5] = {"Tierra","?","?"},
  645. [6] = {"Hierba","?","?"},
  646. [7] = {"Arena","Crea una tormenta de arena","Disminuye la tormenta en <BL>%s%%</BL>"},
  647. [8] = {"Nube","Te permite volar presionando espacio","Aumenta el vuelo en <BL>%s%%</BL>"},
  648. [9] = {"Agua","Te ahogas","Te ahogas <BL>%s%%</BL> más lento"},
  649. [10] = {"Piedra","Crea un bloque de piedra presionando espacio","Aumenta el tamaño del bloque en <BL>%s%%</BL>"},
  650. [11] = {"Nieve","Dispara bolas de nieve presionando espacio","Aumenta la velocidad de la bola de nieve en <BL>%s%%</BL>"},
  651. [12] = {"Rectángulo","Cada color tiene su propia función","?",{
  652. ["C90909"] = "Te mata",
  653. ["18C92B"] = "Revive todos los enemigos",
  654. ["555D77"] = "Respawning Checkpoint", -- *
  655. }},
  656. [13] = {"Círculo","Cada color tiene su propia función","?"},
  657. [14] = {"Invisible","?","?"},
  658. [15] = {"Tela de araña","Te teletransporta al punto de aparición","?"},
  659. },
  660. categories = {
  661. [1] = "Mapas que, en la mayoría de los casos, los jugadores deben pasar obstaculos más de una vez.",
  662. [2] = "Usualmente mapas largos con telas de araña y lavas esquivables, algunas veces usando agua invisible para simular un vuelo.",
  663. [3] = "Mapas difíciles que necesitan una gran habilidad para completarlos.",
  664. [4] = "Mapas que tienen un obstáculo principal: el agua. ¡Te puedes ahogar!.",
  665. [5] = "Mapas basados principalmente en teletransportes de lava.",
  666. [6] = "Mapas que necesitan una nueva habilidad, con mecanismos o algo que te haga pensar antes de actuar.",
  667. [7] = "Mapas basados en la velocidad del jugador, construidos mayoritariamente con suelos de hielo.",
  668. [8] = "Mapas basados en mecanismos/técnicas con nieve.",
  669. [9] = "Mapas con un gameplay diferente que no entran en otra categoría, también localizados en los <i>mapas vanilla</i>.",
  670. [10] = "Mapas que (mayoritariamente) pueden ser completados solo, pero con patrones rápidos donde los jugadores necesitan trabajar juntos.",
  671. [11] = "Mapas con vampiros.",
  672. [12] = "Houses without gameplay, only a place for noobs",
  673. },
  674.  
  675. welcome = "Bienvenido a #%s! Podrás ser el más rápido usando los efectos de los suelos? Inténtalo!\n<PS>Presiona H para más información!",
  676. developer = "Programado por %s",
  677.  
  678. shop = {
  679. coin = "Monedas",
  680. power = "Potencia del suelo",
  681. upgrade = "Mejorar",
  682. price = "Precio de la mejora",
  683. close = "Cerrar",
  684. },
  685. bought = "Has gastado %s monedas para el suelo %s!",
  686. cantbuy = "No tienes las suficientes monedas para comprar esta mejora! :(",
  687.  
  688. profile = "Tabla de líderes : %s\n\n<N>Rondas : %s\n<N>Podios : %s\n\n<N>Muertes : %s\n\n<N>Monedas : %s",
  689.  
  690. gotcoin = "Has obtenido %s monedas! :D",
  691. zombie = "Ahora eres un Zombi!",
  692. countstats = {
  693. mice = "Por lo menos 5 ratones son necesarios para contar estadísticas",
  694. tribe = "Las estadísticas no cuentan en casas de tribu"
  695. },
  696.  
  697. powersenabled = "Los poderes de los suelos han sido activados! Buena suerte!",
  698. -- *
  699.  
  700. language = "Idioma actual : <J>%s",
  701.  
  702. password = {
  703. on = "Nueva contraseña : %s",
  704. off = "Contraseña desactivada!"
  705. },
  706.  
  707. commands = {
  708. shop = "tienda",
  709. profile = "perfil",
  710. help = "ayuda",
  711. langue = "idioma",
  712. leaderboard = "ranking",
  713. info = "info",
  714. pw = "contraseña",
  715. },
  716.  
  717. menu = {
  718. [1] = {"%s","\tTu objetivo en este juego es agarrar el queso lo más rápido que puedas, usando los efectos que cada suelo ofrece."},
  719. [2] = {"Efectos de suelo","Clickea en el nombre del suelo para leer más.\n\n%s"},
  720. [3] = {"Comandos",{
  721. [1] = {"\t<J>» Usuario</J>\n",{
  722. [1] = "<VP>!%s</VP> <PS>nombreDeUsuario</PS> <R>o</R> <VP>Tecla P</VP> - Abre el perfil!",
  723. [2] = "<VP>!%s</VP> <R>o</R> <VP>Tecla O</VP> - Abre la tienda!",
  724. [3] = "<VP>!%s</VP> - Cambia el idioma!\n",
  725. }},
  726. [2] = {"\t<J>» Otros</J>\n",{
  727. [1] = "<VP>!%s</VP> <R>o</R> <VP>Tecla H</VP> - Abre el menu de ayuda!",
  728. [2] = "<VP>!%s</VP> - Abre el ranking!",
  729. [3] = "<VP>!%s</VP> - Abre la guía del suelo en el que estás!",
  730. [4] = "<VP>!%s</VP> - Muestra la información del mapa si está en la rotación!",
  731. }},
  732. [3] = {"\n\t<J>» Admin de la sala</J>\n",{
  733. [1] = "<VP>!%s</VP> <PS>contraseña</PS> - Activa o desactiva la contraseña en la sala.",
  734. }},
  735. }},
  736. [4] = {"Mapas","<J>Mapas : %s\n\n\tEntra a %s y envía tu mapa. No olvides leer las reglas antes!"},
  737. [5] = {"Agradecimientos","<R>%s <G>- <N>Programador\n%s <G>- <N>Traductores\n%s <G>- <N>Evaluadores de mapas"},
  738. },
  739. max = "15a2df3e699",
  740. },
  741. fr = {
  742. grounds = {
  743. [0] = {"Bois","?","?"},
  744. [1] = {"Glace","Augmente votre vitesse en appuyant sur Espace","Augmente la vitesse de <BL>%s%%</BL>"},
  745. [2] = {"Trampoline","?","?"},
  746. [3] = {"Lave","Vous téléporte au sol avec le dernier indice Z","?"},
  747. [4] = {"Chocolat","?","?"},
  748. [5] = {"Terre","?","?"},
  749. [6] = {"Herbe","?","?"},
  750. [7] = {"Sable","Crée une tempête de sable","Diminue la tempête de <BL>%s%%</BL>"},
  751. [8] = {"Nuage","Vous donne la possibilité de voler en appuyant sur Espace","Augmente le vol de <BL>%s%%</BL>"},
  752. [9] = {"Eau","Vous noie","Vous noie <BL>%s%%</BL> plus lentement"},
  753. [10] = {"Pierre","Crée un bloc de pierre en appuyant sur Espace","Augmente la taille du bloc de <BL>%s%%</BL>"},
  754. [11] = {"Neige","Tire des boules de neige en appuyant sur Espace","Augmente la vitesse de la boule de neige de <BL>%s%%</BL>"},
  755. [12] = {"Rectangle","Chaque couleur a sa propre fonction","?",{
  756. ["C90909"] = "Te tue",
  757. ["18C92B"] = "Ressuscite tous les ennemis",
  758. ["555D77"] = "Respawning Checkpoint", -- *
  759. }},
  760. [13] = {"Cercle","Chaque couleur a sa propre fonction","?"},
  761. [14] = {"Invisible","?","?"},
  762. [15] = {"Toile d'araignée","Vous téléporte au point de spawn","?"},
  763. },
  764. -- *
  765.  
  766. welcome = "Bienvenue à #%s! Pouvez vous être la souris la plus rapide grâce aux effets des sols? Essayez!\n<PS>Appuyez sur H pour plus d'informations!",
  767. developer = "Développé par %s",
  768.  
  769. shop = {
  770. coin = "Pièces",
  771. power = "Force du sol",
  772. upgrade = "Améliorer",
  773. price = "Coût d'amélioration",
  774. close = "Fermer",
  775. },
  776. bought = "Vous venez de dépenser %s pièces pour le sol %s!",
  777. cantbuy = "Vous n'avez pas assez de pièces pour acheter cette amélioration! :(",
  778.  
  779. profile = "Leaderboard : %s\n\n<N>Parties : %s\n<N>Podiums : %s\n\n<N>Morts : %s\n\n<N>Shop Pièces : %s",
  780.  
  781. gotcoin = "Vous venez de recevoir %s pièces! :D",
  782. countstats = {
  783. mice = "Au moins 5 souris sont nécessaires pour que les statistiques comptent",
  784. tribe = "Les statistiques ne comptent pas en maison de tribu"
  785. },
  786. zombie = "Vous êtes maintenant un zombie!",
  787.  
  788. powersenabled = "Les pouvoirs des sols ont été activés! Bonne chance!",
  789. -- *
  790.  
  791. language = "Langage actuel : <J>%s",
  792.  
  793. password = {
  794. on = "Nouveau mot de passe : %s",
  795. off = "Mot de passe désactivé!"
  796. },
  797.  
  798. commands = {
  799. shop = "magasin",
  800. profile = "profil",
  801. help = "aide",
  802. langue = "langue",
  803. leaderboard = "leaderboard",
  804. info = "info",
  805. pw = "password",
  806. },
  807.  
  808. menu = {
  809. [1] = {"%s","\tVotre but dans ce minijeu est de collecter le fromage aussi vite que possible, en utilisant les effets des différents sols."},
  810. [2] = {"Effets du sol","Clique sur le nom du salon pour en lire plus.\n\n%s"},
  811. [3] = {"Commandes",{
  812. [1] = {"\t<J>» Joueur</J>\n",{
  813. [1] = "<VP>!%s</VP> <PS>playerName</PS> <R>ou</R> <VP>Touche P</VP> - Ouvre le profil !",
  814. [2] = "<VP>!%s</VP> <R>ou</R> <VP>Touche O</VP> - Ouvre le magasin !",
  815. [3] = "<VP>!%s</VP> - Change la langue !\n",
  816. }},
  817. [2] = {"\t<J>» Autres</J>\n",{
  818. [1] = "<VP>!%s</VP> <R>ou</R> <VP>Touche H</VP> - Ouvre le menu d'aide !",
  819. [2] = "<VP>!%s</VP> - Ouvre le leaderboard!",
  820. [3] = "<VP>!%s</VP> - Ouvre l'aide en fonction du sol sur lequel vous vous trouvez!",
  821. [4] = "<VP>!%s</VP> - Affiche les informations de la carte si elle est dans la rotation!"
  822. }},
  823. [3] = {"\n\t<J>» Place admin</J>\n",{
  824. [1] = "<VP>!%s</VP> <PS>mot de passe</PS> - Ajoute ou supprime un mot de passe dans la chambre.",
  825. }},
  826. }},
  827. [4] = {"Cartes","<J>Cartes : %s\n\n\tAccédez à %s et envoyez votre carte. N'oubliez pas de lire toutes les règles avant!"},
  828. [5] = {"Merci à","<R>%s <G>- <N>Développeur\n%s <G>- <N>Traducteurs\n%s <G>- <N>Evaluateurs de maps"},
  829. },
  830. -- *
  831. },
  832. pl = {
  833. grounds = {
  834. [0] = {"Drewno","?","?"},
  835. [1] = {"Lód","Zwiększa twoją szybkość, gdy klikasz spację","Zwiększa prędkość w <BL>%s%%</BL>"},
  836. [2] = {"Trampolina","?","?"},
  837. [3] = {"Lawa","Przenosi ciebie do ostatniego indexu Z","?"},
  838. [4] = {"Czekolada","?","?"},
  839. [5] = {"Ziemia","?","?"},
  840. [6] = {"Trawa","?","?"},
  841. [7] = {"Piasek","Tworzy burzę piaskową","Zmniejsza storm w <BL>%s%%</BL>"},
  842. [8] = {"Chmura","Pozwala tobie latać, gdy klikasz spację","Zwiększa latanie w <BL>%s%%</BL>"},
  843. [9] = {"Woda","Topi ciebie","Topi <BL>%s%%</BL> wolniej"},
  844. [10] = {"Kamień","Powoduje, że możesz stworzyć blok kamienia, wciskając spację","Zwiększa wielkość bloku w <BL>%s%%</BL>"},
  845. [11] = {"Śnieg","Powoduje, że możesz strzelić śnieżką, wciskając spację","Zwiększa prędkość śnieżki w <BL>%s%%</BL>"},
  846. [12] = {"Trójkąt","Każdy kolor ma swoją funkcję","?",{
  847. ["C90909"] = "Zabija ciebie",
  848. ["18C92B"] = "Ożywia wszystkich przeciwników",
  849. ["555D77"] = "Ponowne spawnowanie Checkpointów",
  850. }},
  851. [13] = {"Koło","Każdy kolor ma swoją funkcję","?"},
  852. [14] = {"Niewidzialność","?","?"},
  853. [15] = {"Pajęcza sieć","Przenosi ciebie do miejsca spawnu","?"},
  854. },
  855. categories = {
  856. [1] = "Często długie mapy, w większości przypadków, gracze muszą przejść takie same przeszkody.",
  857. [2] = "Zwyczajnie długie mapy z lawami i pajęczynami, czasami używana woda aby zasymulować latanie.",
  858. [3] = "Trudniejsze mapy, które wymagają większej ilości zdolności, aby zostały ukończone.",
  859. [4] = "Mapy, które jako główną mapę mają wodę, w której myszki się topią.",
  860. [5] = "Mapy bazowane głównie na teleportacji z lawy.",
  861. [6] = "Mapy, które wymagają nowej zdolności, z mechanizmem albo czymś co powoduje, że musisz myśleć zanim coś zrobisz.",
  862. [7] = "Mapy bazowane na szybkości i zwinności, budowane najczęsciej z gruntów lodu.",
  863. [8] = "Mapy bazowane na technikach/mechanikach śnieżnych kulek.",
  864. [9] = "Mapy z zupełnie inną rozgrywką niż inne kategorie, również znaduje się w <I>mapach vanilliowych</I>.",
  865. [10] = "Mapy (w większości) zdolne do przejścia samemu, ale szybciej się ją przechodzi gdy gracze pracują wspólnie.",
  866. [11] = "Mapy z wampirami.",
  867. [12] = "Chatki plemienne bez rozgrywki, są miejscem tylko dla noobków.",
  868. },
  869.  
  870. welcome = "Witaj w #%s! Możesz zostać najszybszą myszką, używając moce gruntów? Spróbuj!\n<PS>Wciśnij H, aby otrzymać więcej informacji!",
  871. developer = "Stworzone przez %s",
  872.  
  873. shop = {
  874. coin = "Kredyty",
  875. power = "Moc gruntu",
  876. upgrade = "Ulepsz",
  877. price = "Cena ulepszenia",
  878. close = "Zamknij",
  879. },
  880. bought = "Wydałeś %s monet na %s!",
  881. cantbuy = "Nie masz wystarczającej ilości monet, żeby zakupić to ulepszenie! :(",
  882.  
  883. profile = "Ranking : %s\n\n<N>Rund : %s\n<N>Podia : %s\n\n<N>Zgony : %s\n\n<N>Monety : %s",
  884.  
  885. gotcoin = "Masz %s monet! :D",
  886. zombie = "Zostałeś/-aś zombie!",
  887. countstats = {
  888. mice = "Przynajmniej 5 myszek jest potrzebnych aby statystyki były naliczane",
  889. tribe = "Statystyki nie są naliczane w chatkach plemiennych"
  890. },
  891.  
  892. powersenabled = "Moce gruntów są włączone! Powodzenia!",
  893. tribehouse = "To jest miejsce chatki plemiennej. Bez statystyk, bez rozgrywki. Ciesz się ze swoimi znajomymi.",
  894.  
  895. language = "Bieżący język : <J>%s",
  896.  
  897. password = {
  898. on = "Nowe hasło : %s",
  899. off = "Hasło wyłączone!"
  900. },
  901.  
  902. commands = {
  903. shop = "sklep",
  904. profile = "profil",
  905. help = "pomoc",
  906. langue = "język",
  907. leaderboard = "ranking",
  908. info = "informacje",
  909. pw = "hasło",
  910. },
  911.  
  912. menu = {
  913. [1] = {"%s","\tTwoim zadaniem w tej minigrze jest zbieranie serka najszybciej jak potrafisz, wykorzystując moce gruntów."},
  914. [2] = {"Moce gruntu","Kliknij w nazwę gruntu, żeby uzyskać więcej informacji.\n\n%s"},
  915. [3] = {"Komendy",{
  916. [1] = {"\t<J>» Użytkowe</J>\n",{
  917. [1] = "<VP>!%s</VP> <PS>nazwaGracza</PS> <R>albo</R> <VP>Klawisz P</VP> - Otwiera profil!",
  918. [2] = "<VP>!%s</VP> <R>albo</R> <VP>Klawisz O</VP> - Otwiera Sklep!",
  919. [3] = "<VP>!%s</VP> - Zmienia język!",
  920. }},
  921. [2] = {"\t<J>» Inne</J>\n",{
  922. [1] = "<VP>!%s</VP> <R>albo</R> <VP>Klawisz H</VP> - Otwiera pomoc!",
  923. [2] = "<VP>!%s</VP> - Otwiera ranking!",
  924. [3] = "<VP>!%s</VP> - Otwiera pomoc zależnie, na którym gruncie jesteś!",
  925. [4] = "<VP>!%s</VP> - Pokazuje informacje o mapie jeżeli jest w rotacji!",
  926. }},
  927. [3] = {"\n\t<J>» Pokój z adminem</J>\n",{
  928. [1] = "<VP>!%s</VP> <PS>hasło</PS> - Dodaje lub usuwa hasło w pokoju.",
  929. }},
  930. }},
  931. [4] = {"Mapy","<J>Mapy : %s\n\n\tStwórz %s i prześlij swoją mapę. Nie zapomnij, aby najpierw przeczytać zasady!"},
  932. [5] = {"Podziękowania","<R>%s <G>- <N>Twórca\n%s <G>- <N>Tłumacze\n%s <G>- <N>Testerzy map"},
  933. },
  934. max = "15a2df4de75",
  935. },
  936. hu = {
  937. grounds = {
  938. [0] = {"Fa","?","?"},
  939. [1] = {"Jég","Növeli a sebességedet, ha megnyomod a Szóközt","Növeli a sebességet <BL>%s%%</BL>-kal"},
  940. [2] = {"Trambulin","?","?"},
  941. [3] = {"Láva","Elteleportál téged a legutóbbi Z index talajhoz","?"},
  942. [4] = {"Csoki","?","?"},
  943. [5] = {"Föld","?","?"},
  944. [6] = {"Füves talaj","?","?"},
  945. [7] = {"Homok","Homokvihart hoz létre","Csökkenti a sebességet <BL>%s%%</BL>-kal"},
  946. [8] = {"Felhő","Lehetővé teszi számodra a repülést, ha megnyomod a Szóközt","Növeli a repülést <BL>%s%%</BL>-kal"},
  947. [9] = {"Víz","Megfullaszt téged","Megfullaszt <BL>%s%%</BL>-kal lassabban"},
  948. [10] = {"Kő","Egy kőtömböt hoz létre, ha megnyomod a Szóközt","Növeli a blokk méretét <BL>%s%%</BL>-kal"},
  949. [11] = {"Hó","Hógolyót lő, ha megnyomod a Szóközt","Növeli a hógolyó sebességét <BL>%s%%</BL>-kal"},
  950. [12] = {"Téglalap","Mindegyik színnek megvan a saját szerepe","?",{
  951. ["C90909"] = "Megöl téged",
  952. ["18C92B"] = "Újraéleszti az összes ellenséget",
  953. ["555D77"] = "Újraéledő Ellenőrzőpont",
  954. }},
  955. [13] = {"Kör","Mindegyik színnek megvan a saját szerepe","?"},
  956. [14] = {"Láthatatlan","?","?"},
  957. [15] = {"Pókháló","Elteleportál téged a kezdőpontra","?"},
  958. },
  959. -- *
  960.  
  961. welcome = "Üdvözöllek a #%s! Sikerül neked a leggyorsabb egérré válni a talajhatások használatával? Próbáld ki!\n<PS>Nyomd meg a H betűt több információért!",
  962. developer = "Fejlesztve %s által",
  963.  
  964. shop = {
  965. coin = "Pénzérmék",
  966. power = "Talaj ereje",
  967. upgrade = "Frissítés",
  968. price = "Ár frissítése",
  969. close = "Bezárás",
  970. },
  971. bought = "Te most költöttél el %s pénzt a talajra %s!",
  972. cantbuy = "Nincs elég pénzed ahhoz, hogy megvedd ezt a frissítést! :(",
  973.  
  974. profile = "Ranglista : %s\n\n<N>Körök : %s\n<N>Dobogók : %s\n\n<N>Halálozások : %s\n\n<N>Bolti pénz : %s",
  975.  
  976. gotcoin = "Te most szereztél %s pénzt! :D",
  977. zombie = "Most egy zombi vagy!",
  978. countstats = {
  979. mice = "Legalább 5 egérnek kell lennie, hogy statisztikát lehessen számolni",
  980. tribe = "A statisztika nem számít a törzsházakban"
  981. },
  982.  
  983. powersenabled = "A talajhatások engedélyezve lettek! Sok szerencsét!",
  984. -- *
  985.  
  986. language = "Jelenlegi nyelv : <J>%s",
  987.  
  988. password = {
  989. on = "Új jelszó : %s",
  990. off = "Jelszó letiltva!"
  991. },
  992.  
  993. commands = {
  994. shop = "bolt",
  995. profile = "profil",
  996. help = "súgó",
  997. langue = "nyelv",
  998. leaderboard = "ranglistát",
  999. info = "infó",
  1000. pw = "jelszó",
  1001. },
  1002.  
  1003. menu = {
  1004. [1] = {"%s","\tA te feladatod ebben a minijátékban az, hogy a lehető leggyorsabban összegyűjtsd a sajtot a talajhatások használatával."},
  1005. [2] = {"Talajhatások","Kattints a talaj nevére, hogy több mindent megtudhass.\n\n%s"},
  1006. [3] = {"Parancsok",{
  1007. [1] = {"\t<J>» Felhasználó</J>\n",{
  1008. [1] = "<VP>!%s</VP> <PS>játékosNeve</PS> <R>vagy</R> <VP>P billenytű</VP> - Megnyitja a profilt!",
  1009. [2] = "<VP>!%s</VP> <R>vagy</R> <VP>O billentyű</VP> - Megnyitja a boltot!",
  1010. [3] = "<VP>!%s</VP> - Megváltoztatja a nyelvet!\n",
  1011. }},
  1012. [2] = {"\t<J>» Egyebek</J>\n",{
  1013. [1] = "<VP>!%s</VP> <R>vagy</R> <VP>H billentyű</VP> - Megnyitja a Súgó menüpontot!",
  1014. [2] = "<VP>!%s</VP> - Megnyitja a ranglistát!",
  1015. [3] = "<VP>!%s</VP> - Megnyitja a Súgót aszerint, amelyik talajon állsz!",
  1016. [4] = "<VP>!%s</VP> - Displays the map info if it is in the rotation!",
  1017. }},
  1018. [3] = {"\n\t<J>» Szoba admin</J>\n",{
  1019. [1] = "<VP>!%s</VP> <PS>jelszó</PS> - Bekapcsolja vagy kikapcsolja a jelszót a szobában!",
  1020. }},
  1021. }},
  1022. [4] = {"Pályák","<J>Pályák : %s\n\n\tEngedélyezd a %s és küldd be a pályádat. Előtte ne felejtsd el elolvasni az összes szabály!"},
  1023. [5] = {"Köszönet","<R>%s - Nak <G>- <N>Fejlesztő\n%s <G>- <N>Fordítók\n%s <G>- <N>Pálya értékelők"},
  1024. },
  1025. -- *
  1026. },
  1027. ar = {
  1028. grounds = {
  1029. [0] = {"خشب","?","?"},
  1030. [1] = {"جليد","تزيد من سرعتك عند الضغط على زر المسطرة","يزيد من السرعة ب <BL>%s%%</BL>"},
  1031. [2] = {"الترامبولين","?","?"},
  1032. [3] = {"الحمم","تنقلك إلى الأرضية التي لديها اَخر رقم في الـ Z","?"},
  1033. [4] = {"الشوكولاته","?","?"},
  1034. [5] = {"الأرض","?","?"},
  1035. [6] = {"العشب","?","?"},
  1036. [7] = {"الرمل","تصنع عاصفة رملية","يقلل من العاصفة ب <BL>%s%%</BL>"},
  1037. [8] = {"غيمة","تجعلك تطير عن طريق الضغط على زر المسطرة","يزيد من الطيران ب <BL>%s%%</BL>"},
  1038. [9] = {"المياه","تغرقك","يغرقك <BL>%s%%</BL> ببطئ"},
  1039. [10] = {"الحجارة","تصنع حاجو من الحجارة عن طريق الضغط على زر المسطرة","يزيد من حجم الارضية ب <BL>%s%%</BL>"},
  1040. [11] = {"الثلج","تطلق كرات ثلجية عن طريق الضغط على زر المسطرة","يزيد من سرعة كرة الثلج ب <BL>%s%%</BL>"},
  1041. [12] = {"مستطيل","كل لون له قوته الخاصة","?",{
  1042. ["C90909"] = "يقتلك",
  1043. ["18C92B"] = "إعادة الحياة إلى جميع أعدائك",
  1044. ["555D77"] = "نقطة العودة للحياة",
  1045. }},
  1046. [13] = {"الدائرة","كل لون له قوته الخاصة","?"},
  1047. [14] = {"الإختفاء","?","?"},
  1048. [15] = {"شبكة العنكبوت","تنقلك إلى نقطة البداية","?"},
  1049. },
  1050. -- *
  1051.  
  1052. welcome = "مرحبا إلى #%s! هل يمكنك أن تكون أسرع فأر يستعمل قوى الأرض؟ قم بتجربتها!\n<PS>اضغط على الزر H لمعرفة المزيد!",
  1053. developer = "مبرمجة من قبل %s",
  1054.  
  1055. shop = {
  1056. coin = "النقود",
  1057. power = "طاقة الارضية",
  1058. upgrade = "ترقية",
  1059. price = "ترقبة السعر",
  1060. close = "اغلاق",
  1061. },
  1062. bought = "لقد قمت بإستعمال %s من النقود من أجل الأرضية %s!",
  1063. cantbuy = "لا تملك النقود الكافية لشراء هذا! :(",
  1064.  
  1065. profile = "لائحة المتقدمين : %s\n\n<N>الجولات : %s\n<N>المناصب : %s\n\n<N>الموت : %s\n\n<N>نقود المتجر : %s",
  1066.  
  1067. gotcoin = "لقد حصلت على %s نقود! :D",
  1068. zombie = "أصبحت الأن ميت حي!",
  1069. countstats = {
  1070. mice = "تحتاج الاقل ل 5 فئران لاحصائيات الاعتماد",
  1071. tribe = "الاحصائيات لا تحسب بمنزل القبيلة"
  1072. },
  1073.  
  1074. powersenabled = "تم تفعيل قوى الأرض! حظا موفقا!",
  1075. -- *
  1076.  
  1077. language = "اللغة الحالية : <J>%s",
  1078.  
  1079. password = {
  1080. on = "جديدة سر كلمة : %s",
  1081. off = "السر كلمة تعطيل!"
  1082. },
  1083.  
  1084. commands = {
  1085. shop = "المتجر",
  1086. profile = "لاعب",
  1087. help = "المساعدة",
  1088. langue = "اللغة",
  1089. leaderboard = "مراكز",
  1090. info = "معلومة",
  1091. pw = "password",
  1092. },
  1093.  
  1094. menu = {
  1095. [1] = {"%s","\tما عليك فعله في هذه اللعبة هو جمع الجبن بأسرع ما يمكن يمكنك إستخدام القوى التي توفرها لك الأرضيات."},
  1096. [2] = {"تأثيرات الأراضي","أنقر على إسم الأرضية لمعرفة المزيد عنها\n\n%s"},
  1097. [3] = {"الأوامر",{
  1098. [1] = {"\t<J>» اللاعب</J>\n",{
  1099. [1] = "<VP>!%s</VP> <PS>إسم اللاعب</PS> <R>أو</R> <VP>زر P</VP> - لفتح الملف الشخصي!",
  1100. [2] = "<VP>!%s</VP> <R>أو</R> <VP>الزر O</VP> - لفتح المتجر!",
  1101. [3] = "<VP>!%s</VP> - لتغيير اللغة!\n",
  1102. }},
  1103. [2] = {"\t<J>» البقية</J>\n",{
  1104. [1] = "<VP>!%s</VP> <R>أو</R> <VP>الزر H</VP> - لقتح لائحة المساعدة!",
  1105. [2] = "<VP>!%s</VP> - فتح قائمة المراكز!",
  1106. [3] = "<VP>!%s</VP> - فتح المساعدة وفقا للمكان الذي انت عليه!",
  1107. [4] = "<VP>!%s</VP> - يعرض معلومات الخريطة إذا كانت في دوران",
  1108. }},
  1109. [3] = {"\n\t<J>» مشرف غرفة</J>\n",{
  1110. [1] = "<VP>!%s</VP> <PS>سر كلمة</PS> - إضافة أو إزالة كلمة مرور في الغرفة!",
  1111. }},
  1112. }},
  1113. [4] = {"الخرائط","<J>الخرائط : %s\n\n\tتفعيل %s وأرسل الخارطة. لا تنسى قراءة القوانين!"},
  1114. [5] = {"شكرا لـ","<R>%s <G>- <N>المبرمج\n%s <G>- <N>مترجمون\n%s <G>- <N>مقيموا الخرائط"},
  1115. },
  1116. -- *
  1117. },
  1118. nl = {
  1119. grounds = {
  1120. [0] = {"Hout","?","?"},
  1121. [1] = {"Ijs","Verhoogt je snelheid door op de spatiebalk te drukken","Verhoogd de snelheid met <BL>%s%%</BL>"},
  1122. [2] = {"Trampoline","?","?"},
  1123. [3] = {"Lava","Teleport jou naar de laatst Z index grond","?"},
  1124. [4] = {"Chocolade","?","?"},
  1125. [5] = {"Aarde","?","?"},
  1126. [6] = {"Gras","?","?"},
  1127. [7] = {"Zand","Maakt een zandstorm","Vemindert de storm met <BL>%s%%</BL>"},
  1128. [8] = {"Wolk","Hiermee kun je vliegen door op de spatiebalk te drukken","Verhoogd de vlucht met <BL>%s%%</BL>"},
  1129. [9] = {"Water","Laat je verdrinken","Maakt je <BL>%s%%</BL> langzamer"},
  1130. [10] = {"Steen","Hiermee maak je een blok steen door op de spatiebalk te drukken","Vergroot de grootte van het blok met <BL>%s%%</BL>"},
  1131. [11] = {"Sneeuw","Schiet sneeuwballen door op de spatiebalk te drukken","Verhoogd de snelheid van de sneeuwbal met <BL>%s%%</BL>"},
  1132. [12] = {"Rechthoek","Elke kleur heeft zijn eigen functie","?",{
  1133. ["C90909"] = "Vermoordt jou",
  1134. ["18C92B"] = "Brengt alle tegenstanders weer tot leven",
  1135. ["555D77"] = "Respawning Checkpoint", -- *
  1136. }},
  1137. [13] = {"Cirkel","Elke kleur heeft zijn eigen functie","?"},
  1138. [14] = {"Onzichtbaar","?","?"},
  1139. [15] = {"Spinnenweb","Teleport je naar het beginpunt","?"},
  1140. },
  1141. -- *
  1142.  
  1143.  
  1144. welcome = "Welkom bij #%s! Ben jij de snelste muis door grond effecten te gebruiken? Probeer het!",
  1145. developer = "Gemaakt door %s",
  1146.  
  1147. shop = {
  1148. coin = "Munten",
  1149. power = "Grondkracht",
  1150. upgrade = "Upgraden",
  1151. price = "Upgrade kosten",
  1152. close = "Sluit",
  1153. },
  1154. bought = "Je gaf net %s munten uit voor de grond %s!",
  1155. cantbuy = "Je hebt niet genoeg munten om deze upgrade uit te voeren! :(",
  1156.  
  1157. profile = "Ranglijst : %s\n\n<N>Rondes : %s\n<N>Podiums : %s\n\n<N>Sterfgevallen : %s\n\n<N>Winkel Munten : %s",
  1158.  
  1159. gotcoin = "Je kreeg zojuist %s munten! :D",
  1160. zombie = "Nu ben je een zombie!",
  1161. countstats = {
  1162. mice = "Er zijn minstens 5 muizen nodig voordat de stats tellen",
  1163. tribe = "Stats tellen niet in stamhuizen"
  1164. },
  1165.  
  1166. powersenabled = "De grondkrachten zijn ingeschakeld! Succes!",
  1167. -- *
  1168.  
  1169. language = "Huidige taal : <J>%s",
  1170.  
  1171. password = {
  1172. on = "Nieuwe wachtwoord : %s",
  1173. off = "Wachtwoord uitgezet!"
  1174. },
  1175.  
  1176. commands = {
  1177. shop = "winkel",
  1178. profile = "profiel",
  1179. help = "help",
  1180. langue = "taal",
  1181. leaderboard = "leaderboard",
  1182. info = "info",
  1183. pw = "wachtwoord",
  1184. },
  1185.  
  1186. menu = {
  1187. [1] = {"%s","\tJouw doel is om zoveel mogelijk kaas te verzamelen, met gebruik van verschillende grond-effecten."},
  1188. [2] = {"Grond effecten","Klik op de grond om meer info te lezen.\n\n%s"},
  1189. [3] = {"Commands",{
  1190. [1] = {"\t<J>» User</J>\n",{
  1191. [1] = "<VP>!%s</VP> <PS>playerName</PS> <R>or</R> <VP>Key P</VP> - Opent het profiel!",
  1192. [2] = "<VP>!%s</VP> <R>or</R> <VP>Key O</VP> - Opent de winkel!",
  1193. [3] = "<VP>!%s</VP> - Wijzigt de taal!\n",
  1194. }},
  1195. [2] = {"\t<J>» Others</J>\n",{
  1196. [1] = "<VP>!%s</VP> <R>or</R> <VP>Key H</VP> - Opent de Help menu!",
  1197. [2] = "<VP>!%s</VP> - Opent de leaderboard!",
  1198. [3] = "<VP>!%s</VP> - Opent help op basis van de grond waarop je staat!",
  1199. [4] = "<VP>!%s</VP> - Displays the map info if it is in the rotation!", -- *
  1200. }},
  1201. [3] = {"\n\t<J>» Kamer admin</J>\n",{
  1202. [1] = "<VP>!%s</VP> <PS>wachtwoord</PS> - Voegt of haalt een wachtwoord weg van een kamer!",
  1203. }},
  1204. }},
  1205. [4] = {"Maps","<J>Maps : %s\n\n\tBereik %s en verzend jouw map. Vergeet niet om alle regels te lezen voordat je begint!"},
  1206. [5] = {"Dank aan","<R>%s <G>- <N>Developer\n%s <G>- <N>Translators\n%s <G>- <N>Mapbeoordelaars"},
  1207. },
  1208. -- *
  1209. },
  1210. de = {
  1211. grounds = {
  1212. [0] = {"Holz","?","?"},
  1213. [1] = {"Eis","Beschleunigt dich indem du die Leertaste drückst","Erhoht die geschwindigkeit in <BL>%s%%</BL>"},
  1214. [2] = {"Trampoline","?","?"},
  1215. [3] = {"Lava","Teleportiert dich zum letzen Z Index Boden","?"},
  1216. [4] = {"Schokolade","?","?"},
  1217. [5] = {"Erde","?","?"},
  1218. [6] = {"Gras","?","?"},
  1219. [7] = {"Sand","Kreiert einen Sandsturm","Verringert die sturm in <BL>%s%%</BL>"},
  1220. [8] = {"Wolke","Du kannst fliegen indem du die Leertaste drückst","Erhoht die fliege in <BL>%s%%</BL>"},
  1221. [9] = {"Wasser","Ertränkt dich","Ertrinkt dich <BL>%s%%</BL> langsamer"},
  1222. [10] = {"Stein","Erschaffe einen Stein indem du die Leertaste drückst","Erhoht die blockgrosse in <BL>%s%%</BL>"},
  1223. [11] = {"Schnee","Wirf Schneebälle indem du die Leertaste drückst","Erhoht die schneeball geschwindigkeit in <BL>%s%%</BL>"},
  1224. [12] = {"Rechteck","Jede Farbe hat seine eigene Funktion","?",{
  1225. ["C90909"] = "Tötet du",
  1226. ["18C92B"] = "Aufleben alle Feinde",
  1227. ["555D77"] = "Respawning Checkpoint", -- *
  1228. }},
  1229. [13] = {"Kreis","Jede Farbe hat seine eigene Funktion","?"},
  1230. [14] = {"Unsichtbar","?","?"},
  1231. [15] = {"Spinnweben","Teleportiert dich zum Startpunkt","?"},
  1232. },
  1233. -- *
  1234.  
  1235. welcome = "Willkommen zu #%s! Kannst du die schnellste Maus mit den Bodeneffekten sein? Versuch es!\n<PS>Drück H für mehr informationen!",
  1236. developer = "Entwickelt von %s",
  1237.  
  1238. shop = {
  1239. coin = "Munzen",
  1240. power = "Bodenleistung",
  1241. upgrade = "Aktualisierung",
  1242. price = "Upgrade Preis",
  1243. close = "Schliessen",
  1244. },
  1245. bought = "Du hast %s Münzen für den Boden %s ausgegeben!",
  1246. cantbuy = "Du hast nicht genügend Münzen um dieses Upgrade zu kaufen! :(",
  1247.  
  1248. profile = "Bestenliste : %s\n\n<N>Runden: %s\n<N>Podiums: %s\n\n<N>Tode : %s\n\n<N>Shop Münzen: %s",
  1249.  
  1250. gotcoin = "Du hast soeben %s Münzen erhalten! :D",
  1251. zombie = "Du bist nun ein Zombie!",
  1252. countstats = {
  1253. mice = "Es müssen mindestens 5 Mäuse im Raum sein damit die Stats zählen",
  1254. tribe = "Stats zählen in Stammeshäusern nicht"
  1255. },
  1256.  
  1257. powersenabled = "Der Effekt des Bodens wurde aktiviert! Viel Glück!",
  1258. -- *
  1259.  
  1260. language = "Aktuelle Sprache : <J>%s",
  1261.  
  1262. password = {
  1263. on = "Neu passwort: : %s",
  1264. off = "Passwort deaktiviert!"
  1265. },
  1266.  
  1267. commands = {
  1268. shop = "shop",
  1269. profile = "profil",
  1270. help = "hilfe",
  1271. langue = "sprache",
  1272. leaderboard = "bestenliste",
  1273. info = "info",
  1274. pw = "passwort",
  1275. },
  1276.  
  1277. menu = {
  1278. [1] = {"%s","\tDein Ziel in diesem Minigame ist es den Käse so schnell wie möglich zu sammeln, indem du die verschiedenen Effekte der Böden ausnutzt."},
  1279. [2] = {"Bodeneffekte","Klicken in den bodens namen um mehr zu lesen.\n\n%s"},
  1280. [3] = {"Kommandos",{
  1281. [1] = {"\t<J>» Benutzer</J>\n",{
  1282. [1] = "<VP>!%s</VP> <PS>Spielername</PS> <R>oder</R> <VP>Taste P</VP> - Öffnet das Profil!",
  1283. [2] = "<VP>!%s</VP> <R>oder</R> <VP>Taste O</VP> - Öffnet den Shop!",
  1284. [3] = "<VP>!%s</VP> - Ändert die Sprache!\n",
  1285. }},
  1286. [2] = {"\t<J>» Anderes</J>\n",{
  1287. [1] = "<VP>!%s</VP> <R>oder</R> <VP>Taste H</VP> - Öffnet das Hilfsmenu!",
  1288. [2] = "<VP>!%s</VP> - Öffnet die Bestenliste!",
  1289. [3] = "<VP>!%s</VP> - Öffnet die hilfe nach dem boden auf dem du bist auf!",
  1290. [4] = "<VP>!%s</VP> - Displays the map info if it is in the rotation!", -- *
  1291. }},
  1292. [3] = {"\n\t<J>» Zimmer admin</J>\n",{
  1293. [1] = "<VP>!%s</VP> <PS>passwort</PS> - Hinzufugen oder entfernen eines passwortes im raum!",
  1294. }},
  1295. }},
  1296. [4] = {"Maps","<J>Maps : %s\n\n\tBesuche das Thema %s und reiche deine Map ein. Vergiss nicht zuvor alle Regeln zu lesen!"},
  1297. [5] = {"Danke an ","<R>%s <G>- <N>Entwickler\n%s <G>- <N>Übersetzer\n%s <G>- <N>Landkarte bewerter"},
  1298. },
  1299. -- *
  1300. },
  1301. },
  1302. langue = "en",
  1303. -- Info
  1304. staff = {
  1305. translators = {
  1306. -- Name, Languages
  1307. {"Bolodefchoco",{"EN","BR"}},
  1308. {"Distances","NL"},
  1309. {"Tocutoeltuco","ES"},
  1310. {"Sebafrancuz","PL"},
  1311. {"Doriiarvai","HU"},
  1312. {"Error_404","AR"},
  1313. {"Cheeselicious","NL"},
  1314. {"Archaeron","DE"},
  1315. {"Aewing","FR"},
  1316. {"Fashionkid","DE"},
  1317. {"Yuir","ES"},
  1318. {"Mquk","FR"}
  1319. },
  1320. mapEvaluators = {
  1321. -- Name, Joined
  1322. {"Bolodefchoco","14/02/2017"},
  1323. {"Error_404","11/03/2017"}
  1324. },
  1325. },
  1326. -- Data
  1327. bindKeys = {0,1,2,3,stringbyte("OPHK",1,4)},
  1328. info = {},
  1329. stormIntensities = {
  1330. --[[ Opaque images
  1331. [1] = "15a6d6fcd18",
  1332. [2] = "15a6d6ff82f",
  1333. [4] = "15a6d7015bc",
  1334. [8] = "15a6d703149"
  1335. ]]
  1336. [1] = .75,
  1337. [2] = .65,
  1338. [4] = .5,
  1339. [8] = .25
  1340. },
  1341. -- Maps (G Categories)
  1342. maps = {},
  1343. G = {
  1344. --[[
  1345. name = catName,
  1346. queue{maps},
  1347. id = 1,
  1348. icon = {iconImage,x axis (from 360),y axis (from 123)}
  1349. color = catColor,
  1350. before = function executed before the map,
  1351. after = function executed after the map
  1352. ]]--
  1353. [1] = {
  1354. name = "Circuit",
  1355. queue = {3099763,4612510,7078090,4493715,7102175,5921816,7127261,7102187},
  1356. id = 1,
  1357. icon = {"15c60371706",0,-1},
  1358. color = "9A9ACE",
  1359. },
  1360. [2] = {
  1361. name = "Flap Bird",
  1362. queue = {7069835,2265250,6300148,5921754,2874090,2310427},
  1363. id = 1,
  1364. icon = {"15c603730a6",0,0},
  1365. color = "E084D4",
  1366. },
  1367. [3] = {
  1368. name = "Bootcamp",
  1369. queue = {4592612,7079708,5921867,7087840,6391815,7090909,7011800,7069314,6333026,6000012,6990787,7100040},
  1370. id = 1,
  1371. icon = {"15c60382627",-5,-5},
  1372. color = "A4CF9E",
  1373. },
  1374. [4] = {
  1375. name = "Aquatic",
  1376. queue = {6133469,3324284,6578479,7095393,5772226,2310447},
  1377. id = 1,
  1378. icon = {"15c603788c1",0,0},
  1379. color = "2194D9",
  1380. },
  1381. [5] = {
  1382. name = "Teleport",
  1383. queue = {5168440,6987992,7069343,6945850,7090907,3326655,7069816,5921744,7071075,7071400,4509060,7118888},
  1384. id = 1,
  1385. icon = {"15c60376d57",2,-1},
  1386. color = "E29E71",
  1387. },
  1388. [6] = {
  1389. name = "Puzzle",
  1390. queue = {5993927,7057010,5507021,6994066,6332986,7074686,3448597,2887357,6576282,4514386,7079827,7079880},
  1391. id = 1,
  1392. icon = {"15c6037edb7",0,-1},
  1393. color = "CB56D8",
  1394. },
  1395. [7] = {
  1396. name = "Racing",
  1397. queue = {4140491,3324180,6564380,6600268,6987993,6726599,2283901,6568120,4055924,4361785,3851416,7079644,6347093,6620004,7086768,6797243,2030030,5198518,6230212,6340023,7069304,4362362,5981054,4364504,7086737,6623930},
  1398. id = 1,
  1399. icon = {"15c6037ccd7",-5,-5},
  1400. color = "9DBCF2",
  1401. },
  1402. [8] = {
  1403. name = "Snow",
  1404. queue = {4396371,5632126,7079092,4531989,4509584},
  1405. id = 1,
  1406. icon = {"15c6037b089",5,1},
  1407. color = "C4F4F6",
  1408. after = function()
  1409. if os.date("%m") == "12" then
  1410. tfm.exec.chatMessage("<PS>Merry christmas :)")
  1411. tfm.exec.snow(60)
  1412. end
  1413. end,
  1414. },
  1415. [9] = {
  1416. name = "Miscellaneous",
  1417. queue = {6226386,5425815,7047955,6558179,6961916,6968299,6935117,4802574,7087798,6335452,7093647,7145064},
  1418. id = 1,
  1419. icon = {"15c6036fb66",-10,-2},
  1420. color = "DED963",
  1421. },
  1422. [10] = {
  1423. name = "Cooperation",
  1424. queue = {3326675,4184558,5198607,6988672},
  1425. id = 1,
  1426. icon = {"15c60374f1f",-3,-1},
  1427. color = "2EBA7E",
  1428. },
  1429. [11] = {
  1430. name = "Vampire",
  1431. queue = {5043429,4361619,4633670},
  1432. id = 1,
  1433. icon = {"15c60380b12",-10,-5},
  1434. color = "CB546B",
  1435. after = function()
  1436. if os.date("%m") == "10" then
  1437. tfm.exec.chatMessage("<R>Happy Halloween :>")
  1438. end
  1439. end,
  1440. },
  1441. [12] = {
  1442. name = "House",
  1443. queue = {510966},
  1444. id = 1,
  1445. icon = {"15cb6dbea83",-8,-4},
  1446. color = "D1AB83",
  1447. after = function()
  1448. tfm.exec.setGameTime(1800) -- 30 minutes
  1449. tfm.exec.chatMessage("<ROSE>" .. system.getTranslation("tribehouse"))
  1450. end,
  1451. },
  1452. },
  1453. rotation = {1,{9,7,4,1,5,7,10,8,6,11,2,1,3,5}},
  1454. newMap = coroutine.wrap(function()
  1455. while true do
  1456. local map
  1457. if os.time() > system.newGameTimer then
  1458. if mode.grounds.rotation[1] > #mode.grounds.rotation[2] then
  1459. mode.grounds.rotation[1] = 1
  1460. end
  1461.  
  1462. local category = mode.grounds.rotation[2][mode.grounds.rotation[1]]
  1463. mode.grounds.mapInfo[2] = category
  1464. category = mode.grounds.G[category]
  1465. mode.grounds.mapInfo[5] = category.color
  1466. map = category.queue[category.id]
  1467. mode.grounds.mapInfo[1] = map
  1468.  
  1469. category.id = category.id + 1
  1470.  
  1471. mode.grounds.afterFunction = category.after or (function() end)
  1472. if category.before then
  1473. category.before()
  1474. end
  1475.  
  1476. if category.id > #category.queue then
  1477. category.queue = tableshuffle(category.queue)
  1478. category.id = 1
  1479. end
  1480.  
  1481. mode.grounds.rotation[1] = mode.grounds.rotation[1] + 1
  1482. end
  1483. coroutine.yield(map)
  1484. end
  1485. end),
  1486. -- New Map Settings
  1487. review = false,
  1488. afterFunction = (function() end),
  1489. mapInfo = {0,0,0,0,"CAA4CF"}, -- Code, Category, Width, Height, Color
  1490. respawn = 0,
  1491. hasWater = false,
  1492. podium = 0,
  1493. availableRoom = false,
  1494. alivePlayers = 0,
  1495. totalPlayers = 0,
  1496. spawnPoint = {0,0},
  1497. -- Loop Settings
  1498. despawnGrounds = {},
  1499. announceTimer = 0,
  1500. -- Misc Settings
  1501. welcomeMessage = (function()
  1502. if system.roomNumber == 666 then
  1503. return {"<R>","<R>","<R>","<R>"}
  1504. else
  1505. return {"<BV>","<PT>","<BV>","<VP>"}
  1506. end
  1507. end)(),
  1508. isHouse = system.roomNumber == 801 or system.officialMode[1] == "village",
  1509. -- Leaderboard Settings
  1510. leaderboard = {update = 0,data = {}},
  1511. -- Shop
  1512. shop = {
  1513. images = {
  1514. [1] = {'15a2a340dd5','15a2a342b88','15a2a3449a9','15a2a3459e1','15a2a346953','15a2a3479a3','15a2a348ad3','15a2a349a89','15a2a34aa0d'},
  1515. [3] = {'15a2a35fef7','15a2a36114b','15a2a36240d','15a2a36332f','15a2a3645f3'},
  1516. [7] = {'15a2a3721bc','15a2a3731bb','15a2a3742b6','15a2a375439','15a2a376339'},
  1517. [8] = {'15a2a31b8dc','15a2a31d292','15a2a323150','15a2a32815c','15a2a32af10','15a2a32ce03','15a2a32dc09','15a2a32ecde','15a2a32fc20'},
  1518. [9] = {'15a2a3b475f','15a2a3b5996','15a2a3b6ab9','15a2a3b8250','15a2a3b924f'},
  1519. [10] = {'15a2a3a0156','15a2a3a1229','15a2a3a2460','15a2a3a3702','15a2a3a4c70'},
  1520. [11] = {'15a2a381307','15a2a3824c8','15a2a383682','15a2a384dc1','15a2a3865c5','15a2a38820d','15a2a38a3a8','15a2a38bbd6','15a2a38d0ec'},
  1521. [15] = {'15a2a3c4442','15a2a3c54f3','15a2a3c69b7','15a2a3c78e7','15a2a3c873b'},
  1522. },
  1523. unpackImages = function(id,e)
  1524. local t = {}
  1525. for k,v in next,mode.grounds.shop.images[id] do
  1526. if #t < e then
  1527. t[#t+1] = v
  1528. end
  1529. end
  1530. return t
  1531. end,
  1532. },
  1533. -- System functions
  1534. concat = function(k,v)
  1535. if type(v) == "table" then
  1536. return tableconcat(v,"\n",function(i,j) return mode.grounds.concat(i,j) end)
  1537. else
  1538. return v
  1539. end
  1540. end,
  1541. listener = function(t,st,from)
  1542. from = (from and from.."." or "")
  1543. for k,v in next,t do
  1544. if type(v) == "table" then
  1545. mode.grounds.listener(v,st,from .. tostring(k))
  1546. else
  1547. st[#st + 1] = from .. k
  1548. end
  1549. end
  1550. return st
  1551. end,
  1552. -- Bar
  1553. uibar = function(id,player,value,color,size,height)
  1554. size = size or 100
  1555. height = height or 20
  1556.  
  1557. if value > size then
  1558. value = size
  1559. elseif value < 0 then
  1560. value = 0
  1561. end
  1562.  
  1563. ui.addTextArea(id,"",player,5,(height+8) * id,size + 4,height,0xC7CED2,1,1,true)
  1564. if value ~= 0 then
  1565. ui.addTextArea(id+1,"",player,6,(height+8) * id + 2,value + 2,height - 4,color,color,1,true)
  1566. end
  1567. ui.addTextArea(id+2,"<p align='center'><B><font color='#0'>"..value.."%",player,5,(height+8) * id,size + 4,height,1,1,0,true)
  1568. end,
  1569. -- Shop
  1570. uishop = function(n)
  1571. if mode.grounds.info[n].groundsDataLoaded then
  1572. for k,v in next,mode.grounds.info[n].shop.image do
  1573. tfm.exec.removeImage(v)
  1574. end
  1575. if not mode.grounds.info[n].shop.accessing then
  1576. local get,index = tablefind(mode.grounds.shop.grounds,mode.grounds.info[n].powersOP.GTYPE,1)
  1577. if get then
  1578. mode.grounds.info[n].shop.page = index
  1579. else
  1580. mode.grounds.info[n].shop.page = 1
  1581. end
  1582. mode.grounds.info[n].shop.accessing = true
  1583. end
  1584. if mode.grounds.info[n].shop.page < 1 then
  1585. mode.grounds.info[n].shop.page = #mode.grounds.shop.grounds
  1586. elseif mode.grounds.info[n].shop.page > #mode.grounds.shop.grounds then
  1587. mode.grounds.info[n].shop.page = 1
  1588. end
  1589.  
  1590. local shopTxt = system.getTranslation("shop",n)
  1591. local debuggedGround = mode.grounds.shop.grounds[mode.grounds.info[n].shop.page]
  1592. local ground = system.getTranslation("grounds."..debuggedGround[1],n)
  1593. local G = stringlower(mode.grounds.translations.en.grounds[debuggedGround[1]][1])
  1594. local groundLevel = mode.grounds.info[n].stats.powers[G]
  1595. groundLevel = groundLevel[#groundLevel]
  1596.  
  1597. ui.addTextArea(4,"",n,160,50,480,320,0x1a2433,1,1,true)
  1598.  
  1599. ui.addTextArea(5,"",n,171,56,240,15,0x1d5a78,0x1d5a78,1,true)
  1600. ui.addTextArea(6,"<p align='center'><font size='13'>"..stringnick(mode.grounds.cmds.shop),n,170,53,240,25,1,1,0,true)
  1601.  
  1602. ui.addTextArea(7,"<p align='center'><font size='12'><B><a href='event:shop.left'><BV>«</BV></a> <font size='14'><a href='event:info.grounds."..stringgsub(ground[1],"'","#").."."..ground[2].."'>"..ground[1].."</a></font> <a href='event:shop.right'><BV>»</BV></a>",n,170,87,240,25,0x073247,0x073247,1,true)
  1603.  
  1604. mode.grounds.info[n].shop.image[1] = tfm.exec.addImage(debuggedGround[2][1]..".png","&0",435,70,n)
  1605.  
  1606. local playerData = stringformat("<font size='12'><N>%s <G>: <J>$%s\n<N>%s\n<N>%s <G>: <BL>%s",shopTxt.coin,mode.grounds.info[n].stats.groundsCoins,"%s",shopTxt.power,mathfloor(mathpercent(groundLevel,#debuggedGround[2])).."%%")
  1607. local groundData = ""
  1608. local upgradeData = "<p align='center'><font size='15'><B>%s" .. shopTxt.upgrade
  1609.  
  1610. if (groundLevel + 1) <= #debuggedGround[2] then
  1611. local price = (groundLevel + 1) * (120 * debuggedGround[3])
  1612. playerData = stringformat(playerData,shopTxt.price .. " <G>: <R>$" .. price)
  1613. local iniPerc = mathfloor(mathpercent(1,#mode.grounds.shop.grounds[mode.grounds.info[n].shop.page][2]))
  1614. groundData = stringformat(ground[3],iniPerc)
  1615. upgradeData = stringformat(upgradeData,"<a href='event:shop.buy."..price.."."..G.."'><PT>")
  1616.  
  1617. local gId = mode.grounds.info[n].stats.powers[G][#mode.grounds.info[n].stats.powers[G]]
  1618. mode.grounds.info[n].shop.image[2] = tfm.exec.addImage(debuggedGround[2][gId]..".png","&1",540,70,n)
  1619. mode.grounds.info[n].shop.image[3] = tfm.exec.addImage("15a2df6ab69.png","&2",440,205,n)
  1620. mode.grounds.info[n].shop.image[4] = tfm.exec.addImage(debuggedGround[2][gId+1]..".png","&3",540,210,n)
  1621. else
  1622. playerData = stringformat(playerData,"<R>-")
  1623. upgradeData = stringformat(upgradeData,"<V>")
  1624.  
  1625. mode.grounds.info[n].shop.image[2] = tfm.exec.addImage(system.getTranslation("max",n)..".png","&2",175,215,n)
  1626. end
  1627.  
  1628. ui.addTextArea(8,playerData,n,170,130,240,52,0x073247,0x073247,1,true)
  1629. ui.addTextArea(9,groundData,n,170,200,240,80,0x073247,0x073247,1,true)
  1630.  
  1631. ui.addTextArea(10,upgradeData,n,170,298,240,24,0x073247,0x073247,1,true)
  1632. ui.addTextArea(11,"<p align='center'><font size='15'><R><B><a href='event:shop.close'>"..shopTxt.close.."</a></B>",n,170,339,240,24,0x073247,0x073247,1,true)
  1633.  
  1634. ui.addTextArea(12,"",n,430,62,200,300,0x073247,0x073247,1,true)
  1635. ui.addTextArea(13,"",n,426,58,90,90,0x1a2433,0x1a2433,1,true)
  1636. end
  1637. end,
  1638. -- Profile
  1639. uiprofile = function(n,p)
  1640. if mode.grounds.info[p].groundsDataLoaded then
  1641. local nickSize = #p > 12 and 10 or 15
  1642. ui.addTextArea(14,"<p align='center'><B><R><a href='event:profile.close'>X",n,513,115,20,20,1,1,1,true)
  1643. ui.addTextArea(15,"<p align='center'><B><PS><a href='event:profile.open'>•",n,513,145,20,20,1,1,1,true)
  1644. ui.addTextArea(16,"<p align='center'><font size='16'><B><V>"..p.."</V></B> "..(mode.grounds.info[p].isOnline and "<VP>" or "<R>").."•</font></p><p align='left'><font size='12'>\n<N>" .. stringformat(system.getTranslation("profile",n),"<V>#"..mode.grounds.info[p].ranking,"<V>"..mode.grounds.info[p].stats.rounds,"<V>"..mode.grounds.info[p].stats.podiums,"<V>"..mode.grounds.info[p].stats.deaths,"<J>$"..mode.grounds.info[p].stats.groundsCoins),n,290,115,220,160,0x073247,1,1,true)
  1645. end
  1646. end,
  1647. -- Menu
  1648. uimenu = function(n)
  1649. if not mode.grounds.info[n].menu.accessing then
  1650. mode.grounds.info[n].menu.page = 1
  1651. mode.grounds.info[n].menu.accessing = true
  1652. end
  1653.  
  1654. local langue = system.getTranslation("menu",n)
  1655.  
  1656. if mode.grounds.info[n].menu.page < 1 then
  1657. mode.grounds.info[n].menu.page = #langue
  1658. elseif mode.grounds.info[n].menu.page > #langue then
  1659. mode.grounds.info[n].menu.page = 1
  1660. end
  1661.  
  1662. local popupFormat = "<%s><a href='event:menu.page.%d'>#%s</a>"
  1663. local popups = {}
  1664. for k,v in next,langue do
  1665. popups[#popups+1] = stringformat(popupFormat,(k == mode.grounds.info[n].menu.page and "VP" or "J"),k,stringformat(v[1],stringnick(module._NAME)))
  1666. end
  1667.  
  1668. local popup = {
  1669. x = {663,546},
  1670. d = "«",
  1671. txt = "<font size='11'><J>"..tableconcat(popups,"\n\n")
  1672. }
  1673. if not mode.grounds.info[n].menu.showPopup then
  1674. popup = {
  1675. x = {552,435},
  1676. d = "»",
  1677. txt = "",
  1678. }
  1679. end
  1680.  
  1681. local displayText = {tableunpack(langue[mode.grounds.info[n].menu.page])}
  1682.  
  1683. if mode.grounds.info[n].menu.page == 1 then
  1684. displayText[1] = stringformat(displayText[1],stringnick(module._NAME))
  1685.  
  1686. local gameModes = "<PT>"
  1687. for k,v in next,{"powers",tableunpack(system.submodes,2)} do
  1688. local room
  1689. if k > 1 then
  1690. room = stringformat("/room #%s%s@%s*%s",module._NAME,mathrandom(0,999),n,system.normalizedModeName(v,false))
  1691. else
  1692. room = stringformat("/room #%s%s%s",v,mathrandom(0,999),n)
  1693. end
  1694. gameModes = gameModes .. stringformat("<a href='event:print.&lt;ROSE>%s'>%s</a>\n",room,room)
  1695. end
  1696.  
  1697. displayText[2] = displayText[2] .. "\n\n" .. gameModes
  1698. else
  1699. local textFormat = nil
  1700. if mode.grounds.info[n].menu.page == 2 then
  1701. textFormat = {{},system.getTranslation("grounds",n)}
  1702. for k,v in next,textFormat[2] do
  1703. if v[2] ~= "?" then
  1704. tableinsert(textFormat[1],stringformat("<a href='event:info.grounds.%s.%s'><B>%s</B></a>",stringgsub(v[1],"'","#"),stringgsub(v[2],"%.","@"),stringupper(v[1])))
  1705. end
  1706. end
  1707. displayText[2] = stringformat(displayText[2],"• "..tableconcat(textFormat[1],"\n• "))
  1708. elseif mode.grounds.info[n].menu.page == 3 then
  1709. displayText[2] = tableconcat(displayText[2],"\n",function(k,v)
  1710. return mode.grounds.concat(k,v)
  1711. end)
  1712. displayText[2] = "<font size='10'>" .. stringformat(displayText[2],mode.grounds.cmds.profile,mode.grounds.cmds.shop,mode.grounds.cmds.langue,mode.grounds.cmds.help,mode.grounds.cmds.leaderboard,mode.grounds.cmds.info,mode.grounds.cmds.mapinfo,mode.grounds.cmds.pw)
  1713. elseif mode.grounds.info[n].menu.page == 4 then
  1714. displayText[2] = stringformat(displayText[2] .. "\n\n%s",#mode.grounds.maps.."<N>","<BV><a href='event:print.atelier801¬com/topic?f=6&t=845005'>#"..stringupper(module._NAME).." MAP SUBMISSIONS</a></BV>",tableconcat(mode.grounds.G,"\n",function(k,v)
  1715. return stringformat("<font color='#%s'><a href='event:info.mapCategory.%s'>G%2d</a> : %3d</font>",v.color,k,k,#v.queue)
  1716. end))
  1717. elseif mode.grounds.info[n].menu.page == 5 then
  1718. local concat = {}
  1719. for i,j in next,{{"translators","<CEP>"},{"mapEvaluators","<BV>"}} do
  1720. concat[#concat+1] = j[2] .. tableconcat(mode.grounds.staff[j[1]],"<G>, " .. j[2],function(k,v)
  1721. return stringformat("<a href='event:info.%s.%s'>%s</a>",j[1],k,v[1])
  1722. end)
  1723. end
  1724. displayText[2] = stringformat(displayText[2],"Bolodefchoco",concat[1],concat[2])
  1725. end
  1726. end
  1727.  
  1728. ui.addTextArea(17,"<font size='1'>\n</font><p align='center'><J><B><a href='event:menu.right'>»</a>",n,543,352,40,20,1,1,1,true)
  1729. ui.addTextArea(18,"<font size='1'>\n</font><p align='center'><J><B><a href='event:menu.left'>«</a>",n,217,352,40,20,1,1,1,true)
  1730.  
  1731. ui.addTextArea(19,"<font size='1'>\n</font><p align='center'><PT><B><a href='event:menu.popup'>"..popup.d.."</a>",n,popup.x[1],137,20,20,1,1,1,true)
  1732. ui.addTextArea(20,popup.txt,n,popup.x[2],137,115,125,0x123e54,1,1,true)
  1733.  
  1734. ui.addTextArea(21,"<p align='center'><B><R><a href='event:menu.close'>X",n,543,42,20,20,1,1,1,true)
  1735. ui.addTextArea(22,"<p align='center'><font size='20'><V><B>"..stringupper(displayText[1]).."</B></V><font size='15'>\n<R>_____________\n\n<font size='11'><N><p align='left'>"..displayText[2],n,260,42,280,330,0x073247,1,1,true)
  1736. end,
  1737. -- Info
  1738. uidisplayInfo = function(n,data)
  1739. local what = data[2]
  1740. local title,text,color = "","",""
  1741. if what == "grounds" then
  1742. color = "<N>"
  1743. title = stringgsub(data[3],"#","'")
  1744. local info = stringgsub(data[4],"@",".")
  1745. local groundTxt = system.getTranslation("grounds.12",n)
  1746. if info == groundTxt[2] then
  1747. local colors = {}
  1748. for k,v in next,groundTxt[4] do
  1749. colors[#colors+1] = stringformat("<PT>[•] <N2><font color='#%s'>(#%s)</a> <BL>- <PS>%s",k,k,v)
  1750. end
  1751. text = tableconcat(colors,"\n")
  1752. else
  1753. text = stringformat("<PT>[•] <PS>%s",info)
  1754. end
  1755. elseif what == "mapCategory" then
  1756. data[3] = tonumber(data[3])
  1757. color = "<S>"
  1758. title = "G"..data[3]
  1759. text = stringformat("%s\n# %s\n@ %s",mode.grounds.G[data[3]].name,#mode.grounds.G[data[3]].queue,system.getTranslation("categories." .. data[3],n))
  1760. if mode.grounds.info[n].infoImage[#mode.grounds.info[n].infoImage] then
  1761. tfm.exec.removeImage(mode.grounds.info[n].infoImage[#mode.grounds.info[n].infoImage])
  1762. end
  1763. mode.grounds.info[n].infoImage[#mode.grounds.info[n].infoImage + 1] = tfm.exec.addImage(mode.grounds.G[data[3]].icon[1] .. ".png","&4",360 + mode.grounds.G[data[3]].icon[2],125 + mode.grounds.G[data[3]].icon[3],n)
  1764. elseif mode.grounds.staff[what] then
  1765. local comp = data[3]
  1766. local info = mode.grounds.staff[what][tonumber(comp)]
  1767. title = info[1]
  1768. if what == "translators" then
  1769. color = "<CEP>"
  1770. text = stringformat("[•] !%s %s",mode.grounds.cmds.langue,tableconcat(tableturnTable(info[2]),", "))
  1771. elseif what == "mapEvaluators" then
  1772. color = "<BV>"
  1773. text = stringformat("[•] %s",info[2])
  1774. end
  1775. end
  1776. ui.addTextArea(37,"<p align='center'><B><R><a href='event:info.close'>X",n,528,115,20,20,1,1,1,true)
  1777. ui.addTextArea(38,"<p align='center'><font size='20'><V><B>" .. title .. "</B>" .. color .. (mode.grounds.staff[what] and " •" or "") .. "\n\n<p align='left'><font size='13'>" .. text,n,275,115,250,160,0x073247,1,1,true)
  1778. end,
  1779. -- Leaderboard
  1780. uileaderboard = function(n)
  1781. if os.time() > mode.grounds.leaderboard.update or not n then
  1782. mode.grounds.leaderboard = {update = os.time() + 180e3,data = {}}
  1783.  
  1784. local players = {}
  1785. for k,v in next,mode.grounds.info do
  1786. if stringsub(k,1,1) ~= "*" then
  1787. players[#players + 1] = {k,mathfloor((v.stats.rounds - v.stats.deaths)/10) * (v.stats.podiums + 1)}
  1788. end
  1789. end
  1790. tablesort(players,function(p1,p2) return p1[2] > p2[2] end)
  1791.  
  1792. for k,v in next,players do
  1793. mode.grounds.info[v[1]].ranking = k
  1794. if k < 11 then
  1795. tableinsert(mode.grounds.leaderboard.data,"<J>"..k..". " .. (({"<BV>","<PS>","<CE>"})[k] or "<V>") .. "<a href='event:profile.open."..v[1].."'>".. v[1] .. "</a> <BL>- <VP>" .. v[2] .. "G")
  1796. end
  1797. end
  1798. if #mode.grounds.leaderboard.data == 0 then
  1799. mode.grounds.leaderboard.update = 0
  1800. end
  1801. end
  1802.  
  1803. if n then
  1804. mode.grounds.info[n].leaderboardAccessing = true
  1805. local id,y = 25,100
  1806. ui.addTextArea(23,"<p align='center'><B><R><a href='event:ranking.close'>X",n,603,35,20,20,1,1,1,true)
  1807. ui.addTextArea(24,"<p align='center'><font size='45'>" .. stringnick(mode.grounds.cmds.leaderboard),n,200,35,400,350,0x073247,1,1,true)
  1808.  
  1809. for i = 1,10 do
  1810. local v = mode.grounds.leaderboard.data[i] or ""
  1811. local color = id % 2 == 0 and 0x123e54 or 0x042636
  1812. if stringfind(v,n) then
  1813. v = stringgsub(v,"'>(.-)</a>",function(name)
  1814. return "'><a:active>"..name.."</a:active></a>"
  1815. end)
  1816. end
  1817. ui.addTextArea(id,v,n,245,y,315,20,color,color,1,true)
  1818. id = id + 1
  1819. y = y + 28
  1820. end
  1821.  
  1822. ui.addTextArea(id,"",n,230,90,10,285,0x073247,0x073247,1,true)
  1823. ui.addTextArea(id + 1,"",n,565,90,10,285,0x073247,0x073247,1,true)
  1824. end
  1825. end,
  1826. -- Grounds system
  1827. gsys = {
  1828. -- Ground system
  1829. grounds = {},
  1830. disabledGrounds = {},
  1831. collisionArea = {34,40,50,50,40,34,34,35,0,0,40,35,35,23,0,0},
  1832. getTpPos = function(g,center)
  1833. if center then
  1834. return {g.X,g.Y}
  1835. else
  1836. local ang = stringsplit(g.P,"[^,]+",tonumber)
  1837. ang = ang[5]
  1838. local hTP = {g.X,g.Y}
  1839. if ang == 90 or ang == -270 then
  1840. hTP[1] = hTP[1] + g.L/2
  1841. elseif ang == -90 or ang == 270 then
  1842. hTP[1] = hTP[1] - g.L/2
  1843. elseif mathabs(ang) == 180 then
  1844. hTP[2] = hTP[2] + g.H/2
  1845. else
  1846. hTP[2] = hTP[2] - g.H/2
  1847. end
  1848.  
  1849. return hTP
  1850. end
  1851. end,
  1852. onGround = function(t,px,py)
  1853. local prop = stringsplit(t.P,"[^,]+",tonumber)
  1854.  
  1855. px,py = px or 0,py or 0
  1856. local offset = {}
  1857. local isOn = false
  1858.  
  1859. local w = tonumber(t.L)
  1860. local h = tonumber(t.H)
  1861. local x = tonumber(t.X)
  1862. local y = tonumber(t.Y)
  1863. local gtype = tonumber(t.T)
  1864. gtype = mathsetLim(gtype,0,15) -- mathmin(15,mathmax(0,gtype))
  1865.  
  1866. if not tablefind({8,9,15},gtype) then
  1867. local area = mode.grounds.gsys.collisionArea[gtype + 1]
  1868. w = w + area
  1869. h = h + area
  1870. end
  1871.  
  1872. if gtype == 13 then
  1873. isOn = mathpythag(x,y,px,py,w)
  1874. else
  1875. local ang = mathrad(prop[5])
  1876.  
  1877. local range = {w = w/2,h = h/2}
  1878.  
  1879. local cosA = mathcos(ang)
  1880. local sinA = mathsin(ang)
  1881.  
  1882. local vxA = {x = ((-range.w * cosA - (-range.h) * sinA) + x),y = ((-range.w * sinA + (-range.h) * cosA) + y)}
  1883. local vxB = {x = ((range.w * cosA - (-range.h) * sinA) + x),y = ((range.w * sinA + (-range.h) * cosA) + y)}
  1884. local vxC = {x = ((range.w * cosA - range.h * sinA) + x),y = ((range.w * sinA + range.h * cosA) + y)}
  1885. local vxD = {x = ((-range.w * cosA - range.h * sinA) + x),y = ((-range.w * sinA + range.h * cosA) + y)}
  1886. offset = {vxA,vxB,vxC,vxD}
  1887.  
  1888. local p = 4
  1889. for i = 1,4 do
  1890. if (offset[i].y < py and offset[p].y >= py) or (offset[p].y < py and offset[i].y >= py) then
  1891. if offset[i].x + (py - offset[i].y) / (offset[p].y - offset[i].y) * (offset[p].x - offset[i].x) < px then
  1892. isOn = not isOn
  1893. end
  1894. end
  1895. p = i
  1896. end
  1897. end
  1898.  
  1899. return isOn
  1900. end,
  1901. getGroundProperties = function(xml)
  1902. mode.grounds.gsys.grounds = {}
  1903. stringgsub(xml,"<S (.-)/>", function(parameters)
  1904. local attributes = {}
  1905. stringgsub(parameters,"([%-%w]+)=([\"'])(.-)%2",function(tag,_,value)
  1906. attributes[tag] = tonumber(value) or value
  1907. end)
  1908. mode.grounds.gsys.grounds[#mode.grounds.gsys.grounds + 1] = attributes
  1909. end)
  1910. end,
  1911. groundEffects = function()
  1912. for n,p in next,tfm.get.room.playerList do
  1913. if not p.isDead then
  1914. local affected = false
  1915. for id = 1,#mode.grounds.gsys.grounds do
  1916. local ground = mode.grounds.gsys.grounds[id]
  1917. local newId = id - 1
  1918. if (ground.disablepower or stringsub(ground.P,1,1) == "1" or (ground.v and (_G.currentTime - 3) == (tonumber(ground.v)/1000))) and not mode.grounds.gsys.disabledGrounds[newId] then
  1919. -- If the ground has the disablepower attribute, or is dynamic, or the v despawner attribute exists (after it disappear)
  1920. mode.grounds.gsys.disabledGrounds[newId] = true
  1921. end
  1922. if not mode.grounds.gsys.disabledGrounds[newId] and _G.currentTime >= 3 then
  1923. if mode.grounds.gsys.onGround(ground,p.x,p.y) then
  1924. affected = true
  1925. local gtype = ground.T
  1926. local color = stringupper(tostring(ground.o or ""))
  1927. mode.grounds.info[n].powersOP.GTYPE = gtype
  1928. if gtype == 1 or color == "89A7F5" then -- ice
  1929. system.bindKeyboard(n,32,true,true)
  1930. if color ~= "" then
  1931. mode.grounds.info[n].powersOP.GTYPE = 1
  1932. end
  1933. elseif gtype == 2 or color == "6D4E94" then -- trampoline
  1934. if color ~= "" then
  1935. mode.grounds.info[n].powersOP.GTYPE = 2
  1936. end
  1937. elseif gtype == 3 or color == "D84801" then -- lava
  1938. if color ~= "" then
  1939. mode.grounds.info[n].powersOP.GTYPE = 3
  1940. end
  1941. id = (id > 1 and id - 1 or #mode.grounds.gsys.grounds)
  1942. local g = mode.grounds.gsys.grounds[id]
  1943. local hTP = mode.grounds.gsys.getTpPos(g)
  1944. tfm.exec.displayParticle(36,p.x,p.y,0,0,0,0,n)
  1945. tfm.get.room.playerList[n].x = 0
  1946. tfm.get.room.playerList[n].y = 0
  1947. tfm.exec.movePlayer(n,hTP[1],hTP[2])
  1948. tfm.exec.displayParticle(36,hTP[1],hTP[2],0,0,0,0,n)
  1949. elseif gtype == 8 or color == "9BAABC" then -- cloud
  1950. system.bindKeyboard(n,32,true,true)
  1951. elseif gtype == 7 then -- sand
  1952. ui.addTextArea(-1,"",n,-1500,-1500,3e3,3e3,0xE5CC5D,0xE5CC5D,mode.grounds.stormIntensities[mode.grounds.info[n].stats.powers.sand[1]],false)
  1953. for i = 1,2 do
  1954. tfm.exec.displayParticle(26,mathrandom(800),mathrandom(350),0,0,0,0,n)
  1955. tfm.exec.displayParticle(27,mathrandom(800),mathrandom(350),0,0,0,0,n)
  1956. end
  1957. elseif gtype == 9 then -- water
  1958. if mode.grounds.hasWater then
  1959. mode.grounds.info[n].drown = mode.grounds.info[n].drown + mathrandom(1,mathfloor(mode.grounds.info[n].stats.powers.water[1]))
  1960. mode.grounds.uibar(1,n,mode.grounds.info[n].drown,0x519DDA,100,20)
  1961. if mode.grounds.info[n].drown > 99 then
  1962. tfm.exec.killPlayer(n)
  1963. mode.grounds.uibar(1,n,mode.grounds.info[n].drown,0xDA516D,100,20)
  1964. mode.grounds.info[n].drown = 0
  1965. for i = 1,8 do
  1966. tfm.exec.displayParticle(14,p.x+mathrandom(-50,50),p.y+mathrandom(-20,20),0,-1,0,0,n)
  1967. end
  1968. end
  1969. for i = 1,mathrandom(2,4) do
  1970. tfm.exec.displayParticle(14,p.x+mathrandom(-50,50),p.y+mathrandom(-20,20),0,-1,0,0,n)
  1971. end
  1972. end
  1973. elseif gtype == 10 then -- stone
  1974. system.bindKeyboard(n,32,true,true)
  1975. elseif gtype == 11 or color == "E7F0F2" then -- snow
  1976. system.bindKeyboard(n,32,true,true)
  1977. elseif gtype == 12 or gtype == 13 then -- retangle or circle
  1978. if color == "C90909" then
  1979. tfm.exec.killPlayer(n)
  1980. elseif color == "18C92B" then
  1981. if os.time() > mode.grounds.respawn then
  1982. mode.grounds.respawn = os.time() + 7e3
  1983. for k,v in next,tfm.get.room.playerList do
  1984. if v.isVampire then
  1985. tfm.exec.killPlayer(k)
  1986. elseif v.isDead and mode.grounds.info[k].canRev then
  1987. tfm.exec.respawnPlayer(k)
  1988. end
  1989. end
  1990. end
  1991. elseif color == "555D77" then
  1992. mode.grounds.info[n].checkpoint = id
  1993. end
  1994. elseif gtype == 15 then -- web
  1995. tfm.exec.movePlayer(n,mode.grounds.spawnPoint[1],mode.grounds.spawnPoint[2])
  1996. tfm.get.room.playerList[n].x = 0
  1997. tfm.get.room.playerList[n].y = 0
  1998. end
  1999. end
  2000. end
  2001. end
  2002. if not affected then
  2003. mode.grounds.info[n].powersOP.GTYPE = -1
  2004. end
  2005. end
  2006. end
  2007. end,
  2008. },
  2009. -- Init
  2010. reset = function()
  2011. -- Settings and modes
  2012. mode.grounds.welcomeMessage = (function()
  2013. if system.roomNumber == 666 then
  2014. return {"<R>","<R>","<R>","<R>"}
  2015. else
  2016. return {"<BV>","<PT>","<BV>","<VP>"}
  2017. end
  2018. end)()
  2019.  
  2020. mode.grounds.isHouse = system.roomNumber == 801 or system.officialMode[1] == "village"
  2021.  
  2022. -- Data
  2023. mode.grounds.info = {}
  2024.  
  2025. -- Maps
  2026. mode.grounds.rotation = {1,{9,7,4,1,5,7,10,8,6,11,2,1,3,5}}
  2027. end,
  2028. init = function()
  2029. mode.grounds.translations.pt = mode.grounds.translations.br
  2030.  
  2031. -- Sets the main language according to the community
  2032. if mode.grounds.translations[tfm.get.room.community] then
  2033. mode.grounds.langue = tfm.get.room.community
  2034. end
  2035.  
  2036. -- Shuffle the map rotation
  2037. for k,v in next,mode.grounds.G do
  2038. v.queue = tableshuffle(v.queue)
  2039. end
  2040.  
  2041. -- Map list
  2042. for k,v in next,mode.grounds.G do
  2043. for i,j in next,v.queue do
  2044. mode.grounds.maps[#mode.grounds.maps + 1] = {j,k}
  2045. end
  2046. end
  2047.  
  2048. -- Organizates the staff table
  2049. for k,v in next,mode.grounds.staff do
  2050. tablesort(v,function(t1,t2) return t2[1] > t1[1] end)
  2051. end
  2052.  
  2053. -- Organizes the languages
  2054. mode.grounds.langues = (function()
  2055. local l = {}
  2056. for id in next,mode.grounds.translations do
  2057. l[#l + 1] = stringupper(id)
  2058. end
  2059. tablesort(l)
  2060. return l
  2061. end)()
  2062.  
  2063. -- Translation indexes
  2064. mode.grounds.translationIndexes = mode.grounds.listener(mode.grounds.translations.en,{})
  2065.  
  2066. -- Sets the shop prices, upgrades, etc
  2067. mode.grounds.shop.grounds = {
  2068. -- Ground ID, #Possible upgrades (Imgs), Price average, Upgrade average
  2069. [1] = {1,mode.grounds.shop.unpackImages(1,3),1.05,1.5},
  2070. [2] = {7,mode.grounds.shop.unpackImages(7,4),.4,2},
  2071. [3] = {8,mode.grounds.shop.unpackImages(8,3),1.15,1.47},
  2072. [4] = {9,mode.grounds.shop.unpackImages(9,3),1.6,.6},
  2073. [5] = {10,mode.grounds.shop.unpackImages(10,3),1.1,1.65},
  2074. [6] = {11,mode.grounds.shop.unpackImages(11,5),.5,1.42},
  2075. }
  2076.  
  2077. -- Sets the commands
  2078. mode.grounds.cmds = system.getTranslation("commands")
  2079.  
  2080. -- Disable commands
  2081. for k,v in next,mode.grounds.cmds do
  2082. disableChatCommand(v)
  2083. end
  2084. for k,v in next,{"o","p","h","k","?","pw","time","np","is","check","review","next","again"} do
  2085. disableChatCommand(v)
  2086. end
  2087.  
  2088. -- Official modes running together
  2089. if system.officialMode[1] == "racing" then
  2090. mode.grounds.rotation = {1,{7}}
  2091. elseif system.officialMode[1] == "bootcamp" then
  2092. mode.grounds.rotation = {1,{3}}
  2093. end
  2094.  
  2095. -- House system
  2096. if mode.grounds.isHouse then
  2097. system.isRoom = false
  2098. mode.grounds.rotation = {1,{12}}
  2099. tfm.exec.disableAfkDeath()
  2100. end
  2101.  
  2102. -- Init
  2103. for _,f in next,{"AutoShaman","AutoScore","AutoNewGame","AutoTimeLeft","MinimalistMode","PhysicalConsumables"} do
  2104. tfm.exec["disable"..f]()
  2105. end
  2106. tfm.exec.setAutoMapFlipMode(false)
  2107. tfm.exec.setRoomMaxPlayers(16)
  2108.  
  2109. mode.grounds.alivePlayers,mode.grounds.totalPlayers = system.players()
  2110.  
  2111. mode.grounds.uileaderboard()
  2112. system.newTimer(function()
  2113. tfm.exec.newGame(mode.grounds.newMap())
  2114. end,1000,false)
  2115. end,
  2116. -- Callbacks
  2117. eventTextAreaCallback = function(i,n,c)
  2118. local p = stringsplit(c,"[^%.]+")
  2119. if p[1] == "shop" and os.time() > mode.grounds.info[n].shop.timer then
  2120. mode.grounds.info[n].shop.timer = os.time() + 900
  2121. if p[2] == "left" then
  2122. mode.grounds.info[n].shop.page = mode.grounds.info[n].shop.page - 1
  2123. mode.grounds.uishop(n)
  2124. elseif p[2] == "right" then
  2125. mode.grounds.info[n].shop.page = mode.grounds.info[n].shop.page + 1
  2126. mode.grounds.uishop(n)
  2127. elseif p[2] == "buy" and mode.grounds.info[n].groundsDataLoaded then
  2128. p[3] = tonumber(p[3]) or 0
  2129. if mode.grounds.info[n].stats.groundsCoins >= p[3] then
  2130. mode.grounds.info[n].stats.groundsCoins = mode.grounds.info[n].stats.groundsCoins - p[3]
  2131. local loc = mode.grounds.info[n].stats.powers[p[4]]
  2132. mode.grounds.info[n].stats.powers[p[4]][#loc] = mode.grounds.info[n].stats.powers[p[4]][#loc] + 1
  2133. mode.grounds.info[n].stats.powers[p[4]][1] = mode.grounds.info[n].stats.powers[p[4]][1] * mode.grounds.shop.grounds[mode.grounds.info[n].shop.page][4]
  2134. tfm.exec.chatMessage(stringformat("<PT>[•] <BV>%s",stringformat(system.getTranslation("bought",n),"<J>$"..p[3].."</J>","<ROSE>"..system.getTranslation("grounds."..mode.grounds.shop.grounds[mode.grounds.info[n].shop.page][1],n)[1].."</ROSE>",n)),n)
  2135. mode.grounds.uishop(n)
  2136. else
  2137. tfm.exec.chatMessage(stringformat("<PT>[•] <R>%s",system.getTranslation("cantbuy",n)),n)
  2138. end
  2139. elseif p[2] == "close" then
  2140. for i = 4,13 do
  2141. ui.removeTextArea(i,n)
  2142. end
  2143. mode.grounds.info[n].shop.accessing = false
  2144. for k,v in next,mode.grounds.info[n].shop.image do
  2145. tfm.exec.removeImage(v)
  2146. end
  2147. end
  2148. elseif p[1] == "profile" then
  2149. if p[2] == "close" then
  2150. for i = 14,16 do
  2151. ui.removeTextArea(i,n)
  2152. end
  2153. mode.grounds.info[n].profileAccessing = false
  2154. elseif p[2] == "open" then
  2155. if p[3] then
  2156. mode.grounds.uiprofile(n,p[3])
  2157. else
  2158. mode.grounds.uiprofile(n,n)
  2159. end
  2160. end
  2161. elseif p[1] == "menu" and os.time() > mode.grounds.info[n].menu.timer then
  2162. mode.grounds.info[n].menu.timer = os.time() + 750
  2163. if p[2] == "page" and p[3] then
  2164. mode.grounds.info[n].menu.page = tonumber(p[3])
  2165. mode.grounds.uimenu(n)
  2166. elseif p[2] == "right" then
  2167. mode.grounds.info[n].menu.page = mode.grounds.info[n].menu.page + 1
  2168. mode.grounds.uimenu(n)
  2169. elseif p[2] == "left" then
  2170. mode.grounds.info[n].menu.page = mode.grounds.info[n].menu.page - 1
  2171. mode.grounds.uimenu(n)
  2172. elseif p[2] == "popup" then
  2173. mode.grounds.info[n].menu.showPopup = not mode.grounds.info[n].menu.showPopup
  2174. mode.grounds.uimenu(n)
  2175. elseif p[2] == "close" then
  2176. for i = 22,17,-1 do
  2177. ui.removeTextArea(i,n)
  2178. end
  2179. mode.grounds.info[n].menu.accessing = false
  2180. if mode.grounds.info[n].showHelp then
  2181. mode.grounds.info[n].showHelp = false
  2182. ui.removeTextArea(0,n)
  2183. end
  2184. end
  2185. elseif p[1] == "print" then
  2186. p[2] = stringgsub(p[2],"¬",".")
  2187. tfm.exec.chatMessage(stringformat("<PT>[•] <BV>%s",p[2]),n)
  2188. elseif p[1] == "ranking" then
  2189. if p[2] == "close" then
  2190. mode.grounds.info[n].leaderboardAccessing = false
  2191. for i = 23,36 do
  2192. ui.removeTextArea(i,n)
  2193. end
  2194. end
  2195. elseif p[1] == "info" then
  2196. if p[2] == "close" then
  2197. for i = 37,38 do
  2198. ui.removeTextArea(i,n)
  2199. end
  2200. for k,v in next,mode.grounds.info[n].infoImage do
  2201. tfm.exec.removeImage(v)
  2202. end
  2203. mode.grounds.info[n].infoImage = {}
  2204. else
  2205. mode.grounds.uidisplayInfo(n,p)
  2206. end
  2207. end
  2208. end,
  2209. -- New Player
  2210. eventNewPlayer = function(n)
  2211. tfm.exec.chatMessage(stringformat("%s[•] %s%s\n\n<G>[^_^] %s%s",mode.grounds.welcomeMessage[2],mode.grounds.welcomeMessage[3],stringformat(system.getTranslation("welcome"),"<ROSE>" .. module._NAME .. mode.grounds.welcomeMessage[1]),mode.grounds.welcomeMessage[4],stringformat(system.getTranslation("developer"),"Bolodefchoco")),n)
  2212. if mathrandom(10) < 3 then
  2213. tfm.exec.chatMessage("<ROSE>[•] Play #powers at /room #powers",n)
  2214. end
  2215.  
  2216. if system.isPlayer(n) then
  2217. for _,key in next,mode.grounds.bindKeys do
  2218. if key < 4 then
  2219. system.bindKeyboard(n,key,false,true)
  2220. end
  2221. system.bindKeyboard(n,key,true,true)
  2222. end
  2223. else
  2224. tfm.exec.chatMessage("<R>Souris! :(",n)
  2225. end
  2226. if not mode.grounds.info[n] then
  2227. mode.grounds.info[n] = {
  2228. groundsDataLoaded = true,
  2229. showHelp = true,
  2230. right = true,
  2231. langue = mode.grounds.langue,
  2232. isWalking = false,
  2233. drown = 0,
  2234. ranking = -1,
  2235. canRev = false,
  2236. checkpoint = -1,
  2237. shop = {
  2238. accessing = false,
  2239. page = 0,
  2240. timer = 0,
  2241. image = {},
  2242. },
  2243. menu = {
  2244. accessing = false,
  2245. page = 0,
  2246. timer = 0,
  2247. showPopup = true,
  2248. },
  2249. profileAccessing = false,
  2250. leaderboardAccessing = false,
  2251. profileTimer = 0,
  2252. leaderboardTimer = 0,
  2253. isOnline = true,
  2254. stats = {
  2255. groundsCoins = 1000,
  2256. rounds = 0,
  2257. podiums = 0,
  2258. deaths = 0,
  2259. powers = {
  2260. ice = {25,100,1}, -- power, timer, level
  2261. lava = {0,1}, -- power, level
  2262. sand = {1,1}, -- Txtarea opacity, level
  2263. cloud = {35,100,1}, -- power, timer, level
  2264. water = {5,1}, -- power, level
  2265. stone = {15,2500,700,1}, -- size, despawn timer, timer, level
  2266. snow = {5,100,1}, -- power, timer, level
  2267. spiderweb = {0,1}, -- power, level
  2268. },
  2269. },
  2270. powersOP = {
  2271. TIMER = 0,
  2272. GTYPE = -1,
  2273. },
  2274. infoImage = {},
  2275. }
  2276. if not mode.grounds.isHouse then
  2277. ui.addTextArea(0,"",n,-1500,-1500,3e3,3e3,1,1,.8,true)
  2278. mode.grounds.uimenu(n)
  2279. end
  2280. end
  2281.  
  2282. mode.grounds.info[n].isOnline = true
  2283. mode.grounds.info[n].canRev = false
  2284. end,
  2285. -- New Game
  2286. eventNewGame = function()
  2287. local mapName = {}
  2288. if tablefind(mode.grounds.maps,tfm.get.room.xmlMapInfo.mapCode,1) then
  2289. mapName[#mapName + 1] = "<font color='#".. mode.grounds.mapInfo[5] .."'>G" .. mode.grounds.mapInfo[2] .. "</font>"
  2290. else
  2291. mode.grounds.mapInfo = {0,0,0,0,"CAA4CF"}
  2292. mode.grounds.afterFunction = (function() end)
  2293. end
  2294.  
  2295. tfm.exec.setGameTime(3 * 60)
  2296.  
  2297. mode.grounds.podium = 0
  2298. mode.grounds.availableRoom = system.isRoom and mode.grounds.totalPlayers > 2
  2299. if not mode.grounds.availableRoom then
  2300. if mathrandom(30) < 16 then
  2301. if not system.isRoom then
  2302. tfm.exec.chatMessage(stringformat("<PT>[•] <BV>%s",system.getTranslation("countstats.tribe")))
  2303. else
  2304. tfm.exec.chatMessage(stringformat("<PT>[•] <BV>%s",system.getTranslation("countstats.mice")))
  2305. end
  2306. end
  2307. end
  2308.  
  2309. for k,v in next,mode.grounds.info do
  2310. if not system.isPlayer(k) then
  2311. tfm.exec.killPlayer(k)
  2312. end
  2313. if v.groundsDataLoaded and mode.grounds.availableRoom then
  2314. v.stats.rounds = v.stats.rounds + 1
  2315. end
  2316. v.canRev = true
  2317. v.right = true
  2318. v.checkpoint = -1
  2319. end
  2320.  
  2321. mode.grounds.afterFunction()
  2322.  
  2323. mode.grounds.hasWater = false
  2324. local deactivateWater = mode.grounds.isHouse
  2325.  
  2326. mode.grounds.despawnGrounds = {}
  2327. mode.grounds.gsys.disabledGrounds = {}
  2328. local currentXml = tfm.get.room.xmlMapInfo
  2329.  
  2330. local xmlPowers = {}
  2331. -- Info
  2332. xmlPowers[1] = { -- Soulmate system
  2333. attribute = "A", -- Soulmate not allowed for rooms with odd amount of players
  2334. func = function()
  2335. if mode.grounds.totalPlayers % 2 ~= 0 then
  2336. tableforeach(mode.grounds.info,tfm.exec.killPlayer)
  2337. end
  2338. end
  2339. }
  2340. xmlPowers[2] = { -- Map Width
  2341. attribute = "L",
  2342. func = function(size)
  2343. if size then
  2344. mode.grounds.mapInfo[3] = tonumber(size)
  2345. end
  2346. end
  2347. }
  2348. xmlPowers[3] = { -- Map Height
  2349. attribute = "H",
  2350. func = function(size)
  2351. if size then
  2352. mode.grounds.mapInfo[4] = tonumber(size)
  2353. end
  2354. end
  2355. }
  2356.  
  2357. mode.grounds.mapInfo[3] = mathmax(800,mode.grounds.mapInfo[3])
  2358. mode.grounds.mapInfo[4] = mathmax(400,mode.grounds.mapInfo[4])
  2359. -- Powers
  2360. xmlPowers[4] = { -- mapname
  2361. attribute = "mapname",
  2362. func = function(t)
  2363. if t ~= "" then
  2364. mapName[#mapName + 1] = t
  2365. end
  2366. end
  2367. }
  2368. xmlPowers[5] = { -- disablepower
  2369. attribute = "disablepower",
  2370. func = function(g)
  2371. for ground in stringgmatch(g,"[^,]+") do
  2372. ground = tonumber(ground)
  2373. if ground and not mode.grounds.gsys.disabledGrounds[ground] then
  2374. mode.grounds.gsys.disabledGrounds[ground] = true
  2375. end
  2376. end
  2377. end
  2378. }
  2379. xmlPowers[6] = { -- cheese
  2380. attribute = "cheese",
  2381. func = function()
  2382. tableforeach(mode.grounds.info,tfm.exec.giveCheese)
  2383. end
  2384. }
  2385. xmlPowers[7] = { -- meep
  2386. attribute = "meep",
  2387. func = function()
  2388. tableforeach(mode.grounds.info,tfm.exec.giveMeep)
  2389. end
  2390. }
  2391. xmlPowers[8] = { -- addtime
  2392. attribute = "addtime",
  2393. func = function(minutes)
  2394. tfm.exec.setGameTime((3 + (tonumber(minutes) or 0)) * 60)
  2395. end
  2396. }
  2397. xmlPowers[9] = { -- notwater
  2398. attribute = "notwater",
  2399. func = function()
  2400. deactivateWater = true
  2401. end
  2402. }
  2403. xmlPowers[10] = { -- setvampire
  2404. attribute = "setvampire",
  2405. func = function(coordinates)
  2406. if mode.grounds.totalPlayers > 2 then
  2407. local coord,axY = xml.getCoordinates(coordinates)
  2408.  
  2409. local vampires,p = {},{}
  2410. for k,v in next,mode.grounds.info do
  2411. if v.isOnline then
  2412. p[#p + 1] = k
  2413. end
  2414. end
  2415. local randomVamp = ""
  2416. for i = 1,mathfloor(mode.grounds.totalPlayers/3) do
  2417. repeat
  2418. randomVamp = tablerandom(p)
  2419. until not tablefind(vampires,randomVamp)
  2420. vampires[#vampires + 1] = randomVamp
  2421. end
  2422. for k,v in next,vampires do
  2423. if type(coord) == "table" then
  2424. local c = tablerandom(coord)
  2425. tfm.exec.movePlayer(v,c.x,c.y)
  2426. else
  2427. if axY == 0 then
  2428. tfm.exec.movePlayer(v,coord,mathrandom(10,mode.grounds.mapInfo[4] - 10))
  2429. else
  2430. tfm.exec.movePlayer(v,mathrandom(10,mode.grounds.mapInfo[4] - 10),axY)
  2431. end
  2432. end
  2433. tfm.exec.setVampirePlayer(v)
  2434. end
  2435. else
  2436. tableforeach(mode.grounds.info,tfm.exec.setVampirePlayer)
  2437. end
  2438. end
  2439. }
  2440. xmlPowers[11] = { -- shaman
  2441. attribute = "shaman",
  2442. func = function(t)
  2443. if t ~= "" then
  2444. ui.setShamanName(t)
  2445. end
  2446. end
  2447. }
  2448.  
  2449. xml.attribFunc(currentXml.xml or "",xmlPowers)
  2450.  
  2451. mode.grounds.gsys.getGroundProperties(currentXml.xml)
  2452.  
  2453. if not deactivateWater then
  2454. for k,v in next,mode.grounds.gsys.grounds do
  2455. if v.T == 9 then
  2456. mode.grounds.hasWater = true
  2457. for k,v in next,mode.grounds.info do
  2458. v.drown = 0
  2459. mode.grounds.uibar(1,k,v.drown,0x519DDA,100,20)
  2460. end
  2461. break
  2462. end
  2463. end
  2464. end
  2465. if not mode.grounds.hasWater then
  2466. for i = 1,3 do
  2467. ui.removeTextArea(i)
  2468. end
  2469. end
  2470.  
  2471. local ini = ""
  2472. local D = stringmatch(tfm.get.room.xmlMapInfo.xml,"<D>(.-)</D>") or ""
  2473. for k,v in next,{"DS","T"} do
  2474. ini = stringmatch(D,"<"..v.." (.-)/>")
  2475. if ini then
  2476. break
  2477. end
  2478. end
  2479. ini = ini or ""
  2480. local sX = stringmatch(ini,"X=\"(.-)\"")
  2481. local sY = stringmatch(ini,"Y=\"(.-)\"")
  2482. mode.grounds.spawnPoint = {tonumber(sX) or 0,tonumber(sY) or 0}
  2483.  
  2484. ui.setMapName(tableconcat(mapName," <G>|<J> ") .. (#mapName > 0 and " <G>|<J> " or "") .. currentXml.author .. " <BL>- " .. tfm.get.room.currentMap)
  2485. end,
  2486. -- Loop
  2487. eventLoop = function()
  2488. mode.grounds.gsys.groundEffects()
  2489.  
  2490. if _G.currentTime % 5 == 0 then
  2491. mode.grounds.alivePlayers,mode.grounds.totalPlayers = system.players()
  2492. end
  2493.  
  2494. if not mode.grounds.isHouse and _G.currentTime == 3 and mathrandom(50) < 16 and os.time() > mode.grounds.announceTimer then
  2495. mode.grounds.announceTimer = os.time() + 5000
  2496. tfm.exec.chatMessage(stringformat("<PT>[•] <BV>%s",system.getTranslation("powersenabled")))
  2497. end
  2498.  
  2499. if mode.grounds.isHouse then
  2500. if _G.currentTime%5 == 0 then
  2501. if _G.leftTime <= 2 then
  2502. tfm.exec.newGame(mode.grounds.newMap())
  2503. end
  2504. end
  2505. else
  2506. if _G.currentTime%2 == 0 and not mode.grounds.review then
  2507. if mode.grounds.alivePlayers < 1 or _G.leftTime <= 2 then
  2508. tfm.exec.newGame(mode.grounds.newMap())
  2509. elseif mode.grounds.alivePlayers == 1 and _G.leftTime > 50 and mode.grounds.totalPlayers > 1 then
  2510. tfm.exec.setGameTime(30)
  2511. elseif mode.grounds.podium > 5 and mode.grounds.alivePlayers > 3 then
  2512. tfm.exec.setGameTime(20,false)
  2513. end
  2514. end
  2515. end
  2516.  
  2517. --[[
  2518. local grounds = {}
  2519. for k,v in next,mode.grounds.despawnGrounds do
  2520. grounds[k] = v
  2521. end
  2522. for k,v in next,grounds do
  2523. if os.time() > v[2] then
  2524. tfm.exec.removePhysicObject(v[1])
  2525. tableremove(mode.grounds.despawnGrounds,k)
  2526. end
  2527. end
  2528. ]]
  2529.  
  2530. for n,v in next,mode.grounds.info do
  2531. v.isWalking = (tfm.get.room.playerList[n] and (tfm.get.room.playerList[n].movingRight or tfm.get.room.playerList[n].movingLeft) or false)
  2532. v.right = (tfm.get.room.playerList[n] and (tfm.get.room.playerList[n].isFacingRight) or false)
  2533. if v.powersOP.GTYPE ~= 7 then -- Sand
  2534. ui.removeTextArea(-1,n)
  2535. end
  2536. if mode.grounds.hasWater then
  2537. if _G.currentTime%2 == 0 then
  2538. if tfm.get.room.playerList[n] then
  2539. if not tfm.get.room.playerList[n].isDead and v.powersOP.GTYPE ~= 9 then -- Water
  2540. if v.drown > 0 then
  2541. v.drown = v.drown - mathrandom(1,mathfloor(v.stats.powers.water[1]))
  2542. mode.grounds.uibar(1,n,v.drown,0x519DDA,100,20)
  2543. end
  2544. end
  2545. end
  2546. end
  2547. end
  2548. end
  2549. end,
  2550. -- Keyboard
  2551. eventKeyboard = function(n,k,d,x,y)
  2552. tfm.get.room.playerList[n].x = x
  2553. tfm.get.room.playerList[n].x = y
  2554. if tablefind(mode.grounds.bindKeys,k) then
  2555. if k < 4 then
  2556. if k == 0 then
  2557. mode.grounds.info[n].right = false
  2558. elseif k == 2 then
  2559. mode.grounds.info[n].right = true
  2560. end
  2561. elseif k == stringbyte("O") then
  2562. mode.grounds.eventChatCommand(n,"o")
  2563. elseif k == stringbyte("P") then
  2564. if mode.grounds.info[n].profileAccessing then
  2565. mode.grounds.eventTextAreaCallback(nil,n,"profile.close")
  2566. else
  2567. if os.time() > mode.grounds.info[n].profileTimer then
  2568. mode.grounds.info[n].profileTimer = os.time() + 1e3
  2569. mode.grounds.eventChatCommand(n,"p")
  2570. end
  2571. end
  2572. elseif k == stringbyte("H") then
  2573. mode.grounds.eventChatCommand(n,"h")
  2574. elseif k == stringbyte("K") then
  2575. mode.grounds.eventChatCommand(n,"k")
  2576. end
  2577. else
  2578. if k == 32 and os.time() > mode.grounds.info[n].powersOP.TIMER then
  2579. local ms = 0
  2580. local power = {0,0}
  2581. if mode.grounds.info[n].powersOP.GTYPE == 8 then -- Cloud
  2582. power = mode.grounds.info[n].stats.powers.cloud
  2583. ms = power[2]
  2584. tfm.exec.movePlayer(n,0,0,true,0,-power[1],true)
  2585. elseif mode.grounds.info[n].powersOP.GTYPE == 1 and mode.grounds.info[n].isWalking then -- Ice
  2586. power = mode.grounds.info[n].stats.powers.ice
  2587. ms = power[2]
  2588. tfm.exec.movePlayer(n,0,0,false,(mode.grounds.info[n].right and power[1] or -power[1]),0,true)
  2589. elseif mode.grounds.info[n].powersOP.GTYPE == 11 and not mode.grounds.info[n].isWalking then -- Snow
  2590. power = mode.grounds.info[n].stats.powers.snow
  2591. ms = power[2]
  2592. tfm.exec.addShamanObject(34,x + (mode.grounds.info[n].right and 20 or -20),y - 5,0,(mode.grounds.info[n].right and power[1] or -power[1]))
  2593. tfm.exec.playEmote(n,26)
  2594. elseif mode.grounds.info[n].powersOP.GTYPE == 10 and not mode.grounds.info[n].isWalking then -- Stone
  2595. power = mode.grounds.info[n].stats.powers.stone
  2596. local id = tfm.get.room.playerList[n].id
  2597. if not mode.grounds.despawnGrounds[id] then--if not tablefind(mode.grounds.despawnGrounds,id,1) then
  2598. ms = power[3]
  2599. local halfSize = (power[1]/2) + 15
  2600. tfm.exec.addPhysicObject(id,x + (mode.grounds.info[n].right and halfSize or -halfSize),y + 32 - halfSize,{
  2601. type = 10,
  2602. miceCollision = true,
  2603. groundCollision = false,
  2604. width = power[1],
  2605. height = power[1],
  2606. friction = .3,
  2607. restitution = 0
  2608. })
  2609. mode.grounds.despawnGrounds[id] = true
  2610.  
  2611. system.newTimer(function()
  2612. tfm.exec.removePhysicObject(id)
  2613. mode.grounds.despawnGrounds[id] = nil
  2614. end,power[2],false)
  2615. --tableinsert(mode.grounds.despawnGrounds,{id,os.time() + power[2]})
  2616. end
  2617. end
  2618. mode.grounds.info[n].powersOP.TIMER = os.time() + ms
  2619. system.bindKeyboard(n,32,true,false)
  2620. end
  2621. mode.grounds.info[n].powersOP.GTYPE = -1
  2622. end
  2623. end,
  2624. -- Commands
  2625. eventChatCommand = function(n,c)
  2626. if system.isPlayer(n) then
  2627. c = deactivateAccents(c)
  2628. system.disableChatCommandDisplay(c,true)
  2629. local p = stringsplit(c,"[^%s]+",stringlower)
  2630. disableChatCommand(p[1])
  2631. if (p[1] == mode.grounds.cmds.shop or p[1] == "o") and not mode.grounds.isHouse then
  2632. if mode.grounds.info[n].shop.accessing then
  2633. mode.grounds.eventTextAreaCallback(nil,n,"shop.close")
  2634. else
  2635. if os.time() > mode.grounds.info[n].shop.timer then
  2636. mode.grounds.info[n].shop.timer = os.time() + 1200
  2637. mode.grounds.uishop(n)
  2638. end
  2639. end
  2640. elseif (p[1] == mode.grounds.cmds.profile or p[1] == "p") and not mode.grounds.isHouse then
  2641. if p[2] then
  2642. p[2] = stringnick(p[2])
  2643. if mode.grounds.info[p[2]] then
  2644. mode.grounds.uiprofile(n,p[2])
  2645. end
  2646. else
  2647. mode.grounds.uiprofile(n,n)
  2648. end
  2649. mode.grounds.info[n].profileAccessing = true
  2650. elseif p[1] == mode.grounds.cmds.help or p[1] == "h" then
  2651. if mode.grounds.info[n].menu.accessing then
  2652. mode.grounds.eventTextAreaCallback(nil,n,"menu.close")
  2653. else
  2654. if os.time() > mode.grounds.info[n].menu.timer then
  2655. mode.grounds.info[n].menu.timer = os.time() + 1e3
  2656. mode.grounds.uimenu(n)
  2657. end
  2658. end
  2659. elseif p[1] == mode.grounds.cmds.langue then
  2660. p[2] = p[2] and stringlower(p[2]) or nil
  2661. if p[2] and (p[2] == "default" or mode.grounds.translations[p[2]]) then
  2662. if p[2] == "default" then
  2663. mode.grounds.info[n].langue = (mode.grounds.translations[tfm.get.room.playerList[n].community] and tfm.get.room.playerList[n].community or mode.grounds.langue)
  2664. else
  2665. mode.grounds.info[n].langue = stringlower(p[2])
  2666. end
  2667. tfm.exec.chatMessage(stringformat("<PT>[•] <BV>%s",stringformat(system.getTranslation("language",n),stringupper(mode.grounds.info[n].langue))),n)
  2668. else
  2669. tfm.exec.chatMessage(stringformat("<PT>[•] <J>!%s <PS>%s",p[1],tableconcat(mode.grounds.langues," <G>-</G> ")),n)
  2670. end
  2671. elseif (p[1] == mode.grounds.cmds.leaderboard or p[1] == "k") and not mode.grounds.isHouse then
  2672. if mode.grounds.info[n].leaderboardAccessing then
  2673. mode.grounds.eventTextAreaCallback(nil,n,"ranking.close")
  2674. else
  2675. if os.time() > mode.grounds.info[n].leaderboardTimer then
  2676. mode.grounds.info[n].leaderboardTimer = os.time() + 1e3
  2677. mode.grounds.uileaderboard(n)
  2678. end
  2679. end
  2680. elseif p[1] == mode.grounds.cmds.info or p[1] == "?" then
  2681. local grounds = system.getTranslation("grounds",n)
  2682. local ground = grounds[mode.grounds.info[n].powersOP.GTYPE]
  2683. if ground then
  2684. mode.grounds.uidisplayInfo(n,{"info","grounds",stringgsub(ground[1],"'","#"),ground[2]})
  2685. end
  2686. elseif p[1] == "mapinfo" and mode.grounds.mapInfo[2] > 0 then
  2687. tfm.exec.chatMessage(stringformat("<PT>[•] <BV>G%s (%s) - %s - @%s",mode.grounds.mapInfo[2],mode.grounds.G[mode.grounds.mapInfo[2]].name,tfm.get.room.xmlMapInfo.author,mode.grounds.mapInfo[1]),n)
  2688. else
  2689. local isAdmin,isMapEv,isTranslator = system.roomAdmins[n],tablefind(mode.grounds.staff.mapEvaluators,n,1),tablefind(mode.grounds.staff.translators,n,1)
  2690. if p[1] == mode.grounds.cmds.pw or p[1] == "pw" then
  2691. if isAdmin then
  2692. local newPassword = p[2] and tableconcat(p," ",nil,2) or ""
  2693. local pwMsg = system.getTranslation("password")
  2694. if newPassword == "" then
  2695. tfm.exec.chatMessage(stringformat("<R>[•] %s",pwMsg.off))
  2696. else
  2697. local xxx = stringrep("*",#newPassword)
  2698. for k in next,mode.grounds.info do
  2699. if system.roomAdmins[k] and system.isPlayer(k) then
  2700. tfm.exec.chatMessage(stringformat("<R>[•] %s",stringformat(pwMsg.on,newPassword)),k)
  2701. else
  2702. tfm.exec.chatMessage(stringformat("<R>[•] %s",stringformat(pwMsg.on,xxx)),k)
  2703. end
  2704. end
  2705. end
  2706. tfm.exec.setRoomPassword(newPassword)
  2707. else
  2708. tfm.exec.chatMessage("<ROSE>[•] /room #" .. module._NAME .. mathrandom(0,999) .. "@" .. n,n)
  2709. end
  2710. end
  2711. if not system.isRoom then
  2712. local permission = (mode.grounds.isHouse and system.roomAdmins[n] or isMapEv)
  2713. if p[1] == "time" and permission then
  2714. tfm.exec.setGameTime(p[2] or 1e7)
  2715. elseif p[1] == "np" and p[2] and permission then
  2716. mode.grounds.mapInfo = {0,0,0,0,"CAA4CF"}
  2717. tfm.exec.newGame(p[2])
  2718. elseif p[1] == "review" and isMapEv then
  2719. mode.grounds.review = not mode.grounds.review
  2720. tfm.exec.chatMessage("<BV>[•] REVIEW MODE : " .. stringupper(tostring(mode.grounds.review)),n)
  2721. tfm.exec.disableAfkDeath(mode.grounds.review)
  2722. if mode.grounds.review then
  2723. tableforeach(mode.grounds.info,tfm.exec.respawnPlayer)
  2724. end
  2725. elseif p[1] == "next" and _G.currentTime > 10 and permission then
  2726. tfm.exec.newGame(mode.grounds.newMap())
  2727. elseif p[1] == "again" and _G.currentTime > 10 and permission then
  2728. if tfm.get.room.currentMap then
  2729. tfm.exec.newGame(tfm.get.room.currentMap)
  2730. end
  2731. end
  2732. end
  2733. if p[1] == "is" and (mode.grounds.isHouse or isMapEv) then
  2734. p[2] = p[2] or tfm.get.room.currentMap
  2735. p[2] = tonumber(stringmatch(p[2],"@?(%d+)")) or 0
  2736.  
  2737. local exist,index = tablefind(mode.grounds.maps,p[2],1)
  2738. local cat = exist and mode.grounds.maps[index][2] or 0
  2739. tfm.exec.chatMessage(stringformat("<BV>[•] @%s : %s",p[2],stringupper(tostring(exist)) .. (exist and " (G"..cat..")" or "")),n)
  2740. end
  2741. if p[1] == "check" and isTranslator then
  2742. p[2] = p[2] and stringlower(p[2]) or nil
  2743. if p[2] and mode.grounds.translations[p[2]] then
  2744. local newP3 = p[3] and system.loadTable("mode.grounds.translations."..p[2].."."..p[3]) or {}
  2745. if newP3 and type(newP3) == "string" then
  2746. tfm.exec.chatMessage("<CEP>[•] [" .. p[3] .. "] : <N><VI>\"</VI>" .. newP3 .. "<VI>\"</VI>",n)
  2747. else
  2748. tfm.exec.chatMessage("<CEP>[•] " .. (p[3] and "Invalid! Try one of these indexes:" or "!" .. p[1] .. " " .. p[2] .. " <VI>id"),n)
  2749. for k,v in next,mode.grounds.translationIndexes do
  2750. tfm.exec.chatMessage("<N>\t\t" .. v,n)
  2751. end
  2752. end
  2753. else
  2754. tfm.exec.chatMessage("<CEP>[•] !" .. p[1] .. " " .. tableconcat(mode.grounds.langues," <G>-</G> "),n)
  2755. end
  2756. end
  2757. end
  2758. end
  2759. end,
  2760. -- Victory
  2761. eventPlayerWon = function(n)
  2762. if mode.grounds.availableRoom and mode.grounds.info[n].groundsDataLoaded and system.isPlayer(n) then
  2763. mode.grounds.podium = mode.grounds.podium + 1
  2764.  
  2765. if mode.grounds.podium < 4 then
  2766. mode.grounds.info[n].stats.podiums = mode.grounds.info[n].stats.podiums + 1
  2767.  
  2768. local addedCoins = 20 - mode.grounds.podium * 5
  2769. mode.grounds.info[n].stats.groundsCoins = mode.grounds.info[n].stats.groundsCoins + addedCoins
  2770. tfm.exec.setPlayerScore(n,4-podium,true)
  2771. tfm.exec.chatMessage(stringformat("<PT>[•] <BV>%s",stringformat(system.getTranslation("gotcoin",n),"<J>+$"..addedCoins.."</J>")),n)
  2772.  
  2773. if mode.grounds.podium == 1 then
  2774. tfm.exec.setGameTime(60,false)
  2775. end
  2776. else
  2777. if mode.grounds.podium == 4 then
  2778. tfm.exec.setGameTime(30,false)
  2779. end
  2780.  
  2781. mode.grounds.info[n].stats.groundsCoins = mode.grounds.info[n].stats.groundsCoins + 1
  2782. tfm.exec.setPlayerScore(n,1,true)
  2783. end
  2784.  
  2785. if mode.grounds.hasWater then
  2786. mode.grounds.uibar(1,n,mode.grounds.info[n].drown,0x6FDA51,100,20)
  2787. end
  2788.  
  2789. if system.miscAttrib ~= 0 then
  2790. if mode.grounds.podium == system.miscAttrib then
  2791. tfm.exec.setGameTime(0)
  2792. end
  2793. end
  2794. end
  2795.  
  2796. if mode.grounds.review or mode.grounds.isHouse then
  2797. tfm.exec.respawnPlayer(n)
  2798. else
  2799. mode.grounds.info[n].canRev = false
  2800. end
  2801. end,
  2802. -- Died
  2803. eventPlayerDied = function(n)
  2804. if mode.grounds.info[n].groundsDataLoaded and mode.grounds.availableRoom then
  2805. mode.grounds.info[n].stats.deaths = mode.grounds.info[n].stats.deaths + 1
  2806. end
  2807. if mode.grounds.hasWater then
  2808. if mode.grounds.info[n].drown > 0 then
  2809. mode.grounds.uibar(1,n,mode.grounds.info[n].drown,0xDA516D,100,20)
  2810. end
  2811. end
  2812.  
  2813. system.bindKeyboard(n,32,true,false)
  2814. ui.removeTextArea(-1,n)
  2815.  
  2816. if mode.grounds.review or mode.grounds.isHouse then
  2817. tfm.exec.respawnPlayer(n)
  2818. end
  2819. end,
  2820. -- Left
  2821. eventPlayerLeft = function(n)
  2822. if mode.grounds.info[n] then
  2823. mode.grounds.info[n].isOnline = false
  2824. end
  2825. end,
  2826. -- Respawn
  2827. eventPlayerRespawn = function(n)
  2828. if mode.grounds.info[n].checkpoint ~= -1 then
  2829. local g = mode.grounds.gsys.grounds[mode.grounds.info[n].checkpoint]
  2830. local hTP = mode.grounds.gsys.getTpPos(g,true)
  2831. tfm.exec.movePlayer(n,hTP[1],hTP[2])
  2832. end
  2833. if mode.grounds.info[n].groundsDataLoaded and mode.grounds.availableRoom then
  2834. mode.grounds.info[n].stats.rounds = mode.grounds.info[n].stats.rounds + 1
  2835. end
  2836. if mode.grounds.hasWater then
  2837. mode.grounds.uibar(1,n,mode.grounds.info[n].drown,0x519DDA,100,20)
  2838. end
  2839.  
  2840. if not mode.grounds.isHouse then
  2841. tfm.exec.chatMessage(stringformat("<R>[•] %s",system.getTranslation("zombie",n)),n)
  2842. end
  2843. end,
  2844. }
  2845.  
  2846. --[[ Jokenpo ]]--
  2847. mode.jokenpo = {
  2848. -- Translations
  2849. translations = {
  2850. en = {
  2851. -- Init
  2852. welcome = "Welcome to <ROSE>#Jokenpo<CE>! Choose a chair, press space and start playing!\n\tReport any issue to Bolodefchoco",
  2853.  
  2854. -- Simple words
  2855. round = "Round",
  2856. players = "Players",
  2857. won = "won the round!",
  2858. tie = "Tie!",
  2859. victory = "won the game!",
  2860.  
  2861. -- Info
  2862. guide = "Press\n\t<PS>»</PS> %s<PT> - Rock</PT>\n\t<PS>»</PS> %s<PT> - Paper</PT>\n\t<PS>»</PS> %s<PT> - Scissor (Pufferfish)</PT>",
  2863.  
  2864. -- Game
  2865. items = {"Rock","Paper","Scissor"},
  2866. selected = "You've selected the item %s!",
  2867. },
  2868. br = {
  2869. welcome = "Bem-vindo ao <ROSE>#Jokenpo<CE>! Escolha uma cadeira, aperte espaço e comece a jogar!\n\tReporte qualquer problema para Bolodefchoco",
  2870.  
  2871. round = "Partida",
  2872. players = "Jogadores",
  2873. won = "venceu a partida!",
  2874. tie = "Empate!",
  2875. victory = "ganhou!",
  2876.  
  2877. guide = "Pressione\n\t<PS>»</PS> %s<PT> - Pedra</PT>\n\t<PS>»</PS> %s<PT> - Papel</PT>\n\t<PS>»</PS> %s<PT> - Tesoura (Baiacu)</PT>",
  2878.  
  2879. items = {"Pedra","Papel","Tesoura"},
  2880. selected = "Você selecionou o item %s!",
  2881. },
  2882. },
  2883. langue = "en",
  2884. -- Maps
  2885. maps = {5198315,4093087},
  2886. buildSquares = function(c)
  2887. tfm.exec.removePhysicObject(1)
  2888. for k,v in next,{{346,224},{454,224},{400,105}} do
  2889. for i = 1,4 do
  2890. local x = i == 1 and v[1] + 28 or i == 2 and v[1] - 28 or v[1]
  2891. local y = i == 3 and v[2] + 28 or i == 4 and v[2] - 28 or v[2]
  2892.  
  2893. local w = x == v[1] and 46 or 10
  2894. local h = w == 10 and 66 or 10
  2895.  
  2896. tfm.exec.addPhysicObject(i..k,x,y,{
  2897. type = 12,
  2898. color = c[k],
  2899. width = w,
  2900. height = h,
  2901. })
  2902. end
  2903. end
  2904. end,
  2905. -- New Round Settings
  2906. playing = false,
  2907. players = {},
  2908. colors = {0xE3454D,0x4577E3,0x45E374},
  2909. timer = 9.5,
  2910. partialTimer = 0,
  2911. tie = 0,
  2912. round = 0,
  2913. roundsPerGame = 5,
  2914. -- Game settings
  2915. objects = {
  2916. 85,
  2917. 95,
  2918. 65,
  2919. },
  2920. -- Emotes
  2921. emote = {
  2922. sit = 8,
  2923. victory = 24,
  2924. fail = 5,
  2925. tie = 4,
  2926. no = 2
  2927. },
  2928. -- Battle
  2929. decision = function()
  2930. for i = 1,2 do
  2931. mode.jokenpo.players[i].obj = mode.jokenpo.players[i].obj ~= 0 and mode.jokenpo.players[i].obj or false
  2932. if mode.jokenpo.players[i].obj then
  2933. mode.jokenpo.players[i].remId = tfm.exec.addShamanObject(mode.jokenpo.objects[mode.jokenpo.players[i].obj],({350,455})[i],200)
  2934. end
  2935. end
  2936.  
  2937. local winner = ((mode.jokenpo.players[1].obj and mode.jokenpo.players[2].obj) and ((3 + mode.jokenpo.players[1].obj - mode.jokenpo.players[2].obj) % 3) or mode.jokenpo.players[1].obj and 1 or mode.jokenpo.players[2].obj and 2 or 0)
  2938.  
  2939. if winner == 0 then
  2940. mode.jokenpo.tie = mode.jokenpo.tie + 1
  2941. tfm.exec.chatMessage("<CE>[•] <J>" .. system.getTranslation("tie"))
  2942.  
  2943. for k,v in next,mode.jokenpo.players do
  2944. tfm.exec.playEmote(v.name,mode.jokenpo.emote.tie)
  2945. end
  2946. else
  2947. mode.jokenpo.players[winner].score = mode.jokenpo.players[winner].score + 1
  2948. tfm.exec.playEmote(mode.jokenpo.players[winner].name,mode.jokenpo.emote.victory)
  2949.  
  2950. local looser = (winner == 1 and 2 or 1)
  2951. local looserEmote = mode.jokenpo.emote.fail
  2952. if not mode.jokenpo.players[looser].obj then
  2953. looserEmote = mode.jokenpo.emote.no
  2954. end
  2955. tfm.exec.playEmote(mode.jokenpo.players[looser].name,looserEmote)
  2956.  
  2957. tfm.exec.chatMessage("<CE>[•] " .. mode.jokenpo.players[winner].color .. mode.jokenpo.players[winner].name .. " " .. system.getTranslation("won"))
  2958. end
  2959.  
  2960. ui.addTextArea(5,stringformat("<font size='50'><p align='center'>%s%d <PT>| <J>%d <PT>| %s%s",mode.jokenpo.players[1].color,mode.jokenpo.players[1].score,mode.jokenpo.tie,mode.jokenpo.players[2].color,mode.jokenpo.players[2].score),nil,5,270,795,nil,1,1,0,true)
  2961. end,
  2962. -- Partial Next Round
  2963. pNextRound = function()
  2964. mode.jokenpo.playing = false
  2965. mode.jokenpo.timer = 9.5
  2966. mode.jokenpo.partialTimer = 3.5
  2967. mode.jokenpo.decision()
  2968. if mode.jokenpo.round == mode.jokenpo.roundsPerGame then
  2969. tablesort(mode.jokenpo.players,function(p1,p2) return p1.score > p2.score end)
  2970. if (mode.jokenpo.players[1].score == mode.jokenpo.players[2].score) or (mode.jokenpo.tie > mode.jokenpo.players[1].score) then
  2971. tfm.exec.chatMessage("<CE>[•] " .. system.getTranslation("tie"))
  2972. else
  2973. tfm.exec.chatMessage("<CE>[•] " .. mode.jokenpo.players[1].color .. mode.jokenpo.players[1].name .. " " .. system.getTranslation("victory"))
  2974. end
  2975. end
  2976. end,
  2977. -- Next Round
  2978. nextRound = function()
  2979. for i = 1,2 do
  2980. if mode.jokenpo.players[i].remId then
  2981. tfm.exec.removeObject(mode.jokenpo.players[i].remId)
  2982. end
  2983. mode.jokenpo.players[i].remId = nil
  2984. mode.jokenpo.players[i].obj = 0
  2985. end
  2986. ui.removeTextArea(5,nil)
  2987. mode.jokenpo.partialTimer = 0
  2988. if mode.jokenpo.roundsPerGame > mode.jokenpo.round then
  2989. mode.jokenpo.playing = true
  2990. mode.jokenpo.round = mode.jokenpo.round + 1
  2991. else
  2992. mode.jokenpo.playing = false
  2993. mode.jokenpo.round = 0
  2994. mode.jokenpo.tie = 0
  2995. mode.jokenpo.timer = 9.5
  2996. mode.jokenpo.partialTimer = 0
  2997. mode.jokenpo.players = {}
  2998. tfm.exec.newGame(tablerandom(mode.jokenpo.maps))
  2999. for i = 2,3 do
  3000. ui.removeTextArea(i,nil)
  3001. end
  3002. end
  3003. mode.jokenpo.uiinfo()
  3004. end,
  3005. -- Display names
  3006. displayNames = function()
  3007. if #mode.jokenpo.players == 0 then
  3008. return ""
  3009. else
  3010. return " <G>| <N>" .. system.getTranslation("players") .. " : " .. tableconcat(mode.jokenpo.players," <V>- ",function(k,v)
  3011. tfm.exec.setNameColor(v.name,mode.jokenpo.colors[v.id])
  3012. return v.color .. v.name
  3013. end)
  3014. end
  3015. end,
  3016. -- Info textareas
  3017. uiinfo = function()
  3018. ui.addTextArea(0,"<p align='center'><font size='35'><J>"..mathfloor(mode.jokenpo.timer),nil,380,85,40,40,1,1,0,true)
  3019. ui.addTextArea(1,"<p align='center'><font size='25'><J><B>X</B><font size='13'>\n"..stringformat("%02d",mode.jokenpo.tie),nil,380,207,40,nil,1,1,0,true)
  3020.  
  3021. for k,v in next,mode.jokenpo.players do
  3022. ui.addTextArea(v.id + 1,"<p align='center'>"..v.name.."\n"..stringformat("%02d",v.score),nil,v.x,165,105,nil,1,1,0,true)
  3023. end
  3024.  
  3025. ui.setMapName("<PT>#Jokenpo <G>| <N>" .. system.getTranslation("round") .. " : <V>" .. mode.jokenpo.round .. mode.jokenpo.displayNames() .. "<")
  3026. end,
  3027. -- Init
  3028. reset = function()
  3029. -- Scores
  3030. mode.jokenpo.tie = 0
  3031. mode.jokenpo.round = 0
  3032. mode.jokenpo.roundsPerGame = 5
  3033.  
  3034. -- Data
  3035. mode.jokenpo.players = {}
  3036. mode.jokenpo.playing = false
  3037.  
  3038. -- Timers
  3039. mode.jokenpo.timer = 9.5
  3040. mode.jokenpo.partialTimer = 0
  3041. end,
  3042. init = function()
  3043. mode.jokenpo.translations.pt = mode.jokenpo.translations.br
  3044.  
  3045. -- Sets the main language according to the community
  3046. if mode.jokenpo.translations[tfm.get.room.community] then
  3047. mode.jokenpo.langue = tfm.get.room.community
  3048. end
  3049.  
  3050. -- Sets the rounds per game
  3051. mode.jokenpo.roundsPerGame = mathmax(5,system.miscAttrib)
  3052.  
  3053. -- Init
  3054. for _,f in next,{"AutoShaman","AutoNewGame","PhysicalConsumables","AfkDeath"} do
  3055. tfm.exec["disable"..f]()
  3056. end
  3057. tfm.exec.setAutoMapFlipMode(false)
  3058. tfm.exec.setRoomMaxPlayers(20)
  3059.  
  3060. tfm.exec.newGame(tablerandom(mode.jokenpo.maps))
  3061. end,
  3062. -- New Player
  3063. eventNewPlayer = function(n)
  3064. tfm.exec.chatMessage("<CE>[•] " .. system.getTranslation("welcome"),n)
  3065.  
  3066. for k,v in next,{32,stringbyte("BNM",1,3)} do
  3067. system.bindKeyboard(n,v,true,true)
  3068. end
  3069.  
  3070. if mode.jokenpo.playing then
  3071. mode.jokenpo.round = mode.jokenpo.round + 1
  3072. else
  3073. tfm.exec.respawnPlayer(n)
  3074. end
  3075.  
  3076. mode.jokenpo.buildSquares(mode.jokenpo.colors)
  3077. mode.jokenpo.uiinfo()
  3078. end,
  3079. -- New Game
  3080. eventNewGame = function()
  3081. if mode.jokenpo.playing then
  3082. for k,v in next,tfm.get.room.playerList do
  3083. if not tablefind(mode.jokenpo.players,k,"name") then
  3084. tfm.exec.killPlayer(k)
  3085. end
  3086. end
  3087. end
  3088.  
  3089. mode.jokenpo.colors = {0xE3454D,0x4577E3,0x45E374}
  3090. xml.attribFunc(tfm.get.room.xmlMapInfo.xml or "",{
  3091. [1] = {
  3092. attribute = "o",
  3093. func = function(color)
  3094. local c = stringsplit(color,"[^,]+",function(o)
  3095. return stringmatch(o,"#?(.+)")
  3096. end)
  3097.  
  3098. for i = 1,#c do
  3099. mode.jokenpo.colors[i] = tonumber(c[i],16)
  3100. end
  3101. end
  3102. }
  3103. })
  3104.  
  3105. mode.jokenpo.buildSquares(mode.jokenpo.colors)
  3106. mode.jokenpo.uiinfo()
  3107. end,
  3108. -- Keyboard
  3109. eventKeyboard = function(n,k,d,x,y)
  3110. if k == 32 and #mode.jokenpo.players < 2 then
  3111. for k,v in next,{{285,330,270},{515,330,425}} do
  3112. if mathpythag(v[1],v[2],x,y,30) then
  3113. if not tablefind(mode.jokenpo.players,n,"name") then
  3114. if not tablefind(mode.jokenpo.players,k,"id") then
  3115. mode.jokenpo.players[#mode.jokenpo.players + 1] = {
  3116. name = n,
  3117. x = v[3],
  3118. score = 0,
  3119. color = stringformat("<font color='#%s'>",stringformat("%x",mode.jokenpo.colors[k])),
  3120. id = k,
  3121. obj = 0,
  3122. remId = nil,
  3123. }
  3124.  
  3125. tfm.exec.chatMessage("<CE>[•] " .. mode.jokenpo.players[#mode.jokenpo.players].color .. stringformat(system.getTranslation("guide"),"B","N","M"),n)
  3126.  
  3127. mode.jokenpo.uiinfo()
  3128. tfm.exec.playEmote(n,mode.jokenpo.emote.sit)
  3129. end
  3130. end
  3131. end
  3132. end
  3133.  
  3134. if #mode.jokenpo.players == 2 then
  3135. tablesort(mode.jokenpo.players,function(p1,p2) return p1.id < p2.id end)
  3136. mode.jokenpo.playing = true
  3137.  
  3138. mode.jokenpo.round = mode.jokenpo.round + 1
  3139. mode.jokenpo.uiinfo()
  3140. end
  3141. else
  3142. if mode.jokenpo.playing then
  3143. local foundObject,objectIndex = tablefind({stringbyte("BNM",1,3)},k)
  3144. if foundObject then
  3145. local found,i = tablefind(mode.jokenpo.players,n,"name")
  3146. if found then
  3147. i = mode.jokenpo.players[i]
  3148. if i.obj == 0 then
  3149. i.obj = objectIndex
  3150.  
  3151. tfm.exec.chatMessage("<CE>[•] " .. i.color .. stringformat(system.getTranslation("selected"),system.getTranslation("items")[objectIndex]),n)
  3152. end
  3153. end
  3154. end
  3155. end
  3156. end
  3157. end,
  3158. -- Loop
  3159. eventLoop = function()
  3160. if mode.jokenpo.playing then
  3161. if mode.jokenpo.timer > 0 then
  3162. mode.jokenpo.timer = mode.jokenpo.timer - .5
  3163. ui.addTextArea(0,"<p align='center'><font size='35'><J>"..mathfloor(mode.jokenpo.timer),nil,380,85,40,40,1,1,0,true)
  3164. for i = 1,2 do
  3165. tfm.exec.movePlayer(mode.jokenpo.players[i].name,({285,515})[i],330)
  3166. tfm.exec.playEmote(mode.jokenpo.players[i].name,26)
  3167. end
  3168. else
  3169. mode.jokenpo.pNextRound()
  3170. end
  3171. else
  3172. if mode.jokenpo.partialTimer > 0 then
  3173. mode.jokenpo.partialTimer = mode.jokenpo.partialTimer - .5
  3174. ui.addTextArea(0,"<p align='center'><font size='35'><PT>"..mathfloor(mode.jokenpo.partialTimer),nil,380,85,40,40,1,1,0,true)
  3175.  
  3176. if mode.jokenpo.partialTimer <= 0 then
  3177. mode.jokenpo.nextRound()
  3178. end
  3179. end
  3180. end
  3181. end,
  3182. -- Player Left
  3183. eventPlayerLeft = function(n)
  3184. if tablefind(mode.jokenpo.players,n,"name") then
  3185. mode.jokenpo.round = mode.jokenpo.roundsPerGame
  3186. mode.jokenpo.nextRound()
  3187. end
  3188. end,
  3189. }
  3190.  
  3191. --[[ Click ]]--
  3192. mode.click = {
  3193. -- Translations
  3194. translations = {
  3195. en = {
  3196. -- Init
  3197. welcome = "<BV>Welcome to <CH><B>#click</B><BV>!\n\t» Type <B>!p Playername</B> to open the profile of the player\n\t» Report any issue to <B>Bolodefchoco</B>",
  3198.  
  3199. -- Info
  3200. newGame = "New game in %s seconds!",
  3201. clickfast = "Click several times in the circle before %s seconds!",
  3202.  
  3203. -- Simple words
  3204. click = "CLICK!",
  3205. won = "won!",
  3206.  
  3207. -- Profile
  3208. profile = "Total clicks <BL>: <V>%s\n<J>High Score <BL>: <V>%s\n\n<J>Victories <BL>: <V>%s",
  3209. },
  3210. br = {
  3211. welcome = "<BV>Bem-vindo ao <CH><B>#click</B><BV>!\n\t\n\t» Digite <B>!p Jogador</B> para abrir o perfil do jogador\n\t» Reporte qualquer problema para <B>Bolodefchoco</B>",
  3212.  
  3213. newGame = "Novo jogo em %s segundos!",
  3214. clickfast = "Clique várias vezes no círculo antes de %s segundos!",
  3215.  
  3216. click = "CLIQUE!",
  3217. won = "venceu!",
  3218.  
  3219. profile = "Cliques totais <BL>: <V>%s\n<J>Maior pontuação <BL>: <V>%s\n\n<J>Vitórias <BL>: <V>%s",
  3220. },
  3221. },
  3222. langue = "en",
  3223. -- Data
  3224. info = {},
  3225. -- System
  3226. circle = {
  3227. id = 0,
  3228. status = false
  3229. },
  3230. spawnCircle = function(on)
  3231. if mode.click.circle.id > 0 then
  3232. tfm.exec.removeJoint(mode.click.circle)
  3233. end
  3234.  
  3235. mode.click.circle = {id = 1,status = on}
  3236.  
  3237. local color = on and 0x53D08B or 0x555D77
  3238.  
  3239. tfm.exec.addJoint(1,0,0,{
  3240. type = 0,
  3241. alpha = .9,
  3242. color = color,
  3243. foreground = false,
  3244. line = 300,
  3245. point1 = "400,200",
  3246. point2 = "400,201"
  3247. })
  3248. end,
  3249. -- Timers
  3250. partialTimer = 1,
  3251. counter = 0,
  3252. -- Ranking
  3253. uileaderboard = function()
  3254. local data = {}
  3255. for k,v in next,mode.click.info do
  3256. if v.canPlay and v.roundClick > 0 then
  3257. data[#data + 1] = {k,v.roundClick}
  3258. end
  3259.  
  3260. if v.highScore < v.roundClick then
  3261. v.highScore = v.roundClick
  3262. end
  3263. v.totalClick = v.totalClick + v.roundClick
  3264. v.roundClick = 0
  3265. end
  3266.  
  3267. tablesort(data,function(p1,p2) return p1[2] > p2[2] end)
  3268.  
  3269. local str = ""
  3270. for k,v in next,data do
  3271. if k < 51 then
  3272. if k == 1 then
  3273. mode.click.info[v[1]].victories = mode.click.info[v[1]].victories + 1
  3274. tfm.exec.chatMessage("<J>" .. v[1] .. " <G>" .. system.getTranslation("won"))
  3275. tfm.exec.setPlayerScore(v[1],1,true)
  3276. end
  3277.  
  3278. str = str .. stringformat("<J>%s. <V>%s <BL>- <PT>%sP\n",k,v[1],v[2])
  3279. end
  3280. end
  3281.  
  3282. ui.addTextArea(1,str,nil,5,30,250,330,1,1,.9,true)
  3283. end,
  3284. -- Init
  3285. reset = function()
  3286. -- Data
  3287. mode.click.info = {}
  3288. end,
  3289. init = function()
  3290. mode.click.translations.pt = mode.click.translations.br
  3291.  
  3292. -- Sets the main language according to the community
  3293. if mode.click.translations[tfm.get.room.community] then
  3294. mode.click.langue = tfm.get.room.community
  3295. end
  3296.  
  3297. -- Init
  3298. for _,f in next,{"AutoShaman","AutoScore","AutoNewGame","AfkDeath"} do
  3299. tfm.exec["disable"..f]()
  3300. end
  3301.  
  3302. tfm.exec.newGame(5993911)
  3303. end,
  3304. -- New Player
  3305. eventNewPlayer = function(n)
  3306. system.bindMouse(n,true)
  3307. if not mode.click.info[n] then
  3308. mode.click.info[n] = {
  3309. canPlay = false,
  3310. totalClick = 0,
  3311. roundClick = 0,
  3312. highScore = 0,
  3313. victories = 0,
  3314. }
  3315. end
  3316. if not mode.click.circle.status then
  3317. tfm.exec.respawnPlayer(n)
  3318. mode.click.info[n].canPlay = true
  3319. end
  3320. tfm.exec.chatMessage(system.getTranslation("welcome"),n)
  3321. end,
  3322. -- New Game
  3323. eventNewGame = function()
  3324. mode.click.spawnCircle(false)
  3325. mode.click.partialTimer = 10.5
  3326. end,
  3327. -- Loop
  3328. eventLoop = function()
  3329. if mode.click.partialTimer > 0 then
  3330. mode.click.partialTimer = mode.click.partialTimer - .5
  3331. ui.setMapName(stringformat(system.getTranslation("newGame"),"<ROSE>"..mathfloor(mode.click.partialTimer).."<J>") .. "<")
  3332. if mode.click.partialTimer <= 0 then
  3333. mode.click.spawnCircle(true)
  3334.  
  3335. mode.click.counter = mathmax(20,system.miscAttrib)
  3336.  
  3337. for k,v in next,mode.click.info do
  3338. v.canPlay = true
  3339. tfm.exec.respawnPlayer(k)
  3340. end
  3341.  
  3342. ui.removeTextArea(1,nil)
  3343. ui.setMapName(system.getTranslation("click") .. "<")
  3344. end
  3345. else
  3346. if mode.click.counter > 0 then
  3347. mode.click.counter = mode.click.counter - .5
  3348. ui.addTextArea(0,"<p align='center'><font size='28'>" .. stringformat(system.getTranslation("clickfast"),mathfloor(mode.click.counter)),nil,0,30,800,50,1,1,0,true)
  3349. if mode.click.counter <= 0 then
  3350. mode.click.spawnCircle(false)
  3351.  
  3352. mode.click.partialTimer = 10.5
  3353.  
  3354. ui.removeTextArea(0,nil)
  3355. mode.click.uileaderboard()
  3356. end
  3357. end
  3358. end
  3359. end,
  3360. -- Mouse
  3361. eventMouse = function(n,x,y)
  3362. if mode.click.circle.status then
  3363. if mode.click.info[n].canPlay then
  3364. if mathpythag(400,200,x,y,150) then
  3365. mode.click.info[n].roundClick = mode.click.info[n].roundClick + 1
  3366. tfm.exec.displayParticle(15,mathrandom(150,650),mathrandom(100,300),0,0,0,0,n)
  3367. end
  3368. end
  3369. end
  3370. end,
  3371. -- Commands
  3372. eventChatCommand = function(n,c)
  3373. local p = stringsplit(c,"[^%s]+",stringlower)
  3374. if p[1] == "p" then
  3375. p[2] = p[2] and stringnick(p[2]) or n
  3376. if mode.click.info[p[2]] then
  3377. ui.addTextArea(2,"<p align='center'><font size='18'><a:active><a href='event:close'>"..p[2].."</a><p align='left'><font size='13'>\n<J>" .. stringformat(system.getTranslation("profile"),mode.click.info[p[2]].totalClick,mode.click.info[p[2]].highScore,mode.click.info[p[2]].victories),n,620,295,175,100,1,1,1,true)
  3378. end
  3379. end
  3380. end,
  3381. -- Callbacks
  3382. eventTextAreaCallback = function(i,n,c)
  3383. if c == "close" then
  3384. ui.removeTextArea(2,n)
  3385. end
  3386. end,
  3387. -- Respawn
  3388. eventPlayerDied = function(n)
  3389. tfm.exec.respawnPlayer(n)
  3390. end,
  3391. -- Player Left
  3392. eventPlayerLeft = function(n)
  3393. mode.click.info[n].canPlay = false
  3394. end,
  3395. }
  3396.  
  3397. --[[ Presents ]]--
  3398. mode.presents = {
  3399. -- Translations
  3400. translations = {
  3401. en = {
  3402. -- Init
  3403. welcome = "<J>Welcome to <VP><B>#presents</B><J>! Choose a gap according to the gift represented and good luck! You will win if your three-gifts-sequence is correct!\nType !p PlayerName to open the profile of the specified player\n\n<CE>Developed by Bolodefchoco and projected by Ruamorangos",
  3404.  
  3405. -- Info
  3406. choose = "Choose a gift before <PT>%s seconds!",
  3407. kill = "Those who are out of the correct gift will be dead!",
  3408. newGame = "New game in <PT>%s seconds!",
  3409. nowinner = "No one won!",
  3410. appear = "You will appear in the next game!",
  3411.  
  3412. -- Simple words
  3413. rival = "Rivals",
  3414. won = "won!",
  3415.  
  3416. -- Profile
  3417. profile = "Rounds <BL>: <V>%s\n<J>Gifts <BL>: <V>%s\n\n<J>Victories <BL>: <V>%s",
  3418. },
  3419. br = {
  3420. welcome = "<J>Bem-vindo ao <VP><B>#presents</B><J>! Escolha um buraco de acordo com o presente representado e boa sorte! Você ganhará se sua sequência nos três presentes estiver correta!\nDigite !p Jogador para abrir o perfil o jogador especificado\n\n<CE>Desenvolvido por Bolodefchoco, pedido por Ruamorangos",
  3421.  
  3422. choose = "Escolha um presente antes de <PT>%s segundos!",
  3423. kill = "Aqueles que estão fora do presente correto serão mortos!",
  3424. newGame = "Novo jogo em <PT>%s segundos!",
  3425. nowinner = "Ninguém ganhou!",
  3426. appear = "Você irá aparecer no próximo jogo!",
  3427.  
  3428. rival = "Rivais",
  3429. won = "venceu!",
  3430.  
  3431. profile = "Partidas <BL>: <V>%s\n<J>Presents <BL>: <V>%s\n\n<J>Vitórias <BL>: <V>%s",
  3432. },
  3433. },
  3434. langue = "en",
  3435. -- Data
  3436. info = {},
  3437. -- System
  3438. isRunning = false,
  3439. gifts = {},
  3440. -- Timers
  3441. chooseTimer = 15,
  3442. blockTimer = 0,
  3443. newMapTimer = 0,
  3444. currentGift = 1,
  3445. -- Map
  3446. generateMap = function()
  3447. mode.presents.isRunning = true
  3448. mode.presents.gifts = {
  3449. [1] = tablerandom({2104,2102,2100,2101,2103,2100,2104,2102,2103,2101,2104,2102,2100,2101,2103,2100,2104,2102,2103,2101,2104,2102,2100,2101,2103,2100,2104,2102,2103,2101}),
  3450. [2] = tablerandom({2102,2100,2101,2103,2100,2104,2102,2103,2101,2104,2102,2100,2101,2103,2100,2104,2102,2103,2101,2104,2102,2100,2101,2103,2100,2104,2102,2103,2101,2104}),
  3451. [3] = tablerandom({2100,2101,2103,2100,2104,2102,2103,2101,2104,2102,2100,2101,2103,2100,2104,2102,2103,2101,2104,2102,2100,2101,2103,2100,2104,2102,2103,2101,2104,2102})
  3452. }
  3453.  
  3454. tfm.exec.newGame('<C><P DS="m;250,120,400,120,550,120" D="x_transformice/x_inventaire/'..mode.presents.gifts[1]..'.jpg,230,60;x_transformice/x_inventaire/'..mode.presents.gifts[2]..'.jpg,380,60;x_transformice/x_inventaire/'..mode.presents.gifts[3]..'.jpg,530,60;x_transformice/x_inventaire/2100.jpg,140,320;x_transformice/x_inventaire/2101.jpg,260,320;x_transformice/x_inventaire/2102.jpg,380,320;x_transformice/x_inventaire/2103.jpg,500,320;x_transformice/x_inventaire/2104.jpg,620,320" /><Z><S><S P="1,0.0001,20,0.2,90,1,0,0" H="700" L="15" X="400" c="3" Y="161" T="4" /><S X="100" P="0,0,20,0.2,0,0,0,0" L="40" H="135" c="3" Y="335" T="4" /><S H="135" P="0,0,20,0.2,0,0,0,0" L="40" X="220" c="3" Y="335" T="4" /><S X="340" P="0,0,20,0.2,0,0,0,0" L="40" H="135" c="3" Y="335" T="4" /><S H="135" P="0,0,20,0.2,0,0,0,0" L="40" X="460" c="3" Y="335" T="4" /><S X="580" P="0,0,20,0.2,0,0,0,0" L="40" H="135" c="3" Y="335" T="4" /><S H="40" P="0,0,0.3,0.2,0,0,0,0" L="40" X="100" c="3" Y="160" T="0" /><S X="700" P="0,0,0.3,0.2,0,0,0,0" L="40" H="40" c="3" Y="160" T="0" /><S X="550" P="0,0,0.3,0.2,0,0,0,0" L="40" H="40" c="3" Y="160" T="0" /><S X="400" P="0,0,0.3,0.2,0,0,0,0" L="40" H="40" c="3" Y="160" T="0" /><S X="250" P="0,0,0.3,0.2,0,0,0,0" L="40" H="40" c="3" Y="160" T="0" /><S H="20" P="0,0,0.3,0.2,0,0,0,0" L="800" X="400" Y="10" T="0" /><S H="135" P="0,0,20,0.2,0,0,0,0" L="40" X="700" c="3" Y="335" T="4" /><S X="400" P="0,0,0.3,0.2,0,0,0,0" L="800" H="100" c="3" Y="415" T="0" /><S P="0,0,0.3,0.2,0,0,0,0" H="10" L="50" o="324650" X="745" c="3" Y="138" T="13" /><S X="55" P="0,0,0.3,0.2,0,0,0,0" L="50" o="324650" H="10" c="3" Y="138" T="13" /><S P="0,0,0.3,0.2,0,0,0,0" H="140" L="100" o="324650" X="55" c="3" Y="72" T="12" /><S X="745" P="0,0,0.3,0.2,0,0,0,0" L="100" o="324650" H="140" c="3" Y="72" T="12" /><S P="0,0,0,0,0,0,0,0" H="102" L="581" o="6a7495" X="401" c="4" v="3001" Y="78" T="12" /></S><D /><O /><L><JR M2="10" M1="0" /></L></Z></C>')
  3455. end,
  3456. -- Kill wrong gaps
  3457. killOutOfRange = function()
  3458. local gift = mode.presents.gifts[mode.presents.currentGift] - 2099
  3459. for k,v in next,tfm.get.room.playerList do
  3460. if not v.isDead then
  3461. if v.x >= (gift * 120) and v.x <= (gift * 120 + 80) and v.y > 267 then
  3462. mode.presents.info[k].gifts = mode.presents.info[k].gifts + 1
  3463. tfm.exec.setPlayerScore(k,1,true)
  3464. else
  3465. tfm.exec.killPlayer(k)
  3466. end
  3467. end
  3468. end
  3469. end,
  3470. -- Victory
  3471. victory = function(noone)
  3472. if noone then
  3473. tfm.exec.chatMessage("<J>" .. system.getTranslation("nowinner"))
  3474. mode.presents.chooseTimer = 0
  3475. mode.presents.blockTimer = 0
  3476. else
  3477. tfm.exec.chatMessage("<S>" .. tableconcat(system.players(true),"<J>, <S>",function(k,v)
  3478. mode.presents.info[v].victories = mode.presents.info[v].victories + 1
  3479. return v
  3480. end) .. " <J>" .. system.getTranslation("won"))
  3481. end
  3482. mode.presents.newMapTimer = 10.5
  3483. end,
  3484. -- Init
  3485. reset = function()
  3486. -- Data
  3487. mode.presents.info = {}
  3488. end,
  3489. init = function()
  3490. mode.presents.translations.pt = mode.presents.translations.br
  3491.  
  3492. -- Sets the main language according to the community
  3493. if mode.presents.translations[tfm.get.room.community] then
  3494. mode.presents.langue = tfm.get.room.community
  3495. end
  3496.  
  3497. -- Init
  3498. for _,f in next,{"AutoShaman","AutoNewGame","AutoScore","AfkDeath","MortCommand","DebugCommand","PhysicalConsumables"} do
  3499. tfm.exec["disable"..f]()
  3500. end
  3501. tfm.exec.setRoomMaxPlayers(30)
  3502.  
  3503. mode.presents.generateMap()
  3504.  
  3505. -- Auto Admin
  3506. system.roomAdmins.Ruamorangos = true
  3507. end,
  3508. -- New Player
  3509. eventNewPlayer = function(n)
  3510. if not mode.presents.info[n] then
  3511. mode.presents.info[n] = {
  3512. rounds = 0,
  3513. gifts = 0,
  3514. victories = 0,
  3515. }
  3516. end
  3517.  
  3518. tfm.exec.chatMessage(system.getTranslation("welcome"),n)
  3519.  
  3520. if mode.presents.isRunning then
  3521. local m = "<PT>" .. system.getTranslation("appear")
  3522. ui.addTextArea(0,"<p align='center'><font size='20'><VP>" .. m,n,216,65,365,35,1,1,1,true)
  3523. tfm.exec.chatMessage(m,n)
  3524. else
  3525. tfm.exec.respawnPlayer(n)
  3526. end
  3527. end,
  3528. -- New Game
  3529. eventNewGame = function()
  3530. if mode.presents.isRunning then
  3531. for i,x in next,{250,400,550} do
  3532. tfm.exec.addPhysicObject(i,x,75,{
  3533. type = 12,
  3534. height = 90,
  3535. width = 90,
  3536. miceCollision = false,
  3537. groundCollision = false,
  3538. color = 0x6A7495
  3539. })
  3540. end
  3541. for i = 0,1 do
  3542. ui.removeTextArea(i)
  3543. end
  3544. mode.presents.chooseTimer = 15
  3545. mode.presents.blockTimer = 0
  3546. mode.presents.newMapTimer = 0
  3547. mode.presents.currentGift = 1
  3548. for k,v in next,mode.presents.info do
  3549. v.rounds = v.rounds + 1
  3550. end
  3551. end
  3552. end,
  3553. -- Loop
  3554. eventLoop = function()
  3555. local mapName = "<N>" .. system.getTranslation("rival") .." : <V>" .. mathisNegative(system.players()-1,0)
  3556. if _G.currentTime > 4 and mode.presents.isRunning then
  3557. if mode.presents.chooseTimer > 0 then
  3558. mode.presents.chooseTimer = mode.presents.chooseTimer - .5
  3559.  
  3560. if mode.presents.chooseTimer <= 0 then
  3561. mode.presents.blockTimer = 5
  3562. tfm.exec.addPhysicObject(4,400,270,{
  3563. type = 4,
  3564. height = 10,
  3565. width = 640,
  3566. miceCollision = true,
  3567. groundCollision = false
  3568. })
  3569. tfm.exec.removePhysicObject(mode.presents.currentGift)
  3570. else
  3571. mapName = mapName .. " <G>| <J>" .. stringformat(system.getTranslation("choose"),mathfloor(mode.presents.chooseTimer).."<J>")
  3572. end
  3573.  
  3574. if system.players() == 0 then
  3575. mode.presents.victory(true)
  3576. end
  3577. end
  3578.  
  3579. if mode.presents.blockTimer > 0 then
  3580. mode.presents.blockTimer = mode.presents.blockTimer - .5
  3581.  
  3582. if mode.presents.blockTimer == 2 then
  3583. mode.presents.killOutOfRange()
  3584. end
  3585.  
  3586. if mode.presents.blockTimer <= 0 then
  3587. mode.presents.currentGift = mode.presents.currentGift + 1
  3588. if mode.presents.currentGift > 3 then
  3589. mode.presents.victory()
  3590. else
  3591. tfm.exec.removePhysicObject(4)
  3592. mode.presents.chooseTimer = 15
  3593. end
  3594. else
  3595. mapName = mapName .. " <G>| <R>" .. system.getTranslation("kill")
  3596. end
  3597. end
  3598.  
  3599. if mode.presents.newMapTimer > 0 then
  3600. mode.presents.newMapTimer = mode.presents.newMapTimer - .5
  3601.  
  3602. mapName = "<PS>" .. stringformat(system.getTranslation("newGame"),mathfloor(mode.presents.newMapTimer) .. "<PS>")
  3603. if mode.presents.newMapTimer <= 0 then
  3604. mode.presents.generateMap()
  3605. end
  3606. end
  3607. end
  3608. ui.setMapName(mapName .. "<")
  3609. end,
  3610. -- Commands
  3611. eventChatCommand = function(n,c)
  3612. local p = stringsplit(c,"[^%s]+",stringlower)
  3613. if p[1] == "p" then
  3614. p[2] = p[2] and stringnick(p[2]) or n
  3615. if mode.presents.info[p[2]] then
  3616. ui.addTextArea(1,"<p align='center'><font size='18'><a:active><a href='event:close'>"..p[2].."</a><p align='left'><font size='13'>\n<J>" .. stringformat(system.getTranslation("profile"),mode.presents.info[p[2]].rounds,mode.presents.info[p[2]].gifts,mode.presents.info[p[2]].victories),n,5,30,790,100,1,1,.8,true)
  3617. end
  3618. end
  3619. end,
  3620. -- Callbacks
  3621. eventTextAreaCallback = function(i,n,c)
  3622. if c == "close" then
  3623. ui.removeTextArea(1,n)
  3624. end
  3625. end,
  3626. }
  3627.  
  3628. --[[ Chat ]]--
  3629. mode.chat = {
  3630. -- Translations
  3631. translations = {
  3632. en = {
  3633. -- Init
  3634. welcome = "<J>Welcome to #chat. Enjoy while you are muted ?! Report any issue to Bolodefchoco.",
  3635.  
  3636. -- Info
  3637. loadmap = "loaded by",
  3638. enabled = "enabled",
  3639. disabled = "disabled",
  3640.  
  3641. -- Cats
  3642. shaman = "shaman",
  3643. newGame = "Auto New Game",
  3644.  
  3645. -- Misc
  3646. title = "%s has just unlocked the «%s» title.\n<ROSE>Type /title to choose a title",
  3647. },
  3648. br = {
  3649. welcome = "<J>Bem-vindo ao #chat. Aproveite enquanto você está mutado ?! Reporte qualquer problema para Bolodefchoco.",
  3650.  
  3651. loadmap = "carregado por",
  3652. enabled = "ativado",
  3653. disabled = "desativado",
  3654.  
  3655. shaman = "shaman",
  3656. newGame = "Novo Jogo Automático",
  3657.  
  3658. title = "%s Desbloqueou o título «%s»\n<ROSE>Digite /title para escolher um título.",
  3659. },
  3660. ar = {
  3661. welcome = "<J>مرحبًا بك في #chat. استمتع بينما أنت مكتوم ?! بلغ عن أي مشكلة إلى Bolodefchoco.",
  3662.  
  3663. loadmap = "شُغل بواسطة",
  3664. enabled = "فُعل",
  3665. disabled = "أُلغي",
  3666.  
  3667. shaman = "الشامان",
  3668. newGame = "جولة جديدة تلقائية",
  3669.  
  3670. title = "%s has just unlocked the «%s» title.\n<ROSE>Type /title to choose a title",
  3671. },
  3672. },
  3673. langue = "en",
  3674. -- Data
  3675. info = {},
  3676. data = {},
  3677. displayData = {},
  3678. messageId = 0,
  3679. -- New Game Settings
  3680. hasShaman = false,
  3681. autoNeWGame = false,
  3682. -- Chat settings
  3683. chatTitle = "Chat",
  3684. -- Chat
  3685. chat = function(n,message,update)
  3686. if not update then
  3687. ui.addPopup(0,2,"",n,107,325,565,true)
  3688. end
  3689. ui.addTextArea(0,"",n,108,73,564,253,0x212E35,0x212E35,1,true)
  3690. ui.addTextArea(1,message,n,110,75,560,250,0x324650,0x324650,1,true)
  3691. ui.addTextArea(2,"<p align='center'><B><V>" .. mode.chat.chatTitle,n,108,53,564,20,0x212E35,0x212E35,1,true)
  3692. ui.addTextArea(3,"<p align='right'><B><R><a href='event:close'>X",n,110,54,560,20,1,1,0,true)
  3693. end,
  3694. getTextLength = function(line)
  3695. return stringlen(stringgsub(line,"<.*>",""))
  3696. end,
  3697. loadData = function()
  3698. local message = "<font size='7'>\n</font>"
  3699. for i = 18,1,-1 do
  3700. if #message < 1900 then
  3701. local line = mode.chat.displayData[i] or ""
  3702. message = message .. line
  3703. end
  3704. end
  3705. return message
  3706. end,
  3707. updateToRead = function(n)
  3708. ui.addTextArea(4,"<p align='center'><V><a href='event:open'><B>" .. stringsub(stringlower(mode.chat.chatTitle),1,8) .. "</B> <J>" .. mode.chat.info[n].toRead,n,712,378,80,nil,0x324650,0x212E35,1,true)
  3709. end,
  3710. displayChat = function(n,update)
  3711. local loadedM = mode.chat.loadData()
  3712. if not update then
  3713. mode.chat.chat(n,loadedM)
  3714. else
  3715. for k,v in next,mode.chat.info do
  3716. if v.open then
  3717. mode.chat.chat(k,loadedM,k ~= n)
  3718. else
  3719. v.toRead = v.toRead + 1
  3720. mode.chat.updateToRead(k)
  3721. end
  3722. end
  3723. end
  3724. end,
  3725. newMessage = function(message,n)
  3726. mode.chat.messageId = mode.chat.messageId + 1
  3727. tableinsert(mode.chat.data,{mode.chat.messageId,n,stringgsub(stringgsub(message,"@%((.*)%)",function(text) return text end),"{.-:(.-)}",function(text) return text end)})
  3728.  
  3729. if mode.chat.getTextLength(message) > 50 then
  3730. message = stringsub(message,1,47) .. "..."
  3731. end
  3732. message = stringgsub(message,"<","&lt;") -- < to <
  3733. message = stringgsub(message,"https?","") -- https to ""
  3734. message = stringgsub(message,"://","") -- :// to ""
  3735. message = stringgsub(message,"@%((.*)%)",function(text) -- @(link:text)
  3736. return stringformat("<a href='event:display.%s'>%s</a>",mode.chat.messageId,text)
  3737. end)
  3738.  
  3739. if #message > 0 then
  3740. if stringsub(message,1,1) == "/" then
  3741. mode.chat.eventChatCommand(n,stringsub(message,2))
  3742. else
  3743. message = stringgsub(message,"{(.-):(.-)}",function(color,text) -- {colorTag:Text}
  3744. color = stringupper(color)
  3745. if tablefind({"BV","R","BL","J","N","N2","PT","CE","CEP","CS","S","PS","G","V","VP","VI","ROSE","CH","T"},color) then
  3746. return stringformat("<%s>%s</%s>",color,text,color)
  3747. else
  3748. return text
  3749. end
  3750. end)
  3751. tableinsert(mode.chat.displayData,1,stringformat("<V>[%s] <N>%s\n",n,message))
  3752. end
  3753. end
  3754. end,
  3755. -- Init
  3756. init = function()
  3757. mode.chat.translations.pt = mode.chat.translations.br
  3758. mode.chat.langue = mode.chat.translations[tfm.get.room.community] and tfm.get.room.community or "en"
  3759. tfm.exec.setRoomMaxPlayers(30)
  3760. system.disableChatCommandDisplay("title",true)
  3761. mode.chat.displayChat()
  3762. end,
  3763. -- New Player
  3764. eventNewPlayer = function(n)
  3765. mode.chat.info[n] = {
  3766. open = true,
  3767. toRead = 0,
  3768. }
  3769. mode.chat.displayChat(n)
  3770. tfm.exec.chatMessage(system.getTranslation("welcome"),n)
  3771. end,
  3772. -- Answer bar
  3773. eventPopupAnswer = function(i,n,a)
  3774. if #stringgsub(a," ","") > 0 then
  3775. mode.chat.newMessage(a,n)
  3776. mode.chat.displayChat(n,true)
  3777. else
  3778. mode.chat.displayChat(n)
  3779. end
  3780. end,
  3781. -- Callbacks
  3782. eventTextAreaCallback = function(i,n,c)
  3783. local p = stringsplit(c,"[^%.]+")
  3784. if p[1] == "close" then
  3785. ui.addPopup(0,2,"",n,1e7,1e7)
  3786. for i = 0,3 do
  3787. ui.removeTextArea(i,n)
  3788. end
  3789. mode.chat.info[n].open = false
  3790. mode.chat.updateToRead(n)
  3791. elseif p[1] == "open" then
  3792. mode.chat.info[n].open = true
  3793. mode.chat.info[n].toRead = 0
  3794. mode.chat.displayChat(n)
  3795. ui.removeTextArea(4,n)
  3796. elseif p[1] == "display" then
  3797. local msg = mode.chat.data[tonumber(p[2])]
  3798. tfm.exec.chatMessage(stringformat("<N>> <V>[%s] <N>%s",msg[2],msg[3]),n)
  3799. end
  3800. end,
  3801. -- Commands
  3802. eventChatCommand = function(n,c)
  3803. local p = stringsplit(c,"[^%s]+",stringlower)
  3804. if p[1] == "title" and p[2] and system.roomAdmins[n] then
  3805. mode.chat.chatTitle = stringsub(tableconcat(p," ",nil,2),1,40)
  3806. mode.chat.displayChat()
  3807. elseif p[1] == "np" and p[2] then
  3808. tfm.exec.chatMessage(stringformat("<S>%s %s %s",stringsub(p[2],1,1) == "@" and p[2] or "@" .. p[2],system.getTranslation("loadmap"),n))
  3809. tfm.exec.newGame(p[2])
  3810. elseif p[1] == "sha" then
  3811. mode.chat.hasShaman = not mode.chat.hasShaman
  3812.  
  3813. tfm.exec.chatMessage("<S>• " .. system.getTranslation("shaman") .. " " .. system.getTranslation((mode.chat.hasShaman and "disabled" or "enabled")),n)
  3814. tfm.exec.disableAutoShaman(mode.chat.hasShaman)
  3815. elseif p[1] == "new" then
  3816. mode.chat.autoNeWGame = not mode.chat.autoNeWGame
  3817.  
  3818. tfm.exec.chatMessage("<S>• " .. system.getTranslation("newGame") .. " " .. system.getTranslation((mode.chat.autoNeWGame and "disabled" or "enabled")),n)
  3819. tfm.exec.disableAutoNewGame(mode.chat.autoNeWGame)
  3820. tfm.exec.disableAutoTimeLeft(mode.chat.autoNeWGame)
  3821. elseif stringsub(c,1,6) == "unlock" then
  3822. tfm.exec.chatMessage("<J>" .. stringformat(system.getTranslation("title"),n,stringsub(c,8)),n)
  3823. end
  3824. end,
  3825. }
  3826.  
  3827. --[[ Cannonup ]]--
  3828. mode.cannonup = {
  3829. -- Translations
  3830. translations = {
  3831. en = {
  3832. -- Init
  3833. welcome = "Welcome to #cannonup. Your aim is to be the survivor! <VP>Take care, watermelons are dangerous!\n\t<J>Report any issue to Bolodefchoco.",
  3834.  
  3835. -- Info
  3836. nowinner = "No one won!",
  3837.  
  3838. -- Simple words
  3839. won = "won!",
  3840.  
  3841. -- Profile
  3842. profile = "Rounds : <V>%d</V>\nCheeses : <V>%d</V>\n\nDeaths : <V>%d</V>",
  3843. },
  3844. br = {
  3845. welcome = "Bem-vindo ao #cannonup. Seu objetivo é ser o sobrevivente! <VP>Tome cuidado, melancias são perigosas!\n\t<J>Reporte qualquer problema para Bolodefchoco.",
  3846.  
  3847. nowinner = "Ninguém ganhou!",
  3848.  
  3849. won = "venceu!",
  3850.  
  3851. profile = "Rodadas : <V>%d</V>\nQueijos : <V>%d</V>\n\nMortes : <V>%d</V>",
  3852. },
  3853. },
  3854. langue = "en",
  3855. -- Data
  3856. info = {},
  3857. -- Maps
  3858. maps = {3746497,6001536,3666224,4591929,"#10","#10","#10","#10","#10","#10","#10","#10","#10"},
  3859. -- Settings
  3860. isRunning = false,
  3861. totalPlayers = 0,
  3862. -- New Map Settings
  3863. cannon = {
  3864. x = 0,
  3865. y = 0,
  3866. time = 3,
  3867. amount = 1,
  3868. speed = 20,
  3869. },
  3870. canMessage = false,
  3871. currentXml = -1,
  3872. toDespawn = {},
  3873. alivePlayers = {},
  3874. -- Cannon ID
  3875. getCannon = function()
  3876. local currentMonth = tonumber(os.date("%m"))
  3877.  
  3878. if currentMonth == 12 then
  3879. return 1703 -- Christmas [Ornament]
  3880. elseif currentMonth == 10 then
  3881. return tablerandom({17,1701,1702}) -- Halloween [Normal, Glass, Lollipop]
  3882. elseif currentMonth == 5 and tonumber(os.date("%d")) < 11 then
  3883. return 1704 -- Transformice's Birthday [Shaman]
  3884. elseif currentMonth == 7 then
  3885. return tablerandom({17,1705,1706}) -- Vacations [Normal, Apple, Watermellon]
  3886. else
  3887. return tablerandom({17,17,17,1706}) -- Standard
  3888. end
  3889. end,
  3890. -- Spawn Cannon
  3891. newCannon = function()
  3892. local alive = system.players(true)
  3893. if #alive > 0 then
  3894. local player
  3895. repeat
  3896. player = tfm.get.room.playerList[tablerandom(alive)]
  3897. until not player.isDead
  3898.  
  3899. local coordinates = {
  3900. {player.x,mathrandom() * 700},
  3901. {player.y,mathrandom() * 300},
  3902. {false,false}
  3903. }
  3904.  
  3905. if mode.cannonup.cannon.x ~= 0 then
  3906. coordinates[1][2] = mode.cannonup.cannon.x
  3907. coordinates[3][1] = true
  3908. end
  3909. if mode.cannonup.cannon.y ~= 0 then
  3910. coordinates[2][2] = mode.cannonup.cannon.y
  3911. coordinates[3][2] = true
  3912. end
  3913.  
  3914. if not coordinates[3][2] and coordinates[2][2] > coordinates[2][1] then
  3915. coordinates[2][2] = coordinates[2][1] - mathrandom(100) - 35
  3916. end
  3917. if not coordinates[3][1] and mathabs(coordinates[1][2] - coordinates[1][1]) > 350 then
  3918. coordinates[1][2] = coordinates[1][1] + mathrandom(-100,100)
  3919. end
  3920.  
  3921. local ang = mathdeg(mathatan2(coordinates[2][2] - coordinates[2][1],coordinates[1][2] - coordinates[1][1]))
  3922. tfm.exec.addShamanObject(0,coordinates[1][2] - (coordinates[3][1] and 0 or 10),coordinates[2][2] - (coordinates[3][2] and 0 or 10),ang + 90)
  3923.  
  3924. --system.newTimer(function()
  3925. mode.cannonup.toDespawn[#mode.cannonup.toDespawn + 1] = {tfm.exec.addShamanObject(mode.cannonup.getCannon(),coordinates[1][2],coordinates[2][2],ang - 90,mode.cannonup.cannon.speed),os.time() + 5000}
  3926. --end,mathisNegative((mode.cannonup.cannon.speed - 1) * 500,0),false)
  3927. end
  3928. end,
  3929. -- Profile
  3930. uiprofile = function(p,n)
  3931. ui.addTextArea(1,"\n\n<font size='13'>\n" .. stringformat(system.getTranslation("profile"),mode.cannonup.info[p].round,mode.cannonup.info[p].victory,mode.cannonup.info[p].death),n,300,100,200,150,0x0B282E,0x1B282E,1,true)
  3932. ui.addTextArea(2,"<p align='center'><font size='20'><VP><B><a href='event:close'>"..p.."</a>",n,305,105,190,30,0x244452,0x1B282E,.4,true)
  3933. end,
  3934. -- Update data
  3935. updatePlayers = function()
  3936. local alive,total = system.players()
  3937. mode.cannonup.alivePlayers = system.players(true)
  3938. mode.cannonup.totalPlayers = total
  3939. end,
  3940. -- Init
  3941. reset = function()
  3942. -- Data
  3943. mode.cannonup.info = {}
  3944. end,
  3945. init = function()
  3946. mode.cannonup.translations.pt = mode.cannonup.translations.br
  3947.  
  3948. -- Sets the main language according to the community
  3949. if mode.cannonup.translations[tfm.get.room.community] then
  3950. mode.cannonup.langue = tfm.get.room.community
  3951. end
  3952.  
  3953. -- Init
  3954. for _,f in next,{"AutoShaman","AutoScore","AutoNewGame","AutoTimeLeft","PhysicalConsumables"} do
  3955. tfm.exec["disable"..f]()
  3956. end
  3957. tfm.exec.setRoomMaxPlayers(25)
  3958. tfm.exec.newGame('<C><P /><Z><S><S L="800" o="324650" H="100" X="400" Y="400" T="12" P="0,0,0.3,0.2,0,0,0,0" /></S><D /><O /></Z></C>')
  3959.  
  3960. -- Auto Admin
  3961. system.roomAdmins.Byontr = true
  3962. end,
  3963. -- New Player
  3964. eventNewPlayer = function(n)
  3965. if not mode.cannonup.info[n] then
  3966. mode.cannonup.info[n] = {
  3967. round = 0,
  3968. victory = 0,
  3969. death = 0
  3970. }
  3971. end
  3972.  
  3973. tfm.exec.chatMessage("<J>" .. system.getTranslation("welcome"),n)
  3974. end,
  3975. -- New Game
  3976. eventNewGame = function()
  3977. ui.setMapName("#CannonUp")
  3978.  
  3979. mode.cannonup.cannon = {
  3980. x = 0,
  3981. y = 0,
  3982. time = 3,
  3983. amount = ((mode.cannonup.totalPlayers - (mode.cannonup.totalPlayers % 10)) / 10) + mathsetLim(system.miscAttrib+1,1,5), -- mathmin(5,mathmax(1,system.miscAttrib+1))
  3984. speed = 20,
  3985. }
  3986.  
  3987. mode.cannonup.toDespawn = {}
  3988.  
  3989. if mode.cannonup.currentXml == -1 then
  3990. mode.cannonup.currentXml = 0
  3991. elseif mode.cannonup.currentXml == -2 then
  3992. mode.cannonup.currentXml = -1
  3993. end
  3994.  
  3995. ui.removeTextArea(0,nil)
  3996. if mode.cannonup.isRunning then
  3997. if mode.cannonup.currentXml == 0 then
  3998. tfm.exec.setGameTime(5)
  3999.  
  4000. mode.cannonup.currentXml = xml.addAttrib(tfm.get.room.xmlMapInfo.xml or "",{
  4001. [1] = {
  4002. tag = "BH",
  4003. value = "",
  4004. }
  4005. },false)
  4006. ui.addTextArea(0,"",nil,-1500,-1500,3e3,3e3,0x6A7495,0x6A7495,1,true)
  4007.  
  4008. mode.cannonup.canMessage = false
  4009. else
  4010. tfm.exec.setGameTime(125)
  4011. mode.cannonup.canMessage = true
  4012.  
  4013. if mode.cannonup.totalPlayers > 3 then
  4014. for k,v in next,mode.cannonup.info do
  4015. v.round = v.round + 1
  4016. end
  4017. end
  4018.  
  4019. xml.attribFunc(mode.cannonup.currentXml or "",{
  4020. [1] = {
  4021. attribute = "cn",
  4022. func = function(value)
  4023. local coord,axY = xml.getCoordinates(value)
  4024. if type(coord) == "table" then
  4025. mode.cannonup.cannon.x = coord[1].x
  4026. mode.cannonup.cannon.y = coord[1].y
  4027. else
  4028. if axY == 0 then
  4029. mode.cannonup.cannon.x = coord
  4030. else
  4031. mode.cannonup.cannon.y = coord
  4032. end
  4033. end
  4034. end
  4035. },
  4036. [2] = {
  4037. attribute = "cheese",
  4038. func = function()
  4039. tableforeach(tfm.get.room.playerList,tfm.exec.giveCheese)
  4040. end,
  4041. },
  4042. [3] = {
  4043. attribute = "meep",
  4044. func = function()
  4045. tableforeach(tfm.get.room.playerList,tfm.exec.giveMeep)
  4046. end,
  4047. },
  4048. })
  4049.  
  4050. mode.cannonup.currentXml = 0
  4051. mode.cannonup.canMessage = true
  4052. end
  4053. else
  4054. tfm.exec.setGameTime(1e7)
  4055. mode.cannonup.currentXml = -1
  4056. mode.cannonup.canMessage = false
  4057. end
  4058. end,
  4059. -- Loop
  4060. eventLoop = function()
  4061. mode.cannonup.updatePlayers()
  4062.  
  4063. if mode.cannonup.isRunning then
  4064. if mode.cannonup.totalPlayers < 2 then
  4065. mode.cannonup.isRunning = false
  4066. mode.cannonup.canMessage = false
  4067. mode.cannonup.currentXml = -2
  4068. else
  4069. if mode.cannonup.currentXml == -1 then
  4070. tfm.exec.newGame(tablerandom(mode.cannonup.maps))
  4071. elseif mode.cannonup.currentXml ~= 0 then
  4072. tfm.exec.newGame(mode.cannonup.currentXml)
  4073. else
  4074. if _G.leftTime < 4 or #mode.cannonup.alivePlayers < 2 then
  4075. if mode.cannonup.canMessage and mode.cannonup.totalPlayers > 1 then
  4076. mode.cannonup.canMessage = false
  4077. if #mode.cannonup.alivePlayers > 0 then
  4078. for k,v in next,mode.cannonup.alivePlayers do
  4079. tfm.exec.giveCheese(v)
  4080. tfm.exec.playerVictory(v)
  4081. if mode.cannonup.totalPlayers > 3 then
  4082. mode.cannonup.info[v].victory = mode.cannonup.info[v].victory + 1
  4083. end
  4084. tfm.exec.setPlayerScore(v,5,true)
  4085. end
  4086.  
  4087. tfm.exec.chatMessage("<J>" .. tableconcat(mode.cannonup.alivePlayers,"<G>, <J>") .. " <J>" .. system.getTranslation("won"))
  4088. else
  4089. tfm.exec.chatMessage("<J>" .. system.getTranslation("nowinner"))
  4090. end
  4091. end
  4092. tfm.exec.newGame(tablerandom(mode.cannonup.maps))
  4093. else
  4094. if _G.currentTime > 5 and mode.cannonup.currentXml == 0 then
  4095. if _G.currentTime % mode.cannonup.cannon.time == 0 then
  4096. for i = 1,mode.cannonup.cannon.amount do
  4097. mode.cannonup.newCannon()
  4098. end
  4099. end
  4100.  
  4101. if #mode.cannonup.toDespawn > 0 then
  4102. for i = 1,#mode.cannonup.toDespawn do
  4103. if os.time() > mode.cannonup.toDespawn[i][2] then
  4104. tfm.exec.removeObject(mode.cannonup.toDespawn[i][1])
  4105. end
  4106. end
  4107. end
  4108.  
  4109. if _G.currentTime % 20 == 0 then
  4110. mode.cannonup.cannon.amount = ((mode.cannonup.totalPlayers - (mode.cannonup.totalPlayers % 10)) / 10) + mathsetLim(system.miscAttrib+1,1,5) --mathmin(5,mathmax(1,system.miscAttrib+1))
  4111. mode.cannonup.cannon.speed = mode.cannonup.cannon.speed + 20
  4112. mode.cannonup.cannon.time = mathmax(.5,mode.cannonup.cannon.time-.5)
  4113. end
  4114. end
  4115. end
  4116. end
  4117. end
  4118. else
  4119. if mode.cannonup.currentXml == -2 then
  4120. tfm.exec.newGame('<C><P /><Z><S><S L="800" o="324650" H="100" X="400" Y="400" T="12" P="0,0,0.3,0.2,0,0,0,0" /></S><D /><O /></Z></C>')
  4121. end
  4122.  
  4123. if mode.cannonup.totalPlayers > 1 then
  4124. mode.cannonup.isRunning = true
  4125. end
  4126. end
  4127. end,
  4128. -- Commands
  4129. eventChatCommand = function(n,c)
  4130. local p = stringsplit(c,"[^%s]+",stringlower)
  4131. if p[1] == "p" or p[1] == "profile" then
  4132. if p[2] then
  4133. p[2] = stringnick(p[2])
  4134. if tfm.get.room.playerList[p[2]] then
  4135. mode.cannonup.uiprofile(p[2],n)
  4136. end
  4137. else
  4138. mode.cannonup.uiprofile(n,n)
  4139. end
  4140. end
  4141. end,
  4142. -- Callbacks
  4143. eventTextAreaCallback = function(i,n,c)
  4144. if c == "close" then
  4145. for i = 1,2 do
  4146. ui.removeTextArea(i,n)
  4147. end
  4148. end
  4149. end,
  4150. -- Player Left
  4151. eventPlayerLeft = function()
  4152. mode.cannonup.updatePlayers()
  4153. end,
  4154. -- Player Died
  4155. eventPlayerDied = function(n)
  4156. mode.cannonup.info[n].death = mode.cannonup.info[n].death + 1
  4157. end,
  4158. }
  4159.  
  4160. --[[ Xmas ]]--
  4161. mode.xmas = {
  4162. -- Translations
  4163. translations = {
  4164. en = {"Merry Christmas & Happy New Year!","Christmas is approaching and S4nt4 has a lot to do on his <I>paws</I>. He wants to give all the gifts on time, but he must be fast! Since our dear S4nt4 is clumsy, some gifts will fall and you will have to <CE>collect</CE> them by pressing the <I>space bar</I>! Give the gifts back to S4nt4 when he feels <CE>dizzy</CE> by pressing the <I>space bar</I>!"},
  4165. fr = {"Joyeux Noël et Bonne Année!","Noël approche et S4nt4 en a plein les <I>pattes</I>. Il veut donner tous les cadeaux à temps, mais il doit être rapide ! Puisque notre cher S4nt4 est maladroix, certains cadeaux tombent et vous devrez les, <CE>collecter</CE> en appuyant sur la <I>barre d'espace</I>! Donnez les cadeaux à S4nt4 quand il se sent <CE>étourdi</CE> en appuyant sur la <I>barre d'espace</I>!"},
  4166. br = {"Feliz Natal & Feliz Ano Novo!","O Natal está chegando e S4nt4 tem em suas <I>patas</I> muito o que fazer. Ele quer entregar todos os presentes a tempo, mas ele deve ser rápido! Uma vez que nosso querido S4NT4 é desajeitado, alguns presentes cairão e você terá que <CE>coletá-los</CE> pressionando a <I>barra de espaço</I>! Devolva os presentes ao S4nt4, pressionando a <I>barra de espaço</I>, quando ele se sentir <CE>tonto</CE>!"},
  4167. es = {"¡Feliz Navidad y Próspero Año Nuevo!","La Navidad se está acercando y S4nt4 tiene muchas cosas que hacer con sus <I>patas</I>. Él quiere dar todos los regalos a tiempo, pero debe ser rápido! Puesto que nuestro querido S4nt4 es torpe, algunos regalos caerán y tendrás que <CE>recogerlos</CE> pulsando la <I>barra espaciadora</I>! Regrese los regalos a S4nt4 cuando se sienta <CE>mareado</CE> presionando la <I>barra de espacio</I>!"},
  4168. tr = {"Mutlu Noeller & Mutlu Yıllar!","Noel geliyor ve S4nt4'nın <I>patilerinde</I> yapacağı çok işi var. Bütün hediyeleri zamanında vermek istiyor ama hızlı olması gerek! Sevgili S4nt4'mız sakar olduğu için, bazı hediyeler düşecek ve <I>boşluk tuşuna</I> basarak onları <CE>toplamanız</CE> gerekecek! S4nt4'nın <CE>başı döndüğünde</CE> <I>boşluk tuşuna</I> basarak hediyeleri ona geri verin!"},
  4169. pl = {"Wesołych Świąt i Wesołego Nowego Roku!","Święta nadchodzą, a S4nt4 ma <I>łapki</I> pełne roboty. On chce dać wszystkim prezenty na czas, ale musi się pośpieszyć! Od kiedy nasz S4nt4 jest niezdarny, gubi prezenty, które musicie <CE>pozbierać</CE> wciskając <I>spację</I>! Oddajcie prezenty S4nt4 kiedy jest <CE>oszołomiony</CE> wciskając <I>spację</I>!"},
  4170. ar = {"عيد ميلاد مجيدا و كل عام و أنتم بخير","عيد الميلاد اقترب و<I> يدى </I> سانتا مليئة. يريد سانتا تسليم جميع الهدايا على الوقت, ولكن يجب ان يكون سريعا! ولكن صديقنا العزيز سانتا غير بارع في تسليم الهدايا, بعض الهدايا ستسقط وعليك ان تقوم <CE> بجمع</CE> الهدايا التي سقطت عن طريق الضغط على المسطرة ! وارجاع الهدايا الى صديقنا العزيز سانتا عندما يشعر <CE> بالدوار</CE> عن طريق الضغط على زر المسطرة!"},
  4171. hu = {"Boldog Karácsonyt & Boldog Új Évet!","A Karácsony közeleg, és a Mikulásra pedig <I>rengeteg munka vár<I>. Oda akarja adni az összes ajándékot időben, de muszáj gyorsnak lennie! Mivel a mi Mikulásunk kétbalkezes, néhány ajándék lepottyan és Neked kell <CE>összegyűjteni</CE> azokat, a <I>Szóköz</I> megnyomásával! Vidd vissza a Mikulásnak az ajándékot a <I>Szóköz</I> megnyomásával, amikor Mikulás <CE>megszédül</CE>!"},
  4172. ru = {"С новым годом и Рождеством!","Рождество приближается и S4nt4 направляется к вам! Он очень спешит, чтобы раздать все подарки вовремя! Но так как наш дорогой S4nt4 неуклюж, то некоторые подарки будут падать. Вы должны <CE>собрать</CE> их, нажимая клавишу <I>пробел</I>! Помогите S4nta. <CE>Верните</CE> ему подарки обратно с помощью <I>пробела</I>!"},
  4173. },
  4174. langue = "en",
  4175. -- Data
  4176. info = {},
  4177. gifts = {
  4178. [1] = {
  4179. [1] = "158bb1db61b",
  4180. [2] = 20000,
  4181. };
  4182. [2] = {
  4183. [1] = "158bb1c95e0",
  4184. [2] = 15000,
  4185. };
  4186. [3] = {
  4187. [1] = "158bb1cc6ec",
  4188. [2] = 10000,
  4189. };
  4190. [4] = {
  4191. [1] = "158bb1ce1aa",
  4192. [2] = 8000,
  4193. };
  4194. [5] = {
  4195. [1] = "1591c9b3123",
  4196. [2] = 6000,
  4197. };
  4198. },
  4199. -- Maps
  4200. xml = '<C><P DS="y;310" /><Z><S><S H="10" L="50" X="275" c="2" Y="165" T="12" P="0,0,0.3,0.2,0,0,0,0" /><S L="200" X="100" H="80" Y="360" T="12" P="0,0,0.3,0.2,0,0,0,0" /><S L="200" X="109" H="80" Y="379" T="12" P="0,0,0.3,0.2,-10,0,0,0" /><S X="391" L="230" H="80" c="3" Y="354" T="12" P="0,0,0.3,0.2,-2,0,0,0" /><S H="100" L="230" X="430" c="3" Y="411" T="12" P="0,0,0.3,0.2,-30,0,0,0" /><S H="80" L="180" X="705" c="3" Y="397" T="12" P="0,0,0.3,0.2,-2,0,0,0" /><S P="0,0,0.3,0.2,0,0,0,0" L="44" H="10" c="3" Y="361" T="13" X="237" /><S X="-5" L="10" H="3000" c="3" Y="100" T="12" P="0,0,0,0,0,0,0,0" /><S H="3000" L="10" X="805" c="3" Y="101" T="12" P="0,0,0,0,0,0,0,0" /><S L="10" X="400" H="3000" Y="-5" T="12" P="0,0,0,0,90,0,0,0" /><S L="80" H="10" X="96" Y="158" T="12" P="0,0,0.3,0.2,0,0,0,0" /><S P="0,0,0.3,.9,0,0,0,0" L="50" X="275" c="3" Y="165" T="12" H="10" /><S L="130" X="527" H="10" Y="128" T="12" P="0,0,0.3,0.2,10,0,0,0" /><S L="90" H="10" X="632" Y="131" T="12" P="0,0,0.3,0.2,-10,0,0,0" /><S H="3000" L="10" o="23E9E9" X="805" c="2" Y="100" T="12" m="" P="0,0,0,2,0,0,0,0" /><S X="-5" L="10" o="23E9E9" H="3000" c="2" Y="100" T="12" m="" P="0,0,0,2,0,0,0,0" /><S P="0,0,0.3,0.2,-35,0,0,0" L="230" X="549" c="3" Y="467" T="12" H="100" /><S P="0,0,0.3,0.2,-55,0,0,0" L="230" H="100" c="3" Y="441" T="12" X="250" /><S L="230" X="125" H="100" Y="422" T="12" P="0,0,0.3,0.2,-30,0,0,0" /><S X="510" L="230" H="100" c="3" Y="477" T="12" P="0,0,0.3,0.2,-65,0,0,0" /><S L="50" X="91" H="50" Y="339" T="12" P="0,0,0.3,0.2,-45,0,0,0" /><S P="0,0,0.3,0.2,0,0,0,0" L="30" X="164" c="2" Y="325" T="12" H="50" /><S P="0,0,0.3,1.1,0,0,0,0" L="30" H="50" c="3" Y="325" T="12" X="164" /><S L="50" X="240" H="10" Y="158" T="12" P="0,0,0.3,0.2,0,0,0,0" /><S L="50" H="10" X="443" Y="125" T="12" P="0,0,0.3,0.2,-20,0,0,0" /><S H="80" L="220" o="23E9E9" X="393" c="1" Y="359" T="12" m="" P="0,0,0.3,0.2,-2,0,0,0" /><S L="230" o="23E9E9" X="427" H="100" Y="416" T="12" m="" P="0,0,0.3,0.2,-30,0,0,0" /><S P="0,0,0.3,0.2,-65,0,0,0" L="230" o="23E9E9" H="100" Y="481" T="12" m="" X="501" /><S P="0,0,0.3,0.2,-35,0,0,0" L="230" o="23E9E9" H="100" Y="474" T="12" m="" X="550" /><S P="0,0,0.3,0.2,-2,0,0,0" L="180" o="23E9E9" X="706" Y="404" T="12" m="" H="80" /><S P="0,0,0.3,0.2,1,0,0,0" L="230" o="23E9E9" X="314" c="2" Y="373" T="12" m="" H="100" /></S><D><P X="241" Y="507" T="51" P="0,1" /><P X="566" Y="449" T="46" P="0,0" /></D><O /></Z></C>',
  4201. initx = 240,
  4202. inity = 140,
  4203. -- New Game Settings
  4204. aim = 8,
  4205. start = true,
  4206. amountPlayers = 20,
  4207. despawnObjects = {},
  4208. currentGifts = {},
  4209. currentTime = 0,
  4210. leftTime = 150,
  4211. -- Player Settings
  4212. setPlayerTools = function(k)
  4213. mode.xmas.info[k] = {
  4214. db = {
  4215. eventNoelGifts = {0,0},
  4216. },
  4217. catch = 0,
  4218. lastColor = 0xB73535,
  4219. }
  4220. if not tfm.get.room.playerList[k].isDead then
  4221. system.bindKeyboard(k,32,true,true)
  4222. end
  4223. mode.xmas.updateBar(k)
  4224. end,
  4225. -- Noel's AI
  4226. noel = {
  4227. x = 240,
  4228. y = 140,
  4229. id = -1,
  4230. isEscaping = false,
  4231. isDizzy = {0,false},
  4232. timers = {
  4233. teleport = 0,
  4234. prize = 0
  4235. },
  4236. img = {
  4237. dizzy = {"158bb1dccb6","158bb1cf9a8","158bb1d6489","158bb1e2518"},
  4238. right = "158bb1d8069",
  4239. left = "158bb1e0daf",
  4240. jumping = "158bb1d470a",
  4241. stop = "158bb1d9b67",
  4242. },
  4243. updateImage = function(img)
  4244. tfm.exec.removeImage(mode.xmas.noel.imgId)
  4245. mode.xmas.noel.imgId = tfm.exec.addImage(img..".png","#"..mode.xmas.noel.id,-23,-32)
  4246. end,
  4247. particles = function(id)
  4248. for i = 1,5 do
  4249. tfm.exec.displayParticle(id,mode.xmas.noel.x + mathrandom(-50,50),mode.xmas.noel.y + mathrandom(-50,50),tablerandom({-.2,.2}),tablerandom({-.2,.2}))
  4250. end
  4251. end,
  4252. move = function(x,y)
  4253. tfm.exec.moveObject(mode.xmas.noel.id,0,0,false,x,y,false)
  4254. end,
  4255. nearMouse = function(range)
  4256. local player = {"",{dist=mathrandom(800),x=0,y=0}}
  4257. for k,v in next,tfm.get.room.playerList do
  4258. if not v.isDead then
  4259. if mathpythag(v.x,v.y,mode.xmas.noel.x,mode.xmas.noel.y,range) then
  4260. local m = v.x-mode.xmas.noel.x
  4261. if mathabs(m) < player[2].dist then
  4262. player = {k,{dist=m,x=v.x,y=v.y}}
  4263. end
  4264. end
  4265. end
  4266. end
  4267. mode.xmas.noel.isEscaping = player[1] ~= ""
  4268. return player
  4269. end,
  4270. escape = function(id)
  4271. local player = mode.xmas.noel.nearMouse(mathrandom(80,100))
  4272. local mul = (player[1] ~= "" and mathisNegative(player[2].dist,1,-1) or tablerandom({-1,1}))
  4273. local img = mathisNegative(mul,"left","right")
  4274. local rand = 9 - mathrandom(0,9)
  4275. if id == 0 or (rand < 6) then
  4276. mode.xmas.noel.move(mul * mathrandom(50,80),-mathrandom(1,10))
  4277. mode.xmas.noel.updateImage(mode.xmas.noel.img[img])
  4278. elseif id == 1 or (rand < 9) then
  4279. mode.xmas.noel.move(mul * mathrandom(60,70),-80)
  4280. mode.xmas.noel.updateImage(tablerandom({mode.xmas.noel.img[img],mode.xmas.noel.img.jumping}))
  4281. elseif id == 2 or rand == 9 then
  4282. mode.xmas.noel.move(mul * mathrandom(10,20),-mathrandom(70,100))
  4283. mode.xmas.noel.updateImage(mode.xmas.noel.img.jumping)
  4284. end
  4285. end,
  4286. meep = function()
  4287. tfm.exec.displayParticle(20,mode.xmas.noel.x,mode.xmas.noel.y)
  4288. tfm.exec.explosion(mode.xmas.noel.x,mode.xmas.noel.y,20,50)
  4289. end,
  4290. cannon = function()
  4291. local player = mode.xmas.noel.nearMouse(100)
  4292. if player[1] ~= "" then
  4293. local x = mode.xmas.noel.x + (mode.xmas.noel.x > player[2].x and -40 or 40)
  4294. local y = mode.xmas.noel.y + (mode.xmas.noel.y > player[2].y and -40 or 40)
  4295. local angle = mathdeg(mathatan2(player[2].y-mode.xmas.noel.y,player[2].x-mode.xmas.noel.x)) + 90
  4296. tableinsert(mode.xmas.despawnObjects,{
  4297. [1] = tfm.exec.addShamanObject(1703,x,y,angle),
  4298. [2] = os.time() + 2500
  4299. })
  4300. local effect = function(id,sx,sy,xs,ys,e)
  4301. for i = 1,2 do
  4302. tfm.exec.displayParticle(id[i] and id[i] or id[1],x + sx * e,y - sy * e,xs/1.5,ys/1.5)
  4303. end
  4304. end
  4305. for i = 1,20 do
  4306. effect({9,11},mathcos(i),mathsin(i),mathcos(i),-mathsin(i),22)
  4307. effect({13},mathcos(i),mathsin(i),mathsin(i),mathcos(i),19)
  4308. end
  4309. end
  4310. end,
  4311. teleport = function()
  4312. if os.time() > mode.xmas.noel.timers.teleport then
  4313. mode.xmas.noel.timers.teleport = os.time() + 8000
  4314. tfm.exec.displayParticle(37,mode.xmas.noel.x,mode.xmas.noel.y)
  4315. local x,y = mathrandom(20,780),mathrandom(50,300)
  4316. tfm.exec.moveObject(mode.xmas.noel.id,x,y)
  4317. tfm.exec.displayParticle(37,x,y)
  4318. else
  4319. mode.xmas.noel.escape(2)
  4320. end
  4321. end,
  4322. gift = function()
  4323. if os.time() > mode.xmas.noel.timers.prize then
  4324. mode.xmas.noel.timers.prize = os.time() + 5000
  4325. mode.xmas.noel.updateImage(mode.xmas.noel.img.stop)
  4326. local giftsAmount = mode.xmas.amountPlayers < 10 and 1 or mathfloor(mode.xmas.amountPlayers/10)
  4327. for i = 1,giftsAmount do
  4328. local gift = tablerandom({2,4,3,1,1,2,3,5,2,4})
  4329. for k,v in next,mode.xmas.gifts do
  4330. if gift == k then
  4331. gift = k
  4332. break
  4333. end
  4334. end
  4335. local gen = {}
  4336. gen[1] = tfm.exec.addShamanObject(6300,mode.xmas.noel.x,mode.xmas.noel.y,0,tablerandom({-13,-10,-5,5,10,13}))
  4337. gen[2] = os.time() + mode.xmas.gifts[gift][2]
  4338. gen[3] = tfm.exec.addImage(mode.xmas.gifts[gift][1]..".png","#"..gen[1],-15,-15)
  4339. gen[4] = gift
  4340. tableinsert(mode.xmas.currentGifts,gen)
  4341. end
  4342. else
  4343. mode.xmas.noel.escape(0)
  4344. end
  4345. end,
  4346. dizzy = function(timer)
  4347. if os.time() > mode.xmas.noel.timers.prize then
  4348. mode.xmas.noel.isDizzy[1] = os.time() + 9500
  4349. else
  4350. mode.xmas.noel.escape(2)
  4351. end
  4352. end,
  4353. },
  4354. resetNoel = function()
  4355. mode.xmas.initx = 240
  4356. mode.xmas.inity = 140
  4357. mode.xmas.noel.x = mode.xmas.initx
  4358. mode.xmas.noel.y = mode.xmas.inity
  4359. mode.xmas.noel.id = -1
  4360. mode.xmas.noel.isEscaping = false
  4361. mode.xmas.noel.isDizzy = {0,false}
  4362. mode.xmas.noel.timers = {
  4363. teleport = 0,
  4364. prize = 0
  4365. }
  4366. end,
  4367. -- Bar
  4368. displayBar = function(id,player,value,nvalue,color,sig,size,height)
  4369. sig = sig or ""
  4370. size = size or 100
  4371. height = height or 20
  4372.  
  4373. ui.addTextArea(id,"",player,5,(height+8) * id,size + 4,height,0xC7CED2,1,1,true)
  4374. if value ~= 0 then
  4375. ui.addTextArea(id.."0","",player,6,(height+8) * id + 2,nvalue + 2,height - 4,color,color,1,true)
  4376. end
  4377. ui.addTextArea(id + 2,"<B><font color='#0'>"..value..sig,player,(size-30)/2,(height+8) * id + 1,50,height,1,1,0,true)
  4378. end,
  4379. updateBar = function(n,giftColor)
  4380. giftColor = giftColor or mode.xmas.info[n].lastColor
  4381. mode.xmas.displayBar(1,n,mathfloor(mode.xmas.info[n].db.eventNoelGifts[2]) .. " / "..mode.xmas.aim,(mode.xmas.info[n].db.eventNoelGifts[2] > mode.xmas.aim and 100 or mathpercent(mode.xmas.info[n].db.eventNoelGifts[2],mode.xmas.aim,100)),0xFF0000)
  4382. mode.xmas.displayBar(2,n,mode.xmas.info[n].db.eventNoelGifts[1],(mode.xmas.info[n].db.eventNoelGifts[1] > 50 and 50 or mathpercent(mode.xmas.info[n].db.eventNoelGifts[1],50,50)),giftColor,"G",50,20)
  4383. end,
  4384. -- Init
  4385. init = function()
  4386. mode.xmas.translations.pt = mode.xmas.translations.br
  4387. mode.xmas.langue = mode.xmas.translations[tfm.get.room.community] and tfm.get.room.community or "en"
  4388. for i,f in next,{"AutoShaman","AfkDeath","MortCommand","AutoTimeLeft","PhysicalConsumables","AutoNewGame","DebugCommand"} do
  4389. tfm.exec["disable"..f]()
  4390. end
  4391. tfm.exec.setRoomMaxPlayers(25)
  4392. tfm.exec.newGame(mode.xmas.xml)
  4393. mode.xmas.aim = system.miscAttrib > 0 and system.miscAttrib or 8
  4394. end,
  4395. -- New Game
  4396. eventNewGame = function()
  4397. mode.xmas.resetNoel()
  4398.  
  4399. mode.xmas.start = true
  4400.  
  4401. local _,aP = system.players()
  4402. mode.xmas.amountPlayers = aP
  4403.  
  4404. tfm.exec.setGameTime(150)
  4405. tfm.exec.snow(150)
  4406. mode.xmas.currentTime = 0
  4407. mode.xmas.leftTime = 150
  4408.  
  4409. tfm.exec.addImage("158c1feaf90.png","?0",0,0)
  4410.  
  4411. ui.setMapName("<J>"..tablerandom({"Nöel","Christmas","Bolodefchoco","Lua event","#xmas","Bogkitty"}).." <G>- @"..tablerandom({666,404,801,os.date("%Y"),0,1}))
  4412. ui.setShamanName("<R>S4NT4 M4U5")
  4413.  
  4414. for k,v in next,tfm.get.room.playerList do
  4415. mode.xmas.setPlayerTools(k)
  4416. end
  4417. tfm.exec.chatMessage(stringformat("<V><B>[^_^]</B></V> <BV>%s</BV>\n<V><B>[S4NT4 M4U5]</B></V> <R>%s</R>",mode.xmas.translations[mode.xmas.langue][2],stringupper(mode.xmas.translations[mode.xmas.langue][1])))
  4418. end,
  4419. -- New Player
  4420. eventNewPlayer = function(n)
  4421. tfm.exec.addImage("158c1feaf90.png","?0",0,0,n)
  4422. mode.xmas.setPlayerTools(n)
  4423. tfm.exec.respawnPlayer(n)
  4424. end,
  4425. -- Loop
  4426. eventLoop = function()
  4427. mode.xmas.currentTime = mode.xmas.currentTime + .5
  4428. mode.xmas.leftTime = mode.xmas.leftTime - .5
  4429. if mode.xmas.start then
  4430. if mode.xmas.currentTime > 4 then
  4431. if mode.xmas.noel.id == -1 then
  4432. mode.xmas.noel.id = tfm.exec.addShamanObject(6300,mode.xmas.noel.x,mode.xmas.noel.y)
  4433. mode.xmas.noel.updateImage(mode.xmas.noel.img.stop)
  4434. end
  4435.  
  4436. local ox,oy
  4437. if tfm.get.room.objectList[mode.xmas.noel.id] then
  4438. ox,oy = tfm.get.room.objectList[mode.xmas.noel.id].x,tfm.get.room.objectList[mode.xmas.noel.id].y
  4439. else
  4440. ox,oy = mode.xmas.noel.x,mode.xmas.noel.y
  4441. end
  4442.  
  4443. if (ox < -10 or ox > 810) or (oy > 400 or oy < -50) then
  4444. tfm.exec.removeObject(mode.xmas.noel.id)
  4445. mode.xmas.noel.x,mode.xmas.noel.y = mode.xmas.initx,mode.xmas.inity
  4446. mode.xmas.noel.id = nil
  4447. end
  4448.  
  4449. if mode.xmas.noel.id then
  4450. mode.xmas.noel.x = ox
  4451. mode.xmas.noel.y = oy
  4452. end
  4453.  
  4454. for k,v in ipairs(mode.xmas.despawnObjects) do
  4455. if os.time() > v[2] then
  4456. tfm.exec.removeObject(v[1])
  4457. end
  4458. end
  4459. for k,v in ipairs(mode.xmas.currentGifts) do
  4460. if os.time() > v[2] then
  4461. tfm.exec.removeObject(v[1])
  4462. tfm.exec.removeImage(v[3])
  4463. end
  4464. end
  4465.  
  4466. if os.time() > mode.xmas.noel.isDizzy[1] and mode.xmas.currentTime > 5 then
  4467. mode.xmas.noel.particles(13)
  4468. if mode.xmas.currentTime % 60 == 0 then
  4469. mode.xmas.noel.dizzy()
  4470. elseif mode.xmas.currentTime % 5 == 0 then
  4471. mode.xmas.noel.gift()
  4472. mode.xmas.noel.escape(1)
  4473. elseif mathfloor(mode.xmas.currentTime) % 2 == 0 then
  4474. local option = mathrandom((mode.xmas.noel.isEscaping and 15 or 12))
  4475. if option > 3 then
  4476. mode.xmas.noel.escape()
  4477. else
  4478. mode.xmas.noel.updateImage(mode.xmas.noel.img.stop)
  4479. if mode.xmas.currentTime > 7 and mathrandom(1,2) == 1 then
  4480. if option == 3 then
  4481. mode.xmas.noel.cannon()
  4482. elseif option == 2 then
  4483. mode.xmas.noel.teleport()
  4484. elseif option == 1 then
  4485. mode.xmas.noel.meep()
  4486. end
  4487. end
  4488. end
  4489. else
  4490. mode.xmas.noel.updateImage(mode.xmas.noel.img.stop)
  4491. end
  4492. else
  4493. mode.xmas.noel.particles(1)
  4494. if not mode.xmas.noel.isDizzy[2] then
  4495. mode.xmas.noel.isDizzy[2] = true
  4496. mode.xmas.noel.timers.prize = os.time() + 5000
  4497. local imgId = #mode.xmas.noel.img.dizzy
  4498. local animation = {}
  4499. local numb = 1
  4500. animation = system.looping(function()
  4501. mode.xmas.noel.updateImage(mode.xmas.noel.img.dizzy[imgId])
  4502.  
  4503. if imgId == #mode.xmas.noel.img.dizzy or imgId == 1 then
  4504. numb = -numb
  4505. end
  4506.  
  4507. imgId = imgId + numb
  4508.  
  4509. if (os.time()+250) > mode.xmas.noel.isDizzy[1] then
  4510. for k,v in next,animation do
  4511. system.removeTimer(v)
  4512. end
  4513. mode.xmas.noel.isDizzy = {0,false}
  4514. end
  4515. end,10)
  4516. end
  4517. end
  4518. end
  4519. if mode.xmas.leftTime < 2 then
  4520. mode.xmas.start = false
  4521. tfm.exec.newGame(mode.xmas.xml)
  4522. end
  4523. end
  4524. end,
  4525. -- Keyboard
  4526. eventKeyboard = function(n,k,d,x,y)
  4527. if mode.xmas.start then
  4528. if os.time() > mode.xmas.info[n].catch and k == 32 then
  4529. if os.time() < mode.xmas.noel.isDizzy[1] then
  4530. if mathpythag(x,y,mode.xmas.noel.x,mode.xmas.noel.y,32) then
  4531. mode.xmas.info[n].db.eventNoelGifts[2] = (mode.xmas.info[n].db.eventNoelGifts[1]/10) + mode.xmas.info[n].db.eventNoelGifts[2]
  4532. mode.xmas.info[n].db.eventNoelGifts[1] = 0
  4533.  
  4534. mode.xmas.updateBar(n)
  4535. end
  4536. else
  4537. for k,v in next,mode.xmas.currentGifts do
  4538. local o = tfm.get.room.objectList[v[1]]
  4539. if o and mathpythag(x,y,o.x,o.y,25) then
  4540. if (mode.xmas.info[n].db.eventNoelGifts[1]+v[4]) <= 50 then
  4541. tfm.exec.removeObject(v[1])
  4542. tfm.exec.removeImage(v[3])
  4543.  
  4544. mode.xmas.currentGifts[k][2] = 0
  4545. mode.xmas.info[n].db.eventNoelGifts[1] = mode.xmas.info[n].db.eventNoelGifts[1] + v[4]
  4546.  
  4547. mode.xmas.updateBar(n,({0xB73535,0x358CB7,0x35B765,0xB7B735,0xB73487})[v[4]])
  4548. break
  4549. end
  4550. end
  4551. end
  4552. end
  4553. mode.xmas.info[n].catch = os.time() + 1000
  4554. end
  4555. end
  4556. end,
  4557. -- Player Died
  4558. eventPlayerDied = function(n)
  4559. if mode.xmas.start then
  4560. system.bindKeyboard(n,32,true,false)
  4561. end
  4562. end,
  4563. }
  4564.  
  4565. --[[ Signal ]]--
  4566. mode.signal = {
  4567. -- Translations
  4568. translations = {
  4569. en = {
  4570. -- Init
  4571. welcome = "<S>Welcome to <PS>#Signal<S>! Follow the signs and join the hole! Use !help to read more informations.\n\tReport any issue to Bolodefchoco",
  4572.  
  4573. -- Info
  4574. info = {
  4575. [1] = {"Run","Run the faster you can. Do not stop!"},
  4576. [2] = {"Attention","Pay attention! You can die in a few seconds!"},
  4577. [3] = {"Stop","Stop or die!"},
  4578. },
  4579. skip = "<PS>[•] <S>Impossible map? Type !skip",
  4580. skipped = "Your vote to skip the map has been recorded.",
  4581.  
  4582. -- Simple words
  4583. close = "Close",
  4584. },
  4585. br = {
  4586. welcome = "<S>Bem-vindo ao <PS>#Signal<S>! Siga os sinais e entre na toca! Use !help para ler mais informações.\n\tReporte qualquer problema para Bolodefchoco",
  4587.  
  4588. info = {
  4589. [1] = {"Corra","Corra o mais rápido que puder. Não pare!"},
  4590. [2] = {"Atenção","Preste atenção! Você poderá morrer a qualquer momento!"},
  4591. [3] = {"Pare","Pare ou morra!"},
  4592. },
  4593. skip = "<PS>[•] <S>Mapa impossível? Digite !skip",
  4594. skipped = "Seu voto para passar o mapa foi registrado.",
  4595.  
  4596. close = "Fechar",
  4597. },
  4598. pl = {
  4599. welcome = "<S>Witaj w <PS>#Signal<S>! Patrz na tabliczke i wejdź do norki! Użyj komendy !help, aby przeczytać więcej informacji.\n\tZgłoś wszystkie błędy jakie znajdziesz do Bolodefchoco",
  4600.  
  4601. info = {
  4602. [1] = {"Biegnij","Biegnij jak najszybciej do norki. Nie zatrzymuj się!"},
  4603. [2] = {"Uważaj","Uważaj! Możesz zginąć za kilka sekund!"},
  4604. [3] = {"Stój","Stój albo zgiń!"},
  4605. },
  4606. skip = "<PS>[•] <S>Niemożliwa mapa? Wpisz komendę !skip",
  4607. skipped = "Twój głos na ominięcie mapy został policzony.",
  4608.  
  4609. close = "Zamknij",
  4610. },
  4611. },
  4612. langue = "en",
  4613. -- Data
  4614. info = {},
  4615. -- Maps
  4616. generateMap = function()
  4617. local groundProperties = {[0] = {.3,.2},[4] = {20,.2},[5] = {.3,.2},[6] = {.3,.2},[7] = {.1,.2},[10] = {.3,0},[11] = {.05,.1},[3] = {5,20}}
  4618. local groundDecorations = {[0] = {0,4,5},[4] = {1,42,51},[5] = {1,2,4,12,18,20,32,42,46},[6] = {0,1,2,3,4,5,11,42},[7] = {7,8,9,10},[10] = {42,103,118},[11] = {51,106},[3] = {}}
  4619. local newGround = "<S L=\"%s\" H=\"%s\" X=\"%s\" Y=\"%s\" T=\"%s\" P=\"0,0,%s,%s,0,0,0,0\" />"
  4620. local newDecoration = "<P P=\"%s,0\" X=\"%d\" Y=\"%d\" T=\"%d\" />"
  4621. local object = "<%s X=\"%s\" Y=\"%s\"/>"
  4622. local objects = {hole="T",mice="DS",cheese="F"}
  4623.  
  4624. local mapHeight = mathrandom(1500,3000)
  4625.  
  4626. local grounds = {}
  4627. local decorations = {}
  4628. for i = 1,mathceil(mapHeight/180) do
  4629. local T = tablerandom({0,4,5,6,7,10,11,tablerandom({4,5,6,10,3})})
  4630.  
  4631. local H = T==3 and mathrandom(10,20) or mathrandom(40,100)
  4632.  
  4633. local Y = (#grounds > 1 and grounds[#grounds].Y < 320 and mathrandom(230,310) or mathrandom(300,350)) or mathrandom(290,350)
  4634.  
  4635. local X,L
  4636. repeat
  4637. X = (#grounds > 1 and (grounds[#grounds].X + ((mathrandom(-1,1) * 30) + 200)) or mathrandom(50,300))
  4638. X = X < 60 and 100 or X > mapHeight - 100 and mapHeight - 300 or X
  4639. L = T==3 and H or mathrandom(40,mathceil(mapHeight/18))
  4640. until (X - (L/2)) > 50 and (X + (L/2)) < mapHeight - 50
  4641.  
  4642. local properties = groundProperties[T]
  4643. grounds[#grounds + 1] = {X=X,Y=Y,L=L,H=H,stringformat(newGround,L,H,X,Y,T,properties[1],properties[2])}
  4644.  
  4645. if T ~= 3 and mathrandom(20) < 10 then
  4646. local decoList = groundDecorations[T]
  4647. decorations[#decorations + 1] = stringformat(newDecoration,tablerandom({0,0,0,mathrandom(0,1),1}),X - mathrandom(-((L/4)+1),((L/4)+1)),Y - (H/2),tablerandom(decoList))
  4648. end
  4649. end
  4650.  
  4651. local cheeseX
  4652. repeat
  4653. cheeseX = mathrandom(200,mapHeight - 500)
  4654. until (function()
  4655. for k,v in next,grounds do
  4656. if (cheeseX + 10) > (v.X - v.L/2) and (cheeseX - 10) < (v.X + v.L/2) then
  4657. return false
  4658. end
  4659. end
  4660. return true
  4661. end)()
  4662.  
  4663. grounds[#grounds + 1] = {X=0,Y=0,L=0,H=0,stringformat(newGround,200,40,100,380,2,.3,.9)}
  4664. grounds[#grounds + 1] = {X=0,Y=0,L=0,H=0,stringformat(newGround,300,40,mapHeight - 150,380,6,.3,.2)}
  4665.  
  4666. tfm.exec.newGame(stringformat("<C><P G=\"0,%s\" F=\"%s\" L=\"%s\" /><Z><S>%s</S><D>%s%s%s%s</D><O /></Z></C>",tablerandom({mathrandom(7,12),10,11,9}),tablerandom({0,1,2,3,4,5,7,8}),mapHeight,tableconcat(grounds,"",function(k,v) return v[1] end),stringformat(object,objects.hole,mapHeight - 30,360),stringformat(object,objects.mice,10,365),stringformat(object,objects.cheese,cheeseX,mathrandom(280,340)),tableconcat(decorations)))
  4667. end,
  4668. -- Settings
  4669. sys = {0,1},
  4670. discrepancy = 0,
  4671. lights = {"15b52f8717d","15b52f8583a","15b52f88765"},
  4672. lightId = -1,
  4673. skip = 0,
  4674. rounds = 0,
  4675. possible = false,
  4676. -- Settings
  4677. update = function(id)
  4678. tfm.exec.removeImage(mode.signal.lightId)
  4679. mode.signal.lightId = tfm.exec.addImage(mode.signal.lights[mode.signal.sys[2]] .. ".png","&0",375,30)
  4680. local color = ({0x1CB70C,0xF4D400,0xEC0000})[mode.signal.sys[2]]
  4681. for k,v in next,mode.signal.info do
  4682. if id == 1 then
  4683. if not v.afk and v.canRev then
  4684. tfm.exec.respawnPlayer(k)
  4685. end
  4686. end
  4687. tfm.exec.setNameColor(k,color)
  4688. end
  4689. end,
  4690. -- Help
  4691. displayInfo = function(n,id)
  4692. local color = ({"<VP>","<J>","<R>"})[id]
  4693. ui.addTextArea(1,"<p align='center'><font size='25'>" .. color .. mode.signal.translations[mode.signal.langue].info[id][1] .. "\n</font></p><p align='left'><font size='14'>" .. mode.signal.translations[mode.signal.langue].info[id][2],n,250,110,300,181,0x324650,0x27343A,1,true)
  4694. ui.addTextArea(2,"<font size='2'>\n</font><p align='center'><font size='16'><a href='event:close'>" .. mode.signal.translations[mode.signal.langue].close,n,250,300,300,30,0x27343A,0x27343A,1,true)
  4695. ui.addTextArea(3,"<p align='center'><font size='20'><a href='event:info.1'><VP>•</a> <a href='event:info.2'><J>•</a> <a href='event:info.3'><R>•</a>",n,250,145,300,30,1,1,0,true)
  4696. tfm.exec.removeImage(mode.signal.info[n].imageId)
  4697. mode.signal.info[n].imageId = tfm.exec.addImage(mode.signal.lights[id] .. ".png","&1",375,200,n)
  4698. end,
  4699. -- Init
  4700. reset = function()
  4701. -- Data
  4702. mode.signal.info = {}
  4703. end,
  4704. init = function()
  4705. mode.signal.translations.pt = mode.signal.translations.br
  4706. mode.signal.langue = mode.signal.translations[tfm.get.room.community] and tfm.get.room.community or "en"
  4707.  
  4708. for _,f in next,{"AutoShaman","AutoNewGame","AutoTimeLeft","PhysicalConsumables"} do
  4709. tfm.exec["disable"..f]()
  4710. end
  4711.  
  4712. mode.signal.generateMap()
  4713. end,
  4714. -- New Player
  4715. eventNewPlayer = function(n)
  4716. if not mode.signal.info[n] then
  4717. mode.signal.info[n] = {
  4718. isMoving = {false,false,false,false},
  4719. imageId = -1,
  4720. afk = true,
  4721. skipped = false,
  4722. canRev = true,
  4723. }
  4724. end
  4725. for i = 0,3 do
  4726. system.bindKeyboard(n,i,true,true)
  4727. system.bindKeyboard(n,i,false,true)
  4728. end
  4729. tfm.exec.chatMessage(mode.signal.translations[mode.signal.langue].welcome,n)
  4730. end,
  4731. -- New Game
  4732. eventNewGame = function()
  4733. mode.signal.skip = 0
  4734. mode.signal.possible = false
  4735. mode.signal.rounds = mode.signal.rounds + 1
  4736.  
  4737. if mode.signal.rounds % 3 == 0 then
  4738. tfm.exec.chatMessage(mode.signal.translations[mode.signal.langue].skip)
  4739. end
  4740.  
  4741. ui.setMapName("<BL>@" .. mathrandom(999) .. " <G>| <N>Round : <V>" .. mode.signal.rounds)
  4742.  
  4743. for k,v in next,mode.signal.info do
  4744. v.isMoving = {false,false,false,false}
  4745. v.afk = true
  4746. v.skipped = false
  4747. v.canRev = true
  4748. end
  4749.  
  4750. mode.signal.sys = {0,1}
  4751. mode.signal.update(mode.signal.sys[2])
  4752. end,
  4753. -- Keyboard
  4754. eventKeyboard = function(n,k,d)
  4755. if mode.signal.sys[2] == 3 and d and os.time() > mode.signal.discrepancy then
  4756. tfm.exec.killPlayer(n)
  4757. else
  4758. mode.signal.info[n].isMoving[k + 1] = d
  4759. end
  4760. mode.signal.info[n].afk = false
  4761. end,
  4762. -- Loop
  4763. eventLoop = function(currentTime,leftTime)
  4764. if _G.currentTime > 8 then
  4765. if os.time() > mode.signal.sys[1] then
  4766. mode.signal.sys[2] = (mode.signal.sys[2] % 3) + 1
  4767. mode.signal.sys[1] = os.time() + ({mathrandom(7,13),mathrandom(2,3),mathrandom(3,5)})[mode.signal.sys[2]] * 1000
  4768. mode.signal.update(mode.signal.sys[2])
  4769. mode.signal.discrepancy = os.time() + 520
  4770. end
  4771. end
  4772.  
  4773. if _G.leftTime > 2 and system.players() > 0 then
  4774. if mode.signal.sys[2] == 3 and os.time() > mode.signal.discrepancy then
  4775. for k,v in next,mode.signal.info do
  4776. for i,j in next,v.isMoving do
  4777. if j then
  4778. tfm.exec.killPlayer(k)
  4779. break
  4780. end
  4781. end
  4782. end
  4783. end
  4784. else
  4785. mode.signal.generateMap()
  4786. end
  4787. end,
  4788. -- Callbacks
  4789. eventTextAreaCallback = function(i,n,c)
  4790. local p = stringsplit(c,"[^%.]+")
  4791. if p[1] == "info" then
  4792. mode.signal.displayInfo(n,tonumber(p[2]))
  4793. elseif p[1] == "close" then
  4794. tfm.exec.removeImage(mode.signal.info[n].imageId)
  4795. for i = 1,3 do
  4796. ui.removeTextArea(i,n)
  4797. end
  4798. end
  4799. end,
  4800. -- Commands
  4801. eventChatCommand = function(n,c)
  4802. if c == "info" or c == "help" or c == "?" then
  4803. eventTextAreaCallback(nil,n,"info." .. mode.signal.sys[2])
  4804. elseif c == "skip" and _G.currentTime > 8 and not mode.signal.possible and not mode.signal.info[n].skipped then
  4805. mode.signal.skip = mode.signal.skip + 1
  4806. tfm.exec.chatMessage(mode.signal.translations[mode.signal.langue].skipped,n)
  4807.  
  4808. local alive,total = system.players()
  4809. if mode.signal.skip == mathceil(.5 * total) then
  4810. tfm.exec.chatMessage("o/")
  4811. mode.signal.generateMap()
  4812. end
  4813. end
  4814. end,
  4815. -- Victory
  4816. eventPlayerWon = function(n)
  4817. mode.signal.possible = true
  4818. mode.signal.info[n].canRev = false
  4819. tfm.exec.setGameTime(40,false)
  4820. end,
  4821. }
  4822.  
  4823. --[[ Bootcamp+ ]]--
  4824. mode.bootcampP = {
  4825. -- Translations
  4826. translations = {
  4827. en = {
  4828. -- Init
  4829. welcome = "Welcome to <B>#Bootcamp+</B>! Type !info to check the commands\n\tReport any issue to Bolodefchoco!",
  4830.  
  4831. -- Info
  4832. info = "Checkpoint:\n\tIf the checkpoint system is enabled, press <B>E</B> to put a checkpoint and <B>Shift+E</B> to remove it.\nAdmin\n\tIf you are a room admin, there are some commands that you can execute:\n\tMaps\n\t\t!next <V>--> Pass the map</V>\n\t\t!again <V>--> Resets the current map</V>\n\t\t!np @Code <VP>or</VP> !map @Code <V>--> Loads a map</V>\n\t\t!queue clear <V>--> Clear the map queue</V>\n\t\t!queue add @Code <V>--> Adds a map in the map queue</V>\n\t\t!queue P3 <VP>or</VP> P13 <VP>or</VP> P23 <V>--> Adds the whole official rotation of P3 or P13 or P23 in the map queue</V>\n\tTime\n\t\t!time TimeInMinutes <V>--> Set the time of the current round in TimeInMinutes</V>\n\t\t!standtime TimeInMinutes <V>--> Set the time of all the rounds in TimeInMinutes</V>\n\tOthers\n\t\t<B>Shift+Click</B> in a ground to read its properties\n\t\t!checkpoint [[not] cheese] <V>--> Enables/Disables the checkpoint system</V>\n\t\tKey Delete <V>--> Kills you</V>",
  4833. skip = "<VP>%s</VP> just skipped the map!",
  4834. restart = "<VP>%s</VP> just restarted the current map!",
  4835. loadmap = "<VP>%s</VP> just loaded the map %s!",
  4836. settime = "The time has been set to %s minutes!",
  4837. setstandtime = "The standard time of all the rounds has been set to %s minutes!",
  4838. enabled = "enabled! Press <B>E</B> to put a checkpoint and <B>Shift+E</B> to remove it.",
  4839. queuecleared = "%s just cleared the map queue",
  4840. queuemapadded = "%s just added the map %s to the map queue",
  4841. queueperm = "%s just added the category %s to the map queue",
  4842. queuereset = "%s just reseted the queue to the main maps",
  4843.  
  4844. -- Simple words
  4845. disabled = "disabled!",
  4846. },
  4847. br = {
  4848. welcome = "Bem-vindo ao <B>#Bootcamp+</B>! Digite !info para checar os comandos\n\tReporte quaisquer problemas para Bolodefchoco!",
  4849.  
  4850. info = "Checkpoint:\n\tSe o sistema de checkpoint está ativado, pressione <B>E</B> para marcar um checkpoint e <B>Shift+E</B> para remove-lo.\nAdmin\n\tSe você é um administrador da sala, há alguns comandos que você pode executar:\n\tMapas\n\t\t!next <V>--> Passa o mapa</V>\n\t\t!again <V>--> Reinicia o mapa atual</V>\n\t\t!np @Código <VP>ou</VP> !map @Código <V>--> Carrega um mapa</V>\n\t\t!queue clear <V>--> Limpa a lista de mapas</V>\n\t\t!queue add @Código <V>--> Adiciona um mapa na lista de mapas</V>\n\t\t!queue P3 <VP>ou</VP> P13 <VP>ou</VP> P23 <V>--> Adiciona a rotação inteira de P3 ou P13 ou P23 na lista de mapas</V>\n\tTempo\n\t\t!time TempoEmMinutos <V>--> Define o tempo do mapa atual em TempoEmMinutos</V>\n\t\t!standtime TempoEmMinutos <V>--> Define o tempo de todas as partidas em TempoEmMinutos</V>\n\tOutros\n\t\t<B>Shift+Click</B> sobre um piso para ler suas propriedades\n\t\t!checkpoint [[not] cheese] <V>--> Ativa/Desativa o sistema de checkpoint</V>\n\t\tTecla Delete <V>--> Mata-o</V>",
  4851. skip = "<VP>%s</VP> acabou de passar o mapa!",
  4852. restart = "<VP>%s</VP> acabou de reiniciar o mapa atual!",
  4853. loadmap = "<VP>%s</VP> acabou de carregar o mapa %s!",
  4854. settime = "O tempo foi definido para %s minutos!",
  4855. setstandtime = "O tempo padrão para todas as partidas foram definidas para %s minutos!",
  4856. enabled = "ativado! Pressione <B>E</B> para marcar um checkpoint e <B>Shift+E</B> para remove-lo.",
  4857. queuecleared = "%s acabou de limpar a rotação de mapas",
  4858. queuemapadded = "%s acabou de adicionar o mapa %s na rotação de mapas",
  4859. queueperm = "%s acabou de adicionar a categoria %s na rotação de mapas",
  4860. queuereset = "%s acabou de resetar a rotação de mapas para os mapas principais",
  4861.  
  4862. disabled = "desativado!",
  4863. },
  4864. pl = {
  4865. welcome = "Witaj w <B>#Bootcamp+</B>! Wpisz !info na czacie aby sprawdzić jakie są komendy\n\tZgłaszaj wszelkie błędy do Bolodefchoco!",
  4866.  
  4867. info = "Checkpoint:\n\tJeżeli system checkpointów jest włączony, kliknij <B>E</B>, aby ustawić checkpoint i <B>Shift+E</B>, aby go usunąć.\nAdmin\n\tJeżeli jesteś administratorem pokoju, jest kilka komend, które możesz użyć:\n\tMapy\n\t\t!next <V>--> Przełącza mapę</V>\n\t\t!again <V>--> Restartuje mapę</V>\n\t\t!np @Code <VP>albo</VP> !map @Code <V>--> Ładuje mapę</V>\n\t\t!queue clear <V>--> Czyści kolejkę map</V>\n\t\t!queue add @Code <V>--> Dodaję mapę do kolejki</V>\n\t\t!queue P3 <VP>albo</VP> P13 <VP>albo</VP> P23 <V>--> Dodaje wszystkie oficjalne rotacje z permów P3 albo P13 albo P23 do kolejki map</V>\n\tCzas\n\t\t!time CzasWMinutach <V>--> Ustawia czas obecnej mapy na CzasWMinutach</V>\n\t\t!standtime CzasWMinutach <V>--> Ustawia czas dla wszystkich rund na CzasWMinutach</V>\n\tInne\n\t\t<B>Shift+Click</B> na gruncie aby przeczytać jego właściwości\n\t\t!checkpoint [[not] cheese] <V>--> Włącza/Wyłącza system checkpointów</V>\n\t\tKey Delete <V>--> Kills you</V>",
  4868. skip = "<VP>%s</VP> pominął/-ęła mapę!",
  4869. restart = "<VP>%s</VP> zrestartował/-a mapę!",
  4870. loadmap = "<VP>%s</VP> załadował/-a mapę %s!",
  4871. settime = "Czas został ustawiony na %s minut!",
  4872. setstandtime = "Standardowy czas dla wszystkich map został ustawiony na %s minut!",
  4873. enabled = "włączony! Kliknij <B>E</B>, aby ustawić checkpoint i <B>Shift+E</B>, aby go usunąć.",
  4874. queuecleared = "%s just cleared the map queue",
  4875. queuemapadded = "%s just added the map %s to the map queue",
  4876. queueperm = "%s just added the category %s to the map queue",
  4877. queuereset = "%s just reseted the queue to the main maps",
  4878.  
  4879. disabled = "wyłączony!",
  4880. },
  4881. },
  4882. langue = "en",
  4883. -- Data
  4884. info = {},
  4885. -- Maps
  4886. maps = {},
  4887. map = function()
  4888. mode.bootcampP.maps = {6501305,6118143,2604997,2836937,6921682,3339586,5776126,5678468,6531399,5847160,5745650,7091808,7000003,6999993,4559999,4784241,3883780,4976520,4854044,6374076,3636206,6793803,4499335,4694197,5485847,6258690,3938895,1719709,4209243,6550335,5994088,3866650,3999455,4095418,4523127,1964971,1554670,4423047,764650,5562230,4883346,2978216,1947288,7025830,7108857,4766627,5888889,6782978,5699275,6422459,2634659,4808290,3620953,2973289,2604643,6591698,7134487,7054821,6900009,7159725,3737744,6933187,6864581,4701337,6631702,6761156,4212122,4160675,4623227,5191670,6377984,1132272,2781845,3460976,7167027,4834444,3734991,7138019,7037760,6521356,6502657,6469688,6092666,2749928,7175796,7142063,7167539,7173296,6995540,7151000,3931358,3374686,6324891,3704015,3937060,2429057,7192029,7192034,7192689}
  4889. end,
  4890. -- New Game Settings
  4891. groundsData = {},
  4892. mapData = {},
  4893. standardTime = 6,
  4894. checkpoint = false,
  4895. -- Settings
  4896. respawnCheese = false,
  4897. -- Leaderboard
  4898. rank = function(players,fromValue,showPos,showPoints,pointsName,lim)
  4899. local p,rank = {},""
  4900. fromValue,lim = fromValue or {tfm.get.room.playerList,"score"},tonumber(lim) or 100
  4901. for n in next,players do
  4902. p[#p+1] = {name=n,v=fromValue[1][n][fromValue[2]]}
  4903. end
  4904. tablesort(p,function(f,s) return f.v>s.v end)
  4905. for o,n in next,p do
  4906. if o <= lim then
  4907. rank = rank .. (showPos and "<J>"..o..". " or "") .. "<V>" .. n.name .. (showPoints and " <BL>- <VP>" .. n.v .. " "..(pointsName or "points") .."\n" or "\n")
  4908. end
  4909. end
  4910. return rank
  4911. end,
  4912. -- Init
  4913. reset = function()
  4914. -- Data
  4915. mode.bootcampP.info = {}
  4916. end,
  4917. init = function()
  4918. -- Translations
  4919. mode.bootcampP.translations.pt = mode.bootcampP.translations.br
  4920. mode.bootcampP.langue = mode.bootcampP.translations[tfm.get.room.community] and tfm.get.room.community or "en"
  4921.  
  4922. -- Settings
  4923. mode.bootcampP.respawnCheese = system.miscAttrib == 1
  4924.  
  4925. -- Init
  4926. for _,f in next,{"AutoShaman","AutoScore","AutoTimeLeft","AutoNewGame","PhysicalConsumables","AfkDeath"} do
  4927. tfm.exec["disable"..f]()
  4928. end
  4929. tfm.exec.setAutoMapFlipMode(false)
  4930.  
  4931. mode.bootcampP.map()
  4932. tfm.exec.newGame(tablerandom(mode.bootcampP.maps))
  4933.  
  4934. -- Auto Admin
  4935. system.roomAdmins.Mquk = true
  4936. end,
  4937. -- New Game
  4938. eventNewGame = function()
  4939. tfm.exec.setGameTime(mode.bootcampP.standardTime * 60)
  4940. mode.bootcampP.groundsData = {}
  4941. mode.bootcampP.mapData = {}
  4942. for k,v in next,mode.bootcampP.info do
  4943. v.cheese = false
  4944. v.checkpoint = {false,0,0,false}
  4945. ui.removeTextArea(1,n)
  4946. end
  4947.  
  4948. local xml = tfm.get.room.xmlMapInfo.xml
  4949. if xml then
  4950. local grounds = stringmatch(xml,"<S>(.-)</S>")
  4951. local properties = stringmatch(xml,"<C><P (.-)/>.*<Z>")
  4952. if properties then
  4953. mode.bootcampP.mapData = {
  4954. width = stringmatch(properties,'L="(%d+)"') or 800,
  4955. heigth = stringmatch(properties,'H="(%d+)"') or 400,
  4956. }
  4957. else
  4958. mode.bootcampP.mapData = {
  4959. width = 800,
  4960. heigth = 400,
  4961. }
  4962. end
  4963.  
  4964. local data = {}
  4965. stringgsub(grounds,"<S (.-)/>",function(attributes)
  4966. data[#data + 1] = attributes
  4967. end)
  4968. for i = 1,#data do
  4969. mode.bootcampP.groundsData[i] = {}
  4970.  
  4971. local type = stringmatch(data[i],'T="(%d+)"')
  4972. mode.bootcampP.groundsData[i].type = type and tonumber(type) or -1
  4973.  
  4974. local x = stringmatch(data[i],'X="(%d+)"')
  4975. mode.bootcampP.groundsData[i].x = x and tonumber(x) or 0
  4976.  
  4977. local y = stringmatch(data[i],'Y="(%d+)"')
  4978. mode.bootcampP.groundsData[i].y = y and tonumber(y) or 0
  4979.  
  4980. local width = stringmatch(data[i],'L="(%d+)"')
  4981. mode.bootcampP.groundsData[i].width = width and tonumber(width) or 0
  4982.  
  4983. local heigth = stringmatch(data[i],'H="(%d+)"')
  4984. mode.bootcampP.groundsData[i].heigth = heigth and tonumber(heigth) or 0
  4985.  
  4986. local info = stringmatch(data[i],'P="(.*)"')
  4987. info = stringsplit(info,"[^,]+")
  4988.  
  4989. mode.bootcampP.groundsData[i].friction = info[3] and tonumber(info[3]) or .3
  4990. mode.bootcampP.groundsData[i].restitution = info[3] and tonumber(info[4]) or .2
  4991. mode.bootcampP.groundsData[i].angle = info[3] and tonumber(info[5]) or 0
  4992. end
  4993. end
  4994. end,
  4995. -- New Player
  4996. eventNewPlayer = function(n)
  4997. if not mode.bootcampP.info[n] then
  4998. mode.bootcampP.info[n] = {
  4999. shift = false,
  5000. checkpoint = {false,0,0,false},
  5001. cheese = false,
  5002. }
  5003. end
  5004.  
  5005. system.bindMouse(n,true)
  5006. for i = 1,2 do
  5007. system.bindKeyboard(n,16,i==1,true)
  5008. system.bindKeyboard(n,stringbyte("K"),i==1,true)
  5009. end
  5010.  
  5011. system.bindKeyboard(n,stringbyte("E"),true,true)
  5012. system.bindKeyboard(n,46,true,true) -- Delete key
  5013. tfm.exec.chatMessage("<T>" .. system.getTranslation("welcome") .. "\n\t<CEP>/w Mquk #bootcamp+ @mapCode",n)
  5014.  
  5015. local id = tfm.exec.addImage("15c6ee6324d.png","&0",120,100,n)
  5016. system.newTimer(function()
  5017. tfm.exec.removeImage(id)
  5018. end,5000,false)
  5019. end,
  5020. -- Mouse
  5021. eventMouse = function(n,x,y)
  5022. if mode.bootcampP.info[n].shift then
  5023. for i = #mode.bootcampP.groundsData,1,-1 do
  5024. local g = mode.bootcampP.groundsData[i]
  5025. local rad = mathrad(g.angle)
  5026. local ax = {mathcos(rad),mathsin(rad)}
  5027.  
  5028. local gX = g.x + ax[1] * (x - g.x) - ax[2] * (y - g.y)
  5029. local gY = g.y + ax[2] * (x - g.x) + ax[1] * (y - g.y)
  5030.  
  5031. if (g.type == 13 and mathpythag(x,y,g.x,g.y,g.width/2) or (mathabs(gX - g.x) < g.width/2 and mathabs(gY - g.y) < g.heigth/2)) then
  5032. local properties = {"Type","ID","X","Y","Heigth","Width","Friction","Restitution","Angle"}
  5033. local info = ""
  5034.  
  5035. for k,v in next,properties do
  5036. info = info .. stringformat("<N>%s : <V>%s\n",v,(v == "ID" and i or v == "Type" and (({[0] = "Unknown","Wood","Ice","Trampoline","Lava","Chocolate","Earth","Grass","Sand","Cloud","Water","Stone","Snow","Rectangle","Circle","Spiderweb"})[g.type + 1]) or tostring(g[stringlower(v)])))
  5037. end
  5038.  
  5039. local mapW = tonumber(mode.bootcampP.mapData.width)
  5040. local mapH = tonumber(mode.bootcampP.mapData.heigth)
  5041. ui.addTextArea(0,info,n,(x + 150 <= mapW and x) or (x < 0 and 0) or (mapW - 150),(y + 180 <= mapH and y > 20 and y) or (y < 20 and 25) or (mapH - 180),nil,nil,nil,nil,.8,false)
  5042. end
  5043. end
  5044. else
  5045. ui.removeTextArea(0,n)
  5046. end
  5047. end,
  5048. -- Keyboard
  5049. eventKeyboard = function(n,k,d,x,y)
  5050. if k == 16 then
  5051. mode.bootcampP.info[n].shift = d
  5052. elseif k == stringbyte("E") and mode.bootcampP.checkpoint then
  5053. if mode.bootcampP.info[n].shift then
  5054. mode.bootcampP.info[n].checkpoint = {false,0,0,mode.bootcampP.info[n].checkpoint[4]}
  5055. ui.removeTextArea(1,n)
  5056. else
  5057. mode.bootcampP.info[n].checkpoint = {true,x,y,true}
  5058. ui.addTextArea(1,"",n,x-5,y-5,10,10,0x56A75A,0x56A75A,.5,true)
  5059. end
  5060. elseif k == stringbyte("K") then
  5061. if d then
  5062. ui.addTextArea(2,mode.bootcampP.rank(tfm.get.room.playerList,{tfm.get.room.playerList,"score"},true,true,"points",20),n,5,30,nil,200,nil,nil,.8,true)
  5063. else
  5064. ui.removeTextArea(2,n)
  5065. end
  5066. elseif k == 46 then
  5067. tfm.exec.killPlayer(n)
  5068. end
  5069. end,
  5070. -- Commands
  5071. eventChatCommand = function(n,c)
  5072. local p = stringsplit(c,"[^%s]+",stringlower)
  5073. if p[1] == "info" then
  5074. tfm.exec.chatMessage("<T>" .. system.getTranslation("info"),n)
  5075. else
  5076. if system.roomAdmins[n] then
  5077. if p[1] == "next" and os.time() > system.newGameTimer then
  5078. tfm.exec.newGame(tablerandom(mode.bootcampP.maps))
  5079. tfm.exec.chatMessage("<T>• " .. stringformat(system.getTranslation("skip"),n))
  5080. elseif p[1] == "again" and os.time() > system.newGameTimer then
  5081. tfm.exec.newGame(tfm.get.room.currentMap)
  5082. tfm.exec.chatMessage("<T>• " .. stringformat(system.getTranslation("restart"),n))
  5083. elseif (p[1] == "np" or p[1] == "map") and os.time() > system.newGameTimer then
  5084. tfm.exec.newGame(p[2])
  5085. tfm.exec.chatMessage("<T>• " .. stringformat(system.getTranslation("loadmap"),n,stringfind(p[2],"@") and p[2] or "@"..p[2]))
  5086. elseif p[1] == "time" then
  5087. tfm.exec.setGameTime(p[2] * 60)
  5088. tfm.exec.chatMessage(stringformat(system.getTranslation("settime"),p[2]))
  5089. elseif p[1] == "standtime" then
  5090. p[2] = p[2] and tonumber(p[2]) or 6
  5091. if p[2] > 0 and p[2] < 10 then
  5092. mode.bootcampP.standardTime = p[2]
  5093. tfm.exec.chatMessage(stringformat(system.getTranslation("setstandtime",p[2])))
  5094. end
  5095. elseif p[1] == "checkpoint" then
  5096. local attribute = false
  5097. if p[2] then
  5098. attribute = true
  5099. if p[2] == "not" and p[3] and p[3] == "cheese" then
  5100. mode.bootcampP.respawnCheese = false
  5101. elseif p[2] == "cheese" then
  5102. mode.bootcampP.respawnCheese = true
  5103. else
  5104. attribute = false
  5105. end
  5106. end
  5107.  
  5108. if not (mode.bootcampP.checkpoint and attribute) then
  5109. mode.bootcampP.checkpoint = not mode.bootcampP.checkpoint
  5110. tfm.exec.chatMessage("<T>Checkpoint " .. system.getTranslation(mode.bootcampP.checkpoint and "enabled" or "disabled"))
  5111.  
  5112. if not mode.bootcampP.checkpoint then
  5113. ui.removeTextArea(1,nil)
  5114. for k,v in next,mode.bootcampP.info do
  5115. v.checkpoint = {false,0,0,v.checkpoint[4]}
  5116. end
  5117. if system.miscAttrib ~= 1 then
  5118. mode.bootcampP.respawnCheese = false
  5119. end
  5120. for k,v in next,mode.bootcampP.info do
  5121. v.cheese = false
  5122. end
  5123. end
  5124. end
  5125. elseif p[1] == "queue" then
  5126. if p[2] == "clear" then
  5127. mode.bootcampP.maps = {}
  5128. tfm.exec.chatMessage("• " .. stringformat(system.getTranslation("queuecleared"),n))
  5129. elseif p[2] == "add" then
  5130. mode.bootcampP.maps[#mode.bootcampP.maps + 1] = p[3]
  5131. tfm.exec.chatMessage("• " .. stringformat(system.getTranslation("queuemapadded"),n,stringfind(p[3],"@") and p[3] or "@"..p[3]))
  5132. elseif p[2] and stringsub(p[2],1,1) == "p" then
  5133. if p[2] == "p3" or p[2] == "p13" or p[2] == "p23" then
  5134. mode.bootcampP.maps[#mode.bootcampP.maps + 1] = "#" .. stringsub(p[2],2)
  5135. tfm.exec.chatMessage("• " .. stringformat(system.getTranslation("queueperm"),n,stringupper(p[2])))
  5136. end
  5137. else
  5138. mode.bootcampP.map()
  5139. tfm.exec.chatMessage("• " .. stringformat(system.getTranslation("queuereset"),n))
  5140. end
  5141. end
  5142. end
  5143. end
  5144. end,
  5145. -- Loop
  5146. eventLoop = function()
  5147. if _G.leftTime < 1 then
  5148. tfm.exec.newGame(tablerandom(mode.bootcampP.maps))
  5149. end
  5150. end,
  5151. -- Player Died
  5152. eventPlayerDied = function(n)
  5153. system.newTimer(function()
  5154. tfm.exec.respawnPlayer(n)
  5155.  
  5156. if mode.bootcampP.checkpoint and mode.bootcampP.info[n].checkpoint[1] then
  5157. tfm.exec.movePlayer(n,mode.bootcampP.info[n].checkpoint[2],mode.bootcampP.info[n].checkpoint[3])
  5158. end
  5159. if mode.bootcampP.checkpoint and mode.bootcampP.info[n].cheese and mode.bootcampP.respawnCheese then
  5160. tfm.exec.giveCheese(n)
  5161. end
  5162. end,1500,false)
  5163. end,
  5164. -- Victory
  5165. eventPlayerWon = function(n,t,time)
  5166. mode.bootcampP.info[n].cheese = false
  5167. mode.bootcampP.info[n].checkpoint = {false,0,0,mode.bootcampP.info[n].checkpoint[4]}
  5168. ui.removeTextArea(1,n)
  5169.  
  5170. mode.bootcampP.eventPlayerDied(n)
  5171. tfm.exec.setPlayerScore(n,1,true)
  5172. tfm.exec.chatMessage(stringformat("<ROSE>%s (%ss <PT>(%scheckpoint)</PT>)",n,time/100,mode.bootcampP.info[n].checkpoint[4] and "" or "no "),n)
  5173. end,
  5174. -- Got Cheese
  5175. eventPlayerGetCheese = function(n)
  5176. if mode.bootcampP.checkpoint and mode.bootcampP.respawnCheese then
  5177. mode.bootcampP.info[n].cheese = true
  5178. end
  5179. end,
  5180. }
  5181.  
  5182. --[[ Map ]]--
  5183. mode.map = {
  5184. -- Translations
  5185. translations = {
  5186. en = {
  5187. -- Init
  5188. welcome = "Welcome to #map! Here you can test your maps in different categories and check its approvation in the community!\n\tAdd a map to the queue with the command <B>!maptest @Code PCategory</B> and check the map info using the command <B>!mapinfo</B>.\n\n\tReport any problem to Bolodefchoco.",
  5189.  
  5190. -- Info
  5191. savenewmap = "Your map %s is in the position %s",
  5192. newmaptime = "Less than %s minutes",
  5193. vote = "Your vote has been recorded.",
  5194. dovote = "Hold P and vote according to your opinion about this map!",
  5195.  
  5196. -- Map Info
  5197. mapby = "Map %s loaded by %s as %s.",
  5198.  
  5199. -- Security
  5200. cantvote = "You cannot vote.",
  5201.  
  5202. -- Simple words
  5203. grounds = "Grounds",
  5204. status = "Status",
  5205. author = "Author",
  5206. },
  5207. br = {
  5208. welcome = "Bem-vindo ao #map! Aqui você pode testar seus mapas em diferentes categorias e checar sua aprovação na comunidade!\n\tAdicione um mapa na lista de espera com o comando <B>!maptest @Código PCategoria</B> e cheque as informações do mapa usando o comando <B>!mapinfo</B>.\n\n\tReporte qualquer problema para Bolodefchoco.",
  5209.  
  5210. savenewmap = "Seu mapa %s está na posição %s",
  5211. newmaptime = "Menos de %s minutos",
  5212. vote = "Seu voto foi registrado.",
  5213. dovote = "Segure P e vote de acordo com sua opinião sobre este mapa!",
  5214.  
  5215. mapby = "Mapa %s carregado por %s como %s.",
  5216.  
  5217. cantvote = "Vote não pode votar.",
  5218.  
  5219. grounds = "Pisos",
  5220. status = "Estado",
  5221. author = "Autor",
  5222. }
  5223. },
  5224. langue = "en",
  5225. -- Data
  5226. info = {},
  5227. -- Maps
  5228. queue = {},
  5229. -- Map Settings
  5230. autoRespawn = false,
  5231. category = -1,
  5232. mapInfo = {},
  5233. canInfo = false,
  5234. totalPlayers = 0,
  5235. skip = false,
  5236. images = {},
  5237. -- Next Map
  5238. nextMap = function()
  5239. if os.time() > system.newGameTimer and #mode.map.queue > 0 then
  5240. local mapData = mode.map.queue[1]
  5241.  
  5242. mode.map.mapInfo = {mapData[1],mapData[2],0,0}
  5243. mode.map.category = mapData[3]
  5244.  
  5245. mode.map.before()
  5246. tfm.exec.newGame(mapData[1])
  5247. end
  5248. end,
  5249. -- Category rules
  5250. before = function()
  5251. if mode.map.category >= 0 then
  5252. if tablefind({0,1,4,5,6,8,9},mode.map.category) then
  5253. tfm.exec.disableAutoShaman(false)
  5254. tfm.exec.disableAfkDeath(false)
  5255. mode.map.autoRespawn = false
  5256. elseif tablefind({3,7,17},mode.map.category) then
  5257. tfm.exec.disableAutoShaman()
  5258. if mode.map.category == 3 then
  5259. mode.map.autoRespawn = true
  5260. tfm.exec.disableAfkDeath()
  5261. end
  5262. end
  5263. end
  5264. end,
  5265. after = function()
  5266. if mode.map.category >= 0 then
  5267. if tablefind({0,1,4,5,6,8,9},mode.map.category) then
  5268. tfm.exec.setGameTime(135)
  5269. if mode.map.category == 8 and mode.map.totalPlayers > 1 then
  5270. local newShaman
  5271. repeat
  5272. newShaman = tablerandom(system.players(true))
  5273. until not tfm.get.room.playerList[newShaman].isShaman
  5274.  
  5275. ui.setShamanName((function()
  5276. for k,v in next,tfm.get.room.playerList do
  5277. if v.isShaman then
  5278. return k
  5279. end
  5280. end
  5281. return "?"
  5282. end)() .. " - <PS>" .. newShaman)
  5283. tfm.exec.setShaman(newShaman)
  5284.  
  5285. local xml = tfm.get.room.xmlMapInfo.xml
  5286. local attribute = stringmatch(xml,"<DC2 (.-)/>")
  5287. if attribute then
  5288. local x = stringmatch(attribute,"X=\"(%d+)\"")
  5289. local y = stringmatch(attribute,"Y=\"(%d+)\"")
  5290. if x and y then
  5291. tfm.exec.movePlayer(newShaman,x,y)
  5292. end
  5293. end
  5294.  
  5295. tfm.exec.setNameColor(newShaman,0xF1C4F6)
  5296. end
  5297. elseif mode.map.category == 3 then
  5298. tfm.exec.setGameTime(360)
  5299. elseif mode.map.category == 7 then
  5300. tfm.exec.setGameTime(120)
  5301. elseif mode.map.category == 17 then
  5302. tfm.exec.setGameTime(63)
  5303. end
  5304. end
  5305. end,
  5306. -- Init
  5307. init = function()
  5308. mode.map.translations.pt = mode.map.translations.br
  5309. mode.map.langue = mode.map.translations[tfm.get.room.community] and tfm.get.room.community or "en"
  5310.  
  5311. tfm.exec.disableAutoNewGame()
  5312. tfm.exec.setGameTime(10,false)
  5313.  
  5314. local alive
  5315. alive,mode.map.totalPlayers = system.players()
  5316. end,
  5317. -- New Player
  5318. eventNewPlayer = function(n)
  5319. if not mode.map.info[n] then
  5320. mode.map.info[n] = {
  5321. hasVoted = false
  5322. }
  5323. end
  5324.  
  5325. for i = 1,2 do
  5326. system.bindKeyboard(n,stringbyte("P"),i == 1,true)
  5327. end
  5328.  
  5329. tfm.exec.chatMessage("<J>" .. system.getTranslation("welcome"),n)
  5330. end,
  5331. -- New Game
  5332. eventNewGame = function()
  5333. ui.removeTextArea(2,nil)
  5334. mode.map.skip = false
  5335. if mode.map.mapInfo[1] then
  5336. mode.map.canInfo = true
  5337.  
  5338. mode.map.after()
  5339. mode.map.after = function() end
  5340. tableremove(mode.map.queue,1)
  5341.  
  5342. for k,v in next,mode.map.info do
  5343. v.hasVoted = false
  5344. end
  5345.  
  5346. for k,v in next,mode.map.images do
  5347. tfm.exec.removeImage(v)
  5348. end
  5349.  
  5350. xml.attribFunc(tfm.get.room.xmlMapInfo.xml,{
  5351. [1] = {
  5352. attribute = "img",
  5353. func = function(value)
  5354. local images = stringsplit(value,"[^;]+")
  5355. for k,v in next,images do
  5356. local info = stringsplit(v,"[^,]+")
  5357.  
  5358. -- "img.png,x or 0,y or 0,0/1 (foreground)"
  5359. info[4] = tonumber(info[4]) or 0
  5360. if tablefind({0,1},info[4]) then
  5361. mode.map.images[#mode.map.images + 1] = tfm.exec.addImage(info[1],(info[4] == 0 and "?" or info[4] == 1 and "&") .. k,tonumber(info[2]) or 5,tonumber(info[3]) or 30)
  5362. end
  5363. end
  5364. end
  5365. }
  5366. })
  5367.  
  5368. tfm.exec.chatMessage("<J>" .. stringformat(system.getTranslation("mapby"),"@" .. mode.map.mapInfo[1],mode.map.mapInfo[2],"P" .. mode.map.category))
  5369. tfm.exec.chatMessage("<J>" .. system.getTranslation("dovote"))
  5370. end
  5371. end,
  5372. -- Commands
  5373. eventChatCommand = function(n,c)
  5374. local p = stringsplit(c,"[^%s]+",stringlower)
  5375. if system.isPlayer(n) and p[1] == "maptest" and p[2] then
  5376. p[2] = tonumber(stringsub(p[2],(stringfind(p[2],"@") and 2 or 1),8))
  5377. if p[2] and #tostring(p[2]) > 3 then
  5378. if #mode.map.mapInfo == 0 then
  5379. tfm.exec.setGameTime(10,false)
  5380. end
  5381.  
  5382. local pos = #mode.map.queue + 1
  5383. local category = (p[3] and tonumber(stringsub(p[3],(stringfind(p[3],"p") and 2 or 1))) or 0)
  5384. if tablefind({0,1,3,4,5,6,7,8,9,17,18},category) then
  5385. if category == 18 then
  5386. category = 1
  5387. end
  5388. else
  5389. category = 0
  5390. end
  5391.  
  5392. mode.map.queue[pos] = {p[2],n,category}
  5393. tfm.exec.chatMessage("<J><B>" .. stringformat(system.getTranslation("savenewmap"),stringformat("@%s (P%s)",p[2],category),"#" .. pos) .. "</B>. <ROSE>" .. stringformat("(%s)",stringformat(system.getTranslation("newmaptime"),pos * 2.5)),n)
  5394. end
  5395. elseif mode.map.mapInfo[1] and p[1] == "mapinfo" then
  5396. local xml = tfm.get.room.xmlMapInfo
  5397. xml = xml and xml.xml or "?"
  5398.  
  5399. local attributes = stringmatch(xml,"<P (.-)/>") or "?"
  5400.  
  5401. local totalGrounds = (function()
  5402. local g = stringmatch(xml,"<S>(.-)</S>") or "?"
  5403.  
  5404. local total = 0
  5405. stringgsub(g,"<S ",function()
  5406. total = total + 1
  5407. end)
  5408.  
  5409. return total
  5410. end)()
  5411.  
  5412. local info = {attributes,system.getTranslation("grounds") .. ": " .. totalGrounds,system.getTranslation("author") .. ": " .. (tfm.get.room.xmlMapInfo.author or "?"),system.getTranslation("status") .. ": " .. ("P" .. tfm.get.room.xmlMapInfo.permCode or "?")}
  5413. ui.addTextArea(2,"\t<J>" .. tableconcat(info," <G>|<J> "),n,5,380,790,20,1,1,.7,true)
  5414. elseif n == mode.map.mapInfo[2] and p[1] == "time" then
  5415. tfm.exec.setGameTime(tonumber(stringsub(p[2],1,3)) or 60,false)
  5416. elseif n == mode.map.mapInfo[2] and p[1] == "skip" then
  5417. if os.time() > system.newGameTimer then
  5418. mode.map.skip = true
  5419. mode.map.mapInfo = {}
  5420. end
  5421. end
  5422. end,
  5423. eventKeyboard = function(n,k,d)
  5424. if k == stringbyte("P") and _G.currentTime > 5 and #mode.map.mapInfo > 0 then
  5425. if d and not mode.map.info[n].hasVoted then
  5426. if n == mode.map.mapInfo[2] or not system.isPlayer(n) then
  5427. tfm.exec.chatMessage("<R>" .. system.getTranslation("cantvote"),n)
  5428. else
  5429. local ic = {{"+","VP"},{"-","R"}}
  5430. for i = 0,1 do
  5431. ui.addTextArea(i,"<p align='center'><font size='6'>\n<font size='17'><" .. ic[i+1][2] .. "><a href='event:" .. ic[i+1][1] .. "'><B>" .. ic[i+1][1] .. "1",n,5 + i * 50,30,40,40,1,1,.7,true)
  5432. end
  5433. end
  5434. else
  5435. for i = 0,1 do
  5436. ui.removeTextArea(i,n)
  5437. end
  5438. end
  5439. end
  5440. end,
  5441. -- Callbacks
  5442. eventTextAreaCallback = function(i,n,c)
  5443. mode.map.info[n].hasVoted = true
  5444. if c == "+" then
  5445. mode.map.mapInfo[3] = mode.map.mapInfo[3] + 1
  5446. elseif c == "-" then
  5447. mode.map.mapInfo[4] = mode.map.mapInfo[4] + 1
  5448. end
  5449. mode.map.eventKeyboard(n,stringbyte("P"),false)
  5450.  
  5451. tfm.exec.chatMessage("• " .. system.getTranslation("vote"),n)
  5452. end,
  5453. -- Loop
  5454. eventLoop = function()
  5455. local alive = 100
  5456. if _G.currentTime % 5 == 0 then
  5457. alive,mode.map.totalPlayers = system.players()
  5458. end
  5459. if _G.leftTime < 1 or alive < 1 or mode.map.skip then
  5460. if mode.map.mapInfo[1] and mode.map.canInfo then
  5461. mode.map.canInfo = false
  5462.  
  5463. local totalVotes = mode.map.mapInfo[3] + mode.map.mapInfo[4]
  5464. if totalVotes > 0 then
  5465. tfm.exec.chatMessage(stringformat("• [@%s] %s%% (%s)",mode.map.mapInfo[1],mathpercent(mode.map.mapInfo[3],totalVotes),totalVotes),mode.map.mapInfo[2])
  5466. end
  5467. end
  5468.  
  5469. if #mode.map.queue > 0 then
  5470. mode.map.nextMap()
  5471. else
  5472. tfm.exec.newGame()
  5473. end
  5474. end
  5475. end,
  5476. -- Player Died
  5477. eventPlayerDied = function(n)
  5478. if mode.map.autoRespawn then
  5479. tfm.exec.respawnPlayer(n)
  5480. end
  5481. end,
  5482. -- Player Won
  5483. eventPlayerWon = function(n)
  5484. mode.map.eventPlayerDied(n)
  5485. end,
  5486. }
  5487.  
  5488. --[[ Godmode ]]--
  5489. mode.godmode = {
  5490. -- Translations
  5491. translations = {
  5492. en = {
  5493. -- Init
  5494. welcome = "Welcome to <B>#godmode</B>. Type !info to read the help message.\n\tReport any issue to Bolodefchoco.",
  5495.  
  5496. -- Guide
  5497. shaman = "Hello shaman! Try to build without nails! Good luck.",
  5498.  
  5499. -- Info
  5500. info = "Use your creativity and build WITHOUT nails in shaman maps! The more mice you save, the higher your score will be. Do not let the mice die.\nPress P or type !p [playername] to open a profile.",
  5501. xp = "You've saved %s mice and %s died.",
  5502.  
  5503. -- Warning
  5504. nail = "You can use %s more nails. After that, you will die.",
  5505. kill = "Try not to use nails in your buildings.",
  5506. fail = "You failed!",
  5507.  
  5508. -- Profile
  5509. profile = "Title : <V>«%s»<N>\n\nRounds : %s\n<N>Shaman : %s <G>/ %s\n\n<N>Deaths : %s",
  5510.  
  5511. -- Titles
  5512. titles = {
  5513. "Shammy",
  5514. "Experienced Shaman",
  5515. "Evil Shaman",
  5516. "Angry Shaman",
  5517. "Spirit",
  5518. "Haunted Shaman",
  5519. "Troll Shaman",
  5520. "Scientist",
  5521. "Physics Master",
  5522. "Black Magic",
  5523. },
  5524. unlock = "%s just unlocked «%s»",
  5525. },
  5526. br = {
  5527. welcome = "Bem-vindo ao <B>#godmode</B>. Digite !info para ler a mensagem de ajuda.\n\tReporte qualquer problema para Bolodefchoco.",
  5528.  
  5529. shaman = "Olá shaman! Tente construir sem pregos! Boa sorte.",
  5530.  
  5531. info = "Utilize sua criatividade e construa em mapas shaman SEM pregos! Quanto mais ratos você salvar, maior será sua pontuação. Não deixe nenhum rato morrer.\nPressione P ou digite !p [nome] para abrir um perfil.",
  5532. xp = "Você salvou %s ratos e %s morreram.",
  5533.  
  5534. nail = "Você pode usar mais %s pregos. Depois disso, você morrerá.",
  5535. kill = "Tente não usar pregos em suas construções.",
  5536. fail = "Você falhou!",
  5537.  
  5538. profile = "Título : <V>«%s»<N>\n\nPartidas : %s\n<N>Shaman : %s <G>/ %s\n\n<N>Mortes : %s",
  5539.  
  5540. titles = {
  5541. "Pequeno Shaman",
  5542. "Shaman Profissional",
  5543. "Shaman Mau",
  5544. "Shaman Bravo",
  5545. "Espírito",
  5546. "Shaman Assombado",
  5547. "Shaman Troll",
  5548. "Cientista",
  5549. "Mestre da Física",
  5550. "Magia Negra",
  5551. },
  5552. unlock = "%s acabou de desbloquear «%s»",
  5553. },
  5554. },
  5555. langue = "en",
  5556. -- Data
  5557. info = {},
  5558. -- Shaman
  5559. getShaman = function()
  5560. local s = {}
  5561. for k,v in next,tfm.get.room.playerList do
  5562. if v.isShaman then
  5563. s[#s + 1] = k
  5564. end
  5565. end
  5566.  
  5567. return s
  5568. end,
  5569. -- New Game Settings
  5570. savedMice = 0,
  5571. deadMice = 0,
  5572. lastShaman = {},
  5573. -- Other Settings
  5574. title = nil,
  5575. titles = {0,10,20,30,40,50,60,70,80,90},
  5576. -- Profile
  5577. profile = function(n,p)
  5578. ui.addTextArea(0,"<p align='center'><B><R><a href='event:profile.close'>X",n,513,115,20,20,1,1,1,true)
  5579. ui.addTextArea(1,"<p align='center'><font size='16'><B><V>"..p.."</V></B></font></p><p align='left'><font size='12'>\n<N>" .. stringformat(system.getTranslation("profile"),mode.godmode.info[p].title,"<V>"..mode.godmode.info[p].roundSha,"<J>"..mode.godmode.info[p].cheeseMice,"<R>"..mode.godmode.info[p].deathMice,"<V>"..mode.godmode.info[p].deathSha),n,290,115,220,160,1,1,1,true)
  5580. end,
  5581. -- Update Menu Bar
  5582. updateMenu = function()
  5583. ui.setShamanName(tableconcat(mode.godmode.getShaman()," - <PS>") .. " <G>| <N>Status : <J>" .. mode.godmode.savedMice .. " <BL>/ <R>" .. mode.godmode.deadMice)
  5584. end,
  5585. -- Init
  5586. reset = function()
  5587. -- Data
  5588. mode.godmode.info = {}
  5589. end,
  5590. init = function()
  5591. -- Translations
  5592. mode.godmode.translations.pt = mode.godmode.translations.br
  5593. mode.godmode.langue = mode.godmode.translations[tfm.get.room.community] and tfm.get.room.community or "en"
  5594.  
  5595. -- Titles
  5596. mode.godmode.title = system.getTranslation("titles")
  5597.  
  5598. -- Init
  5599. tfm.exec.disableAutoNewGame()
  5600. tfm.exec.disableAllShamanSkills()
  5601. tfm.exec.newGame("#4")
  5602.  
  5603. -- Auto Admin
  5604. system.roomAdmins.Mcqv = true
  5605. end,
  5606. -- New Player
  5607. eventNewPlayer = function(n)
  5608. if not mode.godmode.info[n] then
  5609. mode.godmode.info[n] = {
  5610. usedNails = 0,
  5611. roundSha = 0,
  5612. deathSha = 0,
  5613. deathMice = 0,
  5614. cheeseMice = 0,
  5615. title = "Shammy",
  5616. }
  5617. end
  5618.  
  5619. for k,v in next,{66,67,74,78,80,86} do
  5620. system.bindKeyboard(n,v,true,true)
  5621. end
  5622.  
  5623. tfm.exec.chatMessage("<ROSE>" .. system.getTranslation("welcome"),n)
  5624.  
  5625. local id = tfm.exec.addImage("15ca3f4a200.png","&0",5,150,n)
  5626. system.newTimer(function()
  5627. tfm.exec.removeImage(id)
  5628. end,10000,false)
  5629. end,
  5630. -- New Game
  5631. eventNewGame = function()
  5632. if #mode.godmode.lastShaman > 0 then
  5633. for k,v in next,mode.godmode.lastShaman do
  5634. mode.godmode.info[v].cheeseMice = mode.godmode.info[v].cheeseMice + mode.godmode.savedMice
  5635. mode.godmode.info[v].deathMice = mode.godmode.info[v].deathMice + mode.godmode.deadMice
  5636. tfm.exec.chatMessage("<CH>" .. stringformat(system.getTranslation("xp"),mode.godmode.savedMice,mode.godmode.deadMice),v)
  5637.  
  5638.  
  5639. for i = #mode.godmode.titles,1,-1 do
  5640. if mode.godmode.info[v].cheeseMice >= mode.godmode.titles[i] then
  5641. if mode.godmode.info[v].title ~= mode.godmode.title[i] then
  5642. mode.godmode.info[v].title = mode.godmode.title[i]
  5643. tfm.exec.chatMessage("<J>" .. stringformat(system.getTranslation("unlock"),v,mode.godmode.title[i]))
  5644. end
  5645. break
  5646. end
  5647. end
  5648. end
  5649. end
  5650.  
  5651. mode.godmode.savedMice = 0
  5652. mode.godmode.deadMice = 0
  5653.  
  5654. mode.godmode.updateMenu()
  5655.  
  5656. for k,v in next,mode.godmode.info do
  5657. v.usedNails = 0
  5658. end
  5659. for k,v in next,mode.godmode.getShaman() do
  5660. mode.godmode.info[v].roundSha = mode.godmode.info[v].roundSha + 1
  5661. tfm.exec.chatMessage("<CH>" .. system.getTranslation("shaman"),v)
  5662. end
  5663.  
  5664. tfm.exec.setGameTime(183)
  5665. end,
  5666. -- Keyboard
  5667. eventKeyboard = function(n,k)
  5668. if k == 80 then
  5669. mode.godmode.profile(n,n)
  5670. elseif not tfm.get.room.playerList[n].isDead and tfm.get.room.playerList[n].isShaman then
  5671. if tablefind({66,67,74,78,86},k) then -- B;C;V;N;J
  5672. mode.godmode.info[n].usedNails = mode.godmode.info[n].usedNails + 1
  5673. if mode.godmode.info[n].usedNails > 4 then
  5674. tfm.exec.killPlayer(n)
  5675. tfm.exec.chatMessage("<R>" .. system.getTranslation("fail") .. " " .. system.getTranslation("kill"),n)
  5676. else
  5677. tfm.exec.chatMessage("<R>" .. stringformat(system.getTranslation("nail"),5 - mode.godmode.info[n].usedNails),n)
  5678. end
  5679. end
  5680. end
  5681. end,
  5682. -- Summoned
  5683. eventSummoningEnd = function(n,o,x,y,a,i)
  5684. tfm.exec.removeObject(i.id)
  5685.  
  5686. tfm.exec.addShamanObject(o,x,y,a,i.vx,i.vy,i.ghost)
  5687. end,
  5688. -- Loop
  5689. eventLoop = function()
  5690. local alive,total = system.players()
  5691. if _G.leftTime < 2 or (total > 1 and alive < 2) or alive == 0 then
  5692. mode.godmode.lastShaman = mode.godmode.getShaman()
  5693. tfm.exec.newGame("#4")
  5694. end
  5695. end,
  5696. -- Player Died
  5697. eventPlayerDied = function(n)
  5698. if tfm.get.room.playerList[n].isShaman then
  5699. tfm.exec.setGameTime(10,false)
  5700. mode.godmode.info[n].deathSha = mode.godmode.info[n].deathSha + 1
  5701. tfm.exec.chatMessage("<R>" .. system.getTranslation("fail"),n)
  5702. else
  5703. mode.godmode.deadMice = mode.godmode.deadMice + 1
  5704. mode.godmode.updateMenu()
  5705. end
  5706. end,
  5707. -- Player Won
  5708. eventPlayerWon = function(n)
  5709. if not tfm.get.room.playerList[n].isShaman then
  5710. mode.godmode.savedMice = mode.godmode.savedMice + 1
  5711. mode.godmode.updateMenu()
  5712. end
  5713. end,
  5714. -- Commands
  5715. eventChatCommand = function(n,c)
  5716. local p = stringsplit(c,"[^%s]+",stringlower)
  5717. if p[1] == "info" then
  5718. tfm.exec.chatMessage("<J>" .. system.getTranslation("info"),n)
  5719. elseif p[1] == "p" then
  5720. if p[2] then
  5721. p[2] = stringnick(p[2])
  5722. if mode.godmode.info[p[2]] then
  5723. mode.godmode.profile(n,p[2])
  5724. end
  5725. else
  5726. mode.godmode.profile(n,n)
  5727. end
  5728. end
  5729. end,
  5730. -- Callback
  5731. eventTextAreaCallback = function(i,n,c)
  5732. local p = stringsplit(c,"[^%.]+")
  5733. if p[1] == "profile" then
  5734. if p[2] == "close" then
  5735. for i = 0,1 do
  5736. ui.removeTextArea(i,n)
  5737. end
  5738. end
  5739. end
  5740. end,
  5741. }
  5742.  
  5743. --[[ Sharpie ]]--
  5744. mode.sharpie = {
  5745. -- Translations
  5746. translations = {
  5747. en = {
  5748. -- Init
  5749. welcome = "Welcome to #sharpie! Fly pressing space.",
  5750.  
  5751. -- Warning
  5752. nothacker = "The mice flying are NOT hackers!",
  5753.  
  5754. -- Sample words
  5755. won = "won",
  5756.  
  5757. -- Messages
  5758. first = {
  5759. "yay 2 in a row",
  5760. "super pro",
  5761. "oml are you playing alone or what",
  5762. "wooow 4 in a row!",
  5763. "getting hard? good luck pro!",
  5764. "you noob just unlocked the title lightning",
  5765. "woah speedmaster",
  5766. "formula 1",
  5767. "time traveler you sir",
  5768. "queen of the win",
  5769. "as pro as the developer",
  5770. "ILLUMINATI!",
  5771. "are you a real hacker?",
  5772. "I hope you dont loose the chance of seeing the last message",
  5773. "THIS IS A SHIT MESSAGE BECAUSE YOU DIDNT DESERVE IT",
  5774. },
  5775. hardMode = "The hard mode is activated this round!",
  5776. },
  5777. br = {
  5778. welcome = "Bem-vindo ao #sharpie! Voe apertando espaço.",
  5779.  
  5780. nothacker = "Os ratos voando NÃO são hackers!",
  5781.  
  5782. won = "venceu",
  5783.  
  5784. first = {
  5785. "yay 2 seguidas",
  5786. "super pro",
  5787. "omg você tá jogando sozinho ou o que",
  5788. "etaaa 4 seguidas!",
  5789. "ficando difícil? boa sorte mito!",
  5790. "vc noob acaba de desbloquear o título relâmpago",
  5791. "vuash mestre da corrida",
  5792. "relâmpago marquinhos",
  5793. "viajante do tempo vc senhor",
  5794. "rainha da vitória",
  5795. "tão pro quanto o criador do jogo",
  5796. "ILLUMINATI!",
  5797. "éres um hacker de verdade?",
  5798. "Espero que você não perca a chance de ler a última mensagem",
  5799. "ESSA É UMA MENSAGEM DE MERDA PQ VC N MERECEU ISSO",
  5800. },
  5801. hardMode = "O modo difícil está ativado nessa partida!",
  5802. },
  5803. },
  5804. langue = "en",
  5805. -- New Game Settings
  5806. flyPower = -50,
  5807. firstRow = {"",0}, -- Player, amount
  5808. podium = 0,
  5809. totalPlayers = 0,
  5810. hardmode = false,
  5811. modeImages = {"15cbdb3c427","15cbdb479ca","15cbdb4a1ca","15cbdb4cae5"},
  5812. mapInfo = {800,400},
  5813. -- Not Hacker Message
  5814. uiborder = function(t,x,y)
  5815. local colors = {
  5816. {"#F7F918","#EC4848"},
  5817. {"#4CE7F7","#2C9F5B"},
  5818. {"#4BD9CD","#2A64E9"},
  5819. {"#D4F31A","#8C8fA4"},
  5820. }
  5821. local color = tablerandom(colors)
  5822.  
  5823. ui.addTextArea(0,"<font color='" .. color[2] .. "'><B>"..t,nil,x,y-1,900,25,1,1,0,true)
  5824. ui.addTextArea(1,"<font color='" .. color[2] .. "'><B>"..t,nil,x,y+1,900,25,1,1,0,true)
  5825. ui.addTextArea(2,"<font color='" .. color[2] .. "'><B>"..t,nil,x+1,y,900,25,1,1,0,true)
  5826. ui.addTextArea(3,"<font color='" .. color[2] .. "'><B>"..t,nil,x-1,y,900,25,1,1,0,true)
  5827. ui.addTextArea(4,"<font color='" .. color[1] .. "'><B>"..t,nil,x,y,900,25,1,1,0,true)
  5828. end,
  5829. -- Init
  5830. init = function()
  5831. -- Init
  5832. tfm.exec.disableAutoShaman()
  5833. tfm.exec.disableAutoScore()
  5834.  
  5835. tfm.exec.newGame()
  5836. end,
  5837. -- New Game
  5838. eventNewGame = function()
  5839. mode.sharpie.podium = 0
  5840.  
  5841. local currentXml = tfm.get.room.xmlMapInfo
  5842. currentXml = currentXml and currentXml.xml or ""
  5843.  
  5844. mode.sharpie.mapInfo = {800,400}
  5845. mode.sharpie.flyPower = -50
  5846.  
  5847. xml.attribFunc(currentXml or "",{
  5848. [1] = {
  5849. attribute = "G",
  5850. func = function(value)
  5851. value = stringsplit(value,"[^,]+")
  5852. value = tonumber(value[2]) or value
  5853. mode.sharpie.flyPower = value < 0 and 50 or -50
  5854. end
  5855. },
  5856. [2] = {
  5857. attribute = "L",
  5858. func = function(value)
  5859. value = tonumber(value)
  5860. if value then
  5861. mode.sharpie.mapInfo[1] = value
  5862. end
  5863. end
  5864. },
  5865. [3] = {
  5866. attribute = "H",
  5867. func = function(value)
  5868. value = tonumber(value)
  5869. if value then
  5870. mode.sharpie.mapInfo[2] = value
  5871. end
  5872. end
  5873. },
  5874.  
  5875. })
  5876.  
  5877. mode.sharpie.hardmode = mathrandom(10) == 6
  5878. if mode.sharpie.hardmode then
  5879. tfm.exec.chatMessage("<CH>" .. system.getTranslation("hardMode"))
  5880. end
  5881. end,
  5882. -- New Player
  5883. eventNewPlayer = function(n)
  5884. tfm.exec.chatMessage("<CE>" .. system.getTranslation("welcome"),n)
  5885.  
  5886. system.bindKeyboard(n,32,true,true)
  5887. end,
  5888. -- Keyboard
  5889. eventKeyboard = function(n,k,d,x,y)
  5890. if k == 32 then
  5891.  
  5892. tfm.exec.movePlayer(n,0,0,true,0,mode.sharpie.flyPower,true)
  5893. end
  5894. end,
  5895. -- Victory
  5896. eventPlayerWon = function(n)
  5897. mode.sharpie.podium = mode.sharpie.podium + 1
  5898. if mode.sharpie.podium == 1 then
  5899. if mode.sharpie.firstRow[1] == n then
  5900. mode.sharpie.firstRow[2] = mode.sharpie.firstRow[2] + 1
  5901.  
  5902. if mode.sharpie.totalPlayers > 3 then
  5903. local msg = system.getTranslation("first")
  5904. tfm.exec.chatMessage("<G># <ROSE>" .. (msg[mode.sharpie.firstRow[2] - 1] or tablerandom({msg[2],msg[3],msg[6],msg[13],msg[15]})),n)
  5905. end
  5906. else
  5907. mode.sharpie.firstRow = {n,1}
  5908. end
  5909.  
  5910. tfm.exec.setPlayerScore(n,(mode.sharpie.firstRow[2]+1) * 5,true)
  5911.  
  5912. tfm.exec.chatMessage(stringformat("<J>%s %s! %s",n,system.getTranslation("won"),mode.sharpie.firstRow[2] > 1 and "("..mode.sharpie.firstRow[2]..")" or ""))
  5913. else
  5914. tfm.exec.setPlayerScore(n,5,true)
  5915. end
  5916. end,
  5917. -- Loop
  5918. eventLoop = function()
  5919. if _G.currentTime % 5 == 0 then
  5920. local alive,total = system.players()
  5921. mode.sharpie.totalPlayers = total
  5922.  
  5923. -- Warning
  5924. mode.sharpie.uiborder(system.getTranslation("nothacker"),10,382)
  5925. end
  5926.  
  5927. if mode.sharpie.hardmode and _G.currentTime % 14 == 0 then
  5928. system.newTimer(function()
  5929. local x,y = mathrandom(0,mode.sharpie.mapInfo[1]),mathrandom(0,mode.sharpie.mapInfo[2])
  5930. local id = tfm.exec.addImage(tablerandom(mode.sharpie.modeImages) .. ".png","&0",x - 56,y - 51) -- 112x103 img
  5931. system.newTimer(function()
  5932. tfm.exec.removeImage(id)
  5933.  
  5934. tfm.exec.displayParticle(24,x,y)
  5935. tfm.exec.explosion(x,y,50,100)
  5936. end,1250,false)
  5937. end,1000,false)
  5938. end
  5939. end,
  5940. }
  5941.  
  5942. --[[ Non-official Events ]]--
  5943. system.objects = {
  5944. image = {},
  5945. textarea = {}
  5946. }
  5947. eventModeChanged = function()
  5948. -- Remove content
  5949. for k in next,system.objects.image do
  5950. tfm.exec.removeImage(k)
  5951. end
  5952.  
  5953. for k in next,system.objects.textarea do
  5954. ui.removeTextArea(k,nil)
  5955. end
  5956.  
  5957. system.objects = {
  5958. image = {},
  5959. textarea = {}
  5960. }
  5961.  
  5962. ui.addPopup(0,0,"",nil,-1500,-1500)
  5963.  
  5964. -- Unbind keyboard and mouse, also normalize color name and scores
  5965. for k in next,tfm.get.room.playerList do
  5966. for i = 0,255 do
  5967. for v = 0,1 do
  5968. system.bindKeyboard(k,i,v == 0,false)
  5969. end
  5970. end
  5971.  
  5972. system.bindMouse(k,false)
  5973.  
  5974. tfm.exec.setNameColor(k,-1)
  5975. tfm.exec.setPlayerScore(k,0)
  5976. end
  5977.  
  5978. -- Set admin back
  5979. system.roomAdmins = system.setAdmins()
  5980.  
  5981. -- Reset settings
  5982. for k,v in next,{"AutoScore","WatchCommand","AutoNewGame","AutoShaman","AllShamanSkills","MortCommand","DebugCommand","MinimalistMode","AfkDeath","PhysicalConsumables","AutoTimeLeft"} do
  5983. tfm.exec["disable" .. v](false)
  5984. end
  5985. tfm.exec.setAutoMapFlipMode()
  5986.  
  5987. tfm.exec.setRoomMaxPlayers(25)
  5988. tfm.exec.setRoomPassword("")
  5989. end
  5990.  
  5991. --[[ Event Functions ]]--
  5992. events = {}
  5993.  
  5994. events.eventLoop = function(currentTime,leftTime)
  5995. _G.currentTime = normalizeTime(currentTime / 1e3)
  5996. _G.leftTime = normalizeTime(leftTime / 1e3)
  5997. end
  5998.  
  5999. events.eventChatCommand = function(n,c)
  6000. disableChatCommand(c)
  6001. if module._FREEACCESS[n] then
  6002. if c == "refresh" and (not system.isRoom or module._FREEACCESS[n] > 1) then
  6003. eventModeChanged()
  6004. system.init(true)
  6005. elseif stringsub(c,1,4) == "room" and (not system.isRoom or module._FREEACCESS[n] > 1) then
  6006. system.roomNumber = tonumber(stringsub(c,6)) or 0
  6007. if _G["eventChatCommand"] then
  6008. eventChatCommand(n,"refresh")
  6009. end
  6010. elseif stringsub(c,1,4) == "load" and (not system.isRoom or module._FREEACCESS[n] > 2) then
  6011. if os.time() > system.modeChanged and os.time() > system.newGameTimer then
  6012. local newMode = system.getGameMode(stringsub(c,6),true)
  6013. if newMode then
  6014. system.init(system.isRoom)
  6015. end
  6016. end
  6017. end
  6018. end
  6019. if stringsub(c,1,6) == "module" then
  6020. c = stringupper(stringsub(c,8))
  6021. if module["_" .. c] then
  6022. tfm.exec.chatMessage(c .. " : " .. tableconcat(tableturnTable(module["_" .. c]),"\n",function(k,v)
  6023. return (c == "FREEACCESS" and stringformat("%s(%s)",k,v) or v)
  6024. end),n)
  6025. else
  6026. tfm.exec.chatMessage(stringformat("VERSION : %s\nNAME : %s\nSTATUS : %s\nAUTHOR : %s\n\nMODE : %s",module._VERSION,module._NAME,module._STATUS,module._AUTHOR,system.gameMode),n)
  6027. end
  6028. elseif c == "modes" then
  6029. tfm.exec.chatMessage(tableconcat(system.submodes,"\n",function(k,v)
  6030. return "#" .. system.normalizedModeName(v)
  6031. end),n)
  6032. elseif c == "admin" then
  6033. tfm.exec.chatMessage(tableconcat(system.roomAdmins,", ",tostring),n)
  6034. elseif c == "stop" and system.roomAdmins[n] then
  6035. system.exit()
  6036. elseif stringsub(c,1,3) == "adm" and (system.roomAdmins[n] or module._FREEACCESS[n] > 2) then
  6037. system.roomAdmins[stringnick(stringsub(c,5))] = true
  6038. end
  6039. end
  6040.  
  6041. events.eventNewPlayer = function(n)
  6042.  
  6043. if system.officialMode[2] ~= "" then
  6044. tfm.exec.chatMessage(system.officialMode[2],n)
  6045. end
  6046. end
  6047.  
  6048. --[[ Room Settings ]]--
  6049. system.roomSettings = {
  6050. ["@"] = function(n)
  6051. system.roomAdmins[stringnick(n)] = true
  6052. end,
  6053. ["#"] = function(id)
  6054. system.miscAttrib = tonumber(id) or 1
  6055. system.miscAttrib = mathsetLim(system.miscAttrib,1,99) -- mathmax(1,mathmin(system.miscAttrib,99))
  6056. end,
  6057. ["*"] = function(name)
  6058. local game = system.getGameMode(name)
  6059. if not game then
  6060. system.gameMode = "grounds"
  6061. end
  6062. end
  6063. }
  6064. system.setRoom = function()
  6065. if system.isRoom and system.roomAttributes then
  6066. local chars = ""
  6067. for k in next,system.roomSettings do
  6068. chars = chars .. k
  6069. end
  6070.  
  6071. for char,value in stringgmatch(system.roomAttributes,"(["..chars.."])([^"..chars.."]+)") do
  6072. value = stringmatch(value,"[^%s]+")
  6073. for k,v in next,system.roomSettings do
  6074. if k == char then
  6075. v(value)
  6076. break
  6077. end
  6078. end
  6079. end
  6080.  
  6081. local officialModes = {
  6082. {"vanilla","<VP>Enjoy your vanilla (: .. okno"},
  6083. {"survivor","<R>Aw, you cannot play survivor on #grounds"},
  6084. {"racing","<CH>Uh, racing? Good luck!"},
  6085. {"music","<BV>Music? Nice choice! Why don't you try a rock'n'roll?"},
  6086. {"bootcamp","<PT>Bootcamp? Ok. This is unfair and your data won't be saved out of the room."},
  6087. {"defilante","<R>Aw, you cannot play defilante on #grounds"},
  6088. {"village","<R>You cannot play village on #grounds. Please, change your room."},
  6089. }
  6090. for k,v in next,officialModes do
  6091. if stringfind(system.roomAttributes,v[1] .. "$") then
  6092. system.officialMode = {v[1],v[2]}
  6093. break
  6094. end
  6095. end
  6096. end
  6097. end
  6098.  
  6099. --[[ Initialize ]]--
  6100. execute = {}
  6101. system.setRoom()
  6102.  
  6103. system.init = function(refresh)
  6104. for i,event in next,{"Loop","NewGame","PlayerDied","PlayerGetCheese","PlayerVampire","PlayerWon","PlayerLeft","EmotePlayed","Keyboard","Mouse","PopupAnswer","TextAreaCallback","ChatCommand","ChatMessage","SummoningStart","SummoningEnd","SummoningCancel","NewPlayer","PlayerRespawn","ColorPicked"} do
  6105. local e = "event" .. event
  6106.  
  6107. local found = false
  6108. for k,v in next,mode[system.gameMode] do
  6109. if k == e then
  6110. execute[e] = v
  6111. found = true
  6112. break
  6113. end
  6114. end
  6115. if not found then
  6116. execute[e] = function() end
  6117. end
  6118.  
  6119. _G[e] = function(...)
  6120. if events[e] then
  6121. events[e](...)
  6122. end
  6123. execute[e](...)
  6124. end
  6125. end
  6126.  
  6127. if refresh then
  6128. if mode[system.gameMode].reset then
  6129. mode[system.gameMode].reset()
  6130. end
  6131. end
  6132.  
  6133. if _G["eventNewPlayer"] then
  6134. tableforeach(tfm.get.room.playerList,eventNewPlayer)
  6135. end
  6136.  
  6137. normalizeTranslation()
  6138. mode[system.gameMode].init()
  6139. end
  6140. system.init()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement