Gang Mode Update 4

**Major Changes**
- Increased win condition to require 66%
- Added a switchblade. A relatively cheap and decently robust melee weapon for gangsters.
- Capped how much influence you can get every income at 50
- Limited gang spraycan use to 15
- Pistol cost increased to 30 Influence
- Promotion cost now scales to how many bosses you already have. The more bosses, the more expensive it will be. It starts off cheap at 20 influence now.

**Minor Changes**
- Tagging a territory now tells you what territory you actually tagged!
- Added an option to silence the verbose territorial updates you get from gangtools
- Capped how much influence you can get every income at 50
- Updated Centcom report on gangs
- Spraycans always show their inhands now, instead of only when uncapped
- Antag panel now shows how much influence each gang has
- Cleaned up gang code in the traitor panel
- Fixed non-gangers getting gang messages when trying to spray on an invalid territory
This commit is contained in:
Ikarrus
2015-04-21 23:23:15 -06:00
parent f747ff7246
commit c771d30986
12 changed files with 120 additions and 67 deletions
+3 -11
View File
@@ -295,10 +295,6 @@
else
text += "."
if (objectives.len==0)
text += "<br>Objectives are empty! <a href='?src=\ref[src];gang=autoobjective'>Set to kill all rival gang leaders</a>."
else if (src in ticker.mode.B_bosses)
text += "loyal|<a href='?src=\ref[src];gang=clear'>none</a>|(A) <a href='?src=\ref[src];gang=agang'>gangster</a> <a href='?src=\ref[src];gang=aboss'>boss</a>|<B>(B)</B> <a href='?src=\ref[src];gang=bgang'>gangster</a> <b>BOSS</b>"
text += "<br>Equipment: <a href='?src=\ref[src];gang=equip'>give</a>"
@@ -306,13 +302,10 @@
var/list/L = current.get_contents()
var/obj/item/device/gangtool/gangtool = locate() in L
if (gangtool)
text += "<br><a href='?src=\ref[src];gang=takeequip'>take</a>."
text += "|<a href='?src=\ref[src];gang=takeequip'>take</a>."
else
text += "."
if (objectives.len==0)
text += "<br>Objectives are empty! <a href='?src=\ref[src];gang=autoobjective'>Set to kill all rival gang leaders</a>."
else if (src in ticker.mode.A_gang)
text += "loyal|<a href='?src=\ref[src];gang=clear'>none</a>|<B>(A) GANGSTER</B> <a href='?src=\ref[src];gang=aboss'>boss</a>|(B) <a href='?src=\ref[src];gang=bgang'>gangster</a> <a href='?src=\ref[src];gang=bboss'>boss</a>"
else if (src in ticker.mode.B_gang)
@@ -835,6 +828,8 @@
current << "<FONT size=3 color=red><B>You are a [gang_name("A")] Gang Boss!</B></FONT>"
message_admins("[key_name_admin(usr)] has added [current] to the [gang_name("A")] Gang (A) leadership.")
log_admin("[key_name(usr)] has added [current] to the [gang_name("A")] Gang (A) leadership.")
ticker.mode.forge_gang_objectives(src)
ticker.mode.greet_gang(src,0)
if("bgang")
if(src in ticker.mode.B_gang)
@@ -854,11 +849,8 @@
current << "<FONT size=3 color=red><B>You are a [gang_name("B")] Gang Boss!</B></FONT>"
message_admins("[key_name_admin(usr)] has added [current] to the [gang_name("B")] Gang (B) leadership.")
log_admin("[key_name(usr)] has added [current] to the [gang_name("B")] Gang (B) leadership.")
if("autoobjective")
ticker.mode.forge_gang_objectives(src)
ticker.mode.greet_gang(src,0)
usr << "<span class='info>The objectives for gang war have been generated and shown to [key]</span>"
if("equip")
switch(ticker.mode.equip_gang(current))
+18 -17
View File
@@ -29,7 +29,7 @@
///////////////////////////
/datum/game_mode/gang/announce()
world << "<B>The current game mode is - Gang War!</B>"
world << "<B>A violent turf war has erupted on the station!<BR>Gangsters - Take over the station by claiming more than half of the station! <BR>Crew - The gangs will try to keep you on the station. Successfully evacuate the station to win!</B>"
world << "<B>A violent turf war has erupted on the station!<BR>Gangsters - Take over the station by claiming more than 66% of the station! <BR>Crew - The gangs will try to keep you on the station. Successfully evacuate the station to win!</B>"
///////////////////////////////////////////////////////////////////////////////
@@ -99,7 +99,7 @@
/datum/game_mode/proc/forge_gang_objectives(var/datum/mind/boss_mind)
var/datum/objective/rival_obj = new
rival_obj.owner = boss_mind
rival_obj.explanation_text = "Claim more than half the station before the [(boss_mind in A_bosses) ? gang_name("B") : gang_name("A")] Gang does."
rival_obj.explanation_text = "Claim more than 66% the station before the [(boss_mind in A_bosses) ? gang_name("B") : gang_name("A")] Gang does."
boss_mind.objectives += rival_obj
@@ -167,9 +167,9 @@
//Checks if the either gang have won or not//
/////////////////////////////////////////////
/datum/game_mode/gang/check_win()
if(A_territory.len > (start_state.num_territories / 2))
if(A_territory.len > (start_state.num_territories / 3))
finished = "A" //Gang A wins
else if(B_territory.len > (start_state.num_territories / 2))
else if(B_territory.len > (start_state.num_territories / 3))
finished = "B" //Gang B wins
///////////////////////////////
@@ -305,7 +305,7 @@
if(A_bosses.len || A_gang.len)
if(winner)
world << "<br><b>The [gang_name("A")] Gang was [winner=="A" ? "<font color=green>victorious</font>" : "<font color=red>defeated</font>"] with [round((ticker.mode.A_territory.len/start_state.num_territories)*100, 0.1)]% control of the station!</b>"
world << "<br><b>The [gang_name("A")] Gang was [winner=="A" ? "<font color=green>victorious</font>" : "<font color=red>defeated</font>"] with [round((ticker.mode.A_territory.len/start_state.num_territories)*100, 1)]% control of the station!</b>"
world << "<br>The [gang_name("A")] Gang Bosses were:"
gang_membership_report(A_bosses)
world << "<br>The [gang_name("A")] Gangsters were:"
@@ -314,7 +314,7 @@
if(B_bosses.len || B_gang.len)
if(winner)
world << "<br><b>The [gang_name("B")] Gang was [winner=="B" ? "<font color=green>victorious</font>" : "<font color=red>defeated</font>"] with [round((ticker.mode.B_territory.len/start_state.num_territories)*100, 0.1)]% control of the station!</b></b>"
world << "<br><b>The [gang_name("B")] Gang was [winner=="B" ? "<font color=green>victorious</font>" : "<font color=red>defeated</font>"] with [round((ticker.mode.B_territory.len/start_state.num_territories)*100, 1)]% control of the station!</b></b>"
world << "<br>The [gang_name("B")] Gang Bosses were:"
gang_membership_report(B_bosses)
world << "<br>The [gang_name("B")] Gangsters were:"
@@ -356,19 +356,19 @@
income()
/datum/gang_points/proc/income()
var/A_new = min(100,(A + 10 + ticker.mode.A_territory.len))
var/A_new = min(100,(A + 10 + min(ticker.mode.A_territory.len,40)))
var/A_message = ""
if(A_new != A)
A_message += "Your gang has gained [A_new - A] Influence from their presence on station."
A_message += "Your gang has gained [A_new - A] Influence from their control of [round((ticker.mode.A_territory.len/start_state.num_territories)*100, 1)]% of the station."
if(A_new == 100)
A_message += "Maximum influence reached."
A = A_new
ticker.mode.message_gangtools(ticker.mode.A_tools,A_message)
var/B_new = min(100,(B + 10 + ticker.mode.B_territory.len))
var/B_new = min(100,(B + 10 + min(ticker.mode.B_territory.len,40)))
var/B_message = ""
if(B_new != B)
B_message += "Your gang has collected [B_new - B] Influence from their presence on station. "
B_message += "Your gang has collected [B_new - B] Influence from their control of [round((ticker.mode.B_territory.len/start_state.num_territories)*100, 1)]% of the station."
if(B_new == 100)
B_message += "Maximum influence reached."
B = B_new
@@ -381,13 +381,14 @@
//Sends a message to the boss via his gangtool//
////////////////////////////////////////////////
/datum/game_mode/proc/message_gangtools(var/list/gangtools,var/message,var/beeps=1)
/datum/game_mode/proc/message_gangtools(var/list/gangtools,var/message,var/priority=2) //0 Territories Gained | 1 Territories lost | 2 Beep!
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)
if(((tool.gang == "A") && ((mob.mind in A_gang) || (mob.mind in A_bosses))) || ((tool.gang == "B") && ((mob.mind in B_gang) || (mob.mind in B_bosses))))
mob << "<span class='notice'>\icon[tool] [message]</span>"
if(beeps)
playsound(mob.loc, 'sound/machines/twobeep.ogg', 50, 1)
if(tool.ignore_messages <= priority)
var/mob/living/mob = get(tool.loc,/mob/living)
if(mob && mob.mind)
if(((tool.gang == "A") && ((mob.mind in A_gang) || (mob.mind in A_bosses))) || ((tool.gang == "B") && ((mob.mind in B_gang) || (mob.mind in B_bosses))))
mob << "<span class='notice'>\icon[tool] [message]</span>"
if(priority>=2)
playsound(mob.loc, 'sound/machines/twobeep.ogg', 50, 1)
+3 -3
View File
@@ -228,9 +228,9 @@
*/
/datum/intercept_text/proc/build_gang(datum/mind/correct_person)
src.text += "<BR><BR>Syndicate forces may be supplying opposing criminal organizations within your sector in an attempt at destabilizing our operations."
src.text += "Ensure law and order is maintained on the station and be on the lookout for violent confrontations between station factions."
src.text += "Central Command retains an interest in any criminal leaders captured by station security. The execution or exile of these persons are ill-advised."
src.text += "<BR><BR>We have recieved reports of a sudden increase of criminal activity in close proximity to our operations within your sector."
src.text += "Ensure law and order is maintained on the station and be on the lookout for unusually territorial behavior from the crew."
src.text += "In the event of a full-scale takeover attempt, sensitive research items are to be secured and the station evacuated ASAP."
src.text += "<BR><HR>"
/datum/intercept_text/proc/build_wizard(datum/mind/correct_person)
+1 -1
View File
@@ -67,6 +67,6 @@
recipients += ticker.mode.B_tools
ticker.mode.B_territory -= territory.type
if(recipients.len)
ticker.mode.message_gangtools(recipients,"Territory lost: [territory]",0)
ticker.mode.message_gangtools(recipients,"Territory lost: [territory]",1)
..()
+2
View File
@@ -88,6 +88,7 @@
/obj/item/toy/crayon/spraycan
icon_state = "spraycan_cap"
item_state = "spraycan"
desc = "A metallic container containing tasty paint."
var/capped = 1
instant = 1
@@ -156,4 +157,5 @@
desc = "A suspicious-looking spraycan modified to use special paint used by gangsters to mark territory."
icon_state = "spraycan_gang_cap"
gang = 1
uses = 15
instant = -1
+47 -24
View File
@@ -1,5 +1,4 @@
//gangtool device
//Allows gang leaders to recall the shuttle
/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."
@@ -13,6 +12,7 @@
var/gang //Which gang uses this?
var/boss = 1 //If it has the power to promote gang members
var/recalling = 0
var/ignore_messages = 0
/obj/item/device/gangtool/New() //Initialize supply point income if it hasn't already been started
if(!ticker.mode.gang_points)
@@ -28,23 +28,36 @@
var/dat
if(!gang)
dat += "This device is not registered.<br>"
dat += "<a href='?src=\ref[src];choice=register'>Register Device</a><br>"
if((user.mind in ticker.mode.B_bosses) || (user.mind in ticker.mode.A_bosses))
dat += "Give this device to another member of your organization to use.<br>"
else
dat += "<a href='?src=\ref[src];choice=register'>Register Device</a><br>"
else
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)
dat += "<i>Registered as [boss ? "Administrator." : "User."]</i><br>"
dat += "Organization: <B>[(gang == "A")?("[gang_name("A")] Gang"):("[gang_name("B")] Gang")]</B><br>"
dat += "Registration: <B>[(gang == "A")? gang_name("A") : gang_name("B")] Gang [boss ? "Administrator" : "Member"]</B><br>"
dat += "Organization Size: <B>[gang_size]</B><br>"
dat += "Areas Controlled: <B>[gang_territory] ([round((gang_territory/start_state.num_territories)*100, 0.1)]% of station)</B><br>"
dat += "Territories Controlled: <B>[round((gang_territory/start_state.num_territories)*100, 1)]% of [station_name()]</B><br>"
var/alert = "Recieve all alerts"
if(ignore_messages == 1)
alert = "Ignore territories gained"
else if(ignore_messages == 2)
alert = "Ignore territories gained and lost"
dat += "Message Setting: <a href='?src=\ref[src];choice=ignore'>[alert]</a><br>"
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 >= 100) ? ("--:--") : (time2text(ticker.mode.gang_points.next_point_time - world.time, "mm:ss"))]</B><br>"
dat += "<B>Purchase Items:</B><br>"
if(points >= 25)
if(points >= 10)
dat += "(10 Influence) <a href='?src=\ref[src];purchase=spraycan'>Territory Spraycan</a><br>"
else
dat += "(10 Influence) Territory Spraycan<br>"
if(points >= 30)
dat += "(25 Influence) <a href='?src=\ref[src];purchase=pistol'>10mm Pistol</a><br>"
else
dat += "(25 Influence) 10mm Pistol<br>"
@@ -54,10 +67,10 @@
else
dat += "(10 Influence) 10mm Ammo<br>"
if(points >= 10)
dat += "(10 Influence) <a href='?src=\ref[src];purchase=spraycan'>Territory Spraycan</a><br>"
if(points >= 15)
dat += "(15 Influence) <a href='?src=\ref[src];purchase=switchblade'>Switchblade</a><br>"
else
dat += "(10 Influence) Territory Spraycan<br>"
dat += "(15 Influence) Switchblade<br>"
if(points >= 50)
dat += "(50 Influence) <a href='?src=\ref[src];purchase=pen'>Recruitment Pen</a><br>"
@@ -65,10 +78,11 @@
dat += "(50 Influence) Recruitment Pen<br>"
if(boss)
if(points >= 40)
dat += "(40 Influence) <a href='?src=\ref[src];purchase=gangtool'>Unregistered Gangtool</a><br>"
var/promotion_cost = max(((gang == "A")? ticker.mode.A_bosses.len : ticker.mode.B_bosses.len) * 20,20)
if(points >= promotion_cost)
dat += "([promotion_cost] Influence) <a href='?src=\ref[src];purchase=gangtool'>Promote a Gangster</a><br>"
else
dat += "(40 Influence) Unregistered Gangtool<br>"
dat += "([promotion_cost] Influence) Promote a Gangster<br>"
dat += "<br>"
dat += "<a href='?src=\ref[src];choice=refresh'>Refresh</a><br>"
@@ -86,27 +100,32 @@
if(href_list["purchase"])
var/points = ((gang == "A") ? ticker.mode.gang_points.A : ticker.mode.gang_points.B)
var/item_type
var/promotion_cost = max(((gang == "A")? ticker.mode.A_bosses.len : ticker.mode.B_bosses.len) * 20,20)
switch(href_list["purchase"])
if("pistol")
if(points >= 25)
item_type = /obj/item/weapon/gun/projectile/automatic/pistol
points = 25
if("ammo")
if(points >= 10)
item_type = /obj/item/ammo_box/magazine/m10mm
points = 10
if("spraycan")
if(points >= 10)
item_type = /obj/item/toy/crayon/spraycan/gang
points = 10
if("pistol")
if(points >= 30)
item_type = /obj/item/weapon/gun/projectile/automatic/pistol
points = 30
if("ammo")
if(points >= 10)
item_type = /obj/item/ammo_box/magazine/m10mm
points = 10
if("switchblade")
if(points >= 15)
item_type = /obj/item/weapon/switchblade
points = 15
if("pen")
if(points >= 50)
item_type = /obj/item/weapon/pen/gang
points = 50
if("gangtool")
if(points >= 40)
if(points >= promotion_cost)
item_type = /obj/item/device/gangtool/lt
points = 40
points = promotion_cost
if(item_type)
if(gang == "A")
@@ -120,6 +139,10 @@
else if(href_list["choice"])
switch(href_list["choice"])
if("ignore")
ignore_messages++
if(ignore_messages>2)
ignore_messages = 0
if("recall")
recall(usr)
if("register")
@@ -152,8 +175,8 @@
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>"
user << "<font color='red'>The <b>Gangtool</b> you registered will allow you to use your gang's influence to purchase items and prevent the station from evacuating before your gang can take over. Use it to recall the emergency shuttle from anywhere on the station.</font>"
user << "<font color='red'>You may also now use recruitment pens to grow your gang membership. Use them on unsuspecting crew members to recruit them.</font>"
user << "The <b>Gangtool</b> you registered will allow you to use your gang's influence to purchase items and prevent the station from evacuating before your gang can take over. Use it to recall the emergency shuttle from anywhere on the station."
user << "You may also now use recruitment pens 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>"
+10 -9
View File
@@ -412,17 +412,17 @@
var/area/territory
var/gangID
if(gang)
//Determine gang affiliation
if((user.mind in ticker.mode.A_bosses) || (user.mind in ticker.mode.A_gang))
temp = "[gang_name("A")] gang tag"
gangID = "A"
else if((user.mind in ticker.mode.B_bosses) || (user.mind in ticker.mode.B_gang))
temp = "[gang_name("B")] gang tag"
gangID = "B"
//Check area validity. Reject space, player-created areas, and non-station z-levels.
territory = get_area(target)
if (territory && (territory.z == ZLEVEL_STATION) && territory.valid_territory)
//Determine gang affiliation
if((user.mind in ticker.mode.A_bosses) || (user.mind in ticker.mode.A_gang))
temp = "[gang_name("A")] gang tag"
gangID = "A"
else if((user.mind in ticker.mode.B_bosses) || (user.mind in ticker.mode.B_gang))
temp = "[gang_name("B")] gang tag"
gangID = "B"
if (gangID && territory && (territory.z == ZLEVEL_STATION) && territory.valid_territory)
//Check if this area is already tagged by a gang
if(!(locate(/obj/effect/decal/cleanable/crayon/gang) in target)) //Ignore the check if the tile being sprayed has a gang tag
if(territory_claimed(territory, user))
@@ -457,6 +457,7 @@
for(var/obj/effect/decal/cleanable/crayon/old_marking in target)
qdel(old_marking)
new /obj/effect/decal/cleanable/crayon/gang(target,gangID,temp,graf_rot)
user << "<span class='notice'>You tagged [territory] for your gang!</span>"
else
new /obj/effect/decal/cleanable/crayon(target,colour,drawtype,temp,graf_rot)
@@ -158,4 +158,38 @@ obj/item/weapon/wirerod/attackby(var/obj/item/I, mob/user as mob, params)
/obj/item/weapon/switchblade
name = "switchblade"
icon_state = "switchblade"
desc = "A sharp, concealable, spring-loaded knife."
flags = CONDUCT
force = 20
w_class = 2
throwforce = 15
throw_speed = 3
throw_range = 6
m_amt = 12000
origin_tech = "materials=1"
hitsound = 'sound/weapons/bladeslice.ogg'
attack_verb = list("stubbed", "poked")
var/extended
/obj/item/weapon/switchblade/attack_self(mob/user)
extended = !extended
playsound(src.loc, 'sound/weapons/batonextend.ogg', 50, 1)
if(extended)
force = 20
w_class = 3
throwforce = 15
icon_state = "switchblade_ext"
attack_verb = list("slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
else
force = 1
w_class = 2
throwforce = 5
icon_state = "switchblade"
attack_verb = list("stubbed", "poked")
/obj/item/weapon/switchblade/suicide_act(mob/user)
user.visible_message("<span class='suicide'>[user] is slitting \his own throat with the [src.name]! It looks like \he's trying to commit suicide.</span>")
return (BRUTELOSS)
+2 -2
View File
@@ -386,7 +386,7 @@
dat += "</table>"
if(ticker.mode.A_bosses.len || ticker.mode.A_gang.len)
dat += "<br><table cellspacing=5><tr><td><B>[gang_name("A")] Gang: [round((ticker.mode.A_territory.len/start_state.num_territories)*100, 0.1)]% Station Control</B></td><td></td></tr>"
dat += "<br><table cellspacing=5><tr><td><B>[gang_name("A")] Gang: [(ticker.mode.gang_points ? "[ticker.mode.gang_points.A] Influence, " : "")][round((ticker.mode.A_territory.len/start_state.num_territories)*100, 0.1)]% Control</B></td><td></td></tr>"
for(var/datum/mind/N in ticker.mode.A_bosses)
var/mob/M = N.current
if(!M)
@@ -402,7 +402,7 @@
dat += "</table>"
if(ticker.mode.B_bosses.len || ticker.mode.B_gang.len)
dat += "<br><table cellspacing=5><tr><td><B>[gang_name("B")] Gang: [round((ticker.mode.B_territory.len/start_state.num_territories)*100, 0.1)]% Station Control</B></td><td></td></tr>"
dat += "<br><table cellspacing=5><tr><td><B>[gang_name("B")] Gang: [(ticker.mode.gang_points ? "[ticker.mode.gang_points.B] Influence, " : "")][round((ticker.mode.B_territory.len/start_state.num_territories)*100, 0.1)]% Control</B></td><td></td></tr>"
for(var/datum/mind/N in ticker.mode.B_bosses)
var/mob/M = N.current
if(!M)
Binary file not shown.

Before

Width:  |  Height:  |  Size: 90 KiB

After

Width:  |  Height:  |  Size: 92 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 88 KiB

After

Width:  |  Height:  |  Size: 91 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 KiB

After

Width:  |  Height:  |  Size: 32 KiB