Advertisement
Guest User

Untitled

a guest
Jul 30th, 2013
1,687
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 10.73 KB | None | 0 0
  1. local settings = {
  2.     --maps = {"@3953007", "@3990592", "@3990579", "@3859330", "@3993469", "@3994079", "@3994356", "@3994362", "@3994429", "@3994553", "@3729729"},
  3.     maps = {"@3953007", "@3990579", "@3729695", "@3859330", "@3729729", "@3488174", "@3998242"},
  4.     --maps = {"@3953007"}, 
  5.     afk = 60,
  6.     win = 25,
  7.     ground = 350,
  8.     center = 400,
  9. };
  10.  
  11. local text = {
  12.     welcome = "<J>Welcome to lagball! Please report any issues to Makinit. You can now submit maps! http://transformice.com/forum/?s=322386"
  13. };
  14.  
  15. local keyboard = {left = 37, up = 38, right = 39, a = 65, d = 68, q = 81, w = 87, z = 90};
  16.  
  17. local players = {};
  18. local game = nil
  19. local queue = {};
  20.  
  21. team1 = {id = 1, score = 1, colour = "0x0000FF", colour2 = "0x8888FF", tag = "<BV>", name = "the blue team", players = {}};
  22. team2 = {id = 2, score = 1, colour = "0xFF0000", colour2 = "0xFF8888", tag = "<R>", name = "the red team", players = {}};
  23. ball = nil;
  24.  
  25. players = {};
  26. spectators = {};
  27.  
  28. function main()
  29.     local parts = split(tfm.get.room.name, "%s")
  30.     if #parts > 1 and string.lower(parts[2]) == "map" and parts[3] then
  31.         settings.maps = {parts[3]};
  32.     end
  33.  
  34.     command.addHandler("t", doTeamChat);
  35.    
  36.     debug.disableEventLog(true);
  37.     tfm.exec.disableAutoScore(true);
  38.     tfm.exec.disableAutoShaman(true);
  39.     tfm.exec.disableAutoNewGame(true);
  40.     tfm.exec.setGameTime(0, true);
  41.     tfm.exec.chatMessage(text.welcome);
  42.     for name, player in pairs(tfm.get.room.playerList) do
  43.         players[name] = {};
  44.     end
  45.     newGame();
  46. end
  47.  
  48. local sprites = {
  49.     [0] = {
  50.     {true,true,true},
  51.     {true,false,true},
  52.     {true,false,true},
  53.     {true,false,true},
  54.     {true,true,true}
  55.     }, {
  56.     {false,true,false},
  57.     {false,true,false},
  58.     {false,true,false},
  59.     {false,true,false},
  60.     {false,true,false}
  61.     }, {
  62.     {true,true,true},
  63.     {false,false,true},
  64.     {true,true,true},
  65.     {true,false,false},
  66.     {true,true,true}
  67.     }, {
  68.     {true,true,true},
  69.     {false,false,true},
  70.     {true,true,true},
  71.     {false,false,true},
  72.     {true,true,true}
  73.     }, {
  74.     {true,false,true},
  75.     {true,false,true},
  76.     {true,true,true},
  77.     {false,false,true},
  78.     {false,false,true}
  79.     }, {
  80.     {true,true,true},
  81.     {true,false,false},
  82.     {true,true,true},
  83.     {false,false,true},
  84.     {true,true,true}
  85.     }, {
  86.     {true,true,true},
  87.     {true,false,false},
  88.     {true,true,true},
  89.     {true,false,true},
  90.     {true,true,true}
  91.     }, {
  92.     {true,true,true},
  93.     {false,false,true},
  94.     {false,false,true},
  95.     {false,false,true},
  96.     {false,false,true}
  97.     }, {
  98.     {true,true,true},
  99.     {true,false,true},
  100.     {true,true,true},
  101.     {true,false,true},
  102.     {true,true,true}
  103.     }, {
  104.     {true,true,true},
  105.     {true,false,true},
  106.     {true,true,true},
  107.     {false,false,true},
  108.     {true,true,true}
  109.     }
  110. }
  111.  
  112. function newGame()
  113.     if winner then
  114.         for i, player in pairs(winner.players) do
  115.             tfm.exec.playerVictory(player);
  116.         end
  117.     end
  118.     tfm.exec.newGame(settings.maps[math.random(#settings.maps)]);
  119. end
  120.  
  121. local start;
  122. function eventNewGame()
  123.     local now = os.time();
  124.     -- hack to deal with double call at room initiation
  125.     if not start or start < now - 1000 then
  126.         team1.players = {};
  127.         team2.players = {};
  128.         team1.score = 0;
  129.         team2.score = 0;
  130.         team1.display = display.new(2, 18, 12);
  131.         team2.display = display.new(702, 18, 12);
  132.         plotScore(team1);
  133.         plotScore(team2);
  134.         winner = nil;
  135.         for name, player in pairs(players) do
  136.             addPlayer(name);
  137.         end
  138.         ball = nil;
  139.     end
  140.     start = now;
  141. end
  142.  
  143. function eventLoop()
  144.     if not winner then
  145.         local object = tfm.get.room.objectList[ball];
  146.         if object and object.y > settings.ground then
  147.             local limit = os.time() - settings.afk * 1000;
  148.             for name, player in pairs(players) do
  149.                 if player.active and player.active < limit then
  150.                     tfm.exec.killPlayer(name);
  151.                 end
  152.             end
  153.             tfm.exec.removeObject(ball);
  154.             ball = nil;
  155.             if object.x < settings.center or (object.x == 0 and object.y == 0) then
  156.                 score(team2, team1)
  157.                 if #team1.players > 0 then
  158.                     ball = tfm.exec.addShamanObject(tfm.enum.shamanObject.ball, 100, settings.ground - 100, 0, 0, -10, false);
  159.                 end
  160.             elseif object.x > settings.center then
  161.                 score(team1, team2)
  162.                 if #team2.players > 0 then
  163.                     ball = tfm.exec.addShamanObject(tfm.enum.shamanObject.ball, 700, settings.ground - 100, 0, 0, -10, false);
  164.                 end
  165.             end
  166.         end
  167.         if not ball then
  168.             if #team1.players > 0 and math.random() > 0.5 then
  169.                 ball = tfm.exec.addShamanObject(tfm.enum.shamanObject.ball, 100, settings.ground - 100, 0, 0, -10, false);
  170.             elseif #team2.players > 0 then
  171.                 ball = tfm.exec.addShamanObject(tfm.enum.shamanObject.ball, 700, settings.ground - 100, 0, 0, -10, false);
  172.             end
  173.         end
  174.     else
  175.         local left = 50;
  176.         local right = 750;
  177.         if winner == team1 then
  178.             right = settings.center;
  179.         elseif winner == team2 then
  180.             left = settings.center;
  181.         end
  182.         tfm.exec.addShamanObject(tfm.enum.shamanObject.balloon, math.random(left, right), 350, 0, 0, -10, false);
  183.     end
  184.     tfm.exec.setGameTime(60 * team1.score + team2.score + 1, true);
  185. end
  186.  
  187. function score(scorer, loser)
  188.     scorer.score = scorer.score + 1
  189.     for i, player in ipairs(scorer.players) do
  190.         tfm.exec.setPlayerScore(player, 1, true);
  191.     end
  192.     plotScore(scorer);
  193.  
  194.     if scorer.score >= settings.win and scorer.score > loser.score + 1 then
  195.         winner = scorer;
  196.         tfm.exec.chatMessage(team1.tag .. team1.name .. " <V>" .. team1.score .. "<BL> - <V>" .. team2.score .. team2.tag .. " " .. team2.name);
  197.         tfm.exec.chatMessage("<J>Well done, players of " .. winner.tag .. winner.name .. "<J>, you win!");
  198.         system.newTimer(newGame, 20000, false);
  199.         for i, player in pairs(winner.players) do
  200.             tfm.exec.giveCheese(player);
  201.         end
  202.     end
  203. end
  204.  
  205. function plotScore(team)
  206.     local digit1, digit2 = math.floor(team.score / 10), team.score % 10;
  207.     team.display.plotMap(sprites[digit1], 1, 1);
  208.     team.display.plotMap(sprites[digit2], 5, 1);
  209. end
  210.  
  211. function eventKeyboard(player)
  212.     if not players[player] then
  213.         addPlayer(player)
  214.     end
  215.     players[player].active = os.time()
  216. end
  217.  
  218. function eventNewPlayer(player)
  219.     tfm.exec.chatMessage(text.welcome, player);
  220.     addPlayer(player);
  221.     players[player].active = os.time()
  222. end
  223.  
  224. function addPlayer(player)
  225.     players[player] = {};
  226.     for key, code in pairs(keyboard) do
  227.         tfm.exec.bindKeyboard(player, code, true, true);
  228.         tfm.exec.bindKeyboard(player, code, false, true);
  229.     end
  230.    
  231.     local team;
  232.     if #team1.players < #team2.players then
  233.         team = team1;
  234.     elseif #team1.players > #team2.players then
  235.         team = team2;
  236.     elseif math.random() < 0.5 then
  237.         team = team1;
  238.     else
  239.         team = team2;
  240.     end
  241.     table.insert(team.players, player);
  242.     players[player].team = team;
  243.    
  244.     tfm.exec.chatMessage("<J>You joined " .. team.tag .. team.name .. "<J>!", player);
  245.     tfm.exec.setNameColor(player, team.colour);
  246.    
  247.     tfm.exec.respawnPlayer(player);
  248.     if team == team1 then
  249.         tfm.exec.movePlayer(player, math.random(50, 350), settings.ground - 10);
  250.     elseif team == team2 then
  251.         tfm.exec.movePlayer(player, math.random(450, 750), settings.ground - 10);
  252.     end
  253. end
  254.  
  255. function removePlayer(player)
  256.     if players[player] then
  257.         local team = players[player].team;
  258.         local index;
  259.         for i, name in ipairs(team.players) do
  260.             if name == player then
  261.                 index = i;
  262.             end
  263.         end
  264.         table.remove(team.players, index);
  265.         players[player] = nil;
  266.     end
  267. end
  268.  
  269. function eventPlayerLeft(player)
  270.     removePlayer(player);
  271.    
  272.     for key, code in pairs(keyboard) do
  273.         tfm.exec.bindKeyboard(player, code, true, false);
  274.         tfm.exec.bindKeyboard(player, code, false, false);
  275.     end
  276. end
  277.  
  278. function doTeamChat(player, ...)
  279.     if players[player] then
  280.         local team = players[player].team;
  281.         local text = string.gsub(string.gsub(table.concat(arg, " "), "<", "&lt;"), ">", "&gt;");
  282.         if team and text and text ~= "" then
  283.             local message = team.tag .. "[" .. player .. "]<N> " .. text;
  284.             for i, name in ipairs(team.players) do
  285.                 tfm.exec.chatMessage(message, name);
  286.             end
  287.         end
  288.     end
  289. end
  290.  
  291. function eventPlayerDied(player)
  292.     removePlayer(player);
  293.     tfm.exec.chatMessage("<J>You are removed from the game because you didn't move. Press a movement key or space to return.", player)
  294. end
  295.  
  296. -- display constructor
  297.  
  298. display = {};
  299. function display.new(x, y, pixel)
  300.     local this = {
  301.         x = x or 0,
  302.         y = y or 0,
  303.         pixel = pixel or 12,
  304.         objects = {}
  305.     };
  306.    
  307.     this.plotPoint = function(x, y, colour)
  308.         if not this.objects[x] then
  309.             this.objects[x] = {};
  310.         end
  311.         local object = this.objects[x][y];
  312.         if object and not colour then
  313.             tfm.exec.removeObject(object);
  314.             this.objects[x][y] = nil;
  315.         elseif not object and colour then
  316.             local x2 = this.x + (x - 1) * this.pixel;
  317.             local y2 = this.y + (y - 1) * this.pixel;
  318.             this.objects[x][y] = tfm.exec.addShamanObject(34, x2, y2, 0, 0, 0, true);
  319.         end
  320.     end
  321.    
  322.     this.plotMap = function(map, dx, dy)
  323.         dx = dx or 0;
  324.         dy = dy or 0;
  325.         for y, row in ipairs(map) do
  326.             for x, colour in ipairs(row) do
  327.                 this.plotPoint(dx + x, dy + y, colour);
  328.             end
  329.         end
  330.     end
  331.    
  332.     return this;
  333. end
  334.  
  335. -- command handling
  336.  
  337. function eventChatCommand(player, message)
  338.     local args = split(message, "%s");
  339.     local text = table.remove(args, 1);
  340.    
  341.     command.handle(string.lower(text), player, args);
  342. end
  343.  
  344. command = {handlers = {}};
  345.  
  346. function command.addHandler(text, handler)
  347.     if command.handlers[text] == nil then
  348.         command.handlers[text] = {};
  349.         system.disableChatCommandDisplay(text, true);
  350.     end
  351.     table.insert(command.handlers[text], handler);
  352. end
  353.    
  354. function command.removeHandler(text, handler)
  355.     if command.handlers[text] ~= nil then
  356.         local index
  357.         for i, h in ipairs(command.handlers[text]) do
  358.             if handler == h then
  359.                 index = i;
  360.             end
  361.         end
  362.         if index ~= nil then
  363.             table.remove(command.handlers[text], index)
  364.             if table.getn(command.handlers[text]) == 0 then
  365.                 command.handlers[text] = nil;
  366.                 --system.disableChatCommandDisplay(text, false);
  367.             end
  368.         end
  369.     end
  370. end
  371.  
  372. function command.handle(text, player, args)
  373.     if command.handlers[text] ~= nil then
  374.         for i, handler in ipairs(command.handlers[text]) do
  375.             handler(player, unpack(args));
  376.         end
  377.     end
  378. end
  379.  
  380. function split(input, seperator)
  381.     local res = {};
  382.     for part in string.gmatch(input, "[^" .. seperator .. "]+") do
  383.         table.insert(res, part);
  384.     end
  385.     return res;
  386. end
  387.  
  388. -- system unpack is unavailable
  389. function unpack (t, i)
  390.     i = i or 1
  391.     if t[i] ~= nil then
  392.         return t[i], unpack(t, i + 1)
  393.     end
  394. end
  395.  
  396. function table.copy(t, d)
  397.     local t2 = {}
  398.     for k, v in pairs(t) do
  399.         if d then
  400.             if type(k) == "table" then
  401.                 k = table.copy(k, true)
  402.             end
  403.             if type(v) == "table" then
  404.                 v = table.copy(v, true)
  405.             end
  406.         end
  407.         t2[k] = v
  408.     end
  409.     return t2
  410. end
  411.  
  412. function table.keys(t)
  413.     local t2 = {}
  414.     for k in pairs(t) do
  415.         table.insert(t2, k)
  416.     end
  417.     return t2
  418. end
  419.  
  420. function table.switch(t)
  421.     local t2 = {}
  422.     for k, v in pairs(t) do
  423.         if t2[v] == nil then
  424.             t2[v] = {}
  425.         end
  426.         table.insert(t2[v], k)
  427.     end
  428.     return t2
  429. end
  430.  
  431. function table.clear(t)
  432.     for i, v in ipairs(table.keys(t)) do
  433.         t[v] = nil
  434.     end
  435. end
  436.  
  437. main();
  438. --system.exit()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement