From 338562158528c013d92301ee4cd58c3a76eb4848 Mon Sep 17 00:00:00 2001 From: "VivianFoxfoot@gmail.com" Date: Mon, 9 Apr 2012 02:19:28 +0000 Subject: [PATCH] Adds randomlly spawning rooms to the mining asteroid that contain various goodies. (Among them are a modified traitor beacon, a cloaking device and a closet full of resources so you can go build your own honk.) These rooms will spawn at least out of range of space and the explored pathways, so at the very least some mining is required to even detect them with mesons. Adds a borg upgrade system. Right now, it just contians a borg reset module that allows the borg to choose their module again. Adds some support code to borgs to suppot flashproofing and renaming. Adds a few various admin commands like a quick-list of objects (which is hardcoded) and a command to break the local air group. git-svn-id: http://tgstation13.googlecode.com/svn/trunk@3415 316c924e-a436-60f5-8080-3fe189b3f50e --- code/defines/area/Space Station 13 areas.dm | 18 +++ code/defines/mob/living/silicon/robot.dm | 1 + code/defines/obj/storage.dm | 32 +++++ code/game/asteroid/artifacts.dm | 93 ++++++++++++++ code/game/asteroid/asteroid.dm | 120 +++++++++++++++--- code/game/gamemodes/objective.dm | 29 +++++ code/game/machinery/flasher.dm | 12 +- code/game/master_controller.dm | 3 + code/game/mecha/mech_fabricator.dm | 20 ++- code/game/objects/devices/flash.dm | 5 +- code/modules/admin/admin.dm | 9 ++ code/modules/admin/admin_verbs.dm | 2 + code/modules/admin/create_object.dm | 19 +++ code/modules/admin/verbs/diagnostics.dm | 21 +++ .../modules/mob/living/silicon/robot/login.dm | 3 +- .../modules/mob/living/silicon/robot/robot.dm | 64 +++++++++- .../living/silicon/robot/robot_upgrades.dm | 47 +++++++ tgstation.dme | 3 + 18 files changed, 472 insertions(+), 29 deletions(-) create mode 100644 code/game/asteroid/artifacts.dm create mode 100644 code/modules/mob/living/silicon/robot/robot_upgrades.dm diff --git a/code/defines/area/Space Station 13 areas.dm b/code/defines/area/Space Station 13 areas.dm index 2ab83f40f9..87265ddeb5 100644 --- a/code/defines/area/Space Station 13 areas.dm +++ b/code/defines/area/Space Station 13 areas.dm @@ -381,6 +381,24 @@ proc/process_ghost_teleport_locs() icon_state = "cave" requires_power = 0 +/area/asteroid/artifactroom + name = "Asteroid - Artifact" + icon_state = "cave" + + + + + + + + + + + + + + + /area/planet/clown name = "Clown Planet" icon_state = "honk" diff --git a/code/defines/mob/living/silicon/robot.dm b/code/defines/mob/living/silicon/robot.dm index ace55afebf..e438acbed3 100644 --- a/code/defines/mob/living/silicon/robot.dm +++ b/code/defines/mob/living/silicon/robot.dm @@ -36,6 +36,7 @@ var/wiresexposed = 0 var/locked = 1 var/list/req_access = list(access_robotics) + var/ident = 0 //var/list/laws = list() var/alarms = list("Motion"=list(), "Fire"=list(), "Atmosphere"=list(), "Power"=list()) var/viewalerts = 0 diff --git a/code/defines/obj/storage.dm b/code/defines/obj/storage.dm index 021dc61a5c..900f900deb 100644 --- a/code/defines/obj/storage.dm +++ b/code/defines/obj/storage.dm @@ -407,3 +407,35 @@ desc = "It has a picture of drinking glasses on it." icon_state = "box" item_state = "syringe_kit" + + + + +/obj/structure/closet/syndicate/resources/ + desc = "It's an emergancy storage closet for repairs." + +/obj/structure/closet/syndicate/resources/New() + ..() + + var/list/resources = list( + + /obj/item/stack/sheet/metal, + /obj/item/stack/sheet/glass, + /obj/item/stack/sheet/gold, + /obj/item/stack/sheet/silver, + /obj/item/stack/sheet/plasma, + /obj/item/stack/sheet/uranium, + /obj/item/stack/sheet/diamond, + /obj/item/stack/sheet/clown, + /obj/item/stack/sheet/plasteel, + /obj/item/stack/rods + ) + + sleep(2) + + for(var/i = 0, i<2, i++) + for(var/res in resources) + var/obj/item/stack/R = new res(src) + R.amount = R.max_amount + + return diff --git a/code/game/asteroid/artifacts.dm b/code/game/asteroid/artifacts.dm new file mode 100644 index 0000000000..38b48e9a02 --- /dev/null +++ b/code/game/asteroid/artifacts.dm @@ -0,0 +1,93 @@ +var/global/list/space_surprises = list( /obj/item/clothing/mask/facehugger, + /obj/effect/critter/spesscarp, + // /obj/effect/critter/spesscarp/elite, + // /obj/creature, + // /obj/item/weapon/rcd, + // /obj/item/weapon/rcd_ammo, + // /obj/item/weapon/spacecash, + /obj/item/weapon/cloaking_device, + // /obj/item/weapon/gun/energy/teleport_gun, + // /obj/item/weapon/rubber_chicken, + /obj/item/weapon/melee/energy/sword/pirate, + /obj/structure/closet/syndicate/resources, + /obj/machinery/wish_granter + + ) + +var/global/list/spawned_surprises = list() + + + + + + + +/obj/machinery/wish_granter + name = "Wish Granter" + desc = "You're not so sure about this, anymore..." + icon = 'device.dmi' + icon_state = "syndbeacon" + + anchored = 1 + density = 1 + + var + charges = 1 + insisting = 0 + +/obj/machinery/wish_granter/attack_hand(var/mob/user as mob) + usr.machine = src + + if(charges <= 0) + user << "The Wish Granter lies silent." + return + + else if(!istype(user, /mob/living/carbon/human)) + user << "You feel a dark stirring inside of the Wish Granter, something you want nothing of. Your instincts are better than any man's." + return + + else if(is_special_character(user)) + user << "Even to a heart as dark as yours, you know nothing good will come of this. Something instinctual makes you pull away." + + else if (!insisting) + user << "Your first touch makes the Wish Granter stir, listening to you. Are you really sure you want to do this?" + insisting++ + + else + user << "You speak. [pick("I want the station to disappear","Humanity is corrupt, mankind must be destroyed","I want to be rich", "I want to rule the world","I want immortality.")]. The Wish Granter answers." + user << "Your head pounds for a moment, before your vision clears. You are the avatar of the Wish Granter, and your power is LIMITLESS! And it's all yours. You need to make sure no one can take it from you. No one can know, first." + + charges-- + insisting = 0 + + if (!(user.mutations & HULK)) + user.mutations |= HULK + + if (!(user.mutations & LASER)) + user.mutations |= LASER + + if (!(user.mutations & XRAY)) + user.mutations |= XRAY + user.sight |= (SEE_MOBS|SEE_OBJS|SEE_TURFS) + user.see_in_dark = 8 + user.see_invisible = 2 + + if (!(user.mutations & COLD_RESISTANCE)) + user.mutations |= COLD_RESISTANCE + + if (!(user.mutations & TK)) + user.mutations |= TK + + var/datum/objective/silence/silence = new + silence.owner = user.mind + user.mind.objectives += silence + + var/obj_count = 1 + for(var/datum/objective/OBJ in user.mind.objectives) + user << "Objective #[obj_count]: [OBJ.explanation_text]" + obj_count++ + + return + + + diff --git a/code/game/asteroid/asteroid.dm b/code/game/asteroid/asteroid.dm index 15e7dabf67..ea549c4d3a 100644 --- a/code/game/asteroid/asteroid.dm +++ b/code/game/asteroid/asteroid.dm @@ -1,3 +1,8 @@ +var/global/max_secret_rooms = 6 + + + + proc/spawn_asteroid(var/turf/start_loc,var/type,var/size,var/richness)//type: 0 or null - random, 1 - nothing, 2 - iron, 3 - silicon if(!size) size = pick(100;2,50;3,35;4,25;6,10;12) @@ -97,7 +102,7 @@ proc/spawn_asteroid(var/turf/start_loc,var/type,var/size,var/richness)//type: 0 return -proc/spawn_room(var/atom/start_loc,var/x_size,var/y_size,var/wall,var/floor) +proc/spawn_room(var/atom/start_loc,var/x_size,var/y_size,var/wall,var/floor , var/clean = 0 , var/name) var/list/room_turfs = list("walls"=list(),"floors"=list()) //world << "Room spawned at [start_loc.x],[start_loc.y],[start_loc.z]" @@ -110,24 +115,45 @@ proc/spawn_room(var/atom/start_loc,var/x_size,var/y_size,var/wall,var/floor) for(var/y = 0,y 100) + return 0 + + + T=pick(get_area_turfs(/area/mine/unexplored)) + if(!T) + return 0 + + var/list/surroundings = list() + + surroundings += range(7, locate(T.x,T.y,T.z)) + surroundings += range(7, locate(T.x+size,T.y,T.z)) + surroundings += range(7, locate(T.x,T.y+size,T.z)) + surroundings += range(7, locate(T.x+size,T.y+size,T.z)) + + if(locate(/area/mine/explored) in surroundings) // +5s are for view range + valid = 0 + continue + + if(locate(/turf/space) in surroundings) + valid = 0 + continue + + if(locate(/area/asteroid/artifactroom) in surroundings) + valid = 0 + continue + + if(!T) + return 0 + + room = spawn_room(T,size,size,,,1) + + if(room) + T = pick(room["floors"]) + if(T) + var/surprise = null + valid = 0 + while(!valid) + surprise = pick(space_surprises) + if(surprise in spawned_surprises) + if(prob(20)) + valid++ + else + continue + else + valid++ + + spawned_surprises.Add(surprise) + new surprise(T) + + return 1 + + diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm index a6d809b13f..123ebc78e6 100644 --- a/code/game/gamemodes/objective.dm +++ b/code/game/gamemodes/objective.dm @@ -201,6 +201,35 @@ datum/objective/block return 0 return 1 +datum/objective/silence + explanation_text = "Do not allow anyone to escape the station. Only allow the shuttle to be called when everyone is dead and your story is the only one left." + + check_completion() + if(emergency_shuttle.location<2) + return 0 + + var/area/shuttle = locate(/area/shuttle/escape/centcom) + var/area/pod1 = locate(/area/shuttle/escape_pod1/centcom) + var/area/pod2 = locate(/area/shuttle/escape_pod2/centcom) + var/area/pod3 = locate(/area/shuttle/escape_pod3/centcom) + var/area/pod4 = locate(/area/shuttle/escape_pod5/centcom) + + for(var/mob/living/player in world) + if (player == owner) + continue + if (player.mind) + if (player.stat != 2) + if (get_turf(player) in shuttle) + return 0 + if (get_turf(player) in pod1) + return 0 + if (get_turf(player) in pod2) + return 0 + if (get_turf(player) in pod3) + return 0 + if (get_turf(player) in pod4) + return 0 + return 1 datum/objective/escape diff --git a/code/game/machinery/flasher.dm b/code/game/machinery/flasher.dm index 8e240470ef..aa29cef3ab 100644 --- a/code/game/machinery/flasher.dm +++ b/code/game/machinery/flasher.dm @@ -70,12 +70,18 @@ continue if (istype(O, /mob/living/carbon/human)) var/mob/living/carbon/human/H = O - if (istype(H.glasses, /obj/item/clothing/glasses/sunglasses)) continue + if (istype(H.glasses, /obj/item/clothing/glasses/sunglasses)) + continue if (istype(H.head, /obj/item/clothing/head/helmet/welding)) - if(!H.head:up) continue - if (istype(H.wear_mask, /obj/item/clothing/mask/gas/voice)) continue + if(!H.head:up) + continue + if (istype(H.wear_mask, /obj/item/clothing/mask/gas/voice)) + continue if (istype(O, /mob/living/carbon/alien))//So aliens don't get flashed (they have no external eyes)/N continue + if (istype(O, /mob/living/silicon/robot)) + if(O:flashproof()) + continue O.Weaken(strength) if ((O.eye_stat > 15 && prob(O.eye_stat + 50))) diff --git a/code/game/master_controller.dm b/code/game/master_controller.dm index 379b9fc37c..0a794daaed 100644 --- a/code/game/master_controller.dm +++ b/code/game/master_controller.dm @@ -34,6 +34,9 @@ datum/controller/game_controller setupgenetics() + for(var/i = 0, i < max_secret_rooms, i++) + make_mining_asteroid_secret() + syndicate_code_phrase = generate_code_phrase()//Sets up code phrase for traitors, for the round. syndicate_code_response = generate_code_phrase() diff --git a/code/game/mecha/mech_fabricator.dm b/code/game/mecha/mech_fabricator.dm index f0f47032ba..3587b3c66f 100644 --- a/code/game/mecha/mech_fabricator.dm +++ b/code/game/mecha/mech_fabricator.dm @@ -111,8 +111,24 @@ /obj/item/mecha_parts/mecha_equipment/weapon/honker ), + "Cyborg Upgrade Modules" = list( + /obj/item/borg/upgrade/reset + ///obj/item/borg/upgrade/flashproof + + + ), + + + + + + "Misc"=list(/obj/item/mecha_parts/mecha_tracking) ) + + + + New() ..() component_parts = list() @@ -124,6 +140,8 @@ component_parts += new /obj/item/weapon/stock_parts/console_screen(src) RefreshParts() + // part_sets["Cyborg Upgrade Modules"] = typesof(/obj/item/borg/upgrade/) - /obj/item/borg/upgrade/ // Eh. This does it dymaically, but to support having the items referenced otherwhere in the code but not being constructable, going to do it manaully. + for(var/part_set in part_sets) convert_part_set(part_set) files = new /datum/research(src) //Setup the research data holder. @@ -295,7 +313,7 @@ return proc/check_resources(var/obj/item/mecha_parts/part) - if(istype(part, /obj/item/robot_parts) || istype(part, /obj/item/mecha_parts)) + if(istype(part, /obj/item/robot_parts) || istype(part, /obj/item/mecha_parts) || istype(part,/obj/item/borg/upgrade)) for(var/resource in part.construction_cost) if(resource in src.resources) if(src.resources[resource] < get_resource_cost_w_coeff(part,resource)) diff --git a/code/game/objects/devices/flash.dm b/code/game/objects/devices/flash.dm index ec0c00583c..2540b93ee7 100644 --- a/code/game/objects/devices/flash.dm +++ b/code/game/objects/devices/flash.dm @@ -85,7 +85,10 @@ flashfail = 1 else if(issilicon(M)) - M.Weaken(rand(5,10)) + if(!M:flashproof()) + M.Weaken(rand(5,10)) + else + flashfail++ if(isrobot(user)) spawn(0) diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index f0998d2769..d916303457 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -1273,11 +1273,19 @@ var/global/BSACooldown = 0 else alert("You are not a high enough administrator! Sorry!!!!") + if (href_list["quick_create_object"]) + if (src.rank in list("Admin Candidate", "Trial Admin", "Badmin", "Game Admin", "Game Master")) + return quick_create_object(usr) + else + alert("You are not a high enough administrator! Sorry!!!!") + + if (href_list["create_turf"]) if (src.rank in list("Admin Candidate", "Trial Admin", "Badmin", "Game Admin", "Game Master")) return create_turf(usr) else alert("You are not a high enough administrator! Sorry!!!!") + if (href_list["create_mob"]) if (src.rank in list("Badmin", "Game Admin", "Game Master")) return create_mob(usr) @@ -2309,6 +2317,7 @@ var/global/BSACooldown = 0 if(lvl >= 3 ) dat += "Create Object
" + dat += "Quick Create Object
" dat += "Create Turf
" if(lvl >= 5) dat += "Create Mob
" diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 3942c2e720..d82dc0b8d4 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -235,6 +235,7 @@ verbs += /client/proc/drop_bomb verbs += /client/proc/cmd_admin_grantfullaccess verbs += /client/proc/jump_to_dead_group + verbs += /client/proc/kill_airgroup verbs += /client/proc/cmd_admin_drop_everything verbs += /client/proc/make_sound verbs += /client/proc/play_local_sound @@ -411,6 +412,7 @@ //verbs -= /obj/admins/proc/unprison --Merged with player panel //verbs -= /client/proc/cmd_switch_radio --removed because tcommsat is staying //verbs -= /client/proc/togglebuildmodeself --removed due to runtimes + verbs -= /client/proc/kill_airgroup return diff --git a/code/modules/admin/create_object.dm b/code/modules/admin/create_object.dm index 944ab89c7a..248eebb5ab 100644 --- a/code/modules/admin/create_object.dm +++ b/code/modules/admin/create_object.dm @@ -1,4 +1,5 @@ /var/create_object_html = null + /obj/admins/proc/create_object(var/mob/user) if (!create_object_html) var/objectjs = null @@ -7,3 +8,21 @@ create_object_html = dd_replacetext(create_object_html, "null /* object types */", "\"[objectjs]\"") user << browse(dd_replacetext(create_object_html, "/* ref src */", "\ref[src]"), "window=create_object;size=425x475") + + +/obj/admins/proc/quick_create_object(var/mob/user) + + var/quick_create_object_html = null + var/pathtext = null + + pathtext = input("Select the path of the object you wish to create.", "Path", "/obj") in list("/obj","/obj/structure","/obj/item","/obj/machinery") + + var path = text2path(pathtext) + + if (!quick_create_object_html) + var/objectjs = null + objectjs = dd_list2text(typesof(path), ";") + quick_create_object_html = file2text('create_object.html') + quick_create_object_html = dd_replacetext(quick_create_object_html, "null /* object types */", "\"[objectjs]\"") + + user << browse(dd_replacetext(quick_create_object_html, "/* ref src */", "\ref[src]"), "window=quick_create_object;size=425x475") \ No newline at end of file diff --git a/code/modules/admin/verbs/diagnostics.dm b/code/modules/admin/verbs/diagnostics.dm index 9bc6da3455..b317bd9966 100644 --- a/code/modules/admin/verbs/diagnostics.dm +++ b/code/modules/admin/verbs/diagnostics.dm @@ -195,6 +195,27 @@ usr.loc = pick(dest_group.members) return + kill_airgroup() + set name = "Kill Local Airgroup" + set desc = "Use this to allow manual manupliation of atmospherics." + set category = "Debug" + if(!authenticated || !holder) + src << "Only administrators may use this command." + return + + if(!air_master) + usr << "Cannot find air_system" + return + + var/turf/T = get_turf(usr) + if(istype(T, /turf/simulated)) + var/datum/air_group/AG = T:parent + AG.next_check = 30 + AG.group_processing = 0 + else + usr << "Local airgroup is unsimulated!" + + tension_report() set category = "Debug" set name = "Show Tension Report" diff --git a/code/modules/mob/living/silicon/robot/login.dm b/code/modules/mob/living/silicon/robot/login.dm index 428e78d6c2..9e2b24457d 100644 --- a/code/modules/mob/living/silicon/robot/login.dm +++ b/code/modules/mob/living/silicon/robot/login.dm @@ -9,8 +9,9 @@ if (src.stat == 2) src.verbs += /mob/proc/ghost if(src.real_name == "Cyborg") + src.ident = rand(1, 999) src.real_name += " " - src.real_name += "-[rand(1, 999)]" + src.real_name += "-[ident]" src.name = src.real_name if(!src.connected_ai) for(var/mob/living/silicon/ai/A in world) diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 1714154a71..d1baf64b5f 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -10,7 +10,8 @@ updateicon() // syndicate = syndie if(real_name == "Cyborg") - real_name += " [pick(rand(1, 999))]" + ident = rand(1, 999) + real_name += "-[ident]" name = real_name spawn (4) @@ -487,10 +488,61 @@ if(prob(25)) src << "Hack attempt detected." return + + else if(istype(W, /obj/item/borg/upgrade/)) + var/obj/item/borg/upgrade/U = W + if(!opened) + usr << "You must access the borgs internals!" + else if(!src.module) + usr << "The borg must choose a module before he can be upgraded!" + else if(U.locked) + usr << "The upgrade is locked and cannot be used yet!" + else + usr << "You apply the upgrade to [src]!" + usr.drop_item() + U.loc = src + U.action(src) + + else spark_system.start() return ..() + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + /mob/living/silicon/robot/attack_alien(mob/living/carbon/alien/humanoid/M as mob) if (!ticker) M << "You cannot attack people before the game has started." @@ -1025,4 +1077,12 @@ Frequency: if(R) R.UnlinkSelf() R << "Buffers flushed and reset. All systems operational." - src.verbs -= /mob/living/silicon/robot/proc/ResetSecurityCodes \ No newline at end of file + src.verbs -= /mob/living/silicon/robot/proc/ResetSecurityCodes + + +/mob/living/silicon/robot/proc/flashproof() + if(module) + for(var/obj/item/borg/upgrade/flashproof/F in module.modules) + return 1 + + return 0 \ No newline at end of file diff --git a/code/modules/mob/living/silicon/robot/robot_upgrades.dm b/code/modules/mob/living/silicon/robot/robot_upgrades.dm new file mode 100644 index 0000000000..3c2eaee234 --- /dev/null +++ b/code/modules/mob/living/silicon/robot/robot_upgrades.dm @@ -0,0 +1,47 @@ +// robot_upgrades.dm +// Contains various borg upgrades. + +/obj/item/borg/upgrade/ + name = "A borg upgrade module." + desc = "Protected by FRM." + icon = 'module.dmi' + icon_state = "id_mod" + var/construction_time = 120 + var/construction_cost = list("metal"=10000) + var/locked = 0 + +/obj/item/borg/upgrade/proc/action() + return + + +/obj/item/borg/upgrade/reset/ + name = "Borg module reset board" + desc = "Used to reset a borg's module. Destroys any other upgrades applied to the borg." + +/obj/item/borg/upgrade/reset/action(var/mob/living/silicon/robot/R) + R.uneq_all() + R.hands.icon_state = "nomod" + R.icon_state = "robot" + del(R.module) + R.module = null + R.modtype = "robot" + R.real_name = "Cyborg [R.ident]" + R.name = R.real_name + R.nopush = 0 + R.updateicon() + return + + + +/obj/item/borg/upgrade/flashproof/ + name = "Borg Flash-Supression" + desc = "A highly advanced, complicated system for supressing incoming flashes directed at the borg's optical processing system." + construction_cost = list("metal"=10000,"gold"=2000,"silver"=3000,"glass"=2000, "diamond"=5000) + + +/obj/item/borg/upgrade/flashproof/New() // Why the fuck does the fabricator make a new instance of all the items? + //desc = "Sunglasses with duct tape." // Why? D: + +/obj/item/borg/upgrade/flashproof/action(var/mob/living/silicon/robot/R) + if(R.module) + R.module += src diff --git a/tgstation.dme b/tgstation.dme index 278bd24921..8b24a743d0 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -178,6 +178,7 @@ #define FILE_DIR "icons/vending_icons" #define FILE_DIR "interface" #define FILE_DIR "maps" +#define FILE_DIR "maps/backup" #define FILE_DIR "sound" #define FILE_DIR "sound/AI" #define FILE_DIR "sound/ambience" @@ -371,6 +372,7 @@ #include "code\game\vote.dm" #include "code\game\area\ai_monitored.dm" #include "code\game\area\areas.dm" +#include "code\game\asteroid\artifacts.dm" #include "code\game\asteroid\asteroid.dm" #include "code\game\asteroid\device.dm" #include "code\game\asteroid\turf.dm" @@ -934,6 +936,7 @@ #include "code\modules\mob\living\silicon\robot\robot_defense.dm" #include "code\modules\mob\living\silicon\robot\robot_modules.dm" #include "code\modules\mob\living\silicon\robot\robot_movement.dm" +#include "code\modules\mob\living\silicon\robot\robot_upgrades.dm" #include "code\modules\mob\living\silicon\robot\say.dm" #include "code\modules\mob\living\silicon\robot\wires.dm" #include "code\modules\mob\new_player\hud.dm"