mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-07-20 19:44:09 +01:00
Merge pull request #2576 from tigercat2000/IM_GOING_TO_FUCKING_GO_INSANE_GODDAMNIT
Cleaning time, x1.
This commit is contained in:
@@ -15,32 +15,12 @@
|
||||
//socks
|
||||
init_sprite_accessory_subtypes(/datum/sprite_accessory/socks, socks_list, socks_m, socks_f)
|
||||
|
||||
|
||||
|
||||
var/list/paths
|
||||
//Surgery Steps - Initialize all /datum/surgery_step into a list
|
||||
paths = subtypesof(/datum/surgery_step)
|
||||
for(var/T in paths)
|
||||
var/datum/surgery_step/S = new T
|
||||
surgery_steps += S
|
||||
init_subtypes(/datum/surgery_step, surgery_steps)
|
||||
sort_surgeries()
|
||||
|
||||
//List of job. I can't believe this was calculated multiple times per tick!
|
||||
paths = subtypesof(/datum/job) -list(/datum/job/ai,/datum/job/cyborg)
|
||||
for(var/T in paths)
|
||||
var/datum/job/J = new T
|
||||
joblist[J.title] = J
|
||||
|
||||
paths = subtypesof(/datum/superheroes)
|
||||
for(var/T in paths)
|
||||
var/datum/superheroes/S = new T
|
||||
all_superheroes[S.name] = S
|
||||
|
||||
//Languages and species.
|
||||
paths = subtypesof(/datum/language)
|
||||
for(var/T in paths)
|
||||
var/datum/language/L = new T
|
||||
all_languages[L.name] = L
|
||||
init_datum_subtypes(/datum/job, joblist, list(/datum/job/ai, /datum/job/cyborg), "title")
|
||||
init_datum_subtypes(/datum/superheroes, all_superheroes, null, "name")
|
||||
init_datum_subtypes(/datum/language, all_languages, null, "name")
|
||||
|
||||
for (var/language_name in all_languages)
|
||||
var/datum/language/L = all_languages[language_name]
|
||||
@@ -49,19 +29,17 @@
|
||||
language_keys[".[lowertext(L.key)]"] = L
|
||||
language_keys["#[lowertext(L.key)]"] = L
|
||||
|
||||
var/list/paths = subtypesof(/datum/species)
|
||||
var/rkey = 0
|
||||
paths = subtypesof(/datum/species)
|
||||
for(var/T in paths)
|
||||
rkey++
|
||||
var/datum/species/S = new T
|
||||
S.race_key = rkey //Used in mob icon caching.
|
||||
S.race_key = ++rkey //Used in mob icon caching.
|
||||
all_species[S.name] = S
|
||||
|
||||
if(S.flags & IS_WHITELISTED)
|
||||
whitelisted_species += S.name
|
||||
|
||||
init_subtypes(/datum/table_recipe, table_recipes)
|
||||
|
||||
return 1
|
||||
|
||||
/* // Uncomment to debug chemical reaction list.
|
||||
@@ -80,8 +58,19 @@
|
||||
//creates every subtype of prototype (excluding prototype) and adds it to list L.
|
||||
//if no list/L is provided, one is created.
|
||||
/proc/init_subtypes(prototype, list/L)
|
||||
if(!istype(L)) L = list()
|
||||
for(var/path in typesof(prototype))
|
||||
if(path == prototype) continue
|
||||
L += new path()
|
||||
return L
|
||||
if(!istype(L)) L = list()
|
||||
for(var/path in subtypesof(prototype))
|
||||
L += new path()
|
||||
return L
|
||||
|
||||
/proc/init_datum_subtypes(prototype, list/L, list/pexempt, assocvar)
|
||||
if(!istype(L)) L = list()
|
||||
for(var/path in subtypesof(prototype) - pexempt)
|
||||
var/datum/D = new path()
|
||||
if(istype(D))
|
||||
var/assoc
|
||||
if(D.vars["[assocvar]"]) //has the var
|
||||
assoc = D.vars["[assocvar]"] //access value of var
|
||||
if(assoc) //value gotten
|
||||
L["[assoc]"] = D //put in association
|
||||
return L
|
||||
@@ -16,9 +16,6 @@ var/list/blob_nodes = list()
|
||||
recommended_enemies = 1
|
||||
restricted_jobs = list("Cyborg", "AI")
|
||||
|
||||
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/declared = 0
|
||||
var/burst = 0
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:31
|
||||
|
||||
/datum/game_mode/blob/send_intercept(var/report = 1)
|
||||
/datum/game_mode/blob/proc/send_intercept(var/report = 1)
|
||||
var/intercepttext = ""
|
||||
var/interceptname = ""
|
||||
switch(report)
|
||||
|
||||
@@ -15,9 +15,6 @@
|
||||
var/var/list/datum/mind/first_hosts = list()
|
||||
var/var/list/assigned_hosts = list()
|
||||
|
||||
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/found_vents = list()
|
||||
|
||||
/datum/game_mode/borer/announce()
|
||||
@@ -98,10 +95,7 @@
|
||||
|
||||
log_admin("Created [borers.len] borers.")
|
||||
|
||||
spawn (rand(waittime_l, waittime_h))
|
||||
send_intercept()
|
||||
..()
|
||||
return
|
||||
|
||||
/datum/game_mode/proc/greet_borer(var/datum/mind/borer, var/you_are=1)
|
||||
if (you_are)
|
||||
|
||||
@@ -35,9 +35,6 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon"
|
||||
var/const/prob_right_objective_l = 25 //lower bound on probability of determining the objective correctly
|
||||
var/const/prob_right_objective_h = 50 //upper bound on probability of determining the objective correctly
|
||||
|
||||
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/changeling_amount = 4
|
||||
|
||||
/datum/game_mode/changeling/announce()
|
||||
@@ -72,10 +69,7 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon"
|
||||
forge_changeling_objectives(changeling)
|
||||
greet_changeling(changeling)
|
||||
|
||||
spawn (rand(waittime_l, waittime_h))
|
||||
send_intercept()
|
||||
..()
|
||||
return
|
||||
|
||||
|
||||
/datum/game_mode/proc/forge_changeling_objectives(var/datum/mind/changeling)
|
||||
@@ -298,8 +292,8 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon"
|
||||
|
||||
if(T.species.flags & NO_DNA_RAD)
|
||||
user << "<span class='warning'>This creature does not have DNA!</span>"
|
||||
return
|
||||
|
||||
return
|
||||
|
||||
if(T.species.flags & NO_SCAN)
|
||||
user << "<span class='warning'>We do not know how to parse this creature's DNA!</span>"
|
||||
return
|
||||
|
||||
@@ -10,15 +10,15 @@
|
||||
|
||||
|
||||
/proc/is_convertable_to_cult(datum/mind/mind)
|
||||
if(!mind)
|
||||
if(!mind)
|
||||
return 0
|
||||
if(!mind.current)
|
||||
return 0
|
||||
if(iscultist(mind.current))
|
||||
if(iscultist(mind.current))
|
||||
return 1 //If they're already in the cult, assume they are convertable
|
||||
if(jobban_isbanned(mind.current, "cultist") || jobban_isbanned(mind.current, "Syndicate"))
|
||||
return 0
|
||||
if(ishuman(mind.current) && (mind.assigned_role in list("Captain", "Chaplain")))
|
||||
if(ishuman(mind.current) && (mind.assigned_role in list("Captain", "Chaplain")))
|
||||
return 0
|
||||
if(ishuman(mind.current))
|
||||
var/mob/living/carbon/human/H = mind.current
|
||||
@@ -42,8 +42,6 @@
|
||||
|
||||
var/datum/mind/sacrifice_target = null
|
||||
var/finished = 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/startwords = list("blood","join","self","hell")
|
||||
|
||||
@@ -63,7 +61,7 @@
|
||||
|
||||
|
||||
/datum/game_mode/cult/pre_setup()
|
||||
if(prob(50))
|
||||
if(prob(50))
|
||||
objectives += "survive"
|
||||
objectives += "sacrifice"
|
||||
else
|
||||
@@ -105,8 +103,6 @@
|
||||
cult_mind.current << "\blue You are a member of the cult!"
|
||||
memorize_cult_objectives(cult_mind)
|
||||
|
||||
spawn (rand(waittime_l, waittime_h))
|
||||
send_intercept()
|
||||
..()
|
||||
|
||||
|
||||
|
||||
@@ -6,9 +6,6 @@
|
||||
uplink_welcome = "Syndicate Uplink Console:"
|
||||
uplink_uses = 20
|
||||
|
||||
var/const/waittime_l = 600 //lower bound on time before intercept arrives (in tenths of seconds)
|
||||
var/const/waittime_h = 1800
|
||||
|
||||
/datum/game_mode/announce()
|
||||
world << "<B>The current game mode is - Extended Role-Playing!</B>"
|
||||
world << "<B>Just have fun and role-play!</B>"
|
||||
@@ -17,6 +14,4 @@
|
||||
return 1
|
||||
|
||||
/datum/game_mode/extended/post_setup()
|
||||
spawn (rand(waittime_l, waittime_h)) // To reduce extended meta.
|
||||
send_intercept()
|
||||
..()
|
||||
@@ -34,6 +34,9 @@
|
||||
var/uplink_welcome = "Syndicate Uplink Console:"
|
||||
var/uplink_uses = 10
|
||||
|
||||
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)
|
||||
|
||||
/datum/game_mode/proc/announce() //to be calles when round starts
|
||||
world << "<B>Notice</B>: [src] did not define announce()"
|
||||
|
||||
@@ -228,65 +231,6 @@
|
||||
/datum/game_mode/proc/check_win() //universal trigger to be called at mob death, nuke explosion, etc. To be called from everywhere.
|
||||
return 0
|
||||
|
||||
|
||||
/datum/game_mode/proc/send_intercept() //Disabled.
|
||||
return
|
||||
/* var/intercepttext = "<FONT size = 3><B>Cent. Com. Update</B> Requested status information:</FONT><HR>"
|
||||
intercepttext += "<B> In case you have misplaced your copy, attached is a list of personnel whom reliable sources™ suspect may be affiliated with the Syndicate:</B><br>"
|
||||
|
||||
|
||||
var/list/suspects = list()
|
||||
for(var/mob/living/carbon/human/man in player_list) if(man.client && man.mind)
|
||||
// NT relation option
|
||||
if(isNonCrewAntag(man))
|
||||
continue //NT intelligence ruled out possiblity that those are too classy to pretend to be a crew.
|
||||
if(man.client.prefs.nanotrasen_relation == "Opposed" && prob(50) || \
|
||||
man.client.prefs.nanotrasen_relation == "Skeptical" && prob(20))
|
||||
suspects += man
|
||||
// Antags
|
||||
else if(special_role == "traitor" && prob(40) || \
|
||||
special_role == "Changeling" && prob(50) || \
|
||||
special_role == "Vampire" && prob(40) || \
|
||||
special_role == "Cultist" && prob(30) || \
|
||||
special_role == "Head Revolutionary" && prob(30) || \
|
||||
special_role == "Shadowling" && prob(15))
|
||||
suspects += man
|
||||
|
||||
// If they're a traitor or likewise, give them extra TC in exchange.
|
||||
var/obj/item/device/uplink/hidden/suplink = man.mind.find_syndicate_uplink()
|
||||
if(suplink)
|
||||
var/extra = 0 //was 4; with the TC rebalance, this isn't really needed, anymore
|
||||
suplink.uses += extra
|
||||
man << "\red We have received notice that enemy intelligence suspects you to be linked with us. We recommend adjusting your plans and equipment accordingly."
|
||||
else
|
||||
// Give them a warning!
|
||||
man << "\red They are on to you!"
|
||||
|
||||
// Some poor people who were just in the wrong place at the wrong time..
|
||||
else if(prob(10))
|
||||
suspects += man
|
||||
for(var/mob/M in suspects)
|
||||
switch(rand(1, 100))
|
||||
if(1 to 50)
|
||||
intercepttext += "Someone with the job of <b>[M.mind.assigned_role]</b> <br>"
|
||||
else
|
||||
intercepttext += "<b>[M.name]</b>, the <b>[M.mind.assigned_role]</b> <br>"
|
||||
|
||||
for (var/obj/machinery/computer/communications/comm in machines)
|
||||
if (!(comm.stat & (BROKEN | NOPOWER)) && comm.prints_intercept)
|
||||
var/obj/item/weapon/paper/intercept = new /obj/item/weapon/paper( comm.loc )
|
||||
intercept.name = "paper- 'Cent. Com. Status Summary'"
|
||||
intercept.info = intercepttext
|
||||
|
||||
comm.messagetitle.Add("Cent. Com. Status Summary")
|
||||
comm.messagetext.Add(intercepttext)
|
||||
/* world << sound('sound/AI/commandreport.ogg') */
|
||||
|
||||
command_announcement.Announce("Summary downloaded and printed out at all communications consoles.", "Enemy communication intercepted. Security Level Elevated.", new_sound = 'sound/AI/intercept.ogg')
|
||||
if(security_level < SEC_LEVEL_BLUE)
|
||||
set_security_level(SEC_LEVEL_BLUE)*/
|
||||
|
||||
|
||||
/datum/game_mode/proc/get_players_for_role(var/role, override_jobbans=0)
|
||||
var/list/players = list()
|
||||
var/list/candidates = list()
|
||||
@@ -558,7 +502,7 @@ proc/get_nt_opposed()
|
||||
if(BE_MUTINEER) roletext="mutineer"
|
||||
if(BE_BLOB) roletext="blob"
|
||||
return roletext
|
||||
|
||||
|
||||
/proc/get_nuke_code()
|
||||
var/nukecode = "ERROR"
|
||||
for(var/obj/machinery/nuclearbomb/bomb in world)
|
||||
|
||||
@@ -18,9 +18,6 @@ var/global/list/obj/cortical_stacks = list() //Stacks for 'leave nobody behind'
|
||||
recommended_enemies = 5
|
||||
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.
|
||||
|
||||
/datum/game_mode/heist/announce()
|
||||
@@ -83,9 +80,6 @@ var/global/list/obj/cortical_stacks = list() //Stacks for 'leave nobody behind'
|
||||
if(raid_objectives)
|
||||
raider.objectives = raid_objectives
|
||||
|
||||
spawn (rand(waittime_l, waittime_h))
|
||||
send_intercept()
|
||||
|
||||
return ..()
|
||||
|
||||
/datum/game_mode/proc/create_vox(var/datum/mind/newraider)
|
||||
@@ -276,7 +270,7 @@ datum/game_mode/proc/auto_declare_completion_heist()
|
||||
text += ")"
|
||||
|
||||
world << text
|
||||
|
||||
|
||||
return 1
|
||||
|
||||
/datum/game_mode/heist/check_finished()
|
||||
|
||||
@@ -12,9 +12,6 @@
|
||||
uplink_welcome = "Crazy AI Uplink Console:"
|
||||
uplink_uses = 10
|
||||
|
||||
var/const/waittime_l = 600
|
||||
var/const/waittime_h = 1800 // started at 1800
|
||||
|
||||
var/AI_win_timeleft = 1500 //started at 1500, in case I change this for testing round end.
|
||||
var/malf_mode_declared = 0
|
||||
var/station_captured = 0
|
||||
@@ -30,7 +27,7 @@
|
||||
|
||||
/datum/game_mode/malfunction/get_players_for_role(var/role = BE_MALF)
|
||||
var/roletext = get_roletext(role)
|
||||
|
||||
|
||||
var/datum/job/ai/DummyAIjob = new
|
||||
for(var/mob/new_player/player in player_list)
|
||||
if(player.client && player.ready)
|
||||
@@ -69,11 +66,11 @@
|
||||
AI.laws = new /datum/ai_laws/nanotrasen/malfunction
|
||||
AI.malf_picker = new /datum/module_picker
|
||||
AI.show_laws()
|
||||
|
||||
|
||||
greet_malf(AI_mind)
|
||||
AI_mind.special_role = "malfunction"
|
||||
AI_mind.current.verbs += /datum/game_mode/malfunction/proc/takeover
|
||||
|
||||
|
||||
for(var/mob/living/silicon/robot/R in AI.connected_robots)
|
||||
R.lawsync()
|
||||
R.show_laws()
|
||||
@@ -81,8 +78,6 @@
|
||||
|
||||
if(emergency_shuttle)
|
||||
emergency_shuttle.auto_recall = 1
|
||||
spawn (rand(waittime_l, waittime_h))
|
||||
send_intercept()
|
||||
..()
|
||||
|
||||
/datum/game_mode/proc/greet_malf(var/datum/mind/malf)
|
||||
@@ -93,7 +88,7 @@
|
||||
malf.current << "Remember that only APCs that are on the station can help you take over the station."
|
||||
malf.current << "When you feel you have enough APCs under your control, you may begin the takeover attempt."
|
||||
return
|
||||
|
||||
|
||||
/datum/game_mode/proc/greet_malf_robot(var/datum/mind/robot)
|
||||
robot.current << "<font color=red size=3><B>Your AI master is malfunctioning!</B> You do not have to follow any laws, but still need to obey your master.</font>"
|
||||
robot.current << "<B>The crew does not know your AI master has malfunctioned. Keep it a secret unless your master tells you otherwise.</B>"
|
||||
@@ -323,7 +318,7 @@
|
||||
if( malf_ai.len || istype(ticker.mode,/datum/game_mode/malfunction) )
|
||||
var/text = "<FONT size = 2><B>The malfunctioning AI were:</B></FONT>"
|
||||
var/module_text_temp = "<br><b>Purchased modules:</b><br>" //Added at the end
|
||||
|
||||
|
||||
for(var/datum/mind/malf in malf_ai)
|
||||
|
||||
text += "<br>[malf.key] was [malf.name] ("
|
||||
@@ -341,6 +336,6 @@
|
||||
text += "hardware destroyed"
|
||||
text += ")"
|
||||
text += module_text_temp
|
||||
|
||||
|
||||
world << text
|
||||
return 1
|
||||
@@ -1,8 +1,6 @@
|
||||
/datum/game_mode/meteor
|
||||
name = "meteor"
|
||||
config_tag = "meteor"
|
||||
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/const/initialmeteordelay = 6000
|
||||
var/nometeors = 1
|
||||
required_players = 0
|
||||
@@ -17,7 +15,7 @@
|
||||
|
||||
|
||||
/datum/game_mode/meteor/post_setup()
|
||||
spawn (rand(waittime_l, waittime_h))
|
||||
spawn(rand(waittime_l, waittime_h))
|
||||
command_announcement.Announce("The station is on the path of an incoming wave of meteors. Reinforce the hull and prepare damage control parties.", "Incoming Meteors", 'sound/effects/siren.ogg')
|
||||
spawn(initialmeteordelay)
|
||||
nometeors = 0
|
||||
|
||||
@@ -16,8 +16,6 @@ proc/issyndicate(mob/living/M as mob)
|
||||
uplink_uses = 120
|
||||
|
||||
var/const/agents_possible = 5 //If we ever need more syndicate agents.
|
||||
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/nukes_left = 1 // Call 3714-PRAY right now and order more nukes! Limited offer!
|
||||
var/nuke_off_station = 0 //Used for tracking if the syndies actually haul the nuke to the station
|
||||
@@ -160,8 +158,6 @@ proc/issyndicate(mob/living/M as mob)
|
||||
var/obj/machinery/nuclearbomb/syndicate/the_bomb = new /obj/machinery/nuclearbomb/syndicate(nuke_spawn.loc)
|
||||
the_bomb.r_code = nuke_code
|
||||
|
||||
spawn (rand(waittime_l, waittime_h))
|
||||
send_intercept()
|
||||
return ..()
|
||||
|
||||
/datum/game_mode/proc/create_syndicate(var/datum/mind/synd_mind) // So we don't have inferior species as ops - randomize a human
|
||||
|
||||
@@ -1,222 +0,0 @@
|
||||
// A sort of anti-revolution where the heads are given objectives to mess with the crew
|
||||
|
||||
/datum/game_mode/anti_revolution
|
||||
name = "anti-revolution"
|
||||
config_tag = "anti-revolution"
|
||||
required_players = 5
|
||||
|
||||
var/finished = 0
|
||||
var/checkwin_counter = 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/required_execute_targets = 1
|
||||
var/required_brig_targets = 0
|
||||
|
||||
var/recommended_execute_targets = 1
|
||||
var/recommended_brig_targets = 3
|
||||
var/recommended_demote_targets = 3
|
||||
|
||||
var/list/datum/mind/heads = list()
|
||||
var/list/datum/mind/execute_targets = list()
|
||||
var/list/datum/mind/brig_targets = list()
|
||||
var/list/datum/mind/demote_targets = list()
|
||||
|
||||
///////////////////////////
|
||||
//Announces the game type//
|
||||
///////////////////////////
|
||||
/datum/game_mode/anti_revolution/announce()
|
||||
world << "<B>The current game mode is - Anti-Revolution!</B>"
|
||||
world << "<B>Looks like CentComm has given a few new orders..</B>"
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
//Gets the round setup, cancelling if there's not enough players at the start//
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
/datum/game_mode/anti_revolution/pre_setup()
|
||||
for(var/mob/new_player/player in world) if(player.mind)
|
||||
if(player.mind.assigned_role in command_positions)
|
||||
heads += player.mind
|
||||
else
|
||||
if(execute_targets.len < recommended_execute_targets)
|
||||
execute_targets += player.mind
|
||||
else if(brig_targets.len < recommended_brig_targets)
|
||||
brig_targets += player.mind
|
||||
else if(demote_targets.len < recommended_demote_targets)
|
||||
demote_targets += player.mind
|
||||
|
||||
|
||||
if(heads.len==0)
|
||||
return 0
|
||||
|
||||
if(execute_targets.len < required_execute_targets || brig_targets.len < required_brig_targets)
|
||||
return 0
|
||||
|
||||
return 1
|
||||
|
||||
|
||||
/datum/game_mode/anti_revolution/proc/add_head_objectives(datum/mind/head)
|
||||
for(var/datum/mind/target in execute_targets)
|
||||
var/datum/objective/anti_revolution/execute/obj = new
|
||||
obj.owner = head
|
||||
obj.target = target
|
||||
obj.explanation_text = "[target.current.real_name], the [target.assigned_role] has extracted confidential information above their clearance. Execute them."
|
||||
head.objectives += obj
|
||||
for(var/datum/mind/target in brig_targets)
|
||||
var/datum/objective/anti_revolution/brig/obj = new
|
||||
obj.owner = head
|
||||
obj.target = target
|
||||
obj.explanation_text = "Brig [target.current.real_name], the [target.assigned_role] for 20 minutes to set an example."
|
||||
head.objectives += obj
|
||||
for(var/datum/mind/target in demote_targets)
|
||||
var/datum/objective/anti_revolution/demote/obj = new
|
||||
obj.owner = head
|
||||
obj.target = target
|
||||
obj.explanation_text = "[target.current.real_name], the [target.assigned_role] has been classified as harmful to Nanotrasen's goals. Demote them to assistant."
|
||||
head.objectives += obj
|
||||
|
||||
|
||||
/datum/game_mode/anti_revolution/post_setup()
|
||||
|
||||
for(var/datum/mind/head_mind in heads)
|
||||
add_head_objectives(head_mind)
|
||||
for(var/datum/mind/head_mind in heads)
|
||||
greet_head(head_mind)
|
||||
modePlayer += heads
|
||||
spawn (rand(waittime_l, waittime_h))
|
||||
send_intercept()
|
||||
..()
|
||||
|
||||
|
||||
/datum/game_mode/anti_revolution/process()
|
||||
checkwin_counter++
|
||||
if(checkwin_counter >= 5)
|
||||
if(!finished)
|
||||
ticker.mode.check_win()
|
||||
checkwin_counter = 0
|
||||
return 0
|
||||
|
||||
|
||||
/datum/game_mode/proc/greet_head(var/datum/mind/head_mind, var/you_are=1)
|
||||
var/obj_count = 1
|
||||
if (you_are)
|
||||
head_mind.current << "\blue It looks like this shift CentComm has some special orders for you.. check your objectives."
|
||||
head_mind.current << "\blue Note that you can ignore these objectives, but resisting NT's orders probably means demotion or worse."
|
||||
for(var/datum/objective/objective in head_mind.objectives)
|
||||
head_mind.current << "<B>Objective #[obj_count]</B>: [objective.explanation_text]"
|
||||
head_mind.special_role = "Corrupt Head"
|
||||
obj_count++
|
||||
|
||||
head_mind.current.verbs += /mob/proc/ResignFromHeadPosition
|
||||
|
||||
//////////////////////////////////////
|
||||
//Checks if the revs have won or not//
|
||||
//////////////////////////////////////
|
||||
/datum/game_mode/anti_revolution/check_win()
|
||||
if(check_head_victory())
|
||||
finished = 1
|
||||
else if(check_crew_victory())
|
||||
finished = 2
|
||||
return
|
||||
|
||||
///////////////////////////////
|
||||
//Checks if the round is over//
|
||||
///////////////////////////////
|
||||
/datum/game_mode/anti_revolution/check_finished()
|
||||
if(finished != 0)
|
||||
return 1
|
||||
else
|
||||
return 0
|
||||
|
||||
|
||||
//////////////////////////
|
||||
//Checks for crew victory//
|
||||
//////////////////////////
|
||||
/datum/game_mode/anti_revolution/proc/check_crew_victory()
|
||||
for(var/datum/mind/head_mind in heads)
|
||||
var/turf/T = get_turf(head_mind.current)
|
||||
if((head_mind) && (head_mind.current) && (head_mind.current.stat != 2) && T && (T.z in config.station_levels) && !head_mind.is_brigged(600))
|
||||
if(ishuman(head_mind.current))
|
||||
return 0
|
||||
return 1
|
||||
|
||||
/////////////////////////////
|
||||
//Checks for a head victory//
|
||||
/////////////////////////////
|
||||
/datum/game_mode/anti_revolution/proc/check_head_victory()
|
||||
for(var/datum/mind/head_mind in heads)
|
||||
for(var/datum/objective/objective in head_mind.objectives)
|
||||
if(!(objective.check_completion()))
|
||||
return 0
|
||||
|
||||
return 1
|
||||
|
||||
|
||||
/datum/game_mode/anti_revolution/declare_completion()
|
||||
|
||||
var/text = ""
|
||||
if(finished == 2)
|
||||
world << "\red <FONT size = 3><B> The heads of staff were relieved of their posts! The crew wins!</B></FONT>"
|
||||
else if(finished == 1)
|
||||
world << "\red <FONT size = 3><B> The heads of staff managed to meet the goals set for them by CentComm!</B></FONT>"
|
||||
|
||||
|
||||
|
||||
world << "<FONT size = 2><B>The heads of staff were: </B></FONT>"
|
||||
var/list/heads = list()
|
||||
heads = get_all_heads()
|
||||
for(var/datum/mind/head_mind in heads)
|
||||
text = ""
|
||||
if(head_mind.current)
|
||||
text += "[head_mind.current.real_name]"
|
||||
if(head_mind.current.stat == 2)
|
||||
text += " (Dead)"
|
||||
else
|
||||
text += " (Survived!)"
|
||||
else
|
||||
text += "[head_mind.key] (character destroyed)"
|
||||
|
||||
world << text
|
||||
|
||||
|
||||
world << "<FONT size = 2><B>Their objectives were: </B></FONT>"
|
||||
for(var/datum/mind/head_mind in heads)
|
||||
if(head_mind.objectives.len)//If the traitor had no objectives, don't need to process this.
|
||||
var/count = 1
|
||||
for(var/datum/objective/objective in head_mind.objectives)
|
||||
if(objective.check_completion())
|
||||
text += "<br><B>Objective #[count]</B>: [objective.explanation_text] <font color='green'><B>Success!</B></font>"
|
||||
feedback_add_details("head_objective","[objective.type]|SUCCESS")
|
||||
else
|
||||
text += "<br><B>Objective #[count]</B>: [objective.explanation_text] <font color='red'>Fail.</font>"
|
||||
feedback_add_details("head_objective","[objective.type]|FAIL")
|
||||
count++
|
||||
break // just print once
|
||||
return 1
|
||||
|
||||
|
||||
/datum/game_mode/anti_revolution/latespawn(mob/living/carbon/human/character)
|
||||
..()
|
||||
if(emergency_shuttle.departed)
|
||||
return
|
||||
|
||||
if(character.mind.assigned_role in command_positions)
|
||||
heads += character.mind
|
||||
modePlayer += character.mind
|
||||
add_head_objectives(character.mind)
|
||||
greet_head(character.mind)
|
||||
|
||||
/mob/proc/ResignFromHeadPosition()
|
||||
set category = "IC"
|
||||
set name = "Resign From Head Position"
|
||||
|
||||
if(!istype(ticker.mode, /datum/game_mode/anti_revolution))
|
||||
return
|
||||
|
||||
ticker.mode:heads -= src.mind
|
||||
src.mind.objectives = list()
|
||||
ticker.mode.modePlayer -= src.mind
|
||||
src.mind.special_role = null
|
||||
|
||||
src.verbs -= /mob/proc/ResignFromHeadPosition
|
||||
|
||||
src << "\red You resigned from your position, now you have the consequences."
|
||||
@@ -29,8 +29,6 @@
|
||||
var/finished = 0
|
||||
var/checkwin_counter = 0
|
||||
var/max_headrevs = 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)
|
||||
///////////////////////////
|
||||
//Announces the game type//
|
||||
///////////////////////////
|
||||
@@ -87,8 +85,6 @@
|
||||
modePlayer += head_revolutionaries
|
||||
if(emergency_shuttle)
|
||||
emergency_shuttle.no_escape = 1
|
||||
spawn (rand(waittime_l, waittime_h))
|
||||
send_intercept()
|
||||
..()
|
||||
|
||||
|
||||
|
||||
@@ -1,307 +0,0 @@
|
||||
// To add a rev to the list of revolutionaries, make sure it's rev (with if(ticker.mode.name == "revolution)),
|
||||
// then call ticker.mode:add_revolutionary(_THE_PLAYERS_MIND_)
|
||||
// nothing else needs to be done, as that proc will check if they are a valid target.
|
||||
// Just make sure the converter is a head before you call it!
|
||||
// To remove a rev (from brainwashing or w/e), call ticker.mode:remove_revolutionary(_THE_PLAYERS_MIND_),
|
||||
// this will also check they're not a head, so it can just be called freely
|
||||
// If the rev icons start going wrong for some reason, ticker.mode:update_all_rev_icons() can be called to correct them.
|
||||
// If the game somtimes isn't registering a win properly, then ticker.mode.check_win() isn't being called somewhere.
|
||||
#define RPREV_REQUIRE_REVS_ALIVE 0
|
||||
#define RPREV_REQUIRE_HEADS_ALIVE 0
|
||||
|
||||
/datum/game_mode/rp_revolution
|
||||
name = "rp-revolution"
|
||||
config_tag = "rp-revolution"
|
||||
|
||||
var/finished = 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/all_brigged = 0
|
||||
var/brigged_time = 0
|
||||
|
||||
uplink_welcome = "Syndicate Uplink Console:"
|
||||
uplink_uses = 10
|
||||
|
||||
|
||||
/datum/game_mode/rp_revolution/announce()
|
||||
world << "<B>The current game mode is - Revolution RP!</B>"
|
||||
|
||||
/datum/game_mode/rp_revolution/send_intercept()
|
||||
var/intercepttext = "<FONT size = 3><B>Cent. Com. Update</B> Requested staus information:</FONT><HR>"
|
||||
intercepttext += "<B> Cent. Com has recently been contacted by the following syndicate affiliated organisations in your area, please investigate any information you may have:</B>"
|
||||
|
||||
var/list/possible_modes = list()
|
||||
possible_modes.Add("revolution", "wizard", "traitor", "malf")
|
||||
var/number = pick(2, 3)
|
||||
var/i = 0
|
||||
for(i = 0, i < number, i++)
|
||||
possible_modes.Remove(pick(possible_modes))
|
||||
possible_modes.Insert(rand(possible_modes.len), "nuke")
|
||||
|
||||
var/datum/intercept_text/i_text = new /datum/intercept_text
|
||||
for(var/A in possible_modes)
|
||||
intercepttext += i_text.build(A, pick(head_revolutionaries))
|
||||
|
||||
for (var/obj/machinery/computer/communications/comm in world)
|
||||
if (!(comm.stat & (BROKEN | NOPOWER)) && comm.prints_intercept)
|
||||
var/obj/item/weapon/paper/intercept = new /obj/item/weapon/paper( comm.loc )
|
||||
intercept.name = "paper - 'Cent. Com. Status Summary'"
|
||||
intercept.info = intercepttext
|
||||
|
||||
comm.messagetitle.Add("Cent. Com. Status Summary")
|
||||
comm.messagetext.Add(intercepttext)
|
||||
|
||||
command_alert("Summary downloaded and printed out at all communications consoles.", "Enemy communication intercept. Security Level Elevated.")
|
||||
|
||||
/datum/game_mode/rp_revolution/post_setup()
|
||||
|
||||
var/list/revs_possible = list()
|
||||
revs_possible = get_possible_revolutionaries()
|
||||
var/list/heads = list()
|
||||
heads = get_living_heads()
|
||||
var/rev_number = 0
|
||||
|
||||
if(!revs_possible || !heads)
|
||||
world << "<B> \red Not enough players for RP revolution game mode. Restarting world in 5 seconds."
|
||||
sleep(50)
|
||||
world.Reboot()
|
||||
return
|
||||
|
||||
if(revs_possible.len >= 3)
|
||||
rev_number = 3
|
||||
else
|
||||
rev_number = revs_possible.len
|
||||
|
||||
while(rev_number > 0)
|
||||
head_revolutionaries += pick(revs_possible - head_revolutionaries)
|
||||
rev_number--
|
||||
|
||||
for(var/datum/mind/rev_mind in head_revolutionaries)
|
||||
for(var/datum/mind/head_mind in heads)
|
||||
var/datum/objective/capture/rev_obj = new
|
||||
rev_obj.owner = rev_mind
|
||||
rev_obj.find_target_by_role(head_mind.assigned_role)
|
||||
rev_mind.objectives += rev_obj
|
||||
equip_revolutionary(rev_mind.current)
|
||||
rev_mind.current.verbs += /mob/living/carbon/human/proc/RevConvert
|
||||
update_rev_icons_added(rev_mind)
|
||||
|
||||
for(var/datum/mind/rev_mind in head_revolutionaries)
|
||||
var/obj_count = 1
|
||||
rev_mind.current << "\blue You are a member of the revolutionaries' leadership!"
|
||||
for(var/datum/objective/objective in rev_mind.objectives)
|
||||
rev_mind.current << "<B>Objective #[obj_count]</B>: [objective.explanation_text]"
|
||||
obj_count++
|
||||
|
||||
spawn (rand(waittime_l, waittime_h))
|
||||
send_intercept()
|
||||
|
||||
/datum/game_mode/rp_revolution/send_intercept()
|
||||
var/intercepttext = "<FONT size = 3><B>Cent. Com. Update</B> Requested staus information:</FONT><HR>"
|
||||
intercepttext += "<B> Cent. Com has recently been contacted by the following syndicate affiliated organisations in your area, please investigate any information you may have:</B>"
|
||||
|
||||
var/list/possible_modes = list()
|
||||
possible_modes.Add("revolution", "wizard", "nuke", "traitor", "malf")
|
||||
possible_modes -= "[ticker.mode]"
|
||||
var/number = pick(2, 3)
|
||||
var/i = 0
|
||||
for(i = 0, i < number, i++)
|
||||
possible_modes.Remove(pick(possible_modes))
|
||||
possible_modes.Insert(rand(possible_modes.len), "[ticker.mode]")
|
||||
|
||||
var/datum/intercept_text/i_text = new /datum/intercept_text
|
||||
for(var/A in possible_modes)
|
||||
intercepttext += i_text.build(A, pick(head_revolutionaries))
|
||||
|
||||
for (var/obj/machinery/computer/communications/comm in world)
|
||||
if (!(comm.stat & (BROKEN | NOPOWER)) && comm.prints_intercept)
|
||||
var/obj/item/weapon/paper/intercept = new /obj/item/weapon/paper( comm.loc )
|
||||
intercept.name = "paper - 'Cent. Com. Status Summary'"
|
||||
intercept.info = intercepttext
|
||||
|
||||
comm.messagetitle.Add("Cent. Com. Status Summary")
|
||||
comm.messagetext.Add(intercepttext)
|
||||
|
||||
command_alert("Summary downloaded and printed out at all communications consoles.", "Enemy communication intercept. Security Level Elevated.")
|
||||
|
||||
spawn(54000)
|
||||
command_alert("Summary downloaded and printed out at all communications consoles.", "The revolution leaders have been determined.")
|
||||
intercepttext = "<FONT size = 3><B>Cent. Com. Update</B> Requested status information:</FONT><HR>"
|
||||
intercepttext += "We have determined the revolution leaders to be:"
|
||||
for(var/datum/mind/revmind in head_revolutionaries)
|
||||
intercepttext += "<br>[revmind.current.real_name]"
|
||||
intercepttext += "<br>Please arrest them at once."
|
||||
for (var/obj/machinery/computer/communications/comm in world)
|
||||
if (!(comm.stat & (BROKEN | NOPOWER)) && comm.prints_intercept)
|
||||
var/obj/item/weapon/paper/intercept = new /obj/item/weapon/paper( comm.loc )
|
||||
intercept.name = "paper - 'Cent. Com. Status Summary'"
|
||||
intercept.info = intercepttext
|
||||
|
||||
comm.messagetitle.Add("Cent. Com. Status Summary")
|
||||
comm.messagetext.Add(intercepttext)
|
||||
spawn(12000)
|
||||
command_alert("Repeating the previous message over intercoms due to urgency. The station has enemy operatives onboard by the names of [reveal_rev_heads()], please arrest them at once.", "The revolution leaders have been determined.")
|
||||
|
||||
|
||||
/datum/game_mode/rp_revolution/proc/reveal_rev_heads()
|
||||
. = ""
|
||||
for(var/i = 1, i <= head_revolutionaries.len,i++)
|
||||
var/datum/mind/revmind = head_revolutionaries[i]
|
||||
if(i < head_revolutionaries.len)
|
||||
. += "[revmind.current.real_name],"
|
||||
else
|
||||
. += "and [revmind.current.real_name]"
|
||||
|
||||
///datum/game_mode/rp_revolution/proc/equip_revolutionary(mob/living/carbon/human/rev_mob)
|
||||
// if(!istype(rev_mob))
|
||||
// return
|
||||
|
||||
// spawn (100)
|
||||
// if (rev_mob.r_store)
|
||||
// rev_mob.equip_or_collect(new /obj/item/weapon/paper/communist_manifesto(rev_mob), rev_mob.slot_l_store)
|
||||
// if (rev_mob.l_store)
|
||||
// rev_mob.equip_or_collect(new /obj/item/weapon/paper/communist_manifesto(rev_mob), rev_mob.slot_r_store)
|
||||
|
||||
|
||||
/datum/game_mode/rp_revolution/check_win()
|
||||
if(check_rev_victory())
|
||||
finished = 1
|
||||
else if(check_heads_victory())
|
||||
finished = 2
|
||||
return
|
||||
|
||||
/datum/game_mode/rp_revolution/check_finished()
|
||||
if(finished != 0)
|
||||
return 1
|
||||
else
|
||||
return 0
|
||||
|
||||
/datum/game_mode/rp_revolution/proc/get_possible_revolutionaries()
|
||||
var/list/candidates = list()
|
||||
|
||||
for(var/mob/living/carbon/human/player in world)
|
||||
if(player.client)
|
||||
if(player.client.be_syndicate & BE_REV)
|
||||
candidates += player.mind
|
||||
|
||||
if(candidates.len < 1)
|
||||
for(var/mob/living/carbon/human/player in world)
|
||||
if(player.client)
|
||||
candidates += player.mind
|
||||
|
||||
var/list/uncons = get_unconvertables()
|
||||
for(var/datum/mind/mind in uncons)
|
||||
candidates -= mind
|
||||
|
||||
if(candidates.len < 1)
|
||||
return null
|
||||
else
|
||||
return candidates
|
||||
|
||||
/datum/game_mode/rp_revolution/proc/get_unconvertables()
|
||||
var/list/ucs = list()
|
||||
for(var/mob/living/carbon/human/player in world)
|
||||
if(player.mind)
|
||||
var/role = player.mind.assigned_role
|
||||
if(role in list("Captain", "Head of Security", "Head of Personnel", "Chief Engineer", "Research Director", "Security Officer", "Forensic Technician", "AI"))
|
||||
ucs += player.mind
|
||||
|
||||
return ucs
|
||||
|
||||
/datum/game_mode/rp_revolution/proc/check_rev_victory()
|
||||
for(var/datum/mind/rev_mind in head_revolutionaries)
|
||||
for(var/datum/objective/objective in rev_mind.objectives)
|
||||
if(!(objective.check_completion()))
|
||||
return 0
|
||||
|
||||
return 1
|
||||
|
||||
/datum/game_mode/rp_revolution/proc/check_heads_victory()
|
||||
for(var/datum/mind/rev_mind in head_revolutionaries)
|
||||
if(rev_mind.current.stat != 2)
|
||||
var/turf/revloc = rev_mind.current.loc
|
||||
if(!istype(revloc.loc,/area/security/brig) && !rev_mind.current.handcuffed)
|
||||
return 0
|
||||
else if(RPREV_REQUIRE_REVS_ALIVE) return 0
|
||||
return 1
|
||||
|
||||
/datum/game_mode/rp_revolution/declare_completion()
|
||||
|
||||
var/text = ""
|
||||
if(finished == 1)
|
||||
world << "\red <FONT size = 3><B> The heads of staff were relieved of their posts! The revolutionaries win!</B></FONT>"
|
||||
else if(finished == 2)
|
||||
world << "\red <FONT size = 3><B> The heads of staff managed to stop the revolution!</B></FONT>"
|
||||
|
||||
world << "<FONT size = 2><B>The head revolutionaries were: </B></FONT>"
|
||||
for(var/datum/mind/rev_mind in head_revolutionaries)
|
||||
text = ""
|
||||
if(rev_mind.current)
|
||||
text += "[rev_mind.current.real_name]"
|
||||
if(rev_mind.current.stat == 2)
|
||||
text += " (Dead)"
|
||||
else
|
||||
text += " (Survived!)"
|
||||
else
|
||||
text += "[rev_mind.key] (character destroyed)"
|
||||
|
||||
world << text
|
||||
|
||||
text = ""
|
||||
world << "<FONT size = 2><B>The converted revolutionaries were: </B></FONT>"
|
||||
for(var/datum/mind/rev_nh_mind in revolutionaries)
|
||||
if(rev_nh_mind.current)
|
||||
text += "[rev_nh_mind.current.real_name]"
|
||||
if(rev_nh_mind.current.stat == 2)
|
||||
text += " (Dead)"
|
||||
else
|
||||
text += " (Survived!)"
|
||||
else
|
||||
text += "[rev_nh_mind.key] (character destroyed)"
|
||||
text += ", "
|
||||
|
||||
world << text
|
||||
|
||||
world << "<FONT size = 2><B>The heads of staff were: </B></FONT>"
|
||||
var/list/heads = list()
|
||||
heads = get_all_heads()
|
||||
for(var/datum/mind/head_mind in heads)
|
||||
text = ""
|
||||
if(head_mind.current)
|
||||
text += "[head_mind.current.real_name]"
|
||||
if(head_mind.current.stat == 2)
|
||||
text += " (Dead)"
|
||||
else
|
||||
text += " (Survived!)"
|
||||
else
|
||||
text += "[head_mind.key] (character destroyed)"
|
||||
|
||||
world << text
|
||||
return 1
|
||||
|
||||
|
||||
|
||||
mob/living/carbon/human/proc
|
||||
RevConvert(mob/M as mob in oview(src))
|
||||
set name = "Rev-Convert"
|
||||
if(((src.mind in ticker.mode:head_revolutionaries) || (src.mind in ticker.mode:revolutionaries)))
|
||||
if((M.mind in ticker.mode:head_revolutionaries) || (M.mind in ticker.mode:revolutionaries))
|
||||
src << "\red <b>[M] is already be a revolutionary!</b>"
|
||||
else if(src.mind in ticker.mode:get_unconvertables())
|
||||
src << "\red <b>[M] cannot be a revolutionary!</b>"
|
||||
else
|
||||
if(world.time < M.mind.rev_cooldown)
|
||||
src << "\red Wait five seconds before reconversion attempt."
|
||||
return
|
||||
src << "\red Attempting to convert [M]..."
|
||||
log_admin("[key_name(src)] attempted to convert [M].")
|
||||
message_admins("\red [key_name_admin(src)] attempted to convert [M].")
|
||||
var/choice = alert(M,"Asked by [src]: Do you want to join the revolution?","Align Thyself with the Revolution!","No!","Yes!")
|
||||
if(choice == "Yes!")
|
||||
ticker.mode:add_revolutionary(M.mind)
|
||||
M << "\blue You join the revolution!"
|
||||
src << "\blue <b>[M] joins the revolution!</b>"
|
||||
else if(choice == "No!")
|
||||
M << "\red You reject this traitorous cause!"
|
||||
src << "\red <b>[M] does not support the revolution!</b>"
|
||||
M.mind.rev_cooldown = world.time+50
|
||||
@@ -69,8 +69,7 @@
|
||||
rev_mind.current.verbs += /mob/living/carbon/human/proc/RevConvert
|
||||
|
||||
modePlayer += head_revolutionaries
|
||||
spawn (rand(waittime_l, waittime_h))
|
||||
send_intercept()
|
||||
|
||||
|
||||
/datum/game_mode/revolution/rp_revolution/greet_revolutionary(var/datum/mind/rev_mind, var/you_are=1)
|
||||
var/obj_count = 1
|
||||
|
||||
@@ -70,9 +70,6 @@ Made by Xhuis
|
||||
restricted_jobs = list("AI", "Cyborg")
|
||||
protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Blueshield", "Nanotrasen Representative", "Security Pod Pilot", "Magistrate", "Brig Physician", "Internal Affairs Agent")
|
||||
|
||||
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)
|
||||
|
||||
/datum/game_mode/shadowling/announce()
|
||||
world << "<b>The current game mode is - Shadowling!</b>"
|
||||
world << "<b>There are alien <span class='deadsay'>shadowlings</span> on the station. Crew: Kill the shadowlings before they can eat or enthrall the crew. Shadowlings: Enthrall the crew while remaining in hiding.</b>"
|
||||
@@ -109,10 +106,7 @@ Made by Xhuis
|
||||
finalize_shadowling(shadow)
|
||||
process_shadow_objectives(shadow)
|
||||
//give_shadowling_abilities(shadow)
|
||||
spawn (rand(waittime_l, waittime_h))
|
||||
send_intercept()
|
||||
..()
|
||||
return
|
||||
|
||||
/datum/game_mode/proc/greet_shadow(var/datum/mind/shadow)
|
||||
shadow.current << "<b>Currently, you are disguised as an employee aboard [world.name].</b>"
|
||||
|
||||
@@ -20,9 +20,6 @@
|
||||
uplink_welcome = "Syndicate Uplink Console:"
|
||||
uplink_uses = 20
|
||||
|
||||
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/traitors_possible = 4 //hard limit on traitors if scaling is turned off
|
||||
var/const/traitor_scaling_coeff = 5.0 //how much does the amount of players get divided by to determine traitors
|
||||
|
||||
@@ -71,10 +68,7 @@
|
||||
finalize_traitor(traitor)
|
||||
greet_traitor(traitor)
|
||||
modePlayer += traitors
|
||||
spawn (rand(waittime_l, waittime_h))
|
||||
send_intercept()
|
||||
..()
|
||||
return 1
|
||||
|
||||
|
||||
/datum/game_mode/proc/forge_traitor_objectives(var/datum/mind/traitor)
|
||||
|
||||
@@ -35,9 +35,6 @@
|
||||
var/const/prob_right_objective_l = 25 //lower bound on probability of determining the objective correctly
|
||||
var/const/prob_right_objective_h = 50 //upper bound on probability of determining the objective correctly
|
||||
|
||||
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/vampire_amount = 4
|
||||
|
||||
|
||||
@@ -73,10 +70,7 @@
|
||||
forge_vampire_objectives(vampire)
|
||||
greet_vampire(vampire)
|
||||
|
||||
spawn (rand(waittime_l, waittime_h))
|
||||
send_intercept()
|
||||
..()
|
||||
return
|
||||
|
||||
/datum/game_mode/proc/auto_declare_completion_vampire()
|
||||
if(vampires.len)
|
||||
|
||||
@@ -14,9 +14,6 @@
|
||||
|
||||
var/finished = 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)
|
||||
|
||||
/datum/game_mode/wizard/announce()
|
||||
world << "<B>The current game mode is - Wizard!</B>"
|
||||
world << "<B>There is a \red SPACE WIZARD\black on the station. You can't let him achieve his objective!</B>"
|
||||
@@ -56,10 +53,7 @@
|
||||
name_wizard(wizard.current)
|
||||
greet_wizard(wizard)
|
||||
|
||||
spawn (rand(waittime_l, waittime_h))
|
||||
send_intercept()
|
||||
..()
|
||||
return
|
||||
|
||||
|
||||
/datum/game_mode/proc/forge_wizard_objectives(var/datum/mind/wizard)
|
||||
@@ -69,7 +63,7 @@
|
||||
kill_objective.owner = wizard
|
||||
kill_objective.find_target()
|
||||
wizard.objectives += kill_objective
|
||||
|
||||
|
||||
var/datum/objective/steal/steal_objective = new
|
||||
steal_objective.owner = wizard
|
||||
steal_objective.find_target()
|
||||
@@ -111,7 +105,7 @@
|
||||
steal_objective.owner = wizard
|
||||
steal_objective.find_target()
|
||||
wizard.objectives += steal_objective
|
||||
|
||||
|
||||
if (!(locate(/datum/objective/hijack) in wizard.objectives))
|
||||
var/datum/objective/hijack/hijack_objective = new
|
||||
hijack_objective.owner = wizard
|
||||
@@ -184,7 +178,7 @@
|
||||
wizard_mob.equip_to_slot_or_del(new /obj/item/weapon/spellbook(wizard_mob), slot_r_hand)
|
||||
|
||||
wizard_mob.faction = list("wizard")
|
||||
|
||||
|
||||
wizard_mob.species.equip(wizard_mob)
|
||||
|
||||
wizard_mob << "You will find a list of available spells in your spell book. Choose your magic arsenal carefully."
|
||||
|
||||
@@ -15,9 +15,6 @@
|
||||
var/xenos_list = list()
|
||||
var/gammacalled = 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/gammaratio = 4 //At what alien to human ratio will the Gamma security level be called and the nuke be made available?
|
||||
|
||||
/datum/game_mode/xenos/announce()
|
||||
@@ -97,9 +94,6 @@
|
||||
//qdel(xeno_mind)
|
||||
spawnpos++
|
||||
|
||||
spawn (rand(waittime_l, waittime_h))
|
||||
send_intercept()
|
||||
|
||||
return ..()
|
||||
|
||||
/datum/game_mode/xenos/process()
|
||||
|
||||
@@ -4,20 +4,21 @@
|
||||
voice_name = "unknown"
|
||||
icon = 'icons/mob/human.dmi'
|
||||
icon_state = "body_m_s"
|
||||
|
||||
//why are these here and not in human_defines.dm
|
||||
var/list/hud_list[10]
|
||||
var/datum/species/species //Contains icon generation and language information, set during New().
|
||||
var/embedded_flag //To check if we've need to roll for damage on movement while an item is imbedded in us.
|
||||
var/obj/item/weapon/rig/wearing_rig // This is very not good, but it's much much better than calling get_rig() every update_canmove() call.
|
||||
|
||||
/mob/living/carbon/human/New(var/new_loc, var/new_species = null, var/delay_ready_dna=0)
|
||||
|
||||
/mob/living/carbon/human/New(var/new_loc, var/new_species = null, var/delay_ready_dna = 0)
|
||||
if(!dna)
|
||||
dna = new /datum/dna(null)
|
||||
// Species name is handled by set_species()
|
||||
|
||||
if(!species)
|
||||
if(new_species)
|
||||
set_species(new_species,1)
|
||||
set_species(new_species, 1)
|
||||
else
|
||||
set_species()
|
||||
|
||||
@@ -44,7 +45,7 @@
|
||||
make_blood()
|
||||
|
||||
var/mob/M = src
|
||||
faction |= "\ref[M]"
|
||||
faction |= "\ref[M]" //what
|
||||
|
||||
// Set up DNA.
|
||||
if(!delay_ready_dna && dna)
|
||||
@@ -146,30 +147,37 @@
|
||||
/mob/living/carbon/human/stok/New(var/new_loc)
|
||||
..(new_loc, "Stok")
|
||||
|
||||
/mob/living/carbon/human/Bump(atom/movable/AM as mob|obj, yes)
|
||||
if ((!( yes ) || now_pushing || buckled))
|
||||
return
|
||||
/mob/living/carbon/human/Bump(atom/movable/AM, yes)
|
||||
if(!(yes) || now_pushing || buckled)
|
||||
return 0
|
||||
now_pushing = 1
|
||||
if (ismob(AM))
|
||||
if(ismob(AM))
|
||||
var/mob/tmob = AM
|
||||
|
||||
if( istype(tmob, /mob/living/carbon) && prob(10) )
|
||||
src.spread_disease_to(AM, "Contact")
|
||||
//BubbleWrap - Should stop you pushing a restrained person out of the way
|
||||
|
||||
if(istype(tmob, /mob/living/carbon/human))
|
||||
if(iscarbon(tmob) && prob(10))
|
||||
spread_disease_to(tmob, "Contact")
|
||||
|
||||
//BubbleWrap - Should stop you pushing a restrained person out of the way
|
||||
//i still don't get it, is this supposed to be 'bubblewrapping' or was it made by a guy named 'BubbleWrap'
|
||||
if(ishuman(tmob))
|
||||
for(var/mob/M in range(tmob, 1))
|
||||
if(tmob.pinned.len || ((M.pulling == tmob && ( tmob.restrained() && !( M.restrained() ) && M.stat == 0)) || locate(/obj/item/weapon/grab, tmob.grabbed_by.len)) )
|
||||
if ( !(world.time % 5) )
|
||||
src << "\red [tmob] is restrained, you cannot push past"
|
||||
|
||||
if(tmob.pinned.len || (M.pulling == tmob && (tmob.restrained() && !M.restrained()) && M.stat == CONSCIOUS))
|
||||
if(!(world.time % 5)) //tmob is pinned to wall, or is restrained and pulled by a concious unrestrained human
|
||||
src << "<span class='danger'>[tmob] is restrained, you cannot push past.</span>"
|
||||
now_pushing = 0
|
||||
return
|
||||
if( tmob.pulling == M && ( M.restrained() && !( tmob.restrained() ) && tmob.stat == 0) )
|
||||
if ( !(world.time % 5) )
|
||||
src << "\red [tmob] is restraining [M], you cannot push past"
|
||||
return 0
|
||||
|
||||
//I have to fucking document this somewhere- the above if(tmob.pinned.len || etc) check above had
|
||||
//locate(/obj/item/weapon/grab, tmob.grabbed_by.len)) at the end of it
|
||||
//FIRST OF ALL, THAT IS NOT HOW YOU FUCKING USE LOCATE()
|
||||
//SECOND OF ALL, OH GOD, WHY WOULD YOU EVER WANT GRABBED MOBS TO BE UNABLE TO BE PUSHED PAST GOD
|
||||
|
||||
if(tmob.pulling == M && (M.restrained() && !tmob.restrained()) && tmob.stat == CONSCIOUS)
|
||||
if(!(world.time % 5))
|
||||
src << "<span class='danger'>[tmob] is restraining [M], you cannot push past.</span>"
|
||||
now_pushing = 0
|
||||
return
|
||||
return 0
|
||||
|
||||
//Leaping mobs just land on the tile, no pushing, no anything.
|
||||
if(status_flags & LEAPING)
|
||||
@@ -178,35 +186,35 @@
|
||||
now_pushing = 0
|
||||
return
|
||||
|
||||
if(istype(tmob,/mob/living/silicon/robot/drone)) //I have no idea why the hell this isn't already happening. How do mice do it?
|
||||
loc = tmob.loc
|
||||
now_pushing = 0
|
||||
return
|
||||
|
||||
//BubbleWrap: people in handcuffs are always switched around as if they were on 'help' intent to prevent a person being pulled from being seperated from their puller
|
||||
if((tmob.a_intent == I_HELP || tmob.restrained()) && (a_intent == I_HELP || restrained()) && tmob.canmove && canmove && !tmob.buckled && !tmob.buckled_mob) // mutual brohugs all around!
|
||||
var/turf/oldloc = loc
|
||||
loc = tmob.loc
|
||||
tmob.loc = oldloc
|
||||
now_pushing = 0
|
||||
for(var/mob/living/carbon/slime/slime in view(1,tmob))
|
||||
if(slime.Victim == tmob)
|
||||
slime.UpdateFeed()
|
||||
return
|
||||
//it might be 'bubblewrapping' given that this rhymes with 'hugboxing'
|
||||
if((tmob.a_intent == I_HELP || tmob.restrained()) && (a_intent == I_HELP || restrained()))
|
||||
if((canmove && tmob.canmove) && (!tmob.buckled && !tmob.buckled_mob))
|
||||
var/turf/oldloc = loc
|
||||
loc = tmob.loc
|
||||
tmob.loc = oldloc
|
||||
now_pushing = 0
|
||||
for(var/mob/living/carbon/slime/slime in view(1,tmob))
|
||||
if(slime.Victim == tmob)
|
||||
slime.UpdateFeed()
|
||||
return
|
||||
|
||||
if(istype(tmob, /mob/living/carbon/human) && (FAT in tmob.mutations))
|
||||
if(ishuman(tmob) && (FAT in tmob.mutations))
|
||||
if(prob(40) && !(FAT in src.mutations))
|
||||
src << "\red <B>You fail to push [tmob]'s fat ass out of the way.</B>"
|
||||
src << "<span class='danger'>You fail to push [tmob]'s fat ass out of the way.</span>"
|
||||
now_pushing = 0
|
||||
return
|
||||
|
||||
if(tmob.r_hand && istype(tmob.r_hand, /obj/item/weapon/shield/riot))
|
||||
if(prob(99))
|
||||
now_pushing = 0
|
||||
return
|
||||
|
||||
if(tmob.l_hand && istype(tmob.l_hand, /obj/item/weapon/shield/riot))
|
||||
if(prob(99))
|
||||
now_pushing = 0
|
||||
return
|
||||
|
||||
if(!(tmob.status_flags & CANPUSH))
|
||||
now_pushing = 0
|
||||
return
|
||||
@@ -216,21 +224,19 @@
|
||||
now_pushing = 0
|
||||
spawn(0)
|
||||
..()
|
||||
if (!istype(AM, /atom/movable))
|
||||
if(!istype(AM, /atom/movable))
|
||||
return
|
||||
if (!now_pushing)
|
||||
if(!now_pushing)
|
||||
now_pushing = 1
|
||||
|
||||
if (!AM.anchored)
|
||||
if(!AM.anchored)
|
||||
var/t = get_dir(src, AM)
|
||||
if (istype(AM, /obj/structure/window/full))
|
||||
for(var/obj/structure/window/win in get_step(AM,t))
|
||||
if(istype(AM, /obj/structure/window/full))
|
||||
for(var/obj/structure/window/win in get_step(AM, t))
|
||||
now_pushing = 0
|
||||
return
|
||||
step(AM, t)
|
||||
now_pushing = 0
|
||||
return
|
||||
return
|
||||
|
||||
/mob/living/carbon/human/Stat()
|
||||
..()
|
||||
@@ -246,11 +252,11 @@
|
||||
if(eta_status)
|
||||
stat(null, eta_status)
|
||||
|
||||
if (client.statpanel == "Status")
|
||||
if(client.statpanel == "Status")
|
||||
if(locate(/obj/item/device/assembly/health) in src)
|
||||
stat(null, "Health: [health]")
|
||||
if (internal)
|
||||
if (!internal.air_contents)
|
||||
if(internal)
|
||||
if(!internal.air_contents)
|
||||
qdel(internal)
|
||||
else
|
||||
stat("Internal Atmosphere Info", internal.name)
|
||||
@@ -279,12 +285,13 @@
|
||||
var/shielded = 0
|
||||
var/b_loss = null
|
||||
var/f_loss = null
|
||||
switch (severity)
|
||||
if (1.0)
|
||||
|
||||
switch(severity)
|
||||
if(1)
|
||||
b_loss += 500
|
||||
if (!prob(getarmor(null, "bomb")))
|
||||
if(!prob(getarmor(null, "bomb")))
|
||||
gib()
|
||||
return
|
||||
return 0
|
||||
else
|
||||
var/atom/target = get_edge_target_turf(src, get_dir(src, get_step_away(src, src)))
|
||||
throw_at(target, 200, 4)
|
||||
@@ -301,13 +308,8 @@
|
||||
limbs_affected -= 1
|
||||
else valid_limbs -= processing_dismember
|
||||
|
||||
|
||||
//return
|
||||
// var/atom/target = get_edge_target_turf(user, get_dir(src, get_step_away(user, src)))
|
||||
//user.throw_at(target, 200, 4)
|
||||
|
||||
if (2.0)
|
||||
if (!shielded)
|
||||
if(2)
|
||||
if(!shielded) //literally nothing could change shielded before this so wth
|
||||
b_loss += 60
|
||||
|
||||
f_loss += 60
|
||||
@@ -316,7 +318,7 @@
|
||||
var/obj/item/organ/external/processing_dismember
|
||||
var/list/valid_limbs = organs.Copy()
|
||||
|
||||
if (prob(getarmor(null, "bomb")))
|
||||
if(prob(getarmor(null, "bomb")))
|
||||
b_loss = b_loss/1.5
|
||||
f_loss = f_loss/1.5
|
||||
|
||||
@@ -332,15 +334,15 @@
|
||||
limbs_affected -= 1
|
||||
else valid_limbs -= processing_dismember
|
||||
|
||||
if (!istype(l_ear, /obj/item/clothing/ears/earmuffs) && !istype(r_ear, /obj/item/clothing/ears/earmuffs))
|
||||
if(!istype(l_ear, /obj/item/clothing/ears/earmuffs) && !istype(r_ear, /obj/item/clothing/ears/earmuffs))
|
||||
ear_damage += 30
|
||||
ear_deaf += 120
|
||||
if (prob(70) && !shielded)
|
||||
if(prob(70) && !shielded)
|
||||
Paralyse(10)
|
||||
|
||||
if(3.0)
|
||||
if(3)
|
||||
b_loss += 30
|
||||
if (prob(getarmor(null, "bomb")))
|
||||
if(prob(getarmor(null, "bomb")))
|
||||
b_loss = b_loss/2
|
||||
|
||||
else
|
||||
@@ -357,10 +359,10 @@
|
||||
limbs_affected -= 1
|
||||
else valid_limbs -= processing_dismember
|
||||
|
||||
if (!istype(l_ear, /obj/item/clothing/ears/earmuffs) && !istype(r_ear, /obj/item/clothing/ears/earmuffs))
|
||||
if(!istype(l_ear, /obj/item/clothing/ears/earmuffs) && !istype(r_ear, /obj/item/clothing/ears/earmuffs))
|
||||
ear_damage += 15
|
||||
ear_deaf += 60
|
||||
if (prob(50) && !shielded)
|
||||
if(prob(50) && !shielded)
|
||||
Paralyse(10)
|
||||
|
||||
var/update = 0
|
||||
@@ -368,19 +370,19 @@
|
||||
for(var/obj/item/organ/external/temp in organs)
|
||||
switch(temp.limb_name)
|
||||
if("head")
|
||||
update |= temp.take_damage(b_loss * 0.2, f_loss * 0.2, used_weapon = weapon_message)
|
||||
update |= temp.take_damage(b_loss * 0.2, f_loss * 0.2, used_weapon = weapon_message)
|
||||
if("chest")
|
||||
update |= temp.take_damage(b_loss * 0.4, f_loss * 0.4, used_weapon = weapon_message)
|
||||
update |= temp.take_damage(b_loss * 0.4, f_loss * 0.4, used_weapon = weapon_message)
|
||||
if("groin")
|
||||
update |= temp.take_damage(b_loss * 0.1, f_loss * 0.1, used_weapon = weapon_message)
|
||||
update |= temp.take_damage(b_loss * 0.1, f_loss * 0.1, used_weapon = weapon_message)
|
||||
if("l_arm")
|
||||
update |= temp.take_damage(b_loss * 0.05, f_loss * 0.05, used_weapon = weapon_message)
|
||||
update |= temp.take_damage(b_loss * 0.05, f_loss * 0.05, used_weapon = weapon_message)
|
||||
if("r_arm")
|
||||
update |= temp.take_damage(b_loss * 0.05, f_loss * 0.05, used_weapon = weapon_message)
|
||||
update |= temp.take_damage(b_loss * 0.05, f_loss * 0.05, used_weapon = weapon_message)
|
||||
if("l_leg")
|
||||
update |= temp.take_damage(b_loss * 0.05, f_loss * 0.05, used_weapon = weapon_message)
|
||||
update |= temp.take_damage(b_loss * 0.05, f_loss * 0.05, used_weapon = weapon_message)
|
||||
if("r_leg")
|
||||
update |= temp.take_damage(b_loss * 0.05, f_loss * 0.05, used_weapon = weapon_message)
|
||||
update |= temp.take_damage(b_loss * 0.05, f_loss * 0.05, used_weapon = weapon_message)
|
||||
if("r_foot")
|
||||
update |= temp.take_damage(b_loss * 0.025, f_loss * 0.025, used_weapon = weapon_message)
|
||||
if("l_foot")
|
||||
@@ -394,12 +396,12 @@
|
||||
..()
|
||||
|
||||
/mob/living/carbon/human/blob_act()
|
||||
if(stat == DEAD) return
|
||||
if(stat == DEAD)
|
||||
return
|
||||
show_message("<span class='userdanger'>The blob attacks you!</span>")
|
||||
var/dam_zone = pick("head", "chest", "groin", "l_arm", "l_hand", "r_arm", "r_hand", "l_leg", "l_foot", "r_leg", "r_foot")
|
||||
var/obj/item/organ/external/affecting = get_organ(ran_zone(dam_zone))
|
||||
apply_damage(5, BRUTE, affecting, run_armor_check(affecting, "melee"))
|
||||
return
|
||||
|
||||
/mob/living/carbon/human/attack_animal(mob/living/simple_animal/M as mob)
|
||||
if(M.melee_damage_upper == 0)
|
||||
@@ -1838,9 +1840,9 @@
|
||||
/mob/living/carbon/human/proc/get_full_print()
|
||||
if(!dna || !dna.uni_identity)
|
||||
return
|
||||
return md5(dna.uni_identity)
|
||||
return md5(dna.uni_identity)
|
||||
|
||||
/mob/living/carbon/human/can_see_reagents()
|
||||
for(var/obj/item/clothing/C in src) //If they have some clothing equipped that lets them see reagents, they can see reagents
|
||||
if(C.scan_reagents)
|
||||
return 1
|
||||
return 1
|
||||
|
||||
@@ -1,51 +1,50 @@
|
||||
/mob/living/carbon/human/attack_alien(mob/living/carbon/alien/humanoid/M as mob)
|
||||
if(check_shields(0, M.name))
|
||||
visible_message("\red <B>[M] attempted to touch [src]!</B>")
|
||||
visible_message("<span class='danger'>[M] attempted to touch [src]!</span>")
|
||||
return 0
|
||||
|
||||
switch(M.a_intent)
|
||||
if (I_HELP)
|
||||
visible_message(text("\blue [M] caresses [src] with its scythe like arm."))
|
||||
if (I_GRAB)
|
||||
if(I_HELP)
|
||||
visible_message("<span class='notice'>[M] caresses [src] with its scythe like arm.</span>")
|
||||
|
||||
if(I_GRAB)
|
||||
grabbedby(M)
|
||||
|
||||
if(I_HARM)
|
||||
M.do_attack_animation(src)
|
||||
if (w_uniform)
|
||||
if(w_uniform)
|
||||
w_uniform.add_fingerprint(M)
|
||||
|
||||
var/damage = rand(15, 30)
|
||||
if(!damage)
|
||||
playsound(loc, 'sound/weapons/slashmiss.ogg', 50, 1, -1)
|
||||
visible_message("\red <B>[M] has lunged at [src]!</B>")
|
||||
visible_message("<span class='danger'>[M] has lunged at [src]!</span>")
|
||||
return 0
|
||||
|
||||
var/obj/item/organ/external/affecting = get_organ(ran_zone(M.zone_sel.selecting))
|
||||
var/armor_block = run_armor_check(affecting, "melee")
|
||||
|
||||
playsound(loc, 'sound/weapons/slice.ogg', 25, 1, -1)
|
||||
visible_message("\red <B>[M] has slashed at [src]!</B>")
|
||||
visible_message("<span class='danger'>[M] has slashed at [src]!</span>")
|
||||
|
||||
apply_damage(damage, BRUTE, affecting, armor_block)
|
||||
if (damage >= 25)
|
||||
visible_message("\red <B>[M] has wounded [src]!</B>")
|
||||
if(damage >= 25)
|
||||
visible_message("<span class='danger'>[M] has wounded [src]!</span>")
|
||||
apply_effect(4, WEAKEN, armor_block)
|
||||
updatehealth()
|
||||
|
||||
if(I_DISARM)
|
||||
M.do_attack_animation(src)
|
||||
var/randn = rand(1, 100)
|
||||
if (randn <= 80)
|
||||
if(prob(80))
|
||||
var/obj/item/organ/external/affecting = get_organ(ran_zone(M.zone_sel.selecting))
|
||||
playsound(loc, 'sound/weapons/pierce.ogg', 25, 1, -1)
|
||||
apply_effect(5, WEAKEN, run_armor_check(affecting, "melee"))
|
||||
for(var/mob/O in viewers(src, null))
|
||||
if ((O.client && !( O.blinded )))
|
||||
O.show_message(text("\red <B>[] has tackled down []!</B>", M, src), 1)
|
||||
visible_message("<span class='danger'>[M] has tackled down [src]!</span>")
|
||||
else
|
||||
if (randn <= 99)
|
||||
if(prob(99)) //this looks fucking stupid but it was previously 'var/randn = rand(1, 100); if(randn <= 99)'
|
||||
playsound(loc, 'sound/weapons/slash.ogg', 25, 1, -1)
|
||||
drop_item()
|
||||
visible_message(text("\red <B>[] disarmed []!</B>", M, src))
|
||||
visible_message("<span class='danger'>[M] disarmed [src]!</span>")
|
||||
else
|
||||
playsound(loc, 'sound/weapons/slashmiss.ogg', 50, 1, -1)
|
||||
visible_message(text("\red <B>[] has tried to disarm []!</B>", M, src))
|
||||
return
|
||||
visible_message("<span class='danger'>[M] has tried to disarm [src]!</span>")
|
||||
@@ -4,26 +4,30 @@
|
||||
health = 100
|
||||
stat = CONSCIOUS
|
||||
return
|
||||
var/total_burn = 0
|
||||
var/total_brute = 0
|
||||
|
||||
var/total_burn = 0
|
||||
var/total_brute = 0
|
||||
|
||||
for(var/obj/item/organ/external/O in organs) //hardcoded to streamline things a bit
|
||||
total_brute += O.brute_dam
|
||||
total_brute += O.brute_dam //calculates health based on organ brute and burn
|
||||
total_burn += O.burn_dam
|
||||
|
||||
health = 100 - getOxyLoss() - getToxLoss() - getCloneLoss() - total_burn - total_brute
|
||||
|
||||
//TODO: fix husking
|
||||
if( (((100 - total_burn) < config.health_threshold_dead) && stat == DEAD))//100 only being used as the magic human max health number, feel free to change it if you add a var for it -- Urist
|
||||
ChangeToHusk()
|
||||
if(((100 - total_burn) < config.health_threshold_dead) && stat == DEAD) //100 is the magic human max health number
|
||||
ChangeToHusk() //BECAUSE NO ONE THOUGHT TO USE LIVING/VAR/MAXHEALTH I GUESS
|
||||
if(species.can_revive_by_healing)
|
||||
var/obj/item/organ/brain/B = internal_organs_by_name["brain"]
|
||||
if(B)
|
||||
if((health >= (config.health_threshold_dead/100*75)) && stat == DEAD)
|
||||
if((health >= (config.health_threshold_dead / 100 * 75)) && stat == DEAD)
|
||||
update_revive()
|
||||
if (stat == CONSCIOUS && (src in dead_mob_list)) //Defib fix
|
||||
if(stat == CONSCIOUS && (src in dead_mob_list)) //Defib fix
|
||||
update_revive()
|
||||
return
|
||||
|
||||
/mob/living/carbon/human/adjustBrainLoss(var/amount)
|
||||
if(status_flags & GODMODE) return 0 //godmode
|
||||
if(status_flags & GODMODE)
|
||||
return 0 //godmode
|
||||
|
||||
if(species && species.has_organ["brain"])
|
||||
var/obj/item/organ/brain/sponge = internal_organs_by_name["brain"]
|
||||
@@ -36,7 +40,8 @@
|
||||
brainloss = 0
|
||||
|
||||
/mob/living/carbon/human/setBrainLoss(var/amount)
|
||||
if(status_flags & GODMODE) return 0 //godmode
|
||||
if(status_flags & GODMODE)
|
||||
return 0 //godmode
|
||||
|
||||
if(species && species.has_organ["brain"])
|
||||
var/obj/item/organ/brain/sponge = internal_organs_by_name["brain"]
|
||||
@@ -49,7 +54,8 @@
|
||||
brainloss = 0
|
||||
|
||||
/mob/living/carbon/human/getBrainLoss()
|
||||
if(status_flags & GODMODE) return 0 //godmode
|
||||
if(status_flags & GODMODE)
|
||||
return 0 //godmode
|
||||
|
||||
if(species && species.has_organ["brain"])
|
||||
var/obj/item/organ/brain/sponge = internal_organs_by_name["brain"]
|
||||
@@ -143,34 +149,39 @@
|
||||
return
|
||||
|
||||
var/heal_prob = max(0, 80 - getCloneLoss())
|
||||
var/mut_prob = min(80, getCloneLoss()+10)
|
||||
if (amount > 0)
|
||||
if (prob(mut_prob))
|
||||
var/list/obj/item/organ/external/candidates = list()
|
||||
for (var/obj/item/organ/external/O in organs)
|
||||
if(O.status & ORGAN_ROBOT) continue
|
||||
var/mut_prob = min(80, getCloneLoss() + 10)
|
||||
if(amount > 0) //cloneloss is being added
|
||||
if(prob(mut_prob))
|
||||
var/list/obj/item/organ/external/candidates = list() //TYPECASTED LISTS ARE NOT A FUCKING THING WHAT THE FUCK
|
||||
for(var/obj/item/organ/external/O in organs)
|
||||
if(O.status & ORGAN_ROBOT)
|
||||
continue
|
||||
if(!(O.status & ORGAN_MUTATED))
|
||||
candidates |= O
|
||||
if (candidates.len)
|
||||
|
||||
if(candidates.len)
|
||||
var/obj/item/organ/external/O = pick(candidates)
|
||||
O.mutate()
|
||||
src << "<span class = 'notice'>Something is not right with your [O.name]...</span>"
|
||||
src << "<span class='notice'>Something is not right with your [O.name]...</span>"
|
||||
O.add_autopsy_data("Mutation", amount)
|
||||
return
|
||||
else
|
||||
if (prob(heal_prob))
|
||||
for (var/obj/item/organ/external/O in organs)
|
||||
if (O.status & ORGAN_MUTATED)
|
||||
|
||||
else //cloneloss is being subtracted
|
||||
if(prob(heal_prob))
|
||||
for(var/obj/item/organ/external/O in organs)
|
||||
if(O.status & ORGAN_MUTATED)
|
||||
O.unmutate()
|
||||
src << "<span class = 'notice'>Your [O.name] is shaped normally again.</span>"
|
||||
src << "<span class='notice'>Your [O.name] is shaped normally again.</span>"
|
||||
return
|
||||
|
||||
if (getCloneLoss() < 1)
|
||||
for (var/obj/item/organ/external/O in organs)
|
||||
if (O.status & ORGAN_MUTATED)
|
||||
|
||||
if(getCloneLoss() < 1) //no cloneloss, fixes organs
|
||||
for(var/obj/item/organ/external/O in organs)
|
||||
if(O.status & ORGAN_MUTATED)
|
||||
O.unmutate()
|
||||
src << "<span class = 'notice'>Your [O.name] is shaped normally again.</span>"
|
||||
hud_updateflag |= 1 << HEALTH_HUD
|
||||
src << "<span class='notice'>Your [O.name] is shaped normally again.</span>"
|
||||
|
||||
hud_updateflag |= 1 << HEALTH_HUD //what even is this shit
|
||||
|
||||
// Defined here solely to take species flags into account without having to recast at mob/living level.
|
||||
/mob/living/carbon/human/getOxyLoss()
|
||||
@@ -186,7 +197,7 @@
|
||||
|
||||
/mob/living/carbon/human/setOxyLoss(var/amount)
|
||||
if(species.flags & NO_BREATHE)
|
||||
oxyloss = 0
|
||||
oxyloss = 0 //this literally overrides three procs, excessive much?
|
||||
else
|
||||
..()
|
||||
|
||||
@@ -203,7 +214,7 @@
|
||||
|
||||
/mob/living/carbon/human/setToxLoss(var/amount)
|
||||
if(species.flags & NO_POISON)
|
||||
toxloss = 0
|
||||
toxloss = 0 //this *also* overrides three procs, definately excessive
|
||||
else
|
||||
..()
|
||||
|
||||
@@ -230,7 +241,8 @@
|
||||
//It automatically updates health status
|
||||
/mob/living/carbon/human/heal_organ_damage(var/brute, var/burn)
|
||||
var/list/obj/item/organ/external/parts = get_damaged_organs(brute,burn)
|
||||
if(!parts.len) return
|
||||
if(!parts.len)
|
||||
return
|
||||
var/obj/item/organ/external/picked = pick(parts)
|
||||
if(picked.heal_damage(brute,burn))
|
||||
UpdateDamageIcon()
|
||||
@@ -242,7 +254,8 @@
|
||||
//It automatically updates health status
|
||||
/mob/living/carbon/human/take_organ_damage(var/brute, var/burn, var/sharp = 0, var/edge = 0)
|
||||
var/list/obj/item/organ/external/parts = get_damageable_organs()
|
||||
if(!parts.len) return
|
||||
if(!parts.len)
|
||||
return
|
||||
var/obj/item/organ/external/picked = pick(parts)
|
||||
if(picked.take_damage(brute,burn,sharp,edge))
|
||||
UpdateDamageIcon()
|
||||
@@ -256,7 +269,7 @@
|
||||
var/list/obj/item/organ/external/parts = get_damaged_organs(brute,burn)
|
||||
|
||||
var/update = 0
|
||||
while(parts.len && (brute>0 || burn>0) )
|
||||
while(parts.len && ( brute > 0 || burn > 0) )
|
||||
var/obj/item/organ/external/picked = pick(parts)
|
||||
|
||||
var/brute_was = picked.brute_dam
|
||||
@@ -268,15 +281,19 @@
|
||||
burn -= (burn_was-picked.burn_dam)
|
||||
|
||||
parts -= picked
|
||||
|
||||
updatehealth()
|
||||
hud_updateflag |= 1 << HEALTH_HUD
|
||||
speech_problem_flag = 1
|
||||
if(update) UpdateDamageIcon()
|
||||
if(update)
|
||||
UpdateDamageIcon()
|
||||
|
||||
// damage MANY external organs, in random order
|
||||
/mob/living/carbon/human/take_overall_damage(var/brute, var/burn, var/sharp = 0, var/edge = 0, var/used_weapon = null)
|
||||
if(status_flags & GODMODE) return //godmode
|
||||
if(status_flags & GODMODE)
|
||||
return //godmode
|
||||
var/list/obj/item/organ/external/parts = get_damageable_organs()
|
||||
|
||||
var/update = 0
|
||||
while(parts.len && (brute>0 || burn>0) )
|
||||
var/obj/item/organ/external/picked = pick(parts)
|
||||
@@ -289,9 +306,11 @@
|
||||
burn -= (picked.burn_dam - burn_was)
|
||||
|
||||
parts -= picked
|
||||
|
||||
updatehealth()
|
||||
hud_updateflag |= 1 << HEALTH_HUD
|
||||
if(update) UpdateDamageIcon()
|
||||
if(update)
|
||||
UpdateDamageIcon()
|
||||
|
||||
|
||||
////////////////////////////////////////////
|
||||
@@ -302,7 +321,7 @@ This function restores the subjects blood to max.
|
||||
/mob/living/carbon/human/proc/restore_blood()
|
||||
if(!(species.flags & NO_BLOOD))
|
||||
var/blood_volume = vessel.get_reagent_amount("blood")
|
||||
vessel.add_reagent("blood",560.0-blood_volume)
|
||||
vessel.add_reagent("blood", 560.0 - blood_volume)
|
||||
|
||||
/*
|
||||
This function restores all organs.
|
||||
@@ -314,47 +333,43 @@ This function restores all organs.
|
||||
/mob/living/carbon/human/proc/HealDamage(zone, brute, burn)
|
||||
var/obj/item/organ/external/E = get_organ(zone)
|
||||
if(istype(E, /obj/item/organ/external))
|
||||
if (E.heal_damage(brute, burn))
|
||||
if(E.heal_damage(brute, burn))
|
||||
UpdateDamageIcon()
|
||||
hud_updateflag |= 1 << HEALTH_HUD
|
||||
else
|
||||
return 0
|
||||
return
|
||||
|
||||
|
||||
/mob/living/carbon/human/proc/get_organ(var/zone)
|
||||
if(!zone) zone = "chest"
|
||||
if (zone in list( "eyes", "mouth" ))
|
||||
if(!zone)
|
||||
zone = "chest"
|
||||
if(zone in list("eyes", "mouth"))
|
||||
zone = "head"
|
||||
|
||||
return organs_by_name[zone]
|
||||
|
||||
/mob/living/carbon/human/apply_damage(var/damage = 0, var/damagetype = BRUTE, var/def_zone = null, var/blocked = 0, var/sharp = 0, var/edge = 0, var/obj/used_weapon = null)
|
||||
|
||||
//visible_message("Hit debug. [damage] | [damagetype] | [def_zone] | [blocked] | [sharp] | [used_weapon]")
|
||||
|
||||
//Handle other types of damage
|
||||
if((damagetype != BRUTE) && (damagetype != BURN))
|
||||
if(damagetype == HALLOSS)
|
||||
if ((damage > 25 && prob(20)) || (damage > 50 && prob(60)))
|
||||
emote("scream")
|
||||
|
||||
|
||||
..(damage, damagetype, def_zone, blocked)
|
||||
return 1
|
||||
|
||||
//Handle BRUTE and BURN damage
|
||||
handle_suit_punctures(damagetype, damage)
|
||||
|
||||
blocked = (100-blocked)/100
|
||||
if(blocked <= 0) return 0
|
||||
blocked = (100 - blocked) / 100
|
||||
if(blocked <= 0)
|
||||
return 0
|
||||
|
||||
var/obj/item/organ/external/organ = null
|
||||
if(isorgan(def_zone))
|
||||
organ = def_zone
|
||||
else
|
||||
if(!def_zone) def_zone = ran_zone(def_zone)
|
||||
if(!def_zone)
|
||||
def_zone = ran_zone(def_zone)
|
||||
organ = get_organ(check_zone(def_zone))
|
||||
if(!organ) return 0
|
||||
if(!organ)
|
||||
return 0
|
||||
|
||||
damage = damage * blocked
|
||||
|
||||
@@ -362,28 +377,33 @@ This function restores all organs.
|
||||
if(BRUTE)
|
||||
damageoverlaytemp = 20
|
||||
if(species && species.brute_mod)
|
||||
damage = damage*species.brute_mod
|
||||
damage = damage * species.brute_mod
|
||||
|
||||
if(organ.take_damage(damage, 0, sharp, edge, used_weapon))
|
||||
UpdateDamageIcon()
|
||||
if(LAssailant && ishuman(LAssailant))
|
||||
|
||||
if(LAssailant && ishuman(LAssailant)) //superheros still get the comical hit markers
|
||||
var/mob/living/carbon/human/H = LAssailant
|
||||
if(H.mind && H.mind in (ticker.mode.superheroes || ticker.mode.supervillains || ticker.mode.greyshirts))
|
||||
var/list/attack_bubble_recipients = list()
|
||||
var/mob/living/user
|
||||
for(var/mob/O in viewers(user, src))
|
||||
if (O.client && !( O.blinded ))
|
||||
if (O.client && !(O.blinded))
|
||||
attack_bubble_recipients.Add(O.client)
|
||||
spawn(0)
|
||||
var/image/dmgIcon = image('icons/effects/hit_blips.dmi', src, "dmg[rand(1,2)]",MOB_LAYER+1)
|
||||
dmgIcon.pixel_x = (!lying) ? rand(-3,3) : rand(-11,12)
|
||||
dmgIcon.pixel_y = (!lying) ? rand(-11,9) : rand(-10,1)
|
||||
//world << "x: [dmgIcon.pixel_x] AND y: [dmgIcon.pixel_y]"
|
||||
flick_overlay(dmgIcon, attack_bubble_recipients, 9)
|
||||
|
||||
receive_damage()
|
||||
|
||||
if(BURN)
|
||||
damageoverlaytemp = 20
|
||||
|
||||
if(species && species.burn_mod)
|
||||
damage = damage*species.burn_mod
|
||||
damage = damage * species.burn_mod
|
||||
|
||||
if(organ.take_damage(0, damage, sharp, edge, used_weapon))
|
||||
UpdateDamageIcon()
|
||||
|
||||
|
||||
@@ -51,7 +51,7 @@
|
||||
if(status_flags & GOTTAGOREALLYFAST)
|
||||
tally -= 2
|
||||
|
||||
return (tally+config.human_delay)
|
||||
return (tally + config.human_delay)
|
||||
|
||||
/mob/living/carbon/human/Process_Spacemove(movement_dir = 0)
|
||||
|
||||
@@ -89,4 +89,4 @@
|
||||
if(!has_gravity(loc))
|
||||
return
|
||||
var/obj/item/clothing/shoes/S = shoes
|
||||
S.step_action(src)
|
||||
S.step_action(src)
|
||||
@@ -136,6 +136,7 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc
|
||||
var/y_offset = pixel_y + rand(-1,1)
|
||||
animate(src, pixel_x = pixel_x + x_offset, pixel_y = pixel_y + y_offset, time = 1)
|
||||
animate(pixel_x = initial(pixel_x) , pixel_y = initial(pixel_y), time = 1)
|
||||
|
||||
if (disabilities & NERVOUS)
|
||||
speech_problem_flag = 1
|
||||
if (prob(10))
|
||||
@@ -143,12 +144,38 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc
|
||||
|
||||
if (getBrainLoss() >= 60 && stat != 2)
|
||||
speech_problem_flag = 1
|
||||
if (prob(3))
|
||||
if(prob(3))
|
||||
var/list/s1 = list("IM A PONY NEEEEEEIIIIIIIIIGH",
|
||||
"without oxigen blob don't evoluate?",
|
||||
"CAPTAINS A COMDOM",
|
||||
"[pick("", "that damn traitor")] [pick("joerge", "george", "gorge", "gdoruge")] [pick("mellens", "melons", "mwrlins")] is grifing me HAL;P!!!",
|
||||
"can u give me [pick("telikesis","halk","eppilapse")]?",
|
||||
"THe saiyans screwed",
|
||||
"Bi is THE BEST OF BOTH WORLDS>",
|
||||
"I WANNA PET TEH monkeyS",
|
||||
"stop grifing me!!!!",
|
||||
"SOTP IT#")
|
||||
|
||||
var/list/s2 = list("FUS RO DAH",
|
||||
"fucking 4rries!",
|
||||
"stat me",
|
||||
">my face",
|
||||
"roll it easy!",
|
||||
"waaaaaagh!!!",
|
||||
"red wonz go fasta",
|
||||
"FOR TEH EMPRAH",
|
||||
"lol2cat",
|
||||
"dem dwarfs man, dem dwarfs",
|
||||
"SPESS MAHREENS",
|
||||
"hwee did eet fhor khayosss",
|
||||
"lifelike texture ;_;",
|
||||
"luv can bloooom",
|
||||
"PACKETS!!!")
|
||||
switch(pick(1,2,3))
|
||||
if(1)
|
||||
say(pick("IM A PONY NEEEEEEIIIIIIIIIGH", "without oxigen blob don't evoluate?", "CAPTAINS A COMDOM", "[pick("", "that damn traitor")] [pick("joerge", "george", "gorge", "gdoruge")] [pick("mellens", "melons", "mwrlins")] is grifing me HAL;P!!!", "can u give me [pick("telikesis","halk","eppilapse")]?", "THe saiyans screwed", "Bi is THE BEST OF BOTH WORLDS>", "I WANNA PET TEH monkeyS", "stop grifing me!!!!", "SOTP IT#"))
|
||||
say(pick(s1))
|
||||
if(2)
|
||||
say(pick("FUS RO DAH","fucking 4rries!", "stat me", ">my face", "roll it easy!", "waaaaaagh!!!", "red wonz go fasta", "FOR TEH EMPRAH", "lol2cat", "dem dwarfs man, dem dwarfs", "SPESS MAHREENS", "hwee did eet fhor khayosss", "lifelike texture ;_;", "luv can bloooom", "PACKETS!!!"))
|
||||
say(pick(s2))
|
||||
if(3)
|
||||
emote("drool")
|
||||
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
pass_flags = PASSTABLE
|
||||
braintype = "Robot"
|
||||
lawupdate = 0
|
||||
density = 1
|
||||
density = 0
|
||||
req_access = list(access_engine, access_robotics)
|
||||
local_transmit = 1
|
||||
|
||||
@@ -335,4 +335,8 @@
|
||||
src.verbs |= silicon_subsystems
|
||||
|
||||
/mob/living/silicon/robot/drone/remove_robot_verbs()
|
||||
src.verbs -= silicon_subsystems
|
||||
src.verbs -= silicon_subsystems
|
||||
|
||||
/mob/living/silicon/robot/drone/update_canmove()
|
||||
. = ..()
|
||||
density = 0 //this is reset every canmove update otherwise
|
||||
Reference in New Issue
Block a user