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 += "