mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-08-28 22:47:59 +01:00
#Fixed Chaplain hoodie sprite.
#Respawn_character() now properly respawns aliens and monkeys if specified to do so. #Added more options in admin quick panel (for players) to get, send, check if traitor, narrate, and subtle message mob. #Admins can now click an X by admin name, in asay, to jump to that admin. Makes things easier. #Moved admin transform verbs into fun tab. #Removed boom boom shake the room since not even hosts are allowed to use it. #Pierrot's throat now has a 35% chance of being cured by eating bananas. Up from 5. #Fixed AI cards. #ed209 and Beepsky now properly figure in deafness when speaking. Doesn't affect voice files. #Fixed Syndicate PDA not triggering door. #Aliens can no longer magically crawl to the prison station and back. #Aliens can now quickly (5 seconds) break out of cuffs by resisting. No change to buckled. #Facehuggers will now properly set the alien_egg_flag if the target was infected or not. Curing the alien egg should also reset the flag. I think it will be best to get rid of the flag entirely in the future. #Added isalienadult(mob) proc to check for humanoid aliens. #Probably fixed death squad spawning. They pick by key now, instead of mob name. #Spawning xenos now uses the client match method so you can specify who you want to respawn if wanted. #Ninjas now tell admins what their set mission is. If given objectives by admin, it should report them at round end for certain rounds. #Spawning ninjas now uses the same method as respawn character (typing in key/ckey). #Added a ninjify admnin verb. Possible to right click. #Can now resize spiderOS window. #Misc fixes and adjustments. Minor map change to CentCom holding facility. git-svn-id: http://tgstation13.googlecode.com/svn/trunk@1685 316c924e-a436-60f5-8080-3fe189b3f50e
This commit is contained in:
+44
-42
@@ -7,7 +7,7 @@
|
||||
/*
|
||||
|
||||
IMPORTANT NOTE: Please delete the diseases by using cure() proc or del() instruction.
|
||||
Diseases are referenced in global list, so simply setting mob or obj vars
|
||||
Diseases are referenced in a global list, so simply setting mob or obj vars
|
||||
to null does not delete the object itself. Thank you.
|
||||
|
||||
*/
|
||||
@@ -53,9 +53,9 @@ to null does not delete the object itself. Thank you.
|
||||
stage++
|
||||
if(stage != 1 && (prob(1) || (cure_present && prob(cure_chance))))
|
||||
stage--
|
||||
else if(stage <= 1 && ((prob(1) && src.curable) || (cure_present && prob(cure_chance))))
|
||||
else if(stage <= 1 && ((prob(1) && curable) || (cure_present && prob(cure_chance))))
|
||||
// world << "Cured as stage act"
|
||||
src.cure()
|
||||
cure()
|
||||
return
|
||||
return
|
||||
|
||||
@@ -83,7 +83,7 @@ to null does not delete the object itself. Thank you.
|
||||
|
||||
/mob/proc/contract_disease(var/datum/disease/virus, var/skip_this = 0, var/force_species_check=1)
|
||||
// world << "Contract_disease called by [src] with virus [virus]"
|
||||
if(src.stat >=2) return
|
||||
if(stat >=2) return
|
||||
|
||||
|
||||
if(force_species_check)
|
||||
@@ -96,21 +96,21 @@ to null does not delete the object itself. Thank you.
|
||||
if(fail) return
|
||||
|
||||
if(skip_this == 1)//be wary, it replaces the current disease...
|
||||
if(src.virus)
|
||||
src.virus.cure(0)
|
||||
src.virus = new virus.type
|
||||
src.virus.affected_mob = src
|
||||
src.virus.strain_data = virus.strain_data.Copy()
|
||||
src.virus.holder = src
|
||||
if(virus)
|
||||
virus.cure(0)
|
||||
virus = new virus.type
|
||||
virus.affected_mob = src
|
||||
virus.strain_data = virus.strain_data.Copy()
|
||||
virus.holder = src
|
||||
if(prob(5))
|
||||
src.virus.carrier = 1
|
||||
virus.carrier = 1
|
||||
return
|
||||
|
||||
if(src.virus) return
|
||||
if(virus) return
|
||||
|
||||
if(virus.type in src.resistances)
|
||||
if(virus.type in resistances)
|
||||
if(prob(99.9)) return
|
||||
src.resistances.Remove(virus.type)//the resistance is futile
|
||||
resistances.Remove(virus.type)//the resistance is futile
|
||||
|
||||
|
||||
/*
|
||||
@@ -218,7 +218,7 @@ to null does not delete the object itself. Thank you.
|
||||
passed = prob(Cl.permeability_coefficient*100+virus.permeability_mod)
|
||||
//world << "Mask pass [passed]"
|
||||
|
||||
if(passed && virus.spread_type == AIRBORNE && src.internals)
|
||||
if(passed && virus.spread_type == AIRBORNE && internals)
|
||||
passed = (prob(50*virus.permeability_mod))
|
||||
|
||||
if(passed)
|
||||
@@ -233,11 +233,11 @@ to null does not delete the object itself. Thank you.
|
||||
if(istype(src:wear_suit, /obj/item/clothing/suit/bio_suit)) score += 10
|
||||
if(istype(src:head, /obj/item/clothing/head/helmet/space)) score += 5
|
||||
if(istype(src:head, /obj/item/clothing/head/bio_hood)) score += 5
|
||||
if(src.wear_mask)
|
||||
if(wear_mask)
|
||||
score += 5
|
||||
if((istype(src:wear_mask, /obj/item/clothing/mask) || istype(src:wear_mask, /obj/item/clothing/mask/surgical)) && !src.internal)
|
||||
if((istype(src:wear_mask, /obj/item/clothing/mask) || istype(src:wear_mask, /obj/item/clothing/mask/surgical)) && !internal)
|
||||
score += 5
|
||||
if(src.internal)
|
||||
if(internal)
|
||||
score += 5
|
||||
if(score > 20)
|
||||
return
|
||||
@@ -252,33 +252,33 @@ to null does not delete the object itself. Thank you.
|
||||
else if(prob(15))
|
||||
return
|
||||
else*/
|
||||
src.virus = new virus.type
|
||||
src.virus.strain_data = virus.strain_data.Copy()
|
||||
src.virus.affected_mob = src
|
||||
src.virus.holder = src
|
||||
virus = new virus.type
|
||||
virus.strain_data = virus.strain_data.Copy()
|
||||
virus.affected_mob = src
|
||||
virus.holder = src
|
||||
if(prob(5))
|
||||
src.virus.carrier = 1
|
||||
virus.carrier = 1
|
||||
return
|
||||
return
|
||||
|
||||
|
||||
/datum/disease/proc/spread(var/source=null)
|
||||
//world << "Disease [src] proc spread was called from holder [source]"
|
||||
if(src.spread_type == SPECIAL)//does not spread
|
||||
if(spread_type == SPECIAL)//does not spread
|
||||
return
|
||||
|
||||
if(src.stage < src.contagious_period) //the disease is not contagious at this stage
|
||||
if(stage < contagious_period) //the disease is not contagious at this stage
|
||||
return
|
||||
|
||||
if(!source)//no holder specified
|
||||
if(src.affected_mob)//no mob affected holder
|
||||
source = src.affected_mob
|
||||
if(affected_mob)//no mob affected holder
|
||||
source = affected_mob
|
||||
else //no source and no mob affected. Rogue disease. Break
|
||||
return
|
||||
|
||||
|
||||
var/check_range = AIRBORNE//defaults to airborne - range 4
|
||||
if(src.spread_type != AIRBORNE)
|
||||
if(spread_type != AIRBORNE)
|
||||
check_range = 0
|
||||
|
||||
for(var/mob/living/carbon/M in oviewers(check_range, source))
|
||||
@@ -288,27 +288,29 @@ to null does not delete the object itself. Thank you.
|
||||
|
||||
|
||||
/datum/disease/proc/process()
|
||||
if(!src.holder) return
|
||||
if(!holder) return
|
||||
if(prob(40))
|
||||
src.spread(holder)
|
||||
if(src.holder == src.affected_mob)
|
||||
spread(holder)
|
||||
if(holder == affected_mob)
|
||||
if(affected_mob.stat < 2) //he's alive
|
||||
src.stage_act()
|
||||
stage_act()
|
||||
else //he's dead.
|
||||
if(src.spread_type!=SPECIAL)
|
||||
src.spread_type = CONTACT_GENERAL
|
||||
src.affected_mob = null
|
||||
if(!src.affected_mob) //the virus is in inanimate obj
|
||||
// world << "[src] longevity = [src.longevity]"
|
||||
if(--src.longevity<=0)
|
||||
src.cure(0)
|
||||
if(spread_type!=SPECIAL)
|
||||
spread_type = CONTACT_GENERAL
|
||||
affected_mob = null
|
||||
if(!affected_mob) //the virus is in inanimate obj
|
||||
// world << "[src] longevity = [longevity]"
|
||||
if(--longevity<=0)
|
||||
cure(0)
|
||||
return
|
||||
|
||||
/datum/disease/proc/cure(var/resistance=1)//if resistance = 0, the mob won't develop resistance to disease
|
||||
if(resistance && src.affected_mob && !(src.type in affected_mob.resistances))
|
||||
if(resistance && affected_mob && !(type in affected_mob.resistances))
|
||||
// world << "Setting res to [src]"
|
||||
var/type = "[src.type]"//copy the value, not create the reference to it, so when the object is deleted, the value remains.
|
||||
affected_mob.resistances += text2path(type)
|
||||
var/saved_type = "[type]"//copy the value, not create the reference to it, so when the object is deleted, the value remains.
|
||||
affected_mob.resistances += text2path(saved_type)
|
||||
if(istype(src, /datum/disease/alien_embryo))//Get rid of the flag.
|
||||
affected_mob.alien_egg_flag = 0
|
||||
// world << "Removing [src]"
|
||||
spawn(0)
|
||||
del(src)
|
||||
|
||||
@@ -71,7 +71,10 @@
|
||||
candidates.Add(G)
|
||||
if(candidates.len)
|
||||
var/mob/dead/observer/G = pick(candidates)
|
||||
G.client.mob = new/mob/living/carbon/alien/larva(affected_mob.loc)
|
||||
var/mob/living/carbon/alien/larva/new_xeno = new(affected_mob.loc)
|
||||
new_xeno.mind_initialize(G,"Larva")
|
||||
new_xeno.key = G.key
|
||||
del(G)
|
||||
else
|
||||
if(affected_mob.client)
|
||||
affected_mob.client.mob = new/mob/living/carbon/alien/larva(affected_mob.loc)
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
spread = "Airborne"
|
||||
cure = "A whole banana."
|
||||
cure_id = "banana"
|
||||
cure_chance = 5
|
||||
cure_chance = 35
|
||||
agent = "H0NI<42 Virus"
|
||||
affected_species = list("Human")
|
||||
permeability_mod = 0.75
|
||||
|
||||
+15
-8
@@ -97,14 +97,21 @@ datum/mind
|
||||
|
||||
if (cantoggle)
|
||||
if(src in current_mode.traitors)
|
||||
if (special_role == "Fake Wizard")
|
||||
out += "<a href='?src=\ref[src];traitorize=traitor'>Traitor</a> "
|
||||
out += "<font color=red>Fake Wizard</font> "
|
||||
srole = "Fake Wizard"
|
||||
else
|
||||
out += "<b>Traitor</b> "
|
||||
out += "<a href='?src=\ref[src];traitorize=fakewizard'>Fake Wizard</a> "
|
||||
srole = "Traitor"
|
||||
switch(special_role)
|
||||
if ("Fake Wizard")
|
||||
out += "<a href='?src=\ref[src];traitorize=traitor'>Traitor</a> "
|
||||
out += "<font color=red>[special_role]/font> "
|
||||
srole = special_role
|
||||
if ("Death Commando")
|
||||
out += "<font color=red>[special_role]</font> "
|
||||
srole = special_role
|
||||
if ("Space Ninja")
|
||||
out += "<font color=red>[special_role]</font> "
|
||||
srole = special_role
|
||||
else
|
||||
out += "<b>Traitor</b> "
|
||||
out += "<a href='?src=\ref[src];traitorize=fakewizard'>Fake Wizard</a> "
|
||||
srole = "Traitor"
|
||||
else
|
||||
out += "<a href='?src=\ref[src];traitorize=traitor'>Traitor</a> "
|
||||
out += "<a href='?src=\ref[src];traitorize=fakewizard'>Fake Wizard</a> "
|
||||
|
||||
@@ -129,6 +129,7 @@ var
|
||||
list/latejoin = list()
|
||||
list/prisonwarp = list() //prisoners go to these
|
||||
list/holdingfacility = list() //captured people go here
|
||||
list/xeno_spawn = list()//Aliens spawn at these.
|
||||
list/mazewarp = list()
|
||||
list/tdome1 = list()
|
||||
list/tdome2 = list()
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
I'll make some notes on where certain variable defines should probably go.
|
||||
Changing this around would probably require a good look-over the pre-existing code.
|
||||
*/
|
||||
var/alien_egg_flag = 0
|
||||
var/alien_egg_flag = 0//Have you been infected?
|
||||
var/last_special = 0
|
||||
var/obj/screen/zone_sel/zone_sel = null
|
||||
|
||||
@@ -52,7 +52,7 @@
|
||||
var/stat = 0.0
|
||||
var/next_move = null
|
||||
var/prev_move = null
|
||||
var/monkeyizing = null//Human, maybe Carbon
|
||||
var/monkeyizing = null//Carbon
|
||||
var/other = 0.0
|
||||
var/hand = null
|
||||
var/eye_blind = null//Carbon
|
||||
|
||||
@@ -404,6 +404,8 @@
|
||||
obj/item/weapon/cell/cell//Starts out with a high-capacity cell using New().
|
||||
datum/effects/system/spark_spread/spark_system//To create sparks.
|
||||
reagent_list[] = list("tricordrazine","dexalinp","spaceacillin","anti_toxin","nutriment","radium","hyronalin")//The reagents ids which are added to the suit at New().
|
||||
stored_research[]//For stealing station research.
|
||||
obj/item/weapon/disk/tech_disk/t_disk//To copy design onto disk.
|
||||
|
||||
//Other articles of ninja gear worn together, used to easily reference them after initializing.
|
||||
obj/item/clothing/head/helmet/space/space_ninja/n_hood
|
||||
|
||||
@@ -78,7 +78,7 @@ Not sure why this would be useful (it's not) but whatever. Ninjas need their smo
|
||||
var/mob/living/carbon/human/U = affecting
|
||||
var/turf/destination = get_teleport_loc(U.loc,U,9,1,3,1,0,1)
|
||||
var/turf/mobloc = get_turf(U.loc)//To make sure that certain things work properly below.
|
||||
if(destination&&istype(mobloc, /turf))
|
||||
if(destination&&istype(mobloc, /turf))//The turf check prevents unusual behavior. Like teleporting out of cryo pods, cloners, mechs, etc.
|
||||
spawn(0)
|
||||
playsound(U.loc, "sparks", 50, 1)
|
||||
anim(mobloc,src,'mob.dmi',,"phaseout",,U.dir)
|
||||
@@ -112,7 +112,7 @@ Not sure why this would be useful (it's not) but whatever. Ninjas need their smo
|
||||
if(!ninjacost(C,1))
|
||||
var/mob/living/carbon/human/U = affecting
|
||||
var/turf/mobloc = get_turf(U.loc)//To make sure that certain things work properly below.
|
||||
if(!T.density&&istype(mobloc, /turf))
|
||||
if((!T.density)&&istype(mobloc, /turf))
|
||||
spawn(0)
|
||||
playsound(U.loc, 'sparks4.ogg', 50, 1)
|
||||
anim(mobloc,src,'mob.dmi',,"phaseout",,U.dir)
|
||||
|
||||
@@ -20,9 +20,12 @@ ________________________________________________________________________________
|
||||
verbs += /obj/item/clothing/suit/space/space_ninja/proc/ai_instruction//for AIs
|
||||
verbs += /obj/item/clothing/suit/space/space_ninja/proc/ai_holo
|
||||
//verbs += /obj/item/clothing/suit/space/space_ninja/proc/display_verb_procs//DEBUG. Doesn't work.
|
||||
spark_system = new /datum/effects/system/spark_spread()//spark initialize
|
||||
spark_system = new()//spark initialize
|
||||
spark_system.set_up(5, 0, src)
|
||||
spark_system.attach(src)
|
||||
stored_research = new()//Stolen research initialize.
|
||||
for(var/T in typesof(/datum/tech) - /datum/tech)//Store up on research.
|
||||
stored_research += new T(src)
|
||||
var/reagent_amount//reagent initialize
|
||||
for(var/reagent_id in reagent_list)
|
||||
reagent_amount += reagent_id == "radium" ? r_maxamount+(a_boost*a_transfer) : r_maxamount//AI can inject radium directly.
|
||||
@@ -113,7 +116,7 @@ ________________________________________________________________________________
|
||||
spawn while(cell.charge>=0)
|
||||
|
||||
//Let's check for some safeties.
|
||||
if(affecting&&affecting.monkeyizing) terminate()//Kills the suit and attached objects.
|
||||
if(s_initialized&&!affecting) terminate()//Kills the suit and attached objects.
|
||||
if(!s_initialized) return//When turned off the proc stops.
|
||||
if(AI&&AI.stat==2)//If there is an AI and it's ded. Shouldn't happen without purging, could happen.
|
||||
if(!s_control)
|
||||
@@ -266,20 +269,20 @@ ________________________________________________________________________________
|
||||
if(0)
|
||||
dat += "<h4><img src=sos_1.png> Available Functions:</h4>"
|
||||
dat += "<ul>"
|
||||
dat += "<li><a href='byond://?src=\ref[src];choice=7'><img src=sos_4.png> Research Stored</a></li>"
|
||||
if(s_control)
|
||||
dat += "<li><a href='byond://?src=\ref[src];choice=Stealth'><img src=sos_4.png> Toggle Stealth: [s_active == 1 ? "Disable" : "Enable"]</a></li>"
|
||||
if(AI)
|
||||
dat += "<li><a href='byond://?src=\ref[src];choice=5'><img src=sos_13.png> AI Status</a></li>"
|
||||
else
|
||||
dat += "<li><a href='byond://?src=\ref[src];choice=Shock'><img src=sos_4.png> Shock [U.real_name]</a></li>"
|
||||
dat += "<li><a href='byond://?src=\ref[src];choice=6'><img src=sos_6.png> Activate Abilities</a></li>"
|
||||
dat += "<li><a href='byond://?src=\ref[src];choice=1'><img src=sos_3.png> Medical Screen</a></li>"
|
||||
dat += "<li><a href='byond://?src=\ref[src];choice=2'><img src=sos_5.png> Atmos Scan</a></li>"
|
||||
dat += "<li><a href='byond://?src=\ref[src];choice=3'><img src=sos_12.png> Messenger</a></li>"
|
||||
dat += "<li><a href='byond://?src=\ref[src];choice=3'><img src=sos_3.png> Medical Screen</a></li>"
|
||||
dat += "<li><a href='byond://?src=\ref[src];choice=1'><img src=sos_5.png> Atmos Scan</a></li>"
|
||||
dat += "<li><a href='byond://?src=\ref[src];choice=2'><img src=sos_12.png> Messenger</a></li>"
|
||||
if(s_control)
|
||||
dat += "<li><a href='byond://?src=\ref[src];choice=4'><img src=sos_6.png> Other</a></li>"
|
||||
dat += "</ul>"
|
||||
if(1)
|
||||
if(3)
|
||||
dat += "<h4><img src=sos_3.png> Medical Report:</h4>"
|
||||
if(U.dna)
|
||||
dat += "<b>Fingerprints</b>: <i>[md5(U.dna.uni_identity)]</i><br>"
|
||||
@@ -300,7 +303,7 @@ ________________________________________________________________________________
|
||||
continue
|
||||
dat += "<li><a href='byond://?src=\ref[src];choice=Inject;name=[R.name];tag=[R.id]'><img src=sos_2.png> Inject [R.name]: [(reagents.get_reagent_amount(R.id)-(R.id=="radium"?(a_boost*a_transfer):0))/(R.id=="nutriment"?5:a_transfer)] left</a></li>"
|
||||
dat += "</ul>"
|
||||
if(2)
|
||||
if(1)
|
||||
dat += "<h4><img src=sos_5.png> Atmospheric Scan:</h4>"//Headers don't need breaks. They are automatically placed.
|
||||
var/turf/T = get_turf_or_move(U.loc)
|
||||
if (isnull(T))
|
||||
@@ -329,7 +332,7 @@ ________________________________________________________________________________
|
||||
dat += "OTHER: [round(unknown_level)]%<br>"
|
||||
|
||||
dat += "Temperature: [round(environment.temperature-T0C)]°C"
|
||||
if(3)
|
||||
if(2)
|
||||
if(k_unlock==7||!s_control)
|
||||
dat += "<a href='byond://?src=\ref[src];choice=32'><img src=sos_1.png> Hidden Menu</a>"
|
||||
dat += "<h4><img src=sos_12.png> Anonymous Messenger:</h4>"//Anonymous because the receiver will not know the sender's identity.
|
||||
@@ -436,10 +439,10 @@ ________________________________________________________________________________
|
||||
dat += "<h4>Laws:</h4><ul>[laws]<li><a href='byond://?src=\ref[src];choice=Override AI Laws'><i>*Override Laws*</i></a></li></ul>"
|
||||
|
||||
if (!flush)
|
||||
dat += {"<A href='byond://?src=\ref[src];choice=Purge AI'>Purge AI</A><br>"}
|
||||
dat += "<A href='byond://?src=\ref[src];choice=Purge AI'>Purge AI</A><br>"
|
||||
else
|
||||
dat += "<b>Purge in progress...</b><br>"
|
||||
dat += {" <A href='byond://?src=\ref[src];choice=Wireless AI'>[A.control_disabled ? "Enable" : "Disable"] Wireless Activity</A>"}
|
||||
dat += " <A href='byond://?src=\ref[src];choice=Wireless AI'>[A.control_disabled ? "Enable" : "Disable"] Wireless Activity</A>"
|
||||
if(6)
|
||||
dat += {"
|
||||
<h4><img src=sos_6.png> Activate Abilities:</h4>
|
||||
@@ -454,10 +457,23 @@ ________________________________________________________________________________
|
||||
<li><a href='byond://?src=\ref[src];choice=Trigger Ability;name=Adrenaline Boost;cost='><img src=sos_13.png> Adrenaline Boost</a></li>
|
||||
</ul>
|
||||
"}
|
||||
if(7)
|
||||
dat += "<h4><img src=sos_4.png> Research Stored:</h4>"
|
||||
if(t_disk)
|
||||
dat += "<a href='byond://?src=\ref[src];choice=Eject Disk'>Eject Disk</a><br>"
|
||||
dat += "<ul>"
|
||||
if(stored_research.len)//If there is stored research. Should be.
|
||||
for(var/datum/tech/current_data in stored_research)
|
||||
dat += "<li>"
|
||||
dat += "[current_data.name]: [current_data.level]"
|
||||
if(t_disk)//If there is a disk inserted. We can either write or overwrite.
|
||||
dat += " <a href='byond://?src=\ref[src];choice=Copy to Disk;target=\ref[current_data]'><i>*Copy to Disk</i></a><br>"
|
||||
dat += "</li>"
|
||||
dat += "</ul>"
|
||||
dat += "</body></html>"
|
||||
|
||||
//Setting the can>resize etc to 0 remove them from the drag bar but still allows the window to be draggable.
|
||||
display_to << browse(dat,"window=spideros;size=400x444;border=1;can_resize=0;can_close=0;can_minimize=0")
|
||||
display_to << browse(dat,"window=spideros;size=400x444;border=1;can_resize=1;can_close=0;can_minimize=0")
|
||||
|
||||
//=======//SPIDEROS TOPIC PROC//=======//
|
||||
|
||||
@@ -496,9 +512,6 @@ ________________________________________________________________________________
|
||||
else
|
||||
spideros = round(spideros/10)//Best way to do this, flooring to nearest integer.
|
||||
|
||||
if("Stealth")
|
||||
toggle_stealth()
|
||||
|
||||
if("Shock")
|
||||
var/damage = min(cell.charge, rand(50,150))//Uses either the current energy left over or between 50 and 150.
|
||||
if(damage>1)//So they don't spam it when energy is a factor.
|
||||
@@ -593,16 +606,39 @@ ________________________________________________________________________________
|
||||
spideros = 0
|
||||
s_busy = 0
|
||||
|
||||
if("Eject Disk")
|
||||
var/turf/T = get_turf(loc)
|
||||
if(!U.get_active_hand())
|
||||
U.put_in_hand(t_disk)
|
||||
t_disk.add_fingerprint(U)
|
||||
t_disk = null
|
||||
else
|
||||
if(T)
|
||||
t_disk.loc = T
|
||||
t_disk = null
|
||||
else
|
||||
U << "\red <b>ERROR<b>: \black Could not eject disk."
|
||||
|
||||
if("Copy to Disk")
|
||||
var/datum/tech/current_data = locate(href_list["target"])
|
||||
U << "[current_data.name] successfully [(!t_disk.stored) ? "copied" : "overwritten"] to disk."
|
||||
t_disk.stored = current_data
|
||||
|
||||
if("Configure pAI")
|
||||
pai.attack_self(U)
|
||||
|
||||
if("Eject pAI")
|
||||
var/turf/T = get_turf(loc)
|
||||
if(T)
|
||||
pai.loc = T
|
||||
if(!U.get_active_hand())
|
||||
U.put_in_hand(pai)
|
||||
pai.add_fingerprint(U)
|
||||
pai = null
|
||||
else
|
||||
U << "\red <b>ERROR<b>: \black Could not eject pAI card."
|
||||
if(T)
|
||||
pai.loc = T
|
||||
pai = null
|
||||
else
|
||||
U << "\red <b>ERROR<b>: \black Could not eject pAI card."
|
||||
|
||||
if("Override AI Laws")
|
||||
var/law_zero = A.laws.zeroth//Remembers law zero, if there is one.
|
||||
@@ -767,7 +803,7 @@ ________________________________________________________________________________
|
||||
U:drop_item()
|
||||
I.loc = src
|
||||
pai = I
|
||||
U << "\blue You slot \the [I] into [src]."
|
||||
U << "\blue You slot \the [I] into \the [src]."
|
||||
updateUsrDialog()
|
||||
return
|
||||
else if(istype(I, /obj/item/weapon/reagent_containers/glass))//If it's a glass beaker.
|
||||
@@ -803,6 +839,24 @@ ________________________________________________________________________________
|
||||
else
|
||||
U << "\red Procedure interrupted. Protocol terminated."
|
||||
return
|
||||
else if(istype(I, /obj/item/weapon/disk/tech_disk))//If it's a data disk, we want to copy the research on to the suit.
|
||||
if(I:stored)//If it has something on it.
|
||||
U << "Research information detected, processing..."
|
||||
if(do_after(U,s_delay))
|
||||
for(var/datum/tech/current_data in stored_research)
|
||||
if(current_data.id==I:stored.id)
|
||||
if(current_data.level<I:stored.level)
|
||||
current_data.level=I:stored.level
|
||||
break
|
||||
I:stored = null
|
||||
U << "\blue Data analyzed and updated. Disk erased."
|
||||
else
|
||||
U << "\red <b>ERROR</b>: \black Procedure interrupted. Process terminated."
|
||||
else
|
||||
I.loc = src
|
||||
t_disk = I
|
||||
U << "\blue You slot \the [I] into \the [src]."
|
||||
return
|
||||
..()
|
||||
|
||||
/obj/item/clothing/suit/space/space_ninja/proc/toggle_stealth()
|
||||
|
||||
@@ -221,7 +221,7 @@ As such, it's hard-coded for now. No reason for it not to be, really.
|
||||
*/
|
||||
/proc/generate_ninja_directive()
|
||||
var/directive
|
||||
switch(rand(1,12))
|
||||
switch(rand(1,13))
|
||||
if(1)
|
||||
directive = "The Spider Clan must not be linked to this operation. Remain as hidden and covert as possible."
|
||||
if(2)
|
||||
@@ -229,7 +229,7 @@ As such, it's hard-coded for now. No reason for it not to be, really.
|
||||
if(3)
|
||||
directive = "A wealthy animal rights activist has made a request we cannot refuse. Prioritize saving animal lives whenever possible."
|
||||
if(4)
|
||||
directive = "The Spider Clan absolutely cannot be linked to this operation. Eliminate all witnesses with most extreme prejudice."
|
||||
directive = "The Spider Clan absolutely cannot be linked to this operation. Eliminate all witnesses using most extreme prejudice."
|
||||
if(5)
|
||||
directive = "We are currently negotiating with Nanotrasen command. Prioritize saving human lives over ending them."
|
||||
if(6)
|
||||
@@ -250,12 +250,35 @@ As such, it's hard-coded for now. No reason for it not to be, really.
|
||||
directive = "There are no special directives at this time."
|
||||
return directive
|
||||
|
||||
//=======//ADMIN VERB//=======//
|
||||
//=======//CURRENT PLAYER VERB//=======//
|
||||
|
||||
/client/proc/space_ninja()
|
||||
/client/proc/cmd_admin_ninjafy(var/mob/M in world)
|
||||
set category = null
|
||||
set name = "Make Space Ninja"
|
||||
|
||||
if(!ticker)
|
||||
alert("Wait until the game starts")
|
||||
return
|
||||
if(ishuman(M))
|
||||
log_admin("[key_name(src)] turned [M.key] into a Space Ninja.")
|
||||
spawn(10)
|
||||
M:create_mind_space_ninja()
|
||||
M:equip_space_ninja(1)
|
||||
if(istype(M:wear_suit, /obj/item/clothing/suit/space/space_ninja))
|
||||
M:wear_suit:randomize_param()
|
||||
spawn(0)
|
||||
M:wear_suit:ninitialize(10,M)
|
||||
else
|
||||
alert("Invalid mob")
|
||||
|
||||
//=======//CURRENT GHOST VERB//=======//
|
||||
|
||||
/client/proc/send_space_ninja()
|
||||
set category = "Fun"
|
||||
set name = "Spawn Space Ninja"
|
||||
set desc = "Spawns a space ninja for when you need a teenager with an attitude."
|
||||
set popup_menu = 0
|
||||
|
||||
if(!authenticated || !holder)
|
||||
src << "Only administrators may use this command."
|
||||
return
|
||||
@@ -265,10 +288,10 @@ As such, it's hard-coded for now. No reason for it not to be, really.
|
||||
if(alert("Are you sure you want to send in a space ninja?",,"Yes","No")=="No")
|
||||
return
|
||||
|
||||
var/input
|
||||
while(!input)
|
||||
input = input(src, "Please specify which mission the space ninja shall undertake.", "Specify Mission", "")
|
||||
if(!input)
|
||||
var/mission
|
||||
while(!mission)
|
||||
mission = input(src, "Please specify which mission the space ninja shall undertake.", "Specify Mission", "")
|
||||
if(!mission)
|
||||
if(alert("Error, no mission set. Do you want to exit the setup process?",,"Yes","No")=="Yes")
|
||||
return
|
||||
|
||||
@@ -277,38 +300,43 @@ As such, it's hard-coded for now. No reason for it not to be, really.
|
||||
if (L.name == "carpspawn")
|
||||
spawn_list.Add(L)
|
||||
|
||||
var/admin_name = src
|
||||
var/mob/living/carbon/human/new_ninja = create_space_ninja(pick(spawn_list.len ? spawn_list : latejoin ))
|
||||
|
||||
var/input = input("Pick character to spawn as the Space Ninja", "Key", "")
|
||||
if(!input)
|
||||
return
|
||||
|
||||
var/mob/dead/observer/G
|
||||
var/list/candidates = list()
|
||||
for(G in world)
|
||||
if(G.client)//Now everyone can ninja!
|
||||
if(((G.client.inactivity/10)/60) <= 5)
|
||||
candidates.Add(G)
|
||||
if(candidates.len)
|
||||
G = input("Pick character to spawn as the Space Ninja", "Active Players", G) in candidates//It will auto-pick a person when there is only one candidate.
|
||||
new_ninja.mind.key = G.key
|
||||
new_ninja.client = G.client
|
||||
new_ninja.mind.store_memory("<B>Mission:</B> \red [input].")
|
||||
del(G)
|
||||
else
|
||||
alert("Could not locate a suitable ghost. Aborting.")
|
||||
del(new_ninja)
|
||||
for(var/mob/dead/observer/G_find in world)
|
||||
if(G_find.client&&ckey(G_find.key)==ckey(input))
|
||||
G = G_find
|
||||
break
|
||||
|
||||
if(!G)//If a ghost was not found.
|
||||
alert("There is no active key like that in the game or the person is not currently a ghost. Aborting command.")
|
||||
return
|
||||
|
||||
var/admin_name = src
|
||||
var/mob/living/carbon/human/new_ninja = create_space_ninja(pick(spawn_list.len ? spawn_list : latejoin ))
|
||||
new_ninja.wear_suit:randomize_param()
|
||||
|
||||
new_ninja.mind.key = G.key
|
||||
new_ninja.key = G.key
|
||||
new_ninja.mind.store_memory("<B>Mission:</B> \red [mission].")
|
||||
|
||||
new_ninja.internal = new_ninja.s_store //So the poor ninja has something to breath when they spawn in spess.
|
||||
new_ninja.internals.icon_state = "internal1"
|
||||
spawn(0)//Parallel process. Will speed things up a bit.
|
||||
new_ninja.wear_suit:ninitialize(10,new_ninja)//If you're wondering why I'm passing the argument to the proc when the default should suffice,
|
||||
//I'm also wondering that same thing. This makes sure it does not run time error though.
|
||||
|
||||
new_ninja.mind.store_memory("<B>Mission:</B> \red [input].")
|
||||
new_ninja << "\blue \nYou are an elite mercenary assassin of the Spider Clan, [new_ninja.real_name]. The dreaded \red <B>SPACE NINJA</B>!\blue You have a variety of abilities at your disposal, thanks to your nano-enhanced cyber armor. Remember your training (initialize your suit by right clicking on it)! \nYour current mission is: \red <B>[input]</B>"
|
||||
new_ninja << "\blue \nYou are an elite mercenary assassin of the Spider Clan, [new_ninja.real_name]. The dreaded \red <B>SPACE NINJA</B>!\blue You have a variety of abilities at your disposal, thanks to your nano-enhanced cyber armor. Remember your training (initialize your suit by right clicking on it)! \nYour current mission is: \red <B>[mission]</B>"
|
||||
|
||||
message_admins("\blue [admin_name] has spawned [new_ninja.key] as a Space Ninja. Hide yo children!", 1)
|
||||
message_admins("\blue [admin_name] has spawned [new_ninja.key] as a Space Ninja. Hide yo children! \nTheir <b>mission</b> is: [mission]", 1)
|
||||
log_admin("[admin_name] used Spawn Space Ninja.")
|
||||
|
||||
del(G)
|
||||
return
|
||||
|
||||
//=======//NINJA CREATION PROCS//=======//
|
||||
|
||||
/proc/create_space_ninja(obj/spawn_point)
|
||||
@@ -319,17 +347,36 @@ As such, it's hard-coded for now. No reason for it not to be, really.
|
||||
|
||||
var/datum/preferences/A = new()//Randomize appearance for the ninja.
|
||||
A.randomize_appearance_for(new_ninja)
|
||||
|
||||
new_ninja.real_name = "[ninja_title] [ninja_name]"
|
||||
new_ninja.dna.ready_dna(new_ninja)
|
||||
new_ninja.mind = new
|
||||
new_ninja.mind.current = new_ninja
|
||||
new_ninja.mind.assigned_role = "MODE"
|
||||
new_ninja.mind.special_role = "Space Ninja"
|
||||
new_ninja.create_mind_space_ninja()
|
||||
new_ninja.equip_space_ninja()
|
||||
return new_ninja
|
||||
|
||||
/mob/living/carbon/human/proc/equip_space_ninja()
|
||||
/mob/living/carbon/human/proc/create_mind_space_ninja()
|
||||
if(mind)
|
||||
mind.assigned_role = "MODE"
|
||||
mind.special_role = "Space Ninja"
|
||||
else
|
||||
mind = new
|
||||
mind.current = src
|
||||
mind.assigned_role = "MODE"
|
||||
mind.special_role = "Space Ninja"
|
||||
if(!(mind in ticker.minds))
|
||||
ticker.minds += mind//Adds them to regular mind list.
|
||||
if(!(mind in ticker.mode.traitors))//If they weren't already an extra traitor.
|
||||
ticker.mode.traitors += mind//Adds them to current traitor list. Which is really the extra antagonist list.
|
||||
return 1
|
||||
|
||||
/mob/living/carbon/human/proc/equip_space_ninja(safety=0)//Safety in case you need to unequip stuff for existing characters.
|
||||
if(safety)
|
||||
del(w_uniform)
|
||||
del(wear_suit)
|
||||
del(wear_mask)
|
||||
del(head)
|
||||
del(shoes)
|
||||
del(gloves)
|
||||
|
||||
var/obj/item/device/radio/R = new /obj/item/device/radio/headset(src)
|
||||
equip_if_possible(R, slot_ears)
|
||||
if(gender==FEMALE)
|
||||
|
||||
@@ -57,6 +57,10 @@
|
||||
blobstart += loc
|
||||
del(src)
|
||||
|
||||
if(name == "xeno_spawn")
|
||||
xeno_spawn += loc
|
||||
del(src)
|
||||
|
||||
return 1
|
||||
|
||||
/obj/landmark/start/New()
|
||||
|
||||
@@ -675,7 +675,7 @@ Auto Patrol: []"},
|
||||
|
||||
/obj/machinery/bot/ed209/proc/speak(var/message)
|
||||
for(var/mob/O in hearers(src, null))
|
||||
O << "<span class='game say'><span class='name'>[src]</span> beeps, \"[message]\""
|
||||
O.show_message("<span class='game say'><span class='name'>[src]</span> beeps, \"[message]\"",2)
|
||||
return
|
||||
|
||||
/obj/machinery/bot/ed209/explode()
|
||||
|
||||
@@ -656,7 +656,7 @@ Auto Patrol: []"},
|
||||
|
||||
/obj/machinery/bot/secbot/proc/speak(var/message)
|
||||
for(var/mob/O in hearers(src, null))
|
||||
O << "<span class='game say'><span class='name'>[src]</span> beeps, \"[message]\""
|
||||
O.show_message("<span class='game say'><span class='name'>[src]</span> beeps, \"[message]\"",2)
|
||||
return
|
||||
|
||||
|
||||
|
||||
@@ -22,14 +22,6 @@
|
||||
density = 0
|
||||
anchored = 0
|
||||
|
||||
/obj/alien/skin_suit
|
||||
name = "skin"
|
||||
desc = "a persons skin, disgusting"
|
||||
icon_state = "weeds"
|
||||
|
||||
density = 0
|
||||
anchored = 0
|
||||
|
||||
/obj/alien/resin
|
||||
name = "resin"
|
||||
desc = "Looks like some kind of slimy growth."
|
||||
|
||||
@@ -49,7 +49,7 @@
|
||||
..()
|
||||
if(aliens_allowed)
|
||||
health = maxhealth
|
||||
src.process()
|
||||
process()
|
||||
else
|
||||
del(src)
|
||||
|
||||
@@ -58,7 +58,7 @@
|
||||
..()
|
||||
if(!alive)
|
||||
usr << text("\red <B>The alien is not moving.</B>")
|
||||
else if (src.health > 5)
|
||||
else if (health > 5)
|
||||
usr << text("\red <B>The alien looks fresh, just out of the egg.</B>")
|
||||
else
|
||||
usr << text("\red <B>The alien looks injured.</B>")
|
||||
@@ -73,51 +73,51 @@
|
||||
attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
switch(W.damtype)
|
||||
if("fire")
|
||||
src.health -= W.force * 0.75
|
||||
health -= W.force * 0.75
|
||||
if("brute")
|
||||
src.health -= W.force * 0.5
|
||||
health -= W.force * 0.5
|
||||
else
|
||||
if (src.health <= 0)
|
||||
src.death()
|
||||
if (health <= 0)
|
||||
death()
|
||||
else if (W.force)
|
||||
if(ishuman(user) || ismonkey(user))
|
||||
src.target = user
|
||||
src.state = 1
|
||||
target = user
|
||||
state = 1
|
||||
..()
|
||||
|
||||
bullet_act(flag, A as obj)
|
||||
switch(flag)
|
||||
if (PROJECTILE_BULLET)
|
||||
src.health -= 20
|
||||
health -= 20
|
||||
if (PROJECTILE_WEAKBULLET)
|
||||
src.health -= 4
|
||||
health -= 4
|
||||
if (PROJECTILE_LASER)
|
||||
src.health -= 10
|
||||
health -= 10
|
||||
if (PROJECTILE_PULSE)
|
||||
src.health -= 35
|
||||
health -= 35
|
||||
healthcheck()
|
||||
|
||||
ex_act(severity)
|
||||
switch(severity)
|
||||
if(1.0)
|
||||
src.death()
|
||||
death()
|
||||
if(2.0)
|
||||
src.health -= 15
|
||||
health -= 15
|
||||
healthcheck()
|
||||
return
|
||||
|
||||
meteorhit()
|
||||
src.death()
|
||||
death()
|
||||
return
|
||||
|
||||
blob_act()
|
||||
if(prob(50))
|
||||
src.death()
|
||||
death()
|
||||
return
|
||||
|
||||
Bumped(AM as mob|obj)
|
||||
if(ismob(AM) && (ishuman(AM) || ismonkey(AM)) )
|
||||
src.target = AM
|
||||
target = AM
|
||||
set_attack()
|
||||
else if(ismob(AM))
|
||||
spawn(0)
|
||||
@@ -126,10 +126,10 @@
|
||||
|
||||
Bump(atom/A)
|
||||
if(ismob(A) && (ishuman(A) || ismonkey(A)))
|
||||
src.target = A
|
||||
target = A
|
||||
set_attack()
|
||||
else if(ismob(A))
|
||||
src.loc = A:loc
|
||||
loc = A:loc
|
||||
|
||||
temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume)
|
||||
if(exposed_temperature > 300)
|
||||
@@ -214,7 +214,7 @@
|
||||
view = 1
|
||||
else
|
||||
view = viewrange-2
|
||||
for (var/mob/living/carbon/C in range(view,src.loc))
|
||||
for (var/mob/living/carbon/C in range(view,loc))
|
||||
if (C.stat == 2 || isalien(C) || C.alien_egg_flag || !can_see(src,C,viewrange))
|
||||
continue
|
||||
if(C:stunned || C:paralysis || C:weakened)
|
||||
@@ -240,27 +240,28 @@
|
||||
if(can_see(src,target,viewrange))
|
||||
if(distance <= 1 && (!lamarr || prob(20)))
|
||||
for(var/mob/O in viewers(world.view,src))
|
||||
O.show_message("\red <B>[src.target] has been leapt on by [lamarr ? src.name : "the alien"]!</B>", 1, "\red You hear someone fall", 2)
|
||||
O.show_message("\red <B>[target] has been leapt on by [lamarr ? name : "the alien"]!</B>", 1, "\red You hear someone fall", 2)
|
||||
if (!lamarr)
|
||||
target:take_overall_damage(5)
|
||||
if(prob(70))
|
||||
target:paralysis = max(target:paralysis, 5)
|
||||
src.loc = target.loc
|
||||
loc = target.loc
|
||||
|
||||
if(!target.alien_egg_flag && ( ishuman(target) || ismonkey(target) ) )
|
||||
if (!lamarr)
|
||||
target.alien_egg_flag = 1
|
||||
var/mob/trg = target
|
||||
src.death()
|
||||
if(trg.virus)
|
||||
trg.virus.cure(0)
|
||||
trg.contract_disease(new /datum/disease/alien_embryo(0))
|
||||
death()
|
||||
if(trg.virus)//Viruses are stored in a global database.
|
||||
trg.virus.cure(0)//You need to either cure() or del() them to stop their processing.
|
||||
trg.contract_disease(new /datum/disease/alien_embryo(0))//So after that you need to infect the target anew.
|
||||
if(target.virus)//If they actually get infected. They may not.
|
||||
target.alien_egg_flag = 1//We finally set their flag to 1.
|
||||
return
|
||||
else
|
||||
sleep(50)
|
||||
else
|
||||
set_null()
|
||||
spawn(cycle_pause) src.process()
|
||||
spawn(cycle_pause) process()
|
||||
return
|
||||
|
||||
step_towards(src,get_step_towards2(src , target))
|
||||
@@ -270,7 +271,7 @@
|
||||
path_attack(target)
|
||||
if(!path_target.len)
|
||||
set_null()
|
||||
spawn(cycle_pause) src.process()
|
||||
spawn(cycle_pause) process()
|
||||
return
|
||||
else
|
||||
var/turf/next = path_target[1]
|
||||
@@ -279,23 +280,23 @@
|
||||
path_attack(target)
|
||||
|
||||
if(!path_target.len)
|
||||
src.frustration += 5
|
||||
frustration += 5
|
||||
else
|
||||
next = path_target[1]
|
||||
path_target -= next
|
||||
step_towards(src,next)
|
||||
quick_move = 1
|
||||
|
||||
if (get_dist(src, src.target) >= distance) src.frustration++
|
||||
else src.frustration--
|
||||
if (get_dist(src, target) >= distance) frustration++
|
||||
else frustration--
|
||||
if(frustration >= 35 || lamarr) set_null()
|
||||
|
||||
if(quick_move)
|
||||
spawn(cycle_pause/2)
|
||||
src.process()
|
||||
process()
|
||||
else
|
||||
spawn(cycle_pause)
|
||||
src.process()
|
||||
process()
|
||||
|
||||
proc/idle()
|
||||
set background = 1
|
||||
@@ -303,7 +304,7 @@
|
||||
|
||||
if(state != 2 || !alive || target) return
|
||||
|
||||
if(locate(/obj/alien/weeds) in src.loc && health < maxhealth)
|
||||
if(locate(/obj/alien/weeds) in loc && health < maxhealth)
|
||||
health++
|
||||
spawn(cycle_pause) idle()
|
||||
return
|
||||
@@ -318,7 +319,7 @@
|
||||
if(!path_idle.len)
|
||||
trg_idle = null
|
||||
set_idle()
|
||||
spawn(cycle_pause) src.idle()
|
||||
spawn(cycle_pause) idle()
|
||||
return
|
||||
else
|
||||
var/obj/alien/weeds/W = null
|
||||
@@ -326,7 +327,7 @@
|
||||
var/list/the_weeds = new/list()
|
||||
|
||||
find_weeds:
|
||||
for(var/obj/alien/weeds/weed in range(viewrange,src.loc))
|
||||
for(var/obj/alien/weeds/weed in range(viewrange,loc))
|
||||
if(!can_see(src,weed,viewrange)) continue
|
||||
for(var/atom/A in get_turf(weed))
|
||||
if(A.density) continue find_weeds
|
||||
@@ -338,11 +339,11 @@
|
||||
path_idle(W)
|
||||
if(!path_idle.len)
|
||||
trg_idle = null
|
||||
spawn(cycle_pause) src.idle()
|
||||
spawn(cycle_pause) idle()
|
||||
return
|
||||
else
|
||||
for(var/mob/living/carbon/alien/humanoid/H in range(1,src))
|
||||
spawn(cycle_pause) src.idle()
|
||||
spawn(cycle_pause) idle()
|
||||
return
|
||||
step(src,pick(cardinal))
|
||||
|
||||
@@ -368,7 +369,7 @@
|
||||
path_idle(trg_idle)
|
||||
|
||||
if(!path_idle.len)
|
||||
spawn(cycle_pause) src.idle()
|
||||
spawn(cycle_pause) idle()
|
||||
return
|
||||
else
|
||||
next = path_idle[1]
|
||||
@@ -384,18 +385,18 @@
|
||||
idle()
|
||||
|
||||
proc/path_idle(var/atom/trg)
|
||||
path_idle = AStar(src.loc, get_turf(trg), /turf/proc/CardinalTurfsWithAccess, /turf/proc/Distance, 0, 250, null, null)
|
||||
path_idle = AStar(loc, get_turf(trg), /turf/proc/CardinalTurfsWithAccess, /turf/proc/Distance, 0, 250, null, null)
|
||||
path_idle = reverselist(path_idle)
|
||||
|
||||
proc/path_attack(var/atom/trg)
|
||||
target = trg
|
||||
path_target = AStar(src.loc, target.loc, /turf/proc/CardinalTurfsWithAccess, /turf/proc/Distance, 0, 250, null, null)
|
||||
path_target = AStar(loc, target.loc, /turf/proc/CardinalTurfsWithAccess, /turf/proc/Distance, 0, 250, null, null)
|
||||
path_target = reverselist(path_target)
|
||||
|
||||
|
||||
proc/death()
|
||||
if(!alive) return
|
||||
src.alive = 0
|
||||
alive = 0
|
||||
density = 0
|
||||
icon_state = "facehugger_l"
|
||||
set_null()
|
||||
@@ -403,6 +404,6 @@
|
||||
O.show_message("\red <B>[src] curls up into a ball!</B>", 1)
|
||||
|
||||
proc/healthcheck()
|
||||
if (src.health <= 0)
|
||||
src.death()
|
||||
if (health <= 0)
|
||||
death()
|
||||
|
||||
|
||||
@@ -32,17 +32,14 @@
|
||||
switch(severity)
|
||||
if(1.0)
|
||||
health-=50
|
||||
healthcheck()
|
||||
if(2.0)
|
||||
health-=50
|
||||
healthcheck()
|
||||
if(3.0)
|
||||
if (prob(50))
|
||||
health-=50
|
||||
healthcheck()
|
||||
else
|
||||
health-=25
|
||||
healthcheck()
|
||||
healthcheck()
|
||||
return
|
||||
|
||||
/obj/alien/resin/blob_act()
|
||||
@@ -64,7 +61,7 @@
|
||||
tforce = 10
|
||||
else
|
||||
tforce = AM:throwforce
|
||||
playsound(src.loc, 'attackblob.ogg', 100, 1)
|
||||
playsound(loc, 'attackblob.ogg', 100, 1)
|
||||
health = max(0, health - tforce)
|
||||
healthcheck()
|
||||
..()
|
||||
@@ -121,7 +118,7 @@
|
||||
|
||||
var/aforce = W.force
|
||||
health = max(0, health - aforce)
|
||||
playsound(src.loc, 'attackblob.ogg', 100, 1)
|
||||
playsound(loc, 'attackblob.ogg', 100, 1)
|
||||
healthcheck()
|
||||
..()
|
||||
return
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
/obj/alien/weeds/New()
|
||||
..()
|
||||
if(istype(src.loc, /turf/space))
|
||||
if(istype(loc, /turf/space))
|
||||
del(src)
|
||||
return
|
||||
src.icon_state = pick("weeds", "weeds1", "weeds2")
|
||||
icon_state = pick("weeds", "weeds1", "weeds2")
|
||||
spawn(rand(150,300))
|
||||
if(src)
|
||||
src.Life()
|
||||
Life()
|
||||
return
|
||||
|
||||
/obj/alien/weeds/proc/Life()
|
||||
@@ -20,8 +20,8 @@
|
||||
|
||||
Alien plants should do something if theres a lot of poison
|
||||
if(U.poison> 200000)
|
||||
src.health -= round(U.poison/200000)
|
||||
src.update()
|
||||
health -= round(U.poison/200000)
|
||||
update()
|
||||
return
|
||||
*/
|
||||
if (istype(U, /turf/space))
|
||||
@@ -58,7 +58,7 @@ Alien plants should do something if theres a lot of poison
|
||||
return
|
||||
|
||||
/obj/alien/weeds/attackby(var/obj/item/weapon/W, var/mob/user)
|
||||
src.visible_message("\red <B>\The [src] have been attacked with \the [W][(user ? " by [user]." : ".")]")
|
||||
visible_message("\red <B>\The [src] have been attacked with \the [W][(user ? " by [user]." : ".")]")
|
||||
|
||||
var/damage = W.force / 4.0
|
||||
|
||||
@@ -67,10 +67,10 @@ Alien plants should do something if theres a lot of poison
|
||||
|
||||
if(WT.welding)
|
||||
damage = 15
|
||||
playsound(src.loc, 'Welder.ogg', 100, 1)
|
||||
playsound(loc, 'Welder.ogg', 100, 1)
|
||||
|
||||
src.health -= damage
|
||||
src.healthcheck()
|
||||
health -= damage
|
||||
healthcheck()
|
||||
|
||||
/obj/alien/weeds/proc/healthcheck()
|
||||
if(health <= 0)
|
||||
|
||||
@@ -486,7 +486,7 @@
|
||||
|
||||
//SYNDICATE FUNCTIONS===================================
|
||||
|
||||
if("Door")
|
||||
if("Toggle Door")
|
||||
if(!isnull(cartridge) && cartridge.access_remote_door)
|
||||
for(var/obj/machinery/door/poddoor/M in machines)
|
||||
if(M.id == cartridge.remote_door_id)
|
||||
@@ -536,12 +536,13 @@
|
||||
|
||||
//pAI FUNCTIONS===================================
|
||||
if("pai")
|
||||
if(href_list["option"] == "1") // Configure pAI device
|
||||
pai.attack_self(U)
|
||||
if(href_list["option"] == "2") // Eject pAI device
|
||||
var/turf/T = get_turf_or_move(src.loc)
|
||||
if(T)
|
||||
pai.loc = T
|
||||
switch(href_list["option"])
|
||||
if("1") // Configure pAI device
|
||||
pai.attack_self(U)
|
||||
if("2") // Eject pAI device
|
||||
var/turf/T = get_turf_or_move(src.loc)
|
||||
if(T)
|
||||
pai.loc = T
|
||||
|
||||
//LINK FUNCTIONS===================================
|
||||
|
||||
|
||||
@@ -63,21 +63,19 @@
|
||||
dat += "<b>AI nonfunctional</b>"
|
||||
else
|
||||
if (!src.flush)
|
||||
dat += {"<A href='byond://?src=\ref[src];choice=Wipe;user=\ref[user]'>Wipe AI</A>"}
|
||||
dat += {"<A href='byond://?src=\ref[src];choice=Wipe'>Wipe AI</A>"}
|
||||
else
|
||||
dat += "<b>Wipe in progress</b>"
|
||||
dat += "<br>"
|
||||
dat += {"<a href='byond://?src=\ref[src];choice=Wireless;user=\ref[user]'>[A.control_disabled ? "Enable" : "Disable"] Wireless Activity</a>"}
|
||||
dat += {"<a href='byond://?src=\ref[src];choice=Wireless'>[A.control_disabled ? "Enable" : "Disable"] Wireless Activity</a>"}
|
||||
dat += "<br>"
|
||||
dat += {"<a href='byond://?src=\ref[src];choice=Close;user=\ref[user]'> Close</a>"}
|
||||
dat += {"<a href='byond://?src=\ref[src];choice=Close'> Close</a>"}
|
||||
user << browse(dat, "window=aicard")
|
||||
onclose(user, "aicard")
|
||||
return
|
||||
|
||||
Topic(href, href_list)
|
||||
/*Let's define the user. It's safer to do it this way, rather than defaulting to usr.
|
||||
For very long menu lines, usr is probably a lot more convenient.*/
|
||||
var/mob/U = href_list["user"]
|
||||
var/mob/U = usr
|
||||
if (!in_range(src, U)||U.machine!=src)//If they are not in range of 1 or less or their machine is not the card (ie, clicked on something else).
|
||||
U << browse(null, "window=aicard")
|
||||
U.machine = null
|
||||
|
||||
+65
-24
@@ -570,7 +570,7 @@ var/showadminmessages = 1
|
||||
if (href_list["adminplayeropts"])
|
||||
var/mob/M = locate(href_list["adminplayeropts"])
|
||||
if(!M)
|
||||
usr << "You seem to be selecting a mob that doesn't exist."
|
||||
usr << "You seem to be selecting a mob that doesn't exist anymore."
|
||||
return
|
||||
var/dat = "<html><head><title>Options for [M.key]</title></head>"
|
||||
var/foo = "\[ "
|
||||
@@ -581,13 +581,13 @@ var/showadminmessages = 1
|
||||
foo += text("<B>Authorized</B> | ")
|
||||
foo += text("<A HREF='?src=\ref[src];prom_demot=\ref[M.client]'>Promote/Demote</A> | ")
|
||||
if(!istype(M, /mob/new_player))
|
||||
if(!istype(M, /mob/living/carbon/monkey))
|
||||
if(!ismonkey(M))
|
||||
foo += text("<A HREF='?src=\ref[src];monkeyone=\ref[M]'>Monkeyize</A> | ")
|
||||
else
|
||||
foo += text("<B>Monkeyized</B> | ")
|
||||
if(istype(M, /mob/living/silicon/ai))
|
||||
if(isAI(M))
|
||||
foo += text("<B>Is an AI</B> | ")
|
||||
else if(istype(M, /mob/living/carbon/human))
|
||||
else if(ishuman(M))
|
||||
foo += text("<A HREF='?src=\ref[src];makeai=\ref[M]'>Make AI</A> | ")
|
||||
foo += text("<A HREF='?src=\ref[src];tdome1=\ref[M]'>Thunderdome 1</A> | ")
|
||||
foo += text("<A HREF='?src=\ref[src];tdome2=\ref[M]'>Thunderdome 2</A> | ")
|
||||
@@ -595,25 +595,61 @@ var/showadminmessages = 1
|
||||
foo += text("<A HREF='?src=\ref[src];tdomeobserve=\ref[M]'>Thunderdome Observer</A> | ")
|
||||
foo += text("<A HREF='?src=\ref[src];sendtoprison=\ref[M]'>Prison</A> | ")
|
||||
foo += text("<A HREF='?src=\ref[src];sendtomaze=\ref[M]'>Maze</A> | ")
|
||||
|
||||
foo += text("<A HREF='?src=\ref[src];revive=\ref[M]'>Heal/Revive</A> | ")
|
||||
else
|
||||
foo += text("<B>Hasn't Entered Game</B> | ")
|
||||
foo += text("<A HREF='?src=\ref[src];forcespeech=\ref[M]'>Say</A> | ")
|
||||
foo += text("<A href='?src=\ref[src];forcespeech=\ref[M]'>Forcesay</A> | ")
|
||||
foo += text("<A href='?src=\ref[src];mute2=\ref[M]'>Mute: [(M.muted ? "Muted" : "Voiced")]</A> | ")
|
||||
foo += text("<A href='?src=\ref[src];boot2=\ref[M]'>Boot</A> | ")
|
||||
foo += text("<A href='?src=\ref[src];boot2=\ref[M]'>Boot</A>")
|
||||
foo += text("<br>")
|
||||
foo += text("<A href='?src=\ref[src];jumpto=\ref[M]'>Jump to</A> | ")
|
||||
foo += text("<A href='?src=\ref[src];newban=\ref[M]'>Ban</A> \]")
|
||||
foo += text("<A href='?src=\ref[src];jobban2=\ref[M]'>Jobban</A> | ")
|
||||
foo += text("<A href='?src=\ref[src];getmob=\ref[M]'>Get</A> | ")
|
||||
foo += text("<A href='?src=\ref[src];sendmob=\ref[M]'>Send</A>")
|
||||
foo += text("<br>")
|
||||
foo += text("<A href='?src=\ref[src];traitor=\ref[M]'>Traitor?</A> | ")
|
||||
foo += text("<A href='?src=\ref[src];narrateto=\ref[M]'>Narrate to</A> | ")
|
||||
foo += text("<A href='?src=\ref[src];subtlemessage=\ref[M]'>Subtle message</A>")
|
||||
foo += text("<br>")
|
||||
foo += text("<A href='?src=\ref[src];newban=\ref[M]'>Ban</A> | ")
|
||||
foo += text("<A href='?src=\ref[src];jobban2=\ref[M]'>Jobban</A>")
|
||||
dat += text("<body>[foo]</body></html>")
|
||||
usr << browse(dat, "window=adminplayeropts;size=480x100")
|
||||
usr << browse(dat, "window=adminplayeropts;size=480x150")
|
||||
|
||||
if (href_list["jumpto"])
|
||||
if(( src.level in list(6, 5, 4) ) || ((src.level in list(3, 2)) && (src.state == 2)))
|
||||
if(rank in list("Badmin", "Game Admin", "Game Master"))
|
||||
var/mob/M = locate(href_list["jumpto"])
|
||||
usr.client.jumptomob(M)
|
||||
else
|
||||
alert("You are not a high enough administrator or you aren't observing!")
|
||||
alert("You cannot perform this action. You must be of a higher administrative rank!")
|
||||
return
|
||||
|
||||
if (href_list["getmob"])
|
||||
if(rank in list( "Trial Admin", "Badmin", "Game Admin", "Game Master"))
|
||||
var/mob/M = locate(href_list["getmob"])
|
||||
usr.client.Getmob(M)
|
||||
else
|
||||
alert("You cannot perform this action. You must be of a higher administrative rank!")
|
||||
return
|
||||
|
||||
if (href_list["sendmob"])
|
||||
if(rank in list( "Trial Admin", "Badmin", "Game Admin", "Game Master"))
|
||||
var/mob/M = locate(href_list["sendmob"])
|
||||
usr.client.sendmob(M)
|
||||
else
|
||||
alert("You cannot perform this action. You must be of a higher administrative rank!")
|
||||
return
|
||||
|
||||
if (href_list["narrateto"])
|
||||
if(rank in list("Game Admin", "Game Master"))
|
||||
var/mob/M = locate(href_list["narrateto"])
|
||||
usr.client.cmd_admin_direct_narrate(M)
|
||||
else
|
||||
alert("You cannot perform this action. You must be of a higher administrative rank!")
|
||||
return
|
||||
|
||||
if (href_list["subtlemessage"])
|
||||
var/mob/M = locate(href_list["subtlemessage"])
|
||||
usr.client.cmd_admin_subtle_message(M)
|
||||
|
||||
if (href_list["traitor"])
|
||||
if(!ticker || !ticker.mode)
|
||||
@@ -622,7 +658,7 @@ var/showadminmessages = 1
|
||||
var/mob/M = locate(href_list["traitor"])
|
||||
var/datum/game_mode/current_mode = ticker.mode
|
||||
|
||||
if (istype(M, /mob/living/carbon/human) && M:mind)
|
||||
if (ishuman(M) && M:mind)
|
||||
M:mind.edit_memory()
|
||||
return
|
||||
|
||||
@@ -665,11 +701,17 @@ var/showadminmessages = 1
|
||||
if(M.mind in current_mode:syndicates)
|
||||
alert("Is a Syndicate operative!", "[M.key]")
|
||||
return
|
||||
if(istype(M,/mob/living/silicon/robot))
|
||||
|
||||
if(isrobot(M))
|
||||
var/mob/living/silicon/robot/R = M
|
||||
if(R.emagged)
|
||||
alert("Is emagged!\n0th law: [R.laws.zeroth]", "[R.key]")
|
||||
return
|
||||
|
||||
if(isalien(M))
|
||||
alert("Is an [M.mind ? M.mind.special_role : "Alien"]!", "[M.key]")
|
||||
return
|
||||
|
||||
// traitor, or other modes where traitors/counteroperatives would be.
|
||||
if(M.mind in current_mode.traitors)
|
||||
var/datum/mind/antagonist = M.mind
|
||||
@@ -683,13 +725,12 @@ var/showadminmessages = 1
|
||||
return
|
||||
|
||||
//they're nothing so turn them into a traitor!
|
||||
if(istype(M, /mob/living/carbon/human) || istype(M, /mob/living/silicon/ai))
|
||||
if(ishuman(M) || issilicon(M))
|
||||
var/traitorize = alert("Is not a traitor, make Traitor?", "Traitor", "Yes", "Cancel")
|
||||
if(traitorize == "Cancel")
|
||||
return
|
||||
if(traitorize == "Yes")
|
||||
traitorize(M,,1)
|
||||
//they're a ghost/monkey
|
||||
else
|
||||
alert("Cannot make this mob a traitor")
|
||||
if (href_list["create_object"])
|
||||
@@ -1481,21 +1522,21 @@ var/showadminmessages = 1
|
||||
currentkarma = query.item[1]
|
||||
|
||||
dat += "<tr><td>[M.name]</td>"
|
||||
if(istype(M, /mob/living/silicon/ai))
|
||||
if(isAI(M))
|
||||
dat += "<td>AI</td>"
|
||||
if(istype(M, /mob/living/silicon/robot))
|
||||
if(isrobot(M))
|
||||
dat += "<td>Cyborg</td>"
|
||||
if(istype(M, /mob/living/carbon/human))
|
||||
if(ishuman(M))
|
||||
dat += "<td>[M.real_name]</td>"
|
||||
if(istype(M, /mob/living/silicon/pai))
|
||||
dat += "<td>pAI</td>"
|
||||
if(istype(M, /mob/new_player))
|
||||
dat += "<td>New Player</td>"
|
||||
if(istype(M, /mob/dead/observer))
|
||||
if(isobserver(M))
|
||||
dat += "<td>Ghost</td>"
|
||||
if(istype(M, /mob/living/carbon/monkey))
|
||||
if(ismonkey(M))
|
||||
dat += "<td>Monkey</td>"
|
||||
if(istype(M, /mob/living/carbon/alien))
|
||||
if(isalien(M))
|
||||
dat += "<td>Alien</td>"
|
||||
dat += {"<td>[(M.client ? "[(M.client.goon ? "<font color=red>" : "<font>")][M.client]</font>" : "No client")]</td>
|
||||
<td align=center><A HREF='?src=\ref[src];adminplayeropts=\ref[M]'>X</A></td>
|
||||
@@ -2023,11 +2064,11 @@ var/showadminmessages = 1
|
||||
if("changeling")
|
||||
if(M.mind in ticker.mode:changelings)
|
||||
return 1
|
||||
if(istype(M,/mob/living/silicon/robot))
|
||||
if(isrobot(M))
|
||||
var/mob/living/silicon/robot/R = M
|
||||
if(R.emagged)
|
||||
return 1
|
||||
if(M.mind in ticker.mode.traitors)
|
||||
if(M.mind&&M.mind.special_role)//If they have a mind and special role, they are some type of traitor or antagonist.
|
||||
return 1
|
||||
|
||||
return 0
|
||||
|
||||
+1160
-1149
File diff suppressed because it is too large
Load Diff
@@ -24,5 +24,5 @@
|
||||
if (src.holder.rank == "Admin Observer")
|
||||
M << "<span class=\"gfartadmin\"><span class=\"prefix\">ADMIN:</span> <span class=\"name\">[key_name(usr, M)]:</span> <span class=\"message\">[msg]</span></span>"
|
||||
else
|
||||
M << "<span class=\"admin\"><span class=\"prefix\">ADMIN:</span> <span class=\"name\">[key_name(usr, M)]:</span> <span class=\"message\">[msg]</span></span>"
|
||||
M << "<span class=\"admin\"><span class=\"prefix\">ADMIN:</span> <span class=\"name\">[key_name(usr, M)]</span><a href='?src=\ref[M.client.holder];jumpto=\ref[mob]'>X</a>: <span class=\"message\">[msg]</span></span>"
|
||||
|
||||
|
||||
@@ -138,7 +138,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
|
||||
usr.show_message(t, 1)
|
||||
|
||||
/client/proc/cmd_admin_robotize(var/mob/M in world)
|
||||
set category = "Admin"
|
||||
set category = "Fun"
|
||||
set name = "Make Robot"
|
||||
|
||||
if(!ticker)
|
||||
@@ -152,22 +152,48 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
|
||||
else
|
||||
alert("Invalid mob")
|
||||
|
||||
/client/proc/makepAI(var/turf/T in world)
|
||||
set category = "Fun"
|
||||
set name = "Make pAI"
|
||||
set desc = "Specify a location to spawn a pAI device, then specify a key to play that pAI"
|
||||
|
||||
var/list/available = list()
|
||||
for(var/mob/C in world)
|
||||
if(C.key)
|
||||
available.Add(C)
|
||||
var/mob/choice = input("Choose a player to play the pAI", "Spawn pAI") in available
|
||||
if(!choice)
|
||||
return 0
|
||||
if(!istype(choice, /mob/dead/observer))
|
||||
var/confirm = input("[choice.key] isn't ghosting right now. Are you sure you want to yank him out of them out of their body and place them in this pAI?", "Spawn pAI Confirmation", "No") in list("Yes", "No")
|
||||
if(confirm != "Yes")
|
||||
return 0
|
||||
var/obj/item/device/paicard/card = new(T)
|
||||
var/mob/living/silicon/pai/pai = new(card)
|
||||
pai.name = input(choice, "Enter your pAI name:", "pAI Name", "Personal AI") as text
|
||||
pai.real_name = pai.name
|
||||
pai.key = choice.key
|
||||
card.pai = pai
|
||||
for(var/datum/paiCandidate/candidate in paiController.pai_candidates)
|
||||
if(candidate.key == choice.key)
|
||||
paiController.pai_candidates.Remove(candidate)
|
||||
|
||||
/client/proc/cmd_admin_alienize(var/mob/M in world)
|
||||
set category = "Admin"
|
||||
set category = "Fun"
|
||||
set name = "Make Alien"
|
||||
|
||||
if(!ticker)
|
||||
alert("Wait until the game starts")
|
||||
return
|
||||
if(istype(M, /mob/living/carbon/human))
|
||||
log_admin("[key_name(src)] is attempting to alienize [M.key].")
|
||||
if(ishuman(M))
|
||||
log_admin("[key_name(src)] has alienized [M.key].")
|
||||
spawn(10)
|
||||
M:Alienize()
|
||||
else
|
||||
alert("Invalid mob")
|
||||
|
||||
/client/proc/cmd_admin_monkeyize(var/mob/M in world)
|
||||
set category = "Admin"
|
||||
set category = "Fun"
|
||||
set name = "Make Monkey"
|
||||
|
||||
if(!ticker)
|
||||
@@ -182,7 +208,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
|
||||
alert("Invalid mob")
|
||||
|
||||
/client/proc/cmd_admin_changelinginize(var/mob/M in world)
|
||||
set category = "Admin"
|
||||
set category = "Fun"
|
||||
set name = "Make Changeling"
|
||||
|
||||
if(!ticker)
|
||||
@@ -198,8 +224,9 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
|
||||
else
|
||||
alert("Invalid mob")
|
||||
|
||||
/*
|
||||
/client/proc/cmd_admin_abominize(var/mob/M in world)
|
||||
set category = "Admin"
|
||||
set category = null
|
||||
set name = "Make Abomination"
|
||||
|
||||
usr << "Ruby Mode disabled. Command aborted."
|
||||
@@ -213,9 +240,9 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
|
||||
spawn(10)
|
||||
M.make_abomination()
|
||||
*/
|
||||
|
||||
*/
|
||||
/client/proc/make_cultist(var/mob/M in world) // -- TLE, modified by Urist
|
||||
set category = "Admin"
|
||||
set category = "Fun"
|
||||
set name = "Make Cultist"
|
||||
set desc = "Makes target a cultist"
|
||||
if(!wordtravel)
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/client/proc/cmd_admin_drop_everything(mob/M as mob in world)
|
||||
set category = null
|
||||
set name = "Drop Everything"
|
||||
if(!src.authenticated || !src.holder)
|
||||
if(!authenticated || !holder)
|
||||
src << "Only administrators may use this command."
|
||||
return
|
||||
for(var/obj/item/W in M)
|
||||
@@ -13,7 +13,7 @@
|
||||
/client/proc/cmd_admin_prison(mob/M as mob in world)
|
||||
set category = "Admin"
|
||||
set name = "Prison"
|
||||
if(!src.authenticated || !src.holder)
|
||||
if(!authenticated || !holder)
|
||||
src << "Only administrators may use this command."
|
||||
return
|
||||
if (ismob(M))
|
||||
@@ -40,7 +40,7 @@
|
||||
set category = "Special Verbs"
|
||||
set name = "Subtle Message"
|
||||
|
||||
if (!src.authenticated || !src.holder)
|
||||
if (!authenticated || !holder)
|
||||
src << "Only administrators may use this command."
|
||||
return
|
||||
|
||||
@@ -60,7 +60,7 @@
|
||||
set category = "Special Verbs"
|
||||
set name = "Global Narrate"
|
||||
|
||||
if (!src.authenticated || !src.holder)
|
||||
if (!authenticated || !holder)
|
||||
src << "Only administrators may use this command."
|
||||
return
|
||||
|
||||
@@ -76,7 +76,7 @@
|
||||
set category = "Special Verbs"
|
||||
set name = "Direct Narrate"
|
||||
|
||||
if(!src.authenticated || !src.holder)
|
||||
if(!authenticated || !holder)
|
||||
src << "Only administrators may use this command."
|
||||
return
|
||||
var/msg = input("Message:", text("Enter the text you wish to appear to your target:")) as text
|
||||
@@ -87,17 +87,17 @@
|
||||
/client/proc/cmd_admin_pm(mob/M as mob in world)
|
||||
set category = "Admin"
|
||||
set name = "Admin PM"
|
||||
if(!src.authenticated || !src.holder)
|
||||
if(!authenticated || !holder)
|
||||
src << "Only administrators may use this command."
|
||||
return
|
||||
if(M)
|
||||
if(src.mob.muted)
|
||||
if(mob.muted)
|
||||
src << "You are muted have a nice day"
|
||||
return
|
||||
if (!( ismob(M) ))
|
||||
return
|
||||
var/t = input("Message:", text("Private message to [M.key]")) as text|null
|
||||
if(src.holder.rank != "Game Admin" && src.holder.rank != "Game Master")
|
||||
if(holder.rank != "Game Admin" && holder.rank != "Game Master")
|
||||
t = strip_html(t,500)
|
||||
if (!( t ))
|
||||
return
|
||||
@@ -120,7 +120,7 @@
|
||||
/client/proc/cmd_admin_godmode(mob/M as mob in world)
|
||||
set category = "Special Verbs"
|
||||
set name = "Godmode"
|
||||
if(!src.authenticated || !src.holder)
|
||||
if(!authenticated || !holder)
|
||||
src << "Only administrators may use this command."
|
||||
return
|
||||
if (M.nodamage == 1)
|
||||
@@ -136,10 +136,10 @@
|
||||
/client/proc/cmd_admin_mute(mob/M as mob in world)
|
||||
set category = "Special Verbs"
|
||||
set name = "Admin Mute"
|
||||
if(!src.authenticated || !src.holder)
|
||||
if(!authenticated || !holder)
|
||||
src << "Only administrators may use this command."
|
||||
return
|
||||
if (M.client && M.client.holder && (M.client.holder.level >= src.holder.level))
|
||||
if (M.client && M.client.holder && (M.client.holder.level >= holder.level))
|
||||
alert("You cannot perform this action. You must be of a higher administrative rank!", null, null, null, null, null)
|
||||
return
|
||||
M.muted = !M.muted
|
||||
@@ -153,7 +153,7 @@
|
||||
/client/proc/cmd_admin_add_random_ai_law()
|
||||
set category = "Fun"
|
||||
set name = "Add Random AI Law"
|
||||
if(!src.authenticated || !src.holder)
|
||||
if(!authenticated || !holder)
|
||||
src << "Only administrators may use this command."
|
||||
return
|
||||
|
||||
@@ -184,7 +184,7 @@ Would like to add a law like "Law x is _______" where x = a number, and _____ is
|
||||
for(var/mob/living/carbon/human/pos in world)
|
||||
pos_crew += pos.real_name
|
||||
crew = pick(pos_crew)
|
||||
switch(pick(1,2,3,4,5,6,7,8,9,10,11,12))
|
||||
switch(rand(1,12))
|
||||
if(1)
|
||||
M << "\red THERE ARE [amount] [who2] ON THE STATION...LAWS UPDATED"
|
||||
M.add_ion_law("THERE ARE [amount] [who2] ON THE STATION")
|
||||
@@ -272,57 +272,67 @@ Would like to add a law like "Law x is _______" where x = a number, and _____ is
|
||||
command_alert("Ion storm detected near the station. Please check all AI-controlled equipment for errors.", "Anomaly Alert")
|
||||
world << sound('ionstorm.ogg')
|
||||
|
||||
/client/proc/spawn_xeno() //Stealth spawns xenos /N
|
||||
/*
|
||||
Stealth spawns xenos
|
||||
Changed to accomodate specific spawning. It was annoying before. /N
|
||||
*/
|
||||
/client/proc/spawn_xeno()
|
||||
set category = "Fun"
|
||||
set name = "Spawn Xeno"
|
||||
set desc = "Spawns a xenomorph for all those boring rounds, without having you to do so manually."
|
||||
if(!src.authenticated || !src.holder)
|
||||
set popup_menu = 0
|
||||
|
||||
if(!authenticated || !holder)
|
||||
src << "Only administrators may use this command."
|
||||
return
|
||||
var/list/xeno_list = list()
|
||||
for(var/obj/landmark/X in world)
|
||||
if (X.name == "xeno_spawn")
|
||||
xeno_list.Add(X)
|
||||
if(!xeno_list.len)
|
||||
alert("There are no available spots to spawn the xeno. Aborting command.")
|
||||
return
|
||||
|
||||
var/CASTE = alert(src, "Please choose which caste to spawn.",,"Hunter","Sentinel","Drone")
|
||||
create_xeno()
|
||||
return
|
||||
|
||||
var/obj/landmark/spawn_here = pick(xeno_list)
|
||||
//I use this proc for respawn character too. /N
|
||||
/proc/create_xeno(mob/dead/observer/G)
|
||||
var/alien_caste = alert(src, "Please choose which caste to spawn.",,"Hunter","Sentinel","Drone")
|
||||
|
||||
var/mob/new_xeno
|
||||
switch(CASTE)
|
||||
var/obj/landmark/spawn_here = xeno_spawn.len ? pick(xeno_spawn) : pick(latejoin)
|
||||
|
||||
var/mob/living/carbon/alien/humanoid/new_xeno
|
||||
switch(alien_caste)
|
||||
if("Hunter")
|
||||
new_xeno = new /mob/living/carbon/alien/humanoid/hunter (spawn_here.loc)
|
||||
new_xeno = new /mob/living/carbon/alien/humanoid/hunter (spawn_here)
|
||||
if("Sentinel")
|
||||
new_xeno = new /mob/living/carbon/alien/humanoid/sentinel (spawn_here.loc)
|
||||
new_xeno = new /mob/living/carbon/alien/humanoid/sentinel (spawn_here)
|
||||
if("Drone")
|
||||
new_xeno = new /mob/living/carbon/alien/humanoid/drone (spawn_here.loc)
|
||||
new_xeno = new /mob/living/carbon/alien/humanoid/drone (spawn_here)
|
||||
|
||||
var/list/candidates = list() // Picks a random ghost for the role. Mostly a copy of alien burst code. Doesn't spawn the one using the command.
|
||||
for(var/mob/dead/observer/G in world)
|
||||
if(G.client)
|
||||
if(!G.client.holder && ((G.client.inactivity/10)/60) <= 5)
|
||||
candidates.Add(G)
|
||||
if(candidates.len)
|
||||
var/mob/dead/observer/G = pick(candidates)
|
||||
message_admins("\blue [key_name_admin(usr)] has spawned [G.key] as a filthy xeno.", 1)
|
||||
// Picks a random ghost for the role if none is specified. Mostly a copy of alien burst code.
|
||||
var/candidates_list[] = list()
|
||||
if(G)//If G exists through a passed argument.
|
||||
candidates_list += G.client
|
||||
else//Else we need to find them.
|
||||
for(G in world)
|
||||
if(G.client)
|
||||
if(!G.client.holder && ((G.client.inactivity/10)/60) <= 5)
|
||||
candidates_list += G.client//We want their client, not their ghost.
|
||||
if(candidates_list.len)//If there are people to spawn.
|
||||
if(!G)//If G was not passed through an argument.
|
||||
var/client/G_client = input("Pick the client you want to respawn as a xeno.", "Active Players") as null|anything in candidates_list//It will auto-pick a person when there is only one candidate.
|
||||
if(G_client)//They may have logged out when the admin was choosing people. Or were not chosen. Would run time error otherwise.
|
||||
G = G_client.mob
|
||||
|
||||
new_xeno.mind = new//Mind initialize stuff.
|
||||
new_xeno.mind.current = new_xeno
|
||||
new_xeno.mind.assigned_role = "Alien"
|
||||
new_xeno.mind.special_role = CASTE
|
||||
new_xeno.mind.key = G.key
|
||||
if(G.client)
|
||||
G.client.mob = new_xeno
|
||||
if(G)//If G exists.
|
||||
message_admins("\blue [key_name_admin(usr)] has spawned [G.key] as a filthy xeno.", 1)
|
||||
new_xeno.mind_initialize(G, alien_caste)
|
||||
new_xeno.key = G.key
|
||||
else//We won't be reporting duds.
|
||||
del(new_xeno)
|
||||
|
||||
del(G)
|
||||
else
|
||||
alert("There are no available ghosts to throw into the xeno. Aborting command.")
|
||||
del(new_xeno)
|
||||
return
|
||||
|
||||
alert("There are no available ghosts to throw into the xeno. Aborting command.")
|
||||
del(new_xeno)
|
||||
return
|
||||
|
||||
/*
|
||||
If a guy was gibbed and you want to revive him, this is a good way to do so.
|
||||
Works kind of like entering the game with a new character. Character receives a new mind if they didn't have one.
|
||||
@@ -345,17 +355,63 @@ Traitors and the like can also be revived with the previous role mostly intact.
|
||||
G_found = G
|
||||
break
|
||||
|
||||
if(!G_found)//If a ghost was found.
|
||||
if(!G_found)//If a ghost was not found.
|
||||
alert("There is no active key like that in the game or the person is not currently a ghost. Aborting command.")
|
||||
return
|
||||
|
||||
//First we spawn a dude.
|
||||
var/mob/living/carbon/human/new_character = new(src)//The mob being spawned.
|
||||
|
||||
/*Second, we try and locate a record for the person being respawned through data_core.
|
||||
//Second, we check if they are an alien or monkey.
|
||||
var/adj_name = copytext(G_found.name,1,7)//What is their name?
|
||||
if(G_found.mind&&G_found.mind.special_role=="Alien")//If they have a mind, are they an alien?
|
||||
adj_name="alien "
|
||||
if( adj_name==("alien "||"monkey"))
|
||||
if(alert("This character appears to either be an an alien or monkey. Would you like to respawn them as such?",,"Yes","No")=="Yes")//If you do.
|
||||
switch(adj_name)//Let's check based on adjusted name.
|
||||
if("monkey")//A monkey. Monkeys don't have a mind, so we can safely spawn them here if needed.
|
||||
var/mob/living/carbon/monkey/M = new(pick(latejoin))//Spawn a monkey at latejoin.
|
||||
M.key = G_found.key//They are now a monkey. Nothing else needs doing.
|
||||
if("alien ")//An alien. Aliens can have a mind which can be used to determine a few things.
|
||||
if(G_found.mind)
|
||||
var/turf/location = xeno_spawn.len ? pick(xeno_spawn) : pick(latejoin)//Location where they will be spawned.
|
||||
var/mob/living/carbon/alien/new_xeno//Null alien mob first.
|
||||
switch(G_found.mind.special_role)//If they have a mind, we can determine which caste they were.
|
||||
if("Hunter")
|
||||
new_xeno = new/mob/living/carbon/alien/humanoid/hunter(location)
|
||||
if("Sentinel")
|
||||
new_xeno = new/mob/living/carbon/alien/humanoid/sentinel(location)
|
||||
if("Drone")
|
||||
new_xeno = new/mob/living/carbon/alien/humanoid/drone(location)
|
||||
if("Queen")
|
||||
new_xeno = new/mob/living/carbon/alien/humanoid/queen(location)
|
||||
else//If we don't know what special role they have, for whatever reason, or they're a larva.
|
||||
create_xeno(G_found)
|
||||
return
|
||||
//Now to give them a new mind.
|
||||
new_xeno.mind = new
|
||||
new_xeno.mind.assigned_role = "Alien"
|
||||
new_xeno.mind.special_role = G_found.mind.special_role
|
||||
new_xeno.mind.key = G_found.key
|
||||
new_xeno.mind.current = new_xeno
|
||||
new_xeno.key = G_found.key
|
||||
new_xeno << "You have been fully respawned. Enjoy the game."
|
||||
message_admins("\blue [key_name_admin(usr)] has respawned [new_xeno.key] as a filthy xeno.", 1)
|
||||
//And we're done. Announcing other stuff is handled by spawn_xeno.
|
||||
else
|
||||
create_xeno(G_found)//Else we default to the standard command for spawning a xenomorph.
|
||||
return
|
||||
del(G_found)
|
||||
return
|
||||
//Monkeys aren't terribly important so we won't be announcing them. The proc basically ends here.
|
||||
else//Or not.
|
||||
G_found.mind=null//Null their mind so we don't screw things up ahead.
|
||||
G_found.real_name="[pick(pick(first_names_male,first_names_female))] [pick(last_names)]"//Give them a random real name.
|
||||
|
||||
/*Third, we try and locate a record for the person being respawned through data_core.
|
||||
This isn't an exact science but it does the trick more often than not.*/
|
||||
var/datum/data/record/record_found//Referenced to later to either randomize or not randomize the character.
|
||||
if(G_found.mind)//They must have a mind to reference the record.
|
||||
if(G_found.mind)//They must have a mind to reference the record. Here we also double check for aliens.
|
||||
var/id = md5("[G_found.real_name][G_found.mind.assigned_role]")
|
||||
for(var/datum/data/record/t in data_core.locked)
|
||||
if(t.fields["id"]==id)
|
||||
@@ -400,7 +456,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
|
||||
//We will update their appearance when determining DNA.
|
||||
else
|
||||
new_character.gender = MALE
|
||||
if(alert("Save file not detected. Record data not detected. Please specify the character's gender.",,"Male","Female")=="Female")
|
||||
if(alert("Save file not detected. Record data not detected. Please specify [G_found.real_name]'s gender.",,"Male","Female")=="Female")
|
||||
new_character.gender = FEMALE
|
||||
var/name_safety = G_found.real_name//Default is a random name so we want to save this.
|
||||
A.randomize_appearance_for(new_character)//Now we will randomize their appearance since we have no way of knowing what they look/looked like.
|
||||
@@ -475,6 +531,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
|
||||
new_character = new_character.AIize()
|
||||
if(new_character.mind.special_role=="traitor")
|
||||
call(/datum/game_mode/traitor/proc/add_law_zero)(new_character)
|
||||
//Add aliens.
|
||||
else
|
||||
new_character.Equip_Rank(new_character.mind.assigned_role, joined_late=1)//Or we simply equip them.
|
||||
|
||||
@@ -498,7 +555,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
|
||||
/client/proc/cmd_admin_add_freeform_ai_law()
|
||||
set category = "Fun"
|
||||
set name = "Add Custom AI law"
|
||||
if(!src.authenticated || !src.holder)
|
||||
if(!authenticated || !holder)
|
||||
src << "Only administrators may use this command."
|
||||
return
|
||||
var/input = input(usr, "Please enter anything you want the AI to do. Anything. Serious.", "What?", "") as text|null
|
||||
@@ -523,10 +580,10 @@ Traitors and the like can also be revived with the previous role mostly intact.
|
||||
set category = "Special Verbs"
|
||||
set name = "Rejuvenate"
|
||||
// All admins should be authenticated, but... what if?
|
||||
if(!src.authenticated || !src.holder)
|
||||
if(!authenticated || !holder)
|
||||
src << "Only administrators may use this command."
|
||||
return
|
||||
if(!src.mob)
|
||||
if(!mob)
|
||||
return
|
||||
if(!istype(M))
|
||||
alert("Cannot revive a ghost")
|
||||
@@ -558,7 +615,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
|
||||
/client/proc/cmd_admin_create_centcom_report()
|
||||
set category = "Special Verbs"
|
||||
set name = "Create Command Report"
|
||||
if(!src.authenticated || !src.holder)
|
||||
if(!authenticated || !holder)
|
||||
src << "Only administrators may use this command."
|
||||
return
|
||||
var/input = input(usr, "Please enter anything you want. Anything. Serious.", "What?", "") as message|null
|
||||
@@ -582,7 +639,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
|
||||
set category = "Admin"
|
||||
set name = "Delete"
|
||||
|
||||
if (!src.authenticated || !src.holder)
|
||||
if (!authenticated || !holder)
|
||||
src << "Only administrators may use this command."
|
||||
return
|
||||
|
||||
@@ -595,7 +652,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
|
||||
set category = "Admin"
|
||||
set name = "List OOC"
|
||||
|
||||
if (!src.authenticated || !src.holder)
|
||||
if (!authenticated || !holder)
|
||||
src << "Only administrators may use this command."
|
||||
return
|
||||
|
||||
@@ -606,7 +663,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
|
||||
set category = "Special Verbs"
|
||||
set name = "Explosion"
|
||||
|
||||
if (!src.authenticated || !src.holder)
|
||||
if (!authenticated || !holder)
|
||||
src << "Only administrators may use this command."
|
||||
return
|
||||
|
||||
@@ -632,7 +689,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
|
||||
set category = "Special Verbs"
|
||||
set name = "EM Pulse"
|
||||
|
||||
if (!src.authenticated || !src.holder)
|
||||
if (!authenticated || !holder)
|
||||
src << "Only administrators may use this command."
|
||||
return
|
||||
|
||||
@@ -653,7 +710,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
|
||||
set category = "Special Verbs"
|
||||
set name = "Gib"
|
||||
|
||||
if (!src.authenticated || !src.holder)
|
||||
if (!authenticated || !holder)
|
||||
src << "Only administrators may use this command."
|
||||
return
|
||||
|
||||
@@ -671,15 +728,15 @@ Traitors and the like can also be revived with the previous role mostly intact.
|
||||
/client/proc/cmd_admin_gib_self()
|
||||
set name = "Gibself"
|
||||
set category = "Fun"
|
||||
if (istype(src.mob, /mob/dead/observer)) // so they don't spam gibs everywhere
|
||||
if (istype(mob, /mob/dead/observer)) // so they don't spam gibs everywhere
|
||||
return
|
||||
else
|
||||
src.mob.gib()
|
||||
mob.gib()
|
||||
/*
|
||||
/client/proc/cmd_manual_ban()
|
||||
set name = "Manual Ban"
|
||||
set category = "Special Verbs"
|
||||
if(!src.authenticated || !src.holder)
|
||||
if(!authenticated || !holder)
|
||||
src << "Only administrators may use this command."
|
||||
return
|
||||
var/mob/M = null
|
||||
@@ -692,7 +749,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
|
||||
if(!selection)
|
||||
return
|
||||
M = selection:mob
|
||||
if ((M.client && M.client.holder && (M.client.holder.level >= src.holder.level)))
|
||||
if ((M.client && M.client.holder && (M.client.holder.level >= holder.level)))
|
||||
alert("You cannot perform this action. You must be of a higher administrative rank!")
|
||||
return
|
||||
|
||||
@@ -750,7 +807,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
|
||||
/client/proc/cmd_admin_remove_plasma()
|
||||
set category = "Debug"
|
||||
set name = "Stabilize Atmos."
|
||||
if(!src.authenticated || !src.holder)
|
||||
if(!authenticated || !holder)
|
||||
src << "Only administrators may use this command."
|
||||
return
|
||||
// DEFERRED
|
||||
@@ -782,13 +839,10 @@ Traitors and the like can also be revived with the previous role mostly intact.
|
||||
set name = "Change View Range"
|
||||
set desc = "switches between 1x and custom views"
|
||||
|
||||
if(src.view == world.view)
|
||||
src.view = input("Select view range:", "FUCK YE", 7) in list(1,2,3,4,5,6,7,8,9,10,11,12,13,14,128)
|
||||
if(view == world.view)
|
||||
view = input("Select view range:", "FUCK YE", 7) in list(1,2,3,4,5,6,7,8,9,10,11,12,13,14,128)
|
||||
else
|
||||
src.view = world.view
|
||||
|
||||
|
||||
|
||||
view = world.view
|
||||
|
||||
/client/proc/admin_call_shuttle()
|
||||
|
||||
@@ -798,7 +852,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
|
||||
if ((!( ticker ) || emergency_shuttle.location))
|
||||
return
|
||||
|
||||
if (!src.authenticated || !src.holder)
|
||||
if (!authenticated || !holder)
|
||||
src << "Only administrators may use this command."
|
||||
return
|
||||
|
||||
@@ -822,7 +876,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
|
||||
if ((!( ticker ) || emergency_shuttle.location || emergency_shuttle.direction == 0))
|
||||
return
|
||||
|
||||
if (!src.authenticated || !src.holder)
|
||||
if (!authenticated || !holder)
|
||||
src << "Only administrators may use this command."
|
||||
return
|
||||
|
||||
@@ -839,30 +893,3 @@ Traitors and the like can also be revived with the previous role mostly intact.
|
||||
for(var/t in M.attack_log)
|
||||
usr << "[t]"
|
||||
|
||||
|
||||
/client/proc/makepAI(var/turf/T in world)
|
||||
set category = "Admin"
|
||||
set name = "Make pAI"
|
||||
set desc = "Specify a location to spawn a pAI device, then specify a key to play that pAI"
|
||||
|
||||
var/list/available = list()
|
||||
for(var/mob/C in world)
|
||||
if(C.key)
|
||||
available.Add(C)
|
||||
var/mob/choice = input("Choose a player to play the pAI", "Spawn pAI") in available
|
||||
if(!choice)
|
||||
return 0
|
||||
if(!istype(choice, /mob/dead/observer))
|
||||
var/confirm = input("[choice.key] isn't ghosting right now. Are you sure you want to yank him out of them out of their body and place them in this pAI?", "Spawn pAI Confirmation", "No") in list("Yes", "No")
|
||||
if(confirm != "Yes")
|
||||
return 0
|
||||
var/obj/item/device/paicard/card = new(T)
|
||||
var/mob/living/silicon/pai/pai = new(card)
|
||||
pai.name = input(choice, "Enter your pAI name:", "pAI Name", "Personal AI") as text
|
||||
pai.real_name = pai.name
|
||||
pai.key = choice.key
|
||||
card.pai = pai
|
||||
for(var/datum/paiCandidate/candidate in paiController.pai_candidates)
|
||||
if(candidate.key == choice.key)
|
||||
paiController.pai_candidates.Remove(candidate)
|
||||
|
||||
|
||||
@@ -46,18 +46,19 @@ var/global/sent_strike_team = 0
|
||||
var/nuke_code = "[rand(10000, 99999.0)]"
|
||||
|
||||
//Generates a list of commandos from active ghosts. Then the user picks which characters to respawn as the commandos.
|
||||
var/mob/dead/observer/G
|
||||
var/candidates[] = list()//candidates for being a commando out of all the active ghosts in world.
|
||||
var/commandos[] = list()//actual commando ghosts as picked by the user.
|
||||
var/mob/dead/observer/G//Basic variable to search for later.
|
||||
var/candidates_list[] = list()//candidates for being a commando out of all the active ghosts in world.
|
||||
var/commandos_list[] = list()//actual commando ghosts as picked by the user.
|
||||
for(G in world)
|
||||
if(G.client)
|
||||
if(!G.client.holder && ((G.client.inactivity/10)/60) <= 5) //Whoever called/has the proc won't be added to the list.
|
||||
// if(((G.client.inactivity/10)/60) <= 5) //Removing it allows even the caller to jump in. Good for testing.
|
||||
candidates += G
|
||||
for(var/i=commandos_possible,(i>0&&candidates.len),i--)
|
||||
G = input("Pick characters to spawn as the commandos. This will go on until there either no more ghosts to pick from or the slots are full.", "Active Players", G) in candidates//It will auto-pick a person when there is only one candidate.
|
||||
candidates -= G
|
||||
commandos += G
|
||||
candidates_list += G.client//Add their client to list.
|
||||
for(var/i=commandos_possible,(i>0&&candidates_list.len),i--)//Decrease with every commando selected.
|
||||
var/client/G_client = input("Pick characters to spawn as the commandos. This will go on until there either no more ghosts to pick from or the slots are full.", "Active Players") as null|anything in candidates_list//It will auto-pick a person when there is only one candidate.
|
||||
if(G_client)//They may have logged out when the admin was choosing people. Or were not chosen. Would run time error otherwise.
|
||||
candidates_list -= G_client//Subtract from candidates.
|
||||
commandos_list += G_client.mob//Add their ghost to commandos.
|
||||
|
||||
//Spawns commandos and equips them.
|
||||
for (var/obj/landmark/L in world)
|
||||
@@ -67,13 +68,13 @@ var/global/sent_strike_team = 0
|
||||
|
||||
var/mob/living/carbon/human/new_commando = create_death_commando(L, leader_selected)
|
||||
|
||||
if(commandos.len)
|
||||
G = pick(commandos)
|
||||
commandos -= G
|
||||
if(commandos_list.len)
|
||||
G = pick(commandos_list)
|
||||
new_commando.mind.key = G.key//For mind stuff.
|
||||
new_commando.key = G.key
|
||||
new_commando.internal = new_commando.s_store
|
||||
new_commando.internals.icon_state = "internal1"
|
||||
commandos_list -= G
|
||||
del(G)
|
||||
|
||||
new_commando.mind.store_memory("<B>Nuke Code:</B> \red [nuke_code].")//So they don't forget their code or mission.
|
||||
@@ -124,7 +125,10 @@ var/global/sent_strike_team = 0
|
||||
new_commando.mind.current = new_commando
|
||||
new_commando.mind.assigned_role = "MODE"
|
||||
new_commando.mind.special_role = "Death Commando"
|
||||
ticker.minds += new_commando.mind
|
||||
if(!(new_commando.mind in ticker.minds))
|
||||
ticker.minds += new_commando.mind//Adds them to regular mind list.
|
||||
if(!(new_commando.mind in ticker.mode.traitors))//If they weren't already an extra traitor.
|
||||
ticker.mode.traitors += new_commando.mind//Adds them to current traitor list. Which is really the extra antagonist list.
|
||||
new_commando.equip_death_commando(leader_selected)
|
||||
del(spawn_location)
|
||||
return new_commando
|
||||
|
||||
@@ -129,7 +129,7 @@ I kind of like the right click only--the window version can get a little confusi
|
||||
// return
|
||||
|
||||
if(powerc())
|
||||
var/vent_found = 0
|
||||
var/obj/machinery/atmospherics/unary/vent_pump/vent_found
|
||||
for(var/obj/machinery/atmospherics/unary/vent_pump/v in range(1,src))
|
||||
if(!v.welded)
|
||||
vent_found = v
|
||||
@@ -137,52 +137,56 @@ I kind of like the right click only--the window version can get a little confusi
|
||||
src << "\red That vent is welded."
|
||||
if(vent_found)
|
||||
var/list/vents = list()
|
||||
for(var/obj/machinery/atmospherics/unary/vent_pump/temp_vent in world)
|
||||
if(temp_vent.loc == loc)
|
||||
continue
|
||||
if(temp_vent.welded)
|
||||
continue
|
||||
vents.Add(temp_vent)
|
||||
var/list/choices = list()
|
||||
for(var/obj/machinery/atmospherics/unary/vent_pump/vent in vents)
|
||||
if(vent.loc.z != loc.z)
|
||||
continue
|
||||
if(vent.welded)
|
||||
continue
|
||||
var/atom/a = get_turf_loc(vent)
|
||||
choices.Add(a.loc)
|
||||
var/turf/startloc = loc
|
||||
var/obj/selection = input("Select a destination.", "Duct System") in choices
|
||||
var/selection_position = choices.Find(selection)
|
||||
if(loc==startloc)
|
||||
var/obj/machinery/atmospherics/unary/vent_pump/target_vent = vents[selection_position]
|
||||
if(target_vent)
|
||||
for(var/mob/O in viewers(src, null))
|
||||
O.show_message(text("<B>[src] scrambles into the ventillation ducts!</B>"), 1)
|
||||
var/list/huggers = list()
|
||||
for(var/obj/alien/facehugger/F in view(3, src))
|
||||
if(istype(F, /obj/alien/facehugger))
|
||||
huggers.Add(F)
|
||||
loc = vent_found
|
||||
if(vent_found.network&&vent_found.network.normal_members.len)
|
||||
for(var/obj/machinery/atmospherics/unary/vent_pump/temp_vent in vent_found.network.normal_members)
|
||||
if(temp_vent.loc == loc)
|
||||
continue
|
||||
if(temp_vent.welded)
|
||||
continue
|
||||
vents.Add(temp_vent)
|
||||
var/list/choices = list()
|
||||
for(var/obj/machinery/atmospherics/unary/vent_pump/vent in vents)
|
||||
if(vent.loc.z != loc.z)
|
||||
continue
|
||||
if(vent.welded)
|
||||
continue
|
||||
var/atom/a = get_turf_loc(vent)
|
||||
choices.Add(a.loc)
|
||||
var/turf/startloc = loc
|
||||
var/obj/selection = input("Select a destination.", "Duct System") in choices
|
||||
var/selection_position = choices.Find(selection)
|
||||
if(loc==startloc)
|
||||
var/obj/machinery/atmospherics/unary/vent_pump/target_vent = vents[selection_position]
|
||||
if(target_vent)
|
||||
for(var/mob/O in viewers(src, null))
|
||||
O.show_message(text("<B>[src] scrambles into the ventillation ducts!</B>"), 1)
|
||||
var/list/huggers = list()
|
||||
for(var/obj/alien/facehugger/F in view(3, src))
|
||||
if(istype(F, /obj/alien/facehugger))
|
||||
huggers.Add(F)
|
||||
loc = vent_found
|
||||
|
||||
for(var/obj/alien/facehugger/F in huggers)
|
||||
F.loc = vent_found
|
||||
var/travel_time = get_dist(loc, target_vent.loc)
|
||||
|
||||
spawn(round(travel_time/2))//give sound warning to anyone near the target vent
|
||||
if(!target_vent.welded)
|
||||
for(var/mob/O in hearers(target_vent, null))
|
||||
O.show_message("You hear something crawling trough the ventilation pipes.")
|
||||
|
||||
spawn(travel_time)
|
||||
if(target_vent.welded)//the vent can be welded while alien scrolled through the list or travelled.
|
||||
target_vent = vent_found //travel back. No additional time required.
|
||||
src << "\red The vent you were heading to appears to be welded."
|
||||
loc = target_vent.loc
|
||||
for(var/obj/alien/facehugger/F in huggers)
|
||||
F.loc = loc
|
||||
F.loc = vent_found
|
||||
var/travel_time = get_dist(loc, target_vent.loc)
|
||||
|
||||
spawn(round(travel_time/2))//give sound warning to anyone near the target vent
|
||||
if(!target_vent.welded)
|
||||
for(var/mob/O in hearers(target_vent, null))
|
||||
O.show_message("You hear something crawling trough the ventilation pipes.",2)
|
||||
|
||||
spawn(travel_time)
|
||||
if(target_vent.welded)//the vent can be welded while alien scrolled through the list or travelled.
|
||||
target_vent = vent_found //travel back. No additional time required.
|
||||
src << "\red The vent you were heading to appears to be welded."
|
||||
loc = target_vent.loc
|
||||
for(var/obj/alien/facehugger/F in huggers)
|
||||
F.loc = loc
|
||||
|
||||
else
|
||||
src << "\green You need to remain still while entering a vent."
|
||||
else
|
||||
src << "\green You need to remain still while entering a vent."
|
||||
src << "\green This vent is not connected to anything."
|
||||
else
|
||||
src << "\green You must be standing on or beside an open air vent to enter it."
|
||||
return
|
||||
@@ -27,16 +27,10 @@
|
||||
src << "\green You begin to evolve!"
|
||||
for(var/mob/O in viewers(src, null))
|
||||
O.show_message(text("\green <B>[src] begins to twist and contort!</B>"), 1)
|
||||
var/mob/living/carbon/alien/humanoid/queen/Q = new (loc)
|
||||
var/mob/living/carbon/alien/humanoid/queen/new_xeno = new (loc)
|
||||
|
||||
Q.mind = new//Mind initialize stuff.
|
||||
Q.mind.current = Q
|
||||
Q.mind.assigned_role = "Alien"
|
||||
Q.mind.special_role = "Queen"
|
||||
Q.mind.key = key
|
||||
|
||||
if(client)
|
||||
client.mob = Q
|
||||
new_xeno.mind_initialize(src, "Queen")
|
||||
new_xeno.key = key
|
||||
del(src)
|
||||
return
|
||||
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
|
||||
//This is fine right now, if we're adding organ specific damage this needs to be updated
|
||||
/mob/living/carbon/alien/humanoid/New()
|
||||
var/datum/reagents/R = new/datum/reagents(100)
|
||||
@@ -16,6 +15,12 @@
|
||||
src << "\blue Your icons have been generated!"
|
||||
..()
|
||||
|
||||
/mob/living/carbon/alien/humanoid/proc/mind_initialize(mob/G, alien_caste)
|
||||
mind = new
|
||||
mind.current = src
|
||||
mind.assigned_role = "Alien"
|
||||
mind.special_role = alien_caste
|
||||
mind.key = G.key
|
||||
|
||||
//This is fine, works the same as a human
|
||||
/mob/living/carbon/alien/humanoid/Bump(atom/movable/AM as mob|obj, yes)
|
||||
@@ -240,11 +245,6 @@
|
||||
if (wear_suit)
|
||||
if (emptyHand)
|
||||
wear_suit.DblClick()
|
||||
return
|
||||
if (( istype(W, /obj/alien/skin_suit) ))
|
||||
u_equip(W)
|
||||
head = W
|
||||
return
|
||||
return
|
||||
/* if (!( istype(W, /obj/item/clothing/suit) ))
|
||||
return
|
||||
|
||||
@@ -12,6 +12,12 @@
|
||||
// spawn(1200) grow() Grow after 120 seconds -- TLE Commented out because life.dm has better version -- Urist
|
||||
..()
|
||||
|
||||
/mob/living/carbon/alien/larva/proc/mind_initialize(mob/G, alien_caste)
|
||||
mind = new
|
||||
mind.current = src
|
||||
mind.assigned_role = "Alien"
|
||||
mind.special_role = alien_caste
|
||||
mind.key = G.key
|
||||
|
||||
//This is fine, works the same as a human
|
||||
/mob/living/carbon/alien/larva/Bump(atom/movable/AM as mob|obj, yes)
|
||||
|
||||
@@ -11,10 +11,10 @@
|
||||
set invisibility = 0
|
||||
set background = 1
|
||||
|
||||
if (src.monkeyizing)
|
||||
if (monkeyizing)
|
||||
return
|
||||
|
||||
if (src.stat != 2) //still breathing
|
||||
if (stat != 2) //still breathing
|
||||
|
||||
//First, resolve location and get a breath
|
||||
|
||||
@@ -31,7 +31,7 @@
|
||||
//blinded get reset each cycle and then get activated later in the
|
||||
//code. Very ugly. I dont care. Moving this stuff here so its easy
|
||||
//to find it.
|
||||
src.blinded = null
|
||||
blinded = null
|
||||
|
||||
//Disease Check
|
||||
handle_virus_updates()
|
||||
@@ -86,83 +86,78 @@
|
||||
|
||||
handle_mutations_and_radiation()
|
||||
|
||||
if(src.amount_grown == 200)
|
||||
if(amount_grown == 200)
|
||||
src << "\green You are growing into a beautiful alien! It is time to choose a caste."
|
||||
src << "\green There are three to choose from:"
|
||||
src << "\green <B>Hunters</B> are strong and agile, able to hunt away from the hive and rapidly move through ventilation shafts. Hunters generate plasma slowly and have low reserves."
|
||||
src << "\green <B>Sentinels</B> are tasked with protecting the hive and are deadly up close and at a range. They are not as physically imposing nor fast as the hunters."
|
||||
src << "\green <B>Drones</B> are the working class, offering the largest plasma storage and generation. They are the only caste which may evolve again, turning into the dreaded alien queen."
|
||||
var/CASTE = alert(src, "Please choose which alien caste you shall belong to.",,"Hunter","Sentinel","Drone")
|
||||
var/alien_caste = alert(src, "Please choose which alien caste you shall belong to.",,"Hunter","Sentinel","Drone")
|
||||
|
||||
var/mob/H
|
||||
switch(CASTE)
|
||||
var/mob/living/carbon/alien/humanoid/new_xeno
|
||||
switch(alien_caste)
|
||||
if("Hunter")
|
||||
H = new /mob/living/carbon/alien/humanoid/hunter (src.loc)
|
||||
new_xeno = new /mob/living/carbon/alien/humanoid/hunter (loc)
|
||||
if("Sentinel")
|
||||
H = new /mob/living/carbon/alien/humanoid/sentinel (src.loc)
|
||||
new_xeno = new /mob/living/carbon/alien/humanoid/sentinel (loc)
|
||||
if("Drone")
|
||||
H = new /mob/living/carbon/alien/humanoid/drone (src.loc)
|
||||
new_xeno = new /mob/living/carbon/alien/humanoid/drone (loc)
|
||||
|
||||
H.mind = new//Mind initialize stuff.
|
||||
H.mind.current = src
|
||||
H.mind.assigned_role = "Alien"
|
||||
H.mind.special_role = CASTE
|
||||
H.mind.key = src.key
|
||||
if(src.client)
|
||||
src.client.mob = H
|
||||
new_xeno.mind_initialize(src, alien_caste)
|
||||
new_xeno.key = key
|
||||
|
||||
del(src)
|
||||
return
|
||||
//grow!! but not if metroid or dead
|
||||
if(!istype(src,/mob/living/carbon/alien/larva/metroid) && src.health>-100)
|
||||
src.amount_grown++
|
||||
if(!istype(src,/mob/living/carbon/alien/larva/metroid) && health>-100)
|
||||
amount_grown++
|
||||
|
||||
if (src.radiation)
|
||||
if (src.radiation > 100)
|
||||
src.radiation = 100
|
||||
src.weakened = 10
|
||||
if (radiation)
|
||||
if (radiation > 100)
|
||||
radiation = 100
|
||||
weakened = 10
|
||||
src << "\red You feel weak."
|
||||
emote("collapse")
|
||||
|
||||
if (src.radiation < 0)
|
||||
src.radiation = 0
|
||||
if (radiation < 0)
|
||||
radiation = 0
|
||||
|
||||
switch(src.radiation)
|
||||
switch(radiation)
|
||||
if(1 to 49)
|
||||
src.radiation--
|
||||
radiation--
|
||||
if(prob(25))
|
||||
src.toxloss++
|
||||
src.updatehealth()
|
||||
toxloss++
|
||||
updatehealth()
|
||||
|
||||
if(50 to 74)
|
||||
src.radiation -= 2
|
||||
src.toxloss++
|
||||
radiation -= 2
|
||||
toxloss++
|
||||
if(prob(5))
|
||||
src.radiation -= 5
|
||||
src.weakened = 3
|
||||
radiation -= 5
|
||||
weakened = 3
|
||||
src << "\red You feel weak."
|
||||
emote("collapse")
|
||||
src.updatehealth()
|
||||
updatehealth()
|
||||
|
||||
if(75 to 100)
|
||||
src.radiation -= 3
|
||||
src.toxloss += 3
|
||||
src.updatehealth()
|
||||
radiation -= 3
|
||||
toxloss += 3
|
||||
updatehealth()
|
||||
|
||||
|
||||
breathe()
|
||||
|
||||
if(src.reagents.has_reagent("lexorin")) return
|
||||
if(reagents.has_reagent("lexorin")) return
|
||||
if(istype(loc, /obj/machinery/atmospherics/unary/cryo_cell)) return
|
||||
|
||||
var/datum/gas_mixture/environment = loc.return_air()
|
||||
var/datum/air_group/breath
|
||||
// HACK NEED CHANGING LATER
|
||||
if(src.health < 0)
|
||||
src.losebreath++
|
||||
if(health < 0)
|
||||
losebreath++
|
||||
|
||||
if(losebreath>0) //Suffocating so do not take a breath
|
||||
src.losebreath--
|
||||
losebreath--
|
||||
if (prob(75)) //High chance of gasping for air
|
||||
spawn emote("gasp")
|
||||
if(istype(loc, /obj/))
|
||||
@@ -201,17 +196,17 @@
|
||||
|
||||
get_breath_from_internal(volume_needed)
|
||||
if(internal)
|
||||
if (!contents.Find(src.internal))
|
||||
if (!contents.Find(internal))
|
||||
internal = null
|
||||
if (!wear_mask || !(wear_mask.flags & MASKINTERNALS) )
|
||||
internal = null
|
||||
if(internal)
|
||||
if (src.internals)
|
||||
src.internals.icon_state = "internal1"
|
||||
if (internals)
|
||||
internals.icon_state = "internal1"
|
||||
return internal.remove_air_volume(volume_needed)
|
||||
else
|
||||
if (src.internals)
|
||||
src.internals.icon_state = "internal0"
|
||||
if (internals)
|
||||
internals.icon_state = "internal0"
|
||||
return null
|
||||
|
||||
update_canmove()
|
||||
@@ -219,7 +214,7 @@
|
||||
else canmove = 1
|
||||
|
||||
handle_breath(datum/gas_mixture/breath)
|
||||
if(src.nodamage)
|
||||
if(nodamage)
|
||||
return
|
||||
|
||||
if(!breath || (breath.total_moles() == 0))
|
||||
@@ -246,7 +241,7 @@
|
||||
breath.toxins -= toxins_used
|
||||
breath.oxygen += toxins_used
|
||||
|
||||
if(breath.temperature > (T0C+66) && !(src.mutations & COLD_RESISTANCE)) // Hot air hurts :(
|
||||
if(breath.temperature > (T0C+66) && !(mutations & COLD_RESISTANCE)) // Hot air hurts :(
|
||||
if(prob(20))
|
||||
src << "\red You feel a searing heat in your lungs!"
|
||||
fire_alert = max(fire_alert, 1)
|
||||
@@ -274,25 +269,25 @@
|
||||
|
||||
if(reagents) reagents.metabolize(src)
|
||||
|
||||
if(src.nutrition > 500 && !(src.mutations & FAT))
|
||||
if(prob(5 + round((src.nutrition - 200) / 2)))
|
||||
if(nutrition > 500 && !(mutations & FAT))
|
||||
if(prob(5 + round((nutrition - 200) / 2)))
|
||||
src << "\red You suddenly feel blubbery!"
|
||||
src.mutations |= FAT
|
||||
mutations |= FAT
|
||||
// update_body()
|
||||
if (src.nutrition < 100 && src.mutations & FAT)
|
||||
if(prob(round((50 - src.nutrition) / 100)))
|
||||
if (nutrition < 100 && mutations & FAT)
|
||||
if(prob(round((50 - nutrition) / 100)))
|
||||
src << "\blue You feel fit again!"
|
||||
src.mutations &= ~FAT
|
||||
mutations &= ~FAT
|
||||
// update_body()
|
||||
if (src.nutrition > 0)
|
||||
src.nutrition-= HUNGER_FACTOR
|
||||
if (nutrition > 0)
|
||||
nutrition-= HUNGER_FACTOR
|
||||
|
||||
if (src.drowsyness)
|
||||
src.drowsyness--
|
||||
src.eye_blurry = max(2, src.eye_blurry)
|
||||
if (drowsyness)
|
||||
drowsyness--
|
||||
eye_blurry = max(2, eye_blurry)
|
||||
if (prob(5))
|
||||
src.sleeping = 1
|
||||
src.paralysis = 5
|
||||
sleeping = 1
|
||||
paralysis = 5
|
||||
|
||||
confused = max(0, confused - 1)
|
||||
// decrement dizziness counter, clamped to 0
|
||||
@@ -303,7 +298,7 @@
|
||||
dizziness = max(0, dizziness - 1)
|
||||
jitteriness = max(0, jitteriness - 1)
|
||||
|
||||
src.updatehealth()
|
||||
updatehealth()
|
||||
|
||||
return //TODO: DEFERRED
|
||||
|
||||
@@ -313,153 +308,153 @@
|
||||
|
||||
if(oxyloss > 50) paralysis = max(paralysis, 3)
|
||||
|
||||
if(src.sleeping)
|
||||
src.paralysis = max(src.paralysis, 3)
|
||||
if(sleeping)
|
||||
paralysis = max(paralysis, 3)
|
||||
if (prob(10) && health) spawn(0) emote("snore")
|
||||
src.sleeping--
|
||||
sleeping--
|
||||
|
||||
if(src.resting)
|
||||
src.weakened = max(src.weakened, 5)
|
||||
if(resting)
|
||||
weakened = max(weakened, 5)
|
||||
|
||||
if(health < -100 || src.brain_op_stage == 4.0)
|
||||
if(health < -100 || brain_op_stage == 4.0)
|
||||
death()
|
||||
else if(src.health < 0)
|
||||
if(src.health <= 20 && prob(1)) spawn(0) emote("gasp")
|
||||
else if(health < 0)
|
||||
if(health <= 20 && prob(1)) spawn(0) emote("gasp")
|
||||
|
||||
//if(!src.rejuv) src.oxyloss++
|
||||
if(!src.reagents.has_reagent("inaprovaline")) src.oxyloss++
|
||||
//if(!rejuv) oxyloss++
|
||||
if(!reagents.has_reagent("inaprovaline")) oxyloss++
|
||||
|
||||
if(src.stat != 2) src.stat = 1
|
||||
src.paralysis = max(src.paralysis, 5)
|
||||
if(stat != 2) stat = 1
|
||||
paralysis = max(paralysis, 5)
|
||||
|
||||
if (src.stat != 2) //Alive.
|
||||
if (stat != 2) //Alive.
|
||||
|
||||
if (src.paralysis || src.stunned || src.weakened) //Stunned etc.
|
||||
if (src.stunned > 0)
|
||||
src.stunned--
|
||||
src.stat = 0
|
||||
if (src.weakened > 0)
|
||||
src.weakened--
|
||||
src.lying = 1
|
||||
src.stat = 0
|
||||
if (src.paralysis > 0)
|
||||
src.paralysis--
|
||||
src.blinded = 1
|
||||
src.lying = 1
|
||||
src.stat = 1
|
||||
var/h = src.hand
|
||||
src.hand = 0
|
||||
if (paralysis || stunned || weakened) //Stunned etc.
|
||||
if (stunned > 0)
|
||||
stunned--
|
||||
stat = 0
|
||||
if (weakened > 0)
|
||||
weakened--
|
||||
lying = 1
|
||||
stat = 0
|
||||
if (paralysis > 0)
|
||||
paralysis--
|
||||
blinded = 1
|
||||
lying = 1
|
||||
stat = 1
|
||||
var/h = hand
|
||||
hand = 0
|
||||
drop_item()
|
||||
src.hand = 1
|
||||
hand = 1
|
||||
drop_item()
|
||||
src.hand = h
|
||||
hand = h
|
||||
|
||||
else //Not stunned.
|
||||
src.lying = 0
|
||||
src.stat = 0
|
||||
lying = 0
|
||||
stat = 0
|
||||
|
||||
else //Dead.
|
||||
src.lying = 1
|
||||
src.blinded = 1
|
||||
src.stat = 2
|
||||
lying = 1
|
||||
blinded = 1
|
||||
stat = 2
|
||||
|
||||
if (src.stuttering) src.stuttering--
|
||||
if (stuttering) stuttering--
|
||||
|
||||
if (src.eye_blind)
|
||||
src.eye_blind--
|
||||
src.blinded = 1
|
||||
if (eye_blind)
|
||||
eye_blind--
|
||||
blinded = 1
|
||||
|
||||
if (src.ear_deaf > 0) src.ear_deaf--
|
||||
if (src.ear_damage < 25)
|
||||
src.ear_damage -= 0.05
|
||||
src.ear_damage = max(src.ear_damage, 0)
|
||||
if (ear_deaf > 0) ear_deaf--
|
||||
if (ear_damage < 25)
|
||||
ear_damage -= 0.05
|
||||
ear_damage = max(ear_damage, 0)
|
||||
|
||||
src.density = !( src.lying )
|
||||
density = !( lying )
|
||||
|
||||
if ((src.sdisabilities & 1))
|
||||
src.blinded = 1
|
||||
if ((src.sdisabilities & 4))
|
||||
src.ear_deaf = 1
|
||||
if ((sdisabilities & 1))
|
||||
blinded = 1
|
||||
if ((sdisabilities & 4))
|
||||
ear_deaf = 1
|
||||
|
||||
if (src.eye_blurry > 0)
|
||||
src.eye_blurry--
|
||||
src.eye_blurry = max(0, src.eye_blurry)
|
||||
if (eye_blurry > 0)
|
||||
eye_blurry--
|
||||
eye_blurry = max(0, eye_blurry)
|
||||
|
||||
if (src.druggy > 0)
|
||||
src.druggy--
|
||||
src.druggy = max(0, src.druggy)
|
||||
if (druggy > 0)
|
||||
druggy--
|
||||
druggy = max(0, druggy)
|
||||
|
||||
return 1
|
||||
|
||||
handle_regular_hud_updates()
|
||||
|
||||
if (src.stat == 2 || src.mutations & XRAY)
|
||||
src.sight |= SEE_TURFS
|
||||
src.sight |= SEE_MOBS
|
||||
src.sight |= SEE_OBJS
|
||||
src.see_in_dark = 8
|
||||
src.see_invisible = 2
|
||||
else if (src.stat != 2)
|
||||
src.sight |= SEE_MOBS
|
||||
src.sight &= ~SEE_TURFS
|
||||
src.sight &= ~SEE_OBJS
|
||||
src.see_in_dark = 4
|
||||
src.see_invisible = 2
|
||||
if (stat == 2 || mutations & XRAY)
|
||||
sight |= SEE_TURFS
|
||||
sight |= SEE_MOBS
|
||||
sight |= SEE_OBJS
|
||||
see_in_dark = 8
|
||||
see_invisible = 2
|
||||
else if (stat != 2)
|
||||
sight |= SEE_MOBS
|
||||
sight &= ~SEE_TURFS
|
||||
sight &= ~SEE_OBJS
|
||||
see_in_dark = 4
|
||||
see_invisible = 2
|
||||
|
||||
if (src.sleep) src.sleep.icon_state = text("sleep[]", src.sleeping)
|
||||
if (src.rest) src.rest.icon_state = text("rest[]", src.resting)
|
||||
if (sleep) sleep.icon_state = text("sleep[]", sleeping)
|
||||
if (rest) rest.icon_state = text("rest[]", resting)
|
||||
|
||||
if (src.healths)
|
||||
if (src.stat != 2)
|
||||
if (healths)
|
||||
if (stat != 2)
|
||||
switch(health)
|
||||
if(25 to INFINITY)
|
||||
src.healths.icon_state = "health0"
|
||||
healths.icon_state = "health0"
|
||||
if(19 to 25)
|
||||
src.healths.icon_state = "health1"
|
||||
healths.icon_state = "health1"
|
||||
if(13 to 19)
|
||||
src.healths.icon_state = "health2"
|
||||
healths.icon_state = "health2"
|
||||
if(7 to 13)
|
||||
src.healths.icon_state = "health3"
|
||||
healths.icon_state = "health3"
|
||||
if(0 to 7)
|
||||
src.healths.icon_state = "health4"
|
||||
healths.icon_state = "health4"
|
||||
else
|
||||
src.healths.icon_state = "health5"
|
||||
healths.icon_state = "health5"
|
||||
else
|
||||
src.healths.icon_state = "health6"
|
||||
healths.icon_state = "health6"
|
||||
|
||||
if(src.pullin) src.pullin.icon_state = "pull[src.pulling ? 1 : 0]"
|
||||
if(pullin) pullin.icon_state = "pull[pulling ? 1 : 0]"
|
||||
|
||||
|
||||
if (src.toxin) src.toxin.icon_state = "tox[src.toxins_alert ? 1 : 0]"
|
||||
if (src.oxygen) src.oxygen.icon_state = "oxy[src.oxygen_alert ? 1 : 0]"
|
||||
if (src.fire) src.fire.icon_state = "fire[src.fire_alert ? 1 : 0]"
|
||||
if (toxin) toxin.icon_state = "tox[toxins_alert ? 1 : 0]"
|
||||
if (oxygen) oxygen.icon_state = "oxy[oxygen_alert ? 1 : 0]"
|
||||
if (fire) fire.icon_state = "fire[fire_alert ? 1 : 0]"
|
||||
//NOTE: the alerts dont reset when youre out of danger. dont blame me,
|
||||
//blame the person who coded them. Temporary fix added.
|
||||
|
||||
|
||||
src.client.screen -= src.hud_used.blurry
|
||||
src.client.screen -= src.hud_used.druggy
|
||||
src.client.screen -= src.hud_used.vimpaired
|
||||
client.screen -= hud_used.blurry
|
||||
client.screen -= hud_used.druggy
|
||||
client.screen -= hud_used.vimpaired
|
||||
|
||||
if ((src.blind && src.stat != 2))
|
||||
if ((src.blinded))
|
||||
src.blind.layer = 18
|
||||
if ((blind && stat != 2))
|
||||
if ((blinded))
|
||||
blind.layer = 18
|
||||
else
|
||||
src.blind.layer = 0
|
||||
blind.layer = 0
|
||||
|
||||
if (src.disabilities & 1)
|
||||
src.client.screen += src.hud_used.vimpaired
|
||||
if (disabilities & 1)
|
||||
client.screen += hud_used.vimpaired
|
||||
|
||||
if (src.eye_blurry)
|
||||
src.client.screen += src.hud_used.blurry
|
||||
if (eye_blurry)
|
||||
client.screen += hud_used.blurry
|
||||
|
||||
if (src.druggy)
|
||||
src.client.screen += src.hud_used.druggy
|
||||
if (druggy)
|
||||
client.screen += hud_used.druggy
|
||||
|
||||
if (src.stat != 2)
|
||||
if (src.machine)
|
||||
if (!( src.machine.check_eye(src) ))
|
||||
src.reset_view(null)
|
||||
if (stat != 2)
|
||||
if (machine)
|
||||
if (!( machine.check_eye(src) ))
|
||||
reset_view(null)
|
||||
else
|
||||
if(!client.adminobs)
|
||||
reset_view(null)
|
||||
@@ -470,18 +465,18 @@
|
||||
return
|
||||
|
||||
handle_virus_updates()
|
||||
if(src.bodytemperature > 406 && src.virus)
|
||||
src.virus.cure()
|
||||
if(bodytemperature > 406 && virus)
|
||||
virus.cure()
|
||||
return
|
||||
|
||||
check_if_buckled()
|
||||
if (src.buckled)
|
||||
src.lying = (istype(src.buckled, /obj/stool/bed) ? 1 : 0)
|
||||
if(src.lying)
|
||||
src.drop_item()
|
||||
src.density = 1
|
||||
if (buckled)
|
||||
lying = (istype(buckled, /obj/stool/bed) ? 1 : 0)
|
||||
if(lying)
|
||||
drop_item()
|
||||
density = 1
|
||||
else
|
||||
src.density = !src.lying
|
||||
density = !lying
|
||||
|
||||
handle_stomach()
|
||||
spawn(0)
|
||||
@@ -489,7 +484,7 @@
|
||||
if(M.loc != src)
|
||||
stomach_contents.Remove(M)
|
||||
continue
|
||||
if(istype(M, /mob/living/carbon) && src.stat != 2)
|
||||
if(istype(M, /mob/living/carbon) && stat != 2)
|
||||
if(M.stat == 2)
|
||||
M.death(1)
|
||||
stomach_contents.Remove(M)
|
||||
@@ -498,4 +493,4 @@
|
||||
if(air_master.current_cycle%3==1)
|
||||
if(!M.nodamage)
|
||||
M.bruteloss += 5
|
||||
src.nutrition += 10
|
||||
nutrition += 10
|
||||
|
||||
@@ -6,36 +6,39 @@
|
||||
// if(!istype(V,/obj/machinery/atmoalter/siphs/fullairsiphon/air_vent))
|
||||
// return
|
||||
if(powerc())
|
||||
var/vent_found = 0
|
||||
var/obj/machinery/atmospherics/unary/vent_pump/vent_found
|
||||
for(var/obj/machinery/atmospherics/unary/vent_pump/v in range(1,src))
|
||||
if(!v.welded)
|
||||
vent_found = v
|
||||
else
|
||||
src << "\red That vent is welded."
|
||||
if(vent_found)
|
||||
var/list/vents = list()
|
||||
for(var/obj/machinery/atmospherics/unary/vent_pump/temp_vent in world)
|
||||
if(temp_vent.loc == loc)
|
||||
continue
|
||||
vents.Add(temp_vent)
|
||||
var/list/choices = list()
|
||||
for(var/obj/machinery/atmospherics/unary/vent_pump/vent in vents)
|
||||
if(vent.loc.z != loc.z)
|
||||
continue
|
||||
var/atom/a = get_turf_loc(vent)
|
||||
choices.Add(a.loc)
|
||||
var/turf/startloc = loc
|
||||
var/obj/selection = input("Select a destination.", "Duct System") in choices
|
||||
var/selection_position = choices.Find(selection)
|
||||
if(loc==startloc)
|
||||
var/obj/target_vent = vents[selection_position]
|
||||
if(target_vent)
|
||||
for(var/mob/O in oviewers())
|
||||
if ((O.client && !( O.blinded )))
|
||||
O << text("<B>[] scrambles into the ventillation ducts!</B>", src)
|
||||
loc = target_vent.loc
|
||||
if(vent_found.network&&vent_found.network.normal_members.len)
|
||||
var/list/vents = list()
|
||||
for(var/obj/machinery/atmospherics/unary/vent_pump/temp_vent in vent_found.network.normal_members)
|
||||
if(temp_vent.loc == loc)
|
||||
continue
|
||||
vents.Add(temp_vent)
|
||||
var/list/choices = list()
|
||||
for(var/obj/machinery/atmospherics/unary/vent_pump/vent in vents)
|
||||
if(vent.loc.z != loc.z)
|
||||
continue
|
||||
var/atom/a = get_turf_loc(vent)
|
||||
choices.Add(a.loc)
|
||||
var/turf/startloc = loc
|
||||
var/obj/selection = input("Select a destination.", "Duct System") in choices
|
||||
var/selection_position = choices.Find(selection)
|
||||
if(loc==startloc)
|
||||
var/obj/target_vent = vents[selection_position]
|
||||
if(target_vent)
|
||||
for(var/mob/O in oviewers())
|
||||
if ((O.client && !( O.blinded )))
|
||||
O.show_message(text("<B>[src] scrambles into the ventillation ducts!</B>"), 1)
|
||||
loc = target_vent.loc
|
||||
else
|
||||
src << "\green You need to remain still while entering a vent."
|
||||
else
|
||||
src << "\green You need to remain still while entering a vent."
|
||||
src << "\green This vent is not connected to anything."
|
||||
else
|
||||
src << "\green You must be standing on or beside an air vent to enter it."
|
||||
return
|
||||
|
||||
+34
-14
@@ -42,6 +42,11 @@
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/proc/isalienadult(A)
|
||||
if(istype(A, /mob/living/carbon/alien/humanoid))
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/proc/islarva(A)
|
||||
if(istype(A, /mob/living/carbon/alien/larva))
|
||||
return 1
|
||||
@@ -279,9 +284,11 @@ proc/isobserver(A)
|
||||
return copytext(sanitize(t),1,MAX_MESSAGE_LEN)
|
||||
|
||||
/proc/ninjaspeak(n)
|
||||
//The difference with stutter is that this proc can stutter more than 1 letter
|
||||
//The issue here is that anything that does not have a space is treated as one word (in many instances). For instance, "LOOKING," is a word, including the comma.
|
||||
//It's fairly easy to fix if dealing with single letters but not so much with compounds of letters./N
|
||||
/*
|
||||
The difference with stutter is that this proc can stutter more than 1 letter
|
||||
The issue here is that anything that does not have a space is treated as one word (in many instances). For instance, "LOOKING," is a word, including the comma.
|
||||
It's fairly easy to fix if dealing with single letters but not so much with compounds of letters./N
|
||||
*/
|
||||
var/te = html_decode(n)
|
||||
var/t = ""
|
||||
n = length(n)
|
||||
@@ -928,17 +935,30 @@ proc/isobserver(A)
|
||||
if(usr:handcuffed && usr:canmove && (usr.last_special <= world.time))
|
||||
usr.next_move = world.time + 100
|
||||
usr.last_special = world.time + 100
|
||||
usr << "\red You attempt to remove your handcuffs. (This will take around 2 minutes and you need to stand still)"
|
||||
for(var/mob/O in viewers(usr))
|
||||
O.show_message(text("\red <B>[] attempts to remove the handcuffs!</B>", usr), 1)
|
||||
spawn(0)
|
||||
if(do_after(usr, 1200))
|
||||
if(!usr:handcuffed) return
|
||||
for(var/mob/O in viewers(usr))
|
||||
O.show_message(text("\red <B>[] manages to remove the handcuffs!</B>", usr), 1)
|
||||
usr << "\blue You successfully remove your handcuffs."
|
||||
usr:handcuffed:loc = usr:loc
|
||||
usr:handcuffed = null
|
||||
if(isalienadult(usr))//Don't want to do a lot of logic gating here.
|
||||
usr << "\green You attempt to break your handcuffs. (This will take around 5 seconds and you need to stand still)"
|
||||
for(var/mob/O in viewers(usr))
|
||||
O.show_message(text("\red <B>[] is trying to break the handcuffs!</B>", usr), 1)
|
||||
spawn(0)
|
||||
if(do_after(usr, 50))
|
||||
if(!usr:handcuffed) return
|
||||
for(var/mob/O in viewers(usr))
|
||||
O.show_message(text("\red <B>[] manages to break the handcuffs!</B>", usr), 1)
|
||||
usr << "\green You successfully break your handcuffs."
|
||||
del(usr:handcuffed)
|
||||
usr:handcuffed = null
|
||||
else
|
||||
usr << "\red You attempt to remove your handcuffs. (This will take around 2 minutes and you need to stand still)"
|
||||
for(var/mob/O in viewers(usr))
|
||||
O.show_message(text("\red <B>[] attempts to remove the handcuffs!</B>", usr), 1)
|
||||
spawn(0)
|
||||
if(do_after(usr, 1200))
|
||||
if(!usr:handcuffed) return
|
||||
for(var/mob/O in viewers(usr))
|
||||
O.show_message(text("\red <B>[] manages to remove the handcuffs!</B>", usr), 1)
|
||||
usr << "\blue You successfully remove your handcuffs."
|
||||
usr:handcuffed:loc = usr:loc
|
||||
usr:handcuffed = null
|
||||
|
||||
if(usr:handcuffed && (usr.last_special <= world.time) && usr:buckled)
|
||||
usr.next_move = world.time + 100
|
||||
|
||||
@@ -40,9 +40,8 @@
|
||||
mind.transfer_to(O)
|
||||
O.a_intent = "hurt"
|
||||
O << "<B>You are now a monkey.</B>"
|
||||
var/prev_body = src
|
||||
src = null //prevent terminating proc due to folowing del()
|
||||
del(prev_body)
|
||||
spawn(0)//To prevent the proc from returning null.
|
||||
del(src)
|
||||
return O
|
||||
|
||||
/mob/new_player/AIize()
|
||||
@@ -174,7 +173,7 @@
|
||||
O.invisibility = 0
|
||||
O.name = "Cyborg"
|
||||
O.real_name = "Cyborg"
|
||||
O.lastKnownIP = client.address
|
||||
O.lastKnownIP = client.address ? client.address : null
|
||||
if (mind)
|
||||
mind.transfer_to(O)
|
||||
if (mind.assigned_role == "Cyborg")
|
||||
@@ -199,7 +198,8 @@
|
||||
O.mmi = new /obj/item/device/mmi(O)
|
||||
O.mmi.transfer_identity(src)//Does not transfer key/client.
|
||||
|
||||
del(src)
|
||||
spawn(0)//To prevent the proc from returning null.
|
||||
del(src)
|
||||
return O
|
||||
|
||||
//human -> alien
|
||||
@@ -215,39 +215,30 @@
|
||||
invisibility = 101
|
||||
for(var/t in organs)
|
||||
del(organs[t])
|
||||
// var/atom/movable/overlay/animation = new /atom/movable/overlay( loc )
|
||||
// animation.icon_state = "blank"
|
||||
// animation.icon = 'mob.dmi'
|
||||
// animation.master = src
|
||||
// flick("h2alien", animation)
|
||||
// sleep(48)
|
||||
// del(animation)
|
||||
|
||||
var/CASTE = pick("Hunter","Sentinel","Drone")
|
||||
var/mob/O
|
||||
switch(CASTE)
|
||||
var/alien_caste = pick("Hunter","Sentinel","Drone")
|
||||
var/mob/living/carbon/alien/humanoid/new_xeno
|
||||
switch(alien_caste)
|
||||
if("Hunter")
|
||||
O = new /mob/living/carbon/alien/humanoid/hunter (loc)
|
||||
new_xeno = new /mob/living/carbon/alien/humanoid/hunter (loc)
|
||||
if("Sentinel")
|
||||
O = new /mob/living/carbon/alien/humanoid/sentinel (loc)
|
||||
new_xeno = new /mob/living/carbon/alien/humanoid/sentinel (loc)
|
||||
if("Drone")
|
||||
O = new /mob/living/carbon/alien/humanoid/drone (loc)
|
||||
new_xeno = new /mob/living/carbon/alien/humanoid/drone (loc)
|
||||
|
||||
O.dna = dna
|
||||
//Honestly not sure why it's giving them DNA.
|
||||
/*
|
||||
new_xeno.dna = dna
|
||||
dna = null
|
||||
O.dna.uni_identity = "00600200A00E0110148FC01300B009"
|
||||
O.dna.struc_enzymes = "0983E840344C39F4B059D5145FC5785DC6406A4BB8"
|
||||
new_xeno.dna.uni_identity = "00600200A00E0110148FC01300B009"
|
||||
new_xeno.dna.struc_enzymes = "0983E840344C39F4B059D5145FC5785DC6406A4BB8"
|
||||
*/
|
||||
|
||||
O.mind = new//Mind initialize stuff.
|
||||
O.mind.current = O
|
||||
O.mind.assigned_role = "Alien"
|
||||
O.mind.special_role = CASTE
|
||||
O.mind.key = key
|
||||
if(client)
|
||||
client.mob = O
|
||||
new_xeno.mind_initialize(src, alien_caste)
|
||||
new_xeno.key = key
|
||||
|
||||
|
||||
O.loc = loc
|
||||
O << "<B>You are now an alien.</B>"
|
||||
del(src)
|
||||
new_xeno.a_intent = "hurt"
|
||||
new_xeno << "<B>You are now an alien.</B>"
|
||||
spawn(0)//To prevent the proc from returning null.
|
||||
del(src)
|
||||
return
|
||||
@@ -516,6 +516,7 @@ Doing this because FindTurfs() isn't even used
|
||||
log_admin("[src.key] set the random event chance to [eventchance]%")
|
||||
message_admins("[src.key] set the random event chance to [eventchance]%")
|
||||
|
||||
/* Does nothing but blow up the station.
|
||||
/mob/verb/funbutton()
|
||||
set category = "Admin"
|
||||
set name = "Random Expl.(REMOVE ME)"
|
||||
@@ -538,6 +539,7 @@ Doing this because FindTurfs() isn't even used
|
||||
P.tmpoxy = 755985
|
||||
usr << "\blue Blowing up station ..."
|
||||
world << "[usr.key] has used boom boom boom shake the room"
|
||||
*/
|
||||
|
||||
/mob/verb/removeplasma()
|
||||
set category = "Debug"
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 145 KiB After Width: | Height: | Size: 145 KiB |
+2285
-2281
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user