Files
GS13NG/code/game/gamemodes/gang/gang_datum.dm
T

217 lines
7.3 KiB
Plaintext

//gang_datum.dm
//Datum-based gangs
/datum/gang
var/name = "ERROR"
var/color = "white"
var/color_hex = "#FFFFFF"
var/list/datum/mind/gangsters = list() //gang B Members
var/list/datum/mind/bosses = list() //gang A Bosses
var/list/obj/item/device/gangtool/gangtools = list()
var/style
var/fighting_style = "normal"
var/list/territory = list()
var/list/territory_new = list()
var/list/territory_lost = list()
var/dom_attempts = 2
var/points = 15
var/datum/atom_hud/antag/ganghud
var/domination_timer
var/is_dominating
/datum/gang/New(loc,gangname)
if(!gang_colors_pool.len)
message_admins("WARNING: Maximum number of gangs have been exceeded!")
throw EXCEPTION("Maximum number of gangs has been exceeded")
return
else
color = pick(gang_colors_pool)
gang_colors_pool -= color
switch(color)
if("red")
color_hex = "#DA0000"
if("orange")
color_hex = "#FF9300"
if("yellow")
color_hex = "#FFF200"
if("green")
color_hex = "#A8E61D"
if("blue")
color_hex = "#00B7EF"
if("purple")
color_hex = "#DA00FF"
name = (gangname ? gangname : pick(gang_name_pool))
gang_name_pool -= name
ganghud = new()
log_game("The [name] Gang has been created. Their gang color is [color].")
/datum/gang/proc/add_gang_hud(datum/mind/recruit_mind)
ganghud.join_hud(recruit_mind.current)
ticker.mode.set_antag_hud(recruit_mind.current, ((recruit_mind in bosses) ? "gang_boss" : "gangster"))
/datum/gang/proc/remove_gang_hud(datum/mind/defector_mind)
ganghud.leave_hud(defector_mind.current)
ticker.mode.set_antag_hud(defector_mind.current, null)
/datum/gang/proc/domination(modifier=1)
set_domination_time(determine_domination_time(src) * modifier)
is_dominating = TRUE
set_security_level("delta")
SSshuttle.emergencyNoEscape = 1
/datum/gang/proc/set_domination_time(d)
domination_timer = world.time + (10 * d)
/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 ticker.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)
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
/datum/gang/proc/message_gangtools(message,beep=1,warning)
if(!gangtools.len || !message)
return
for(var/obj/item/device/gangtool/tool in gangtools)
var/mob/living/mob = get(tool.loc,/mob/living)
if(mob && mob.mind && mob.stat == CONSCIOUS)
if(mob.mind.gang_datum == src)
mob << "<span class='[warning ? "warning" : "notice"]'>\icon[tool] [message]</span>"
return
//////////////////////////////////////////// INCOME
/datum/gang/proc/income()
if(!bosses.len)
return
var/added_names = ""
var/lost_names = ""
//Re-add territories that were reclaimed, so if they got tagged over, they can still earn income if they tag it back before the next status report
var/list/reclaimed_territories = territory_new & territory_lost
territory |= reclaimed_territories
territory_new -= reclaimed_territories
territory_lost -= reclaimed_territories
//Process lost territories
for(var/area in territory_lost)
if(lost_names != "")
lost_names += ", "
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)
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)
if(added_names != "")
added_names += ", "
added_names += "[territory_new[area]]"
territory += area
//Report territory changes
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/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)