Vox Heist port from Bay

This commit is contained in:
Markolie
2015-01-10 06:21:21 +01:00
parent bd80867ef5
commit ced499edc3
30 changed files with 736 additions and 1042 deletions
+1 -1
View File
@@ -358,7 +358,7 @@ proc/isInSight(var/atom/A, var/atom/B)
var/i = 0
while(candidates.len <= 0 && i < 5)
for(var/mob/G in respawnable_list)
if( G.client && G.client.prefs.be_special & BE_VOX)
if( G.client && G.client.prefs.be_special & BE_RAIDER)
if(((G.client.inactivity/10)/60) <= ALIEN_SELECT_AFK_BUFFER + i) // the most active players are more likely to become an alien
if(!(G.mind && G.mind.current && G.mind.current.stat != DEAD))
candidates += G.key
+1 -1
View File
@@ -213,7 +213,7 @@ var/global/datum/shuttle_controller/shuttle_controller
"Fore Port Solars" = locate(/area/vox_station/northwest_solars),
"Aft Starboard Solars" = locate(/area/vox_station/southeast_solars),
"Aft Port Solars" = locate(/area/vox_station/southwest_solars),
"Mining asteroid" = locate(/area/vox_station/mining)
"Mining Asteroid" = locate(/area/vox_station/mining)
)
VS.announcer = "NSV Icarus"
+12
View File
@@ -64,6 +64,18 @@
component_parts += new /obj/item/stack/cable_coil(src, 1)
component_parts += new /obj/item/stack/cable_coil(src, 1)
RefreshParts()
/obj/machinery/dna_scannernew/upgraded/New()
..()
component_parts = list()
component_parts += new /obj/item/weapon/circuitboard/clonescanner(src)
component_parts += new /obj/item/weapon/stock_parts/scanning_module/phasic(src)
component_parts += new /obj/item/weapon/stock_parts/manipulator/pico(src)
component_parts += new /obj/item/weapon/stock_parts/micro_laser/ultra(src)
component_parts += new /obj/item/weapon/stock_parts/console_screen(src)
component_parts += new /obj/item/stack/cable_coil(src, 1)
component_parts += new /obj/item/stack/cable_coil(src, 1)
RefreshParts()
/obj/machinery/dna_scannernew/RefreshParts()
scan_level = 0
+21 -1
View File
@@ -345,7 +345,7 @@ Implants;
if(BE_REV) roletext="revolutionary"
if(BE_CULTIST) roletext="cultist"
if(BE_NINJA) roletext="ninja"
if(BE_VOX) roletext="vox"
if(BE_RAIDER) roletext="Vox raider"
// Assemble a list of active players without jobbans.
for(var/mob/new_player/player in player_list)
@@ -551,3 +551,23 @@ proc/get_nt_opposed()
dudes += man
if(dudes.len == 0) return null
return pick(dudes)
//Announces objectives/generic antag text.
/proc/show_generic_antag_text(var/datum/mind/player)
if(player.current)
player.current << \
"You are an antagonist! <font color=blue>Within the rules,</font> \
try to act as an opposing force to the crew. Further RP and try to make sure \
other players have <i>fun</i>! If you are confused or at a loss, always adminhelp, \
and before taking extreme actions, please try to also contact the administration! \
Think through your actions and make the roleplay immersive! <b>Please remember all \
rules aside from those without explicit exceptions apply to antagonists.</b>"
/proc/show_objectives(var/datum/mind/player)
if(!player || !player.current) return
var/obj_count = 1
player.current << "\blue Your current objectives:"
for(var/datum/objective/objective in player.objectives)
player.current << "<B>Objective #[obj_count]</B>: [objective.explanation_text]"
obj_count++
@@ -2,36 +2,40 @@
VOX HEIST ROUNDTYPE
*/
var/global/list/raider_spawn = list()
var/global/list/obj/cortical_stacks = list() //Stacks for 'leave nobody behind' objective. Clumsy, rewrite sometime.
/datum/game_mode/
var/list/datum/mind/raiders = list() //Antags.
var/list/raid_objectives = list() //Raid objectives
/datum/game_mode/vox/heist
/datum/game_mode/heist
name = "heist"
config_tag = "heist"
required_players = 15
required_players_secret = 15
required_players_secret = 25
required_enemies = 4
recommended_enemies = 5
recommended_enemies = 6
votable = 0
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/obj/cortical_stacks = list() //Stacks for 'leave nobody behind' objective.
var/list/raid_objectives = list() //Raid objectives.
/datum/game_mode/vox/heist/announce()
/datum/game_mode/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."
world << "<B>Raiders:</B> Loot [station_name()] for anything and everything you need, or choose the peaceful route and attempt to trade with them."
world << "<B>Personnel:</B> Trade with the raiders, or repel them and their low, low prices and/or crossbows."
/datum/game_mode/vox/heist/can_start()
/datum/game_mode/heist/can_start()
if(!..())
return 0
var/list/candidates = get_players_for_role(BE_VOX)
var/list/candidates = get_players_for_role(BE_RAIDER)
var/raider_num = 0
//Check that we have enough vox.
@@ -54,19 +58,10 @@ VOX HEIST ROUNDTYPE
raider.special_role = "Vox Raider"
return 1
/datum/game_mode/vox/heist/pre_setup()
/datum/game_mode/heist/pre_setup()
return 1
/datum/game_mode/vox/heist/post_setup()
//Build a list of spawn points.
var/list/turf/raider_spawn = list()
for(var/obj/effect/landmark/L in landmarks_list)
if(L.name == "voxstart")
raider_spawn += get_turf(L)
del(L)
continue
/datum/game_mode/heist/post_setup()
//Generate objectives for the group.
raid_objectives = forge_vox_objectives()
@@ -82,37 +77,78 @@ VOX HEIST ROUNDTYPE
raider.current.loc = raider_spawn[index]
index++
var/mob/living/carbon/human/vox = raider.current
raider.name = vox.name
vox.age = rand(12,20)
vox.dna.mutantrace = "vox"
vox.set_species("Vox")
vox.generate_name()
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()
raider.objectives = raid_objectives
create_vox(raider)
greet_vox(raider)
if(raid_objectives)
raider.objectives = raid_objectives
spawn (rand(waittime_l, waittime_h))
send_intercept()
/datum/game_mode/proc/create_vox(var/datum/mind/newraider)
/datum/game_mode/vox/heist/proc/forge_vox_objectives()
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"))
//Commented out for testing.
/* var/i = 1
var/max_objectives = pick(2,2,2,3,3)
var/mob/living/carbon/human/vox = newraider.current
vox.real_name = capitalize(newname)
vox.name = vox.real_name
newraider.name = vox.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.add_language("Galactic Common")
vox.add_language("Tradeband")
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)
//Now apply cortical stack.
var/datum/organ/external/E = vox.get_organ("head")
var/obj/item/weapon/implant/cortical/I = new(vox)
I.imp_in = vox
I.implanted = 1
I.part = E
E.implants += I
cortical_stacks += I
vox.equip_vox_raider()
vox.regenerate_icons()
/datum/game_mode/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/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/proc/forge_vox_objectives()
var/i = 1
var/max_objectives = pick(2,2,2,2,3,3,3,4)
var/list/objs = list()
while(i<= max_objectives)
var/list/goals = list("kidnap","loot","salvage")
@@ -133,32 +169,20 @@ VOX HEIST ROUNDTYPE
//-All- vox raids have these two objectives. Failing them loses the game.
objs += new /datum/objective/heist/inviolate_crew
objs += new /datum/objective/heist/inviolate_death */
objs += new /datum/objective/heist/inviolate_death
if(prob(25))
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
return objs
for(var/datum/objective/vox/heist/O in raid_objectives)
O.choose_target()
return raid_objectives
/datum/game_mode/vox/heist/proc/greet_vox(var/datum/mind/raider)
/datum/game_mode/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."
raider.current << "\blue The Vox are a race of cunning, sharp-eyed nomadic raiders and traders endemic to the frontier and much of the unexplored galaxy. You and the crew have come to the [station_name()] for plunder, trade or both."
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
for(var/datum/objective/objective in raider.objectives)
raider.current << "<B>Objective #[obj_count]</B>: [objective.explanation_text]"
obj_count++
raider.current << "\blue Choose to accomplish your objectives by either raiding the crew and taking what you need, or by attempting to trade with them."
spawn(25)
show_objectives(raider)
/datum/game_mode/vox/heist/declare_completion()
/datum/game_mode/heist/declare_completion()
//No objectives, go straight to the feedback.
if(!(raid_objectives.len)) return ..()
@@ -185,13 +209,13 @@ VOX HEIST ROUNDTYPE
win_group = "Crew"
//Now we modify that result by the state of the vox crew.
if(!is_vox_crew_alive())
if(!is_raider_crew_alive())
win_type = "Major"
win_group = "Crew"
win_msg += "<B>The Vox Raiders have been wiped out!</B>"
else if(!is_vox_crew_safe())
else if(!is_raider_crew_safe())
if(win_group == "Crew" && win_type == "Minor")
win_type = "Major"
@@ -228,7 +252,7 @@ VOX HEIST ROUNDTYPE
datum/game_mode/proc/auto_declare_completion_heist()
if(raiders.len)
var/check_return = 0
if(ticker && istype(ticker.mode,/datum/game_mode/vox/heist))
if(ticker && istype(ticker.mode,/datum/game_mode/heist))
check_return = 1
var/text = "<FONT size = 2><B>The vox raiders were:</B></FONT>"
@@ -253,16 +277,17 @@ datum/game_mode/proc/auto_declare_completion_heist()
world << text
return 1
/datum/game_mode/vox/heist/check_finished()
// DO NOT FORGET TO FIX THIS.
//if (!(is_vox_crew_alive()) || (vox_shuttle_location && (vox_shuttle_location == "start")))
// return 1
/datum/game_mode/heist/check_finished()
var/datum/shuttle/multi_shuttle/skipjack = shuttle_controller.shuttles["Vox Skipjack"]
if (!(is_raider_crew_alive()) || (skipjack && skipjack.returned_home))
return 1
return ..()
/datum/game_mode/vox/heist/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
/datum/game_mode/heist/cleanup()
//the skipjack and everything in it have left and aren't coming back, so get rid of them.
var/area/skipjack = locate(/area/shuttle/vox/station)
for (var/mob/living/M in skipjack.contents)
//maybe send the player a message that they've gone home/been kidnapped? Someone responsible for vox lore should write that.
del(M)
for (var/obj/O in skipjack.contents)
del(O) //no hiding in lockers or anything
+183 -1
View File
@@ -737,10 +737,192 @@ datum/objective/blood
else
return 0
// /vg/; Vox Inviolate for humans :V
datum/objective/minimize_casualties
explanation_text = "Minimise casualties."
check_completion()
if(owner.kills.len>5) return 0
return 1
//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 singularity 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 or trade [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 = "solid 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 or trade with 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.get_amount()
for(var/obj/I in O.contents)
if(istype(I,/obj/item/stack/sheet))
if(I.name == target)
S = I
total_amount += S.get_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.get_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
#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/objective/heist/inviolate_death
explanation_text = "Follow the Inviolate. Minimise death and loss of resources."
check_completion()
if(vox_kills > MAX_VOX_KILLS) return 0
return 1
-242
View File
@@ -1,242 +0,0 @@
/*
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 = 15
required_players_secret = 15
required_enemies = 3
recommended_enemies = 3
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/mob/living/carbon/human/vox = trader.current
trader.name = vox.name
vox.age = rand(12,20)
vox.dna.mutantrace = "vox"
vox.set_species("Vox")
vox.generate_name()
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/proc/auto_declare_completion_trade()
if(traders.len)
var/check_return = 0
if(ticker && istype(ticker.mode,/datum/game_mode/vox/trade))
check_return = 1
var/text = "<FONT size = 2><B>The vox traders were:</B></FONT>"
for(var/datum/mind/vox in traders)
text += "<br>[vox.key] was [vox.name] ("
if(check_return)
var/obj/stack = traders[vox]
if(get_area(stack) != locate(/area/shuttle/vox/station))
text += "left behind)"
continue
if(vox.current)
if(vox.current.stat == DEAD)
text += "died"
else
text += "survived"
if(vox.current.real_name != vox.name)
text += " as [vox.current.real_name]"
else
text += "body destroyed"
text += ")"
world << text
return 1
/datum/game_mode/vox/trade/check_finished()
// if (!(is_vox_crew_alive()) || (vox_shuttle_location && (vox_shuttle_location == "start")))
// return 1
return ..()
/datum/game_mode/vox/trade/proc/is_vox_crew_alive()
for(var/datum/mind/trader in traders)
if(trader.current)
if(istype(trader.current,/mob/living/carbon/human) && trader.current.stat != 2)
return 1
return 0
-324
View File
@@ -1,324 +0,0 @@
#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
//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 singularity 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 singularity 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
+9
View File
@@ -238,6 +238,15 @@
component_parts += new /obj/item/weapon/stock_parts/console_screen(src)
component_parts += new /obj/item/stack/cable_coil(src, 1)
RefreshParts()
/obj/machinery/sleeper/upgraded/New()
..()
component_parts = list()
component_parts += new /obj/item/weapon/stock_parts/manipulator/pico(src)
component_parts += new /obj/item/weapon/stock_parts/console_screen(src)
component_parts += new /obj/item/weapon/stock_parts/console_screen(src)
component_parts += new /obj/item/stack/cable_coil(src, 1)
RefreshParts()
/obj/machinery/sleeper/RefreshParts()
var/E
+13
View File
@@ -44,6 +44,19 @@
component_parts += new /obj/item/stack/cable_coil(src, 1)
component_parts += new /obj/item/stack/cable_coil(src, 1)
RefreshParts()
/obj/machinery/clonepod/upgraded/New()
..()
component_parts = list()
component_parts += new /obj/item/weapon/circuitboard/clonepod(src)
component_parts += new /obj/item/weapon/stock_parts/scanning_module/phasic(src)
component_parts += new /obj/item/weapon/stock_parts/scanning_module/phasic(src)
component_parts += new /obj/item/weapon/stock_parts/manipulator/pico(src)
component_parts += new /obj/item/weapon/stock_parts/manipulator/pico(src)
component_parts += new /obj/item/weapon/stock_parts/console_screen(src)
component_parts += new /obj/item/stack/cable_coil(src, 1)
component_parts += new /obj/item/stack/cable_coil(src, 1)
RefreshParts()
/obj/machinery/clonepod/RefreshParts()
speed_coeff = 0
+9
View File
@@ -141,6 +141,15 @@
update_icon()
if(closed_system)
flags &= ~OPENCONTAINER
/obj/machinery/portable_atmospherics/hydroponics/upgraded/New()
..()
component_parts = list()
component_parts += new /obj/item/weapon/circuitboard/hydroponics(src)
component_parts += new /obj/item/weapon/stock_parts/matter_bin/super(src)
component_parts += new /obj/item/weapon/stock_parts/matter_bin/super(src)
component_parts += new /obj/item/weapon/stock_parts/console_screen(src)
RefreshParts()
/obj/machinery/portable_atmospherics/hydroponics/RefreshParts()
var/tmp_capacity = 0
+11 -1
View File
@@ -49,7 +49,17 @@
component_parts += new /obj/item/weapon/stock_parts/micro_laser(null)
component_parts += new /obj/item/weapon/stock_parts/console_screen(null)
component_parts += new /obj/item/stack/cable_coil(null, 2)
RefreshParts()
RefreshParts()
/obj/machinery/microwave/upgraded/New()
..()
component_parts = list()
component_parts += new /obj/item/weapon/circuitboard/microwave(null)
component_parts += new /obj/item/weapon/stock_parts/micro_laser/ultra(null)
component_parts += new /obj/item/weapon/stock_parts/console_screen(null)
component_parts += new /obj/item/stack/cable_coil(null, 2)
RefreshParts()
/obj/machinery/microwave/RefreshParts()
var/E
+10 -5
View File
@@ -279,6 +279,16 @@
component_parts += new /obj/item/bluespace_crystal/artificial(null)
component_parts += new /obj/item/weapon/stock_parts/matter_bin(null)
RefreshParts()
/obj/machinery/teleport/hub/upgraded/New()
..()
component_parts = list()
component_parts += new /obj/item/weapon/circuitboard/teleporter_hub(null)
component_parts += new /obj/item/bluespace_crystal/artificial(null)
component_parts += new /obj/item/bluespace_crystal/artificial(null)
component_parts += new /obj/item/bluespace_crystal/artificial(null)
component_parts += new /obj/item/weapon/stock_parts/matter_bin/super(null)
RefreshParts()
/obj/machinery/teleport/hub/initialize()
link_power_station()
@@ -350,11 +360,6 @@
else
icon_state = "tele0"
/obj/machinery/teleport/hub/syndicate/New()
..()
component_parts += new /obj/item/weapon/stock_parts/matter_bin/super(null)
RefreshParts()
/obj/machinery/teleport/station
name = "station"
desc = "The power control station for a bluespace teleporter."
+12
View File
@@ -38,6 +38,18 @@
component_parts += new /obj/item/stack/cable_coil(src, 1)
RefreshParts()
recharging_turf = get_step(loc, dir)
/obj/machinery/mech_bay_recharge_port/upgraded/New()
..()
component_parts = list()
component_parts += new /obj/item/weapon/circuitboard/mech_recharger(src)
component_parts += new /obj/item/weapon/stock_parts/capacitor/super(src)
component_parts += new /obj/item/weapon/stock_parts/capacitor/super(src)
component_parts += new /obj/item/weapon/stock_parts/capacitor/super(src)
component_parts += new /obj/item/weapon/stock_parts/capacitor/super(src)
component_parts += new /obj/item/weapon/stock_parts/capacitor/super(src)
component_parts += new /obj/item/stack/cable_coil(src, 1)
RefreshParts()
/obj/machinery/mech_bay_recharge_port/RefreshParts()
var/MC
+3
View File
@@ -78,6 +78,9 @@
if("carpspawn")
carplist += loc
if("voxstart")
raider_spawn += loc
landmarks_list += src
return 1
+3
View File
@@ -185,6 +185,9 @@
usr << "You add new [item.singular_name] to the stack. It now contains [item.amount] [item.singular_name]\s."
if(!oldsrc)
break
/obj/item/stack/proc/get_amount()
return amount
/obj/item/stack/attack_hand(mob/user as mob)
if (user.get_inactive_hand() == src)
+15
View File
@@ -60,11 +60,26 @@ var/global/list/moneytypes=list(
icon_state = "cash10"
worth = 10
stack_color = "#663200"
/obj/item/weapon/spacecash/c20
icon_state = "cash10"
worth = 20
stack_color = "#663200"
/obj/item/weapon/spacecash/c50
icon_state = "cash10"
worth = 50
stack_color = "#663200"
/obj/item/weapon/spacecash/c100
icon_state = "cash100"
worth = 100
stack_color = "#663200"
/obj/item/weapon/spacecash/c200
icon_state = "cash100"
worth = 200
stack_color = "#663200"
/obj/item/weapon/spacecash/c500
icon_state = "cash500"
+9 -5
View File
@@ -154,10 +154,19 @@
name = "plating"
icon = 'icons/turf/floors.dmi'
icon_state = "plating"
/turf/simulated/shuttle/plating/vox //Vox skipjack plating
oxygen = 0
nitrogen = MOLES_N2STANDARD + MOLES_O2STANDARD
/turf/simulated/shuttle/floor4 // Added this floor tile so that I have a seperate turf to check in the shuttle -- Polymorph
name = "Brig floor" // Also added it into the 2x3 brig area of the shuttle.
icon_state = "floor4"
/turf/simulated/shuttle/floor4/vox //Vox skipjack floors
name = "skipjack floor"
oxygen = 0
nitrogen = MOLES_N2STANDARD + MOLES_O2STANDARD
/turf/simulated/floor/beach
name = "Beach"
@@ -238,11 +247,6 @@
/turf/simulated/floor/snow/ex_act(severity)
return
/turf/simulated/shuttle/plating/vox
oxygen=0 // BIRDS HATE OXYGEN FOR SOME REASON
nitrogen = MOLES_O2STANDARD+MOLES_N2STANDARD // So it totals to the same pressure
//icon = 'icons/turf/shuttle-debug.dmi'
// CATWALKS
// Space and plating, all in one buggy fucking turf!
+28 -11
View File
@@ -496,21 +496,38 @@ client/proc/one_click_antag()
var/mob/living/carbon/human/new_vox = new(spawn_location.loc, "Vox")
new_vox.gender = pick(MALE, FEMALE)
new_vox.h_style = "Short Vox Quills"
new_vox.regenerate_icons()
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"))
new_vox.real_name = capitalize(newname)
new_vox.name = new_vox.real_name
new_vox.age = rand(12,20)
new_vox.dna.ready_dna(new_vox) // Creates DNA.
new_vox.dna.mutantrace = "vox"
new_vox.set_species("Vox") // Actually makes the vox! How about that.
new_vox.generate_name()
new_vox.set_species("Vox")
new_vox.languages = list() // Removing language from chargen.
new_vox.flavor_text = ""
new_vox.add_language("Vox-pidgin")
new_vox.mind_initialize()
new_vox.mind.assigned_role = "MODE"
new_vox.mind.special_role = "Vox Raider"
new_vox.mutations |= M_NOCLONE //Stops the station crew from messing around with their DNA.
new_vox.add_language("Galactic Common")
new_vox.add_language("Tradeband")
new_vox.h_style = "Short Vox Quills"
new_vox.f_style = "Shaved"
for(var/datum/organ/external/limb in new_vox.organs)
limb.status &= ~(ORGAN_DESTROYED | ORGAN_ROBOT)
//Now apply cortical stack.
var/datum/organ/external/E = new_vox.get_organ("head")
var/obj/item/weapon/implant/cortical/I = new(new_vox)
I.imp_in = new_vox
I.implanted = 1
I.part = E
E.implants += I
cortical_stacks += I
ticker.mode.traitors += new_vox.mind
new_vox.equip_vox_raider()
+1 -1
View File
@@ -15,7 +15,7 @@ var/global/list/special_roles = list( //keep synced with the defines BE_* in set
"cultist" = IS_MODE_COMPILED("cult"), // 8
"plant" = 1, // 9
"ninja" = "true", // 10
"vox" = IS_MODE_COMPILED("vox/heist") + IS_MODE_COMPILED("vox/trader"), // 11
"raider" = IS_MODE_COMPILED("heist"), // 11
"slime" = 1, // 12
"vampire" = IS_MODE_COMPILED("vampire"), // 13
"mutineer" = IS_MODE_COMPILED("mutiny"), // 14
@@ -112,14 +112,10 @@
callHook("death", list(src, gibbed))
//Check for heist mode kill count.
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
if (V.dna && (V.dna.mutantrace == "vox"))*/ //Not currently feasible due to terrible LAssailant tracking.
//world << "Vox kills: [vox_kills]"
vox_kills++ //Bad vox. Shouldn't be killing humans.
if(ticker && ticker.mode)
if(istype(ticker.mode,/datum/game_mode/heist))
vox_kills++ //Bad vox. Shouldn't be killing humans.
if(ishuman(LAssailant))
var/mob/living/carbon/human/H=LAssailant
if(H.mind)
+2 -3
View File
@@ -443,10 +443,9 @@
affected.implants += I
I.part = affected
if(ticker.mode && ( istype( ticker.mode,/datum/game_mode/vox/heist ) ) )
var/datum/game_mode/vox/heist/M = ticker.mode
if(ticker.mode && ( istype( ticker.mode,/datum/game_mode/heist ) ) )
var/datum/game_mode/heist/M = ticker.mode
M.cortical_stacks += I
M.raiders[H.mind] = I
View File
+1 -1
View File
@@ -1,6 +1,6 @@
/obj/machinery/computer/shuttle_control/multi/vox
name = "skipjack control console"
req_access = list(access_syndicate)
req_access = list(access_vox)
shuttle_tag = "Vox Skipjack"
/obj/machinery/computer/shuttle_control/multi/vox/attack_ai(user as mob)
+4 -1
View File
@@ -3,6 +3,7 @@
var/cloaked = 1
var/at_origin = 1
var/returned_home = 0
var/move_time = 240
var/cooldown = 20
var/last_move = 0 //the time at which we last moved
@@ -21,9 +22,11 @@
..()
if(origin) last_departed = origin
/datum/shuttle/multi_shuttle/move()
/datum/shuttle/multi_shuttle/move(var/area/origin, var/area/destination)
..()
last_move = world.time
if (destination == src.origin)
returned_home = 1
/datum/shuttle/multi_shuttle/proc/announce_departure()
+2 -2
View File
@@ -727,7 +727,7 @@ var/list/TAGGERLOCATIONS = list("Disposals",
#define BE_CULTIST 256
#define BE_PLANT 512
#define BE_NINJA 1024
#define BE_VOX 2048
#define BE_RAIDER 2048
#define BE_SLIME 4096
#define BE_VAMPIRE 8192
#define BE_MUTINEER 16384
@@ -745,7 +745,7 @@ var/list/be_special_flags = list(
"Cultist" = BE_CULTIST,
"Plant" = BE_PLANT,
"Ninja" = BE_NINJA,
"Vox" = BE_VOX,
"Vox Raider" = BE_RAIDER,
"Slime" = BE_SLIME,
"Vampire" = BE_VAMPIRE,
"Mutineer" = BE_MUTINEER,