Merge branch 'master' into master

This commit is contained in:
Keila-coon
2019-11-29 13:07:46 -04:00
committed by GitHub
378 changed files with 207755 additions and 161420 deletions
@@ -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
View File
@@ -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
+2 -2
View File
@@ -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
View File
@@ -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()
+2 -1
View File
@@ -1,2 +1,3 @@
// More for our custom races
#define IS_CHIMERA 12
#define IS_CHIMERA 12
#define IS_SHADEKIN 13
+2
View File
@@ -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"
+1
View File
@@ -0,0 +1 @@
#define SPECIES_SHADEKIN_YW "GeneShadekin"
+1
View File
@@ -0,0 +1 @@
var/datum/gear_tweak/collar_tag/gear_tweak_collar_tag = new()
+37 -7
View File
@@ -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)
+2 -2
View File
@@ -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
+4 -2
View File
@@ -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
+1 -1
View File
@@ -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
+8 -2
View File
@@ -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)
+1 -1
View File
@@ -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
/*
+2
View File
@@ -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"
+3 -2
View File
@@ -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.
+12
View File
@@ -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"
+8 -5
View File
@@ -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>")
+2 -2
View File
@@ -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)
+4 -4
View File
@@ -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)
+1 -1
View File
@@ -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)
+12
View File
@@ -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)
+3 -3
View File
@@ -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")
+12 -1
View File
@@ -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
+4 -24
View File
@@ -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
+7 -7
View File
@@ -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].")
+4 -4
View File
@@ -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
+2
View File
@@ -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)
+13 -13
View File
@@ -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
+1 -1
View File
@@ -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)
+20 -20
View File
@@ -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())
-3
View File
@@ -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
+12 -12
View File
@@ -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
+2
View File
@@ -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()
+1 -1
View File
@@ -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)
+1
View File
@@ -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
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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)
+1 -1
View File
@@ -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)
+2 -2
View File
@@ -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.
+1 -1
View File
@@ -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)
+1 -1
View File
@@ -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)
+2 -2
View File
@@ -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)
+2 -2
View File
@@ -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?
+102 -7
View File
@@ -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
+6
View File
@@ -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)
+6
View File
@@ -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)
+6
View File
@@ -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)
+2
View File
@@ -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
..()
+7 -1
View File
@@ -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
+18
View File
@@ -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]!")
+91 -86
View File
@@ -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
+34 -4
View File
@@ -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)
+6
View File
@@ -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")
+6
View File
@@ -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)
+9 -1
View File
@@ -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