diff --git a/code/game/gamemodes/gang/gang_datum.dm b/code/game/gamemodes/gang/gang_datum.dm index 7c443d1c14b..935b1820e2f 100644 --- a/code/game/gamemodes/gang/gang_datum.dm +++ b/code/game/gamemodes/gang/gang_datum.dm @@ -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) diff --git a/code/game/gamemodes/gang/gang_items.dm b/code/game/gamemodes/gang/gang_items.dm new file mode 100644 index 00000000000..ab1a91f4e37 --- /dev/null +++ b/code/game/gamemodes/gang/gang_items.dm @@ -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 << "Gang Outfits can act as armor with moderate protection against ballistic and melee attacks. Every gangster wearing one will also help grow your gang's influence." + 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 " ↳" + ..() //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 = "Anyone who reads the sleeping carp scroll will learn secrets of the sleeping carp martial arts style." + +/datum/gang_item/weapon/wrestlingbelt + name = "Wrestling Belt" + id = "wrastling_belt" + cost = 20 + item_path = /obj/item/weapon/storage/belt/champion/wrestling + spawn_msg = "Anyone wearing the wresting belt will know how to be effective with wrestling." + + +/////////////////// +//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 = "The implant breaker 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." + +/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 = "More recruitment pens will allow you to recruit gangsters faster. Only gang leaders can recruit with pens." + +/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 << "Gangtools 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" + 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 = "The dominator will secure your gang's dominance over the station. Turn it on when you are ready to defend it." + +/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 "[..()]" + +/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 << "You can only use this on the station!" + return FALSE + + for(var/obj/obj in usrturf) + if(obj.density) + user << "There's not enough room here!" + return FALSE + + if(!(usrarea.type in gang.territory|gang.territory_new)) + user << "The dominator can be spawned only on territory controlled by your gang!" + 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) diff --git a/code/game/gamemodes/gang/recaller.dm b/code/game/gamemodes/gang/recaller.dm index 724dbc4e850..5e99870658b 100644 --- a/code/game/gamemodes/gang/recaller.dm +++ b/code/game/gamemodes/gang/recaller.dm @@ -45,124 +45,37 @@ dat += "
Takeover In Progress:
[gang.domination_time_remaining()] seconds remain
" var/isboss = (user.mind == gang.bosses[1]) - var/points = gang.points dat += "Registration: [gang.name] Gang [isboss ? "Boss" : "Lieutenant"]
" dat += "Organization Size: [gang.gangsters.len + gang.bosses.len] | Station Control: [round((gang.territory.len/start_state.num_territories)*100, 1)]%
" - dat += "Gang Influence: [points]
" - dat += "Time until Influence grows: [(points >= 999) ? ("--:--") : (time2text(ticker.mode.gang_points.next_point_time - world.time, "mm:ss"))]
" + dat += "Gang Influence: [gang.points]
" + dat += "Time until Influence grows: [(gang.points >= 999) ? ("--:--") : (time2text(ticker.mode.gang_points.next_point_time - world.time, "mm:ss"))]
" dat += "
" - dat += "Gangtool Functions:
" - dat += "Send Message to Gang
" - if(outfits > 0) - dat += "Create Armored Gang Outfit
" - else - dat += "Create Gang Outfit (Restocking)
" - if(isboss) - dat += "Recall Emergency Shuttle
" - dat += "
" - dat += "Purchase Weapons:
" + for(var/cat in gang.item_category_list) + dat += "[cat]
" + 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 += "Switchblade
" - else - dat += "Switchblade
" - - dat += "(25 Influence) " - if(points >= 25) - dat += "10mm Pistol
" - else - dat += "10mm Pistol
" - - dat += " ↳(10 Influence) " - if(points >= 10) - dat += "10mm Ammo
" - else - dat += "10mm Ammo
" - - dat += "(60 Influence) " - if(points >= 60) - dat += "Uzi SMG
" - else - dat += "Uzi SMG
" - - dat += " ↳(40 Influence) " - if(points >= 40) - dat += "Uzi Ammo
" - else - dat += "Uzi Ammo
" - - dat += "(1 Influence) " - if(points >=1) - dat += "Dope Necklace
" - else - dat += "Dope Necklace
" + 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 = "[toAdd]" + dat += toAdd + var/extra = G.get_extra_info(user, gang, src) + if(extra) + dat += "
[extra]" + dat += "
" dat += "
" - //////////////////////// - // STANDARD EQUIPMENT // - //////////////////////// - - dat += "Purchase Equipment:
" - - dat += "(5 Influence) " - if(points >= 5) - dat += "Territory Spraycan
" - else - dat += "Territory Spraycan
" - - dat += "(10 Influence) " - if(points >= 10) - dat += "C4 Explosive
" - else - dat += "C4 Explosive
" - - dat += "(15 Influence) " - if(points >= 15) - dat += "Implant Breaker
" - else - dat += "Implant Breaker
" - - if(free_pen) - dat += "(GET ONE FREE) " - else - dat += "(50 Influence) " - if((points >= 50)||free_pen) - dat += "Recruitment Pen
" - else - dat += "Recruitment Pen
" - - var/gangtooltext = "Spare Gangtool" - if(isboss && gang.bosses.len < 3) - gangtooltext = "Promote a Gangster" - dat += "(10 Influence) " - if(points >= 10) - dat += "[gangtooltext]
" - else - dat += "[gangtooltext]
" - - if(!gang.dom_attempts) - dat += "(Out of stock) Station Dominator
" - else - dat += "(30 Influence) " - if(points >= 30) - dat += "Station Dominator
" - else - dat += "Station Dominator
" - dat += "(Estimated Takeover Time: [round(determine_domination_time(gang)/60,0.1)] minutes)
" - - dat += "
" dat += "Refresh
" - 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 << "Anyone who reads the sleeping carp scroll will learn secrets of the sleeping carp martial arts style." - pointcost = 30 - if("wrestlingbelt") - if(gang.points >= 20) - item_type = /obj/item/weapon/storage/belt/champion/wrestling - usr << "Anyone wearing the wresting belt will know how to be effective with wrestling." - 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 << "More recruitment pens will allow you to recruit gangsters faster. Only gang leaders can recruit with pens." - if(free_pen) - free_pen = 0 - else - pointcost = 50 - if("implant") - if(gang.points >= 15) - item_type = /obj/item/weapon/implanter/gang - usr << "The implant breaker 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." - 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 << "Gangtools 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" - 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 << "You can only use this on the station!" - return - - for(var/obj/obj in usrturf) - if(obj.density) - usr << "There's not enough room here!" - return - - if(usrarea.type in gang.territory|gang.territory_new) - if(gang.points >= 30) - item_type = /obj/machinery/dominator - usr << "The dominator will secure your gang's dominance over the station. Turn it on when you are ready to defend it." - pointcost = 30 - else - usr << "The dominator can be spawned only on territory controlled by your gang!" - 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 << "Not enough influence." - - 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 << "Gang Outfits can act as armor with moderate protection against ballistic and melee attacks. Every gangster wearing one will also help grow your gang's influence." - outfits -= 1 - if("ping") - ping_gang(usr) attack_self(usr) diff --git a/tgstation.dme b/tgstation.dme index fc8418fe000..426d3bed03f 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -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"