Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- local settings = {
- --maps = {"@3953007", "@3990592", "@3990579", "@3859330", "@3993469", "@3994079", "@3994356", "@3994362", "@3994429", "@3994553", "@3729729"},
- maps = {"@3953007", "@3990579", "@3729695", "@3859330", "@3729729", "@3488174", "@3998242"},
- --maps = {"@3953007"},
- afk = 60,
- win = 25,
- ground = 350,
- center = 400,
- };
- local text = {
- welcome = "<J>Welcome to lagball! Please report any issues to Makinit. You can now submit maps! http://transformice.com/forum/?s=322386"
- };
- local keyboard = {left = 37, up = 38, right = 39, a = 65, d = 68, q = 81, w = 87, z = 90};
- local players = {};
- local game = nil
- local queue = {};
- team1 = {id = 1, score = 1, colour = "0x0000FF", colour2 = "0x8888FF", tag = "<BV>", name = "the blue team", players = {}};
- team2 = {id = 2, score = 1, colour = "0xFF0000", colour2 = "0xFF8888", tag = "<R>", name = "the red team", players = {}};
- ball = nil;
- players = {};
- spectators = {};
- function main()
- local parts = split(tfm.get.room.name, "%s")
- if #parts > 1 and string.lower(parts[2]) == "map" and parts[3] then
- settings.maps = {parts[3]};
- end
- command.addHandler("t", doTeamChat);
- debug.disableEventLog(true);
- tfm.exec.disableAutoScore(true);
- tfm.exec.disableAutoShaman(true);
- tfm.exec.disableAutoNewGame(true);
- tfm.exec.setGameTime(0, true);
- tfm.exec.chatMessage(text.welcome);
- for name, player in pairs(tfm.get.room.playerList) do
- players[name] = {};
- end
- newGame();
- end
- local sprites = {
- [0] = {
- {true,true,true},
- {true,false,true},
- {true,false,true},
- {true,false,true},
- {true,true,true}
- }, {
- {false,true,false},
- {false,true,false},
- {false,true,false},
- {false,true,false},
- {false,true,false}
- }, {
- {true,true,true},
- {false,false,true},
- {true,true,true},
- {true,false,false},
- {true,true,true}
- }, {
- {true,true,true},
- {false,false,true},
- {true,true,true},
- {false,false,true},
- {true,true,true}
- }, {
- {true,false,true},
- {true,false,true},
- {true,true,true},
- {false,false,true},
- {false,false,true}
- }, {
- {true,true,true},
- {true,false,false},
- {true,true,true},
- {false,false,true},
- {true,true,true}
- }, {
- {true,true,true},
- {true,false,false},
- {true,true,true},
- {true,false,true},
- {true,true,true}
- }, {
- {true,true,true},
- {false,false,true},
- {false,false,true},
- {false,false,true},
- {false,false,true}
- }, {
- {true,true,true},
- {true,false,true},
- {true,true,true},
- {true,false,true},
- {true,true,true}
- }, {
- {true,true,true},
- {true,false,true},
- {true,true,true},
- {false,false,true},
- {true,true,true}
- }
- }
- function newGame()
- if winner then
- for i, player in pairs(winner.players) do
- tfm.exec.playerVictory(player);
- end
- end
- tfm.exec.newGame(settings.maps[math.random(#settings.maps)]);
- end
- local start;
- function eventNewGame()
- local now = os.time();
- -- hack to deal with double call at room initiation
- if not start or start < now - 1000 then
- team1.players = {};
- team2.players = {};
- team1.score = 0;
- team2.score = 0;
- team1.display = display.new(2, 18, 12);
- team2.display = display.new(702, 18, 12);
- plotScore(team1);
- plotScore(team2);
- winner = nil;
- for name, player in pairs(players) do
- addPlayer(name);
- end
- ball = nil;
- end
- start = now;
- end
- function eventLoop()
- if not winner then
- local object = tfm.get.room.objectList[ball];
- if object and object.y > settings.ground then
- local limit = os.time() - settings.afk * 1000;
- for name, player in pairs(players) do
- if player.active and player.active < limit then
- tfm.exec.killPlayer(name);
- end
- end
- tfm.exec.removeObject(ball);
- ball = nil;
- if object.x < settings.center or (object.x == 0 and object.y == 0) then
- score(team2, team1)
- if #team1.players > 0 then
- ball = tfm.exec.addShamanObject(tfm.enum.shamanObject.ball, 100, settings.ground - 100, 0, 0, -10, false);
- end
- elseif object.x > settings.center then
- score(team1, team2)
- if #team2.players > 0 then
- ball = tfm.exec.addShamanObject(tfm.enum.shamanObject.ball, 700, settings.ground - 100, 0, 0, -10, false);
- end
- end
- end
- if not ball then
- if #team1.players > 0 and math.random() > 0.5 then
- ball = tfm.exec.addShamanObject(tfm.enum.shamanObject.ball, 100, settings.ground - 100, 0, 0, -10, false);
- elseif #team2.players > 0 then
- ball = tfm.exec.addShamanObject(tfm.enum.shamanObject.ball, 700, settings.ground - 100, 0, 0, -10, false);
- end
- end
- else
- local left = 50;
- local right = 750;
- if winner == team1 then
- right = settings.center;
- elseif winner == team2 then
- left = settings.center;
- end
- tfm.exec.addShamanObject(tfm.enum.shamanObject.balloon, math.random(left, right), 350, 0, 0, -10, false);
- end
- tfm.exec.setGameTime(60 * team1.score + team2.score + 1, true);
- end
- function score(scorer, loser)
- scorer.score = scorer.score + 1
- for i, player in ipairs(scorer.players) do
- tfm.exec.setPlayerScore(player, 1, true);
- end
- plotScore(scorer);
- if scorer.score >= settings.win and scorer.score > loser.score + 1 then
- winner = scorer;
- tfm.exec.chatMessage(team1.tag .. team1.name .. " <V>" .. team1.score .. "<BL> - <V>" .. team2.score .. team2.tag .. " " .. team2.name);
- tfm.exec.chatMessage("<J>Well done, players of " .. winner.tag .. winner.name .. "<J>, you win!");
- system.newTimer(newGame, 20000, false);
- for i, player in pairs(winner.players) do
- tfm.exec.giveCheese(player);
- end
- end
- end
- function plotScore(team)
- local digit1, digit2 = math.floor(team.score / 10), team.score % 10;
- team.display.plotMap(sprites[digit1], 1, 1);
- team.display.plotMap(sprites[digit2], 5, 1);
- end
- function eventKeyboard(player)
- if not players[player] then
- addPlayer(player)
- end
- players[player].active = os.time()
- end
- function eventNewPlayer(player)
- tfm.exec.chatMessage(text.welcome, player);
- addPlayer(player);
- players[player].active = os.time()
- end
- function addPlayer(player)
- players[player] = {};
- for key, code in pairs(keyboard) do
- tfm.exec.bindKeyboard(player, code, true, true);
- tfm.exec.bindKeyboard(player, code, false, true);
- end
- local team;
- if #team1.players < #team2.players then
- team = team1;
- elseif #team1.players > #team2.players then
- team = team2;
- elseif math.random() < 0.5 then
- team = team1;
- else
- team = team2;
- end
- table.insert(team.players, player);
- players[player].team = team;
- tfm.exec.chatMessage("<J>You joined " .. team.tag .. team.name .. "<J>!", player);
- tfm.exec.setNameColor(player, team.colour);
- tfm.exec.respawnPlayer(player);
- if team == team1 then
- tfm.exec.movePlayer(player, math.random(50, 350), settings.ground - 10);
- elseif team == team2 then
- tfm.exec.movePlayer(player, math.random(450, 750), settings.ground - 10);
- end
- end
- function removePlayer(player)
- if players[player] then
- local team = players[player].team;
- local index;
- for i, name in ipairs(team.players) do
- if name == player then
- index = i;
- end
- end
- table.remove(team.players, index);
- players[player] = nil;
- end
- end
- function eventPlayerLeft(player)
- removePlayer(player);
- for key, code in pairs(keyboard) do
- tfm.exec.bindKeyboard(player, code, true, false);
- tfm.exec.bindKeyboard(player, code, false, false);
- end
- end
- function doTeamChat(player, ...)
- if players[player] then
- local team = players[player].team;
- local text = string.gsub(string.gsub(table.concat(arg, " "), "<", "<"), ">", ">");
- if team and text and text ~= "" then
- local message = team.tag .. "[" .. player .. "]<N> " .. text;
- for i, name in ipairs(team.players) do
- tfm.exec.chatMessage(message, name);
- end
- end
- end
- end
- function eventPlayerDied(player)
- removePlayer(player);
- tfm.exec.chatMessage("<J>You are removed from the game because you didn't move. Press a movement key or space to return.", player)
- end
- -- display constructor
- display = {};
- function display.new(x, y, pixel)
- local this = {
- x = x or 0,
- y = y or 0,
- pixel = pixel or 12,
- objects = {}
- };
- this.plotPoint = function(x, y, colour)
- if not this.objects[x] then
- this.objects[x] = {};
- end
- local object = this.objects[x][y];
- if object and not colour then
- tfm.exec.removeObject(object);
- this.objects[x][y] = nil;
- elseif not object and colour then
- local x2 = this.x + (x - 1) * this.pixel;
- local y2 = this.y + (y - 1) * this.pixel;
- this.objects[x][y] = tfm.exec.addShamanObject(34, x2, y2, 0, 0, 0, true);
- end
- end
- this.plotMap = function(map, dx, dy)
- dx = dx or 0;
- dy = dy or 0;
- for y, row in ipairs(map) do
- for x, colour in ipairs(row) do
- this.plotPoint(dx + x, dy + y, colour);
- end
- end
- end
- return this;
- end
- -- command handling
- function eventChatCommand(player, message)
- local args = split(message, "%s");
- local text = table.remove(args, 1);
- command.handle(string.lower(text), player, args);
- end
- command = {handlers = {}};
- function command.addHandler(text, handler)
- if command.handlers[text] == nil then
- command.handlers[text] = {};
- system.disableChatCommandDisplay(text, true);
- end
- table.insert(command.handlers[text], handler);
- end
- function command.removeHandler(text, handler)
- if command.handlers[text] ~= nil then
- local index
- for i, h in ipairs(command.handlers[text]) do
- if handler == h then
- index = i;
- end
- end
- if index ~= nil then
- table.remove(command.handlers[text], index)
- if table.getn(command.handlers[text]) == 0 then
- command.handlers[text] = nil;
- --system.disableChatCommandDisplay(text, false);
- end
- end
- end
- end
- function command.handle(text, player, args)
- if command.handlers[text] ~= nil then
- for i, handler in ipairs(command.handlers[text]) do
- handler(player, unpack(args));
- end
- end
- end
- function split(input, seperator)
- local res = {};
- for part in string.gmatch(input, "[^" .. seperator .. "]+") do
- table.insert(res, part);
- end
- return res;
- end
- -- system unpack is unavailable
- function unpack (t, i)
- i = i or 1
- if t[i] ~= nil then
- return t[i], unpack(t, i + 1)
- end
- end
- function table.copy(t, d)
- local t2 = {}
- for k, v in pairs(t) do
- if d then
- if type(k) == "table" then
- k = table.copy(k, true)
- end
- if type(v) == "table" then
- v = table.copy(v, true)
- end
- end
- t2[k] = v
- end
- return t2
- end
- function table.keys(t)
- local t2 = {}
- for k in pairs(t) do
- table.insert(t2, k)
- end
- return t2
- end
- function table.switch(t)
- local t2 = {}
- for k, v in pairs(t) do
- if t2[v] == nil then
- t2[v] = {}
- end
- table.insert(t2[v], k)
- end
- return t2
- end
- function table.clear(t)
- for i, v in ipairs(table.keys(t)) do
- t[v] = nil
- end
- end
- main();
- --system.exit()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement