Merge pull request #22955 from Cruix/gang_refactor

Refactored gangtool code
This commit is contained in:
oranges
2017-01-14 11:53:01 +13:00
committed by GitHub
4 changed files with 351 additions and 226 deletions
+33
View File
@@ -21,6 +21,26 @@
var/domination_timer
var/is_dominating
var/item_list
var/item_category_list
var/buyable_items = list(
/datum/gang_item/function/gang_ping,
/datum/gang_item/function/recall,
/datum/gang_item/function/outfit,
/datum/gang_item/weapon/switchblade,
/datum/gang_item/weapon/pistol,
/datum/gang_item/weapon/ammo/pistol_ammo,
/datum/gang_item/weapon/uzi,
/datum/gang_item/weapon/ammo/uzi_ammo,
/datum/gang_item/equipment/spraycan,
/datum/gang_item/equipment/c4,
/datum/gang_item/equipment/implant_breaker,
/datum/gang_item/equipment/pen,
/datum/gang_item/equipment/gangtool,
/datum/gang_item/equipment/necklace,
/datum/gang_item/equipment/dominator
)
/datum/gang/New(loc,gangname)
if(!gang_colors_pool.len)
message_admins("WARNING: Maximum number of gangs have been exceeded!")
@@ -49,6 +69,19 @@
ganghud = new()
ganghud.color = color_hex
log_game("The [name] Gang has been created. Their gang color is [color].")
build_item_list()
/datum/gang/proc/build_item_list()
item_list = list()
item_category_list = list()
for(var/V in buyable_items)
var/datum/gang_item/G = new V()
item_list[G.id] = G
var/list/Cat = item_category_list[G.category]
if(Cat)
Cat += G
else
item_category_list[G.category] = list(G)
/datum/gang/proc/add_gang_hud(datum/mind/recruit_mind)
ganghud.join_hud(recruit_mind.current)
+294
View File
@@ -0,0 +1,294 @@
/datum/gang_item
var/name
var/item_path
var/cost
var/spawn_msg
var/category
var/id
/datum/gang_item/proc/purchase(mob/living/carbon/user, datum/gang/gang, obj/item/device/gangtool/gangtool, check_canbuy = TRUE)
if(check_canbuy && !can_buy(user, gang, gangtool))
return FALSE
var/real_cost = get_cost(user, gang, gangtool)
if(gang && real_cost)
gang.message_gangtools("A [get_name_display(user, gang, gangtool)] was purchased by [user.real_name] for [real_cost] Influence.")
log_game("A [id] was purchased by [key_name(user)] ([gang.name] Gang) for [real_cost] Influence.")
gang.points -= real_cost
spawn_item(user, gang, gangtool)
return TRUE
/datum/gang_item/proc/spawn_item(mob/living/carbon/user, datum/gang/gang, obj/item/device/gangtool/gangtool)
if(item_path)
var/obj/item/O = new item_path(user.loc)
user.put_in_hands(O)
if(spawn_msg)
user << spawn_msg
/datum/gang_item/proc/can_buy(mob/living/carbon/user, datum/gang/gang, obj/item/device/gangtool/gangtool)
return gang && (gang.points >= get_cost(user, gang, gangtool)) && can_see(user, gang, gangtool)
/datum/gang_item/proc/can_see(mob/living/carbon/user, datum/gang/gang, obj/item/device/gangtool/gangtool)
return TRUE
/datum/gang_item/proc/get_cost(mob/living/carbon/user, datum/gang/gang, obj/item/device/gangtool/gangtool)
return cost
/datum/gang_item/proc/get_cost_display(mob/living/carbon/user, datum/gang/gang, obj/item/device/gangtool/gangtool)
return "([get_cost(user, gang, gangtool)] Influence)"
/datum/gang_item/proc/get_name_display(mob/living/carbon/user, datum/gang/gang, obj/item/device/gangtool/gangtool)
return name
/datum/gang_item/proc/isboss(mob/living/carbon/user, datum/gang/gang)
return user && gang && (user.mind == gang.bosses[1])
/datum/gang_item/proc/get_extra_info(mob/living/carbon/user, datum/gang/gang, obj/item/device/gangtool/gangtool)
return
///////////////////
//FUNCTIONS
///////////////////
/datum/gang_item/function
category = "Gangtool Functions:"
cost = 0
/datum/gang_item/function/get_cost_display(mob/living/carbon/user, datum/gang/gang, obj/item/device/gangtool/gangtool)
return ""
/datum/gang_item/function/gang_ping
name = "Send Message to Gang"
id = "gang_ping"
/datum/gang_item/function/gang_ping/spawn_item(mob/living/carbon/user, datum/gang/gang, obj/item/device/gangtool/gangtool)
if(gangtool)
gangtool.ping_gang(user)
/datum/gang_item/function/recall
name = "Recall Emergency Shuttle"
id = "recall"
/datum/gang_item/function/recall/can_see(mob/living/carbon/user, datum/gang/gang, obj/item/device/gangtool/gangtool)
return isboss(user, gang)
/datum/gang_item/function/recall/spawn_item(mob/living/carbon/user, datum/gang/gang, obj/item/device/gangtool/gangtool)
if(gangtool)
gangtool.recall(user)
/datum/gang_item/function/outfit
name = "Create Armored Gang Outfit"
id = "outfit"
/datum/gang_item/function/outfit/can_buy(mob/living/carbon/user, datum/gang/gang, obj/item/device/gangtool/gangtool)
return gangtool && (gangtool.outfits > 0) && ..()
/datum/gang_item/function/outfit/get_cost_display(mob/living/carbon/user, datum/gang/gang, obj/item/device/gangtool/gangtool)
if(gangtool && !gangtool.outfits)
return "(Restocking)"
return ..()
/datum/gang_item/function/outfit/spawn_item(mob/living/carbon/user, datum/gang/gang, obj/item/device/gangtool/gangtool)
if(gang && gang.gang_outfit(user, gangtool))
user << "<span class='notice'><b>Gang Outfits</b> can act as armor with moderate protection against ballistic and melee attacks. Every gangster wearing one will also help grow your gang's influence.</span>"
if(gangtool)
gangtool.outfits -= 1
///////////////////
//WEAPONS
///////////////////
/datum/gang_item/weapon
category = "Purchase Weapons:"
/datum/gang_item/weapon/ammo
/datum/gang_item/weapon/ammo/get_cost_display(mob/living/carbon/user, datum/gang/gang, obj/item/device/gangtool/gangtool)
return "&nbsp;&#8627;" + ..() //this is pretty hacky but it looks nice on the popup
/datum/gang_item/weapon/switchblade
name = "Switchblade"
id = "switchblade"
cost = 10
item_path = /obj/item/weapon/switchblade
/datum/gang_item/weapon/pistol
name = "10mm Pistol"
id = "pistol"
cost = 25
item_path = /obj/item/weapon/gun/ballistic/automatic/pistol
/datum/gang_item/weapon/ammo/pistol_ammo
name = "10mm Ammo"
id = "pistol_ammo"
cost = 10
item_path = /obj/item/ammo_box/magazine/m10mm
/datum/gang_item/weapon/uzi
name = "Uzi SMG"
id = "uzi"
cost = 60
item_path = /obj/item/weapon/gun/ballistic/automatic/mini_uzi
id = "uzi"
/datum/gang_item/weapon/ammo/uzi_ammo
name = "Uzi Ammo"
id = "uzi_ammo"
cost = 40
item_path = /obj/item/ammo_box/magazine/uzim9mm
//SLEEPING CARP
/datum/gang_item/weapon/bostaff
name = "Bo Staff"
id = "bostaff"
cost = 10
item_path = /obj/item/weapon/twohanded/bostaff
/datum/gang_item/weapon/sleeping_carp_scroll
name = "Sleeping Carp Scroll (one-use)"
id = "sleeping_carp_scroll"
cost = 30
item_path = /obj/item/weapon/sleeping_carp_scroll
spawn_msg = "<span class='notice'>Anyone who reads the <b>sleeping carp scroll</b> will learn secrets of the sleeping carp martial arts style.</span>"
/datum/gang_item/weapon/wrestlingbelt
name = "Wrestling Belt"
id = "wrastling_belt"
cost = 20
item_path = /obj/item/weapon/storage/belt/champion/wrestling
spawn_msg = "<span class='notice'>Anyone wearing the <b>wresting belt</b> will know how to be effective with wrestling.</span>"
///////////////////
//EQUIPMENT
///////////////////
/datum/gang_item/equipment
category = "Purchase Equipment:"
/datum/gang_item/equipment/spraycan
name = "Territory Spraycan"
id = "spraycan"
cost = 5
item_path = /obj/item/toy/crayon/spraycan/gang
/datum/gang_item/equipment/necklace
name = "Gold Necklace"
id = "necklace"
cost = 1
item_path = /obj/item/clothing/neck/necklace/dope
/datum/gang_item/equipment/c4
name = "C4 Explosive"
id = "c4"
cost = 10
item_path = /obj/item/weapon/grenade/plastic/c4
/datum/gang_item/equipment/implant_breaker
name = "Implant Breaker"
id = "implant_breaker"
cost = 10
item_path = /obj/item/weapon/implanter/gang
spawn_msg = "<span class='notice'>The <b>implant breaker</b> is a single-use device that destroys all implants within the target before trying to recruit them to your gang. Also works on enemy gangsters.</span>"
/datum/gang_item/equipment/implant_breaker/spawn_item(mob/living/carbon/user, datum/gang/gang, obj/item/device/gangtool/gangtool)
if(item_path)
var/obj/item/O = new item_path(user.loc, gang) //we need to override this whole proc for this one argument
user.put_in_hands(O)
if(spawn_msg)
user << spawn_msg
/datum/gang_item/equipment/pen
name = "Recruitment Pen"
id = "pen"
cost = 50
item_path = /obj/item/weapon/pen/gang
spawn_msg = "<span class='notice'>More <b>recruitment pens</b> will allow you to recruit gangsters faster. Only gang leaders can recruit with pens.</span>"
/datum/gang_item/equipment/pen/purchase(mob/living/carbon/user, datum/gang/gang, obj/item/device/gangtool/gangtool)
if(..())
gangtool.free_pen = FALSE
return TRUE
return FALSE
/datum/gang_item/equipment/pen/get_cost(mob/living/carbon/user, datum/gang/gang, obj/item/device/gangtool/gangtool)
if(gangtool && gangtool.free_pen)
return 0
return ..()
/datum/gang_item/equipment/pen/get_cost_display(mob/living/carbon/user, datum/gang/gang, obj/item/device/gangtool/gangtool)
if(gangtool && gangtool.free_pen)
return "(GET ONE FREE)"
return ..()
/datum/gang_item/equipment/gangtool
id = "gangtool"
cost = 10
/datum/gang_item/equipment/gangtool/spawn_item(mob/living/carbon/user, datum/gang/gang, obj/item/device/gangtool/gangtool)
var/item_type
if(gang && isboss(user, gang))
item_type = /obj/item/device/gangtool/spare/lt
if(gang.bosses.len < 3)
user << "<span class='notice'><b>Gangtools</b> allow you to promote a gangster to be your Lieutenant, enabling them to recruit and purchase items like you. Simply have them register the gangtool. You may promote up to [3-gang.bosses.len] more Lieutenants</span>"
else
item_type = /obj/item/device/gangtool/spare
var/obj/item/device/gangtool/spare/tool = new item_type(user.loc)
user.put_in_hands(tool)
/datum/gang_item/equipment/gangtool/get_name_display(mob/living/carbon/user, datum/gang/gang, obj/item/device/gangtool/gangtool)
if(gang && isboss(user, gang) && (gang.bosses.len < 3))
return "Promote a Gangster"
return "Spare Gangtool"
/datum/gang_item/equipment/dominator
name = "Station Dominator"
id = "dominator"
cost = 30
item_path = /obj/machinery/dominator
spawn_msg = "<span class='notice'>The <b>dominator</b> will secure your gang's dominance over the station. Turn it on when you are ready to defend it.</span>"
/datum/gang_item/equipment/dominator/can_buy(mob/living/carbon/user, datum/gang/gang, obj/item/device/gangtool/gangtool)
if(!gang || !gang.dom_attempts)
return FALSE
return ..()
/datum/gang_item/equipment/dominator/get_name_display(mob/living/carbon/user, datum/gang/gang, obj/item/device/gangtool/gangtool)
if(!gang || !gang.dom_attempts)
return ..()
return "<b>[..()]</b>"
/datum/gang_item/equipment/dominator/get_cost_display(mob/living/carbon/user, datum/gang/gang, obj/item/device/gangtool/gangtool)
if(!gang || !gang.dom_attempts)
return "(Out of stock)"
return ..()
/datum/gang_item/equipment/dominator/get_extra_info(mob/living/carbon/user, datum/gang/gang, obj/item/device/gangtool/gangtool)
if(gang)
return "(Estimated Takeover Time: [round(determine_domination_time(gang)/60,0.1)] minutes)"
/datum/gang_item/equipment/dominator/purchase(mob/living/carbon/user, datum/gang/gang, obj/item/device/gangtool/gangtool)
var/area/usrarea = get_area(user.loc)
var/usrturf = get_turf(user.loc)
if(initial(usrarea.name) == "Space" || isspaceturf(usrturf) || usr.z != 1)
user << "<span class='warning'>You can only use this on the station!</span>"
return FALSE
for(var/obj/obj in usrturf)
if(obj.density)
user << "<span class='warning'>There's not enough room here!</span>"
return FALSE
if(!(usrarea.type in gang.territory|gang.territory_new))
user << "<span class='warning'>The <b>dominator</b> can be spawned only on territory controlled by your gang!</span>"
return FALSE
return ..()
/datum/gang_item/equipment/dominator/spawn_item(mob/living/carbon/user, datum/gang/gang, obj/item/device/gangtool/gangtool)
new item_path(user.loc)
+23 -226
View File
@@ -45,124 +45,37 @@
dat += "<center><font color='red'>Takeover In Progress:<br><B>[gang.domination_time_remaining()] seconds remain</B></font></center>"
var/isboss = (user.mind == gang.bosses[1])
var/points = gang.points
dat += "Registration: <B>[gang.name] Gang [isboss ? "Boss" : "Lieutenant"]</B><br>"
dat += "Organization Size: <B>[gang.gangsters.len + gang.bosses.len]</B> | Station Control: <B>[round((gang.territory.len/start_state.num_territories)*100, 1)]%</B><br>"
dat += "Gang Influence: <B>[points]</B><br>"
dat += "Time until Influence grows: <B>[(points >= 999) ? ("--:--") : (time2text(ticker.mode.gang_points.next_point_time - world.time, "mm:ss"))]</B><br>"
dat += "Gang Influence: <B>[gang.points]</B><br>"
dat += "Time until Influence grows: <B>[(gang.points >= 999) ? ("--:--") : (time2text(ticker.mode.gang_points.next_point_time - world.time, "mm:ss"))]</B><br>"
dat += "<hr>"
dat += "<B>Gangtool Functions:</B><br>"
dat += "<a href='?src=\ref[src];choice=ping'>Send Message to Gang</a><br>"
if(outfits > 0)
dat += "<a href='?src=\ref[src];choice=outfit'>Create Armored Gang Outfit</a><br>"
else
dat += "<b>Create Gang Outfit</b> (Restocking)<br>"
if(isboss)
dat += "<a href='?src=\ref[src];choice=recall'>Recall Emergency Shuttle</a><br>"
dat += "<br>"
dat += "<B>Purchase Weapons:</B><br>"
for(var/cat in gang.item_category_list)
dat += "<b>[cat]</b><br>"
for(var/V in gang.item_category_list[cat])
var/datum/gang_item/G = V
if(!G.can_see(user, gang, src))
continue
/////////////////
// NORMAL GANG //
/////////////////
if(gang.fighting_style == "normal")
dat += "(10 Influence) "
if(points >= 10)
dat += "<a href='?src=\ref[src];purchase=switchblade'>Switchblade</a><br>"
else
dat += "Switchblade<br>"
dat += "(25 Influence) "
if(points >= 25)
dat += "<a href='?src=\ref[src];purchase=pistol'>10mm Pistol</a><br>"
else
dat += "10mm Pistol<br>"
dat += "&nbsp;&#8627;(10 Influence) "
if(points >= 10)
dat += "<a href='?src=\ref[src];purchase=10mmammo'>10mm Ammo</a><br>"
else
dat += "10mm Ammo<br>"
dat += "(60 Influence) "
if(points >= 60)
dat += "<a href='?src=\ref[src];purchase=uzi'>Uzi SMG</a><br>"
else
dat += "Uzi SMG<br>"
dat += "&nbsp;&#8627;(40 Influence) "
if(points >= 40)
dat += "<a href='?src=\ref[src];purchase=9mmammo'>Uzi Ammo</a><br>"
else
dat += "Uzi Ammo<br>"
dat += "(1 Influence) "
if(points >=1)
dat += "<a href='?src=\ref[src];purchase=necklace'>Dope Necklace</a><br>"
else
dat += "Dope Necklace<br>"
var/cost = G.get_cost_display(user, gang, src)
if(cost)
dat += cost + " "
var/toAdd = G.get_name_display(user, gang, src)
if(G.can_buy(user, gang, src))
toAdd = "<a href='?src=\ref[src];purchase=[G.id]'>[toAdd]</a>"
dat += toAdd
var/extra = G.get_extra_info(user, gang, src)
if(extra)
dat += "<br><i>[extra]</i>"
dat += "<br>"
dat += "<br>"
////////////////////////
// STANDARD EQUIPMENT //
////////////////////////
dat += "<B>Purchase Equipment:</B><br>"
dat += "(5 Influence) "
if(points >= 5)
dat += "<a href='?src=\ref[src];purchase=spraycan'>Territory Spraycan</a><br>"
else
dat += "Territory Spraycan<br>"
dat += "(10 Influence) "
if(points >= 10)
dat += "<a href='?src=\ref[src];purchase=C4'>C4 Explosive</a><br>"
else
dat += "C4 Explosive<br>"
dat += "(15 Influence) "
if(points >= 15)
dat += "<a href='?src=\ref[src];purchase=implant'>Implant Breaker</a><br>"
else
dat += "Implant Breaker<br>"
if(free_pen)
dat += "(GET ONE FREE) "
else
dat += "(50 Influence) "
if((points >= 50)||free_pen)
dat += "<a href='?src=\ref[src];purchase=pen'>Recruitment Pen</a><br>"
else
dat += "Recruitment Pen<br>"
var/gangtooltext = "Spare Gangtool"
if(isboss && gang.bosses.len < 3)
gangtooltext = "Promote a Gangster"
dat += "(10 Influence) "
if(points >= 10)
dat += "<a href='?src=\ref[src];purchase=gangtool'>[gangtooltext]</a><br>"
else
dat += "[gangtooltext]<br>"
if(!gang.dom_attempts)
dat += "(Out of stock) Station Dominator<br>"
else
dat += "(30 Influence) "
if(points >= 30)
dat += "<a href='?src=\ref[src];purchase=dominator'><b>Station Dominator</b></a><br>"
else
dat += "<b>Station Dominator</b><br>"
dat += "<i>(Estimated Takeover Time: [round(determine_domination_time(gang)/60,0.1)] minutes)</i><br>"
dat += "<br>"
dat += "<a href='?src=\ref[src];choice=refresh'>Refresh</a><br>"
var/datum/browser/popup = new(user, "gangtool", "Welcome to GangTool v3.2", 340, 625)
var/datum/browser/popup = new(user, "gangtool", "Welcome to GangTool v3.4", 340, 625)
popup.set_content(dat)
popup.open()
@@ -181,126 +94,10 @@
return
if(href_list["purchase"])
var/pointcost
var/item_type
switch(href_list["purchase"])
if("spraycan")
if(gang.points >= 5)
item_type = /obj/item/toy/crayon/spraycan/gang
pointcost = 5
if("switchblade")
if(gang.points >= 10)
item_type = /obj/item/weapon/switchblade
pointcost = 10
if("necklace")
if(gang.points >=1)
item_type = /obj/item/clothing/neck/necklace/dope
pointcost = 1
if("pistol")
if(gang.points >= 25)
item_type = /obj/item/weapon/gun/ballistic/automatic/pistol
pointcost = 25
if("10mmammo")
if(gang.points >= 10)
item_type = /obj/item/ammo_box/magazine/m10mm
pointcost = 10
if("uzi")
if(gang.points >= 60)
item_type = /obj/item/weapon/gun/ballistic/automatic/mini_uzi
pointcost = 60
if("9mmammo")
if(gang.points >= 40)
item_type = /obj/item/ammo_box/magazine/uzim9mm
pointcost = 40
if("scroll")
if(gang.points >= 30)
item_type = /obj/item/weapon/sleeping_carp_scroll
usr << "<span class='notice'>Anyone who reads the <b>sleeping carp scroll</b> will learn secrets of the sleeping carp martial arts style.</span>"
pointcost = 30
if("wrestlingbelt")
if(gang.points >= 20)
item_type = /obj/item/weapon/storage/belt/champion/wrestling
usr << "<span class='notice'>Anyone wearing the <b>wresting belt</b> will know how to be effective with wrestling.</span>"
pointcost = 20
if("bostaff")
if(gang.points >= 10)
item_type = /obj/item/weapon/twohanded/bostaff
pointcost = 10
if("C4")
if(gang.points >= 10)
item_type = /obj/item/weapon/grenade/plastic/c4
pointcost = 10
if("pen")
if((gang.points >= 50) || free_pen)
item_type = /obj/item/weapon/pen/gang
usr << "<span class='notice'>More <b>recruitment pens</b> will allow you to recruit gangsters faster. Only gang leaders can recruit with pens.</span>"
if(free_pen)
free_pen = 0
else
pointcost = 50
if("implant")
if(gang.points >= 15)
item_type = /obj/item/weapon/implanter/gang
usr << "<span class='notice'>The <b>implant breaker</b> is a single-use device that destroys all implants within the target before trying to recruit them to your gang. Also works on enemy gangsters.</span>"
pointcost = 15
if("gangtool")
if(gang.points >= 10)
if(usr.mind == gang.bosses[1])
item_type = /obj/item/device/gangtool/spare/lt
if(gang.bosses.len < 3)
usr << "<span class='notice'><b>Gangtools</b> allow you to promote a gangster to be your Lieutenant, enabling them to recruit and purchase items like you. Simply have them register the gangtool. You may promote up to [3-gang.bosses.len] more Lieutenants</span>"
else
item_type = /obj/item/device/gangtool/spare
pointcost = 10
if("dominator")
if(!gang.dom_attempts)
return
var/datum/gang_item/G = gang.item_list[href_list["purchase"]]
if(G && G.can_buy(usr, gang, src))
G.purchase(usr, gang, src, FALSE)
var/area/usrarea = get_area(usr.loc)
var/usrturf = get_turf(usr.loc)
if(initial(usrarea.name) == "Space" || isspaceturf(usrturf) || usr.z != 1)
usr << "<span class='warning'>You can only use this on the station!</span>"
return
for(var/obj/obj in usrturf)
if(obj.density)
usr << "<span class='warning'>There's not enough room here!</span>"
return
if(usrarea.type in gang.territory|gang.territory_new)
if(gang.points >= 30)
item_type = /obj/machinery/dominator
usr << "<span class='notice'>The <b>dominator</b> will secure your gang's dominance over the station. Turn it on when you are ready to defend it.</span>"
pointcost = 30
else
usr << "<span class='warning'>The <b>dominator</b> can be spawned only on territory controlled by your gang!</span>"
return
if(item_type)
gang.points -= pointcost
if(ispath(item_type))
var/obj/purchased = new item_type(get_turf(usr),gang)
var/mob/living/carbon/human/H = usr
H.put_in_hands(purchased)
if(pointcost)
gang.message_gangtools("A [href_list["purchase"]] was purchased by [usr.real_name] for [pointcost] Influence.")
log_game("A [href_list["purchase"]] was purchased by [key_name(usr)] ([gang.name] Gang) for [pointcost] Influence.")
else
usr << "<span class='warning'>Not enough influence.</span>"
else if(href_list["choice"])
switch(href_list["choice"])
if("recall")
if(usr.mind == gang.bosses[1])
recall(usr)
if("outfit")
if(outfits > 0)
if(gang.gang_outfit(usr,src))
usr << "<span class='notice'><b>Gang Outfits</b> can act as armor with moderate protection against ballistic and melee attacks. Every gangster wearing one will also help grow your gang's influence.</span>"
outfits -= 1
if("ping")
ping_gang(usr)
attack_self(usr)
+1
View File
@@ -427,6 +427,7 @@
#include "code\game\gamemodes\gang\dominator.dm"
#include "code\game\gamemodes\gang\gang.dm"
#include "code\game\gamemodes\gang\gang_datum.dm"
#include "code\game\gamemodes\gang\gang_items.dm"
#include "code\game\gamemodes\gang\gang_pen.dm"
#include "code\game\gamemodes\gang\recaller.dm"
#include "code\game\gamemodes\malfunction\Malf_Modules.dm"