local SS13 = require("SS13")
SS13.wait(1)
local ADMIN_MODE = false
local user = SS13.get_runner_client()
local SHOULD_ASK_GHOSTS = SS13.await(SS13.global_proc, "tgui_alert", user, "Ask ghosts for a maintenance clown?", "Maintenance Clown", { "No", "Yes" }) == "Yes"
local function notifyPlayer(ply, msg)
ply:call_proc("balloon_alert", ply, msg)
end
function getPlane(new_plane, z_reference)
local SSmapping = dm.global_vars:get_var("SSmapping")
if SSmapping:get_var("max_plane_offset") ~= 0 then
local turfPlaneOffsets = 0
if SSmapping:get_var("max_plane_offset") ~= nil and SS13.istype(z_reference, "/atom") then
if z_reference:get_var("z") ~= nil then
turfPlaneOffsets = SSmapping:get_var("z_level_to_plane_offset"):get(z_reference:get_var("z"))
else
if SSmapping:get_var("plane_to_offset") ~= 0 then
turfPlaneOffsets = SSmapping:get_var("plane_to_offset"):get(tostring(z_reference:get_var("plane")))
else
turfPlaneOffsets = z_reference:get_var("plane")
end
end
end
local plane_offset_blacklist = SSmapping:get_var("plane_offset_blacklist")
if plane_offset_blacklist == nil or plane_offset_blacklist:get(tostring(new_plane)) then
return new_plane
else
return new_plane - 100 * turfPlaneOffsets
end
else
return new_plane
end
end
local function setupAntag(mind)
local damageTypes = {
"bleed_mod",
"brain_mod",
"burn_mod",
"brute_mod",
"cold_mod",
"heat_mod",
"hunger_mod",
"oxy_mod",
"pressure_mod",
"stamina_mod",
"siemens_coeff",
"tox_mod",
}
function reducePhysDamage(player, amount)
local phys = player:get_var("physiology")
for _, damageType in damageTypes do
phys:set_var(damageType, phys:get_var(damageType) - 0.01 * amount)
end
end
local antagData = {
level = 1,
image = SS13.new("/atom/movable/screen/text"),
showInfo = SS13.new("/atom/movable/screen/text"),
button = SS13.new("/atom/movable/screen/text"),
unallocatedPoints = 5,
stats = {
Knife = 0,
Beartrap = 0,
Traversing = 0,
Body = 0,
},
stats_upgrade = {
Knife = {
[1] = "increased attack speed",
[2] = "increased stamina damage on secondary attack",
[3] = "increased damage",
[4] = "increased attack speed",
[5] = "increased attack speed"
},
Beartrap = {
[1] = "-10s activation time",
[2] = "-10s activation time",
[3] = "apply through helmets",
[4] = "explode on target death",
[5] = "increased explosion radius and power"
},
Traversing = {
[1] = "reduced shoe slowdown",
[2] = "smash locked doors down with hands, shock immunity",
[3] = "slip immunity, +5s c/d reduction on hit",
[4] = "reduced shoe slowdown",
[5] = "pull people into the floorboards"
},
Body = {
[1] = "+10% damage reduction, virus and rad immunity",
[2] = "+10% damage reduction, immune to flash",
[3] = "+10% damage reduction, thermal vision",
[4] = "+10% damage reduction, space immunity",
[5] = "+10% damage reduction, x-ray vision"
}
},
stats_description = {
Knife = "Your ability to handle a knife. You also have a secondary attack, which you can use by right clicking with a knife, that deals stamina damage and drastically reduces the brute damage you deal. The skill is transferrable to any knife. Higher damage knives will give more lethality and stamina damage.",
Beartrap = "Your ability to apply reverse beartraps to people. Killing someone using your reverse beartraps is required for you to gain levels. Reverse beartraps have a base 30 second timer before they set off and you can put them on people by clicking them with it whilst it's in hand your hands.",
Traversing = "Your ability to travel quickly around the station. Use in maintenance to jump into the floorboards where you can then scurry around to find your next victim. When exiting floorboards, it enters into cooldown for 100 seconds. Attacking people with a knife will decrease the cooldown by 5 seconds. You can also pry open doors you don't have access to by left clicking on them with your left hand.",
Body = "Your ability to survive rough conditions and adapt to your environment. By default, you are immune to knockdown similarly to a hulk, but you can still take stamina damage, which will slow you down."
},
stats_upgrade_function = {
Knife = {},
Beartrap = {},
Traversing = {
[1] = function()
local shoes = mind:get_var("current"):get_var("shoes")
if shoes then
shoes:set_var("slowdown", 0.25)
mind:get_var("current"):call_proc("update_equipment_speed_mods")
end
end,
[2] = function()
dm.global_proc("_add_trait", mind:get_var("current"), "shock_immunity", "clown_antag")
end,
[3] = function()
dm.global_proc("_add_trait", mind:get_var("current"), "noslip_all", "clown_antag")
end,
[4] = function()
local shoes = mind:get_var("current"):get_var("shoes")
if shoes then
shoes:set_var("slowdown", 0)
mind:get_var("current"):call_proc("update_equipment_speed_mods")
end
end
},
Body = {
[1] = function()
local player = mind:get_var("current")
reducePhysDamage(player, 10)
player:call_proc("add_traits", {
"virus_immunity",
"rad_immunity"
}, "clown_antag")
end,
[2] = function()
local player = mind:get_var("current")
reducePhysDamage(player, 10)
dm.global_proc("_add_trait", player, "noflash", "clown_antag")
player:call_proc("update_sight")
end,
[3] = function()
local player = mind:get_var("current")
reducePhysDamage(player, 10)
dm.global_proc("_add_trait", player, "thermal_vision", "clown_antag")
player:call_proc("update_sight")
end,
[4] = function()
local player = mind:get_var("current")
reducePhysDamage(player, 10)
player:call_proc("add_traits", {
"resist_low_pressure",
"resist_high_pressure",
"resist_cold",
"resist_heat"
}, "clown_antag")
end,
[5] = function()
local player = mind:get_var("current")
reducePhysDamage(player, 10)
dm.global_proc("_add_trait", player, "xray_vision", "clown_antag")
player:call_proc("update_sight")
end,
}
}
}
if ADMIN_MODE then
antagData.level = 50
antagData.unallocatedPoints = 50
end
antagData.button:set_var("screen_loc", "WEST:4,CENTER-0:-11")
antagData.button:set_var("maptext_width", 120)
antagData.button:set_var("maptext_height", 15)
antagData.image:set_var("screen_loc", "WEST:4,CENTER-0:17")
antagData.button:set_var("mouse_opacity", 2)
antagData.showInfo:set_var("screen_loc", "WEST:4,CENTER-0:0")
antagData.showInfo:set_var("maptext_width", 120)
antagData.showInfo:set_var("maptext_height", 15)
antagData.showInfo:set_var("mouse_opacity", 2)
antagData.showInfo:set_var("maptext", "Show Help")
local jumpIntoFloorboards = SS13.new("/datum/action/cooldown", mind)
jumpIntoFloorboards:set_var("name", "Jump into the floorboards")
jumpIntoFloorboards:set_var("button_icon_state", "origami_on")
jumpIntoFloorboards:call_proc("Grant", mind:get_var("current"))
local maintenanceAreas = {
"/area/station/maintenance",
"/area/centcom/tdome",
"/area/station/service/theater/abandoned",
"/area/station/service/electronic_marketing_den",
"/area/station/service/abandoned_gambling_den",
"/area/station/science/research/abandoned",
"/area/station/service/library/abandoned",
"/area/station/service/kitchen/abandoned",
"/area/station/service/hydroponics/garden/abandoned",
"/area/station/medical/abandoned"
}
local abstract_icon = SS13.new("/obj/effect/abstract", nil)
abstract_icon:set_var("icon_state", "mfoam")
local jaunter = nil
local active = false
local floorboardVictim
local function exitFloorboards(turf, force)
local player = jumpIntoFloorboards:get_var("owner")
if not force then
local area = turf:get_var("loc")
local inValidArea = false
for _, areaType in maintenanceAreas do
if SS13.istype(area, areaType) then
inValidArea = true
break
end
end
if turf:get_var("density") ~= 0 or (not inValidArea and not ADMIN_MODE) or SS13.istype(turf, "/turf/open/space") or SS13.istype(turf, "/turf/open/openspace") then
notifyPlayer(player, "need to do this in maintenance!")
return
end
for _, item in turf:get_var("contents") do
if item:get_var("density") == 1 and not SS13.istype(item, "/mob") then
notifyPlayer(player, "there is something blocking your entry here!")
return
end
end
end
active = true
if not ADMIN_MODE then
jumpIntoFloorboards:call_proc("StartCooldown", 1000)
end
player:set_var("anchored", true)
dm.global_proc("_add_trait", player, "block_transformations", "clown_antag")
player:set_var("density", false)
player:set_var("pixel_z", -32)
if floorboardVictim ~= nil and not floorboardVictim:is_null() then
floorboardVictim:call_proc("Knockdown", 20)
floorboardVictim:set_var("pixel_z", -14)
floorboardVictim:set_var("anchored", true)
dm.global_proc("_add_trait", floorboardVictim, "block_transformations", "clown_antag")
floorboardVictim:set_var("density", false)
floorboardVictim:set_var("plane", getPlane(-6, turf))
floorboardVictim:set_var("layer", 1.9)
end
player:set_var("plane", getPlane(-6, turf))
player:set_var("layer", 2)
abstract_icon:call_proc("forceMove", turf)
abstract_icon:set_var("appearance", dm.global_proc("getFlatIcon", turf))
abstract_icon:set_var("plane", turf:get_var("plane"))
turf:set_var("alpha", 1)
dm.global_proc("_animate", abstract_icon, { pixel_w = 32 }, 5)
SS13.wait(0.5)
local itemsToUnset = {}
for _, item in turf:get_var("contents") do
if item:get_var("anchored") ~= 0 and not SS13.istype(item, "/mob") then
itemsToUnset[item] = item:get_var("invisibility")
item:set_var("invisibility", 101)
end
end
player:call_proc("forceMove", turf)
if floorboardVictim ~= nil and not floorboardVictim:is_null() then
floorboardVictim:call_proc("forceMove", turf)
end
SS13.unregister_signal(player, "mob_statchange")
dm.global_proc("qdel", jaunter)
jaunter = nil
if floorboardVictim ~= nil and not floorboardVictim:is_null() then
dm.global_proc("_animate", floorboardVictim, { pixel_z = 24 }, 3, 1, 1)
dm.global_proc("_animate", nil, { pixel_z = 16 }, 2)
end
dm.global_proc("_animate", player, { pixel_z = 6 }, 3, 1, 1)
dm.global_proc("_animate", nil, { pixel_z = 0 }, 2)
SS13.wait(0.5)
if floorboardVictim ~= nil and not floorboardVictim:is_null() then
local directions = {1, 2, 4, 8}
floorboardVictim:call_proc("throw_at", dm.global_proc("_get_step", turf, directions[math.random(#directions)]), 10, 10)
floorboardVictim:set_var("plane", getPlane(-4, turf))
floorboardVictim:set_var("layer", 4)
floorboardVictim:set_var("anchored", false)
dm.global_proc("_remove_trait", floorboardVictim, "block_transformations", "clown_antag")
floorboardVictim:set_var("density", true)
floorboardVictim:set_var("pixel_z", 0)
floorboardVictim = nil
end
player:set_var("plane", getPlane(-4, turf))
dm.global_proc("_animate", abstract_icon, { pixel_w = 0 }, 5)
SS13.wait(0.5)
turf:set_var("alpha", 255)
for item, lastInvis in itemsToUnset do
if not item:is_null() then
item:set_var("invisibility", lastInvis)
end
end
abstract_icon:call_proc("moveToNullspace")
player:set_var("layer", 4)
player:set_var("anchored", false)
dm.global_proc("_remove_trait", player, "block_transformations", "clown_antag")
player:set_var("density", true)
jumpIntoFloorboards:set_var("name", "Jump into the floorboards")
jumpIntoFloorboards:set_var("button_icon_state", "origami_on")
jumpIntoFloorboards:call_proc("build_all_button_icons")
active = false
end
SS13.register_signal(jumpIntoFloorboards, "action_trigger", function()
SS13.set_timeout(0, function()
if active then
return
end
if jaunter == nil then
local player = jumpIntoFloorboards:get_var("owner")
local turf = player:get_var("loc")
if not SS13.istype(turf, "/turf") then
notifyPlayer(player, "too tight to do this here!")
return
end
local area = turf:get_var("loc")
local inValidArea = false
for _, areaType in maintenanceAreas do
if SS13.istype(area, areaType) then
inValidArea = true
break
end
end
if turf:get_var("density") ~= 0 or (not inValidArea and not ADMIN_MODE) or SS13.istype(turf, "/turf/open/space") or SS13.istype(turf, "/turf/open/openspace") then
notifyPlayer(player, "need to do this in maintenance!")
return
end
for _, item in turf:get_var("contents") do
if item:get_var("density") == 1 and not SS13.istype(item, "/mob") then
notifyPlayer(player, "there is something blocking your escape here!")
return
end
end
player:call_proc("quick_equip")
local pulled = player:get_var("pulling")
local shouldPull = false
if pulled ~= nil and SS13.istype(pulled, "/mob/living/carbon/human") and antagData.stats.Traversing >= 5 then
if not SS13.istype(pulled:get_var("head"), "/obj/item/reverse_bear_trap") then
shouldPull = true
else
notifyPlayer(player, "no chance")
end
end
active = true
player:call_proc("Stun", 1)
player:set_var("anchored", true)
dm.global_proc("_add_trait", player, "block_transformations", "clown_antag")
player:set_var("density", false)
if shouldPull then
pulled:call_proc("Knockdown", 10)
pulled:call_proc("forceMove", turf)
pulled:set_var("pixel_z", 16)
pulled:set_var("anchored", true)
dm.global_proc("_add_trait", pulled, "block_transformations", "clown_antag")
pulled:set_var("density", false)
pulled:set_var("plane", getPlane(-4, turf))
end
player:set_var("plane", getPlane(-4, turf))
abstract_icon:call_proc("forceMove", turf)
abstract_icon:set_var("appearance", dm.global_proc("getFlatIcon", turf))
abstract_icon:set_var("plane", turf:get_var("plane"))
turf:set_var("alpha", 1)
dm.global_proc("_animate", abstract_icon, { pixel_w = 32 }, 5)
SS13.wait(0.5)
local itemsToUnset = {}
for _, item in turf:get_var("contents") do
if item:get_var("anchored") ~= 0 and not SS13.istype(item, "/mob") then
itemsToUnset[item] = item:get_var("invisibility")
item:set_var("invisibility", 101)
end
end
if not player:is_null() then
player:set_var("plane", getPlane(-6, turf))
player:set_var("layer", 2)
if shouldPull and not pulled:is_null() then
pulled:set_var("plane", getPlane(-6, turf))
pulled:set_var("layer", 1.9)
dm.global_proc("_animate", pulled, { pixel_z = 24 }, 3, 1, 1)
dm.global_proc("_animate", nil, { pixel_z = -14 }, 2, 1, 1)
end
dm.global_proc("_animate", player, { pixel_z = 6 }, 3, 1, 1)
dm.global_proc("_animate", nil, { pixel_z = -32 }, 2, 1, 1)
end
SS13.wait(0.5)
dm.global_proc("_animate", abstract_icon, { pixel_w = 0 }, 5)
if not player:is_null() and player:get_var("stat") == 0 then
jaunter = SS13.new("/obj/effect/dummy/phased_mob", player:call_proc("drop_location"), player)
player:call_proc("add_traits", {
"magically_phased",
"resist_low_pressure",
"resist_high_pressure",
"resist_cold",
"resist_heat",
"no_breath",
"rad_immunity",
"bomb_immunity",
"xray_vision",
"emotemute",
"mute",
}, "jaunting_clown")
player:call_proc("update_sight")
if shouldPull and not pulled:is_null() then
pulled:call_proc("forceMove", player)
pulled:call_proc("add_traits", {
"magically_phased",
"resist_low_pressure",
"resist_high_pressure",
"resist_cold",
"resist_heat",
"no_breath",
"rad_immunity",
"bomb_immunity",
"emotemute",
"mute",
}, "jaunting_clown")
end
SS13.register_signal(jaunter, "spell_mob_eject_jaunt", function(_)
player:call_proc("remove_traits", {
"magically_phased",
"resist_low_pressure",
"resist_high_pressure",
"resist_cold",
"resist_heat",
"no_breath",
"rad_immunity",
"bomb_immunity",
"emotemute",
"xray_vision",
"mute"
}, "jaunting_clown")
player:call_proc("update_sight")
if shouldPull and not pulled:is_null() then
pulled:call_proc("remove_traits", {
"magically_phased",
"resist_low_pressure",
"resist_high_pressure",
"resist_cold",
"resist_heat",
"no_breath",
"rad_immunity",
"bomb_immunity",
"emotemute",
"mute"
}, "jaunting_clown")
player:call_proc("update_sight")
end
end)
SS13.register_signal(player, "mob_statchange", function(_, new_stat)
if new_stat ~= 0 then
exitFloorboards(turf, true)
end
end)
jumpIntoFloorboards:set_var("name", "Jump out of the floorboards")
jumpIntoFloorboards:set_var("button_icon_state", "origami_off")
jumpIntoFloorboards:call_proc("build_all_button_icons")
end
for item, lastInvis in itemsToUnset do
if not item:is_null() then
item:set_var("invisibility", lastInvis)
end
end
player:set_var("layer", 4)
player:set_var("plane", getPlane(-6, turf))
player:set_var("pixel_z", 0)
player:set_var("anchored", false)
dm.global_proc("_remove_trait", player, "block_transformations", "clown_antag")
player:set_var("density", true)
if shouldPull and not pulled:is_null() then
pulled:set_var("layer", 4)
pulled:set_var("plane", getPlane(-6, turf))
pulled:set_var("pixel_z", 0)
pulled:set_var("anchored", false)
dm.global_proc("_remove_trait", pulled, "block_transformations", "clown_antag")
pulled:set_var("density", true)
floorboardVictim = pulled
end
active = false
SS13.wait(0.5)
abstract_icon:call_proc("moveToNullspace")
turf:set_var("alpha", 255)
else
local turf = dm.global_proc("_get_step", jaunter, 0)
exitFloorboards(turf, false)
end
end)
end)
local _reverseBeartrap = SS13.new("/obj/item/reverse_bear_trap")
local spawnReverseBeartrap = SS13.new("/datum/action/cooldown", mind)
spawnReverseBeartrap:set_var("name", "Spawn reverse beartrap")
spawnReverseBeartrap:set_var("button_icon", _reverseBeartrap:get_var("icon"))
spawnReverseBeartrap:set_var("button_icon_state", _reverseBeartrap:get_var("icon_state"))
spawnReverseBeartrap:call_proc("Grant", mind:get_var("current"))
dm.global_proc("qdel", _reverseBeartrap)
local beartrapActivated = {}
SS13.register_signal(spawnReverseBeartrap, "action_trigger", function()
if jaunter ~= nil then
return
end
SS13.set_timeout(0, function()
local beartrap = SS13.new("/obj/item/reverse_bear_trap")
local player = spawnReverseBeartrap:get_var("owner")
local result = player:call_proc("equip_to_slot_or_del", beartrap, 8192, true)
if result == 1 then
if not ADMIN_MODE then
spawnReverseBeartrap:call_proc("StartCooldown", 300)
end
SS13.register_signal(beartrap, "item_equip", function(_, equipper)
local original = beartrapActivated[dm.global_proc("REF", beartrap)]
if original == equipper and beartrap:get_var("ticking") ~= 1 then
beartrapActivated[dm.global_proc("REF", beartrap)] = nil
end
SS13.set_timeout(1, function()
if beartrap:get_var("ticking") == 1 and beartrap:get_var("loc") == equipper then
beartrapActivated[dm.global_proc("REF", beartrap)] = equipper
local activationTimeReduction = 200
if antagData.stats.Beartrap >= 1 then
activationTimeReduction = activationTimeReduction + 100
end
if antagData.stats.Beartrap >= 2 then
activationTimeReduction = activationTimeReduction + 100
end
beartrap:set_var("kill_countdown", beartrap:get_var("kill_countdown") - activationTimeReduction)
end
end)
end)
SS13.register_signal(beartrap, "item_pre_attack", function(_, attackingPerson)
if antagData.stats.Beartrap < 3 then
return
end
if SS13.istype(attackingPerson, "/mob/living/carbon/human") then
local headSlot = attackingPerson:call_proc("get_item_by_slot", 64)
if headSlot ~= nil then
attackingPerson:call_proc("doUnEquip", headSlot, true, attackingPerson:call_proc("drop_location"), false, true, true)
headSlot:call_proc("visible_message", "The " .. headSlot:get_var("name") .. " gets knocked to the ground!")
end
end
end)
SS13.register_signal(beartrap, "atom_attack_hand", function(_, attackingUser)
if beartrap:get_var("loc") ~= attackingUser and attackingUser ~= mind:get_var("current") then
dm.global_proc("playsound", beartrap, "sound/effects/explosion1.ogg", 50, true)
dm.global_proc("qdel", beartrap)
return
end
end)
end
end)
end)
local function updateVisualData()
local statAmounts = 4
local statString = ""
for _ = 1, statAmounts do
statString = statString .. "
%s"
end
antagData.image:set_var(
"maptext",
string.format(
"Level: %d
"..statString.."%s",
antagData.level,
"Knife: "..antagData.stats.Knife,
"Beartrap: "..antagData.stats.Beartrap,
"Traversing: "..antagData.stats.Traversing,
"Body: "..antagData.stats.Body,
antagData.unallocatedPoints ~= 0 and "
Unallocated Ability Points: "..antagData.unallocatedPoints or ""
)
)
if antagData.unallocatedPoints ~= 0 then
antagData.button:set_var("maptext", "Spend Ability Points")
else
antagData.button:set_var("maptext", "")
end
end
local function doLevelUp()
antagData.level = antagData.level + 1
antagData.unallocatedPoints = antagData.unallocatedPoints + 1
notifyPlayer(mind:get_var("current"), "level up!")
updateVisualData()
end
local killedPlayers = {}
SS13.register_signal(dm.global_vars:get_var("SSdcs"), "!mob_death", function(_, deadPlayer, gibbed)
if not SS13.istype(deadPlayer, "/mob/living/carbon/human") or not deadPlayer or gibbed then
return
end
local beartrap = deadPlayer:get_var("head")
if beartrap ~= nil and SS13.istype(beartrap, "/obj/item/reverse_bear_trap") and beartrapActivated[dm.global_proc("REF", beartrap)] == deadPlayer and beartrap:get_var("ticking") ~= 1 then
if not killedPlayers[dm.global_proc("REF", deadPlayer)] and deadPlayer:get_var("key") ~= nil then
doLevelUp()
killedPlayers[dm.global_proc("REF", deadPlayer)] = true
end
if antagData.stats.Beartrap >= 4 then
local lightRadius = 2
local flameRadius = 0
local flashRadius = 0
if antagData.stats.Beartrap >= 5 then
lightRadius = 3
flameRadius = 5
flashRadius = 7
end
dm.global_proc("explosion", deadPlayer, 0, 0, lightRadius, flameRadius, flashRadius)
end
end
end)
local isOpen = false
SS13.register_signal(antagData.button, "screen_element_click", function(_, _, _ , _, clickingUser)
if isOpen or antagData.unallocatedPoints <= 0 or clickingUser ~= mind:get_var("current") then
return
end
SS13.set_timeout(0, function()
isOpen = true
local response = SS13.await(SS13.global_proc, "tgui_input_list", mind:get_var("current"), "Select Stat Point", "Stat Point Selection", antagData.stats)
isOpen = false
if antagData.unallocatedPoints <= 0 then
notifyPlayer(mind:get_var("current"), "insufficient stat points!")
return
end
if response == nil then
return
end
local currentValue = antagData.stats[response]
if antagData.level <= 1 and currentValue >= 3 then
notifyPlayer(mind:get_var("current"), "need to reach level 2 before upgrading beyond level 3")
return
elseif antagData.level <= 2 and currentValue >= 4 then
notifyPlayer(mind:get_var("current"), "need to reach level 3 before upgrading beyond level 4")
return
end
if currentValue >= 5 then
notifyPlayer(mind:get_var("current"), "max ability level reached!")
else
antagData.stats[response] = antagData.stats[response] + 1
notifyPlayer(mind:get_var("current"), antagData.stats_upgrade[response][antagData.stats[response]])
local func = antagData.stats_upgrade_function[response][antagData.stats[response]]
if func then
func()
end
antagData.unallocatedPoints = antagData.unallocatedPoints - 1
end
updateVisualData()
end)
end)
SS13.register_signal(antagData.showInfo, "screen_element_click", function(_, _, _ , _, clickingUser)
local browser = SS13.new("/datum/browser", clickingUser, "Maintenance Clown Help", "Maintenance Clown Help", 600, 700)
local data = "