Files
GS13NG/code/game/gamemodes/gangs/gangtool.dm
T
silicons 803bff4e5f funny
2020-11-12 23:34:42 -07:00

260 lines
9.7 KiB
Plaintext

//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 = 'icons/obj/device.dmi'
icon_state = "gangtool"
item_state = "radio"
lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi'
righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi'
throwforce = 0
w_class = WEIGHT_CLASS_TINY
throw_speed = 3
throw_range = 7
flags_1 = CONDUCT_1
var/datum/team/gang/gang //Which gang uses this?
var/recalling = 0
var/outfits = 2
var/free_pen = 0
var/promotable = FALSE
var/static/list/buyable_items = list()
var/list/tags = list()
/obj/item/device/gangtool/Initialize()
. = ..()
update_icon()
for(var/i in subtypesof(/datum/gang_item))
var/datum/gang_item/G = i
var/id = initial(G.id)
var/cat = initial(G.category)
if(id)
if(!islist(buyable_items[cat]))
buyable_items[cat] = list()
buyable_items[cat][id] = new G
/obj/item/device/gangtool/Destroy()
if(gang)
gang.gangtools -= src
return ..()
/obj/item/device/gangtool/attack_self(mob/user)
..()
if (!can_use(user))
return
var/datum/antagonist/gang/boss/L = user.mind.has_antag_datum(/datum/antagonist/gang/boss)
var/dat
if(!gang)
dat += "This device is not registered.<br><br>"
if(L)
if(promotable && L.gang.leaders.len < L.gang.max_leaders)
dat += "Give this device to another member of your organization to use to promote them to Lieutenant.<br><br>"
dat += "If this is meant as a spare device for yourself:<br>"
dat += "<a href='?src=[REF(src)];register=1'>Register Device as Spare</a><br>"
else if(promotable)
var/datum/antagonist/gang/sweet = user.mind.has_antag_datum(/datum/antagonist/gang)
if(sweet.gang.leaders.len < sweet.gang.max_leaders)
dat += "You have been selected for a promotion!<br>"
dat += "<a href='?src=[REF(src)];register=1'>Accept Promotion</a><br>"
else
dat += "No promotions available: All positions filled.<br>"
else
dat += "This device is not authorized to promote.<br>"
else
if(gang.domination_time != NOT_DOMINATING)
dat += "<center><font color='red'>Takeover In Progress:<br><B>[DisplayTimeText(gang.domination_time_remaining() * 10)] remain</B></font></center>"
dat += "Registration: <B>[gang.name] Gang Boss</B><br>"
dat += "Organization Size: <B>[gang.members.len]</B> | Station Control: <B>[gang.territories.len] territories under control.</B> | Influence: <B>[gang.influence]</B><br>"
dat += "Time until Influence grows: <B>[time2text(gang.next_point_time - world.time, "mm:ss")]</B><br>"
dat += "<a href='?src=[REF(src)];commute=1'>Send message to Gang</a><br>"
dat += "<a href='?src=[REF(src)];recall=1'>Recall shuttle</a><br>"
dat += "<hr>"
for(var/cat in buyable_items)
dat += "<b>[cat]</b><br>"
for(var/id in buyable_items[cat])
var/datum/gang_item/G = buyable_items[cat][id]
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=1;id=[id];cat=[cat]'>[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 v4.0", 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"])
if(islist(buyable_items[href_list["cat"]]))
var/list/L = buyable_items[href_list["cat"]]
var/datum/gang_item/G = L[href_list["id"]]
if(G && G.can_buy(usr, gang, src))
G.purchase(usr, gang, src, FALSE)
if(href_list["commute"])
ping_gang(usr)
if(href_list["recall"])
recall(usr)
attack_self(usr)
/obj/item/device/gangtool/update_icon()
overlays.Cut()
var/image/I = new(icon, "[icon_state]-overlay")
if(gang)
I.color = gang.color
overlays.Add(I)
/obj/item/device/gangtool/proc/ping_gang(mob/user)
if(!can_use(user))
return
var/message = stripped_input(user,"Discreetly send a gang-wide message.","Send Message")
if(!message || !can_use(user))
return
if(!is_station_level(user.z))
to_chat(user, "<span class='info'>[icon2html(src, user)]Error: Station out of range.</span>")
return
if(gang.members.len)
var/datum/antagonist/gang/G = user.mind.has_antag_datum(/datum/antagonist/gang)
if(!G)
return
var/ping = "<span class='danger'><B><i>[gang.name] [G.message_name] [user.real_name]</i>: [message]</B></span>"
for(var/datum/mind/ganger in gang.members)
if(ganger.current && is_station_level(ganger.current.z) && (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]")
user.log_talk(message,LOG_SAY, tag="[gang.name] gangster")
/obj/item/device/gangtool/proc/register_device(mob/user)
if(gang) //It's already been registered!
return
var/datum/antagonist/gang/G = user.mind.has_antag_datum(/datum/antagonist/gang)
if(G)
gang = G.gang
gang.gangtools += src
update_icon()
if(!(user.mind in gang.leaders) && promotable)
G.promote()
free_pen = TRUE
gang.message_gangtools("[user] has been promoted to Lieutenant.")
to_chat(user, "The <b>Gangtool</b> 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 <b>recruitment pens</b> 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(user, "<span class='warning'>ACCESS DENIED: Unauthorized user.</span>")
/obj/item/device/gangtool/proc/recall(mob/user)
if(!recallchecks(user))
return
if(recalling)
to_chat(user, "<span class='warning'>Error: Recall already in progress.</span>")
return
gang.message_gangtools("[user] is attempting to recall the emergency shuttle.")
recalling = TRUE
to_chat(user, "<span class='info'>[icon2html(src, loc)]Generating shuttle recall order with codes retrieved from last call signal...</span>")
addtimer(CALLBACK(src, .proc/recall2, user), rand(100,300))
/obj/item/device/gangtool/proc/recall2(mob/user)
if(!recallchecks(user))
return
to_chat(user, "<span class='info'>[icon2html(src, loc)]Shuttle recall order generated. Accessing station long-range communication arrays...</span>")
addtimer(CALLBACK(src, .proc/recall3, user), rand(100,300))
/obj/item/device/gangtool/proc/recall3(mob/user)
if(!recallchecks(user))
return
var/list/living_crew = list()//shamelessly copied from mulligan code, there should be a helper for this
for(var/mob/Player in GLOB.mob_list)
if(Player.mind && Player.stat != DEAD && !isnewplayer(Player) && !isbrain(Player) && Player.client)
living_crew += Player
var/malc = CONFIG_GET(number/midround_antag_life_check)
if(living_crew.len / GLOB.joined_player_list.len <= malc) //Shuttle cannot be recalled if too many people died
to_chat(user, "<span class='warning'>[icon2html(src, user)]Error: Station communication systems compromised. Unable to establish connection.</span>")
recalling = FALSE
return
to_chat(user, "<span class='info'>[icon2html(src, loc)]Comm arrays accessed. Broadcasting recall signal...</span>")
addtimer(CALLBACK(src, .proc/recallfinal, user), rand(100,300))
/obj/item/device/gangtool/proc/recallfinal(mob/user)
if(!recallchecks(user))
return
recalling = FALSE
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)
if(SSshuttle.cancelEvac(user))
gang.recalls--
return TRUE
to_chat(user, "<span class='info'>[icon2html(src, loc)]No response recieved. Emergency shuttle cannot be recalled at this time.</span>")
return
/obj/item/device/gangtool/proc/recallchecks(mob/user)
if(!can_use(user))
return
if(SSshuttle.emergencyNoRecall)
return
if(!gang.recalls)
to_chat(user, "<span class='warning'>Error: Unable to access communication arrays. Firewall has logged our signature and is blocking all further attempts.</span>")
return
if(SSshuttle.emergency.mode != SHUTTLE_CALL) //Shuttle can only be recalled when it's moving to the station
to_chat(user, "<span class='warning'>[icon2html(src, user)]Emergency shuttle cannot be recalled at this time.</span>")
recalling = FALSE
return
if(!gang.dom_attempts)
to_chat(user, "<span class='warning'>[icon2html(src, user)]Error: Unable to access communication arrays. Firewall has logged our signature and is blocking all further attempts.</span>")
recalling = FALSE
return
if(!is_station_level(user.z)) //Shuttle can only be recalled while on station
to_chat(user, "<span class='warning'>[icon2html(src, user)]Error: Device out of range of station communication arrays.</span>")
recalling = FALSE
return
return TRUE
/obj/item/device/gangtool/proc/can_use(mob/living/carbon/human/user)
if(!istype(user))
return
if(user.incapacitated())
return
if(!(src in user.contents))
return
if(!user.mind)
return
var/datum/antagonist/gang/G = user.mind.has_antag_datum(/datum/antagonist/gang)
if(!G)
to_chat(user, "<span class='notice'>Huh, what's this?</span>")
return
if(!isnull(gang) && G.gang != gang)
to_chat(user, "<span class='danger'>You cannot use gang tools owned by enemy gangs!</span>")
return
return TRUE
/obj/item/device/gangtool/spare
outfits = TRUE
/obj/item/device/gangtool/spare/lt
promotable = TRUE