Files
fulpstation/code/game/gamemodes/gang/recaller.dm
Ikarrus 1e44560a89 Gang Hotfix
- Fixes takeover bonus reductions using a min() instead of a max() causing extremely short takeover times
- Also makes promotions and dominators cheaper
2015-06-14 13:31:04 -06:00

359 lines
12 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 just by looking."
icon_state = "gangtool"
item_state = "walkietalkie"
throwforce = 0
w_class = 1.0
throw_speed = 3
throw_range = 7
flags = CONDUCT
var/gang //Which gang uses this?
var/boss = 1 //If it has the power to promote gang members
var/recalling = 0
var/promotions = 0
var/outfits = 5
/obj/item/device/gangtool/New() //Initialize supply point income if it hasn't already been started
if(!ticker.mode.gang_points)
ticker.mode.gang_points = new /datum/gang_points(ticker.mode)
ticker.mode.gang_points.start()
if(boss)
desc += " Looks important."
/obj/item/device/gangtool/attack_self(mob/user)
if (!can_use(user))
return
var/dat
if(!gang)
dat += "This device is not registered.<br>"
if(user.mind in (ticker.mode.A_bosses | ticker.mode.B_bosses))
dat += "Give this device to another member of your organization to use.<br>"
else
dat += "<a href='?src=\ref[src];register=1'>Register Device</a><br>"
else
var/datum/game_mode/gang/gangmode
if(istype(ticker.mode, /datum/game_mode/gang))
gangmode = ticker.mode
var/gang_size = ((gang == "A")? (ticker.mode.A_gang.len + ticker.mode.A_bosses.len) : (ticker.mode.B_gang.len + ticker.mode.B_bosses.len))
var/gang_territory = ((gang == "A")? ticker.mode.A_territory.len : ticker.mode.B_territory.len)
var/points = ((gang == "A") ? ticker.mode.gang_points.A : ticker.mode.gang_points.B)
var/timer
if(gangmode)
timer = ((gang == "A") ? gangmode.A_timer : gangmode.B_timer)
if(isnum(timer))
dat += "<center><font color='red'>Takeover In Progress:<br><B>[timer] seconds remain</B></font></center><hr>"
dat += "Registration: <B>[(gang == "A")? gang_name("A") : gang_name("B")] Gang [boss ? "Administrator" : "Lieutenant"]</B><br>"
dat += "Organization Size: <B>[gang_size]</B> | Station Control: <B>[round((gang_territory/start_state.num_territories)*100, 1)]%</B><br>"
if(outfits > 0)
dat += "<a href='?src=\ref[src];choice=outfit'>Create Gang Outfit</a><br>"
else
dat += "<b>Create Gang Outfit</b> (Restocking)<br>"
dat += "<a href='?src=\ref[src];choice=ping'>Send Gang-wide Message</a><br>"
if(gangmode)
dat += "<a href='?src=\ref[src];choice=recall'>Recall Emergency Shuttle</a><br>"
dat += "<br>"
dat += "Influence: <B>[points]</B><br>"
dat += "Time until Influence grows: <B>[(points >= 999) ? ("--:--") : (time2text(ticker.mode.gang_points.next_point_time - world.time, "mm:ss"))]</B><br>"
dat += "<hr>"
dat += "<B>Purchase Weapons:</B><br>"
dat += "(10 Influence) "
if(points >= 10)
dat += "<a href='?src=\ref[src];purchase=switchblade'>Switchblade</a><br>"
else
dat += "Switchblade<br>"
dat += "(20 Influence) "
if(points >= 20)
dat += "<a href='?src=\ref[src];purchase=pistol'>10mm Pistol</a><br>"
else
dat += "10mm Pistol<br>"
dat += "(10 Influence) "
if(points >= 10)
dat += "<a href='?src=\ref[src];purchase=ammo'>10mm Ammo</a><br>"
else
dat += "10mm Ammo<br>"
dat += "(50 Influence) "
if(points >= 50)
dat += "<a href='?src=\ref[src];purchase=SMG'>Thompson SMG</a><br>"
else
dat += "Thompson SMG<br>"
dat += "<br>"
dat += "<B>Purchase Utilities:</B><br>"
dat += "(5 Influence) "
if(points >= 5)
dat += "<a href='?src=\ref[src];purchase=spraycan'><b>Territory Spraycan</b></a><br>"
else
dat += "<b>Territory Spraycan</b><br>"
dat += "(10 Influence) "
if(points >= 10)
dat += "<a href='?src=\ref[src];purchase=vest'>Bulletproof Vest</a><br>"
else
dat += "Bulletproof Vest<br>"
dat += "(30 Influence) "
if(points >= 30)
dat += "<a href='?src=\ref[src];purchase=pen'>Recruitment Pen</a><br>"
else
dat += "Recruitment Pen<br>"
if(boss)
if(promotions >= 3)
dat += "(Out of stock) Promote a Gangster<br>"
else
dat += "([(promotions*10)+10] Influence, [3-promotions] left) "
if(points >= (promotions*10)+10)
dat += "<a href='?src=\ref[src];purchase=gangtool'>Promote a Gangster</a><br>"
else
dat += "Promote a Gangster<br>"
if(gangmode)
dat += "(30 Influence) "
if(points >= 30)
dat += "<a href='?src=\ref[src];purchase=dominator'><b>Station Dominator</b></a><br>"
else
dat += "Station Dominator<br>"
dat += "<i>(Estimated Takeover Time: [round(max(180,900 - ((round((gang_territory/start_state.num_territories)*200, 10) - 60) * 15))/60,1)] minutes)</i><br>"
dat += "<br>"
dat += "<a href='?src=\ref[src];choice=refresh'>Refresh</a><br>"
var/datum/browser/popup = new(user, "gangtool", "Welcome to GangTool v0.4", 340, 600)
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/points = ((gang == "A") ? ticker.mode.gang_points.A : ticker.mode.gang_points.B)
var/item_type
switch(href_list["purchase"])
if("spraycan")
if(points >= 5)
item_type = /obj/item/toy/crayon/spraycan/gang
points = 5
if("switchblade")
if(points >= 10)
item_type = /obj/item/weapon/switchblade
points = 10
if("pistol")
if(points >= 20)
item_type = /obj/item/weapon/gun/projectile/automatic/pistol
points = 20
if("ammo")
if(points >= 10)
item_type = /obj/item/ammo_box/magazine/m10mm
points = 10
if("SMG")
if(points >= 50)
item_type = /obj/item/weapon/gun/projectile/automatic/tommygun
points = 50
if("vest")
if(points >= 10)
item_type = /obj/item/clothing/suit/armor/bulletproof
points = 10
if("pen")
if(points >= 30)
item_type = /obj/item/weapon/pen/gang
points = 30
if("gangtool")
if((promotions < 3) && (points >= (promotions*10)+10))
item_type = /obj/item/device/gangtool/lt
points = (promotions*10)+10
promotions++
if("dominator")
if(istype(ticker.mode, /datum/game_mode/gang))
var/datum/game_mode/gang/mode = ticker.mode
if(isnum((gang == "A") ? mode.A_timer : mode.B_timer))
return
var/usrarea = get_area(usr.loc)
var/usrturf = get_turf(usr.loc)
if(istype(usrarea,/area/space) || istype(usrturf,/turf/space) || usr.z != 1)
usr << "<span class='warning'>You can only use this on the station!</span>"
return
for(var/obj/obj in usrturf)
if(obj.density)
usr << "<span class='warning'>There's not enough room here!</span>"
return
if(points >= 30)
item_type = /obj/machinery/dominator
points = 30
if(item_type)
if(gang == "A")
ticker.mode.gang_points.A -= points
else if(gang == "B")
ticker.mode.gang_points.B -= points
if(ispath(item_type))
var/obj/purchased = new item_type(get_turf(usr))
var/mob/living/carbon/human/H = usr
H.put_in_any_hand_if_possible(purchased)
ticker.mode.message_gangtools(((gang=="A")? ticker.mode.A_tools : ticker.mode.B_tools), "A [href_list["purchase"]] was purchased by [usr] for [points] Influence.")
log_game("A [href_list["purchase"]] was purchased by [key_name(usr)] for [points] Influence.")
else if(href_list["choice"])
switch(href_list["choice"])
if("outfit")
if(outfits > 0)
ticker.mode.gang_outfit(usr,src,gang)
outfits -= 1
if("recall")
recall(usr)
if("ping")
ping_gang(usr)
attack_self(usr)
/obj/item/device/gangtool/proc/ping_gang(var/mob/user)
if(!user)
return
var/message = stripped_input(user,"Discreetly send a gang-wide message.","Send Message") as null|text
if(!message || (message == "") || !can_use(user))
return
if(user.z > 2)
user << "<span class='info'>\icon[src]Error: Station out of range.</span>"
return
var/list/members = list()
if(gang == "A")
members += ticker.mode.A_bosses | ticker.mode.A_gang
else if(gang == "B")
members += ticker.mode.B_bosses | ticker.mode.B_gang
if(members.len)
var/ping = "<span class='danger'><B><i>[gang_name(gang)] [boss ? "Gang Boss" : "Gang Lieutenant"]</i>: [message]</B></span>"
for(var/datum/mind/ganger in members)
if(ganger.current.z <= 2)
ganger.current << ping
for(var/mob/M in dead_mob_list)
M << ping
log_game("[key_name(user)] Messaged [gang_name(gang)] Gang ([gang]): [message].")
/obj/item/device/gangtool/proc/register_device(var/mob/user)
if(jobban_isbanned(user, "gangster") || jobban_isbanned(user, "Syndicate"))
user << "<span class='warning'>\icon[src] ACCESS DENIED: Blacklisted user.</span>"
return 0
var/promoted
if(user.mind in (ticker.mode.A_gang | ticker.mode.A_bosses))
ticker.mode.A_tools += src
gang = "A"
icon_state = "gangtool-a"
if(!(user.mind in ticker.mode.A_bosses))
ticker.mode.remove_gangster(user.mind, 0, 2)
ticker.mode.A_bosses += user.mind
user.mind.special_role = "[gang_name("A")] Gang (A) Lieutenant"
ticker.mode.update_gang_icons_added(user.mind, "A")
log_game("[key_name(user)] has been promoted to Lieutenant in the [gang_name("A")] Gang (A)")
promoted = 1
else if(user.mind in (ticker.mode.B_gang | ticker.mode.B_bosses))
ticker.mode.B_tools += src
gang = "B"
icon_state = "gangtool-b"
if(!(user.mind in ticker.mode.B_bosses))
ticker.mode.remove_gangster(user.mind, 0, 2)
ticker.mode.B_bosses += user.mind
user.mind.special_role = "[gang_name("B")] Gang (B) Lieutenant"
ticker.mode.update_gang_icons_added(user.mind, "B")
log_game("[key_name(user)] has been promoted to Lieutenant in the [gang_name("B")] Gang (B)")
promoted = 1
if(promoted)
ticker.mode.message_gangtools(((gang=="A")? ticker.mode.A_tools : ticker.mode.B_tools), "[user] has been promoted to Lieutenant.")
user << "<FONT size=3 color=red><B>You have been promoted to Lieutenant!</B></FONT>"
ticker.mode.forge_gang_objectives(user.mind)
ticker.mode.greet_gang(user.mind,0)
user << "The <b>Gangtool</b> you registered will allow you to purchase items, send messages to your gangsters and to recall the emergency shuttle from anywhere on the station."
user << "You may also now use <b>recruitment pens</b> to grow your gang membership. Use them on unsuspecting crew members to recruit them."
if(!gang)
usr << "<span class='warning'>ACCESS DENIED: Unauthorized user.</span>"
/obj/item/device/gangtool/proc/recall(mob/user)
if(recalling || !can_use(user))
return
if(!istype(ticker.mode, /datum/game_mode/gang))
return
recalling = 1
loc << "<span class='info'>\icon[src]Generating shuttle recall order with codes retrieved from last call signal...</span>"
sleep(rand(10,30))
if(SSshuttle.emergency.mode != SHUTTLE_CALL) //Shuttle can only be recalled when it's moving to the station
user << "<span class='info'>\icon[src]Emergency shuttle cannot be recalled at this time.</span>"
recalling = 0
return
loc << "<span class='info'>\icon[src]Shuttle recall order generated. Accessing station long-range communication arrays...</span>"
sleep(rand(10,30))
var/turf/userturf = get_turf(user)
if(userturf.z != 1) //Shuttle can only be recalled while on station
user << "<span class='info'>\icon[src]Error: Device out of range of station communication arrays.</span>"
recalling = 0
return
var/datum/station_state/end_state = new /datum/station_state()
end_state.count()
if((100 * start_state.score(end_state)) < 70) //Shuttle cannot be recalled if the station is too damaged
user << "<span class='info'>\icon[src]Error: Station communication systems compromised. Unable to establish connection.</span>"
recalling = 0
return
loc << "<span class='info'>\icon[src]Comm arrays accessed. Broadcasting recall signal...</span>"
sleep(rand(10,30))
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)
if(!SSshuttle.cancelEvac(user))
loc << "<span class='info'>\icon[src]No response recieved. Emergency shuttle cannot be recalled at this time.</span>"
/obj/item/device/gangtool/proc/can_use(mob/living/carbon/human/user)
if(!istype(user))
return
if(user.restrained() || user.lying || user.stat || user.stunned || user.weakened)
return
if(!(src in user.contents))
return
var/success
if(user.mind)
if(gang)
if((gang == "A") && (user.mind in ticker.mode.A_bosses))
success = 1
else if((gang == "B") && (user.mind in ticker.mode.B_bosses))
success = 1
else
success = 1
if(success)
return 1
user << "<span class='warning'>\icon[src] ACCESS DENIED: Unauthorized user.</span>"
return 0
/obj/item/device/gangtool/lt
boss = 0