New Vox gamemode -- Trade

This commit is contained in:
ZomgPonies
2013-09-28 20:42:32 -04:00
parent 78f14f11cc
commit e2826f3675
11 changed files with 580 additions and 399 deletions
+3 -1
View File
@@ -268,7 +268,6 @@
#include "code\game\gamemodes\events\holidays\Holidays.dm"
#include "code\game\gamemodes\events\holidays\Other.dm"
#include "code\game\gamemodes\extended\extended.dm"
#include "code\game\gamemodes\heist\heist.dm"
#include "code\game\gamemodes\malfunction\Malf_Modules.dm"
#include "code\game\gamemodes\malfunction\malfunction.dm"
#include "code\game\gamemodes\meteor\meteor.dm"
@@ -280,6 +279,9 @@
#include "code\game\gamemodes\revolution\revolution.dm"
#include "code\game\gamemodes\revolution\rp_revolution.dm"
#include "code\game\gamemodes\traitor\traitor.dm"
#include "code\game\gamemodes\vox\vox.dm"
#include "code\game\gamemodes\vox\heist\heist.dm"
#include "code\game\gamemodes\vox\trade\trade.dm"
#include "code\game\gamemodes\wizard\rightandwrong.dm"
#include "code\game\gamemodes\wizard\soulstone.dm"
#include "code\game\gamemodes\wizard\spellbook.dm"
+1 -1
View File
@@ -300,7 +300,7 @@
if(BE_REV) roletext="revolutionary"
if(BE_CULTIST) roletext="cultist"
if(BE_NINJA) roletext="ninja"
if(BE_RAIDER) roletext="raider"
if(BE_VOX) roletext="vox"
// Assemble a list of active players without jobbans.
for(var/mob/new_player/player in player_list)
-170
View File
@@ -1,170 +0,0 @@
//Vox heist objectives.
datum/objective/heist
proc/choose_target()
return
datum/objective/heist/kidnap
choose_target()
var/list/roles = list("Chief Engineer","Research Director","Roboticist","Chemist","Station Engineer")
var/list/possible_targets = list()
var/list/priority_targets = list()
for(var/datum/mind/possible_target in ticker.minds)
if(possible_target != owner && ishuman(possible_target.current) && (possible_target.current.stat != 2) && (possible_target.assigned_role != "MODE"))
possible_targets += possible_target
for(var/role in roles)
if(possible_target.assigned_role == role)
priority_targets += possible_target
continue
if(priority_targets.len > 0)
target = pick(priority_targets)
else if(possible_targets.len > 0)
target = pick(possible_targets)
if(target && target.current)
explanation_text = "The Shoal has a need for [target.current.real_name], the [target.assigned_role]. Take them alive."
else
explanation_text = "Free Objective"
return target
check_completion()
if(target && target.current)
if (target.current.stat == 2)
return 0 // They're dead. Fail.
//if (!target.current.restrained())
// return 0 // They're loose. Close but no cigar.
var/area/shuttle/vox/station/A = locate()
for(var/mob/living/carbon/human/M in A)
if(target.current == M)
return 1 //They're restrained on the shuttle. Success.
else
return 0
datum/objective/heist/loot
choose_target()
var/loot = "an object"
switch(rand(1,8))
if(1)
target = /obj/structure/particle_accelerator
target_amount = 6
loot = "a complete particle accelerator"
if(2)
target = /obj/machinery/the_singularitygen
target_amount = 1
loot = "a gravitational generator"
if(3)
target = /obj/machinery/power/emitter
target_amount = 4
loot = "four emitters"
if(4)
target = /obj/machinery/nuclearbomb
target_amount = 1
loot = "a nuclear bomb"
if(5)
target = /obj/item/weapon/gun
target_amount = 6
loot = "six guns"
if(6)
target = /obj/item/weapon/gun/energy
target_amount = 4
loot = "four energy guns"
if(7)
target = /obj/item/weapon/gun/energy/laser
target_amount = 2
loot = "two laser guns"
if(8)
target = /obj/item/weapon/gun/energy/ionrifle
target_amount = 1
loot = "an ion gun"
explanation_text = "We are lacking in hardware. Steal [loot]."
check_completion()
var/total_amount = 0
for(var/obj/O in locate(/area/shuttle/vox/station))
if(istype(O,target)) total_amount++
if(total_amount >= target_amount) return 1
var/datum/game_mode/heist/H = ticker.mode
for(var/datum/mind/raider in H.raiders)
if(raider.current)
for(var/obj/O in raider.current.get_contents())
if(istype(O,target)) total_amount++
if(total_amount >= target_amount) return 1
return 0
datum/objective/heist/salvage
choose_target()
switch(rand(1,8))
if(1)
target = "metal"
target_amount = 300
if(2)
target = "glass"
target_amount = 200
if(3)
target = "plasteel"
target_amount = 100
if(4)
target = "plasma"
target_amount = 100
if(5)
target = "silver"
target_amount = 50
if(6)
target = "gold"
target_amount = 20
if(7)
target = "uranium"
target_amount = 20
if(8)
target = "diamond"
target_amount = 20
explanation_text = "Ransack the station and escape with [target_amount] [target]."
check_completion()
var/total_amount = 0
for(var/obj/item/O in locate(/area/shuttle/vox/station))
if(istype(O,/obj/item/stack/sheet))
if(O.name == target)
var/obj/item/stack/sheet/S = O
total_amount += S.amount
var/datum/game_mode/heist/H = ticker.mode
for(var/datum/mind/raider in H.raiders)
if(raider.current)
for(var/obj/item/O in raider.current.get_contents())
if(istype(O,/obj/item/stack/sheet))
if(O.name == target)
var/obj/item/stack/sheet/S = O
total_amount += S.amount
if(total_amount >= target_amount) return 1
return 0
datum/objective/heist/inviolate_crew
explanation_text = "Do not leave any Vox behind, alive or dead."
check_completion()
var/datum/game_mode/heist/H = ticker.mode
if(H.is_raider_crew_safe()) return 1
return 0
datum/objective/heist/inviolate_death
explanation_text = "Follow the Inviolate. Minimise death and loss of resources."
check_completion()
if(vox_kills>5) return 0
return 1
-178
View File
@@ -745,181 +745,3 @@ datum/objective/absorb
/*-------ENDOF CULTIST------*/
*/
//Vox heist objectives.
datum/objective/heist
proc/choose_target()
return
datum/objective/heist/kidnap
choose_target()
var/list/roles = list("Chief Engineer","Research Director","Roboticist","Chemist","Station Engineer")
var/list/possible_targets = list()
var/list/priority_targets = list()
for(var/datum/mind/possible_target in ticker.minds)
if(possible_target != owner && ishuman(possible_target.current) && (possible_target.current.stat != 2) && (possible_target.assigned_role != "MODE"))
possible_targets += possible_target
for(var/role in roles)
if(possible_target.assigned_role == role)
priority_targets += possible_target
continue
if(priority_targets.len > 0)
target = pick(priority_targets)
else if(possible_targets.len > 0)
target = pick(possible_targets)
if(target && target.current)
explanation_text = "The Shoal has a need for [target.current.real_name], the [target.assigned_role]. Take them alive."
else
explanation_text = "Free Objective"
return target
check_completion()
if(target && target.current)
if (target.current.stat == 2)
return 0 // They're dead. Fail.
//if (!target.current.restrained())
// return 0 // They're loose. Close but no cigar.
var/area/shuttle/vox/station/A = locate()
for(var/mob/living/carbon/human/M in A)
if(target.current == M)
return 1 //They're restrained on the shuttle. Success.
else
return 0
datum/objective/heist/loot
choose_target()
var/loot = "an object"
switch(rand(1,8))
if(1)
target = /obj/structure/particle_accelerator
target_amount = 6
loot = "a complete particle accelerator"
if(2)
target = /obj/machinery/the_singularitygen
target_amount = 1
loot = "a gravitational generator"
if(3)
target = /obj/machinery/power/emitter
target_amount = 4
loot = "four emitters"
if(4)
target = /obj/machinery/nuclearbomb
target_amount = 1
loot = "a nuclear bomb"
if(5)
target = /obj/item/weapon/gun
target_amount = 6
loot = "six guns"
if(6)
target = /obj/item/weapon/gun/energy
target_amount = 4
loot = "four energy guns"
if(7)
target = /obj/item/weapon/gun/energy/laser
target_amount = 2
loot = "two laser guns"
if(8)
target = /obj/item/weapon/gun/energy/ionrifle
target_amount = 1
loot = "an ion gun"
explanation_text = "We are lacking in hardware. Steal [loot]."
check_completion()
var/total_amount = 0
for(var/obj/O in locate(/area/shuttle/vox/station))
if(istype(O,target)) total_amount++
for(var/obj/I in O.contents)
if(istype(I,target)) total_amount++
if(total_amount >= target_amount) return 1
var/datum/game_mode/heist/H = ticker.mode
for(var/datum/mind/raider in H.raiders)
if(raider.current)
for(var/obj/O in raider.current.get_contents())
if(istype(O,target)) total_amount++
if(total_amount >= target_amount) return 1
return 0
datum/objective/heist/salvage
choose_target()
switch(rand(1,8))
if(1)
target = "metal"
target_amount = 300
if(2)
target = "glass"
target_amount = 200
if(3)
target = "plasteel"
target_amount = 100
if(4)
target = "plasma"
target_amount = 100
if(5)
target = "silver"
target_amount = 50
if(6)
target = "gold"
target_amount = 20
if(7)
target = "uranium"
target_amount = 20
if(8)
target = "diamond"
target_amount = 20
explanation_text = "Ransack the station and escape with [target_amount] [target]."
check_completion()
var/total_amount = 0
for(var/obj/item/O in locate(/area/shuttle/vox/station))
var/obj/item/stack/sheet/S
if(istype(O,/obj/item/stack/sheet))
if(O.name == target)
S = O
total_amount += S.amount
for(var/obj/I in O.contents)
if(istype(I,/obj/item/stack/sheet))
if(I.name == target)
S = I
total_amount += S.amount
var/datum/game_mode/heist/H = ticker.mode
for(var/datum/mind/raider in H.raiders)
if(raider.current)
for(var/obj/item/O in raider.current.get_contents())
if(istype(O,/obj/item/stack/sheet))
if(O.name == target)
var/obj/item/stack/sheet/S = O
total_amount += S.amount
if(total_amount >= target_amount) return 1
return 0
datum/objective/heist/inviolate_crew
explanation_text = "Do not leave any Vox behind, alive or dead."
check_completion()
var/datum/game_mode/heist/H = ticker.mode
if(H.is_raider_crew_safe()) return 1
return 0
datum/objective/heist/inviolate_death
explanation_text = "Follow the Inviolate. Minimise death and loss of resources."
check_completion()
if(vox_kills>5) return 0
return 1
@@ -2,15 +2,10 @@
VOX HEIST ROUNDTYPE
*/
#define MAX_VOX_KILLS 10 //Number of kills during the round before the Inviolate is broken.
//Would be nice to use vox-specific kills but is currently not feasible.
var/global/vox_kills = 0 //Used to check the Inviolate.
/datum/game_mode/
var/list/datum/mind/raiders = list() //Antags.
/datum/game_mode/heist
/datum/game_mode/vox/heist
name = "heist"
config_tag = "heist"
required_players = 15
@@ -22,21 +17,21 @@ var/global/vox_kills = 0 //Used to check the Inviolate.
var/const/waittime_h = 1800 //upper bound on time before intercept arrives (in tenths of seconds)
var/list/raid_objectives = list() //Raid objectives.
var/list/obj/cortical_stacks = list() //Stacks for 'leave nobody behind' objective.
/datum/game_mode/heist/announce()
/datum/game_mode/vox/heist/announce()
world << "<B>The current game mode is - Heist!</B>"
world << "<B>An unidentified bluespace signature has slipped past the Icarus and is approaching [station_name()]!</B>"
world << "Whoever they are, they're likely up to no good. Protect the crew and station resources against this dastardly threat!"
world << "<B>Raiders:</B> Loot [station_name()] for anything and everything you need."
world << "<B>Personnel:</B> Repel the raiders and their low, low prices and/or crossbows."
/datum/game_mode/heist/can_start()
/datum/game_mode/vox/heist/can_start()
if(!..())
return 0
var/list/candidates = get_players_for_role(BE_RAIDER)
var/list/candidates = get_players_for_role(BE_VOX)
var/raider_num = 0
//Check that we have enough vox.
@@ -59,10 +54,10 @@ var/global/vox_kills = 0 //Used to check the Inviolate.
raider.special_role = "Vox Raider"
return 1
/datum/game_mode/heist/pre_setup()
/datum/game_mode/vox/heist/pre_setup()
return 1
/datum/game_mode/heist/post_setup()
/datum/game_mode/vox/heist/post_setup()
//Build a list of spawn points.
var/list/turf/raider_spawn = list()
@@ -118,25 +113,9 @@ var/global/vox_kills = 0 //Used to check the Inviolate.
spawn (rand(waittime_l, waittime_h))
send_intercept()
/datum/game_mode/heist/proc/is_raider_crew_safe()
if(cortical_stacks.len == 0)
return 0
for(var/obj/stack in cortical_stacks)
if (get_area(stack) != locate(/area/shuttle/vox/station))
return 0
return 1
/datum/game_mode/heist/proc/is_raider_crew_alive()
for(var/datum/mind/raider in raiders)
if(raider.current)
if(istype(raider.current,/mob/living/carbon/human) && raider.current.stat != 2)
return 1
return 0
/datum/game_mode/heist/proc/forge_vox_objectives()
/datum/game_mode/vox/heist/proc/forge_vox_objectives()
//Commented out for testing.
@@ -164,20 +143,20 @@ var/global/vox_kills = 0 //Used to check the Inviolate.
objs += new /datum/objective/heist/inviolate_crew
objs += new /datum/objective/heist/inviolate_death */
raid_objectives += new /datum/objective/heist/kidnap
raid_objectives += new /datum/objective/heist/loot
raid_objectives += new /datum/objective/heist/salvage
raid_objectives += new /datum/objective/heist/inviolate_crew
raid_objectives += new /datum/objective/heist/inviolate_death
raid_objectives += new /datum/objective/vox/heist/kidnap
raid_objectives += new /datum/objective/vox/heist/loot
raid_objectives += new /datum/objective/vox/heist/salvage
raid_objectives += new /datum/objective/vox/inviolate_crew
raid_objectives += new /datum/objective/vox/inviolate_death
for(var/datum/objective/heist/O in raid_objectives)
for(var/datum/objective/vox/heist/O in raid_objectives)
O.choose_target()
return raid_objectives
/datum/game_mode/heist/proc/greet_vox(var/datum/mind/raider)
/datum/game_mode/vox/heist/proc/greet_vox(var/datum/mind/raider)
raider.current << "\blue <B>You are a Vox Raider, fresh from the Shoal!</b>"
raider.current << "\blue The Vox are a race of cunning, sharp-eyed nomadic raiders and traders endemic to Tau Ceti and much of the unexplored galaxy. You and the crew have come to the Exodus for plunder, trade or both."
raider.current << "\blue The Vox are a race of cunning, sharp-eyed nomadic raiders and traders endemic to Tau Ceti and much of the unexplored galaxy. You and the crew have come to the Exodus for plunder."
raider.current << "\blue Vox are cowardly and will flee from larger groups, but corner one or find them en masse and they are vicious."
raider.current << "\blue Use :V to voxtalk, :H to talk on your encrypted channel, and don't forget to turn on your nitrogen internals!"
var/obj_count = 1
@@ -186,7 +165,7 @@ var/global/vox_kills = 0 //Used to check the Inviolate.
obj_count++
/datum/game_mode/heist/declare_completion()
/datum/game_mode/vox/heist/declare_completion()
//No objectives, go straight to the feedback.
if(!(raid_objectives.len)) return ..()
@@ -213,13 +192,13 @@ var/global/vox_kills = 0 //Used to check the Inviolate.
win_group = "Crew"
//Now we modify that result by the state of the vox crew.
if(!is_raider_crew_alive())
if(!is_vox_crew_alive())
win_type = "Major"
win_group = "Crew"
win_msg += "<B>The Vox Raiders have been wiped out!</B>"
else if(!is_raider_crew_safe())
else if(!is_vox_crew_safe())
if(win_group == "Crew" && win_type == "Minor")
win_type = "Major"
@@ -253,7 +232,7 @@ var/global/vox_kills = 0 //Used to check the Inviolate.
..()
/datum/game_mode/heist/check_finished()
if (!(is_raider_crew_alive()) || (vox_shuttle_location && (vox_shuttle_location == "start")))
/datum/game_mode/vox/heist/check_finished()
if (!(is_vox_crew_alive()) || (vox_shuttle_location && (vox_shuttle_location == "start")))
return 1
return ..()
+214
View File
@@ -0,0 +1,214 @@
/*
VOX TRADE ROUNDTYPE
*/
/datum/game_mode/
var/list/datum/mind/traders = list() //Antags.
/datum/game_mode/vox/trade
name = "trade"
config_tag = "trade"
required_players = 10
required_players_secret = 10
required_enemies = 4
recommended_enemies = 6
var/const/waittime_l = 600 //lower bound on time before intercept arrives (in tenths of seconds)
var/const/waittime_h = 1800 //upper bound on time before intercept arrives (in tenths of seconds)
var/list/trade_objectives = list() //Trade objectives.
/datum/game_mode/vox/trade/announce()
world << "<B>The current game mode is - Traders!</B>"
world << "<B>An unidentified bluespace signature has slipped past the Icarus and is approaching [station_name()]!</B>"
world << "Whoever they are, they're likely up to no good. Protect the crew and station resources against this dastardly threat!"
world << "<B>Traders:</B> Trade with [station_name()] for anything and everything you need."
world << "<B>Personnel:</B> Perform your duties normally, earn extra cash to trade with the Vox."
/datum/game_mode/vox/trade/can_start()
if(!..())
return 0
var/list/candidates = get_players_for_role(BE_VOX)
var/trader_num = 0
//Check that we have enough vox.
if(candidates.len < required_enemies)
return 0
else if(candidates.len < recommended_enemies)
trader_num = candidates.len
else
trader_num = recommended_enemies
//Grab candidates randomly until we have enough.
while(trader_num > 0)
var/datum/mind/new_trader = pick(candidates)
traders += new_trader
candidates -= new_trader
trader_num--
for(var/datum/mind/trader in traders)
trader.assigned_role = "MODE"
trader.special_role = "Vox Traders"
return 1
/datum/game_mode/vox/trade/pre_setup()
return 1
/datum/game_mode/vox/trade/post_setup()
//Build a list of spawn points.
var/list/turf/trader_spawn = list()
for(var/obj/effect/landmark/L in landmarks_list)
if(L.name == "voxstart")
trader_spawn += get_turf(L)
del(L)
continue
//Generate objectives for the group.
trade_objectives = forge_vox_objectives()
var/index = 1
//Spawn the vox!
for(var/datum/mind/trader in traders)
if(index > trader_spawn.len)
index = 1
trader.current.loc = trader_spawn[index]
index++
var/sounds = rand(2,8)
var/i = 0
var/newname = ""
while(i<=sounds)
i++
newname += pick(list("ti","hi","ki","ya","ta","ha","ka","ya","chi","cha","kah"))
var/mob/living/carbon/human/vox = trader.current
vox.real_name = capitalize(newname)
vox.name = vox.real_name
vox.age = rand(12,20)
vox.dna.mutantrace = "vox"
vox.set_species("Vox")
vox.languages = list() // Removing language from chargen.
vox.flavor_text = ""
vox.add_language("Vox-pidgin")
vox.h_style = "Short Vox Quills"
vox.f_style = "Shaved"
for(var/datum/organ/external/limb in vox.organs)
limb.status &= ~(ORGAN_DESTROYED | ORGAN_ROBOT)
vox.equip_vox_raider()
vox.regenerate_icons()
trader.objectives = trade_objectives
greet_vox(trader)
spawn (rand(waittime_l, waittime_h))
send_intercept()
/datum/game_mode/vox/trade/proc/forge_vox_objectives()
trade_objectives += new /datum/objective/vox/trade/raw_materials
trade_objectives += new /datum/objective/vox/trade/trade
trade_objectives += new /datum/objective/vox/inviolate_crew
trade_objectives += new /datum/objective/vox/inviolate_death
for(var/datum/objective/vox/trade/O in trade_objectives)
O.choose_target()
return trade_objectives
/datum/game_mode/vox/trade/proc/greet_vox(var/datum/mind/trader)
trader.current << "\blue <B>You are a Vox Trader, fresh from the Shoal!</b>"
trader.current << "\blue The Vox are a race of cunning, sharp-eyed nomadic raiders and traders endemic to Tau Ceti and much of the unexplored galaxy. You and the crew have come to the Exodus for trade."
trader.current << "\blue Vox are cowardly and will flee from larger groups, but corner one or find them en masse and they are vicious."
trader.current << "\blue Use :V to voxtalk, :H to talk on your encrypted channel, and don't forget to turn on your nitrogen internals!"
var/obj_count = 1
for(var/datum/objective/objective in trader.objectives)
trader.current << "<B>Objective #[obj_count]</B>: [objective.explanation_text]"
obj_count++
/datum/game_mode/vox/trade/declare_completion()
//No objectives, go straight to the feedback.
if(!(trade_objectives.len)) return ..()
var/win_type = "Major"
var/win_group = "Crew"
var/win_msg = ""
var/success = trade_objectives.len
//Decrease success for failed objectives.
for(var/datum/objective/O in trade_objectives)
if(!(O.check_completion())) success--
//Set result by objectives.
if(success == trade_objectives.len)
win_type = "Major"
win_group = "Vox"
else if(success > 2)
win_type = "Minor"
win_group = "Vox"
else
win_type = "Minor"
win_group = "Crew"
//Now we modify that result by the state of the vox crew.
if(!is_vox_crew_alive())
win_type = "Major"
win_group = "Crew"
win_msg += "<B>The Vox Traders have been wiped out!</B>"
else if(!is_vox_crew_safe())
if(win_group == "Crew" && win_type == "Minor")
win_type = "Major"
win_group = "Crew"
win_msg += "<B>The Vox Traders have left someone behind!</B>"
else
if(win_group == "Vox")
if(win_type == "Minor")
win_type = "Major"
win_msg += "<B>The Vox Traders escaped the station!</B>"
else
win_msg += "<B>The Vox Traders were repelled!</B>"
world << "\red <FONT size = 3><B>[win_type] [win_group] victory!</B></FONT>"
world << "[win_msg]"
feedback_set_details("round_end_result","trade - [win_type] [win_group]")
var/count = 1
for(var/datum/objective/objective in trade_objectives)
if(objective.check_completion())
world << "<br><B>Objective #[count]</B>: [objective.explanation_text] <font color='green'><B>Success!</B></font>"
feedback_add_details("traitor_objective","[objective.type]|SUCCESS")
else
world << "<br><B>Objective #[count]</B>: [objective.explanation_text] <font color='red'>Fail.</font>"
feedback_add_details("traitor_objective","[objective.type]|FAIL")
count++
..()
/datum/game_mode/vox/trade/check_finished()
if (!(is_vox_crew_alive()) || (vox_shuttle_location && (vox_shuttle_location == "start")))
return 1
return ..()
+334
View File
@@ -0,0 +1,334 @@
#define MAX_VOX_KILLS 10 //Number of kills during the round before the Inviolate is broken.
//Would be nice to use vox-specific kills but is currently not feasible.
var/global/vox_kills = 0 //Used to check the Inviolate.
/datum/game_mode/
var/list/obj/cortical_stacks = list() //Stacks for 'leave nobody behind' objective.
//Vox global procs
/datum/game_mode/vox/proc/is_vox_crew_safe()
if(cortical_stacks.len == 0)
return 0
for(var/obj/stack in cortical_stacks)
if (get_area(stack) != locate(/area/shuttle/vox/station))
return 0
return 1
/datum/game_mode/vox/proc/is_vox_crew_alive()
for(var/datum/mind/raider in raiders)
if(raider.current)
if(istype(raider.current,/mob/living/carbon/human) && raider.current.stat != 2)
return 1
return 0
//Vox global objectives.
datum/objective/vox
proc/choose_target()
return
datum/objective/vox/inviolate_crew
explanation_text = "Do not leave any Vox behind, alive or dead."
check_completion()
var/datum/game_mode/vox/H = ticker.mode
if(H.is_vox_crew_safe()) return 1
return 0
datum/objective/vox/inviolate_death
explanation_text = "Follow the Inviolate. Minimise death and loss of resources."
check_completion()
if(vox_kills>5) return 0
return 1
//Vox heist objectives.
datum/objective/vox/heist/kidnap
choose_target()
var/list/roles = list("Chief Engineer","Research Director","Roboticist","Chemist","Station Engineer")
var/list/possible_targets = list()
var/list/priority_targets = list()
for(var/datum/mind/possible_target in ticker.minds)
if(possible_target != owner && ishuman(possible_target.current) && (possible_target.current.stat != 2) && (possible_target.assigned_role != "MODE"))
possible_targets += possible_target
for(var/role in roles)
if(possible_target.assigned_role == role)
priority_targets += possible_target
continue
if(priority_targets.len > 0)
target = pick(priority_targets)
else if(possible_targets.len > 0)
target = pick(possible_targets)
if(target && target.current)
explanation_text = "The Shoal has a need for [target.current.real_name], the [target.assigned_role]. Take them alive."
else
explanation_text = "Free Objective"
return target
check_completion()
if(target && target.current)
if (target.current.stat == 2)
return 0 // They're dead. Fail.
//if (!target.current.restrained())
// return 0 // They're loose. Close but no cigar.
var/area/shuttle/vox/station/A = locate()
for(var/mob/living/carbon/human/M in A)
if(target.current == M)
return 1 //They're restrained on the shuttle. Success.
else
return 0
datum/objective/vox/heist/loot
choose_target()
var/loot = "an object"
switch(rand(1,8))
if(1)
target = /obj/structure/particle_accelerator
target_amount = 6
loot = "a complete particle accelerator"
if(2)
target = /obj/machinery/the_singularitygen
target_amount = 1
loot = "a gravitational generator"
if(3)
target = /obj/machinery/power/emitter
target_amount = 4
loot = "four emitters"
if(4)
target = /obj/machinery/nuclearbomb
target_amount = 1
loot = "a nuclear bomb"
if(5)
target = /obj/item/weapon/gun
target_amount = 6
loot = "six guns"
if(6)
target = /obj/item/weapon/gun/energy
target_amount = 4
loot = "four energy guns"
if(7)
target = /obj/item/weapon/gun/energy/laser
target_amount = 2
loot = "two laser guns"
if(8)
target = /obj/item/weapon/gun/energy/ionrifle
target_amount = 1
loot = "an ion gun"
explanation_text = "We are lacking in hardware. Steal [loot]."
check_completion()
var/total_amount = 0
for(var/obj/O in locate(/area/shuttle/vox/station))
if(istype(O,target)) total_amount++
for(var/obj/I in O.contents)
if(istype(I,target)) total_amount++
if(total_amount >= target_amount) return 1
var/datum/game_mode/vox/heist/H = ticker.mode
for(var/datum/mind/raider in H.raiders)
if(raider.current)
for(var/obj/O in raider.current.get_contents())
if(istype(O,target)) total_amount++
if(total_amount >= target_amount) return 1
return 0
datum/objective/vox/heist/salvage
choose_target()
switch(rand(1,8))
if(1)
target = "metal"
target_amount = 300
if(2)
target = "glass"
target_amount = 200
if(3)
target = "plasteel"
target_amount = 100
if(4)
target = "plasma"
target_amount = 100
if(5)
target = "silver"
target_amount = 50
if(6)
target = "gold"
target_amount = 20
if(7)
target = "uranium"
target_amount = 20
if(8)
target = "diamond"
target_amount = 20
explanation_text = "Ransack the station and escape with [target_amount] [target]."
check_completion()
var/total_amount = 0
for(var/obj/item/O in locate(/area/shuttle/vox/station))
var/obj/item/stack/sheet/S
if(istype(O,/obj/item/stack/sheet))
if(O.name == target)
S = O
total_amount += S.amount
for(var/obj/I in O.contents)
if(istype(I,/obj/item/stack/sheet))
if(I.name == target)
S = I
total_amount += S.amount
var/datum/game_mode/vox/heist/H = ticker.mode
for(var/datum/mind/raider in H.raiders)
if(raider.current)
for(var/obj/item/O in raider.current.get_contents())
if(istype(O,/obj/item/stack/sheet))
if(O.name == target)
var/obj/item/stack/sheet/S = O
total_amount += S.amount
if(total_amount >= target_amount) return 1
return 0
//Vox Trade Objectives
datum/objective/vox/trade/trade
choose_target()
var/loot = "an object"
switch(rand(1,8))
if(1)
target = /obj/structure/particle_accelerator
target_amount = 6
loot = "a complete particle accelerator"
if(2)
target = /obj/machinery/the_singularitygen
target_amount = 1
loot = "a gravitational generator"
if(3)
target = /obj/machinery/power/emitter
target_amount = 4
loot = "four emitters"
if(4)
target = /obj/machinery/nuclearbomb
target_amount = 1
loot = "a nuclear bomb"
if(5)
target = /obj/item/weapon/gun
target_amount = 6
loot = "six guns"
if(6)
target = /obj/item/weapon/gun/energy
target_amount = 4
loot = "four energy guns"
if(7)
target = /obj/item/weapon/gun/energy/laser
target_amount = 2
loot = "two laser guns"
if(8)
target = /obj/item/weapon/gun/energy/ionrifle
target_amount = 1
loot = "an ion gun"
explanation_text = "We are lacking in hardware. Trade for [loot]."
check_completion()
var/total_amount = 0
for(var/obj/O in locate(/area/shuttle/vox/station))
if(istype(O,target)) total_amount++
for(var/obj/I in O.contents)
if(istype(I,target)) total_amount++
if(total_amount >= target_amount) return 1
var/datum/game_mode/vox/trade/H = ticker.mode
for(var/datum/mind/trader in H.traders)
if(trader.current)
for(var/obj/O in trader.current.get_contents())
if(istype(O,target)) total_amount++
if(total_amount >= target_amount) return 1
return 0
datum/objective/vox/trade/raw_materials
choose_target()
switch(rand(1,8))
if(1)
target = "metal"
target_amount = 300
if(2)
target = "glass"
target_amount = 200
if(3)
target = "plasteel"
target_amount = 100
if(4)
target = "plasma"
target_amount = 100
if(5)
target = "silver"
target_amount = 50
if(6)
target = "gold"
target_amount = 20
if(7)
target = "uranium"
target_amount = 20
if(8)
target = "diamond"
target_amount = 20
explanation_text = "Trade with the crew for [target_amount] [target]."
check_completion()
var/total_amount = 0
for(var/obj/item/O in locate(/area/shuttle/vox/station))
var/obj/item/stack/sheet/S
if(istype(O,/obj/item/stack/sheet))
if(O.name == target)
S = O
total_amount += S.amount
for(var/obj/I in O.contents)
if(istype(I,/obj/item/stack/sheet))
if(I.name == target)
S = I
total_amount += S.amount
var/datum/game_mode/vox/trade/H = ticker.mode
for(var/datum/mind/trader in H.traders)
if(trader.current)
for(var/obj/item/O in trader.current.get_contents())
if(istype(O,/obj/item/stack/sheet))
if(O.name == target)
var/obj/item/stack/sheet/S = O
total_amount += S.amount
if(total_amount >= target_amount) return 1
return 0
+2 -2
View File
@@ -115,9 +115,9 @@ var/global/announce_vox_departure = 1 //Stealth systems - give an announcement o
vox_shuttle_location = "station"
if(href_list["start"])
if(ticker && (istype(ticker.mode,/datum/game_mode/heist)))
if(ticker && (istype(ticker.mode,/datum/game_mode/vox/heist) || istype(ticker.mode,/datum/game_mode/vox/trade)))
if(!warning)
user << "\red Returning to dark space will end your raid and report your success or failure. If you are sure, press the button again."
user << "\red Returning to dark space will end your mission and report your success or failure. If you are sure, press the button again."
warning = 1
return
vox_move_to(/area/shuttle/vox/station)
+2 -2
View File
@@ -72,8 +72,8 @@ var/global/vox_tick = 1
affected.implants += I
I.part = affected
if(ticker.mode && ( istype( ticker.mode,/datum/game_mode/heist ) ) )
var/datum/game_mode/heist/M = ticker.mode
if(ticker.mode && ( istype( ticker.mode,/datum/game_mode/vox/heist ) ) )
var/datum/game_mode/vox/heist/M = ticker.mode
M.cortical_stacks += I
vox_tick++
@@ -74,7 +74,7 @@
verbs -= /mob/living/carbon/proc/release_control
//Check for heist mode kill count.
if(ticker.mode && ( istype( ticker.mode,/datum/game_mode/heist) ) )
if(ticker.mode && ( istype( ticker.mode,/datum/game_mode/vox/heist) || istype( ticker.mode,/datum/game_mode/vox/trade) ) )
//Check for last assailant's mutantrace.
/*if( LAssailant && ( istype( LAssailant,/mob/living/carbon/human ) ) )
var/mob/living/carbon/human/V = LAssailant
+2 -2
View File
@@ -647,7 +647,7 @@ var/list/TAGGERLOCATIONS = list("Disposals",
#define BE_CULTIST 256
#define BE_MONKEY 512
#define BE_NINJA 1024
#define BE_RAIDER 2048
#define BE_VOX 2048
#define BE_PLANT 4096
var/list/be_special_flags = list(
@@ -662,7 +662,7 @@ var/list/be_special_flags = list(
"Cultist" = BE_CULTIST,
"Monkey" = BE_MONKEY,
"Ninja" = BE_NINJA,
"Raider" = BE_RAIDER,
"Vox" = BE_VOX,
"Diona" = BE_PLANT
)