//gangtool device
/obj/item/device/gangtool
name = "suspicious device"
desc = "A strange device of sorts. Hard to really make out what it actually does if you don't know how to operate it."
icon_state = "gangtool-white"
item_state = "walkietalkie"
throwforce = 0
w_class = WEIGHT_CLASS_TINY
throw_speed = 3
throw_range = 7
flags = CONDUCT
origin_tech = "programming=5;bluespace=2;syndicate=5"
var/datum/gang/gang //Which gang uses this?
var/recalling = 0
var/outfits = 2
var/free_pen = 0
var/promotable = 0
var/list/tags = list()
/obj/item/device/gangtool/Initialize() //Initialize supply point income if it hasn't already been started
..()
if(!SSticker.mode.gang_points)
SSticker.mode.gang_points = new /datum/gang_points(SSticker.mode)
/obj/item/device/gangtool/attack_self(mob/user)
if (!can_use(user))
return
var/dat
if(!gang)
dat += "This device is not registered.
"
if(user.mind in SSticker.mode.get_gang_bosses())
if(promotable && user.mind.gang_datum.bosses.len < 3)
dat += "Give this device to another member of your organization to use to promote them to Lieutenant.
"
dat += "If this is meant as a spare device for yourself:
"
dat += "Register Device as Spare
"
else if (promotable)
if(user.mind.gang_datum.bosses.len < 3)
dat += "You have been selected for a promotion!
"
dat += "Accept Promotion
"
else
dat += "No promotions available: All positions filled.
"
else
dat += "This device is not authorized to promote.
"
else
if(gang.is_dominating)
dat += "
Takeover In Progress:
[gang.domination_time_remaining()] seconds remain"
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 += "Your Influence: [gang.get_influence(user.mind)]
"
dat += "Time until Influence grows: [time2text(SSticker.mode.gang_points.next_point_time - world.time, "mm:ss")]
"
dat += "
"
for(var/cat in gang.boss_category_list)
dat += "[cat]
"
for(var/V in gang.boss_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/Topic(href, href_list)
if(!can_use(usr))
return
add_fingerprint(usr)
if(href_list["register"])
register_device(usr)
else if(!gang) //Gangtool must be registered before you can use the functions below
return
if(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)
attack_self(usr)
/obj/item/device/gangtool/proc/ping_gang(mob/user)
if(!user)
return
var/message = stripped_input(user,"Discreetly send a gang-wide message.","Send Message") as null|text
if(!message || !can_use(user))
return
if(user.z > 2)
to_chat(user, "[bicon(src)]Error: Station out of range.")
return
var/list/members = list()
members += gang.gangsters
members += gang.bosses
if(members.len)
var/gang_rank = gang.bosses.Find(user.mind)
switch(gang_rank)
if(1)
gang_rank = "Gang Boss"
if(2)
gang_rank = "1st Lieutenant"
if(3)
gang_rank = "2nd Lieutenant"
if(4)
gang_rank = "3rd Lieutenant"
else
gang_rank = "[gang_rank - 1]th Lieutenant"
var/ping = "[gang.name] [gang_rank]: [message]"
for(var/datum/mind/ganger in members)
if(ganger.current && (ganger.current.z <= 2) && (ganger.current.stat == CONSCIOUS))
to_chat(ganger.current, ping)
for(var/mob/M in GLOB.dead_mob_list)
var/link = FOLLOW_LINK(M, user)
to_chat(M, "[link] [ping]")
log_game("[key_name(user)] Messaged [gang.name] Gang: [message].")
/obj/item/device/gangtool/proc/register_device(mob/user)
if(gang) //It's already been registered!
return
if((promotable && (user.mind in SSticker.mode.get_gangsters())) || (user.mind in SSticker.mode.get_gang_bosses()))
gang = user.mind.gang_datum
gang.gangtools += src
icon_state = "gangtool-[gang.color]"
if(!(user.mind in gang.bosses))
var/cached_influence = gang.gangsters[user.mind]
SSticker.mode.remove_gangster(user.mind, 0, 2)
gang.bosses[user.mind] = cached_influence
user.mind.gang_datum = gang
user.mind.special_role = "[gang.name] Gang Lieutenant"
gang.add_gang_hud(user.mind)
log_game("[key_name(user)] has been promoted to Lieutenant in the [gang.name] Gang")
free_pen = 1
gang.message_gangtools("[user] has been promoted to Lieutenant.")
to_chat(user, "You have been promoted to Lieutenant!")
SSticker.mode.forge_gang_objectives(user.mind)
SSticker.mode.greet_gang(user.mind,0)
to_chat(user, "The Gangtool you registered will allow you to purchase weapons and equipment, and send messages to your gang.")
to_chat(user, "Unlike regular gangsters, you may use recruitment pens to add recruits to your gang. Use them on unsuspecting crew members to recruit them. Don't forget to get your one free pen from the gangtool.")
else
to_chat(usr, "ACCESS DENIED: Unauthorized user.")
/obj/item/device/gangtool/proc/recall(mob/user)
if(!can_use(user))
return 0
if(SSshuttle.emergencyNoRecall)
return 0
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.")
gang.message_gangtools("[usr] is attempting to recall the emergency shuttle.")
recalling = 1
to_chat(loc, "[bicon(src)]Generating shuttle recall order with codes retrieved from last call signal...")
sleep(rand(100,300))
if(SSshuttle.emergency.mode != SHUTTLE_CALL) //Shuttle can only be recalled when it's moving to the station
to_chat(user, "[bicon(src)]Emergency shuttle cannot be recalled at this time.")
recalling = 0
return 0
to_chat(loc, "[bicon(src)]Shuttle recall order generated. Accessing station long-range communication arrays...")
sleep(rand(100,300))
if(!gang.dom_attempts)
to_chat(user, "[bicon(src)]Error: Unable to access communication arrays. Firewall has logged our signature and is blocking all further attempts.")
recalling = 0
return 0
var/turf/userturf = get_turf(user)
if(userturf.z != ZLEVEL_STATION) //Shuttle can only be recalled while on station
to_chat(user, "[\bicon(src)]Error: Device out of range of station communication arrays.")
recalling = 0
return 0
var/datum/station_state/end_state = new /datum/station_state()
end_state.count()
if((100 * GLOB.start_state.score(end_state)) < 80) //Shuttle cannot be recalled if the station is too damaged
to_chat(user, "[bicon(src)]Error: Station communication systems compromised. Unable to establish connection.")
recalling = 0
return 0
to_chat(loc, "[bicon(src)]Comm arrays accessed. Broadcasting recall signal...")
sleep(rand(100,300))
recalling = 0
log_game("[key_name(user)] has tried to recall the shuttle with a gangtool.")
message_admins("[key_name_admin(user)] has tried to recall the shuttle with a gangtool.", 1)
userturf = get_turf(user)
if(userturf.z == ZLEVEL_STATION) //Check one more time that they are on station.
if(SSshuttle.cancelEvac(user))
gang.recalls -= 1
return 1
to_chat(loc, "[bicon(src)]No response recieved. Emergency shuttle cannot be recalled at this time.")
return 0
/obj/item/device/gangtool/proc/can_use(mob/living/carbon/human/user)
if(!istype(user))
return 0
if(user.incapacitated())
return 0
if(!(src in user.contents))
return 0
if(!user.mind)
return 0
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
///////////// Internal tool used by gang regulars ///////////
/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: [gang.get_influence(user.mind)]
"
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)