Decentralized and Vastly Improved Gang Influence System
@@ -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
|
||||
|
||||
|
||||
@@ -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, "<span class='notice'>The [src] Gang's influence grows as you wear [gang_outfit].</span>")
|
||||
uniformed ++
|
||||
|
||||
//Calculate and report influence growth
|
||||
var/message = "<b>[src] Gang Status Report:</b><BR>*---------*<br>"
|
||||
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.<BR>"
|
||||
set_domination_time(new_time)
|
||||
message += "<b>[seconds_remaining] seconds remain</b> in hostile takeover.<BR>"
|
||||
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.<BR>"
|
||||
points = points_new
|
||||
message += "Your gang now has <b>[points] influence</b>.<BR>"
|
||||
|
||||
//Process new territories
|
||||
for(var/area in territory_new)
|
||||
@@ -234,27 +212,69 @@
|
||||
territory += area
|
||||
|
||||
//Report territory changes
|
||||
var/message = "<b>[src] Gang Status Report:</b>.<BR>*---------*<BR>"
|
||||
message += "<b>[territory_new.len] new territories:</b><br><i>[added_names]</i><br>"
|
||||
message += "<b>[territory_lost.len] territories lost:</b><br><i>[lost_names]</i><br>"
|
||||
|
||||
//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 <b>[control]% control</b> of the station.<BR>*---------*"
|
||||
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 <b>[control]% control</b> of the station.<BR>*---------*<BR>"
|
||||
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.<BR>"
|
||||
set_domination_time(new_time)
|
||||
message += "<b>[seconds_remaining] seconds remain</b> in hostile takeover.<BR>"
|
||||
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.<BR>"
|
||||
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<BR>"
|
||||
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.<BR>"
|
||||
pmessage += "You now have <b>[G.points] influence</b>.<BR>"
|
||||
to_chat(ganger, "<span class='notice'>\icon[G] [pmessage]</span>")
|
||||
|
||||
|
||||
//Multiverse
|
||||
|
||||
/datum/gang/multiverse
|
||||
dom_attempts = 0
|
||||
points = 0
|
||||
fighting_style = "multiverse"
|
||||
is_deconvertible = FALSE
|
||||
|
||||
|
||||
@@ -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, "<span class='notice'> 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, "<span class='notice'> 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, "<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
|
||||
@@ -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"
|
||||
|
||||
@@ -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, "<span class='warning'>There's not enough room here!</span>")
|
||||
return FALSE
|
||||
-
|
||||
+
|
||||
if(dominator_excessive_walls(user))
|
||||
to_chat(user, "span class='warning'>The <b>dominator</b> will not function here! The <b>dominator</b> requires an open space within three standard units so that walls do not interfere with the signal.</span>")
|
||||
return FALSE
|
||||
-
|
||||
+
|
||||
if(!(usrarea.type in gang.territory|gang.territory_new))
|
||||
to_chat(user, "<span class='warning'>The <b>dominator</b> can be spawned only on territory controlled by your gang!</span>")
|
||||
return FALSE
|
||||
@@ -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, "<span class='warning'>This gangster already has an uplink!</span>")
|
||||
return
|
||||
new /obj/item/device/gangtool/soldier(M)
|
||||
to_chat(user, "<span class='warning'>You inject [M] with a new gangtool!</span>")
|
||||
cooldown(G)
|
||||
if(2)
|
||||
new /obj/item/device/gangtool/soldier(M)
|
||||
M.Paralyse(5)
|
||||
cooldown(G)
|
||||
if(1)
|
||||
|
||||
@@ -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: <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/GLOB.start_state.num_territories)*100, 1)]%</B><br>"
|
||||
dat += "Gang Influence: <B>[gang.points]</B><br>"
|
||||
dat += "Time until Influence grows: <B>[(gang.points >= 999) ? ("--:--") : (time2text(SSticker.mode.gang_points.next_point_time - world.time, "mm:ss"))]</B><br>"
|
||||
dat += "Your Influence: <B>[points]</B><br>"
|
||||
dat += "Time until Influence grows: <B>[time2text(SSticker.mode.gang_points.next_point_time - world.time, "mm:ss")]</B><br>"
|
||||
dat += "<hr>"
|
||||
|
||||
|
||||
for(var/cat in gang.item_category_list)
|
||||
for(var/cat in gang.boss_category_list)
|
||||
dat += "<b>[cat]</b><br>"
|
||||
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 += "<a href='?src=\ref[src];choice=refresh'>Refresh</a><br>"
|
||||
|
||||
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, "<span class='warning'>Error: Recall already in progress.</span>")
|
||||
return 0
|
||||
|
||||
|
||||
if(!gang.recalls)
|
||||
to_chat(usr, "<span class='warning'>Error: Unable to access communication arrays. Firewall has logged our signature and is blocking all further attempts.</span>")
|
||||
|
||||
@@ -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, "<span class='info'>\icon[src]No response recieved. Emergency shuttle cannot be recalled at this time.</span>")
|
||||
@@ -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
|
||||
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 += "<center><font color='red'>Takeover In Progress:<br><B>[gang.domination_time_remaining()] seconds remain</B></font></center>"
|
||||
dat += "Registration: <B>[gang.name] - Foot Soldier</B><br>"
|
||||
dat += "Organization Size: <B>[gang.gangsters.len + gang.bosses.len]</B> | Station Control: <B>[round((gang.territory.len/GLOB.start_state.num_territories)*100, 1)]%</B><br>"
|
||||
dat += "Your Influence: <B>[points]</B><br>"
|
||||
if(LAZYLEN(tags))
|
||||
dat += "Your tags generate bonus influence for you.<br> 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 += "<br>Time until Influence grows: <B>[time2text(SSticker.mode.gang_points.next_point_time - world.time, "mm:ss")]</B><br>"
|
||||
dat += "<hr>"
|
||||
for(var/cat in gang.reg_category_list)
|
||||
dat += "<b>[cat]</b><br>"
|
||||
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 = "<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>"
|
||||
|
||||
dat += "<a href='?src=\ref[src];choice=refresh'>Refresh</a><br>"
|
||||
|
||||
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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -68,6 +68,7 @@
|
||||
var/pre_noise = FALSE
|
||||
var/post_noise = FALSE
|
||||
|
||||
|
||||
/obj/item/toy/crayon/suicide_act(mob/user)
|
||||
user.visible_message("<span class='suicide'>[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!</span>")
|
||||
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, "<span class='notice'>You tagged [territory] for your gang!</span>")
|
||||
|
||||
/obj/item/toy/crayon/red
|
||||
|
||||
@@ -442,7 +442,7 @@
|
||||
dat += "</table>"
|
||||
|
||||
for(var/datum/gang/G in SSticker.mode.gangs)
|
||||
dat += "<br><table cellspacing=5><tr><td><B>[G.name] Gang: <a href='?_src_=holder;gangpoints=\ref[G]'>[G.points] Influence</a> | [round((G.territory.len/GLOB.start_state.num_territories)*100, 1)]% Control</B></td><td></td></tr>"
|
||||
dat += "<br><table cellspacing=5><tr><td><B>[G.name] Gang: [round((G.territory.len/GLOB.start_state.num_territories)*100, 1)]% Control</B></td><td></td></tr>"
|
||||
for(var/datum/mind/N in G.bosses)
|
||||
var/mob/M = N.current
|
||||
if(!M)
|
||||
|
||||
@@ -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].</span>")
|
||||
log_admin("[key_name(usr)] changed the [G.name] Gang's influence from [G.points] to [newpoints].</span>")
|
||||
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)
|
||||
|
||||
@@ -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."
|
||||
|
||||
|
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 16 KiB |
|
Before Width: | Height: | Size: 32 KiB After Width: | Height: | Size: 32 KiB |
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 26 KiB After Width: | Height: | Size: 31 KiB |
|
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 11 KiB |