diff --git a/code/game/gamemodes/gang/gang.dm b/code/game/gamemodes/gang/gang.dm index 46f651d359..ca51e20cc6 100644 --- a/code/game/gamemodes/gang/gang.dm +++ b/code/game/gamemodes/gang/gang.dm @@ -2,7 +2,8 @@ //Gang War Game Mode GLOBAL_LIST_INIT(gang_name_pool, list("Clandestine", "Prima", "Zero-G", "Max", "Blasto", "Waffle", "North", "Omni", "Newton", "Cyber", "Donk", "Gene", "Gib", "Tunnel", "Diablo", "Psyke", "Osiron", "Sirius", "Sleeping Carp")) -GLOBAL_LIST_INIT(gang_colors_pool, list("red","orange","yellow","green","blue","purple")) +GLOBAL_LIST_INIT(gang_colors_pool, list("red","orange","yellow","green","blue","purple", "white")) +GLOBAL_LIST_INIT(gang_outfit_pool, list(/obj/item/clothing/suit/jacket/leather,/obj/item/clothing/suit/jacket/leather/overcoat,/obj/item/clothing/suit/jacket/puffer,/obj/item/clothing/suit/jacket/miljacket,/obj/item/clothing/suit/jacket/puffer,/obj/item/clothing/suit/pirate,/obj/item/clothing/suit/poncho,/obj/item/clothing/suit/apron/overalls,/obj/item/clothing/suit/jacket/letterman)) /datum/game_mode var/list/datum/gang/gangs = list() @@ -164,6 +165,8 @@ GLOBAL_LIST_INIT(gang_colors_pool, list("red","orange","yellow","green","blue"," /////////////////////////////////////////// /datum/game_mode/proc/add_gangster(datum/mind/gangster_mind, datum/gang/G, check = 1) if(!G || (gangster_mind in get_all_gangsters()) || (gangster_mind.enslaved_to && !is_gangster(gangster_mind.enslaved_to))) + if(is_in_gang(gangster_mind.current, G.name) && !(gangster_mind in get_gang_bosses())) + return 3 return 0 if(check && gangster_mind.current.isloyal()) //Check to see if the potential gangster is implanted return 1 @@ -193,6 +196,10 @@ GLOBAL_LIST_INIT(gang_colors_pool, list("red","orange","yellow","green","blue"," //////////////////////////////////////////////////////////////////// /datum/game_mode/proc/remove_gangster(datum/mind/gangster_mind, beingborged, silent, remove_bosses=0) var/datum/gang/gang = gangster_mind.gang_datum + for(var/obj/O in gangster_mind.current.contents) + if(istype(O, /obj/item/device/gangtool/soldier)) + qdel(O) + if(!gang) return 0 diff --git a/code/game/gamemodes/gang/gang_datum.dm b/code/game/gamemodes/gang/gang_datum.dm index ba455e94e5..075309b9d3 100644 --- a/code/game/gamemodes/gang/gang_datum.dm +++ b/code/game/gamemodes/gang/gang_datum.dm @@ -15,33 +15,74 @@ var/list/territory_lost = list() var/recalls = 1 var/dom_attempts = 2 - var/points = 15 + var/inner_outfit + var/outer_outfit var/datum/atom_hud/antag/gang/ganghud var/is_deconvertible = TRUE //Can you deconvert normal gangsters from the gang var/domination_timer var/is_dominating - var/item_list - var/item_category_list - var/buyable_items = list( + var/boss_item_list + var/boss_category_list + var/static/list/boss_items = list( /datum/gang_item/function/gang_ping, /datum/gang_item/function/recall, - /datum/gang_item/function/outfit, + /datum/gang_item/clothing/under, + /datum/gang_item/clothing/suit, + /datum/gang_item/clothing/hat, + /datum/gang_item/clothing/neck, + /datum/gang_item/clothing/shoes, + /datum/gang_item/clothing/mask, + /datum/gang_item/clothing/hands, + /datum/gang_item/clothing/belt, + /datum/gang_item/weapon/shuriken, /datum/gang_item/weapon/switchblade, /datum/gang_item/weapon/pistol, /datum/gang_item/weapon/ammo/pistol_ammo, + /datum/gang_item/weapon/sniper, + /datum/gang_item/weapon/ammo/sniper_ammo, /datum/gang_item/weapon/uzi, /datum/gang_item/weapon/ammo/uzi_ammo, + /datum/gang_item/equipment/sharpener, /datum/gang_item/equipment/spraycan, /datum/gang_item/equipment/c4, + /datum/gang_item/equipment/emp, + /datum/gang_item/equipment/frag, /datum/gang_item/equipment/implant_breaker, + /datum/gang_item/equipment/stimpack, /datum/gang_item/equipment/pen, - /datum/gang_item/equipment/gangtool, - /datum/gang_item/equipment/necklace, /datum/gang_item/equipment/dominator ) + var/reg_item_list + var/reg_category_list + var/static/list/soldier_items = list( + /datum/gang_item/clothing/under, + /datum/gang_item/clothing/suit, + /datum/gang_item/clothing/hat, + /datum/gang_item/clothing/neck, + /datum/gang_item/clothing/shoes, + /datum/gang_item/clothing/mask, + /datum/gang_item/clothing/hands, + /datum/gang_item/clothing/belt, + /datum/gang_item/weapon/shuriken, + /datum/gang_item/weapon/switchblade, + /datum/gang_item/weapon/pistol, + /datum/gang_item/weapon/ammo/pistol_ammo, + /datum/gang_item/weapon/sniper, + /datum/gang_item/weapon/ammo/sniper_ammo, + /datum/gang_item/weapon/uzi, + /datum/gang_item/weapon/ammo/uzi_ammo, + /datum/gang_item/equipment/sharpener, + /datum/gang_item/equipment/spraycan, + /datum/gang_item/equipment/c4, + /datum/gang_item/equipment/emp, + /datum/gang_item/equipment/frag, + /datum/gang_item/equipment/implant_breaker, + /datum/gang_item/equipment/stimpack, + ) + /datum/gang/New(loc,gangname) if(!GLOB.gang_colors_pool.len) message_admins("WARNING: Maximum number of gangs have been exceeded!") @@ -53,36 +94,56 @@ switch(color) if("red") color_hex = "#DA0000" + inner_outfit = pick(/obj/item/clothing/under/color/red, /obj/item/clothing/under/lawyer/red) if("orange") color_hex = "#FF9300" + inner_outfit = pick(/obj/item/clothing/under/color/orange, /obj/item/clothing/under/geisha) if("yellow") color_hex = "#FFF200" + inner_outfit = pick(/obj/item/clothing/under/color/yellow, /obj/item/clothing/under/burial, /obj/item/clothing/under/suit_jacket/tan) if("green") color_hex = "#A8E61D" + inner_outfit = pick(/obj/item/clothing/under/color/green, /obj/item/clothing/under/syndicate/camo, /obj/item/clothing/under/suit_jacket/green) if("blue") color_hex = "#00B7EF" + inner_outfit = pick(/obj/item/clothing/under/color/blue, /obj/item/clothing/under/suit_jacket/navy) if("purple") color_hex = "#DA00FF" + inner_outfit = pick(/obj/item/clothing/under/color/lightpurple, /obj/item/clothing/under/lawyer/purpsuit) + if("white") + color_hex = "#FFFFFF" + inner_outfit = pick(/obj/item/clothing/under/color/white, /obj/item/clothing/under/suit_jacket/white) name = (gangname ? gangname : pick(GLOB.gang_name_pool)) GLOB.gang_name_pool -= name - + outer_outfit = pick(GLOB.gang_outfit_pool) 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] + boss_item_list = list() + boss_category_list = list() + for(var/B in boss_items) + var/datum/gang_item/G = new B() + boss_item_list[G.id] = G + var/list/Cat = boss_category_list[G.category] if(Cat) Cat += G else - item_category_list[G.category] = list(G) + boss_category_list[G.category] = list(G) + + reg_item_list = list() + reg_category_list = list() + for(var/S in soldier_items) + var/datum/gang_item/G = new S() + reg_item_list[G.id] = G + var/list/Cat = reg_category_list[G.category] + if(Cat) + Cat += G + else + reg_category_list[G.category] = list(G) /datum/gang/proc/add_gang_hud(datum/mind/recruit_mind) ganghud.join_hud(recruit_mind.current) @@ -103,51 +164,6 @@ /datum/gang/proc/domination_time_remaining() var/diff = domination_timer - world.time return diff / 10 -//////////////////////////////////////////// OUTFITS - - -//Used by recallers when purchasing a gang outfit. First time a gang outfit is purchased the buyer decides a gang style which is stored so gang outfits are uniform -/datum/gang/proc/gang_outfit(mob/living/carbon/user,obj/item/device/gangtool/gangtool) - if(!user || !gangtool) - return 0 - if(!gangtool.can_use(user)) - return 0 - - var/gang_style_list = list("Gang Colors","Black Suits","White Suits","Leather Jackets","Leather Overcoats","Puffer Jackets","Military Jackets","Tactical Turtlenecks","Soviet Uniforms") - if(!style && (user.mind in SSticker.mode.get_gang_bosses())) //Only the boss gets to pick a style - style = input("Pick an outfit style.", "Pick Style") as null|anything in gang_style_list - - if(gangtool.can_use(user) && (gangtool.outfits >= 1)) - var/outfit_path - switch(style) - if(null || "Gang Colors") - outfit_path = text2path("/obj/item/clothing/under/color/[color]") - if("Black Suits") - outfit_path = /obj/item/clothing/under/suit_jacket/charcoal - if("White Suits") - outfit_path = /obj/item/clothing/under/suit_jacket/white - if("Puffer Jackets") - outfit_path = /obj/item/clothing/suit/jacket/puffer - if("Leather Jackets") - outfit_path = /obj/item/clothing/suit/jacket/leather - if("Leather Overcoats") - outfit_path = /obj/item/clothing/suit/jacket/leather/overcoat - if("Military Jackets") - outfit_path = /obj/item/clothing/suit/jacket/miljacket - if("Soviet Uniforms") - outfit_path = /obj/item/clothing/under/soviet - if("Tactical Turtlenecks") - outfit_path = /obj/item/clothing/under/syndicate - - if(outfit_path) - var/obj/item/clothing/outfit = new outfit_path(user.loc) - outfit.armor = list(melee = 20, bullet = 30, laser = 10, energy = 10, bomb = 20, bio = 0, rad = 0, fire = 30, acid = 30) - outfit.desc += " Tailored for the [name] Gang to offer the wearer moderate protection against ballistics and physical trauma." - outfit.gang = src - user.put_in_hands(outfit) - return 1 - - return 0 //////////////////////////////////////////// MESSAGING @@ -186,45 +202,7 @@ lost_names += "[territory_lost[area]]" territory -= area - //Count uniformed gangsters - var/uniformed = 0 - for(var/datum/mind/gangmind in (gangsters|bosses)) - if(ishuman(gangmind.current)) - var/mob/living/carbon/human/gangster = gangmind.current - //Gangster must be alive and on station - if((gangster.stat == DEAD) || (gangster.z > ZLEVEL_STATION)) - continue - - var/obj/item/clothing/outfit - var/obj/item/clothing/gang_outfit - if(gangster.w_uniform) - outfit = gangster.w_uniform - if(outfit.gang == src) - gang_outfit = outfit - if(gangster.wear_suit) - outfit = gangster.wear_suit - if(outfit.gang == src) - gang_outfit = outfit - - if(gang_outfit) - to_chat(gangster, "The [src] Gang's influence grows as you wear [gang_outfit].") - uniformed ++ - //Calculate and report influence growth - var/message = "[src] Gang Status Report:
*---------*
" - if(is_dominating) - var/seconds_remaining = domination_time_remaining() - var/new_time = max(180, seconds_remaining - (uniformed * 4) - (territory.len * 2)) - if(new_time < seconds_remaining) - message += "Takeover shortened by [seconds_remaining - new_time] seconds for defending [territory.len] territories and [uniformed] uniformed gangsters.
" - set_domination_time(new_time) - message += "[seconds_remaining] seconds remain in hostile takeover.
" - else - var/points_new = min(999,points + 15 + (uniformed * 2) + territory.len) - if(points_new != points) - message += "Gang influence has increased by [points_new - points] for defending [territory.len] territories and [uniformed] uniformed gangsters.
" - points = points_new - message += "Your gang now has [points] influence.
" //Process new territories for(var/area in territory_new) @@ -234,27 +212,69 @@ territory += area //Report territory changes + var/message = "[src] Gang Status Report:.
*---------*
" message += "[territory_new.len] new territories:
[added_names]
" message += "[territory_lost.len] territories lost:
[lost_names]
" - //Clear the lists territory_new = list() territory_lost = list() - var/control = round((territory.len/GLOB.start_state.num_territories)*100, 1) - message += "Your gang now has [control]% control of the station.
*---------*" - message_gangtools(message) - - //Increase outfit stock - for(var/obj/item/device/gangtool/tool in gangtools) - tool.outfits = min(tool.outfits+1,5) + var/sbonus = sqrt(LAZYLEN(territory)) // Bonus given to soldier's for the gang's total territory + message += "Your gang now has [control]% control of the station.
*---------*
" + if(is_dominating) + var/seconds_remaining = domination_time_remaining() + var/new_time = max(180, seconds_remaining - (territory.len * 2)) + if(new_time < seconds_remaining) + message += "Takeover shortened by [seconds_remaining - new_time] seconds for defending [territory.len] territories.
" + set_domination_time(new_time) + message += "[seconds_remaining] seconds remain in hostile takeover.
" + else + for(var/obj/item/device/gangtool/G in gangtools) + var/pmessage = message + var/points_new = 0 + if(istype(G, /obj/item/device/gangtool/soldier)) + points_new = max(0,round(3 - G.points/10)) + (sbonus) + (LAZYLEN(G.tags)/2) // Soldier points + pmessage += "Your influence has increased by [round(sbonus)] from your gang holding [LAZYLEN(territory)] territories, and a bonus of [round(LAZYLEN(G.tags)/2)] for territories you have personally marked and kept intact.
" + else + points_new = max(0,round(5 - G.points/10)) + LAZYLEN(territory) // Boss points, more focused on big picture + pmessage += "Your influence has increased by [round(points_new)] from your gang holding [territory.len] territories
" + G.points += points_new + var/mob/living/carbon/human/ganger = get(G.loc, /mob/living) + var/points_newer = 0 + var/static/inner = inner_outfit + var/static/outer = outer_outfit + if(ishuman(ganger) && ganger.mind in (gangsters|bosses)) + for(var/obj/C in ganger.contents) + if(C.type == inner_outfit) + points_newer += 2 + continue + if(C.type == outer_outfit) + points_newer += 2 + continue + switch(C.type) + if(/obj/item/clothing/neck/necklace/dope) + points_newer += 2 + if(/obj/item/clothing/head/collectable/petehat/gang) + points_newer += 4 + if(/obj/item/clothing/shoes/gang) + points_newer += 6 + if(/obj/item/clothing/mask/gskull) + points_newer += 5 + if(/obj/item/clothing/gloves/gang) + points_newer += 3 + if(/obj/item/weapon/storage/belt/military/gang) + points_newer += 4 + if(points_newer) + G.points += points_newer + pmessage += "Your influential choice of clothing has further increased your influence by [points_newer] points.
" + pmessage += "You now have [G.points] influence.
" + to_chat(ganger, "\icon[G] [pmessage]") //Multiverse /datum/gang/multiverse dom_attempts = 0 - points = 0 fighting_style = "multiverse" is_deconvertible = FALSE diff --git a/code/game/gamemodes/gang/gang_items.dm b/code/game/gamemodes/gang/gang_items.dm index d626aa3b9a..d71a06a190 100644 --- a/code/game/gamemodes/gang/gang_items.dm +++ b/code/game/gamemodes/gang/gang_items.dm @@ -6,14 +6,12 @@ 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 + gangtool.points -= real_cost spawn_item(user, gang, gangtool) return TRUE @@ -25,7 +23,7 @@ to_chat(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) + return gang && (gangtool.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 @@ -78,23 +76,104 @@ gangtool.recall(user) -/datum/gang_item/function/outfit - name = "Create Armored Gang Outfit" - id = "outfit" +/////////////////// +//CLOTHING +/////////////////// -/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/clothing + category = "Purchase Influence-Enhancing Clothes:" + +/datum/gang_item/clothing/under + name = "Gang Uniform" + id = "under" + cost = 1 + +/datum/gang_item/clothing/under/spawn_item(mob/living/carbon/user, datum/gang/gang, obj/item/device/gangtool/gangtool) + if(gang.inner_outfit) + var/obj/item/O = new gang.inner_outfit(user.loc) + user.put_in_hands(O) + to_chat(user, " This is your gang's official uniform, wearing it will increase your influence") + +/datum/gang_item/clothing/suit + name = "Gang Armored Outerwear" + id = "suit" + cost = 1 + +/datum/gang_item/clothing/suit/spawn_item(mob/living/carbon/user, datum/gang/gang, obj/item/device/gangtool/gangtool) + if(gang.outer_outfit) + var/obj/item/O = new gang.outer_outfit(user.loc) + O.armor = list(melee = 20, bullet = 35, laser = 10, energy = 10, bomb = 30, bio = 0, rad = 0, fire = 30, acid = 30) + O.desc += " Tailored for the [gang.name] Gang to offer the wearer moderate protection against ballistics and physical trauma." + user.put_in_hands(O) + to_chat(user, " This is your gang's official outerwear, wearing it will increase your influence") + + +/datum/gang_item/clothing/hat + name = "Pimp Hat" + id = "hat" + cost = 18 + item_path = /obj/item/clothing/head/collectable/petehat/gang + +/obj/item/clothing/head/collectable/petehat/gang + name = "pimpin' hat" + desc = "The undisputed king of style." + +/datum/gang_item/clothing/mask + name = "Golden Death Mask" + id = "mask" + cost = 20 + item_path = /obj/item/clothing/mask/gskull + +/obj/item/clothing/mask/gskull + name = "golden death mask" + icon_state = "gskull" + desc = "Strike terror, and envy, into the hearts of your enemies." + + +/datum/gang_item/clothing/shoes + name = "Bling Boots" + id = "boots" + cost = 25 + item_path = /obj/item/clothing/shoes/gang + +/obj/item/clothing/shoes/gang + name = "blinged-out boots" + desc = "Stand aside peasants." + icon_state = "bling" + +/datum/gang_item/clothing/neck + name = "Gold Necklace" + id = "necklace" + cost = 10 + item_path = /obj/item/clothing/neck/necklace/dope + + +/datum/gang_item/clothing/hands + name = "Decorative Brass Knuckles" + id = "hand" + cost = 12 + item_path = /obj/item/clothing/gloves/gang + +/obj/item/clothing/gloves/gang + name = "braggadocio's brass knuckles" + desc = "Purely decorative, don't find out the hard way." + icon_state = "knuckles" + w_class = 3 + +/datum/gang_item/clothing/belt + name = "Badass Belt" + id = "belt" + cost = 15 + item_path = /obj/item/weapon/storage/belt/military/gang + +/obj/item/weapon/storage/belt/military/gang + name = "badass belt" + icon_state = "gangbelt" + item_state = "gang" + desc = "The belt buckle simply reads 'BAMF'." + storage_slots = 1 -/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)) - to_chat(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 @@ -178,12 +257,6 @@ cost = 3 item_path = /obj/item/weapon/sharpener -/datum/gang_item/equipment/necklace - name = "Gold Necklace" - id = "necklace" - cost = 1 - item_path = /obj/item/clothing/neck/necklace/dope - /datum/gang_item/equipment/emp name = "EMP Grenade" diff --git a/code/game/gamemodes/gang/gang_items.dm.rej b/code/game/gamemodes/gang/gang_items.dm.rej new file mode 100644 index 0000000000..65627fb219 --- /dev/null +++ b/code/game/gamemodes/gang/gang_items.dm.rej @@ -0,0 +1,44 @@ +diff a/code/game/gamemodes/gang/gang_items.dm b/code/game/gamemodes/gang/gang_items.dm (rejected hunks) +@@ -131,7 +195,7 @@ + id = "pistol_ammo" + cost = 10 + item_path = /obj/item/ammo_box/magazine/m10mm +- ++ + /datum/gang_item/weapon/sniper + name = ".50cal Sniper Rifle" + id = "sniper" +@@ -156,8 +220,8 @@ + id = "uzi_ammo" + cost = 40 + item_path = /obj/item/ammo_box/magazine/uzim9mm +- +- ++ ++ + /////////////////// + //EQUIPMENT + /////////////////// +@@ -171,7 +235,7 @@ + id = "spraycan" + cost = 5 + item_path = /obj/item/toy/crayon/spraycan/gang +- ++ + /datum/gang_item/equipment/sharpener + name = "Sharpener" + id = "whetstone" +@@ -305,11 +369,11 @@ + if(obj.density) + to_chat(user, "There's not enough room here!") + return FALSE +- ++ + if(dominator_excessive_walls(user)) + to_chat(user, "span class='warning'>The dominator will not function here! The dominator requires an open space within three standard units so that walls do not interfere with the signal.") + return FALSE +- ++ + if(!(usrarea.type in gang.territory|gang.territory_new)) + to_chat(user, "The dominator can be spawned only on territory controlled by your gang!") + return FALSE diff --git a/code/game/gamemodes/gang/gang_pen.dm b/code/game/gamemodes/gang/gang_pen.dm index 930c612d14..01b8504e82 100644 --- a/code/game/gamemodes/gang/gang_pen.dm +++ b/code/game/gamemodes/gang/gang_pen.dm @@ -25,7 +25,16 @@ var/datum/gang/G = user.mind.gang_datum var/recruitable = SSticker.mode.add_gangster(M.mind,G) switch(recruitable) + if(3) + for(var/obj/O in M.contents) + if(istype(O, /obj/item/device/gangtool/soldier)) + to_chat(user, "This gangster already has an uplink!") + return + new /obj/item/device/gangtool/soldier(M) + to_chat(user, "You inject [M] with a new gangtool!") + cooldown(G) if(2) + new /obj/item/device/gangtool/soldier(M) M.Paralyse(5) cooldown(G) if(1) diff --git a/code/game/gamemodes/gang/recaller.dm b/code/game/gamemodes/gang/recaller.dm index c8c98e5d47..c9fcf3c074 100644 --- a/code/game/gamemodes/gang/recaller.dm +++ b/code/game/gamemodes/gang/recaller.dm @@ -12,9 +12,11 @@ origin_tech = "programming=5;bluespace=2;syndicate=5" var/datum/gang/gang //Which gang uses this? var/recalling = 0 - var/outfits = 3 + var/outfits = 2 var/free_pen = 0 var/promotable = 0 + var/points = 15 + var/list/tags = list() /obj/item/device/gangtool/Initialize() //Initialize supply point income if it hasn't already been started ..() @@ -48,14 +50,14 @@ var/isboss = (user.mind == gang.bosses[1]) dat += "Registration: [gang.name] Gang [isboss ? "Boss" : "Lieutenant"]
" dat += "Organization Size: [gang.gangsters.len + gang.bosses.len] | Station Control: [round((gang.territory.len/GLOB.start_state.num_territories)*100, 1)]%
" - dat += "Gang Influence: [gang.points]
" - dat += "Time until Influence grows: [(gang.points >= 999) ? ("--:--") : (time2text(SSticker.mode.gang_points.next_point_time - world.time, "mm:ss"))]
" + dat += "Your Influence: [points]
" + dat += "Time until Influence grows: [time2text(SSticker.mode.gang_points.next_point_time - world.time, "mm:ss")]
" dat += "
" - for(var/cat in gang.item_category_list) + for(var/cat in gang.boss_category_list) dat += "[cat]
" - for(var/V in gang.item_category_list[cat]) + for(var/V in gang.boss_category_list[cat]) var/datum/gang_item/G = V if(!G.can_see(user, gang, src)) continue @@ -76,7 +78,7 @@ dat += "Refresh
" - var/datum/browser/popup = new(user, "gangtool", "Welcome to GangTool v3.4", 340, 625) + var/datum/browser/popup = new(user, "gangtool", "Welcome to GangTool v3.5", 340, 625) popup.set_content(dat) popup.open() @@ -95,7 +97,7 @@ return if(href_list["purchase"]) - var/datum/gang_item/G = gang.item_list[href_list["purchase"]] + var/datum/gang_item/G = gang.boss_item_list[href_list["purchase"]] if(G && G.can_buy(usr, gang, src)) G.purchase(usr, gang, src, FALSE) @@ -168,7 +170,7 @@ if(recalling) to_chat(usr, "Error: Recall already in progress.") return 0 - + if(!gang.recalls) to_chat(usr, "Error: Unable to access communication arrays. Firewall has logged our signature and is blocking all further attempts.") @@ -212,7 +214,7 @@ userturf = get_turf(user) if(userturf.z == 1) //Check one more time that they are on station. if(SSshuttle.cancelEvac(user)) - gang.recalls -= 1 + gang.recalls -= 1 return 1 to_chat(loc, "\icon[src]No response recieved. Emergency shuttle cannot be recalled at this time.") @@ -227,18 +229,102 @@ return 0 if(!user.mind) return 0 - - if(gang) //If it's already registered, only let the gang's bosses use this - if(user.mind in gang.bosses) - return 1 - else //If it's not registered, any gangster can use this to register - if(user.mind in SSticker.mode.get_all_gangsters()) - return 1 - + if(gang && (user.mind in gang.bosses)) //If it's already registered, only let the gang's bosses use this + return 1 + else if(user.mind in SSticker.mode.get_all_gangsters()) // For soldiers and potential LT's + return 1 return 0 /obj/item/device/gangtool/spare outfits = 1 /obj/item/device/gangtool/spare/lt - promotable = 1 \ No newline at end of file + promotable = 1 +///////////// Internal tool used by gang regulars /////////// + +/obj/item/device/gangtool/soldier + points = 5 + +/obj/item/device/gangtool/soldier/New(mob/user) + . = ..() + gang = user.mind.gang_datum + gang.gangtools += src + var/datum/action/innate/gang/tool/GT = new + GT.Grant(user, src, gang) + +/obj/item/device/gangtool/soldier/attack_self(mob/user) + if (!can_use(user)) + return + var/dat + if(gang.is_dominating) + dat += "
Takeover In Progress:
[gang.domination_time_remaining()] seconds remain
" + dat += "Registration: [gang.name] - Foot Soldier
" + dat += "Organization Size: [gang.gangsters.len + gang.bosses.len] | Station Control: [round((gang.territory.len/GLOB.start_state.num_territories)*100, 1)]%
" + dat += "Your Influence: [points]
" + if(LAZYLEN(tags)) + dat += "Your tags generate bonus influence for you.
You have tagged the following territories:" + for(var/obj/effect/decal/cleanable/crayon/gang/T in tags) + dat += " [T.territory] -" + else + dat += "You have not personally tagged any territory for your gang. Use a spray can to mark your territory and receive bonus influence." + dat += "
Time until Influence grows: [time2text(SSticker.mode.gang_points.next_point_time - world.time, "mm:ss")]
" + dat += "
" + for(var/cat in gang.reg_category_list) + dat += "[cat]
" + for(var/V in gang.reg_category_list[cat]) + var/datum/gang_item/G = V + if(!G.can_see(user, gang, src)) + continue + + 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 += "
" + + dat += "Refresh
" + + var/datum/browser/popup = new(user, "gangtool", "Welcome to GangTool v3.5", 340, 625) + popup.set_content(dat) + popup.open() + +/obj/item/device/gangtool/soldier/Topic(href, href_list) + if(!can_use(usr)) + return + if(href_list["purchase"]) + var/datum/gang_item/G = gang.reg_item_list[href_list["purchase"]] + if(G && G.can_buy(usr, gang, src)) + G.purchase(usr, gang, src, FALSE) + + attack_self(usr) + +/datum/action/innate/gang + background_icon_state = "bg_spell" + +/datum/action/innate/gang/IsAvailable() + if(!owner.mind || !owner.mind in SSticker.mode.get_all_gangsters()) + return 0 + return ..() + +/datum/action/innate/gang/tool + name = "Personal Gang Tool" + desc = "An implanted gang tool that lets you purchase gear" + background_icon_state = "bg_mime" + button_icon_state = "bolt_action" + var/obj/item/device/gangtool/soldier/GT + +/datum/action/innate/gang/tool/Grant(mob/user, obj/reg, datum/gang/G) + . = ..() + GT = reg + button.color = G.color + +/datum/action/innate/gang/tool/Activate() + GT.attack_self(owner) diff --git a/code/game/objects/effects/decals/crayon.dm b/code/game/objects/effects/decals/crayon.dm index af205fd132..53ecfc8d62 100644 --- a/code/game/objects/effects/decals/crayon.dm +++ b/code/game/objects/effects/decals/crayon.dm @@ -8,7 +8,7 @@ /obj/effect/decal/cleanable/crayon/Initialize(mapload, main = "#FFFFFF", var/type = "rune1", var/e_name = "rune", var/rotation = 0, var/alt_icon = null) ..() - + name = e_name desc = "A [name] vandalizing the station." if(type == "poseur tag") @@ -30,22 +30,25 @@ layer = HIGH_OBJ_LAYER //Harder to hide do_icon_rotate = FALSE //These are designed to always face south, so no rotation please. var/datum/gang/gang + var/obj/item/device/gangtool/linked_tool + var/area/territory -/obj/effect/decal/cleanable/crayon/gang/Initialize(mapload, var/datum/gang/G, var/e_name = "gang tag", var/rotation = 0) +/obj/effect/decal/cleanable/crayon/gang/Initialize(mapload, var/datum/gang/G, var/e_name = "gang tag", var/rotation = 0, var/mob/user) if(!type || !G) qdel(src) - - var/area/territory = get_area(src) + territory = get_area(src) gang = G var/newcolor = G.color_hex icon_state = G.name G.territory_new |= list(territory.type = territory.name) - + linked_tool = locate(/obj/item/device/gangtool) in user.contents + if(linked_tool) + linked_tool.tags += src ..(mapload, newcolor, icon_state, e_name, rotation) /obj/effect/decal/cleanable/crayon/gang/Destroy() - var/area/territory = get_area(src) - + if(linked_tool) + linked_tool.tags -= src if(gang) gang.territory -= territory.type gang.territory_new -= territory.type diff --git a/code/game/objects/items/crayons.dm b/code/game/objects/items/crayons.dm index af8b9341f9..0c29ee3f9f 100644 --- a/code/game/objects/items/crayons.dm +++ b/code/game/objects/items/crayons.dm @@ -68,6 +68,7 @@ var/pre_noise = FALSE var/post_noise = FALSE + /obj/item/toy/crayon/suicide_act(mob/user) user.visible_message("[user] is jamming [src] up [user.p_their()] nose and into [user.p_their()] brain. It looks like [user.p_theyre()] trying to commit suicide!") return (BRUTELOSS|OXYLOSS) @@ -422,7 +423,7 @@ var/gangID = user.mind.gang_datum var/area/territory = get_area(target) - new /obj/effect/decal/cleanable/crayon/gang(target,gangID,"graffiti",0) + new /obj/effect/decal/cleanable/crayon/gang(target,gangID,"graffiti",0,user) to_chat(user, "You tagged [territory] for your gang!") /obj/item/toy/crayon/red diff --git a/code/modules/admin/player_panel.dm b/code/modules/admin/player_panel.dm index 06f6e5e993..dcdf1538fe 100644 --- a/code/modules/admin/player_panel.dm +++ b/code/modules/admin/player_panel.dm @@ -442,7 +442,7 @@ dat += "" for(var/datum/gang/G in SSticker.mode.gangs) - dat += "
" + dat += "
[G.name] Gang: [G.points] Influence | [round((G.territory.len/GLOB.start_state.num_territories)*100, 1)]% Control
" for(var/datum/mind/N in G.bosses) var/mob/M = N.current if(!M) diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index c1780e4a34..af3505deed 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -1511,17 +1511,6 @@ usr.client.cmd_admin_animalize(M) - else if(href_list["gangpoints"]) - var/datum/gang/G = locate(href_list["gangpoints"]) in SSticker.mode.gangs - if(G) - var/newpoints = input("Set [G.name ] Gang's influence.","Set Influence",G.points) as null|num - if(!newpoints) - return - message_admins("[key_name_admin(usr)] changed the [G.name] Gang's influence from [G.points] to [newpoints].") - log_admin("[key_name(usr)] changed the [G.name] Gang's influence from [G.points] to [newpoints].") - G.points = newpoints - G.message_gangtools("Your gang now has [G.points] influence.") - else if(href_list["adminplayeropts"]) var/mob/M = locate(href_list["adminplayeropts"]) show_player_panel(M) diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm index 6aedfc13e6..8a06ebd0da 100644 --- a/code/modules/clothing/under/miscellaneous.dm +++ b/code/modules/clothing/under/miscellaneous.dm @@ -211,6 +211,14 @@ item_state = "black_suit_fem" item_color = "black_suit_fem" +/obj/item/clothing/under/suit_jacket/green + name = "green suit" + desc = "A green suit and yellow necktie. Baller." + icon_state = "green_suit" + item_state = "dg_suit" + item_color = "green_suit" + can_adjust = 0 + /obj/item/clothing/under/suit_jacket/red name = "red suit" desc = "A red suit and blue tie. Somewhat formal." diff --git a/icons/mob/belt.dmi b/icons/mob/belt.dmi index b9ddf04153..8fbd06a23b 100644 Binary files a/icons/mob/belt.dmi and b/icons/mob/belt.dmi differ diff --git a/icons/mob/neck.dmi b/icons/mob/neck.dmi index 53bc261686..de13308f37 100644 Binary files a/icons/mob/neck.dmi and b/icons/mob/neck.dmi differ diff --git a/icons/obj/clothing/belts.dmi b/icons/obj/clothing/belts.dmi index 263e51400a..441f334ca7 100644 Binary files a/icons/obj/clothing/belts.dmi and b/icons/obj/clothing/belts.dmi differ diff --git a/icons/obj/clothing/gloves.dmi b/icons/obj/clothing/gloves.dmi index fd078d775c..48f37887cf 100644 Binary files a/icons/obj/clothing/gloves.dmi and b/icons/obj/clothing/gloves.dmi differ diff --git a/icons/obj/clothing/masks.dmi b/icons/obj/clothing/masks.dmi index 7a3c416b94..c0f2d46f62 100644 Binary files a/icons/obj/clothing/masks.dmi and b/icons/obj/clothing/masks.dmi differ diff --git a/icons/obj/clothing/shoes.dmi b/icons/obj/clothing/shoes.dmi index 90e4ee5332..d936e41df4 100644 Binary files a/icons/obj/clothing/shoes.dmi and b/icons/obj/clothing/shoes.dmi differ
[G.name] Gang: [round((G.territory.len/GLOB.start_state.num_territories)*100, 1)]% Control