mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2026-08-24 13:47:33 +01:00
Merge branch 'master' into master
This commit is contained in:
@@ -85,20 +85,21 @@
|
||||
to_chat(user, "<span class='warning'>Access denied.</span>")
|
||||
return
|
||||
usr.set_machine(src)
|
||||
var/list/node_connects = get_node_connect_dirs()
|
||||
var/dat = {"<b>Power: </b><a href='?src=\ref[src];power=1'>[use_power?"On":"Off"]</a><br>
|
||||
<b>Set Flow Rate Limit: </b>
|
||||
[set_flow_rate]L/s | <a href='?src=\ref[src];set_press=1'>Change</a>
|
||||
<br>
|
||||
<b>Flow Rate: </b>[round(last_flow_rate, 0.1)]L/s
|
||||
<br><hr>
|
||||
<b>Node 1 Concentration:</b>
|
||||
<b>Node 1 ([dir_name(node_connects[1],TRUE)]) Concentration:</b>
|
||||
<a href='?src=\ref[src];node1_c=-0.1'><b>-</b></a>
|
||||
<a href='?src=\ref[src];node1_c=-0.01'>-</a>
|
||||
[mixing_inputs[air1]]([mixing_inputs[air1]*100]%)
|
||||
<a href='?src=\ref[src];node1_c=0.01'><b>+</b></a>
|
||||
<a href='?src=\ref[src];node1_c=0.1'>+</a>
|
||||
<br>
|
||||
<b>Node 2 Concentration:</b>
|
||||
<b>Node 2 ([dir_name(node_connects[2],TRUE)]) Concentration:</b>
|
||||
<a href='?src=\ref[src];node2_c=-0.1'><b>-</b></a>
|
||||
<a href='?src=\ref[src];node2_c=-0.01'>-</a>
|
||||
[mixing_inputs[air2]]([mixing_inputs[air2]*100]%)
|
||||
|
||||
@@ -47,6 +47,8 @@
|
||||
var/radio_filter_out
|
||||
var/radio_filter_in
|
||||
|
||||
var/datum/looping_sound/air_pump/soundloop
|
||||
|
||||
/obj/machinery/atmospherics/unary/vent_pump/on
|
||||
use_power = 1
|
||||
icon_state = "map_vent_out"
|
||||
@@ -68,6 +70,10 @@
|
||||
pressure_checks = 2
|
||||
pressure_checks_default = 2
|
||||
|
||||
/obj/machinery/atmospherics/unary/vent_pump/Initialize()
|
||||
. = ..()
|
||||
soundloop = new(list(src), FALSE)
|
||||
|
||||
/obj/machinery/atmospherics/unary/vent_pump/New()
|
||||
..()
|
||||
air_contents.volume = ATMOS_DEFAULT_VOLUME_PUMP
|
||||
@@ -84,6 +90,7 @@
|
||||
if(initial_loc)
|
||||
initial_loc.air_vent_info -= id_tag
|
||||
initial_loc.air_vent_names -= id_tag
|
||||
QDEL_NULL(soundloop)
|
||||
return ..()
|
||||
|
||||
/obj/machinery/atmospherics/unary/vent_pump/high_volume
|
||||
@@ -164,11 +171,15 @@
|
||||
|
||||
/obj/machinery/atmospherics/unary/vent_pump/proc/can_pump()
|
||||
if(stat & (NOPOWER|BROKEN))
|
||||
soundloop.stop()
|
||||
return 0
|
||||
if(!use_power)
|
||||
soundloop.stop()
|
||||
return 0
|
||||
if(welded)
|
||||
soundloop.stop()
|
||||
return 0
|
||||
soundloop.start()
|
||||
return 1
|
||||
|
||||
/obj/machinery/atmospherics/unary/vent_pump/process()
|
||||
|
||||
+3
-3
@@ -9,13 +9,13 @@ mob/proc/airflow_stun()
|
||||
if(last_airflow_stun > world.time - vsc.airflow_stun_cooldown) return 0
|
||||
|
||||
if(!(status_flags & CANSTUN) && !(status_flags & CANWEAKEN))
|
||||
src << "<span class='notice'>You stay upright as the air rushes past you.</span>"
|
||||
to_chat(src, "<span class='notice'>You stay upright as the air rushes past you.</span>")
|
||||
return 0
|
||||
if(buckled)
|
||||
src << "<span class='notice'>Air suddenly rushes past you!</span>"
|
||||
to_chat(src, "<span class='notice'>Air suddenly rushes past you!</span>")
|
||||
return 0
|
||||
if(!lying)
|
||||
src << "<span class='warning'>The sudden rush of air knocks you over!</span>"
|
||||
to_chat(src, "<span class='warning'>The sudden rush of air knocks you over!</span>")
|
||||
Weaken(5)
|
||||
last_airflow_stun = world.time
|
||||
|
||||
|
||||
@@ -10,10 +10,10 @@ client/proc/ZoneTick()
|
||||
|
||||
var/result = air_master.Tick()
|
||||
if(result)
|
||||
src << "Successfully Processed."
|
||||
to_chat(src, "Successfully Processed.")
|
||||
|
||||
else
|
||||
src << "Failed to process! ([air_master.tick_progress])"
|
||||
to_chat(src, "Failed to process! ([air_master.tick_progress])")
|
||||
*/
|
||||
|
||||
client/proc/Zone_Info(turf/T as null|turf)
|
||||
|
||||
+7
-5
@@ -102,11 +102,12 @@ obj/var/contaminated = 0
|
||||
if(vsc.plc.SKIN_BURNS && (species.breath_type != "phoron"))
|
||||
if(!pl_head_protected() || !pl_suit_protected())
|
||||
burn_skin(0.75)
|
||||
if(prob(20)) src << "<span class='danger'>Your skin burns!</span>"
|
||||
if(prob(20))
|
||||
to_chat(src, "<span class='danger'>Your skin burns!</span>")
|
||||
updatehealth()
|
||||
|
||||
//Burn eyes if exposed.
|
||||
if(vsc.plc.EYE_BURNS && (species.breath_type != "phoron"))
|
||||
if(vsc.plc.EYE_BURNS && species.breath_type && (species.breath_type != "phoron")) //VOREStation Edit: those who don't breathe
|
||||
var/burn_eyes = 1
|
||||
|
||||
//Check for protective glasses
|
||||
@@ -133,17 +134,18 @@ obj/var/contaminated = 0
|
||||
if(vsc.plc.GENETIC_CORRUPTION && (species.breath_type != "phoron"))
|
||||
if(rand(1,10000) < vsc.plc.GENETIC_CORRUPTION)
|
||||
randmutb(src)
|
||||
src << "<span class='danger'>High levels of toxins cause you to spontaneously mutate!</span>"
|
||||
to_chat(src, "<span class='danger'>High levels of toxins cause you to spontaneously mutate!</span>")
|
||||
domutcheck(src,null)
|
||||
|
||||
/mob/living/carbon/human/proc/burn_eyes()
|
||||
var/obj/item/organ/internal/eyes/E = internal_organs_by_name[O_EYES]
|
||||
if(E)
|
||||
if(prob(20)) src << "<span class='danger'>Your eyes burn!</span>"
|
||||
if(prob(20))
|
||||
to_chat(src, "<span class='danger'>Your eyes burn!</span>")
|
||||
E.damage += 2.5
|
||||
eye_blurry = min(eye_blurry+1.5,50)
|
||||
if (prob(max(0,E.damage - 15) + 1) &&!eye_blind)
|
||||
src << "<span class='danger'>You are blinded!</span>"
|
||||
to_chat(src, "<span class='danger'>You are blinded!</span>")
|
||||
Blind(20)
|
||||
|
||||
/mob/living/carbon/human/proc/pl_head_protected()
|
||||
|
||||
@@ -1,2 +1,3 @@
|
||||
// More for our custom races
|
||||
#define IS_CHIMERA 12
|
||||
#define IS_CHIMERA 12
|
||||
#define IS_SHADEKIN 13
|
||||
@@ -35,4 +35,6 @@
|
||||
#define SPECIES_MONKEY_NEVREAN "Sparra"
|
||||
#define SPECIES_MONKEY_SERGAL "Saru"
|
||||
#define SPECIES_MONKEY_VULPKANIN "Wolpin"
|
||||
|
||||
#define SPECIES_WEREBEAST "Werebeast"
|
||||
#define SPECIES_SHADEKIN "Shadekin"
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
#define SPECIES_SHADEKIN_YW "GeneShadekin"
|
||||
@@ -0,0 +1 @@
|
||||
var/datum/gear_tweak/collar_tag/gear_tweak_collar_tag = new()
|
||||
@@ -1,4 +1,4 @@
|
||||
/obj/proc/analyze_gases(var/obj/A, var/mob/user)
|
||||
/obj/proc/analyze_gases(var/atom/A, var/mob/user)
|
||||
if(src != A)
|
||||
user.visible_message("<span class='notice'>\The [user] has used \an [src] on \the [A]</span>")
|
||||
|
||||
@@ -13,12 +13,12 @@
|
||||
user << "<span class='warning'>Your [src] flashes a red light as it fails to analyze \the [A].</span>"
|
||||
return 0
|
||||
|
||||
/proc/atmosanalyzer_scan(var/obj/target, var/datum/gas_mixture/mixture, var/mob/user)
|
||||
var/pressure = mixture.return_pressure()
|
||||
var/total_moles = mixture.total_moles
|
||||
|
||||
/proc/atmosanalyzer_scan(var/atom/target, var/datum/gas_mixture/mixture, var/mob/user)
|
||||
var/list/results = list()
|
||||
if (total_moles>0)
|
||||
|
||||
if (mixture && mixture.total_moles > 0)
|
||||
var/pressure = mixture.return_pressure()
|
||||
var/total_moles = mixture.total_moles
|
||||
results += "<span class='notice'>Pressure: [round(pressure,0.1)] kPa</span>"
|
||||
for(var/mix in mixture.gas)
|
||||
results += "<span class='notice'>[gas_data.name[mix]]: [round((mixture.gas[mix] / total_moles) * 100)]%</span>"
|
||||
@@ -28,7 +28,10 @@
|
||||
|
||||
return results
|
||||
|
||||
/obj/proc/atmosanalyze(var/mob/user)
|
||||
/turf/atmosanalyze(var/mob/user)
|
||||
return atmosanalyzer_scan(src, src.air, user)
|
||||
|
||||
/atom/proc/atmosanalyze(var/mob/user)
|
||||
return
|
||||
|
||||
/obj/item/weapon/tank/atmosanalyze(var/mob/user)
|
||||
@@ -40,6 +43,33 @@
|
||||
/obj/machinery/atmospherics/pipe/atmosanalyze(var/mob/user)
|
||||
return atmosanalyzer_scan(src, src.parent.air, user)
|
||||
|
||||
/obj/machinery/atmospherics/portables_connector/atmosanalyze(var/mob/user)
|
||||
return atmosanalyzer_scan(src, src.network.gases, user)
|
||||
|
||||
/obj/machinery/atmospherics/unary/atmosanalyze(var/mob/user)
|
||||
return atmosanalyzer_scan(src, src.air_contents, user)
|
||||
|
||||
/obj/machinery/atmospherics/binary/atmosanalyze(var/mob/user)
|
||||
return atmosanalyzer_scan(src, src.air1, user)
|
||||
|
||||
/obj/machinery/atmospherics/trinary/atmos_filter/atmosanalyze(var/mob/user)
|
||||
return atmosanalyzer_scan(src, src.air1, user)
|
||||
|
||||
/obj/machinery/atmospherics/trinary/mixer/atmosanalyze(var/mob/user)
|
||||
return atmosanalyzer_scan(src, src.air3, user)
|
||||
|
||||
/obj/machinery/atmospherics/omni/atmos_filter/atmosanalyze(var/mob/user)
|
||||
return atmosanalyzer_scan(src, src.input.air, user)
|
||||
|
||||
/obj/machinery/atmospherics/omni/mixer/atmosanalyze(var/mob/user)
|
||||
return atmosanalyzer_scan(src, src.output.air, user)
|
||||
|
||||
/obj/machinery/meter/atmosanalyze(var/mob/user)
|
||||
var/datum/gas_mixture/mixture = null
|
||||
if(src.target)
|
||||
mixture = src.target.parent.air
|
||||
return atmosanalyzer_scan(src, mixture, user)
|
||||
|
||||
/obj/machinery/power/rad_collector/atmosanalyze(var/mob/user)
|
||||
if(P) return atmosanalyzer_scan(src, src.P.air_contents, user)
|
||||
|
||||
|
||||
@@ -39,7 +39,7 @@
|
||||
|
||||
var/extension = copytext(path,-4,0)
|
||||
if( !fexists(path) || !(extension in valid_extensions) )
|
||||
src << "<font color='red'>Error: browse_files(): File not found/Invalid file([path]).</font>"
|
||||
to_chat(src, "<font color='red'>Error: browse_files(): File not found/Invalid file([path]).</font>")
|
||||
return
|
||||
|
||||
return path
|
||||
@@ -53,7 +53,7 @@
|
||||
/client/proc/file_spam_check()
|
||||
var/time_to_wait = fileaccess_timer - world.time
|
||||
if(time_to_wait > 0)
|
||||
src << "<font color='red'>Error: file_spam_check(): Spam. Please wait [round(time_to_wait/10)] seconds.</font>"
|
||||
to_chat(src, "<font color='red'>Error: file_spam_check(): Spam. Please wait [round(time_to_wait/10)] seconds.</font>")
|
||||
return 1
|
||||
fileaccess_timer = world.time + FTPDELAY
|
||||
return 0
|
||||
|
||||
@@ -407,7 +407,7 @@ var/global/list/contamination_colors = list("green",
|
||||
"beige",
|
||||
"pink")
|
||||
|
||||
//For the mechanic of leaving remains. Ones listed below are basically ones that got no bones.
|
||||
//For the mechanic of leaving remains. Ones listed below are basically ones that got no bones or leave no trace after death.
|
||||
var/global/list/remainless_species = list(SPECIES_PROMETHEAN,
|
||||
SPECIES_DIONA,
|
||||
SPECIES_ALRAUNE,
|
||||
@@ -426,7 +426,9 @@ var/global/list/remainless_species = list(SPECIES_PROMETHEAN,
|
||||
SPECIES_XENO_SENTINEL,
|
||||
SPECIES_XENO_QUEEN,
|
||||
SPECIES_SHADOW,
|
||||
SPECIES_GOLEM) //Some special species that may or may not be ever used in event too
|
||||
SPECIES_GOLEM, //Some special species that may or may not be ever used in event too,
|
||||
SPECIES_SHADEKIN, //Shadefluffers just poof away
|
||||
SPECIES_SHADEKIN_YW) //YW edits
|
||||
|
||||
/hook/startup/proc/init_vore_datum_ref_lists()
|
||||
var/paths
|
||||
|
||||
@@ -361,7 +361,7 @@ Turf and target are seperate in case you want to teleport some distance from a t
|
||||
break
|
||||
if(newname)
|
||||
break //That's a suitable name!
|
||||
src << "Sorry, that [role]-name wasn't appropriate, please try another. It's possibly too long/short, has bad characters or is already taken."
|
||||
to_chat(src, "Sorry, that [role]-name wasn't appropriate, please try another. It's possibly too long/short, has bad characters or is already taken.")
|
||||
|
||||
if(!newname) //we'll stick with the oldname then
|
||||
return
|
||||
|
||||
@@ -134,6 +134,12 @@
|
||||
// A is a turf or is on a turf, or in something on a turf (pen in a box); but not something in something on a turf (pen in a box in a backpack)
|
||||
sdepth = A.storage_depth_turf()
|
||||
if(isturf(A) || isturf(A.loc) || (sdepth != -1 && sdepth <= 1))
|
||||
//VOREStation Edit begin: SHADEKIN
|
||||
var/mob/SK = src
|
||||
if(istype(SK))
|
||||
if(SK.shadekin_phasing_check())
|
||||
return
|
||||
//VOREStation Edit end: SHADEKIN
|
||||
if(A.Adjacent(src) || (W && W.attack_can_reach(src, A, W.reach)) ) // see adjacent.dm
|
||||
if(W)
|
||||
// Return 1 in attackby() to prevent afterattack() effects (when safely moving items for example)
|
||||
@@ -183,7 +189,7 @@
|
||||
/mob/living/UnarmedAttack(var/atom/A, var/proximity_flag)
|
||||
|
||||
if(!ticker)
|
||||
src << "You cannot attack people before the game has started."
|
||||
to_chat(src, "You cannot attack people before the game has started.")
|
||||
return 0
|
||||
|
||||
if(stat)
|
||||
@@ -316,7 +322,7 @@
|
||||
nutrition = max(nutrition - rand(1,5),0)
|
||||
handle_regular_hud_updates()
|
||||
else
|
||||
src << "<span class='warning'>You're out of energy! You need food!</span>"
|
||||
to_chat(src, "<span class='warning'>You're out of energy! You need food!</span>")
|
||||
|
||||
// Simple helper to face what you clicked on, in case it should be needed in more than one place
|
||||
/mob/proc/face_atom(var/atom/A)
|
||||
|
||||
@@ -45,7 +45,7 @@
|
||||
if(is_component_functioning("camera"))
|
||||
aiCamera.captureimage(A, usr)
|
||||
else
|
||||
src << "<span class='userdanger'>Your camera isn't functional.</span>"
|
||||
to_chat(src, "<span class='userdanger'>Your camera isn't functional.</span>")
|
||||
return
|
||||
|
||||
/*
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
#define ui_shadekin_dark_display "EAST-1:28,CENTER-3:15"
|
||||
#define ui_shadekin_energy_display "EAST-1:28,CENTER-4:15"
|
||||
@@ -180,7 +180,8 @@
|
||||
|
||||
/mob/New()
|
||||
..()
|
||||
ability_master = new /obj/screen/movable/ability_master(src)
|
||||
if(!ability_master) //VOREStation Edit: S H A D E K I N
|
||||
ability_master = new /obj/screen/movable/ability_master(src)
|
||||
|
||||
///////////ACTUAL ABILITIES////////////
|
||||
//This is what you click to do things//
|
||||
@@ -282,7 +283,7 @@
|
||||
if(!mob)
|
||||
return // Paranoid.
|
||||
if(isnull(slot) || !isnum(slot))
|
||||
src << "<span class='warning'>.activate_ability requires a number as input, corrisponding to the slot you wish to use.</span>"
|
||||
to_chat(src, "<span class='warning'>.activate_ability requires a number as input, corrisponding to the slot you wish to use.</span>")
|
||||
return // Bad input.
|
||||
if(!mob.ability_master)
|
||||
return // No abilities.
|
||||
|
||||
@@ -293,6 +293,18 @@
|
||||
mymob.nutrition_icon.screen_loc = ui_nutrition
|
||||
hud_elements |= mymob.nutrition_icon
|
||||
|
||||
//VOREStation Addition begin
|
||||
mymob.shadekin_dark_display = new /obj/screen/shadekin/darkness()
|
||||
mymob.shadekin_dark_display.screen_loc = ui_shadekin_dark_display
|
||||
mymob.shadekin_dark_display.icon_state = "dark"
|
||||
hud_elements |= mymob.shadekin_dark_display
|
||||
|
||||
mymob.shadekin_energy_display = new /obj/screen/shadekin/energy()
|
||||
mymob.shadekin_energy_display.screen_loc = ui_shadekin_energy_display
|
||||
mymob.shadekin_energy_display.icon_state = "energy0"
|
||||
hud_elements |= mymob.shadekin_energy_display
|
||||
//VOREStation Addition end
|
||||
|
||||
mymob.ling_chem_display = new /obj/screen/ling/chems()
|
||||
mymob.ling_chem_display.screen_loc = ui_ling_chemical_display
|
||||
mymob.ling_chem_display.icon_state = "ling_chems"
|
||||
|
||||
@@ -1,16 +1,19 @@
|
||||
/obj/screen/proc/Click_vr(location, control, params) //VORESTATION AI TEMPORARY REMOVAL
|
||||
/obj/screen/proc/Click_vr(location, control, params)
|
||||
if(!usr) return 1
|
||||
switch(name)
|
||||
|
||||
//Shadekin
|
||||
if("darkness")
|
||||
var/mob/living/simple_mob/shadekin/sk = usr
|
||||
var/turf/T = get_turf(sk)
|
||||
var/turf/T = get_turf(usr)
|
||||
var/darkness = round(1 - T.get_lumcount(),0.1)
|
||||
to_chat(usr,"<span class='notice'><b>Darkness:</b> [darkness]</span>")
|
||||
if("energy")
|
||||
var/mob/living/simple_mob/shadekin/sk = usr
|
||||
to_chat(usr,"<span class='notice'><b>Energy:</b> [sk.energy] ([sk.dark_gains])</span>")
|
||||
var/mob/living/simple_mob/shadekin/SK = usr
|
||||
if(istype(SK))
|
||||
to_chat(usr,"<span class='notice'><b>Energy:</b> [SK.energy] ([SK.dark_gains])</span>")
|
||||
var/mob/living/carbon/human/H = usr
|
||||
if(istype(H) && istype(H.species, /datum/species/shadekin))
|
||||
to_chat(usr,"<span class='notice'><b>Energy:</b> [H.shadekin_get_energy(H)]</span>")
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -6,9 +6,9 @@
|
||||
if(!client) return
|
||||
client.inquisitive_ghost = !client.inquisitive_ghost
|
||||
if(client.inquisitive_ghost)
|
||||
src << "<span class='notice'>You will now examine everything you click on.</span>"
|
||||
to_chat(src, "<span class='notice'>You will now examine everything you click on.</span>")
|
||||
else
|
||||
src << "<span class='notice'>You will no longer examine things you click on.</span>"
|
||||
to_chat(src, "<span class='notice'>You will no longer examine things you click on.</span>")
|
||||
|
||||
/mob/observer/dead/DblClickOn(var/atom/A, var/params)
|
||||
if(client.buildmode)
|
||||
|
||||
@@ -18,15 +18,15 @@
|
||||
|
||||
switch(hardsuit_click_mode)
|
||||
if(MIDDLE_CLICK)
|
||||
src << "Hardsuit activation mode set to middle-click."
|
||||
to_chat(src, "Hardsuit activation mode set to middle-click.")
|
||||
if(ALT_CLICK)
|
||||
src << "Hardsuit activation mode set to alt-click."
|
||||
to_chat(src, "Hardsuit activation mode set to alt-click.")
|
||||
if(CTRL_CLICK)
|
||||
src << "Hardsuit activation mode set to control-click."
|
||||
to_chat(src, "Hardsuit activation mode set to control-click.")
|
||||
else
|
||||
// should never get here, but just in case:
|
||||
soft_assert(0, "Bad hardsuit click mode: [hardsuit_click_mode] - expected 0 to [MAX_HARDSUIT_CLICK_MODE]")
|
||||
src << "Somehow you bugged the system. Setting your hardsuit mode to middle-click."
|
||||
to_chat(src, "Somehow you bugged the system. Setting your hardsuit mode to middle-click.")
|
||||
hardsuit_click_mode = MIDDLE_CLICK
|
||||
|
||||
/mob/living/MiddleClickOn(atom/A)
|
||||
|
||||
@@ -220,7 +220,7 @@ SUBSYSTEM_DEF(vote)
|
||||
if(ticker.current_state <= GAME_STATE_SETTING_UP)
|
||||
initiator_key << "The crew transfer button has been disabled!"
|
||||
return 0
|
||||
question = "Your PDA beeps with a message from Central. Would you like an additional hour to finish ongoing projects?" //VOREStation Edit
|
||||
question = "Your PDA beeps with a message from Central. Would you like an additional four hours to finish ongoing projects?" //Yawn Wider Edit
|
||||
choices.Add("Initiate Crew Transfer", "Extend the Shift") //VOREStation Edit
|
||||
if(VOTE_ADD_ANTAGONIST)
|
||||
if(!config.allow_extra_antags || ticker.current_state >= GAME_STATE_SETTING_UP)
|
||||
|
||||
@@ -138,6 +138,12 @@
|
||||
return
|
||||
|
||||
/obj/effect/ebeam/deadly/Crossed(atom/A)
|
||||
//VOREStation Edit begin: SHADEKIN
|
||||
var/mob/SK = A
|
||||
if(istype(SK))
|
||||
if(SK.shadekin_phasing_check())
|
||||
return
|
||||
//VOREStation Edit end: SHADEKIN
|
||||
..()
|
||||
A.ex_act(1)
|
||||
|
||||
@@ -157,6 +163,12 @@
|
||||
on_contact(A)
|
||||
|
||||
/obj/effect/ebeam/reactive/Crossed(atom/A)
|
||||
//VOREStation Edit begin: SHADEKIN
|
||||
var/mob/SK = A
|
||||
if(istype(SK))
|
||||
if(SK.shadekin_phasing_check())
|
||||
return
|
||||
//VOREStation Edit end: SHADEKIN
|
||||
..()
|
||||
on_contact(A)
|
||||
|
||||
|
||||
@@ -35,10 +35,10 @@ client/verb/showrevinfo()
|
||||
set desc = "Check the current server code revision"
|
||||
|
||||
if(revdata.revision)
|
||||
src << "<b>Server revision:</b> [revdata.branch] - [revdata.date]"
|
||||
to_chat(src, "<b>Server revision:</b> [revdata.branch] - [revdata.date]")
|
||||
if(config.githuburl)
|
||||
src << "<a href='[config.githuburl]/commit/[revdata.revision]'>[revdata.revision]</a>"
|
||||
to_chat(src, "<a href='[config.githuburl]/commit/[revdata.revision]'>[revdata.revision]</a>")
|
||||
else
|
||||
src << revdata.revision
|
||||
else
|
||||
src << "Revision unknown"
|
||||
to_chat(src, "Revision unknown")
|
||||
|
||||
@@ -43,4 +43,15 @@
|
||||
mid_sounds = list('sound/machines/microwave/microwave-mid1.ogg'=10, 'sound/machines/microwave/microwave-mid2.ogg'=1)
|
||||
mid_length = 10
|
||||
end_sound = 'sound/machines/microwave/microwave-end.ogg'
|
||||
volume = 90
|
||||
volume = 90
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
/datum/looping_sound/air_pump
|
||||
start_sound = 'sound/machines/air_pump/airpumpstart.ogg'
|
||||
start_length = 10
|
||||
mid_sounds = list('sound/machines/air_pump/airpumpidle.ogg' = 1)
|
||||
mid_length = 4
|
||||
end_sound = 'sound/machines/air_pump/airpumpshutdown.ogg'
|
||||
volume = 15
|
||||
pref_check = /datum/client_preference/air_pump_noise
|
||||
@@ -15,37 +15,17 @@
|
||||
path = /obj/item/weapon/material/knife/tacknife/combatknife
|
||||
|
||||
/datum/uplink_item/item/visible_weapons/energy_sword
|
||||
name = "Energy Sword, Random"
|
||||
name = "Energy Sword, Colorable"
|
||||
item_cost = 40
|
||||
path = /obj/item/weapon/melee/energy/sword
|
||||
|
||||
/datum/uplink_item/item/visible_weapons/energy_sword_blue
|
||||
name = "Energy Sword, Blue"
|
||||
item_cost = 40
|
||||
path = /obj/item/weapon/melee/energy/sword/blue
|
||||
|
||||
/datum/uplink_item/item/visible_weapons/energy_sword_green
|
||||
name = "Energy Sword, Green"
|
||||
item_cost = 40
|
||||
path = /obj/item/weapon/melee/energy/sword/green
|
||||
|
||||
/datum/uplink_item/item/visible_weapons/energy_sword_red
|
||||
name = "Energy Sword, Red"
|
||||
item_cost = 40
|
||||
path = /obj/item/weapon/melee/energy/sword/red
|
||||
|
||||
/datum/uplink_item/item/visible_weapons/energy_sword_purple
|
||||
name = "Energy Sword, Purple"
|
||||
item_cost = 40
|
||||
path = /obj/item/weapon/melee/energy/sword/purple
|
||||
|
||||
/datum/uplink_item/item/visible_weapons/energy_sword_pirate
|
||||
name = "Energy Cutlass"
|
||||
name = "Energy Cutlass, Colorable"
|
||||
item_cost = 40
|
||||
path = /obj/item/weapon/melee/energy/sword/pirate
|
||||
|
||||
/datum/uplink_item/item/visible_weapons/energy_spear
|
||||
name = "Energy Spear"
|
||||
name = "Energy Spear, Colorable"
|
||||
item_cost = 50
|
||||
path = /obj/item/weapon/melee/energy/spear
|
||||
|
||||
@@ -192,4 +172,4 @@
|
||||
/datum/uplink_item/item/visible_weapons/xray
|
||||
name = "Xray Gun"
|
||||
item_cost = 85
|
||||
path = /obj/item/weapon/gun/energy/xray
|
||||
path = /obj/item/weapon/gun/energy/xray
|
||||
|
||||
@@ -14,33 +14,33 @@
|
||||
return
|
||||
|
||||
if(faction.is_antagonist(player))
|
||||
src << "<span class='warning'>\The [player.current] already serves the [faction.faction_descriptor].</span>"
|
||||
to_chat(src, "<span class='warning'>\The [player.current] already serves the [faction.faction_descriptor].</span>")
|
||||
return
|
||||
|
||||
if(player_is_antag(player))
|
||||
src << "<span class='warning'>\The [player.current]'s loyalties seem to be elsewhere...</span>"
|
||||
to_chat(src, "<span class='warning'>\The [player.current]'s loyalties seem to be elsewhere...</span>")
|
||||
return
|
||||
|
||||
if(!faction.can_become_antag(player))
|
||||
src << "<span class='warning'>\The [player.current] cannot be \a [faction.faction_role_text]!</span>"
|
||||
to_chat(src, "<span class='warning'>\The [player.current] cannot be \a [faction.faction_role_text]!</span>")
|
||||
return
|
||||
|
||||
if(world.time < player.rev_cooldown)
|
||||
src << "<span class='danger'>You must wait five seconds between attempts.</span>"
|
||||
to_chat(src, "<span class='danger'>You must wait five seconds between attempts.</span>")
|
||||
return
|
||||
|
||||
src << "<span class='danger'>You are attempting to convert \the [player.current]...</span>"
|
||||
to_chat(src, "<span class='danger'>You are attempting to convert \the [player.current]...</span>")
|
||||
log_admin("[src]([src.ckey]) attempted to convert [player.current].")
|
||||
message_admins("<span class='danger'>[src]([src.ckey]) attempted to convert [player.current].</span>")
|
||||
|
||||
player.rev_cooldown = world.time+100
|
||||
var/choice = alert(player.current,"Asked by [src]: Do you want to join the [faction.faction_descriptor]?","Join the [faction.faction_descriptor]?","No!","Yes!")
|
||||
if(choice == "Yes!" && faction.add_antagonist_mind(player, 0, faction.faction_role_text, faction.faction_welcome))
|
||||
src << "<span class='notice'>\The [player.current] joins the [faction.faction_descriptor]!</span>"
|
||||
to_chat(src, "<span class='notice'>\The [player.current] joins the [faction.faction_descriptor]!</span>")
|
||||
return
|
||||
if(choice == "No!")
|
||||
player << "<span class='danger'>You reject this traitorous cause!</span>"
|
||||
src << "<span class='danger'>\The [player.current] does not support the [faction.faction_descriptor]!</span>"
|
||||
to_chat(src, "<span class='danger'>\The [player.current] does not support the [faction.faction_descriptor]!</span>")
|
||||
|
||||
/mob/living/proc/convert_to_loyalist(mob/M as mob in oview(src))
|
||||
set name = "Convert Recidivist"
|
||||
|
||||
@@ -38,8 +38,8 @@
|
||||
if(!mind)
|
||||
return
|
||||
if(!is_special_character(mind))
|
||||
src << "<span class='warning'>While you may perhaps have goals, this verb's meant to only be visible \
|
||||
to antagonists. Please make a bug report!</span>"
|
||||
to_chat(src, "<span class='warning'>While you may perhaps have goals, this verb's meant to only be visible \
|
||||
to antagonists. Please make a bug report!</span>")
|
||||
return
|
||||
var/new_ambitions = input(src, "Write a short sentence of what your character hopes to accomplish \
|
||||
today as an antagonist. Remember that this is purely optional. It will be shown at the end of the \
|
||||
@@ -49,7 +49,7 @@
|
||||
new_ambitions = sanitize(new_ambitions)
|
||||
mind.ambitions = new_ambitions
|
||||
if(new_ambitions)
|
||||
src << "<span class='notice'>You've set your goal to be '[new_ambitions]'.</span>"
|
||||
to_chat(src, "<span class='notice'>You've set your goal to be '[new_ambitions]'.</span>")
|
||||
else
|
||||
src << "<span class='notice'>You leave your ambitions behind.</span>"
|
||||
to_chat(src, "<span class='notice'>You leave your ambitions behind.</span>")
|
||||
log_and_message_admins("has set their ambitions to now be: [new_ambitions].")
|
||||
|
||||
@@ -115,18 +115,18 @@ obj/item/clothing
|
||||
/*Checks if the wizard is wearing the proper attire.
|
||||
Made a proc so this is not repeated 14 (or more) times.*/
|
||||
/mob/proc/wearing_wiz_garb()
|
||||
src << "Silly creature, you're not a human. Only humans can cast this spell."
|
||||
to_chat(src, "Silly creature, you're not a human. Only humans can cast this spell.")
|
||||
return 0
|
||||
|
||||
// Humans can wear clothes.
|
||||
/mob/living/carbon/human/wearing_wiz_garb()
|
||||
if(!is_wiz_garb(src.wear_suit))
|
||||
src << "<span class='warning'>I don't feel strong enough without my robe.</span>"
|
||||
to_chat(src, "<span class='warning'>I don't feel strong enough without my robe.</span>")
|
||||
return 0
|
||||
if(!is_wiz_garb(src.shoes))
|
||||
src << "<span class='warning'>I don't feel strong enough without my sandals.</span>"
|
||||
to_chat(src, "<span class='warning'>I don't feel strong enough without my sandals.</span>")
|
||||
return 0
|
||||
if(!is_wiz_garb(src.head))
|
||||
src << "<span class='warning'>I don't feel strong enough without my hat.</span>"
|
||||
to_chat(src, "<span class='warning'>I don't feel strong enough without my hat.</span>")
|
||||
return 0
|
||||
return 1
|
||||
|
||||
@@ -111,6 +111,8 @@ var/global/list/datum/dna/gene/dna_genes[0]
|
||||
// New stuff
|
||||
var/species = SPECIES_HUMAN
|
||||
var/list/body_markings = list()
|
||||
var/list/body_descriptors = null
|
||||
var/list/genetic_modifiers = list() // Modifiers with the MODIFIER_GENETIC flag are saved. Note that only the type is saved, not an instance.
|
||||
|
||||
// Make a copy of this strand.
|
||||
// USE THIS WHEN COPYING STUFF OR YOU'LL GET CORRUPTION!
|
||||
|
||||
@@ -129,19 +129,19 @@ var/global/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","E
|
||||
return
|
||||
|
||||
if(src.stat > max_stat)
|
||||
src << "<span class='warning'>We are incapacitated.</span>"
|
||||
to_chat(src, "<span class='warning'>We are incapacitated.</span>")
|
||||
return
|
||||
|
||||
if(changeling.absorbed_dna.len < required_dna)
|
||||
src << "<span class='warning'>We require at least [required_dna] samples of compatible DNA.</span>"
|
||||
to_chat(src, "<span class='warning'>We require at least [required_dna] samples of compatible DNA.</span>")
|
||||
return
|
||||
|
||||
if(changeling.chem_charges < required_chems)
|
||||
src << "<span class='warning'>We require at least [required_chems] units of chemicals to do that!</span>"
|
||||
to_chat(src, "<span class='warning'>We require at least [required_chems] units of chemicals to do that!</span>")
|
||||
return
|
||||
|
||||
if(changeling.geneticdamage > max_genetic_damage)
|
||||
src << "<span class='warning'>Our genomes are still reassembling. We need time to recover first.</span>"
|
||||
to_chat(src, "<span class='warning'>Our genomes are still reassembling. We need time to recover first.</span>")
|
||||
return
|
||||
|
||||
return changeling
|
||||
@@ -204,11 +204,11 @@ turf/proc/AdjacentTurfsRangedSting()
|
||||
if(M.loc == src.loc)
|
||||
return 1 //target and source are in the same thing
|
||||
if(!isturf(src.loc) || !isturf(M.loc))
|
||||
src << "<span class='warning'>We cannot reach \the [M] with a sting!</span>"
|
||||
to_chat(src, "<span class='warning'>We cannot reach \the [M] with a sting!</span>")
|
||||
return 0 //One is inside, the other is outside something.
|
||||
// Maximum queued turfs set to 25; I don't *think* anything raises sting_range above 2, but if it does the 25 may need raising
|
||||
if(!AStar(src.loc, M.loc, /turf/proc/AdjacentTurfsRangedSting, /turf/proc/Distance, max_nodes=25, max_node_depth=sting_range)) //If we can't find a path, fail
|
||||
src << "<span class='warning'>We cannot find a path to sting \the [M] by!</span>"
|
||||
to_chat(src, "<span class='warning'>We cannot find a path to sting \the [M] by!</span>")
|
||||
return 0
|
||||
return 1
|
||||
|
||||
@@ -225,7 +225,7 @@ turf/proc/AdjacentTurfsRangedSting()
|
||||
if(!T)
|
||||
return
|
||||
if(T.isSynthetic())
|
||||
src << "<span class='notice'>We are unable to pierce the outer shell of [T].</span>"
|
||||
to_chat(src, "<span class='notice'>We are unable to pierce the outer shell of [T].</span>")
|
||||
return
|
||||
if(!(T in view(changeling.sting_range))) return
|
||||
if(!sting_can_reach(T, changeling.sting_range)) return
|
||||
@@ -236,7 +236,7 @@ turf/proc/AdjacentTurfsRangedSting()
|
||||
src.verbs -= verb_path
|
||||
spawn(10) src.verbs += verb_path
|
||||
|
||||
src << "<span class='notice'>We stealthily sting [T].</span>"
|
||||
to_chat(src, "<span class='notice'>We stealthily sting [T].</span>")
|
||||
if(!T.mind || !T.mind.changeling) return T //T will be affected by the sting
|
||||
T << "<span class='warning'>You feel a tiny prick.</span>"
|
||||
return
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
return 1
|
||||
|
||||
if(M.head || M.wear_suit) //Make sure our slots aren't full
|
||||
src << "<span class='warning'>We require nothing to be on our head, and we cannot wear any external suits, or shoes.</span>"
|
||||
to_chat(src, "<span class='warning'>We require nothing to be on our head, and we cannot wear any external suits, or shoes.</span>")
|
||||
return 0
|
||||
|
||||
var/obj/item/clothing/suit/A = new armor_type(src)
|
||||
@@ -242,7 +242,7 @@
|
||||
var/mob/living/carbon/human/M = src
|
||||
|
||||
if(M.hands_are_full()) //Make sure our hands aren't full.
|
||||
src << "<span class='warning'>Our hands are full. Drop something first.</span>"
|
||||
to_chat(src, "<span class='warning'>Our hands are full. Drop something first.</span>")
|
||||
return 0
|
||||
|
||||
var/obj/item/weapon/W = new weapon_type(src)
|
||||
|
||||
@@ -16,41 +16,41 @@
|
||||
|
||||
var/obj/item/weapon/grab/G = src.get_active_hand()
|
||||
if(!istype(G))
|
||||
src << "<span class='warning'>We must be grabbing a creature in our active hand to absorb them.</span>"
|
||||
to_chat(src, "<span class='warning'>We must be grabbing a creature in our active hand to absorb them.</span>")
|
||||
return
|
||||
|
||||
var/mob/living/carbon/human/T = G.affecting
|
||||
if(!istype(T) || T.isSynthetic())
|
||||
src << "<span class='warning'>\The [T] is not compatible with our biology.</span>"
|
||||
to_chat(src, "<span class='warning'>\The [T] is not compatible with our biology.</span>")
|
||||
return
|
||||
|
||||
if(T.species.flags & NO_SCAN)
|
||||
src << "<span class='warning'>We do not know how to parse this creature's DNA!</span>"
|
||||
to_chat(src, "<span class='warning'>We do not know how to parse this creature's DNA!</span>")
|
||||
return
|
||||
|
||||
if(HUSK in T.mutations) //Lings can always absorb other lings, unless someone beat them to it first.
|
||||
if(!T.mind.changeling || T.mind.changeling && T.mind.changeling.geneticpoints < 0)
|
||||
src << "<span class='warning'>This creature's DNA is ruined beyond useability!</span>"
|
||||
to_chat(src, "<span class='warning'>This creature's DNA is ruined beyond useability!</span>")
|
||||
return
|
||||
|
||||
if(G.state != GRAB_KILL)
|
||||
src << "<span class='warning'>We must have a tighter grip to absorb this creature.</span>"
|
||||
to_chat(src, "<span class='warning'>We must have a tighter grip to absorb this creature.</span>")
|
||||
return
|
||||
|
||||
if(changeling.isabsorbing)
|
||||
src << "<span class='warning'>We are already absorbing!</span>"
|
||||
to_chat(src, "<span class='warning'>We are already absorbing!</span>")
|
||||
return
|
||||
|
||||
changeling.isabsorbing = 1
|
||||
for(var/stage = 1, stage<=3, stage++)
|
||||
switch(stage)
|
||||
if(1)
|
||||
src << "<span class='notice'>This creature is compatible. We must hold still...</span>"
|
||||
to_chat(src, "<span class='notice'>This creature is compatible. We must hold still...</span>")
|
||||
if(2)
|
||||
src << "<span class='notice'>We extend a proboscis.</span>"
|
||||
to_chat(src, "<span class='notice'>We extend a proboscis.</span>")
|
||||
src.visible_message("<span class='warning'>[src] extends a proboscis!</span>")
|
||||
if(3)
|
||||
src << "<span class='notice'>We stab [T] with the proboscis.</span>"
|
||||
to_chat(src, "<span class='notice'>We stab [T] with the proboscis.</span>")
|
||||
src.visible_message("<span class='danger'>[src] stabs [T] with the proboscis!</span>")
|
||||
T << "<span class='danger'>You feel a sharp stabbing pain!</span>"
|
||||
add_attack_logs(src,T,"Absorbed (changeling)")
|
||||
@@ -60,11 +60,11 @@
|
||||
|
||||
feedback_add_details("changeling_powers","A[stage]")
|
||||
if(!do_mob(src, T, 150) || G.state != GRAB_KILL)
|
||||
src << "<span class='warning'>Our absorption of [T] has been interrupted!</span>"
|
||||
to_chat(src, "<span class='warning'>Our absorption of [T] has been interrupted!</span>")
|
||||
changeling.isabsorbing = 0
|
||||
return
|
||||
|
||||
src << "<span class='notice'>We have absorbed [T]!</span>"
|
||||
to_chat(src, "<span class='notice'>We have absorbed [T]!</span>")
|
||||
src.visible_message("<span class='danger'>[src] sucks the fluids from [T]!</span>")
|
||||
T << "<span class='danger'>You have been absorbed by the changeling!</span>"
|
||||
if(src.nutrition < 400)
|
||||
@@ -76,7 +76,7 @@
|
||||
if(changeling.readapts > changeling.max_readapts)
|
||||
changeling.readapts = changeling.max_readapts
|
||||
|
||||
src << "<span class='notice'>We can now re-adapt, reverting our evolution so that we may start anew, if needed.</span>"
|
||||
to_chat(src, "<span class='notice'>We can now re-adapt, reverting our evolution so that we may start anew, if needed.</span>")
|
||||
|
||||
var/datum/absorbed_dna/newDNA = new(T.real_name, T.dna, T.species.name, T.languages, T.identifying_gender, T.flavor_texts, T.modifiers)
|
||||
absorbDNA(newDNA)
|
||||
@@ -98,7 +98,7 @@
|
||||
changeling.geneticpoints += 4
|
||||
changeling.max_geneticpoints += 4
|
||||
|
||||
src << "<span class='notice'>We absorbed another changeling, and we grow stronger. Our genomes increase.</span>"
|
||||
to_chat(src, "<span class='notice'>We absorbed another changeling, and we grow stronger. Our genomes increase.</span>")
|
||||
|
||||
T.mind.changeling.chem_charges = 0
|
||||
T.mind.changeling.geneticpoints = -1
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
|
||||
if(src.mind.changeling.recursive_enhancement)
|
||||
if(changeling_generic_weapon(/obj/item/weapon/melee/changeling/arm_blade/greater))
|
||||
src << "<span class='notice'>We prepare an extra sharp blade.</span>"
|
||||
to_chat(src, "<span class='notice'>We prepare an extra sharp blade.</span>")
|
||||
return 1
|
||||
|
||||
else
|
||||
@@ -39,7 +39,7 @@
|
||||
|
||||
if(src.mind.changeling.recursive_enhancement)
|
||||
if(changeling_generic_weapon(/obj/item/weapon/melee/changeling/claw/greater, 1, 15))
|
||||
src << "<span class='notice'>We prepare an extra sharp claw.</span>"
|
||||
to_chat(src, "<span class='notice'>We prepare an extra sharp claw.</span>")
|
||||
return 1
|
||||
|
||||
else
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
if(held_item == null)
|
||||
if(src.mind.changeling.recursive_enhancement)
|
||||
if(changeling_generic_weapon(/obj/item/weapon/electric_hand/efficent,0))
|
||||
src << "<span class='notice'>We will shock others more efficently.</span>"
|
||||
to_chat(src, "<span class='notice'>We will shock others more efficently.</span>")
|
||||
return 1
|
||||
else
|
||||
if(changeling_generic_weapon(/obj/item/weapon/electric_hand,0)) //Chemical cost is handled in the equip proc.
|
||||
@@ -54,7 +54,7 @@
|
||||
"<span class='warning'>Our hand channels raw electricity into [G.affecting].</span>",
|
||||
"<span class='italics'>You hear sparks!</span>")
|
||||
else
|
||||
src << "<span class='warning'>Our gloves block us from shocking \the [G.affecting].</span>"
|
||||
to_chat(src, "<span class='warning'>Our gloves block us from shocking \the [G.affecting].</span>")
|
||||
src.mind.changeling.chem_charges -= 10
|
||||
return 1
|
||||
|
||||
@@ -92,7 +92,7 @@
|
||||
sleep(1 SECOND)
|
||||
success = 1
|
||||
if(success == 0) //If we couldn't do anything with the ability, don't deduct the chemicals.
|
||||
src << "<span class='warning'>We are unable to affect \the [held_item].</span>"
|
||||
to_chat(src, "<span class='warning'>We are unable to affect \the [held_item].</span>")
|
||||
else
|
||||
src.mind.changeling.chem_charges -= 10
|
||||
return success
|
||||
@@ -143,7 +143,7 @@
|
||||
var/mob/living/carbon/C = target
|
||||
|
||||
if(user.mind.changeling.chem_charges < shock_cost)
|
||||
src << "<span class='warning'>We require more chemicals to electrocute [C]!</span>"
|
||||
to_chat(src, "<span class='warning'>We require more chemicals to electrocute [C]!</span>")
|
||||
return 0
|
||||
|
||||
C.electrocute_act(electrocute_amount * siemens,src,1.0,BP_TORSO)
|
||||
@@ -156,7 +156,7 @@
|
||||
"<span class='warning'>Our hand channels raw electricity into [C]</span>",
|
||||
"<span class='italics'>You hear sparks!</span>")
|
||||
else
|
||||
src << "<span class='warning'>Our gloves block us from shocking \the [C].</span>"
|
||||
to_chat(src, "<span class='warning'>Our gloves block us from shocking \the [C].</span>")
|
||||
//qdel(src) //Since we're no longer a one hit stun, we need to stick around.
|
||||
user.mind.changeling.chem_charges -= shock_cost
|
||||
return 1
|
||||
@@ -165,7 +165,7 @@
|
||||
var/mob/living/silicon/S = target
|
||||
|
||||
if(user.mind.changeling.chem_charges < 10)
|
||||
src << "<span class='warning'>We require more chemicals to electrocute [S]!</span>"
|
||||
to_chat(src, "<span class='warning'>We require more chemicals to electrocute [S]!</span>")
|
||||
return 0
|
||||
|
||||
S.electrocute_act(60,src,0.75) //If only they had surge protectors.
|
||||
@@ -205,7 +205,7 @@
|
||||
success = 1
|
||||
break
|
||||
if(success == 0)
|
||||
src << "<span class='warning'>We are unable to affect \the [target].</span>"
|
||||
to_chat(src, "<span class='warning'>We are unable to affect \the [target].</span>")
|
||||
else
|
||||
qdel(src)
|
||||
return 1
|
||||
@@ -21,7 +21,7 @@
|
||||
var/duration = 300
|
||||
if(src.mind.changeling.recursive_enhancement)
|
||||
duration = duration + 150
|
||||
src << "<span class='notice'>They will be deprived of sight for longer.</span>"
|
||||
to_chat(src, "<span class='notice'>They will be deprived of sight for longer.</span>")
|
||||
spawn(duration)
|
||||
T.disabilities &= ~NEARSIGHTED
|
||||
T.Blind(10)
|
||||
|
||||
@@ -20,12 +20,12 @@
|
||||
var/inject_amount = 10
|
||||
if(src.mind.changeling.recursive_enhancement)
|
||||
inject_amount = inject_amount * 1.5
|
||||
src << "<span class='notice'>We inject extra chemicals.</span>"
|
||||
to_chat(src, "<span class='notice'>We inject extra chemicals.</span>")
|
||||
if(T.reagents)
|
||||
T.reagents.add_reagent("cryotoxin", inject_amount)
|
||||
feedback_add_details("changeling_powers","CS")
|
||||
src.verbs -= /mob/proc/changeling_cryo_sting
|
||||
spawn(3 MINUTES)
|
||||
src << "<span class='notice'>Our cryogenic string is ready to be used once more.</span>"
|
||||
to_chat(src, "<span class='notice'>Our cryogenic string is ready to be used once more.</span>")
|
||||
src.verbs |= /mob/proc/changeling_cryo_sting
|
||||
return 1
|
||||
@@ -19,7 +19,7 @@
|
||||
var/duration = 300
|
||||
if(src.mind.changeling.recursive_enhancement)
|
||||
duration = duration + 100
|
||||
src << "<span class='notice'>They will be unable to hear for a little longer.</span>"
|
||||
to_chat(src, "<span class='notice'>They will be unable to hear for a little longer.</span>")
|
||||
T << "<span class='danger'>Your ears pop and begin ringing loudly!</span>"
|
||||
T.sdisabilities |= DEAF
|
||||
spawn(duration) T.sdisabilities &= ~DEAF
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
var/type_to_give = /datum/modifier/delayed_toxin_sting
|
||||
if(src.mind.changeling.recursive_enhancement)
|
||||
type_to_give = /datum/modifier/delayed_toxin_sting/strong
|
||||
src << "<span class='notice'>Our toxin will be extra potent, when it strikes.</span>"
|
||||
to_chat(src, "<span class='notice'>Our toxin will be extra potent, when it strikes.</span>")
|
||||
|
||||
T.add_modifier(type_to_give, 2 MINUTES)
|
||||
|
||||
|
||||
@@ -40,7 +40,7 @@
|
||||
var/type_to_give = /datum/modifier/enfeeble
|
||||
if(src.mind.changeling.recursive_enhancement)
|
||||
type_to_give = /datum/modifier/enfeeble/strong
|
||||
src << "<span class='notice'>We make them extremely weak.</span>"
|
||||
to_chat(src, "<span class='notice'>We make them extremely weak.</span>")
|
||||
H.add_modifier(type_to_give, 2 MINUTES)
|
||||
feedback_add_details("changeling_powers","ES")
|
||||
return 1
|
||||
@@ -24,15 +24,15 @@
|
||||
return
|
||||
|
||||
if(!istype(T) || T.isSynthetic())
|
||||
src << "<span class='warning'>\The [T] is not compatible with our biology.</span>"
|
||||
to_chat(src, "<span class='warning'>\The [T] is not compatible with our biology.</span>")
|
||||
return 0
|
||||
|
||||
if(T.species.flags & NO_SCAN)
|
||||
src << "<span class='warning'>We do not know how to parse this creature's DNA!</span>"
|
||||
to_chat(src, "<span class='warning'>We do not know how to parse this creature's DNA!</span>")
|
||||
return 0
|
||||
|
||||
if(HUSK in T.mutations)
|
||||
src << "<span class='warning'>This creature's DNA is ruined beyond useability!</span>"
|
||||
to_chat(src, "<span class='warning'>This creature's DNA is ruined beyond useability!</span>")
|
||||
return 0
|
||||
|
||||
add_attack_logs(src,T,"DNA extraction sting (changeling)")
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
var/mob/living/carbon/C = src
|
||||
|
||||
if(changeling.max_geneticpoints < 0) //Absorbed by another ling
|
||||
src << "<span class='danger'>We have no genomes, not even our own, and cannot regenerate.</span>"
|
||||
to_chat(src, "<span class='danger'>We have no genomes, not even our own, and cannot regenerate.</span>")
|
||||
return 0
|
||||
|
||||
if(!C.stat && alert("Are we sure we wish to regenerate? We will appear to be dead while doing so.","Revival","Yes","No") == "No")
|
||||
@@ -44,7 +44,7 @@
|
||||
spawn(rand(2 MINUTES, 4 MINUTES))
|
||||
//The ling will now be able to choose when to revive
|
||||
src.verbs += /mob/proc/changeling_revive
|
||||
src << "<span class='notice'><font size='5'>We are ready to rise. Use the <b>Revive</b> verb when you are ready.</font></span>"
|
||||
to_chat(src, "<span class='notice'><font size='5'>We are ready to rise. Use the <b>Revive</b> verb when you are ready.</font></span>")
|
||||
|
||||
feedback_add_details("changeling_powers","FD")
|
||||
return 1
|
||||
@@ -22,10 +22,10 @@
|
||||
var/heal_amount = 2
|
||||
if(src.mind.changeling.recursive_enhancement)
|
||||
heal_amount = heal_amount * 2
|
||||
src << "<span class='notice'>We will heal much faster.</span>"
|
||||
to_chat(src, "<span class='notice'>We will heal much faster.</span>")
|
||||
|
||||
spawn(0)
|
||||
src << "<span class='notice'>We begin to heal ourselves.</span>"
|
||||
to_chat(src, "<span class='notice'>We begin to heal ourselves.</span>")
|
||||
for(var/i = 0, i<50,i++)
|
||||
if(C)
|
||||
C.adjustBruteLoss(-heal_amount)
|
||||
@@ -35,7 +35,7 @@
|
||||
|
||||
src.verbs -= /mob/proc/changeling_fleshmend
|
||||
spawn(50 SECONDS)
|
||||
src << "<span class='notice'>Our regeneration has slowed to normal levels.</span>"
|
||||
to_chat(src, "<span class='notice'>Our regeneration has slowed to normal levels.</span>")
|
||||
src.verbs += /mob/proc/changeling_fleshmend
|
||||
feedback_add_details("changeling_powers","FM")
|
||||
return 1
|
||||
@@ -34,7 +34,7 @@ var/list/datum/dna/hivemind_bank = list()
|
||||
names += DNA.name
|
||||
|
||||
if(names.len <= 0)
|
||||
src << "<span class='notice'>The airwaves already have all of our DNA.</span>"
|
||||
to_chat(src, "<span class='notice'>The airwaves already have all of our DNA.</span>")
|
||||
return
|
||||
|
||||
var/S = input("Select a DNA to channel: ", "Channel DNA", null) as null|anything in names
|
||||
@@ -46,7 +46,7 @@ var/list/datum/dna/hivemind_bank = list()
|
||||
|
||||
changeling.chem_charges -= 10
|
||||
hivemind_bank += chosen_dna
|
||||
src << "<span class='notice'>We channel the DNA of [S] to the air.</span>"
|
||||
to_chat(src, "<span class='notice'>We channel the DNA of [S] to the air.</span>")
|
||||
feedback_add_details("changeling_powers","HU")
|
||||
return 1
|
||||
|
||||
@@ -64,7 +64,7 @@ var/list/datum/dna/hivemind_bank = list()
|
||||
names[DNA.name] = DNA
|
||||
|
||||
if(names.len <= 0)
|
||||
src << "<span class='notice'>There's no new DNA to absorb from the air.</span>"
|
||||
to_chat(src, "<span class='notice'>There's no new DNA to absorb from the air.</span>")
|
||||
return
|
||||
|
||||
var/S = input("Select a DNA absorb from the air: ", "Absorb DNA", null) as null|anything in names
|
||||
@@ -75,6 +75,6 @@ var/list/datum/dna/hivemind_bank = list()
|
||||
|
||||
changeling.chem_charges -= 20
|
||||
absorbDNA(chosen_dna)
|
||||
src << "<span class='notice'>We absorb the DNA of [S] from the air.</span>"
|
||||
to_chat(src, "<span class='notice'>We absorb the DNA of [S] from the air.</span>")
|
||||
feedback_add_details("changeling_powers","HD")
|
||||
return 1
|
||||
@@ -13,13 +13,13 @@
|
||||
if(!changeling) return
|
||||
|
||||
if(src.has_brain_worms())
|
||||
src << "<span class='warning'>We cannot perform this ability at the present time!</span>"
|
||||
to_chat(src, "<span class='warning'>We cannot perform this ability at the present time!</span>")
|
||||
return
|
||||
|
||||
var/mob/living/carbon/human/H = src
|
||||
|
||||
if(!istype(H) || !H.species.primitive_form)
|
||||
src << "<span class='warning'>We cannot perform this ability in this form!</span>"
|
||||
to_chat(src, "<span class='warning'>We cannot perform this ability in this form!</span>")
|
||||
return
|
||||
|
||||
changeling.chem_charges--
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
|
||||
if(changeling.mimicing)
|
||||
changeling.mimicing = ""
|
||||
src << "<span class='notice'>We return our vocal glands to their original location.</span>"
|
||||
to_chat(src, "<span class='notice'>We return our vocal glands to their original location.</span>")
|
||||
return
|
||||
|
||||
var/mimic_voice = sanitize(input(usr, "Enter a name to mimic.", "Mimic Voice", null), MAX_NAME_LEN)
|
||||
@@ -28,8 +28,8 @@
|
||||
|
||||
changeling.mimicing = mimic_voice
|
||||
|
||||
src << "<span class='notice'>We shape our glands to take the voice of <b>[mimic_voice]</b>, this will stop us from regenerating chemicals while active.</span>"
|
||||
src << "<span class='notice'>Use this power again to return to our original voice and reproduce chemicals again.</span>"
|
||||
to_chat(src, "<span class='notice'>We shape our glands to take the voice of <b>[mimic_voice]</b>, this will stop us from regenerating chemicals while active.</span>")
|
||||
to_chat(src, "<span class='notice'>Use this power again to return to our original voice and reproduce chemicals again.</span>")
|
||||
|
||||
feedback_add_details("changeling_powers","MV")
|
||||
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
return 0
|
||||
src.mind.changeling.chem_charges -= 20
|
||||
|
||||
src << "<span class='notice'>We cleanse impurities from our form.</span>"
|
||||
to_chat(src, "<span class='notice'>We cleanse impurities from our form.</span>")
|
||||
|
||||
var/mob/living/carbon/human/C = src
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
var/heal_amount = 5
|
||||
if(src.mind.changeling.recursive_enhancement)
|
||||
heal_amount = heal_amount * 2
|
||||
src << "<span class='notice'>We will heal much faster.</span>"
|
||||
to_chat(src, "<span class='notice'>We will heal much faster.</span>")
|
||||
|
||||
for(var/i = 0, i<10,i++)
|
||||
if(C)
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
var/healing_amount = 40
|
||||
if(src.mind.changeling.recursive_enhancement)
|
||||
healing_amount = C.maxHealth
|
||||
src << "<span class='notice'>We completely heal ourselves.</span>"
|
||||
to_chat(src, "<span class='notice'>We completely heal ourselves.</span>")
|
||||
spawn(0)
|
||||
C.adjustBruteLoss(-healing_amount)
|
||||
C.adjustFireLoss(-healing_amount)
|
||||
|
||||
@@ -15,10 +15,10 @@
|
||||
if(!changeling)
|
||||
return 0
|
||||
if(src.mind.changeling.recursive_enhancement)
|
||||
src << "<span class='warning'>We will no longer empower our abilities.</span>"
|
||||
to_chat(src, "<span class='warning'>We will no longer empower our abilities.</span>")
|
||||
src.mind.changeling.recursive_enhancement = 0
|
||||
return 0
|
||||
src << "<span class='notice'>We empower ourselves. Our abilities will now be extra potent.</span>"
|
||||
to_chat(src, "<span class='notice'>We empower ourselves. Our abilities will now be extra potent.</span>")
|
||||
src.mind.changeling.recursive_enhancement = 1
|
||||
feedback_add_details("changeling_powers","RE")
|
||||
return 1
|
||||
@@ -7,7 +7,7 @@
|
||||
if(!changeling)
|
||||
return
|
||||
if(src.mind.changeling.readapts <= 0)
|
||||
to_chat(src, "<span class='warning'>We must first absorb another compatable creature!</span>")
|
||||
to_chat(src, "<span class='warning'>We must first absorb another compatible creature!</span>")
|
||||
src.mind.changeling.readapts = 0
|
||||
return
|
||||
|
||||
@@ -26,6 +26,6 @@
|
||||
H.remove_modifiers_of_type(/datum/modifier/endoarmor) //Revert endoarmor too.
|
||||
src.make_changeling() //And give back our freebies.
|
||||
|
||||
src << "<span class='notice'>We have removed our evolutions from this form, and are now ready to readapt.</span>"
|
||||
to_chat(src, "<span class='notice'>We have removed our evolutions from this form, and are now ready to readapt.</span>")
|
||||
|
||||
ling_datum.purchased_powers_history.Add("Re-adapt (Reset to [ling_datum.max_geneticpoints])")
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
return 0
|
||||
|
||||
if(changeling.max_geneticpoints < 0) //Absorbed by another ling
|
||||
src << "<span class='danger'>You have no genomes, not even your own, and cannot revive.</span>"
|
||||
to_chat(src, "<span class='danger'>You have no genomes, not even your own, and cannot revive.</span>")
|
||||
return 0
|
||||
|
||||
if(src.stat == DEAD)
|
||||
|
||||
@@ -19,13 +19,13 @@
|
||||
if(istype(src,/mob/living/carbon))
|
||||
var/mob/living/carbon/C = src
|
||||
if(C.suiciding)
|
||||
src << "You're committing suicide, this isn't going to work."
|
||||
to_chat(src, "You're committing suicide, this isn't going to work.")
|
||||
return 0
|
||||
if(C.does_not_breathe == 0)
|
||||
C.does_not_breathe = 1
|
||||
src << "<span class='notice'>We stop breathing, as we no longer need to.</span>"
|
||||
to_chat(src, "<span class='notice'>We stop breathing, as we no longer need to.</span>")
|
||||
return 1
|
||||
else
|
||||
C.does_not_breathe = 0
|
||||
src << "<span class='notice'>We resume breathing, as we now need to again.</span>"
|
||||
to_chat(src, "<span class='notice'>We resume breathing, as we now need to again.</span>")
|
||||
return 0
|
||||
@@ -95,13 +95,13 @@
|
||||
if(!changeling) return 0
|
||||
|
||||
if(is_muzzled())
|
||||
src << "<span class='danger'>Mmmf mrrfff!</span>"
|
||||
to_chat(src, "<span class='danger'>Mmmf mrrfff!</span>")
|
||||
return 0
|
||||
|
||||
if(ishuman(src))
|
||||
var/mob/living/carbon/human/H = src
|
||||
if(H.silent)
|
||||
src << "<span class='danger'>You can't speak!</span>"
|
||||
to_chat(src, "<span class='danger'>You can't speak!</span>")
|
||||
return 0
|
||||
|
||||
if(world.time < (changeling.last_shriek + 10 SECONDS) )
|
||||
@@ -125,7 +125,7 @@
|
||||
range_med = range_med * 2
|
||||
range_light = range_light * 2
|
||||
range_long = range_long * 2
|
||||
src << "<span class='notice'>We are extra loud.</span>"
|
||||
to_chat(src, "<span class='notice'>We are extra loud.</span>")
|
||||
src.mind.changeling.recursive_enhancement = 0
|
||||
|
||||
visible_message("<span class='notice'>[src] appears to shout.</span>")
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
var/duration = 30
|
||||
if(src.mind.changeling.recursive_enhancement)
|
||||
duration = duration + 10
|
||||
src << "<span class='notice'>They will be unable to cry out in fear for a little longer.</span>"
|
||||
to_chat(src, "<span class='notice'>They will be unable to cry out in fear for a little longer.</span>")
|
||||
T.silent += duration
|
||||
feedback_add_details("changeling_powers","SS")
|
||||
return 1
|
||||
@@ -34,7 +34,7 @@
|
||||
if(!T)
|
||||
return 0
|
||||
if((HUSK in T.mutations) || (!ishuman(T) && !issmall(T)))
|
||||
src << "<span class='warning'>Our sting appears ineffective against its DNA.</span>"
|
||||
to_chat(src, "<span class='warning'>Our sting appears ineffective against its DNA.</span>")
|
||||
return 0
|
||||
add_attack_logs(src,T,"Transformation sting (changeling)")
|
||||
T.visible_message("<span class='warning'>[T] transforms!</span>")
|
||||
|
||||
@@ -116,6 +116,12 @@
|
||||
return
|
||||
|
||||
/obj/effect/gateway/Crossed(AM as mob|obj)
|
||||
//VOREStation Edit begin: SHADEKIN
|
||||
var/mob/SK = AM
|
||||
if(istype(SK))
|
||||
if(SK.shadekin_phasing_check())
|
||||
return
|
||||
//VOREStation Edit end: SHADEKIN
|
||||
spawn(0)
|
||||
return
|
||||
return
|
||||
@@ -148,6 +154,12 @@
|
||||
qdel(src)
|
||||
|
||||
/obj/effect/gateway/active/Crossed(var/atom/A)
|
||||
//VOREStation Edit begin: SHADEKIN
|
||||
var/mob/SK = A
|
||||
if(istype(SK))
|
||||
if(SK.shadekin_phasing_check())
|
||||
return
|
||||
//VOREStation Edit end: SHADEKIN
|
||||
if(!istype(A, /mob/living))
|
||||
return
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
icon_state = "ghost-narsie"
|
||||
overlays = 0
|
||||
invisibility = 0
|
||||
src << "<span class='sinister'>Even as a non-corporal being, you can feel Nar-Sie's presence altering you. You are now visible to everyone.</span>"
|
||||
to_chat(src, "<span class='sinister'>Even as a non-corporal being, you can feel Nar-Sie's presence altering you. You are now visible to everyone.</span>")
|
||||
|
||||
/mob/living/cultify()
|
||||
if(iscultist(src) && client)
|
||||
|
||||
@@ -122,13 +122,13 @@
|
||||
electrocute_act(instability * 0.3, "unstable energies", 0.75)
|
||||
if(1)
|
||||
adjustFireLoss(instability * 0.15) //7.5 burn @ 50 instability
|
||||
src << "<span class='danger'>Your chassis alerts you to overheating from an unknown external force!</span>"
|
||||
to_chat(src, "<span class='danger'>Your chassis alerts you to overheating from an unknown external force!</span>")
|
||||
if(2)
|
||||
adjustBruteLoss(instability * 0.15) //7.5 brute @ 50 instability
|
||||
src << "<span class='danger'>Your chassis makes the sound of metal groaning!</span>"
|
||||
to_chat(src, "<span class='danger'>Your chassis makes the sound of metal groaning!</span>")
|
||||
if(3)
|
||||
safe_blink(src, range = 6)
|
||||
src << "<span class='warning'>You're teleported against your will!</span>"
|
||||
to_chat(src, "<span class='warning'>You're teleported against your will!</span>")
|
||||
if(4)
|
||||
emp_act(3)
|
||||
|
||||
@@ -141,10 +141,10 @@
|
||||
emp_act(2)
|
||||
if(2)
|
||||
adjustFireLoss(instability * 0.3) //30 burn @ 100 instability
|
||||
src << "<span class='danger'>Your chassis alerts you to extreme overheating from an unknown external force!</span>"
|
||||
to_chat(src, "<span class='danger'>Your chassis alerts you to extreme overheating from an unknown external force!</span>")
|
||||
if(3)
|
||||
adjustBruteLoss(instability * 0.3) //30 brute @ 100 instability
|
||||
src << "<span class='danger'>Your chassis makes the sound of metal groaning and tearing!</span>"
|
||||
to_chat(src, "<span class='danger'>Your chassis makes the sound of metal groaning and tearing!</span>")
|
||||
|
||||
if(101 to 200) //Lethal
|
||||
rng = rand(0,4)
|
||||
@@ -155,10 +155,10 @@
|
||||
emp_act(1)
|
||||
if(2)
|
||||
adjustFireLoss(instability * 0.4) //40 burn @ 100 instability
|
||||
src << "<span class='danger'>Your chassis alerts you to extreme overheating from an unknown external force!</span>"
|
||||
to_chat(src, "<span class='danger'>Your chassis alerts you to extreme overheating from an unknown external force!</span>")
|
||||
if(3)
|
||||
adjustBruteLoss(instability * 0.4) //40 brute @ 100 instability
|
||||
src << "<span class='danger'>Your chassis makes the sound of metal groaning and tearing!</span>"
|
||||
to_chat(src, "<span class='danger'>Your chassis makes the sound of metal groaning and tearing!</span>")
|
||||
|
||||
/mob/living/carbon/human/instability_effects()
|
||||
if(instability)
|
||||
@@ -190,23 +190,23 @@
|
||||
if(2)
|
||||
if(can_feel_pain())
|
||||
apply_effect(instability * 0.3, AGONY)
|
||||
src << "<span class='danger'>You feel a sharp pain!</span>"
|
||||
to_chat(src, "<span class='danger'>You feel a sharp pain!</span>")
|
||||
if(3)
|
||||
apply_effect(instability * 0.3, EYE_BLUR)
|
||||
src << "<span class='danger'>Your eyes start to get cloudy!</span>"
|
||||
to_chat(src, "<span class='danger'>Your eyes start to get cloudy!</span>")
|
||||
if(4)
|
||||
electrocute_act(instability * 0.3, "unstable energies")
|
||||
if(5)
|
||||
adjustFireLoss(instability * 0.15) //7.5 burn @ 50 instability
|
||||
src << "<span class='danger'>You feel your skin burn!</span>"
|
||||
to_chat(src, "<span class='danger'>You feel your skin burn!</span>")
|
||||
if(6)
|
||||
adjustBruteLoss(instability * 0.15) //7.5 brute @ 50 instability
|
||||
src << "<span class='danger'>You feel a sharp pain as an unseen force harms your body!</span>"
|
||||
to_chat(src, "<span class='danger'>You feel a sharp pain as an unseen force harms your body!</span>")
|
||||
if(7)
|
||||
adjustToxLoss(instability * 0.15) //7.5 tox @ 50 instability
|
||||
if(8)
|
||||
safe_blink(src, range = 6)
|
||||
src << "<span class='warning'>You're teleported against your will!</span>"
|
||||
to_chat(src, "<span class='warning'>You're teleported against your will!</span>")
|
||||
|
||||
if(50 to 100) //Severe
|
||||
rng = rand(0,8)
|
||||
@@ -218,18 +218,18 @@
|
||||
if(2)
|
||||
if(can_feel_pain())
|
||||
apply_effect(instability * 0.7, AGONY)
|
||||
src << "<span class='danger'>You feel an extremly angonizing pain from all over your body!</span>"
|
||||
to_chat(src, "<span class='danger'>You feel an extremly angonizing pain from all over your body!</span>")
|
||||
if(3)
|
||||
apply_effect(instability * 0.5, EYE_BLUR)
|
||||
src << "<span class='danger'>Your eyes start to get cloudy!</span>"
|
||||
to_chat(src, "<span class='danger'>Your eyes start to get cloudy!</span>")
|
||||
if(4)
|
||||
electrocute_act(instability * 0.5, "extremely unstable energies")
|
||||
if(5)
|
||||
fire_act()
|
||||
src << "<span class='danger'>You spontaneously combust!</span>"
|
||||
to_chat(src, "<span class='danger'>You spontaneously combust!</span>")
|
||||
if(6)
|
||||
adjustCloneLoss(instability * 0.05) //5 cloneloss @ 100 instability
|
||||
src << "<span class='danger'>You feel your body slowly degenerate.</span>"
|
||||
to_chat(src, "<span class='danger'>You feel your body slowly degenerate.</span>")
|
||||
if(7)
|
||||
adjustToxLoss(instability * 0.25) //25 tox @ 100 instability
|
||||
|
||||
@@ -245,18 +245,18 @@
|
||||
if(2)
|
||||
if(can_feel_pain())
|
||||
apply_effect(instability, AGONY)
|
||||
src << "<span class='danger'>You feel an extremly angonizing pain from all over your body!</span>"
|
||||
to_chat(src, "<span class='danger'>You feel an extremly angonizing pain from all over your body!</span>")
|
||||
if(3)
|
||||
apply_effect(instability, EYE_BLUR)
|
||||
src << "<span class='danger'>Your eyes start to get cloudy!</span>"
|
||||
to_chat(src, "<span class='danger'>Your eyes start to get cloudy!</span>")
|
||||
if(4)
|
||||
electrocute_act(instability, "extremely unstable energies")
|
||||
if(5)
|
||||
fire_act()
|
||||
src << "<span class='danger'>You spontaneously combust!</span>"
|
||||
to_chat(src, "<span class='danger'>You spontaneously combust!</span>")
|
||||
if(6)
|
||||
adjustCloneLoss(instability * 0.10) //5 cloneloss @ 100 instability
|
||||
src << "<span class='danger'>You feel your body slowly degenerate.</span>"
|
||||
to_chat(src, "<span class='danger'>You feel your body slowly degenerate.</span>")
|
||||
if(7)
|
||||
adjustToxLoss(instability * 0.40) //40 tox @ 100 instability
|
||||
|
||||
|
||||
@@ -292,7 +292,7 @@
|
||||
if(l_spell.aspect == ASPECT_CHROMATIC) //Check the other hand too.
|
||||
l_spell.on_combine_cast(S, src)
|
||||
else //Welp
|
||||
src << "<span class='warning'>You require a free hand to use this function.</span>"
|
||||
to_chat(src, "<span class='warning'>You require a free hand to use this function.</span>")
|
||||
return 0
|
||||
|
||||
if(S.run_checks())
|
||||
|
||||
@@ -389,9 +389,6 @@ var/global/datum/controller/occupations/job_master
|
||||
H << "<span class='warning'>Your current species, job or whitelist status does not permit you to spawn with [thing]!</span>"
|
||||
continue
|
||||
|
||||
if(G.exploitable)
|
||||
H.amend_exploitable(G.path)
|
||||
|
||||
if(G.slot == "implant")
|
||||
var/obj/item/weapon/implant/I = G.spawn_item(H)
|
||||
I.invisibility = 100
|
||||
|
||||
@@ -47,24 +47,24 @@
|
||||
|
||||
loc = sanitize(loc)
|
||||
if(!loc)
|
||||
src << "<span class='warning'>Must supply a location name</span>"
|
||||
to_chat(src, "<span class='warning'>Must supply a location name</span>")
|
||||
return
|
||||
|
||||
if(stored_locations.len >= max_locations)
|
||||
src << "<span class='warning'>Cannot store additional locations. Remove one first</span>"
|
||||
to_chat(src, "<span class='warning'>Cannot store additional locations. Remove one first</span>")
|
||||
return
|
||||
|
||||
if(loc in stored_locations)
|
||||
src << "<span class='warning'>There is already a stored location by this name</span>"
|
||||
to_chat(src, "<span class='warning'>There is already a stored location by this name</span>")
|
||||
return
|
||||
|
||||
var/L = src.eyeobj.getLoc()
|
||||
if (InvalidPlayerTurf(get_turf(L)))
|
||||
src << "<span class='warning'>Unable to store this location</span>"
|
||||
to_chat(src, "<span class='warning'>Unable to store this location</span>")
|
||||
return
|
||||
|
||||
stored_locations[loc] = L
|
||||
src << "Location '[loc]' stored"
|
||||
to_chat(src, "Location '[loc]' stored")
|
||||
|
||||
/mob/living/silicon/ai/proc/sorted_stored_locations()
|
||||
return sortList(stored_locations)
|
||||
@@ -75,7 +75,7 @@
|
||||
set desc = "Returns to the selected camera location"
|
||||
|
||||
if (!(loc in stored_locations))
|
||||
src << "<span class='warning'>Location [loc] not found</span>"
|
||||
to_chat(src, "<span class='warning'>Location [loc] not found</span>")
|
||||
return
|
||||
|
||||
var/L = stored_locations[loc]
|
||||
@@ -87,11 +87,11 @@
|
||||
set desc = "Deletes the selected camera location"
|
||||
|
||||
if (!(loc in stored_locations))
|
||||
src << "<span class='warning'>Location [loc] not found</span>"
|
||||
to_chat(src, "<span class='warning'>Location [loc] not found</span>")
|
||||
return
|
||||
|
||||
stored_locations.Remove(loc)
|
||||
src << "Location [loc] removed"
|
||||
to_chat(src, "Location [loc] removed")
|
||||
|
||||
// Used to allow the AI is write in mob names/camera name from the CMD line.
|
||||
/datum/trackable
|
||||
@@ -134,7 +134,7 @@
|
||||
set desc = "Select who you would like to track."
|
||||
|
||||
if(src.stat == 2)
|
||||
src << "You can't follow [target_name] with cameras because you are dead!"
|
||||
to_chat(src, "You can't follow [target_name] with cameras because you are dead!")
|
||||
return
|
||||
if(!target_name)
|
||||
src.cameraFollow = null
|
||||
@@ -147,7 +147,7 @@
|
||||
if(!cameraFollow)
|
||||
return
|
||||
|
||||
src << "Follow camera mode [forced ? "terminated" : "ended"]."
|
||||
to_chat(src, "Follow camera mode [forced ? "terminated" : "ended"].")
|
||||
cameraFollow.tracking_cancelled()
|
||||
cameraFollow = null
|
||||
|
||||
@@ -266,14 +266,14 @@ mob/living/proc/tracking_initiated()
|
||||
mob/living/silicon/robot/tracking_initiated()
|
||||
tracking_entities++
|
||||
if(tracking_entities == 1 && has_zeroth_law())
|
||||
src << "<span class='warning'>Internal camera is currently being accessed.</span>"
|
||||
to_chat(src, "<span class='warning'>Internal camera is currently being accessed.</span>")
|
||||
|
||||
mob/living/proc/tracking_cancelled()
|
||||
|
||||
mob/living/silicon/robot/tracking_initiated()
|
||||
tracking_entities--
|
||||
if(!tracking_entities && has_zeroth_law())
|
||||
src << "<span class='notice'>Internal camera is no longer being accessed.</span>"
|
||||
to_chat(src, "<span class='notice'>Internal camera is no longer being accessed.</span>")
|
||||
|
||||
|
||||
#undef TRACKING_POSSIBLE
|
||||
|
||||
@@ -335,6 +335,8 @@
|
||||
R.name = R.dna.real_name
|
||||
R.types = DNA2_BUF_UI|DNA2_BUF_UE|DNA2_BUF_SE
|
||||
R.languages = subject.languages
|
||||
R.gender = subject.gender
|
||||
R.body_descriptors = subject.descriptors
|
||||
if(!brain_skip) //Brains don't have flavor text.
|
||||
R.flavor = subject.flavor_texts.Copy()
|
||||
else
|
||||
|
||||
@@ -52,6 +52,7 @@
|
||||
icon_state = "guest_invalid"
|
||||
expiration_time = world.time
|
||||
expired = 1
|
||||
return
|
||||
return ..()
|
||||
|
||||
/obj/item/weapon/card/id/guest/Initialize()
|
||||
|
||||
@@ -931,7 +931,7 @@
|
||||
|
||||
/obj/machinery/suit_cycler/proc/finished_job()
|
||||
var/turf/T = get_turf(src)
|
||||
T.audible_message("\icon[src]<span class='notice'>The [src] beeps several times.</span>")
|
||||
T.visible_message("\icon[src]<span class='notice'>The [src] beeps several times.</span>")
|
||||
icon_state = initial(icon_state)
|
||||
active = 0
|
||||
playsound(src, 'sound/machines/boobeebeep.ogg', 50)
|
||||
|
||||
@@ -772,6 +772,7 @@
|
||||
name = "Robust Softdrinks"
|
||||
desc = "A softdrink vendor provided by Robust Industries, LLC."
|
||||
icon_state = "Cola_Machine" //VOREStation Edit
|
||||
icon_vend = "Cola_Machine-purchase" //VOREStation Edit
|
||||
product_slogans = "Robust Softdrinks: More robust than a toolbox to the head!"
|
||||
product_ads = "Refreshing!;Hope you're thirsty!;Over 1 million drinks sold!;Thirsty? Why not cola?;Please, have a drink!;Drink up!;The best drinks in space."
|
||||
products = list(/obj/item/weapon/reagent_containers/food/drinks/cans/cola = 10,/obj/item/weapon/reagent_containers/food/drinks/cans/space_mountain_wind = 10,
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -37,7 +37,7 @@ datum/book_manager/proc/freeid()
|
||||
set desc = "Permamently deletes a book from the database."
|
||||
set category = "Admin"
|
||||
if(!src.holder)
|
||||
src << "Only administrators may use this command."
|
||||
to_chat(src, "Only administrators may use this command.")
|
||||
return
|
||||
|
||||
var/isbn = input("ISBN number?", "Delete Book") as num | null
|
||||
|
||||
@@ -81,7 +81,7 @@ HONK Blaster and a pulse cannon protected by projectile armor and powered by a b
|
||||
max_universal_equip = 5
|
||||
max_special_equip = 2
|
||||
|
||||
/obj/mecha/combat/gorilla/New()
|
||||
/obj/mecha/combat/gorilla/Initialize()
|
||||
..()
|
||||
var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/tesla_energy_relay(src) // This thing basically cannot function without an external power supply.
|
||||
ME.attach(src)
|
||||
|
||||
@@ -45,7 +45,7 @@
|
||||
max_universal_equip = 1
|
||||
max_special_equip = 2
|
||||
|
||||
/obj/mecha/combat/gygax/dark/New()
|
||||
/obj/mecha/combat/gygax/dark/Initialize()
|
||||
..()
|
||||
var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/scattershot
|
||||
ME.attach(src)
|
||||
|
||||
@@ -55,7 +55,7 @@
|
||||
wreckage = /obj/effect/decal/mecha_wreckage/mauler
|
||||
mech_faction = MECH_FACTION_SYNDI
|
||||
|
||||
/obj/mecha/combat/marauder/New()
|
||||
/obj/mecha/combat/marauder/Initialize()
|
||||
..()
|
||||
var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/weapon/energy/pulse
|
||||
ME.attach(src)
|
||||
@@ -69,7 +69,7 @@
|
||||
src.smoke_system.attach(src)
|
||||
return
|
||||
|
||||
/obj/mecha/combat/marauder/seraph/New()
|
||||
/obj/mecha/combat/marauder/seraph/Initialize()
|
||||
..()//Let it equip whatever is needed.
|
||||
var/obj/item/mecha_parts/mecha_equipment/ME
|
||||
if(equipment.len)//Now to remove it and equip anew.
|
||||
|
||||
@@ -27,7 +27,7 @@
|
||||
max_universal_equip = 3
|
||||
max_special_equip = 4
|
||||
|
||||
/obj/mecha/combat/phazon/equipped/New()
|
||||
/obj/mecha/combat/phazon/equipped/Initialize()
|
||||
..()
|
||||
var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/tool/rcd
|
||||
ME.attach(src)
|
||||
|
||||
@@ -123,7 +123,7 @@
|
||||
|
||||
C.images += holder
|
||||
*/
|
||||
/obj/mecha/medical/odysseus/loaded/New()
|
||||
/obj/mecha/medical/odysseus/loaded/Initialize()
|
||||
..()
|
||||
var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/tool/sleeper
|
||||
ME.attach(src)
|
||||
|
||||
@@ -105,7 +105,7 @@
|
||||
max_universal_equip = 1
|
||||
max_special_equip = 1
|
||||
|
||||
/obj/mecha/working/hoverpod/combatpod/New()
|
||||
/obj/mecha/working/hoverpod/combatpod/Initialize()
|
||||
..()
|
||||
var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/weapon/energy/laser
|
||||
ME.attach(src)
|
||||
@@ -116,7 +116,7 @@
|
||||
/obj/mecha/working/hoverpod/shuttlepod
|
||||
desc = "Who knew a tiny ball could fit three people?"
|
||||
|
||||
/obj/mecha/working/hoverpod/shuttlepod/New()
|
||||
/obj/mecha/working/hoverpod/shuttlepod/Initialize()
|
||||
..()
|
||||
var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/tool/passenger
|
||||
ME.attach(src)
|
||||
|
||||
@@ -54,7 +54,7 @@
|
||||
max_universal_equip = 1
|
||||
max_special_equip = 1
|
||||
|
||||
/obj/mecha/working/ripley/deathripley/New()
|
||||
/obj/mecha/working/ripley/deathripley/Initialize()
|
||||
..()
|
||||
var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/tool/safety_clamp
|
||||
ME.attach(src)
|
||||
@@ -64,7 +64,7 @@
|
||||
desc = "An old, dusty mining ripley."
|
||||
name = "APLU \"Miner\""
|
||||
|
||||
/obj/mecha/working/ripley/mining/New()
|
||||
/obj/mecha/working/ripley/mining/Initialize()
|
||||
..()
|
||||
//Attach drill
|
||||
if(prob(25)) //Possible diamond drill... Feeling lucky?
|
||||
|
||||
@@ -152,6 +152,12 @@
|
||||
* Weeds
|
||||
*/
|
||||
#define NODERANGE 3
|
||||
#define WEED_NORTH_EDGING "north"
|
||||
#define WEED_SOUTH_EDGING "south"
|
||||
#define WEED_EAST_EDGING "east"
|
||||
#define WEED_WEST_EDGING "west"
|
||||
#define WEED_NODE_GLOW "glow"
|
||||
#define WEED_NODE_BASE "nodebase"
|
||||
|
||||
/obj/effect/alien/weeds
|
||||
name = "weeds"
|
||||
@@ -164,6 +170,18 @@
|
||||
layer = ABOVE_TURF_LAYER
|
||||
var/health = 15
|
||||
var/obj/effect/alien/weeds/node/linked_node = null
|
||||
var/static/list/weedImageCache
|
||||
|
||||
/obj/effect/alien/weeds/Destroy()
|
||||
var/turf/T = get_turf(src)
|
||||
// To not mess up the overlay updates.
|
||||
loc = null
|
||||
|
||||
for (var/obj/effect/alien/weeds/W in range(1,T))
|
||||
W.updateWeedOverlays()
|
||||
|
||||
linked_node = null
|
||||
..()
|
||||
|
||||
/obj/effect/alien/weeds/node
|
||||
icon_state = "weednode"
|
||||
@@ -173,9 +191,22 @@
|
||||
light_range = NODERANGE
|
||||
var/node_range = NODERANGE
|
||||
|
||||
var/set_color = null
|
||||
|
||||
/obj/effect/alien/weeds/node/New()
|
||||
..(src.loc, src)
|
||||
|
||||
/obj/effect/alien/weeds/node/Initialize()
|
||||
..()
|
||||
START_PROCESSING(SSobj, src)
|
||||
|
||||
spawn(1 SECOND)
|
||||
if(color)
|
||||
set_color = color
|
||||
|
||||
/obj/effect/alien/weeds/node/Destroy()
|
||||
STOP_PROCESSING(SSobj, src)
|
||||
..()
|
||||
|
||||
/obj/effect/alien/weeds/New(pos, node)
|
||||
..()
|
||||
@@ -184,12 +215,45 @@
|
||||
return
|
||||
linked_node = node
|
||||
if(icon_state == "weeds")icon_state = pick("weeds", "weeds1", "weeds2")
|
||||
spawn(rand(150, 200))
|
||||
if(src)
|
||||
Life()
|
||||
|
||||
fullUpdateWeedOverlays()
|
||||
|
||||
/obj/effect/alien/weeds/proc/updateWeedOverlays()
|
||||
|
||||
overlays.Cut()
|
||||
|
||||
if(!weedImageCache || !weedImageCache.len)
|
||||
weedImageCache = list()
|
||||
// weedImageCache.len = 4
|
||||
weedImageCache[WEED_NORTH_EDGING] = image('icons/mob/alien.dmi', "weeds_side_n", layer=2.11, pixel_y = -32)
|
||||
weedImageCache[WEED_SOUTH_EDGING] = image('icons/mob/alien.dmi', "weeds_side_s", layer=2.11, pixel_y = 32)
|
||||
weedImageCache[WEED_EAST_EDGING] = image('icons/mob/alien.dmi', "weeds_side_e", layer=2.11, pixel_x = -32)
|
||||
weedImageCache[WEED_WEST_EDGING] = image('icons/mob/alien.dmi', "weeds_side_w", layer=2.11, pixel_x = 32)
|
||||
|
||||
var/turf/N = get_step(src, NORTH)
|
||||
var/turf/S = get_step(src, SOUTH)
|
||||
var/turf/E = get_step(src, EAST)
|
||||
var/turf/W = get_step(src, WEST)
|
||||
if(!locate(/obj/effect/alien) in N.contents)
|
||||
if(istype(N, /turf/simulated/floor))
|
||||
overlays += weedImageCache[WEED_SOUTH_EDGING]
|
||||
if(!locate(/obj/effect/alien) in S.contents)
|
||||
if(istype(S, /turf/simulated/floor))
|
||||
overlays += weedImageCache[WEED_NORTH_EDGING]
|
||||
if(!locate(/obj/effect/alien) in E.contents)
|
||||
if(istype(E, /turf/simulated/floor))
|
||||
overlays += weedImageCache[WEED_WEST_EDGING]
|
||||
if(!locate(/obj/effect/alien) in W.contents)
|
||||
if(istype(W, /turf/simulated/floor))
|
||||
overlays += weedImageCache[WEED_EAST_EDGING]
|
||||
|
||||
/obj/effect/alien/weeds/proc/fullUpdateWeedOverlays()
|
||||
for (var/obj/effect/alien/weeds/W in range(1,src))
|
||||
W.updateWeedOverlays()
|
||||
|
||||
return
|
||||
|
||||
/obj/effect/alien/weeds/proc/Life()
|
||||
/obj/effect/alien/weeds/process()
|
||||
set background = 1
|
||||
var/turf/U = get_turf(src)
|
||||
/*
|
||||
@@ -211,6 +275,9 @@ Alien plants should do something if theres a lot of poison
|
||||
if(!linked_node || (get_dist(linked_node, src) > linked_node.node_range) )
|
||||
return
|
||||
|
||||
if(linked_node != src)
|
||||
color = linked_node.set_color
|
||||
|
||||
direction_loop:
|
||||
for(var/dirn in cardinal)
|
||||
var/turf/T = get_step(src, dirn)
|
||||
@@ -222,10 +289,33 @@ Alien plants should do something if theres a lot of poison
|
||||
// continue
|
||||
|
||||
for(var/obj/O in T)
|
||||
if(O.density)
|
||||
if(!O.CanZASPass(U))
|
||||
continue direction_loop
|
||||
|
||||
new /obj/effect/alien/weeds(T, linked_node)
|
||||
var/obj/effect/E = new /obj/effect/alien/weeds(T, linked_node)
|
||||
|
||||
E.color = color
|
||||
|
||||
if(istype(src, /obj/effect/alien/weeds/node))
|
||||
var/obj/effect/alien/weeds/node/N = src
|
||||
var/list/nearby_weeds = list()
|
||||
for(var/obj/effect/alien/weeds/W in range(N.node_range,src))
|
||||
nearby_weeds |= W
|
||||
|
||||
for(var/obj/effect/alien/weeds/W in nearby_weeds)
|
||||
if(!W)
|
||||
continue
|
||||
|
||||
if(!W.linked_node)
|
||||
W.linked_node = src
|
||||
|
||||
W.color = W.linked_node.set_color
|
||||
|
||||
if(W == src)
|
||||
continue
|
||||
|
||||
if(prob(max(10, 40 - (5 * nearby_weeds.len))))
|
||||
W.process()
|
||||
|
||||
|
||||
/obj/effect/alien/weeds/ex_act(severity)
|
||||
@@ -282,7 +372,12 @@ Alien plants should do something if theres a lot of poison
|
||||
healthcheck()
|
||||
|
||||
#undef NODERANGE
|
||||
|
||||
#undef WEED_NORTH_EDGING
|
||||
#undef WEED_SOUTH_EDGING
|
||||
#undef WEED_EAST_EDGING
|
||||
#undef WEED_WEST_EDGING
|
||||
#undef WEED_NODE_GLOW
|
||||
#undef WEED_NODE_BASE
|
||||
|
||||
/*
|
||||
* Acid
|
||||
|
||||
@@ -74,6 +74,12 @@
|
||||
qdel(src)
|
||||
|
||||
/obj/effect/effect/foam/Crossed(var/atom/movable/AM)
|
||||
//VOREStation Edit begin: SHADEKIN
|
||||
var/mob/SK = AM
|
||||
if(istype(SK))
|
||||
if(SK.shadekin_phasing_check())
|
||||
return
|
||||
//VOREStation Edit end: SHADEKIN
|
||||
if(metal)
|
||||
return
|
||||
if(istype(AM, /mob/living))
|
||||
|
||||
@@ -70,6 +70,12 @@ var/global/list/image/splatter_cache=list()
|
||||
desc = initial(desc)
|
||||
|
||||
/obj/effect/decal/cleanable/blood/Crossed(mob/living/carbon/human/perp)
|
||||
//VOREStation Edit begin: SHADEKIN
|
||||
var/mob/SK = perp
|
||||
if(istype(SK))
|
||||
if(SK.shadekin_phasing_check())
|
||||
return
|
||||
//VOREStation Edit end: SHADEKIN
|
||||
if (!istype(perp))
|
||||
return
|
||||
if(amount < 1)
|
||||
@@ -199,10 +205,10 @@ var/global/list/image/splatter_cache=list()
|
||||
overlays += giblets
|
||||
|
||||
/obj/effect/decal/cleanable/blood/gibs/up
|
||||
random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6","gibup1","gibup1","gibup1")
|
||||
random_icon_states = list("gib1", "gib2", "gib3", "gib5", "gib6","gibup1","gibup1","gibup1")
|
||||
|
||||
/obj/effect/decal/cleanable/blood/gibs/down
|
||||
random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6","gibdown1","gibdown1","gibdown1")
|
||||
random_icon_states = list("gib1", "gib2", "gib3", "gib5", "gib6","gibdown1","gibdown1","gibdown1")
|
||||
|
||||
/obj/effect/decal/cleanable/blood/gibs/body
|
||||
random_icon_states = list("gibhead", "gibtorso")
|
||||
|
||||
@@ -185,6 +185,12 @@ steam.start() -- spawns the effect
|
||||
qdel(src)
|
||||
|
||||
/obj/effect/effect/smoke/Crossed(mob/living/carbon/M as mob )
|
||||
//VOREStation Edit begin: SHADEKIN
|
||||
var/mob/SK = M
|
||||
if(istype(SK))
|
||||
if(SK.shadekin_phasing_check())
|
||||
return
|
||||
//VOREStation Edit end: SHADEKIN
|
||||
..()
|
||||
if(istype(M))
|
||||
affect(M)
|
||||
|
||||
@@ -36,6 +36,12 @@
|
||||
..()
|
||||
|
||||
/obj/effect/mine/Crossed(AM as mob|obj)
|
||||
//VOREStation Edit begin: SHADEKIN
|
||||
var/mob/SK = AM
|
||||
if(istype(SK))
|
||||
if(SK.shadekin_phasing_check())
|
||||
return
|
||||
//VOREStation Edit end: SHADEKIN
|
||||
Bumped(AM)
|
||||
|
||||
/obj/effect/mine/Bumped(mob/M as mob|obj)
|
||||
|
||||
@@ -21,6 +21,12 @@ GLOBAL_LIST_BOILERPLATE(all_portals, /obj/effect/portal)
|
||||
return
|
||||
|
||||
/obj/effect/portal/Crossed(AM as mob|obj)
|
||||
//VOREStation Edit begin: SHADEKIN
|
||||
var/mob/SK = AM
|
||||
if(istype(SK))
|
||||
if(SK.shadekin_phasing_check())
|
||||
return
|
||||
//VOREStation Edit end: SHADEKIN
|
||||
if(istype(AM,/mob) && !(istype(AM,/mob/living)))
|
||||
return //do not send ghosts, zshadows, ai eyes, etc
|
||||
spawn(0)
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
/obj/effect/spider/spiderling/virgo
|
||||
grow_as = list(/mob/living/simple_mob/animal/giant_spider, /mob/living/simple_mob/animal/giant_spider/hunter)
|
||||
@@ -13,6 +13,12 @@
|
||||
return 0
|
||||
|
||||
/obj/effect/step_trigger/Crossed(H as mob|obj)
|
||||
//VOREStation Edit begin: SHADEKIN
|
||||
var/mob/SK = H
|
||||
if(istype(SK))
|
||||
if(SK.shadekin_phasing_check())
|
||||
return
|
||||
//VOREStation Edit end: SHADEKIN
|
||||
..()
|
||||
if(!H)
|
||||
return
|
||||
|
||||
@@ -1456,6 +1456,12 @@ var/global/list/obj/item/device/pda/PDAs = list()
|
||||
return ..()
|
||||
|
||||
/obj/item/device/pda/clown/Crossed(AM as mob|obj) //Clown PDA is slippery.
|
||||
//VOREStation Edit begin: SHADEKIN
|
||||
var/mob/SK = AM
|
||||
if(istype(SK))
|
||||
if(SK.shadekin_phasing_check())
|
||||
return
|
||||
//VOREStation Edit end: SHADEKIN
|
||||
if (istype(AM, /mob/living))
|
||||
var/mob/living/M = AM
|
||||
|
||||
|
||||
@@ -19,4 +19,28 @@
|
||||
|
||||
/obj/item/device/radio/headset
|
||||
sprite_sheets = list(SPECIES_TESHARI = 'icons/mob/species/seromi/ears.dmi',
|
||||
SPECIES_WEREBEAST = 'icons/mob/species/werebeast/ears.dmi')
|
||||
SPECIES_WEREBEAST = 'icons/mob/species/werebeast/ears.dmi')
|
||||
|
||||
/obj/item/device/radio/headset/mob_headset //Adminbus headset for simplemob shenanigans.
|
||||
name = "nonhuman radio implant"
|
||||
desc = "An updated, modular intercom that requires no hands to operate. Takes encryption keys"
|
||||
|
||||
/obj/item/device/radio/headset/mob_headset/receive_range(freq, level)
|
||||
if(ismob(src.loc))
|
||||
return ..(freq, level)
|
||||
return -1
|
||||
|
||||
/obj/item/device/radio/headset/mob_headset/afterattack(var/atom/movable/target, mob/living/user, proximity)
|
||||
if(!proximity)
|
||||
return
|
||||
if(istype(target,/mob/living/simple_mob))
|
||||
var/mob/living/simple_mob/M = target
|
||||
if(!M.mob_radio)
|
||||
forceMove(M)
|
||||
M.mob_radio = src
|
||||
return
|
||||
if(M.mob_radio)
|
||||
M.mob_radio.forceMove(M.loc)
|
||||
M.mob_radio = null
|
||||
return
|
||||
..()
|
||||
@@ -322,6 +322,12 @@
|
||||
qdel(src)
|
||||
|
||||
/obj/item/toy/snappop/Crossed(H as mob|obj)
|
||||
//VOREStation Edit begin: SHADEKIN
|
||||
var/mob/SK = H
|
||||
if(istype(SK))
|
||||
if(SK.shadekin_phasing_check())
|
||||
return
|
||||
//VOREStation Edit end: SHADEKIN
|
||||
if((ishuman(H))) //i guess carp and shit shouldn't set them off
|
||||
var/mob/living/carbon/M = H
|
||||
if(M.m_intent == "run")
|
||||
@@ -938,7 +944,7 @@
|
||||
/obj/item/toy/plushie/mouse
|
||||
name = "mouse plush"
|
||||
desc = "A plushie of a delightful mouse! What was once considered a vile rodent is now your very best friend."
|
||||
icon_state = "mouseplushie"
|
||||
icon_state = "mouseplushie" //TFF 12/11/19 - updated icon to show a sprite that doesn't replicate a dead mouse. Heck you for that! >:C
|
||||
pokephrase = "Squeak!"
|
||||
|
||||
/obj/item/toy/plushie/kitten
|
||||
|
||||
@@ -0,0 +1,18 @@
|
||||
/obj/item/toy/plushie/teshari/strix
|
||||
name = "Strix Hades"
|
||||
desc = "This is Strix Hades the plushie Avali. Very soft, with a pompom on the tail. The toy is made well, as if alive. Looks like he is sleeping. Shhh!"
|
||||
icon_state = "strixplush"
|
||||
pokephrase = "Weh!"
|
||||
icon = 'icons/obj/toy_yw.dmi'
|
||||
|
||||
rename_plushie()
|
||||
set name = "Name Plushie"
|
||||
set category = "Object"
|
||||
set desc = "Give your plushie a cute name!"
|
||||
var/mob/M = usr
|
||||
if(!M.mind)
|
||||
return 0
|
||||
|
||||
if(src && !M.stat && in_range(M,src))
|
||||
to_chat(M, "You cannot rename Strix Hades! You hug him anyway.")
|
||||
return 1
|
||||
@@ -9,6 +9,12 @@
|
||||
* Banana Peals
|
||||
*/
|
||||
/obj/item/weapon/bananapeel/Crossed(AM as mob|obj)
|
||||
//VOREStation Edit begin: SHADEKIN
|
||||
var/mob/SK = AM
|
||||
if(istype(SK))
|
||||
if(SK.shadekin_phasing_check())
|
||||
return
|
||||
//VOREStation Edit end: SHADEKIN
|
||||
if (istype(AM, /mob/living))
|
||||
var/mob/living/M = AM
|
||||
M.slip("the [src.name]",4)
|
||||
@@ -24,6 +30,12 @@
|
||||
reagents.add_reagent("cleaner", 5)
|
||||
|
||||
/obj/item/weapon/soap/Crossed(AM as mob|obj)
|
||||
//VOREStation Edit begin: SHADEKIN
|
||||
var/mob/SK = AM
|
||||
if(istype(SK))
|
||||
if(SK.shadekin_phasing_check())
|
||||
return
|
||||
//VOREStation Edit end: SHADEKIN
|
||||
if (istype(AM, /mob/living))
|
||||
var/mob/living/M = AM
|
||||
M.slip("the [src.name]",3)
|
||||
|
||||
@@ -66,8 +66,7 @@
|
||||
|
||||
/obj/item/weapon/implant/proc/implant_loadout(var/mob/living/carbon/human/H)
|
||||
if(H)
|
||||
var/obj/item/organ/external/affected = H.organs_by_name[initialize_loc]
|
||||
if(handle_implant(H, affected))
|
||||
if(handle_implant(H, initialize_loc))
|
||||
invisibility = initial(invisibility)
|
||||
post_implant(H)
|
||||
|
||||
|
||||
@@ -19,12 +19,3 @@
|
||||
icon = 'icons/obj/device.dmi'
|
||||
icon_state = "implant"
|
||||
roundstart = FALSE
|
||||
|
||||
/obj/item/weapon/implant/dud/Initialize()
|
||||
..()
|
||||
if(roundstart)
|
||||
invisibility = 100
|
||||
..()
|
||||
spawn(3)
|
||||
if(!ishuman(loc) && !QDELETED(src))
|
||||
qdel(src)
|
||||
|
||||
@@ -105,10 +105,3 @@ Implant Specifics:<BR>"}
|
||||
my_brain.take_damage(15)
|
||||
my_brain = null
|
||||
return
|
||||
|
||||
/obj/item/weapon/implant/neural/roundstart/Initialize()
|
||||
invisibility = 100
|
||||
..()
|
||||
spawn(3)
|
||||
if(!ishuman(loc) && !QDELETED(src))
|
||||
qdel(src)
|
||||
|
||||
@@ -86,10 +86,13 @@
|
||||
health--
|
||||
check_health()
|
||||
|
||||
/obj/item/weapon/material/attackby(obj/item/weapon/W, mob/user as mob)
|
||||
/obj/item/weapon/material/attackby(obj/item/weapon/W, mob/user)
|
||||
if(istype(W, /obj/item/weapon/whetstone))
|
||||
var/obj/item/weapon/whetstone/whet = W
|
||||
repair(whet.repair_amount, whet.repair_time, user)
|
||||
if(istype(W, /obj/item/weapon/material/sharpeningkit))
|
||||
var/obj/item/weapon/material/sharpeningkit/SK = W
|
||||
repair(SK.repair_amount, SK.repair_time, user)
|
||||
..()
|
||||
|
||||
/obj/item/weapon/material/proc/check_health(var/consumed)
|
||||
@@ -134,7 +137,19 @@
|
||||
to_chat(user, "<span class='warning'>You can't repair \the [src].</span>")
|
||||
return
|
||||
|
||||
|
||||
/obj/item/weapon/material/proc/sharpen(var/material, var/sharpen_time, var/kit, mob/living/M)
|
||||
if(!fragile)
|
||||
if(health < initial(health))
|
||||
to_chat(M, "You should repair [src] first. Try using [kit] on it.")
|
||||
return FALSE
|
||||
M.visible_message("[M] begins to replace parts of [src] with [kit].", "You begin to replace parts of [src] with [kit].")
|
||||
if(do_after(usr, sharpen_time))
|
||||
M.visible_message("[M] has finished replacing parts of [src].", "You finish replacing parts of [src].")
|
||||
src.set_material(material)
|
||||
return TRUE
|
||||
else
|
||||
to_chat(M, "<span class = 'warning'>You can't sharpen and re-edge [src].</span>")
|
||||
return FALSE
|
||||
|
||||
/*
|
||||
Commenting this out pending rebalancing of radiation based on small objects.
|
||||
@@ -162,4 +177,4 @@ Commenting this out pending rebalancing of radiation based on small objects.
|
||||
TemperatureAct(150)
|
||||
else
|
||||
return ..()
|
||||
*/
|
||||
*/
|
||||
|
||||
@@ -108,6 +108,12 @@
|
||||
|
||||
/obj/item/weapon/material/shard/Crossed(AM as mob|obj)
|
||||
..()
|
||||
//VOREStation Edit begin: SHADEKIN
|
||||
var/mob/SK = AM
|
||||
if(istype(SK))
|
||||
if(SK.shadekin_phasing_check())
|
||||
return
|
||||
//VOREStation Edit end: SHADEKIN
|
||||
if(isliving(AM))
|
||||
var/mob/M = AM
|
||||
|
||||
|
||||
@@ -8,4 +8,69 @@
|
||||
force = 3
|
||||
w_class = ITEMSIZE_SMALL
|
||||
var/repair_amount = 5
|
||||
var/repair_time = 40
|
||||
var/repair_time = 40
|
||||
|
||||
/obj/item/weapon/whetstone/attackby(obj/item/I, mob/user)
|
||||
if(istype(I, /obj/item/stack/material))
|
||||
var/obj/item/stack/material/M = I
|
||||
if(M.amount >= 5)
|
||||
to_chat(user, "You begin to refine the [src] with [M]...")
|
||||
if(do_after(user, 70))
|
||||
M.use(5)
|
||||
var/obj/item/SK
|
||||
SK = new /obj/item/weapon/material/sharpeningkit(get_turf(user), M.material.name)
|
||||
to_chat(user, "You sharpen and refine the [src] into \a [SK].")
|
||||
qdel(src)
|
||||
if(SK)
|
||||
user.put_in_hands(SK)
|
||||
else
|
||||
to_chat(user, "You need 5 [src] to refine it into a sharpening kit.")
|
||||
|
||||
/obj/item/weapon/material/sharpeningkit
|
||||
name = "sharpening kit"
|
||||
desc = "A refined, fine grit whetstone, useful for sharpening dull edges, polishing out dents, and, with extra material, replacing an edge."
|
||||
icon = 'icons/obj/kitchen.dmi'
|
||||
icon_state = "sharpener"
|
||||
hitsound = 'sound/weapons/genhit3.ogg'
|
||||
force_divisor = 0.7
|
||||
thrown_force_divisor = 1
|
||||
var/repair_amount = 5
|
||||
var/repair_time = 40
|
||||
var/sharpen_time = 100
|
||||
var/uses = 0
|
||||
|
||||
/obj/item/weapon/material/sharpeningkit/examine(mob/user, distance)
|
||||
. = ..()
|
||||
to_chat(user, "There [uses == 1 ? "is" : "are"] [uses] [material] [uses == 1 ? src.material.sheet_singular_name : src.material.sheet_plural_name] left for use.")
|
||||
/obj/item/weapon/material/sharpeningkit/Initialize()
|
||||
. = ..()
|
||||
setrepair()
|
||||
|
||||
/obj/item/weapon/material/sharpeningkit/proc/setrepair()
|
||||
repair_amount = material.hardness * 0.1
|
||||
repair_time = material.weight * 0.5
|
||||
sharpen_time = material.weight * 3
|
||||
|
||||
/obj/item/weapon/material/sharpeningkit/attackby(obj/item/weapon/W, mob/user)
|
||||
if(istype(W, /obj/item/stack/material))
|
||||
var/obj/item/stack/material/S = W
|
||||
if(S.material == material)
|
||||
S.use(1)
|
||||
uses += 1
|
||||
to_chat(user, "You add a [S.material.name] [S.material.sheet_singular_name] to [src].")
|
||||
return
|
||||
|
||||
if(istype(W, /obj/item/weapon/material))
|
||||
if(istype(W, /obj/item/weapon/material/sharpeningkit))
|
||||
to_chat(user, "Really? Sharpening a [W] with [src]? You goofball.")
|
||||
return
|
||||
var/obj/item/weapon/material/M = W
|
||||
if(uses >= M.w_class*2)
|
||||
if(M.sharpen(src.material.name, sharpen_time, src, user))
|
||||
uses -= M.w_class*2
|
||||
return
|
||||
else
|
||||
to_chat(user, "Not enough material to sharpen [M]. You need [M.w_class*2] [M.material.sheet_plural_name].")
|
||||
return
|
||||
else
|
||||
to_chat(user, "You can't sharpen [W] with [src]!")
|
||||
|
||||
@@ -11,17 +11,26 @@
|
||||
var/lrange = 2
|
||||
var/lpower = 2
|
||||
var/lcolor = "#0099FF"
|
||||
|
||||
var/colorable = FALSE
|
||||
var/rainbow = FALSE
|
||||
// If it uses energy.
|
||||
var/use_cell = FALSE
|
||||
var/hitcost = 120
|
||||
var/obj/item/weapon/cell/bcell = null
|
||||
var/cell_type = /obj/item/weapon/cell/device
|
||||
item_icons = list(
|
||||
slot_l_hand_str = 'icons/mob/items/lefthand_melee.dmi',
|
||||
slot_r_hand_str = 'icons/mob/items/righthand_melee.dmi',
|
||||
)
|
||||
|
||||
/obj/item/weapon/melee/energy/proc/activate(mob/living/user)
|
||||
if(active)
|
||||
return
|
||||
active = 1
|
||||
if(rainbow)
|
||||
item_state = "[icon_state]_blade_rainbow"
|
||||
else
|
||||
item_state = "[icon_state]_blade"
|
||||
embed_chance = active_embed_chance
|
||||
force = active_force
|
||||
throwforce = active_throwforce
|
||||
@@ -29,12 +38,14 @@
|
||||
edge = 1
|
||||
w_class = active_w_class
|
||||
playsound(user, 'sound/weapons/saberon.ogg', 50, 1)
|
||||
update_icon()
|
||||
set_light(lrange, lpower, lcolor)
|
||||
|
||||
/obj/item/weapon/melee/energy/proc/deactivate(mob/living/user)
|
||||
if(!active)
|
||||
return
|
||||
playsound(user, 'sound/weapons/saberoff.ogg', 50, 1)
|
||||
item_state = "[icon_state]"
|
||||
active = 0
|
||||
embed_chance = initial(embed_chance)
|
||||
force = initial(force)
|
||||
@@ -42,6 +53,7 @@
|
||||
sharp = initial(sharp)
|
||||
edge = initial(edge)
|
||||
w_class = initial(w_class)
|
||||
update_icon()
|
||||
set_light(0,0)
|
||||
|
||||
/obj/item/weapon/melee/energy/proc/use_charge(var/cost)
|
||||
@@ -102,6 +114,13 @@
|
||||
return ..()
|
||||
|
||||
/obj/item/weapon/melee/energy/attackby(obj/item/weapon/W, mob/user)
|
||||
if(istype(W, /obj/item/device/multitool) && colorable && !active)
|
||||
if(!rainbow)
|
||||
rainbow = TRUE
|
||||
else
|
||||
rainbow = FALSE
|
||||
to_chat(user, "<span class='notice'>You manipulate the color controller in [src].</span>")
|
||||
update_icon()
|
||||
if(use_cell)
|
||||
if(istype(W, cell_type))
|
||||
if(!bcell)
|
||||
@@ -125,13 +144,52 @@
|
||||
/obj/item/weapon/melee/energy/get_cell()
|
||||
return bcell
|
||||
|
||||
/obj/item/weapon/melee/energy/update_icon()
|
||||
. = ..()
|
||||
var/mutable_appearance/blade_overlay = mutable_appearance(icon, "[icon_state]_blade")
|
||||
if(colorable)
|
||||
blade_overlay.color = lcolor
|
||||
if(rainbow || !colorable)
|
||||
blade_overlay = mutable_appearance(icon, "[icon_state]_blade_rainbow")
|
||||
blade_overlay.color = "FFFFFF"
|
||||
cut_overlays() //So that it doesn't keep stacking overlays non-stop on top of each other
|
||||
if(active)
|
||||
add_overlay(blade_overlay)
|
||||
if(istype(usr,/mob/living/carbon/human))
|
||||
var/mob/living/carbon/human/H = usr
|
||||
H.update_inv_l_hand()
|
||||
H.update_inv_r_hand()
|
||||
|
||||
|
||||
|
||||
|
||||
/obj/item/weapon/melee/energy/AltClick(mob/living/user)
|
||||
if(!colorable) //checks if is not colorable
|
||||
return
|
||||
if(!in_range(src, user)) //Basic checks to prevent abuse
|
||||
return
|
||||
if(user.incapacitated() || !istype(user))
|
||||
to_chat(user, "<span class='warning'>You can't do that right now!</span>")
|
||||
return
|
||||
|
||||
if(alert("Are you sure you want to recolor your blade?", "Confirm Recolor", "Yes", "No") == "Yes")
|
||||
var/energy_color_input = input(usr,"","Choose Energy Color",lcolor) as color|null
|
||||
if(energy_color_input)
|
||||
lcolor = sanitize_hexcolor(energy_color_input)
|
||||
update_icon()
|
||||
|
||||
/obj/item/weapon/melee/energy/examine(mob/user)
|
||||
..()
|
||||
to_chat(user, "<span class='notice'>Alt-click to recolor it.</span>")
|
||||
|
||||
/*
|
||||
* Energy Axe
|
||||
*/
|
||||
/obj/item/weapon/melee/energy/axe
|
||||
name = "energy axe"
|
||||
desc = "An energised battle axe."
|
||||
icon_state = "axe0"
|
||||
icon_state = "eaxe"
|
||||
item_state = "eaxe"
|
||||
//active_force = 150 //holy...
|
||||
active_force = 60
|
||||
active_throwforce = 35
|
||||
@@ -152,13 +210,11 @@
|
||||
/obj/item/weapon/melee/energy/axe/activate(mob/living/user)
|
||||
..()
|
||||
damtype = SEARING
|
||||
icon_state = "axe1"
|
||||
to_chat(user, "<span class='notice'>\The [src] is now energised.</span>")
|
||||
|
||||
/obj/item/weapon/melee/energy/axe/deactivate(mob/living/user)
|
||||
..()
|
||||
damtype = BRUTE
|
||||
icon_state = initial(icon_state)
|
||||
to_chat(user, "<span class='notice'>\The [src] is de-energised. It's just a regular axe now.</span>")
|
||||
|
||||
/obj/item/weapon/melee/energy/axe/suicide_act(mob/user)
|
||||
@@ -187,7 +243,8 @@
|
||||
color
|
||||
name = "energy sword"
|
||||
desc = "May the force be within you."
|
||||
icon_state = "sword0"
|
||||
icon_state = "esword"
|
||||
item_state = "esword"
|
||||
active_force = 30
|
||||
active_throwforce = 20
|
||||
active_w_class = ITEMSIZE_LARGE
|
||||
@@ -200,9 +257,8 @@
|
||||
origin_tech = list(TECH_MAGNET = 3, TECH_ILLEGAL = 4)
|
||||
sharp = 1
|
||||
edge = 1
|
||||
var/blade_color
|
||||
var/random_color = TRUE
|
||||
var/active_state = "sword"
|
||||
colorable = TRUE
|
||||
|
||||
|
||||
projectile_parry_chance = 65
|
||||
|
||||
@@ -211,30 +267,6 @@
|
||||
if(!istype(loc,/mob))
|
||||
deactivate(user)
|
||||
|
||||
/obj/item/weapon/melee/energy/sword/New()
|
||||
if(random_color)
|
||||
blade_color = pick("red","blue","green","purple","white")
|
||||
lcolor = blade_color
|
||||
|
||||
/obj/item/weapon/melee/energy/sword/green/New()
|
||||
blade_color = "green"
|
||||
lcolor = "#008000"
|
||||
|
||||
/obj/item/weapon/melee/energy/sword/red/New()
|
||||
blade_color = "red"
|
||||
lcolor = "#FF0000"
|
||||
|
||||
/obj/item/weapon/melee/energy/sword/blue/New()
|
||||
blade_color = "blue"
|
||||
lcolor = "#0000FF"
|
||||
|
||||
/obj/item/weapon/melee/energy/sword/purple/New()
|
||||
blade_color = "purple"
|
||||
lcolor = "#800080"
|
||||
|
||||
/obj/item/weapon/melee/energy/sword/white/New()
|
||||
blade_color = "white"
|
||||
lcolor = "#FFFFFF"
|
||||
|
||||
/obj/item/weapon/melee/energy/sword/activate(mob/living/user)
|
||||
if(!active)
|
||||
@@ -242,14 +274,13 @@
|
||||
|
||||
..()
|
||||
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
|
||||
icon_state = "[active_state][blade_color]"
|
||||
|
||||
|
||||
/obj/item/weapon/melee/energy/sword/deactivate(mob/living/user)
|
||||
if(active)
|
||||
to_chat(user, "<span class='notice'>\The [src] deactivates!</span>")
|
||||
..()
|
||||
attack_verb = list()
|
||||
icon_state = initial(icon_state)
|
||||
|
||||
/obj/item/weapon/melee/energy/sword/handle_shield(mob/user, var/damage, atom/damage_source = null, mob/attacker = null, var/def_zone = null, var/attack_text = "the attack")
|
||||
if(active && default_parry_check(user, attacker, damage_source) && prob(60))
|
||||
@@ -284,11 +315,10 @@
|
||||
/obj/item/weapon/melee/energy/sword/pirate
|
||||
name = "energy cutlass"
|
||||
desc = "Arrrr matey."
|
||||
icon_state = "cutlass0"
|
||||
icon_state = "cutlass"
|
||||
item_state = "cutlass"
|
||||
colorable = TRUE
|
||||
|
||||
/obj/item/weapon/melee/energy/sword/pirate/activate(mob/living/user)
|
||||
..()
|
||||
icon_state = "cutlass1"
|
||||
|
||||
/*
|
||||
*Ionic Rapier
|
||||
@@ -300,8 +330,8 @@
|
||||
description_info = "This is a dangerous melee weapon that will deliver a moderately powerful electromagnetic pulse to whatever it strikes. \
|
||||
Striking a lesser robotic entity will compel it to attack you, as well. It also does extra burn damage to robotic entities, but it does \
|
||||
very little damage to purely organic targets."
|
||||
icon_state = "ionic_rapier0"
|
||||
random_color = FALSE
|
||||
icon_state = "ionrapier"
|
||||
item_state = "ionrapier"
|
||||
active_force = 5
|
||||
active_throwforce = 3
|
||||
active_embed_chance = 0
|
||||
@@ -312,7 +342,6 @@
|
||||
lrange = 2
|
||||
lpower = 2
|
||||
lcolor = "#0000FF"
|
||||
active_state = "ionic_rapier"
|
||||
projectile_parry_chance = 30 // It's not specifically designed for cutting and slashing, but it can still, maybe, save your life.
|
||||
|
||||
/obj/item/weapon/melee/energy/sword/ionic_rapier/afterattack(var/atom/movable/AM, var/mob/living/user, var/proximity)
|
||||
@@ -350,6 +379,7 @@
|
||||
active_force = 25
|
||||
armor_penetration = 25
|
||||
projectile_parry_chance = 40
|
||||
colorable = TRUE
|
||||
|
||||
hitcost = 75
|
||||
|
||||
@@ -357,15 +387,14 @@
|
||||
..()
|
||||
bcell = new/obj/item/weapon/cell/device/weapon(src)
|
||||
|
||||
/*
|
||||
*Energy Blade
|
||||
*/
|
||||
//Energy Blade (ninja uses this)
|
||||
|
||||
//Can't be activated or deactivated, so no reason to be a subtype of energy
|
||||
/obj/item/weapon/melee/energy/blade
|
||||
name = "energy blade"
|
||||
desc = "A concentrated beam of energy in the shape of a blade. Very stylish... and lethal."
|
||||
icon_state = "blade"
|
||||
item_state = "blade"
|
||||
force = 40 //Normal attacks deal very high damage - about the same as wielded fire axe
|
||||
armor_penetration = 100
|
||||
sharp = 1
|
||||
@@ -448,49 +477,27 @@
|
||||
|
||||
return 1
|
||||
|
||||
/*
|
||||
*Energy Spear
|
||||
*/
|
||||
//Energy Spear
|
||||
|
||||
/obj/item/weapon/melee/energy/spear
|
||||
name = "energy spear"
|
||||
desc = "Concentrated energy forming a sharp tip at the end of a long rod."
|
||||
icon_state = "espear0"
|
||||
armor_penetration = 75
|
||||
sharp = 1
|
||||
edge = 1
|
||||
force = 5
|
||||
throwforce = 10
|
||||
throw_speed = 7
|
||||
throw_range = 11
|
||||
reach = 2
|
||||
w_class = ITEMSIZE_LARGE
|
||||
active_force = 25
|
||||
active_throwforce = 30
|
||||
active_w_class = ITEMSIZE_HUGE
|
||||
var/random_color = TRUE
|
||||
var/tip_color = ""
|
||||
var/active_state = "espear"
|
||||
name = "energy spear"
|
||||
desc = "Concentrated energy forming a sharp tip at the end of a long rod."
|
||||
icon_state = "espear"
|
||||
armor_penetration = 75
|
||||
sharp = 1
|
||||
edge = 1
|
||||
force = 5
|
||||
throwforce = 10
|
||||
throw_speed = 7
|
||||
throw_range = 11
|
||||
reach = 2
|
||||
w_class = ITEMSIZE_LARGE
|
||||
active_force = 25
|
||||
active_throwforce = 30
|
||||
active_w_class = ITEMSIZE_HUGE
|
||||
colorable = TRUE
|
||||
|
||||
/obj/item/weapon/melee/energy/spear/New()
|
||||
if(random_color)
|
||||
tip_color = pick("red","blue","green","purple")
|
||||
lcolor = tip_color
|
||||
|
||||
/obj/item/weapon/melee/energy/spear/green/New()
|
||||
tip_color = "green"
|
||||
lcolor = "#008000"
|
||||
|
||||
/obj/item/weapon/melee/energy/spear/red/New()
|
||||
tip_color = "red"
|
||||
lcolor = "#FF0000"
|
||||
|
||||
/obj/item/weapon/melee/energy/spear/blue/New()
|
||||
tip_color = "blue"
|
||||
lcolor = "#0000FF"
|
||||
|
||||
/obj/item/weapon/melee/energy/spear/purple/New()
|
||||
tip_color = "purple"
|
||||
lcolor = "#800080"
|
||||
|
||||
/obj/item/weapon/melee/energy/spear/activate(mob/living/user)
|
||||
@@ -498,7 +505,6 @@
|
||||
to_chat(user, "<span class='notice'>\The [src] is now energised.</span>")
|
||||
..()
|
||||
attack_verb = list("jabbed", "stabbed", "impaled")
|
||||
icon_state = "[active_state]-[tip_color]"
|
||||
|
||||
|
||||
/obj/item/weapon/melee/energy/spear/deactivate(mob/living/user)
|
||||
@@ -506,7 +512,6 @@
|
||||
to_chat(user, "<span class='notice'>\The [src] deactivates!</span>")
|
||||
..()
|
||||
attack_verb = list("whacked", "beat", "slapped", "thonked")
|
||||
icon_state = "espear0"
|
||||
|
||||
/obj/item/weapon/melee/energy/spear/handle_shield(mob/user, var/damage, atom/damage_source = null, mob/attacker = null, var/def_zone = null, var/attack_text = "the attack")
|
||||
if(active && default_parry_check(user, attacker, damage_source) && prob(50))
|
||||
@@ -516,4 +521,4 @@
|
||||
spark_system.start()
|
||||
playsound(user.loc, 'sound/weapons/blade1.ogg', 50, 1)
|
||||
return 1
|
||||
return 0
|
||||
return 0
|
||||
|
||||
@@ -115,7 +115,8 @@
|
||||
name = "energy combat shield"
|
||||
desc = "A shield capable of stopping most projectile and melee attacks. It can be retracted, expanded, and stored anywhere."
|
||||
icon = 'icons/obj/weapons.dmi'
|
||||
icon_state = "eshield0" // eshield1 for expanded
|
||||
icon_state = "eshield"
|
||||
item_state = "eshield"
|
||||
slot_flags = SLOT_EARS
|
||||
flags = NOCONDUCT
|
||||
force = 3.0
|
||||
@@ -123,9 +124,16 @@
|
||||
throw_speed = 1
|
||||
throw_range = 4
|
||||
w_class = ITEMSIZE_SMALL
|
||||
var/lrange = 1.5
|
||||
var/lpower = 1.5
|
||||
var/lcolor = "#006AFF"
|
||||
origin_tech = list(TECH_MATERIAL = 4, TECH_MAGNET = 3, TECH_ILLEGAL = 4)
|
||||
attack_verb = list("shoved", "bashed")
|
||||
var/active = 0
|
||||
item_icons = list(
|
||||
slot_l_hand_str = 'icons/mob/items/lefthand_melee.dmi',
|
||||
slot_r_hand_str = 'icons/mob/items/righthand_melee.dmi',
|
||||
)
|
||||
|
||||
/obj/item/weapon/shield/energy/handle_shield(mob/user)
|
||||
if(!active)
|
||||
@@ -175,11 +183,33 @@
|
||||
return
|
||||
|
||||
/obj/item/weapon/shield/energy/update_icon()
|
||||
icon_state = "eshield[active]"
|
||||
var/mutable_appearance/blade_overlay = mutable_appearance(icon, "[icon_state]_blade")
|
||||
if(lcolor)
|
||||
blade_overlay.color = lcolor
|
||||
cut_overlays() //So that it doesn't keep stacking overlays non-stop on top of each other
|
||||
if(active)
|
||||
set_light(1.5, 1.5, "#006AFF")
|
||||
add_overlay(blade_overlay)
|
||||
item_state = "[icon_state]_blade"
|
||||
set_light(lrange, lpower, lcolor)
|
||||
else
|
||||
set_light(0)
|
||||
item_state = "[icon_state]"
|
||||
|
||||
/obj/item/weapon/shield/energy/AltClick(mob/living/user)
|
||||
if(!in_range(src, user)) //Basic checks to prevent abuse
|
||||
return
|
||||
if(user.incapacitated() || !istype(user))
|
||||
to_chat(user, "<span class='warning'>You can't do that right now!</span>")
|
||||
return
|
||||
if(alert("Are you sure you want to recolor your shield?", "Confirm Recolor", "Yes", "No") == "Yes")
|
||||
var/energy_color_input = input(usr,"","Choose Energy Color",lcolor) as color|null
|
||||
if(energy_color_input)
|
||||
lcolor = sanitize_hexcolor(energy_color_input, desired_format=6, include_crunch=1)
|
||||
update_icon()
|
||||
|
||||
/obj/item/weapon/shield/energy/examine(mob/user)
|
||||
..()
|
||||
to_chat(user, "<span class='notice'>Alt-click to recolor it.</span>")
|
||||
|
||||
/obj/item/weapon/shield/riot/tele
|
||||
name = "telescopic shield"
|
||||
@@ -226,4 +256,4 @@
|
||||
H.update_inv_r_hand()
|
||||
|
||||
add_fingerprint(user)
|
||||
return
|
||||
return
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
/obj/item/weapon/storage/bag/chemistry
|
||||
slot_flags = null
|
||||
@@ -33,7 +33,7 @@
|
||||
starts_with = list(/obj/item/device/encryptionkey/headset_com = 7)
|
||||
|
||||
/obj/item/weapon/storage/box/servicekeys
|
||||
name = "box of command keys"
|
||||
name = "box of service keys"
|
||||
desc = "A box full of service keys, for the HoP to give out as necessary."
|
||||
starts_with = list(/obj/item/device/encryptionkey/headset_service = 7)
|
||||
|
||||
|
||||
@@ -106,6 +106,12 @@
|
||||
can_buckle = initial(can_buckle)
|
||||
|
||||
/obj/item/weapon/beartrap/Crossed(AM as mob|obj)
|
||||
//VOREStation Edit begin: SHADEKIN
|
||||
var/mob/SK = AM
|
||||
if(istype(SK))
|
||||
if(SK.shadekin_phasing_check())
|
||||
return
|
||||
//VOREStation Edit end: SHADEKIN
|
||||
if(deployed && isliving(AM))
|
||||
var/mob/living/L = AM
|
||||
if(L.m_intent == "run")
|
||||
|
||||
@@ -87,6 +87,12 @@
|
||||
return ..()
|
||||
|
||||
/obj/structure/catwalk/Crossed()
|
||||
//VOREStation Edit begin: SHADEKIN
|
||||
var/mob/SK = usr
|
||||
if(istype(SK))
|
||||
if(SK.shadekin_phasing_check())
|
||||
return
|
||||
//VOREStation Edit end: SHADEKIN
|
||||
. = ..()
|
||||
if(isliving(usr))
|
||||
playsound(src, pick('sound/effects/footstep/catwalk1.ogg', 'sound/effects/footstep/catwalk2.ogg', 'sound/effects/footstep/catwalk3.ogg', 'sound/effects/footstep/catwalk4.ogg', 'sound/effects/footstep/catwalk5.ogg'), 25, 1)
|
||||
|
||||
@@ -62,7 +62,7 @@
|
||||
|
||||
/obj/structure/girder/update_icon()
|
||||
if(anchored)
|
||||
icon_state = "girder"
|
||||
icon_state = initial(icon_state)
|
||||
else
|
||||
icon_state = "displaced"
|
||||
|
||||
@@ -320,6 +320,7 @@
|
||||
name = "column"
|
||||
icon= 'icons/obj/cult.dmi'
|
||||
icon_state= "cultgirder"
|
||||
max_health = 250
|
||||
health = 250
|
||||
cover = 70
|
||||
girder_material = "cult"
|
||||
@@ -354,6 +355,13 @@
|
||||
new /obj/effect/decal/remains/human(get_turf(src))
|
||||
dismantle()
|
||||
|
||||
/obj/structure/girder/resin
|
||||
name = "soft girder"
|
||||
icon_state = "girder_resin"
|
||||
max_health = 225
|
||||
health = 225
|
||||
cover = 60
|
||||
girder_material = "resin"
|
||||
|
||||
/obj/structure/girder/rcd_values(mob/living/user, obj/item/weapon/rcd/the_rcd, passed_mode)
|
||||
var/turf/simulated/T = get_turf(src)
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user