Merge remote-tracking branch 'refs/remotes/Citadel-Station-13/master' into crewobjectivesandmiscreants

This commit is contained in:
deathride58
2017-10-06 09:39:20 -04:00
99 changed files with 1962 additions and 2229 deletions
+2
View File
@@ -174,3 +174,5 @@
#define LAVALAND_EQUIPMENT_EFFECT_PRESSURE 50 //what pressure you have to be under to increase the effect of equipment meant for lavaland
#define LAVALAND_DEFAULT_ATMOS "o2=14;n2=23;TEMP=300"
#define THERMAL_ENERGY(gas) (gas.temperature * gas.heat_capacity())
+2
View File
@@ -140,6 +140,8 @@
#define isstructure(A) (istype(A, /obj/structure))
#define ismachinery(A) (istype(A, /obj/machinery))
#define ismecha(A) (istype(A, /obj/mecha))
#define is_cleanable(A) (istype(A, /obj/effect/decal/cleanable) || istype(A, /obj/effect/rune)) //if something is cleanable
+6
View File
@@ -288,6 +288,12 @@ GLOBAL_LIST_INIT(ghost_accs_options, list(GHOST_ACCS_NONE, GHOST_ACCS_DIR, GHOST
GLOBAL_LIST_INIT(ghost_others_options, list(GHOST_OTHERS_SIMPLE, GHOST_OTHERS_DEFAULT_SPRITE, GHOST_OTHERS_THEIR_SETTING)) //Same as ghost_accs_options.
//pda fonts
#define MONO "Monospaced"
#define VT "VT323"
#define ORBITRON "Orbitron"
#define SHARE "Share Tech Mono"
//Color Defines
#define OOC_COLOR "#002eb8"
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -20,7 +20,7 @@
return SendSignal(COMSIG_PARENT_ATTACKBY, W, user, params)
/obj/attackby(obj/item/I, mob/living/user, params)
return ..() || I.attack_obj(src, user)
return ..() || (can_be_hit && I.attack_obj(src, user))
/mob/living/attackby(obj/item/I, mob/living/user, params)
user.changeNext_move(CLICK_CD_MELEE)
-46
View File
@@ -592,49 +592,3 @@
var/datum/language_holder/H = M.get_language_holder()
H.open_language_menu(usr)
/datum/action/innate/dash
name = "Dash"
desc = "Teleport to the targeted location."
icon_icon = 'icons/mob/actions/actions_items.dmi'
button_icon_state = "jetboot"
var/charged = TRUE
var/charge_rate = 250
var/mob/living/carbon/human/holder
var/obj/item/dashing_item
var/dash_sound = 'sound/magic/blink.ogg'
var/recharge_sound = 'sound/magic/charge.ogg'
var/beam_effect = "blur"
var/phasein = /obj/effect/temp_visual/dir_setting/ninja/phase
var/phaseout = /obj/effect/temp_visual/dir_setting/ninja/phase/out
/datum/action/innate/dash/Grant(mob/user, obj/dasher)
. = ..()
dashing_item = dasher
holder = user
/datum/action/innate/dash/IsAvailable()
if(charged)
return TRUE
else
return FALSE
/datum/action/innate/dash/Activate()
dashing_item.attack_self(holder) //Used to toggle dash behavior in the dashing item
/datum/action/innate/dash/proc/Teleport(mob/user, atom/target)
var/turf/T = get_turf(target)
if(target in view(user.client.view, get_turf(user)))
var/obj/spot1 = new phaseout(get_turf(user), user.dir)
user.forceMove(T)
playsound(T, dash_sound, 25, 1)
var/obj/spot2 = new phasein(get_turf(user), user.dir)
spot1.Beam(spot2,beam_effect,time=20)
charged = FALSE
holder.update_action_buttons_icon()
addtimer(CALLBACK(src, .proc/charge), charge_rate)
/datum/action/innate/dash/proc/charge()
charged = TRUE
holder.update_action_buttons_icon()
playsound(dashing_item, recharge_sound, 50, 1)
to_chat(holder, "<span class='warning'>[dashing_item] is ready for another jaunt.</span>")
@@ -58,3 +58,9 @@
break
SSticker.mode.update_abductor_icons_added(owner)
/datum/antagonist/abductor/scientist/finalize_abductor()
..()
var/mob/living/carbon/human/H = owner.current
var/datum/species/abductor/A = H.dna.species
A.scientist = TRUE
+29
View File
@@ -0,0 +1,29 @@
/datum/component/spraycan_paintable
var/current_paint
/datum/component/spraycan_paintable/Initialize()
RegisterSignal(COMSIG_PARENT_ATTACKBY, .proc/Repaint)
/datum/component/spraycan_paintable/Destroy()
RemoveCurrentCoat()
return ..()
/datum/component/spraycan_paintable/proc/RemoveCurrentCoat()
var/atom/A = parent
A.remove_atom_colour(FIXED_COLOUR_PRIORITY, current_paint)
/datum/component/spraycan_paintable/proc/Repaint(obj/item/toy/crayon/spraycan/spraycan, mob/living/user)
if(!istype(spraycan) || user.a_intent == INTENT_HARM)
return FALSE
. = TRUE
if(spraycan.is_capped)
to_chat(user, "<span class='warning'>Take the cap off first!</span>")
return
RemoveCurrentCoat()
if(spraycan.use_charges(user, 2))
var/colour = spraycan.paint_color
current_paint = colour
var/atom/A = parent
A.add_atom_colour(colour, FIXED_COLOUR_PRIORITY)
playsound(spraycan, 'sound/effects/spray.ogg', 5, 1, 5)
to_chat(user, "<span class='notice'>You spray [spraycan] on [A], painting it.</span>")
+50
View File
@@ -0,0 +1,50 @@
/datum/action/innate/dash
name = "Dash"
desc = "Teleport to the targeted location."
icon_icon = 'icons/mob/actions/actions_items.dmi'
button_icon_state = "jetboot"
var/current_charges = 1
var/max_charges = 1
var/charge_rate = 250
var/mob/living/carbon/human/holder
var/obj/item/dashing_item
var/dash_sound = 'sound/magic/blink.ogg'
var/recharge_sound = 'sound/magic/charge.ogg'
var/beam_effect = "blur"
var/phasein = /obj/effect/temp_visual/dir_setting/ninja/phase
var/phaseout = /obj/effect/temp_visual/dir_setting/ninja/phase/out
/datum/action/innate/dash/Grant(mob/user, obj/dasher)
. = ..()
dashing_item = dasher
holder = user
/datum/action/innate/dash/IsAvailable()
if(current_charges > 0)
return TRUE
else
return FALSE
/datum/action/innate/dash/Activate()
dashing_item.attack_self(holder) //Used to toggle dash behavior in the dashing item
/datum/action/innate/dash/proc/Teleport(mob/user, atom/target)
if(!IsAvailable())
return
var/turf/T = get_turf(target)
if(target in view(user.client.view, get_turf(user)))
var/obj/spot1 = new phaseout(get_turf(user), user.dir)
user.forceMove(T)
playsound(T, dash_sound, 25, 1)
var/obj/spot2 = new phasein(get_turf(user), user.dir)
spot1.Beam(spot2,beam_effect,time=20)
current_charges--
holder.update_action_buttons_icon()
addtimer(CALLBACK(src, .proc/charge), charge_rate)
/datum/action/innate/dash/proc/charge()
current_charges = Clamp(current_charges + 1, 0, max_charges)
holder.update_action_buttons_icon()
if(recharge_sound)
playsound(dashing_item, recharge_sound, 50, 1)
to_chat(holder, "<span class='notice'>[src] now has [current_charges]/[max_charges] charges.</span>")
+6 -5
View File
@@ -42,7 +42,7 @@
I.trigger(key, L)
if(!msg)
return FALSE
return
user.log_message(msg, INDIVIDUAL_EMOTE_LOG)
msg = "<b>[user]</b> " + msg
@@ -91,21 +91,22 @@
/datum/emote/proc/select_param(mob/user, params)
return replacetext(message_param, "%t", params)
/datum/emote/proc/can_run_emote(mob/user, help_check)
/datum/emote/proc/can_run_emote(mob/user, status_check = TRUE)
. = TRUE
if(!is_type_in_typecache(user, mob_type_allowed_typecache))
return FALSE
if(is_type_in_typecache(user, mob_type_blacklist_typecache))
return FALSE
if(!help_check)
if(status_check)
if(user.stat > stat_allowed || (user.status_flags & FAKEDEATH))
to_chat(user, "<span class='notice'>You cannot [key] while unconscious.</span>")
return FALSE
if(restraint_check && user.restrained())
if(restraint_check && (user.restrained() || user.buckled))
to_chat(user, "<span class='notice'>You cannot [key] while restrained.</span>")
return FALSE
if(user.reagents && user.reagents.has_reagent("mimesbane"))
return FALSE
/datum/emote/sound
var/sound //Sound to play when emote is called
var/vary = FALSE //used for the honk borg emote
+1 -1
View File
@@ -1119,7 +1119,7 @@
message_admins("[key_name_admin(usr)] has nuke op'ed [current].")
log_admin("[key_name(usr)] has nuke op'ed [current].")
if("lair")
current.forceMove(get_turf(locate("landmark*Syndicate-Spawn")))
current.forceMove(pick(GLOB.nukeop_start))
if("dressup")
var/mob/living/carbon/human/H = current
qdel(H.belt)
+5 -4
View File
@@ -449,10 +449,11 @@ GLOBAL_LIST_EMPTY(teleportlocs)
if(!L.client.played)
SEND_SOUND(L, sound(sound, repeat = 0, wait = 0, volume = 25, channel = CHANNEL_AMBIENCE))
L.client.played = 1
sleep(600) //ewww - this is very very bad
if(L.&& L.client)
L.client.played = 0
L.client.played = TRUE
addtimer(CALLBACK(L.client, /client/proc/ResetAmbiencePlayed), 600)
/client/proc/ResetAmbiencePlayed()
played = FALSE
/atom/proc/has_gravity(turf/T)
if(!T || !isturf(T))
+1 -1
View File
@@ -85,7 +85,7 @@
src.grille += 1
else if(istype(O, /obj/machinery/door))
src.door += 1
else if(istype(O, /obj/machinery))
else if(ismachinery(O))
src.mach += 1
if(count_territories)
+13 -1
View File
@@ -163,7 +163,6 @@ Credit where due:
if(!M || !ishuman(M))
return FALSE
var/mob/living/carbon/human/L = M
L.set_species(/datum/species/human)
L.equipOutfit(/datum/outfit/servant_of_ratvar)
var/obj/item/clockwork/slab/S = new
var/slot = "At your feet"
@@ -239,6 +238,7 @@ Credit where due:
//Servant of Ratvar outfit
/datum/outfit/servant_of_ratvar
name = "Servant of Ratvar"
uniform = /obj/item/clothing/under/chameleon/ratvar
shoes = /obj/item/clothing/shoes/workboots
back = /obj/item/storage/backpack
@@ -248,6 +248,15 @@ Credit where due:
backpack_contents = list(/obj/item/storage/box/engineer = 1, \
/obj/item/clockwork/replica_fabricator = 1, /obj/item/stack/tile/brass/fifty = 1, /obj/item/paper/servant_primer = 1)
id = /obj/item/card/id
var/plasmaman //We use this to determine if we should activate internals in post_equip()
/datum/outfit/servant_of_ratvar/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
if(H.dna.species.id == "plasmaman") //Plasmamen get additional equipment because of how they work
head = /obj/item/clothing/head/helmet/space/plasmaman
uniform = /obj/item/clothing/under/plasmaman //Plasmamen generally shouldn't need chameleon suits anyways, since everyone expects them to wear their fire suit
r_hand = /obj/item/tank/internals/plasmaman/belt/full
mask = /obj/item/clothing/mask/breath
plasmaman = TRUE
/datum/outfit/servant_of_ratvar/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
var/obj/item/card/id/W = H.wear_id
@@ -255,6 +264,9 @@ Credit where due:
W.access += ACCESS_MAINT_TUNNELS
W.registered_name = H.real_name
W.update_label()
if(plasmaman && !visualsOnly) //If we need to breathe from the plasma tank, we should probably start doing that
H.internal = H.get_item_for_held_index(2)
H.update_internals_hud_icon(1)
/obj/item/paper/servant_primer
name = "The Ark And You: A Primer On Servitude"
@@ -11,7 +11,7 @@
break_message = "<span class='warning'>The warden's eye gives a glare of utter hate before falling dark!</span>"
debris = list(/obj/item/clockwork/component/belligerent_eye/blind_eye = 1)
resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF
var/damage_per_tick = 2.5
var/damage_per_tick = 3
var/sight_range = 3
var/atom/movable/target
var/list/idle_messages = list(" sulkily glares around.", " lazily drifts from side to side.", " looks around for something to burn.", " slowly turns in circles.")
@@ -141,8 +141,12 @@
. = 1
if(target)
for(var/turf/T in getline(src, target))
if(T.density)
. -= 0.1
continue
for(var/obj/structure/O in T)
if(O.density)
. -= 0.15
if(O != src && O.density)
. -= 0.1
break
. -= (get_dist(src, target) * 0.05)
. = max(., 0.1) //The lowest damage a warden can do is 10% of its normal amount (0.25 by default)
+5 -5
View File
@@ -98,7 +98,6 @@
var/datum/action/innate/cult/spin2win/linked_action
var/spinning = FALSE
var/spin_cooldown = 250
var/list/shards = list()
var/dash_toggled = TRUE
/obj/item/twohanded/required/cult_bastard/Initialize()
@@ -174,11 +173,12 @@
if(H.stat != CONSCIOUS)
var/obj/item/device/soulstone/SS = new /obj/item/device/soulstone(src)
SS.attack(H, user)
shards += SS
return
if(!LAZYLEN(SS.contents))
qdel(SS)
if(istype(target, /obj/structure/constructshell) && contents.len)
var/obj/item/device/soulstone/SS = contents[1]
if(istype(SS) && SS.transfer_soul("CONSTRUCT",target,user))
if(istype(SS))
SS.transfer_soul("CONSTRUCT",target,user)
qdel(SS)
/datum/action/innate/dash/cult
@@ -193,7 +193,7 @@
phaseout = /obj/effect/temp_visual/dir_setting/cult/phase/out
/datum/action/innate/dash/cult/IsAvailable()
if(iscultist(holder) && charged)
if(iscultist(holder) && current_charges)
return TRUE
else
return FALSE
+1 -1
View File
@@ -112,7 +112,7 @@
pickedtype = /obj/item/twohanded/required/cult_bastard
else
cooldowntime = 12000 - (world.time - SSticker.round_start_time)
to_chat(user, "<span class='cultitalic'>The forge fires are not yet hot enough for this weapon, give it another [DisplayTimeText(cooldowntime - world.time)].</span>")
to_chat(user, "<span class='cultitalic'>The forge fires are not yet hot enough for this weapon, give it another [DisplayTimeText(cooldowntime)].</span>")
cooldowntime = 0
return
if(src && !QDELETED(src) && anchored && pickedtype && Adjacent(user) && !user.incapacitated() && iscultist(user) && cooldowntime <= world.time)
+1 -4
View File
@@ -111,10 +111,7 @@
if (!newname)
newname = randomname
wizard_mob.real_name = newname
wizard_mob.name = newname
if(wizard_mob.mind)
wizard_mob.mind.name = newname
wizard_mob.fully_replace_character_name(wizard_mob.real_name, newname)
/* Wizards by nature cannot be too young. */
if(wizard_mob.age < WIZARD_AGE_MIN)
+3 -2
View File
@@ -1009,8 +1009,9 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
/obj/item/clothing/mask/joy = 1,
/obj/item/clothing/head/cueball = 1,
/obj/item/clothing/under/scratch = 1,
/obj/item/clothing/under/sailor = 1,
/obj/item/clothing/ears/headphones = 2)
/obj/item/clothing/under/sailor = 1,
/obj/item/clothing/ears/headphones = 2,
/obj/item/clothing/head/wig/random = 3)
contraband = list(/obj/item/clothing/suit/judgerobe = 1, /obj/item/clothing/head/powdered_wig = 1, /obj/item/gun/magic/wand = 2, /obj/item/clothing/glasses/sunglasses/garb = 2, /obj/item/clothing/glasses/sunglasses/blindfold = 1, /obj/item/clothing/mask/muzzle = 2)
premium = list(/obj/item/clothing/suit/pirate/captain = 2, /obj/item/clothing/head/pirate/captain = 2, /obj/item/clothing/head/helmet/roman = 1, /obj/item/clothing/head/helmet/roman/legionaire = 1, /obj/item/clothing/under/roman = 1, /obj/item/clothing/shoes/roman = 1, /obj/item/shield/riot/roman = 1, /obj/item/skub = 1)
refill_canister = /obj/item/vending_refill/autodrobe
+2 -4
View File
@@ -4,9 +4,7 @@
/obj/effect
icon = 'icons/effects/effects.dmi'
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF | FREEZE_PROOF
/obj/effect/attackby(obj/item/I, mob/living/user, params)
return
can_be_hit = FALSE
/obj/effect/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1, attack_dir)
return
@@ -57,4 +55,4 @@
return
/obj/effect/abstract/singularity_act()
return
return
+6
View File
@@ -26,6 +26,8 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE)
max_integrity = 200
can_be_hit = FALSE
var/hitsound = null
var/usesound = null
var/throwhitsound = null
@@ -322,6 +324,7 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE)
// Due to storage type consolidation this should get used more now.
// I have cleaned it up a little, but it could probably use more. -Sayu
// The lack of ..() is intentional, do not add one
// added one, fuck the police
/obj/item/attackby(obj/item/W, mob/user, params)
if(istype(W, /obj/item/storage))
var/obj/item/storage/S = W
@@ -346,9 +349,12 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE)
qdel(progress)
to_chat(user, "<span class='notice'>You put everything you could [S.preposition] [S].</span>")
return
else if(S.can_be_inserted(src))
S.handle_item_insertion(src)
return
return ..()
/obj/item/proc/handle_mass_pickup(obj/item/storage/S, list/things, atom/thing_loc, list/rejections, datum/progressbar/progress)
for(var/obj/item/I in things)
+17 -15
View File
@@ -107,20 +107,19 @@
var/amount = weight * units_per_weight
reagents.add_reagent(reagent, amount)
/obj/item/toy/crayon/proc/use_charges(amount)
/obj/item/toy/crayon/proc/use_charges(mob/user, amount = 1, requires_full = TRUE)
// Returns number of charges actually used
switch(paint_mode)
if(PAINT_LARGE_HORIZONTAL)
amount *= 3
if(charges == -1)
. = amount
refill()
else
. = min(charges_left, amount)
charges_left -= .
if(check_empty(user, amount, requires_full))
return 0
else
. = min(charges_left, amount)
charges_left -= .
/obj/item/toy/crayon/proc/check_empty(mob/user)
/obj/item/toy/crayon/proc/check_empty(mob/user, amount = 1, requires_full = TRUE)
// When eating a crayon, check_empty() can be called twice producing
// two messages unless we check for being deleted first
if(QDELETED(src))
@@ -131,10 +130,13 @@
if(charges == -1)
. = FALSE
else if(!charges_left)
to_chat(user, "<span class='warning'>There is no more of \the [src.name] left!</span>")
to_chat(user, "<span class='warning'>There is no more of [src] left!</span>")
if(self_contained)
qdel(src)
. = TRUE
else if(charges_left < amount && requires_full)
to_chat(user, "<span class='warning'>There is not enough of [src] left!</span>")
. = TRUE
/obj/item/toy/crayon/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.hands_state)
// tgui is a plague upon this codebase
@@ -298,7 +300,7 @@
var/takes_time = !instant
var/wait_time = 50
if(PAINT_LARGE_HORIZONTAL)
if(paint_mode == PAINT_LARGE_HORIZONTAL)
wait_time *= 3
if(takes_time)
@@ -343,7 +345,7 @@
var/cost = 1
if(paint_mode == PAINT_LARGE_HORIZONTAL)
cost = 5
. = use_charges(cost)
. = use_charges(user, cost)
var/fraction = min(1, . / reagents.maximum_volume)
if(affected_turfs.len)
fraction /= affected_turfs.len
@@ -355,7 +357,7 @@
/obj/item/toy/crayon/attack(mob/M, mob/user)
if(edible && (M == user))
to_chat(user, "You take a bite of the [src.name]. Delicious!")
var/eaten = use_charges(5)
var/eaten = use_charges(user, 5, FALSE)
if(check_empty(user)) //Prevents divsion by zero
return
var/fraction = min(eaten / reagents.total_volume, 1)
@@ -527,7 +529,7 @@
H.lip_style = "spray_face"
H.lip_color = paint_color
H.update_body()
var/used = use_charges(10)
var/used = use_charges(user, 10, FALSE)
var/fraction = min(1, used / reagents.maximum_volume)
reagents.reaction(user, VAPOR, fraction * volume_multiplier)
reagents.trans_to(user, used, volume_multiplier)
@@ -583,7 +585,7 @@
H.update_body()
// Caution, spray cans contain inflammable substances
. = use_charges(10)
. = use_charges(user, 10, FALSE)
var/fraction = min(1, . / reagents.maximum_volume)
reagents.reaction(C, VAPOR, fraction * volume_multiplier)
@@ -596,7 +598,7 @@
target.set_opacity(255)
else
target.set_opacity(initial(target.opacity))
. = use_charges(2)
. = use_charges(user, 2)
var/fraction = min(1, . / reagents.maximum_volume)
reagents.reaction(target, TOUCH, fraction * volume_multiplier)
reagents.trans_to(target, ., volume_multiplier)
+39 -13
View File
@@ -27,13 +27,17 @@ GLOBAL_LIST_EMPTY(PDAs)
var/mode = 0 //Controls what menu the PDA will display. 0 is hub; the rest are either built in or based on cartridge.
var/icon_alert = "pda-r" //Icon to be overlayed for message alerts. Taken from the pda icon file.
var/font_index = 0 //This int tells DM which font is currently selected and lets DM know when the last font has been selected so that it can cycle back to the first font when "toggle font" is pressed again.
var/font_mode = "font-family:\"VT323\", monospace;letter-spacing:1px;" //The currently selected font.
var/font_mode = "font-family:monospace;" //The currently selected font.
var/background_color = "#808000" //The currently selected background color.
#define FONT_VT 0
#define FONT_SHARE 1
#define FONT_ORBITRON 2
#define FONT_MONO 3
#define FONT_MONO "font-family:monospace;"
#define FONT_SHARE "font-family:\"Share Tech Mono\", monospace;letter-spacing:0px;"
#define FONT_ORBITRON "font-family:\"Orbitron\", monospace;letter-spacing:0px; font-size:15px"
#define FONT_VT "font-family:\"VT323\", monospace;letter-spacing:1px;"
#define MODE_MONO 0
#define MODE_SHARE 1
#define MODE_ORBITRON 2
#define MODE_VT 3
//Secondary variables
var/scanmode = 0 //1 is medical scanner, 2 is forensics, 3 is reagent scanner.
@@ -54,6 +58,7 @@ GLOBAL_LIST_EMPTY(PDAs)
var/detonatable = TRUE // Can the PDA be blown up?
var/hidden = 0 // Is the PDA hidden from the PDA list?
var/emped = 0
var/equipped = FALSE //used here to determine if this is the first time its been picked up
var/obj/item/card/id/id = null //Making it possible to slot an ID card into the PDA so it can function as both.
var/ownjob = null //related to above
@@ -87,6 +92,27 @@ GLOBAL_LIST_EMPTY(PDAs)
inserted_item = new /obj/item/pen(src)
update_icon()
/obj/item/device/pda/equipped(mob/user, slot)
if(!equipped)
if(user.client)
switch(user.client.prefs.pda_style)
if(MONO)
font_index = MODE_MONO
font_mode = FONT_MONO
if(SHARE)
font_index = MODE_SHARE
font_mode = FONT_SHARE
if(ORBITRON)
font_index = MODE_ORBITRON
font_mode = FONT_ORBITRON
if(VT)
font_index = MODE_VT
font_mode = FONT_VT
else
font_index = MODE_MONO
font_mode = FONT_MONO
equipped = TRUE
/obj/item/device/pda/proc/update_label()
name = "PDA-[owner] ([ownjob])" //Name generalisation
@@ -335,14 +361,14 @@ GLOBAL_LIST_EMPTY(PDAs)
font_index = (font_index + 1) % 4
switch(font_index)
if (FONT_VT)
font_mode = "font-family:\"VT323\", monospace;letter-spacing:1px;"
if (FONT_SHARE)
font_mode = "font-family:\"Share Tech Mono\", monospace;letter-spacing:0px;"
if (FONT_ORBITRON)
font_mode = "font-family:\"Orbitron\", monospace;letter-spacing:0px; font-size:15px"
if (FONT_MONO)
font_mode = "font-family:monospace;"
if (MODE_MONO)
font_mode = FONT_MONO
if (MODE_SHARE)
font_mode = FONT_SHARE
if (MODE_ORBITRON)
font_mode = FONT_ORBITRON
if (MODE_VT)
font_mode = FONT_VT
if ("Change_Color")
var/new_color = input("Please enter a color name or hex value (Default is \'#808000\').")as color
background_color = new_color
+1 -1
View File
@@ -1,7 +1,7 @@
/obj/item/stack/medical
name = "medical pack"
singular_name = "medical pack"
icon = 'icons/obj/items_and_weapons.dmi'
icon = 'icons/obj/stack_objects.dmi'
amount = 6
max_amount = 6
w_class = WEIGHT_CLASS_TINY
@@ -63,7 +63,7 @@ GLOBAL_LIST_INIT(sandstone_recipes, list ( \
/obj/item/stack/sheet/mineral/sandbags
name = "sandbags"
icon = 'icons/obj/items_and_weapons.dmi'
icon = 'icons/obj/stack_objects.dmi'
icon_state = "sandbags"
singular_name = "sandbag"
layer = LOW_ITEM_LAYER
+8 -8
View File
@@ -8,6 +8,7 @@
* Stacks
*/
/obj/item/stack
icon = 'icons/obj/stack_objects.dmi'
origin_tech = "materials=1"
gender = PLURAL
var/list/datum/stack_recipe/recipes
@@ -150,7 +151,11 @@
if(!building_checks(R, multiplier))
return
var/obj/O = new R.result_type()
var/obj/O
if(R.max_res_amount > 1) //Is it a stack?
O = new R.result_type(usr.drop_location(), R.res_amount * multiplier)
else
O = new R.result_type(usr.drop_location())
O.setDir(usr.dir)
use(R.req_amount * multiplier)
@@ -163,16 +168,11 @@
W.ini_dir = W.dir
//END: oh fuck i'm so sorry
//is it a stack ?
if (R.max_res_amount > 1)
var/obj/item/stack/new_item = O
new_item.amount = R.res_amount*multiplier
new_item.update_icon()
if (QDELETED(O))
return //It's a stack and has already been merged
if (isitem(O))
usr.put_in_hands(O)
else
O.forceMove(usr.drop_location())
O.add_fingerprint(usr)
//BubbleWrap - so newly formed boxes are empty
+1 -1
View File
@@ -162,7 +162,7 @@ GLOBAL_LIST_INIT(bibleitemstates, list("bible", "koran", "scrapbook", "bible",
playsound(src,'sound/hallucinations/veryfar_noise.ogg',40,1)
if(do_after(user, 40, target = sword))
playsound(src,'sound/effects/pray_chaplain.ogg',60,1)
for(var/obj/item/device/soulstone/SS in sword.shards)
for(var/obj/item/device/soulstone/SS in sword.contents)
SS.usability = TRUE
for(var/mob/living/simple_animal/shade/EX in SS)
SSticker.mode.remove_cultist(EX.mind, 1, 0)
@@ -1,531 +0,0 @@
/obj/item/weapon/storage/belt
name = "belt"
desc = "Can hold various things."
icon = 'icons/obj/clothing/belts.dmi'
icon_state = "utilitybelt"
item_state = "utility"
slot_flags = SLOT_BELT
attack_verb = list("whipped", "lashed", "disciplined")
max_integrity = 300
var/content_overlays = FALSE //If this is true, the belt will gain overlays based on what it's holding
/obj/item/weapon/storage/belt/update_icon()
cut_overlays()
if(content_overlays)
for(var/obj/item/I in contents)
var/mutable_appearance/M = I.get_belt_overlay()
add_overlay(M)
..()
/obj/item/weapon/storage/belt/Initialize()
. = ..()
update_icon()
/obj/item/weapon/storage/belt/utility
name = "toolbelt" //Carn: utility belt is nicer, but it bamboozles the text parsing.
desc = "Holds tools."
icon_state = "utilitybelt"
item_state = "utility"
can_hold = list(
/obj/item/weapon/crowbar,
/obj/item/weapon/screwdriver,
/obj/item/weapon/weldingtool,
/obj/item/weapon/wirecutters,
/obj/item/weapon/wrench,
/obj/item/device/multitool,
/obj/item/device/flashlight,
/obj/item/stack/cable_coil,
/obj/item/device/t_scanner,
/obj/item/device/analyzer,
/obj/item/weapon/extinguisher/mini,
/obj/item/device/radio,
/obj/item/clothing/gloves
)
content_overlays = TRUE
/obj/item/weapon/storage/belt/utility/chief
name = "\improper Chief Engineer's toolbelt" //"the Chief Engineer's toolbelt", because "Chief Engineer's toolbelt" is not a proper noun
desc = "Holds tools, looks snazzy."
icon_state = "utilitybelt_ce"
item_state = "utility_ce"
/obj/item/weapon/storage/belt/utility/chief/full/PopulateContents()
new /obj/item/weapon/screwdriver/power(src)
new /obj/item/weapon/crowbar/power(src)
new /obj/item/weapon/weldingtool/experimental(src)//This can be changed if this is too much
new /obj/item/device/multitool(src)
new /obj/item/stack/cable_coil(src,30,pick("red","yellow","orange"))
new /obj/item/weapon/extinguisher/mini(src)
new /obj/item/device/analyzer(src)
//much roomier now that we've managed to remove two tools
/obj/item/weapon/storage/belt/utility/full/PopulateContents()
new /obj/item/weapon/screwdriver(src)
new /obj/item/weapon/wrench(src)
new /obj/item/weapon/weldingtool(src)
new /obj/item/weapon/crowbar(src)
new /obj/item/weapon/wirecutters(src)
new /obj/item/device/multitool(src)
new /obj/item/stack/cable_coil(src,30,pick("red","yellow","orange"))
/obj/item/weapon/storage/belt/utility/full/engi/PopulateContents()
new /obj/item/weapon/screwdriver(src)
new /obj/item/weapon/wrench(src)
new /obj/item/weapon/weldingtool/largetank(src)
new /obj/item/weapon/crowbar(src)
new /obj/item/weapon/wirecutters(src)
new /obj/item/device/multitool(src)
new /obj/item/stack/cable_coil(src,30,pick("red","yellow","orange"))
/obj/item/weapon/storage/belt/utility/atmostech/PopulateContents()
new /obj/item/weapon/screwdriver(src)
new /obj/item/weapon/wrench(src)
new /obj/item/weapon/weldingtool(src)
new /obj/item/weapon/crowbar(src)
new /obj/item/weapon/wirecutters(src)
new /obj/item/device/t_scanner(src)
new /obj/item/weapon/extinguisher/mini(src)
/obj/item/weapon/storage/belt/utility/servant/PopulateContents()
new /obj/item/weapon/screwdriver/brass(src)
new /obj/item/weapon/wirecutters/brass(src)
new /obj/item/weapon/wrench/brass(src)
new /obj/item/weapon/crowbar/brass(src)
new /obj/item/weapon/weldingtool/experimental/brass(src)
new /obj/item/device/multitool(src)
new /obj/item/stack/cable_coil(src, 30, "yellow")
/obj/item/weapon/storage/belt/medical
name = "medical belt"
desc = "Can hold various medical equipment."
icon_state = "medicalbelt"
item_state = "medical"
max_w_class = WEIGHT_CLASS_BULKY
can_hold = list(
/obj/item/device/healthanalyzer,
/obj/item/weapon/dnainjector,
/obj/item/weapon/reagent_containers/dropper,
/obj/item/weapon/reagent_containers/glass/beaker,
/obj/item/weapon/reagent_containers/glass/bottle,
/obj/item/weapon/reagent_containers/pill,
/obj/item/weapon/reagent_containers/syringe,
/obj/item/weapon/lighter,
/obj/item/weapon/storage/fancy/cigarettes,
/obj/item/weapon/storage/pill_bottle,
/obj/item/stack/medical,
/obj/item/device/flashlight/pen,
/obj/item/weapon/extinguisher/mini,
/obj/item/weapon/reagent_containers/hypospray,
/obj/item/device/sensor_device,
/obj/item/device/radio,
/obj/item/clothing/gloves/,
/obj/item/weapon/lazarus_injector,
/obj/item/weapon/bikehorn/rubberducky,
/obj/item/clothing/mask/surgical,
/obj/item/clothing/mask/breath,
/obj/item/clothing/mask/breath/medical,
/obj/item/weapon/surgical_drapes, //for true paramedics
/obj/item/weapon/scalpel,
/obj/item/weapon/circular_saw,
/obj/item/weapon/surgicaldrill,
/obj/item/weapon/retractor,
/obj/item/weapon/cautery,
/obj/item/weapon/hemostat,
/obj/item/device/geiger_counter,
/obj/item/clothing/neck/stethoscope,
/obj/item/weapon/stamp,
/obj/item/clothing/glasses,
/obj/item/weapon/wrench/medical,
/obj/item/clothing/mask/muzzle,
/obj/item/weapon/storage/bag/chemistry,
/obj/item/weapon/storage/bag/bio,
/obj/item/weapon/reagent_containers/blood,
/obj/item/weapon/tank/internals/emergency_oxygen
)
/obj/item/weapon/storage/belt/security
name = "security belt"
desc = "Can hold security gear like handcuffs and flashes."
icon_state = "securitybelt"
item_state = "security"//Could likely use a better one.
storage_slots = 5
max_w_class = WEIGHT_CLASS_NORMAL //Because the baton wouldn't fit otherwise. - Neerti
can_hold = list(
/obj/item/weapon/melee/baton,
/obj/item/weapon/melee/classic_baton,
/obj/item/weapon/grenade,
/obj/item/weapon/reagent_containers/spray/pepper,
/obj/item/weapon/restraints/handcuffs,
/obj/item/device/assembly/flash/handheld,
/obj/item/clothing/glasses,
/obj/item/ammo_casing/shotgun,
/obj/item/ammo_box,
/obj/item/weapon/reagent_containers/food/snacks/donut,
/obj/item/weapon/reagent_containers/food/snacks/donut/jelly,
/obj/item/weapon/kitchen/knife/combat,
/obj/item/device/flashlight/seclite,
/obj/item/weapon/melee/classic_baton/telescopic,
/obj/item/device/radio,
/obj/item/clothing/gloves/,
/obj/item/weapon/restraints/legcuffs/bola
)
content_overlays = TRUE
/obj/item/weapon/storage/belt/security/full/PopulateContents()
new /obj/item/weapon/reagent_containers/spray/pepper(src)
new /obj/item/weapon/restraints/handcuffs(src)
new /obj/item/weapon/grenade/flashbang(src)
new /obj/item/device/assembly/flash/handheld(src)
new /obj/item/weapon/melee/baton/loaded(src)
update_icon()
/obj/item/weapon/storage/belt/mining
name = "explorer's webbing"
desc = "A versatile chest rig, cherished by miners and hunters alike."
icon_state = "explorer1"
item_state = "explorer1"
storage_slots = 6
w_class = WEIGHT_CLASS_BULKY
max_w_class = WEIGHT_CLASS_BULKY //Pickaxes are big.
max_combined_w_class = 20 //Not an issue with this whitelist, probably.
can_hold = list(
/obj/item/weapon/crowbar,
/obj/item/weapon/screwdriver,
/obj/item/weapon/weldingtool,
/obj/item/weapon/wirecutters,
/obj/item/weapon/wrench,
/obj/item/device/flashlight,
/obj/item/stack/cable_coil,
/obj/item/device/analyzer,
/obj/item/weapon/extinguisher/mini,
/obj/item/device/radio,
/obj/item/clothing/gloves,
/obj/item/weapon/resonator,
/obj/item/device/mining_scanner,
/obj/item/weapon/pickaxe,
/obj/item/stack/sheet/animalhide,
/obj/item/stack/sheet/sinew,
/obj/item/stack/sheet/bone,
/obj/item/weapon/lighter,
/obj/item/weapon/storage/fancy/cigarettes,
/obj/item/weapon/reagent_containers/food/drinks/bottle,
/obj/item/stack/medical,
/obj/item/weapon/kitchen/knife,
/obj/item/weapon/reagent_containers/hypospray,
/obj/item/device/gps,
/obj/item/weapon/storage/bag/ore,
/obj/item/weapon/survivalcapsule,
/obj/item/device/t_scanner/adv_mining_scanner,
/obj/item/weapon/reagent_containers/pill,
/obj/item/weapon/storage/pill_bottle,
/obj/item/weapon/ore,
/obj/item/weapon/reagent_containers/food/drinks,
/obj/item/organ/regenerative_core,
/obj/item/device/wormhole_jaunter,
/obj/item/weapon/storage/bag/plants,
/obj/item/stack/marker_beacon
)
/obj/item/weapon/storage/belt/mining/vendor
contents = newlist(/obj/item/weapon/survivalcapsule)
/obj/item/weapon/storage/belt/mining/alt
icon_state = "explorer2"
item_state = "explorer2"
/obj/item/weapon/storage/belt/mining/primitive
name = "hunter's belt"
desc = "A versatile belt, woven from sinew."
storage_slots = 5
icon_state = "ebelt"
item_state = "ebelt"
/obj/item/weapon/storage/belt/soulstone
name = "soul stone belt"
desc = "Designed for ease of access to the shards during a fight, as to not let a single enemy spirit slip away"
icon_state = "soulstonebelt"
item_state = "soulstonebelt"
storage_slots = 6
can_hold = list(
/obj/item/device/soulstone
)
/obj/item/weapon/storage/belt/soulstone/full/PopulateContents()
for(var/i in 1 to 6)
new /obj/item/device/soulstone(src)
/obj/item/weapon/storage/belt/champion
name = "championship belt"
desc = "Proves to the world that you are the strongest!"
icon_state = "championbelt"
item_state = "champion"
materials = list(MAT_GOLD=400)
storage_slots = 1
can_hold = list(
/obj/item/clothing/mask/luchador
)
/obj/item/weapon/storage/belt/military
name = "chest rig"
desc = "A set of tactical webbing worn by Syndicate boarding parties."
icon_state = "militarywebbing"
item_state = "militarywebbing"
max_w_class = WEIGHT_CLASS_SMALL
/obj/item/weapon/storage/belt/military/abductor
name = "agent belt"
desc = "A belt used by abductor agents."
icon = 'icons/obj/abductor.dmi'
icon_state = "belt"
item_state = "security"
/obj/item/weapon/storage/belt/military/abductor/full/PopulateContents()
new /obj/item/weapon/screwdriver/abductor(src)
new /obj/item/weapon/wrench/abductor(src)
new /obj/item/weapon/weldingtool/abductor(src)
new /obj/item/weapon/crowbar/abductor(src)
new /obj/item/weapon/wirecutters/abductor(src)
new /obj/item/device/multitool/abductor(src)
new /obj/item/stack/cable_coil(src,30,"white")
/obj/item/weapon/storage/belt/military/army
name = "army belt"
desc = "A belt used by military forces."
icon_state = "grenadebeltold"
item_state = "security"
/obj/item/weapon/storage/belt/military/assault
name = "assault belt"
desc = "A tactical assault belt."
icon_state = "assaultbelt"
item_state = "security"
storage_slots = 6
/obj/item/weapon/storage/belt/grenade
name = "grenadier belt"
desc = "A belt for holding grenades."
icon_state = "grenadebeltnew"
item_state = "security"
max_w_class = WEIGHT_CLASS_BULKY
display_contents_with_number = TRUE
storage_slots = 30
max_combined_w_class = 60 //needs to be this high
can_hold = list(
/obj/item/weapon/grenade,
/obj/item/weapon/screwdriver,
/obj/item/weapon/lighter,
/obj/item/device/multitool,
/obj/item/weapon/reagent_containers/food/drinks/bottle/molotov,
/obj/item/weapon/grenade/plastic/c4,
)
/obj/item/weapon/storage/belt/grenade/full/PopulateContents()
new /obj/item/weapon/grenade/flashbang(src)
new /obj/item/weapon/grenade/smokebomb(src)
new /obj/item/weapon/grenade/smokebomb(src)
new /obj/item/weapon/grenade/smokebomb(src)
new /obj/item/weapon/grenade/smokebomb(src)
new /obj/item/weapon/grenade/empgrenade(src)
new /obj/item/weapon/grenade/empgrenade(src)
new /obj/item/weapon/grenade/syndieminibomb/concussion/frag(src)
new /obj/item/weapon/grenade/syndieminibomb/concussion/frag(src)
new /obj/item/weapon/grenade/syndieminibomb/concussion/frag(src)
new /obj/item/weapon/grenade/syndieminibomb/concussion/frag(src)
new /obj/item/weapon/grenade/syndieminibomb/concussion/frag(src)
new /obj/item/weapon/grenade/syndieminibomb/concussion/frag(src)
new /obj/item/weapon/grenade/syndieminibomb/concussion/frag(src)
new /obj/item/weapon/grenade/syndieminibomb/concussion/frag(src)
new /obj/item/weapon/grenade/syndieminibomb/concussion/frag(src)
new /obj/item/weapon/grenade/syndieminibomb/concussion/frag(src)
new /obj/item/weapon/grenade/gluon(src)
new /obj/item/weapon/grenade/gluon(src)
new /obj/item/weapon/grenade/gluon(src)
new /obj/item/weapon/grenade/gluon(src)
new /obj/item/weapon/grenade/chem_grenade/incendiary(src)
new /obj/item/weapon/grenade/chem_grenade/incendiary(src)
new /obj/item/weapon/grenade/chem_grenade/facid(src)
new /obj/item/weapon/grenade/syndieminibomb(src)
new /obj/item/weapon/grenade/syndieminibomb(src)
new /obj/item/weapon/screwdriver(src)
new /obj/item/device/multitool(src)
/obj/item/weapon/storage/belt/wands
name = "wand belt"
desc = "A belt designed to hold various rods of power. A veritable fanny pack of exotic magic."
icon_state = "soulstonebelt"
item_state = "soulstonebelt"
storage_slots = 6
can_hold = list(
/obj/item/weapon/gun/magic/wand
)
/obj/item/weapon/storage/belt/wands/full/PopulateContents()
new /obj/item/weapon/gun/magic/wand/death(src)
new /obj/item/weapon/gun/magic/wand/resurrection(src)
new /obj/item/weapon/gun/magic/wand/polymorph(src)
new /obj/item/weapon/gun/magic/wand/teleport(src)
new /obj/item/weapon/gun/magic/wand/door(src)
new /obj/item/weapon/gun/magic/wand/fireball(src)
for(var/obj/item/weapon/gun/magic/wand/W in contents) //All wands in this pack come in the best possible condition
W.max_charges = initial(W.max_charges)
W.charges = W.max_charges
/obj/item/weapon/storage/belt/janitor
name = "janibelt"
desc = "A belt used to hold most janitorial supplies."
icon_state = "janibelt"
item_state = "janibelt"
storage_slots = 6
max_w_class = WEIGHT_CLASS_BULKY // Set to this so the light replacer can fit.
can_hold = list(
/obj/item/weapon/grenade/chem_grenade,
/obj/item/device/lightreplacer,
/obj/item/device/flashlight,
/obj/item/weapon/reagent_containers/spray,
/obj/item/weapon/soap,
/obj/item/weapon/holosign_creator,
/obj/item/key/janitor,
/obj/item/clothing/gloves
)
/obj/item/weapon/storage/belt/bandolier
name = "bandolier"
desc = "A bandolier for holding shotgun ammunition."
icon_state = "bandolier"
item_state = "bandolier"
storage_slots = 18
display_contents_with_number = TRUE
can_hold = list(
/obj/item/ammo_casing/shotgun
)
/obj/item/weapon/storage/belt/holster
name = "shoulder holster"
desc = "A holster to carry a handgun and ammo. WARNING: Badasses only."
icon_state = "holster"
item_state = "holster"
storage_slots = 3
max_w_class = WEIGHT_CLASS_NORMAL
can_hold = list(
/obj/item/weapon/gun/ballistic/automatic/pistol,
/obj/item/weapon/gun/ballistic/revolver,
/obj/item/ammo_box,
)
alternate_worn_layer = UNDER_SUIT_LAYER
/obj/item/weapon/storage/belt/holster/full/PopulateContents()
new /obj/item/weapon/gun/ballistic/revolver/detective(src)
new /obj/item/ammo_box/c38(src)
new /obj/item/ammo_box/c38(src)
/obj/item/weapon/storage/belt/fannypack
name = "fannypack"
desc = "A dorky fannypack for keeping small items in."
icon_state = "fannypack_leather"
item_state = "fannypack_leather"
storage_slots = 3
max_w_class = WEIGHT_CLASS_SMALL
/obj/item/weapon/storage/belt/fannypack/black
name = "black fannypack"
icon_state = "fannypack_black"
item_state = "fannypack_black"
/obj/item/weapon/storage/belt/fannypack/red
name = "red fannypack"
icon_state = "fannypack_red"
item_state = "fannypack_red"
/obj/item/weapon/storage/belt/fannypack/purple
name = "purple fannypack"
icon_state = "fannypack_purple"
item_state = "fannypack_purple"
/obj/item/weapon/storage/belt/fannypack/blue
name = "blue fannypack"
icon_state = "fannypack_blue"
item_state = "fannypack_blue"
/obj/item/weapon/storage/belt/fannypack/orange
name = "orange fannypack"
icon_state = "fannypack_orange"
item_state = "fannypack_orange"
/obj/item/weapon/storage/belt/fannypack/white
name = "white fannypack"
icon_state = "fannypack_white"
item_state = "fannypack_white"
/obj/item/weapon/storage/belt/fannypack/green
name = "green fannypack"
icon_state = "fannypack_green"
item_state = "fannypack_green"
/obj/item/weapon/storage/belt/fannypack/pink
name = "pink fannypack"
icon_state = "fannypack_pink"
item_state = "fannypack_pink"
/obj/item/weapon/storage/belt/fannypack/cyan
name = "cyan fannypack"
icon_state = "fannypack_cyan"
item_state = "fannypack_cyan"
/obj/item/weapon/storage/belt/fannypack/yellow
name = "yellow fannypack"
icon_state = "fannypack_yellow"
item_state = "fannypack_yellow"
/obj/item/weapon/storage/belt/sabre
name = "sabre sheath"
desc = "An ornate sheath designed to hold an officer's blade."
icon_state = "sheath"
item_state = "sheath"
storage_slots = 1
rustle_jimmies = FALSE
w_class = WEIGHT_CLASS_BULKY
max_w_class = WEIGHT_CLASS_BULKY
can_hold = list(
/obj/item/weapon/melee/sabre
)
/obj/item/weapon/storage/belt/sabre/examine(mob/user)
..()
if(contents.len)
to_chat(user, "<span class='notice'>Alt-click it to quickly draw the blade.</span>")
/obj/item/weapon/storage/belt/sabre/AltClick(mob/user)
if(!ishuman(user) || !user.canUseTopic(src, be_close=TRUE))
return
if(contents.len)
var/obj/item/I = contents[1]
user.visible_message("[user] takes [I] out of [src].", "<span class='notice'>You take [I] out of [src].</span>",\
)
user.put_in_hands(I)
update_icon()
else
to_chat(user, "[src] is empty.")
/obj/item/weapon/storage/belt/sabre/update_icon()
icon_state = "sheath"
item_state = "sheath"
if(contents.len)
icon_state += "-sabre"
item_state += "-sabre"
if(loc && isliving(loc))
var/mob/living/L = loc
L.regenerate_icons()
..()
/obj/item/weapon/storage/belt/sabre/PopulateContents()
new /obj/item/weapon/melee/sabre(src)
update_icon()
+2 -1
View File
@@ -13,6 +13,7 @@
var/integrity_failure = 0 //0 if we have no special broken behavior
var/resistance_flags = 0 // INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ON_FIRE | UNACIDABLE | ACID_PROOF
var/can_be_hit = TRUE //can this be bludgeoned by items?
var/acid_level = 0 //how much acid is on that obj
@@ -51,7 +52,7 @@
T.add_blueprints_preround(src)
/obj/Destroy(force=FALSE)
if(!istype(src, /obj/machinery))
if(!ismachinery(src))
STOP_PROCESSING(SSobj, src) // TODO: Have a processing bitflag to reduce on unnecessary loops through the processing lists
SStgui.close_uis(src)
. = ..()
-4
View File
@@ -38,10 +38,6 @@
if(istype(T, /turf/closed/mineral/random))
Spread(T)
/turf/closed/mineral/shuttleRotate(rotation)
setDir(angle2dir(rotation+dir2angle(dir)))
queue_smooth(src)
/turf/closed/mineral/get_smooth_underlay_icon(mutable_appearance/underlay_appearance, turf/asking_turf, adjacency_dir)
if(turf_type)
underlay_appearance.icon = initial(turf_type.icon)
+3 -7
View File
@@ -381,13 +381,10 @@ Traitors and the like can also be revived with the previous role mostly intact.
switch(new_character.mind.special_role)
if("Wizard")
new_character.loc = pick(GLOB.wizardstart)
//SSticker.mode.learn_basic_spells(new_character)
new_character.forceMove(pick(GLOB.wizardstart))
SSticker.mode.equip_wizard(new_character)
if("Syndicate")
var/obj/effect/landmark/synd_spawn = locate("landmark*Syndicate-Spawn")
if(synd_spawn)
new_character.loc = get_turf(synd_spawn)
new_character.forceMove(pick(GLOB.nukeop_start))
call(/datum/game_mode/proc/equip_syndicate)(new_character)
if("Space Ninja")
var/list/ninja_spawn = list()
@@ -396,8 +393,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
var/datum/antagonist/ninja/ninjadatum = new_character.mind.has_antag_datum(ANTAG_DATUM_NINJA)
ninjadatum.equip_space_ninja()
if(ninja_spawn.len)
var/obj/effect/landmark/ninja_spawn_here = pick(ninja_spawn)
new_character.loc = ninja_spawn_here.loc
new_character.forceMove(pick(ninja_spawn))
else//They may also be a cyborg or AI.
switch(new_character.mind.assigned_role)
@@ -119,9 +119,6 @@ GLOBAL_LIST_INIT(gaslist_cache, init_gaslist_cache())
/datum/gas_mixture/proc/return_volume() //liters
return max(0, volume)
/datum/gas_mixture/proc/thermal_energy() //joules
return temperature * heat_capacity()
/datum/gas_mixture/proc/archive()
//Update archived versions of variables
//Returns: 1 in all cases
@@ -424,7 +421,7 @@ GLOBAL_LIST_INIT(gaslist_cache, init_gaslist_cache())
var/list/cached_gases = gases
var/temp = temperature
var/ener = thermal_energy()
var/ener = THERMAL_ENERGY(src)
reaction_loop:
for(var/r in SSair.gas_reactions)
@@ -199,13 +199,13 @@
var/old_heat_capacity = air.heat_capacity()
var/carbon_efficency = min(cached_gases["plasma"][MOLES]/cached_gases["co2"][MOLES],MAX_CARBON_EFFICENCY)
var/reaction_energy = air.thermal_energy()
var/reaction_energy = THERMAL_ENERGY(air)
var/moles_impurities = air.total_moles()-(cached_gases["plasma"][MOLES]+cached_gases["co2"][MOLES])
var/plasma_fused = (PLASMA_FUSED_COEFFICENT*carbon_efficency)*(temperature/PLASMA_BINDING_ENERGY)
var/carbon_catalyzed = (CARBON_CATALYST_COEFFICENT*carbon_efficency)*(temperature/PLASMA_BINDING_ENERGY)
var/oxygen_added = carbon_catalyzed
var/nitrogen_added = (plasma_fused-oxygen_added)-(air.thermal_energy()/PLASMA_BINDING_ENERGY)
var/nitrogen_added = (plasma_fused-oxygen_added)-(THERMAL_ENERGY(air)/PLASMA_BINDING_ENERGY)
reaction_energy = max(reaction_energy+((carbon_efficency*cached_gases["plasma"][MOLES])/((moles_impurities/carbon_efficency)+2)*10)+((plasma_fused/(moles_impurities/carbon_efficency))*PLASMA_BINDING_ENERGY),0)
@@ -232,7 +232,7 @@
total_gas_mixture.merge(G)
total_thermal_energy += G.thermal_energy()
total_thermal_energy += THERMAL_ENERGY(G)
total_heat_capacity += G.heat_capacity()
total_gas_mixture.temperature = total_heat_capacity ? total_thermal_energy/total_heat_capacity : 0
-4
View File
@@ -60,10 +60,6 @@ GLOBAL_DATUM(the_gateway, /obj/machinery/gateway/centerstation)
return
icon_state = "off"
//prevents shuttles attempting to rotate this since it messes up sprites
/obj/machinery/gateway/shuttleRotate()
return
/obj/machinery/gateway/attack_hand(mob/user)
if(!detect())
return
+7 -1
View File
@@ -44,7 +44,8 @@ GLOBAL_LIST_EMPTY(preferences_datums)
var/inquisitive_ghost = 1
var/allow_midround_antag = 1
var/preferred_map = null
var/pda_style = MONO
var/uses_glasses_colour = 0
var/screenshake = 100
@@ -446,6 +447,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += "<b>Keybindings:</b> <a href='?_src_=prefs;preference=hotkeys'>[(hotkeys) ? "Hotkeys" : "Default"]</a><br>"
dat += "<b>Action Buttons:</b> <a href='?_src_=prefs;preference=action_buttons'>[(buttons_locked) ? "Locked In Place" : "Unlocked"]</a><br>"
dat += "<b>tgui Style:</b> <a href='?_src_=prefs;preference=tgui_fancy'>[(tgui_fancy) ? "Fancy" : "No Frills"]</a><br>"
dat += "<b>PDA Style:</b> <a href='?_src_=prefs;task=input;preference=PDA'>[pda_style]</a><br>"
dat += "<b>tgui Monitors:</b> <a href='?_src_=prefs;preference=tgui_lock'>[(tgui_lock) ? "Primary" : "All"]</a><br>"
dat += "<b>Window Flashing:</b> <a href='?_src_=prefs;preference=winflash'>[(windowflashing) ? "Yes" : "No"]</a><br>"
dat += "<b>Play admin midis:</b> <a href='?_src_=prefs;preference=hear_midis'>[(toggles & SOUND_MIDI) ? "Yes" : "No"]</a><br>"
@@ -1449,6 +1451,10 @@ GLOBAL_LIST_EMPTY(preferences_datums)
var/pickedui = input(user, "Choose your UI style.", "Character Preference") as null|anything in list("Midnight", "Plasmafire", "Retro", "Slimecore", "Operative", "Clockwork")
if(pickedui)
UI_style = pickedui
if("PDA")
var/pickedPDA = input(user, "Choose your PDA style.", "Character Preference") as null|anything in list(MONO, SHARE, ORBITRON, VT)
if(pickedPDA)
pda_style = pickedPDA
//citadel code
if("cock_color")
+5 -1
View File
@@ -139,6 +139,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
features["vag_color"] = sanitize_hexcolor(features["vag_color"], 3, 0)
//womb features
features["has_womb"] = sanitize_integer(features["has_womb"], 0, 1, 0)
if(current_version < 19)
pda_style = "mono"
/datum/preferences/proc/load_path(ckey,filename="preferences.sav")
if(!ckey)
@@ -193,6 +195,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
S["arousable"] >> arousable
S["screenshake"] >> screenshake
S["damagescreenshake"] >> damagescreenshake
S["pda_style"] >> pda_style
//try to fix any outdated data if necessary
if(needs_update >= 0)
@@ -219,7 +222,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
be_special = SANITIZE_LIST(be_special)
screenshake = sanitize_integer(screenshake, 0, 200, initial(screenshake))
damagescreenshake = sanitize_integer(damagescreenshake, 0, 2, initial(damagescreenshake))
pda_style = sanitize_inlist(MONO, VT, SHARE, ORBITRON)
return 1
@@ -263,6 +266,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
WRITE_FILE(S["screenshake"], screenshake)
WRITE_FILE(S["damagescreenshake"], damagescreenshake)
WRITE_FILE(S["arousable"], arousable)
WRITE_FILE(S["pda_style"], pda_style)
return 1
+17 -5
View File
@@ -17,13 +17,25 @@
dog_fashion = /datum/dog_fashion/head/helmet
/obj/item/clothing/head/helmet/Initialize()
. = ..()
/obj/item/clothing/head/helmet/sec
can_flashlight = 1
/obj/item/clothing/head/helmet/sec/attackby(obj/item/I, mob/user, params)
if(issignaler(I))
var/obj/item/device/assembly/signaler/S = I
if(F) //Has a flashlight. Player must remove it, else it will be lost forever.
to_chat(user, "<span class='warning'>The mounted flashlight is in the way, remove it first!</span>")
return
if(S.secured)
qdel(S)
var/obj/item/secbot_assembly/A = new /obj/item/secbot_assembly
user.put_in_hands(A)
to_chat(user, "<span class='notice'>You add the signaler to the helmet.</span>")
qdel(src)
return
return ..()
/obj/item/clothing/head/helmet/alt
name = "bulletproof helmet"
desc = "A bulletproof combat helmet that excels in protecting the wearer against traditional projectile weaponry and explosives to a minor extent."
@@ -281,7 +293,7 @@
qdel(THL)
return
..()
return ..()
/obj/item/clothing/head/helmet/proc/toggle_helmlight()
set name = "Toggle Helmetlight"
+221 -179
View File
@@ -1,179 +1,221 @@
/*
* Contents:
* Welding mask
* Cakehat
* Ushanka
* Pumpkin head
* Kitty ears
* Cardborg disguise
*/
/*
* Welding mask
*/
/obj/item/clothing/head/welding
name = "welding helmet"
desc = "A head-mounted face cover designed to protect the wearer completely from space-arc eye."
icon_state = "welding"
flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH
item_state = "welding"
materials = list(MAT_METAL=1750, MAT_GLASS=400)
// var/up = 0
flash_protect = 2
tint = 2
armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 60)
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE
actions_types = list(/datum/action/item_action/toggle)
visor_flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE
visor_flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH
resistance_flags = FIRE_PROOF
/obj/item/clothing/head/welding/attack_self(mob/user)
weldingvisortoggle(user)
/*
* Cakehat
*/
/obj/item/clothing/head/hardhat/cakehat
name = "cakehat"
desc = "You put the cake on your head. Brilliant."
icon_state = "hardhat0_cakehat"
item_state = "hardhat0_cakehat"
item_color = "cakehat"
hitsound = 'sound/weapons/tap.ogg'
flags_inv = HIDEEARS|HIDEHAIR
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 0)
brightness_on = 2 //luminosity when on
flags_cover = HEADCOVERSEYES
heat = 100
/obj/item/clothing/head/hardhat/cakehat/process()
var/turf/location = src.loc
if(ishuman(location))
var/mob/living/carbon/human/M = location
if(M.is_holding(src) || M.head == src)
location = M.loc
if(isturf(location))
location.hotspot_expose(700, 1)
/obj/item/clothing/head/hardhat/cakehat/turn_on()
..()
force = 2
throwforce = 2
damtype = BURN
hitsound = 'sound/items/welder.ogg'
START_PROCESSING(SSobj, src)
/obj/item/clothing/head/hardhat/cakehat/turn_off()
..()
force = 0
throwforce = 0
damtype = BRUTE
hitsound = 'sound/weapons/tap.ogg'
STOP_PROCESSING(SSobj, src)
/obj/item/clothing/head/hardhat/cakehat/is_hot()
return on * heat
/*
* Ushanka
*/
/obj/item/clothing/head/ushanka
name = "ushanka"
desc = "Perfect for winter in Siberia, da?"
icon_state = "ushankadown"
item_state = "ushankadown"
flags_inv = HIDEEARS|HIDEHAIR
var/earflaps = 1
cold_protection = HEAD
min_cold_protection_temperature = FIRE_HELM_MIN_TEMP_PROTECT
dog_fashion = /datum/dog_fashion/head/ushanka
/obj/item/clothing/head/ushanka/attack_self(mob/user)
if(earflaps)
src.icon_state = "ushankaup"
src.item_state = "ushankaup"
earflaps = 0
to_chat(user, "<span class='notice'>You raise the ear flaps on the ushanka.</span>")
else
src.icon_state = "ushankadown"
src.item_state = "ushankadown"
earflaps = 1
to_chat(user, "<span class='notice'>You lower the ear flaps on the ushanka.</span>")
/*
* Pumpkin head
*/
/obj/item/clothing/head/hardhat/pumpkinhead
name = "carved pumpkin"
desc = "A jack o' lantern! Believed to ward off evil spirits."
icon_state = "hardhat0_pumpkin"
item_state = "hardhat0_pumpkin"
item_color = "pumpkin"
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 0)
brightness_on = 2 //luminosity when on
flags_cover = HEADCOVERSEYES
/*
* Kitty ears
*/
/obj/item/clothing/head/kitty
name = "kitty ears"
desc = "A pair of kitty ears. Meow!"
icon_state = "kitty"
color = "#999999"
dynamic_hair_suffix = ""
dog_fashion = /datum/dog_fashion/head/kitty
/obj/item/clothing/head/kitty/equipped(mob/living/carbon/human/user, slot)
if(ishuman(user) && slot == slot_head)
update_icon(user)
user.update_inv_head() //Color might have been changed by update_icon.
..()
/obj/item/clothing/head/kitty/update_icon(mob/living/carbon/human/user)
if(ishuman(user))
add_atom_colour("#[user.hair_color]", FIXED_COLOUR_PRIORITY)
/obj/item/clothing/head/kitty/genuine
desc = "A pair of kitty ears. A tag on the inside says \"Hand made from real cats.\""
/obj/item/clothing/head/hardhat/reindeer
name = "novelty reindeer hat"
desc = "Some fake antlers and a very fake red nose."
icon_state = "hardhat0_reindeer"
item_state = "hardhat0_reindeer"
item_color = "reindeer"
flags_inv = 0
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 0)
brightness_on = 1 //luminosity when on
dynamic_hair_suffix = ""
dog_fashion = /datum/dog_fashion/head/reindeer
/obj/item/clothing/head/cardborg
name = "cardborg helmet"
desc = "A helmet made out of a box."
icon_state = "cardborg_h"
item_state = "cardborg_h"
flags_cover = HEADCOVERSEYES
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR
dog_fashion = /datum/dog_fashion/head/cardborg
/obj/item/clothing/head/cardborg/equipped(mob/living/user, slot)
..()
if(ishuman(user) && slot == slot_head)
var/mob/living/carbon/human/H = user
if(istype(H.wear_suit, /obj/item/clothing/suit/cardborg))
var/obj/item/clothing/suit/cardborg/CB = H.wear_suit
CB.disguise(user, src)
/obj/item/clothing/head/cardborg/dropped(mob/living/user)
..()
user.remove_alt_appearance("standard_borg_disguise")
/*
* Contents:
* Welding mask
* Cakehat
* Ushanka
* Pumpkin head
* Kitty ears
* Cardborg disguise
*/
/*
* Welding mask
*/
/obj/item/clothing/head/welding
name = "welding helmet"
desc = "A head-mounted face cover designed to protect the wearer completely from space-arc eye."
icon_state = "welding"
flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH
item_state = "welding"
materials = list(MAT_METAL=1750, MAT_GLASS=400)
// var/up = 0
flash_protect = 2
tint = 2
armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 60)
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE
actions_types = list(/datum/action/item_action/toggle)
visor_flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE
visor_flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH
resistance_flags = FIRE_PROOF
/obj/item/clothing/head/welding/attack_self(mob/user)
weldingvisortoggle(user)
/*
* Cakehat
*/
/obj/item/clothing/head/hardhat/cakehat
name = "cakehat"
desc = "You put the cake on your head. Brilliant."
icon_state = "hardhat0_cakehat"
item_state = "hardhat0_cakehat"
item_color = "cakehat"
hitsound = 'sound/weapons/tap.ogg'
flags_inv = HIDEEARS|HIDEHAIR
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 0)
brightness_on = 2 //luminosity when on
flags_cover = HEADCOVERSEYES
heat = 1000
/obj/item/clothing/head/hardhat/cakehat/process()
var/turf/location = src.loc
if(ishuman(location))
var/mob/living/carbon/human/M = location
if(M.is_holding(src) || M.head == src)
location = M.loc
if(isturf(location))
location.hotspot_expose(700, 1)
/obj/item/clothing/head/hardhat/cakehat/turn_on()
..()
force = 15
throwforce = 15
damtype = BURN
hitsound = 'sound/items/welder.ogg'
START_PROCESSING(SSobj, src)
/obj/item/clothing/head/hardhat/cakehat/turn_off()
..()
force = 0
throwforce = 0
damtype = BRUTE
hitsound = 'sound/weapons/tap.ogg'
STOP_PROCESSING(SSobj, src)
/obj/item/clothing/head/hardhat/cakehat/is_hot()
return on * heat
/*
* Ushanka
*/
/obj/item/clothing/head/ushanka
name = "ushanka"
desc = "Perfect for winter in Siberia, da?"
icon_state = "ushankadown"
item_state = "ushankadown"
flags_inv = HIDEEARS|HIDEHAIR
var/earflaps = 1
cold_protection = HEAD
min_cold_protection_temperature = FIRE_HELM_MIN_TEMP_PROTECT
dog_fashion = /datum/dog_fashion/head/ushanka
/obj/item/clothing/head/ushanka/attack_self(mob/user)
if(earflaps)
src.icon_state = "ushankaup"
src.item_state = "ushankaup"
earflaps = 0
to_chat(user, "<span class='notice'>You raise the ear flaps on the ushanka.</span>")
else
src.icon_state = "ushankadown"
src.item_state = "ushankadown"
earflaps = 1
to_chat(user, "<span class='notice'>You lower the ear flaps on the ushanka.</span>")
/*
* Pumpkin head
*/
/obj/item/clothing/head/hardhat/pumpkinhead
name = "carved pumpkin"
desc = "A jack o' lantern! Believed to ward off evil spirits."
icon_state = "hardhat0_pumpkin"
item_state = "hardhat0_pumpkin"
item_color = "pumpkin"
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 0)
brightness_on = 2 //luminosity when on
flags_cover = HEADCOVERSEYES
/*
* Kitty ears
*/
/obj/item/clothing/head/kitty
name = "kitty ears"
desc = "A pair of kitty ears. Meow!"
icon_state = "kitty"
color = "#999999"
dynamic_hair_suffix = ""
dog_fashion = /datum/dog_fashion/head/kitty
/obj/item/clothing/head/kitty/equipped(mob/living/carbon/human/user, slot)
if(ishuman(user) && slot == slot_head)
update_icon(user)
user.update_inv_head() //Color might have been changed by update_icon.
..()
/obj/item/clothing/head/kitty/update_icon(mob/living/carbon/human/user)
if(ishuman(user))
add_atom_colour("#[user.hair_color]", FIXED_COLOUR_PRIORITY)
/obj/item/clothing/head/kitty/genuine
desc = "A pair of kitty ears. A tag on the inside says \"Hand made from real cats.\""
/obj/item/clothing/head/hardhat/reindeer
name = "novelty reindeer hat"
desc = "Some fake antlers and a very fake red nose."
icon_state = "hardhat0_reindeer"
item_state = "hardhat0_reindeer"
item_color = "reindeer"
flags_inv = 0
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 0)
brightness_on = 1 //luminosity when on
dynamic_hair_suffix = ""
dog_fashion = /datum/dog_fashion/head/reindeer
/obj/item/clothing/head/cardborg
name = "cardborg helmet"
desc = "A helmet made out of a box."
icon_state = "cardborg_h"
item_state = "cardborg_h"
flags_cover = HEADCOVERSEYES
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR
dog_fashion = /datum/dog_fashion/head/cardborg
/obj/item/clothing/head/cardborg/equipped(mob/living/user, slot)
..()
if(ishuman(user) && slot == slot_head)
var/mob/living/carbon/human/H = user
if(istype(H.wear_suit, /obj/item/clothing/suit/cardborg))
var/obj/item/clothing/suit/cardborg/CB = H.wear_suit
CB.disguise(user, src)
/obj/item/clothing/head/cardborg/dropped(mob/living/user)
..()
user.remove_alt_appearance("standard_borg_disguise")
/obj/item/clothing/head/wig
name = "wig"
desc = "A bunch of hair without a head attached."
icon_state = ""
item_state = "pwig"
flags_inv = HIDEHAIR
var/hair_style = "Very Long Hair"
var/hair_color = "#000"
/obj/item/clothing/head/wig/Initialize(mapload)
. = ..()
update_icon()
/obj/item/clothing/head/wig/update_icon()
cut_overlays()
var/datum/sprite_accessory/S = GLOB.hair_styles_list[hair_style]
if(!S)
icon_state = "pwig"
else
var/mutable_appearance/M = mutable_appearance(S.icon,S.icon_state)
M.appearance_flags |= RESET_COLOR
M.color = hair_color
add_overlay(M)
/obj/item/clothing/head/wig/worn_overlays(isinhands = FALSE, file2use)
. = list()
if(!isinhands)
var/datum/sprite_accessory/S = GLOB.hair_styles_list[hair_style]
if(!S)
return
var/mutable_appearance/M = mutable_appearance(S.icon, S.icon_state,layer = -HAIR_LAYER)
M.appearance_flags |= RESET_COLOR
M.color = hair_color
. += M
/obj/item/clothing/head/wig/random/Initialize(mapload)
hair_style = pick(GLOB.hair_styles_list - "Bald") //Don't want invisible wig
hair_color = "#[random_short_color()]"
. = ..()
@@ -4,7 +4,7 @@
icon_state = "chronohelmet"
item_state = "chronohelmet"
slowdown = 1
armor = list(melee = 60, bullet = 30/*bullet through the visor*/, laser = 60, energy = 60, bomb = 30, bio = 90, rad = 90, fire = 100, acid = 100)
armor = list(melee = 60, bullet = 60, laser = 60, energy = 60, bomb = 30, bio = 90, rad = 90, fire = 100, acid = 100)
resistance_flags = FIRE_PROOF | ACID_PROOF
var/obj/item/clothing/suit/space/chronos/suit = null
@@ -173,7 +173,7 @@ Contains:
item_state = "ert_command"
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/ert
allowed = list(/obj/item/gun, /obj/item/ammo_box, /obj/item/ammo_casing, /obj/item/melee/baton, /obj/item/restraints/handcuffs, /obj/item/tank/internals)
armor = list(melee = 30, bullet = 50, laser = 30, energy = 50, bomb = 50, bio = 100, rad = 100, fire = 0, acid = 95)
armor = list(melee = 65, bullet = 50, laser = 50, energy = 50, bomb = 50, bio = 100, rad = 100, fire = 80, acid = 80)
slowdown = 0
strip_delay = 130
@@ -25,8 +25,8 @@
tastes = list("fish" = 1)
foodtype = MEAT
/obj/item/reagent_containers/food/snacks/carpmeat/New()
..()
/obj/item/reagent_containers/food/snacks/carpmeat/Initialize()
. = ..()
eatverb = pick("bite","chew","choke down","gnaw","swallow","chomp")
/obj/item/reagent_containers/food/snacks/carpmeat/imitation
@@ -114,8 +114,8 @@
tastes = list("meat" = 1)
foodtype = MEAT
/obj/item/reagent_containers/food/snacks/sausage/New()
..()
/obj/item/reagent_containers/food/snacks/sausage/Initialize()
. = ..()
eatverb = pick("bite","chew","nibble","deep throat","gobble","chomp")
/obj/item/reagent_containers/food/snacks/kebab
@@ -185,8 +185,8 @@
/obj/item/reagent_containers/food/snacks/monkeycube/proc/Expand()
visible_message("<span class='notice'>[src] expands!</span>")
var/mob/spammer = get_mob_by_key(src.fingerprintslast)
var/mob/living/carbon/monkey/bananas = new(get_turf(src))
var/mob/spammer = get_mob_by_key(fingerprintslast)
var/mob/living/carbon/monkey/bananas = new(drop_location())
bananas.log_message("Spawned via [src] at [COORD(src)], Last attached mob: [key_name(spammer)].", INDIVIDUAL_ATTACK_LOG)
qdel(src)
@@ -212,8 +212,8 @@
tastes = list("soy" = 1, "vegetables" = 1)
foodtype = VEGETABLES
/obj/item/reagent_containers/food/snacks/stewedsoymeat/New()
..()
/obj/item/reagent_containers/food/snacks/stewedsoymeat/Initialize()
. = ..()
eatverb = pick("slurp","sip","suck","inhale","drink")
/obj/item/reagent_containers/food/snacks/boiledspiderleg
@@ -257,8 +257,8 @@
tastes = list("\"chicken\"" = 1)
foodtype = MEAT
/obj/item/reagent_containers/food/snacks/nugget/New()
..()
/obj/item/reagent_containers/food/snacks/nugget/Initialize()
. = ..()
var/shape = pick("lump", "star", "lizard", "corgi")
desc = "A 'chicken' nugget vaguely shaped like a [shape]."
icon_state = "nugget_[shape]"
@@ -83,7 +83,7 @@ a.popt {text-decoration: none;}
#ping {
position: fixed;
top: 0;
right: 40px;
right: 80px;
width: 45px;
background: #ddd;
height: 30px;
@@ -96,12 +96,12 @@ a.popt {text-decoration: none;}
font-size: 8pt;
padding-top: 2px;
}
#options {
#userBar {
position: fixed;
top: 0;
right: 0;
}
#options .optionsCell {
#userBar .subCell {
background: #ddd;
height: 30px;
padding: 5px 0;
@@ -111,23 +111,23 @@ a.popt {text-decoration: none;}
line-height: 28px;
border-top: 1px solid #b4b4b4;
}
#options .optionsCell:hover {background: #ccc;}
#options .toggle {
#userBar .subCell:hover {background: #ccc;}
#userBar .toggle {
width: 40px;
background: #ccc;
border-top: 0;
float: right;
text-align: center;
}
#options .sub {clear: both; display: none; width: 160px;}
#options .sub.scroll {overflow-y: scroll;}
#options .sub.optionsCell {padding: 3px 0 3px 8px; line-height: 30px; font-size: 0.9em; clear: both;}
#options .sub span {
#userBar .sub {clear: both; display: none; width: 160px;}
#userBar .sub.scroll {overflow-y: scroll;}
#userBar .sub.subCell {padding: 3px 0 3px 8px; line-height: 30px; font-size: 0.9em; clear: both;}
#userBar .sub span {
display: block;
line-height: 30px;
float: left;
}
#options .sub i {
#userBar .sub i {
display: block;
padding: 0 5px;
font-size: 1.1em;
@@ -136,14 +136,14 @@ a.popt {text-decoration: none;}
line-height: 30px;
float: right;
}
#options .sub input {
#userBar .sub input {
position: absolute;
padding: 7px 5px;
width: 121px;
line-height: 30px;
float: left;
}
#options .decreaseFont {border-top: 0;}
#userBar .topCell {border-top: 0;}
/* POPUPS */
.popup {
@@ -27,17 +27,22 @@
<i class="icon-circle" id="pingDot"></i>
<span class="ms" id="pingMs">--ms</span>
</div>
<div id="audio">
<a href="#" class="subCell toggle" id="toggleAudio" title="Audio"><i class="icon-volume-up"></i></a>
</div>
<div id="options">
<a href="#" class="optionsCell toggle" id="toggleOptions" title="Options"><i class="icon-cog"></i></a>
<div class="sub" id="subOptions">
<a href="#" class="optionsCell decreaseFont" id="decreaseFont"><span>Decrease font size</span> <i class="icon-font">-</i></a>
<a href="#" class="optionsCell increaseFont" id="increaseFont"><span>Increase font size</span> <i class="icon-font">+</i></a>
<a href="#" class="optionsCell togglePing" id="togglePing"><span>Toggle ping display</span> <i class="icon-circle"></i></a>
<a href="#" class="optionsCell highlightTerm" id="highlightTerm"><span>Highlight string</span> <i class="icon-tag"></i></a>
<a href="#" class="optionsCell saveLog" id="saveLog"><span>Save chat log</span> <i class="icon-save"></i></a>
<a href="#" class="optionsCell clearMessages" id="clearMessages"><span>Clear all messages</span> <i class="icon-eraser"></i></a>
<span class="optionsCell" id="musicVolumeSpan"><input type="range" class="hidden" id="musicVolume"><span id="musicVolumeText">Admin music volume</span><i class="icon-music"></i></span>
</div>
<a href="#" class="subCell toggle" id="toggleOptions" title="Options"><i class="icon-cog"></i></a>
</div>
<div class="sub" id="subOptions">
<a href="#" class="subCell decreaseFont topCell" id="decreaseFont"><span>Decrease font size</span> <i class="icon-font">-</i></a>
<a href="#" class="subCell increaseFont" id="increaseFont"><span>Increase font size</span> <i class="icon-font">+</i></a>
<a href="#" class="subCell togglePing" id="togglePing"><span>Toggle ping display</span> <i class="icon-circle"></i></a>
<a href="#" class="subCell highlightTerm" id="highlightTerm"><span>Highlight string</span> <i class="icon-tag"></i></a>
<a href="#" class="subCell saveLog" id="saveLog"><span>Save chat log</span> <i class="icon-save"></i></a>
<a href="#" class="subCell clearMessages" id="clearMessages"><span>Clear all messages</span> <i class="icon-eraser"></i></a>
</div>
<div class="sub" id="subAudio">
<span class="subCell topCell" id="musicVolumeSpan"><input type="range" class="hidden" id="musicVolume"><span id="musicVolumeText">Admin music volume</span><i class="icon-music"></i></span>
</div>
</div>
<audio class="hidden" id="adminMusic" autoplay></audio>
@@ -22,7 +22,7 @@ window.onerror = function(msg, url, line, col, error) {
//Globals
window.status = 'Output';
var $messages, $subOptions, $contextMenu, $filterMessages;
var $messages, $subOptions, $subAudio, $selectedSub, $contextMenu, $filterMessages;
var opts = {
//General
'messageCount': 0, //A count...of messages...
@@ -37,8 +37,8 @@ var opts = {
'restarting': false, //Is the round restarting?
//Options menu
'subOptionsLoop': null, //Contains the interval loop for closing the options menu
'suppressOptionsClose': false, //Whether or not we should be hiding the suboptions menu
'selectedSubLoop': null, //Contains the interval loop for closing the selected sub menu
'suppressSubClose': false, //Whether or not we should be hiding the selected sub menu
'highlightTerms': [],
'highlightLimit': 5,
'highlightColor': '#FFFF00', //The color of the highlighted message
@@ -483,6 +483,46 @@ function sendVolumeUpdate() {
}
}
function subSlideUp() {
$(this).removeClass('scroll');
$(this).css('height', '');
}
function startSubLoop() {
if (opts.selectedSubLoop) {
clearInterval(opts.selectedSubLoop);
}
return setInterval(function() {
if (!opts.suppressSubClose && $selectedSub.is(':visible')) {
$selectedSub.slideUp('fast', subSlideUp);
clearInterval(opts.selectedSubLoop);
}
}, 5000); //every 5 seconds
}
function handleToggleClick($sub, $toggle) {
if ($selectedSub !== $sub && $selectedSub.is(':visible')) {
$selectedSub.slideUp('fast', subSlideUp);
}
$selectedSub = $sub
if ($selectedSub.is(':visible')) {
$selectedSub.slideUp('fast', subSlideUp);
clearInterval(opts.selectedSubLoop);
} else {
$selectedSub.slideDown('fast', function() {
var windowHeight = $(window).height();
var toggleHeight = $toggle.outerHeight();
var priorSubHeight = $selectedSub.outerHeight();
var newSubHeight = windowHeight - toggleHeight;
$(this).height(newSubHeight);
if (priorSubHeight > (windowHeight - toggleHeight)) {
$(this).addClass('scroll');
}
});
opts.selectedSubLoop = startSubLoop();
}
}
/*****************************************
*
* DOM READY
@@ -497,6 +537,8 @@ if (typeof $ === 'undefined') {
$(function() {
$messages = $('#messages');
$subOptions = $('#subOptions');
$subAudio = $('#subAudio');
$selectedSub = $subOptions;
//Hey look it's a controller loop!
setInterval(function() {
@@ -607,12 +649,9 @@ $(function() {
});
$messages.on('mousedown', function(e) {
if ($subOptions && $subOptions.is(':visible')) {
$subOptions.slideUp('fast', function() {
$(this).removeClass('scroll');
$(this).css('height', '');
});
clearInterval(opts.subOptionsLoop);
if ($selectedSub && $selectedSub.is(':visible')) {
$selectedSub.slideUp('fast', subSlideUp);
clearInterval(opts.selectedSubLoop);
}
});
@@ -731,41 +770,19 @@ $(function() {
});
$('#toggleOptions').click(function(e) {
if ($subOptions.is(':visible')) {
$subOptions.slideUp('fast', function() {
$(this).removeClass('scroll');
$(this).css('height', '');
});
clearInterval(opts.subOptionsLoop);
} else {
$subOptions.slideDown('fast', function() {
var windowHeight = $(window).height();
var toggleHeight = $('#toggleOptions').outerHeight();
var priorSubHeight = $subOptions.outerHeight();
var newSubHeight = windowHeight - toggleHeight;
$(this).height(newSubHeight);
if (priorSubHeight > (windowHeight - toggleHeight)) {
$(this).addClass('scroll');
}
});
opts.subOptionsLoop = setInterval(function() {
if (!opts.suppressOptionsClose && $('#subOptions').is(':visible')) {
$subOptions.slideUp('fast', function() {
$(this).removeClass('scroll');
$(this).css('height', '');
});
clearInterval(opts.subOptionsLoop);
}
}, 5000); //Every 5 seconds
}
handleToggleClick($subOptions, $(this));
});
$('#subOptions, #toggleOptions').mouseenter(function() {
opts.suppressOptionsClose = true;
$('#toggleAudio').click(function(e) {
handleToggleClick($subAudio, $(this));
});
$('#subOptions, #toggleOptions').mouseleave(function() {
opts.suppressOptionsClose = false;
$('.sub, .toggle').mouseenter(function() {
opts.suppressSubClose = true;
});
$('.sub, .toggle').mouseleave(function() {
opts.suppressSubClose = false;
});
$('#decreaseFont').click(function(e) {
+1 -1
View File
@@ -31,7 +31,7 @@ GLOBAL_LIST_INIT(duplicate_forbidden_vars,list("tag","area","type","loc","locs",
I.damtype = STAMINA // thou shalt not
N.update_icon()
if(istype(O, /obj/machinery))
if(ismachinery(O))
var/obj/machinery/M = O
M.power_change()
@@ -46,3 +46,64 @@
/obj/item/clothing/mask/gas/explorer/folded/New()
..()
adjustmask()
/obj/item/clothing/suit/space/hostile_environment
name = "H.E.C.K. suit"
desc = "Hostile Environiment Cross-Kinetic Suit: A suit designed to withstand the wide variety of hazards from Lavaland. It wasn't enough for its last owner."
icon_state = "hostile_env"
item_state = "hostile_env"
flags_1 = THICKMATERIAL_1 //not spaceproof
max_heat_protection_temperature = FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT
resistance_flags = FIRE_PROOF | LAVA_PROOF
slowdown = 0
armor = list("melee" = 70, "bullet" = 40, "laser" = 10, "energy" = 10, "bomb" = 50, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100)
allowed = list(/obj/item/device/flashlight, /obj/item/tank/internals, /obj/item/resonator, /obj/item/device/mining_scanner, /obj/item/device/t_scanner/adv_mining_scanner, /obj/item/gun/energy/kinetic_accelerator, /obj/item/pickaxe)
/obj/item/clothing/suit/space/hostile_environment/Initialize()
. = ..()
AddComponent(/datum/component/spraycan_paintable)
START_PROCESSING(SSobj, src)
/obj/item/clothing/suit/space/hostile_environment/Destroy()
STOP_PROCESSING(SSobj, src)
return ..()
/obj/item/clothing/suit/space/hostile_environment/process()
var/mob/living/carbon/C = loc
if(istype(C) && prob(2)) //cursed by bubblegum
if(prob(15))
new /datum/hallucination/oh_yeah(C)
to_chat(C, "<span class='colossus'><b>[pick("I AM IMMORTAL.","I SHALL TAKE BACK WHAT'S MINE.","I SEE YOU.","YOU CANNOT ESCAPE ME FOREVER.","DEATH CANNOT HOLD ME.")]</b></span>")
else
to_chat(C, "<span class='warning'>[pick("You hear faint whispers.","You smell ash.","You feel hot.","You hear a roar in the distance.")]</span>")
/obj/item/clothing/head/helmet/space/hostile_environment
name = "H.E.C.K. helmet"
desc = "Hostile Environiment Cross-Kinetic Helmet: A helmet designed to withstand the wide variety of hazards from Lavaland. It wasn't enough for its last owner."
icon_state = "hostile_env"
item_state = "hostile_env"
w_class = WEIGHT_CLASS_NORMAL
max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT
flags_1 = THICKMATERIAL_1 // no space protection
armor = list("melee" = 70, "bullet" = 40, "laser" = 10, "energy" = 10, "bomb" = 50, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100)
resistance_flags = FIRE_PROOF | LAVA_PROOF
/obj/item/clothing/head/helmet/space/hostile_environment/Initialize()
. = ..()
AddComponent(/datum/component/spraycan_paintable)
update_icon()
/obj/item/clothing/head/helmet/space/hostile_environment/update_icon()
..()
cut_overlays()
var/mutable_appearance/glass_overlay = mutable_appearance(icon, "hostile_env_glass")
glass_overlay.appearance_flags = RESET_COLOR
add_overlay(glass_overlay)
/obj/item/clothing/head/helmet/space/hostile_environment/worn_overlays(isinhands)
. = ..()
if(!isinhands)
var/mutable_appearance/M = mutable_appearance('icons/mob/head.dmi', "hostile_env_glass")
M.appearance_flags = RESET_COLOR
. += M
@@ -104,10 +104,6 @@
direction = expected_dir
..()
/obj/machinery/door/airlock/survival_pod/shuttleRotate(rotation)
expected_dir = angle2dir(rotation+dir2angle(dir))
..()
/obj/machinery/door/airlock/survival_pod/vertical
dir = EAST
expected_dir = EAST
@@ -127,10 +123,6 @@
direction = expected_dir
..()
/obj/structure/door_assembly/door_assembly_pod/shuttleRotate(rotation)
expected_dir = angle2dir(rotation+dir2angle(dir))
..()
/obj/structure/door_assembly/door_assembly_pod/vertical
dir = EAST
expected_dir = EAST
@@ -307,7 +299,7 @@
/obj/item/melee/supermatter_sword,
/obj/item/shield/changeling,
/obj/item/lava_staff,
/obj/item/dash/energy_katana,
/obj/item/energy_katana,
/obj/item/hierophant_club,
/obj/item/his_grace,
/obj/item/gun/ballistic/minigun,
@@ -17,7 +17,7 @@
/obj/item/device/wormhole_jaunter/attack_self(mob/user)
user.visible_message("<span class='notice'>[user.name] activates the [src.name]!</span>")
SSblackbox.add_details("jaunter", "User") // user activated
activate(user)
activate(user, TRUE)
/obj/item/device/wormhole_jaunter/proc/turf_check(mob/user)
var/turf/device_turf = get_turf(user)
@@ -46,7 +46,7 @@
return destinations
/obj/item/device/wormhole_jaunter/proc/activate(mob/user)
/obj/item/device/wormhole_jaunter/proc/activate(mob/user, adjacent)
if(!turf_check(user))
return
@@ -56,7 +56,8 @@
return
var/chosen_beacon = pick(L)
var/obj/effect/portal/wormhole/jaunt_tunnel/J = new (get_turf(src), src, 100, null, FALSE, get_turf(chosen_beacon))
try_move_adjacent(J)
if(adjacent)
try_move_adjacent(J)
playsound(src,'sound/effects/sparks4.ogg',50,1)
qdel(src)
@@ -78,7 +79,7 @@
if(user.get_item_by_slot(slot_belt) == src)
to_chat(user, "Your [src] activates, saving you from the chasm!</span>")
SSblackbox.add_details("jaunter","Chasm") // chasm automatic activation
activate(user)
activate(user, FALSE)
else
to_chat(user, "The [src] is not attached to your belt, preventing it from saving you from the chasm. RIP.</span>")
@@ -932,6 +932,8 @@
name = "bubblegum chest"
/obj/structure/closet/crate/necropolis/bubblegum/PopulateContents()
new /obj/item/clothing/suit/space/hostile_environment(src)
new /obj/item/clothing/head/helmet/space/hostile_environment(src)
var/loot = rand(1,3)
switch(loot)
if(1)
@@ -79,9 +79,12 @@
if(SSticker.current_state == GAME_STATE_PREGAME)
var/time_remaining = SSticker.GetTimeLeft()
if(time_remaining >= 0)
time_remaining /= 10
stat("Time To Start:", (time_remaining >= 0) ? "[round(time_remaining)]s" : "DELAYED")
if(time_remaining > 0)
stat("Time To Start:", "[round(time_remaining/10)]s")
else if(time_remaining == -10)
stat("Time To Start:", "DELAYED")
else
stat("Time To Start:", "SOON")
stat("Players:", "[SSticker.totalPlayers]")
if(client.holder)
@@ -273,7 +276,7 @@
observer.started_as_observer = TRUE
close_spawn_windows()
var/obj/O = locate("landmark*Observer-Start")
var/obj/effect/landmark/observer_start/O = locate(/obj/effect/landmark/observer_start) in GLOB.landmarks_list
to_chat(src, "<span class='notice'>Now teleporting.</span>")
if (O)
observer.loc = O.loc
File diff suppressed because it is too large Load Diff
@@ -357,28 +357,6 @@
var/build_step = 0
var/created_name = "Securitron" //To preserve the name if it's a unique securitron I guess
/obj/item/clothing/head/helmet/attackby(obj/item/device/assembly/signaler/S, mob/user, params)
..()
if(!issignaler(S))
..()
return
if(type != /obj/item/clothing/head/helmet/sec) //Eh, but we don't want people making secbots out of space helmets.
return
if(F) //Has a flashlight. Player must remove it, else it will be lost forever.
to_chat(user, "<span class='warning'>The mounted flashlight is in the way, remove it first!</span>")
return
if(S.secured)
qdel(S)
var/obj/item/secbot_assembly/A = new /obj/item/secbot_assembly
user.put_in_hands(A)
to_chat(user, "<span class='notice'>You add the signaler to the helmet.</span>")
qdel(src)
else
return
/obj/item/secbot_assembly/attackby(obj/item/I, mob/user, params)
..()
if(istype(I, /obj/item/weldingtool))
@@ -275,7 +275,7 @@
if(O.anchored)
continue
if(isitem(O) || isstructure(O) || istype(O, /obj/machinery))
if(isitem(O) || isstructure(O) || ismachinery(O))
cocoon_target = O
busy = MOVING_TO_TARGET
stop_automated_movement = 1
@@ -144,7 +144,7 @@ GLOBAL_LIST_INIT(protected_objects, list(/obj/structure/table, /obj/structure/ca
icon_living = icon_state
copy_overlays(O)
add_overlay(googly_eyes)
if(isstructure(O) || istype(O, /obj/machinery))
if(isstructure(O) || ismachinery(O))
health = (anchored * 50) + 50
destroy_objects = 1
if(O.density && O.anchored)
@@ -101,13 +101,6 @@
init_belly()
verbs |= /mob/living/proc/animal_nom
/mob/living/simple_animal/Login()
if(src && src.client)
src.client.screen = list()
client.screen += client.void
..()
/mob/living/simple_animal/updatehealth()
..()
health = Clamp(health, 0, maxHealth)
-4
View File
@@ -743,10 +743,6 @@
mob_spell_list -= S
qdel(S)
//override to avoid rotating pixel_xy on mobs
/mob/shuttleRotate(rotation)
setDir(angle2dir(rotation+dir2angle(dir)))
//You can buckle on mobs if you're next to them since most are dense
/mob/buckle_mob(mob/living/M, force = FALSE, check_loc = TRUE)
if(M.buckled)
@@ -31,7 +31,7 @@
origin_tech = "programming=2;engineering=2;powerstorage=3"
/obj/item/computer_hardware/recharger/APC/use_power(amount, charging=0)
if(istype(holder.physical, /obj/machinery))
if(ismachinery(holder.physical))
var/obj/machinery/M = holder.physical
if(M.powered())
M.use_power(amount)
@@ -55,13 +55,13 @@
origin_tech = "engineering=2;powerstorage=1"
/obj/item/computer_hardware/recharger/wired/can_install(obj/item/device/modular_computer/M, mob/living/user = null)
if(istype(M.physical, /obj/machinery) && M.physical.anchored)
if(ismachinery(M.physical) && M.physical.anchored)
return ..()
to_chat(user, "<span class='warning'>\The [src] is incompatible with portable computers!</span>")
return 0
/obj/item/computer_hardware/recharger/wired/use_power(amount, charging=0)
if(istype(holder.physical, /obj/machinery) && holder.physical.anchored)
if(ismachinery(holder.physical) && holder.physical.anchored)
var/obj/machinery/M = holder.physical
var/turf/T = M.loc
if(!T || !istype(T))
+33 -68
View File
@@ -1,60 +1,4 @@
/obj/item/dash
name = "abstract dash weapon"
var/max_charges = 3
var/current_charges = 3
var/charge_rate = 30 //In deciseconds
var/dash_toggled = TRUE
var/bypass_density = FALSE //Can we beam past windows/airlocks/etc
var/start_effect_type = /obj/effect/temp_visual/dir_setting/ninja/phase/out
var/end_effect_type = /obj/effect/temp_visual/dir_setting/ninja/phase
var/beam_icon_state = "blur"
var/dash_beam_type = /obj/effect/ebeam
/obj/item/dash/proc/charge()
current_charges = Clamp(current_charges + 1, 0, max_charges)
if(istype(loc, /mob/living))
to_chat(loc, "<span class='notice'>[src] now has [current_charges]/[max_charges] charges.</span>")
/obj/item/dash/attack_self(mob/user)
dash_toggled = !dash_toggled
to_chat(user, "<span class='notice'>You [dash_toggled ? "enable" : "disable"] the dash function on [src].</span>")
/obj/item/dash/afterattack(atom/target, mob/user, proximity_flag, click_parameters)
if(dash_toggled)
dash(user, target)
return
/obj/item/dash/proc/dash(mob/user, atom/target)
if(!current_charges)
return
if(Adjacent(target))
return
if(target.density)
return
var/turf/T = get_turf(target)
if(!bypass_density)
for(var/turf/turf in getline(get_turf(user),T))
for(var/atom/A in turf)
if(A.density)
return
if(target in view(user.client.view, get_turf(user)))
var/obj/spot1 = new start_effect_type(T, user.dir)
user.forceMove(T)
playsound(T, 'sound/magic/blink.ogg', 25, 1)
playsound(T, "sparks", 50, 1)
var/obj/spot2 = new end_effect_type(get_turf(user), user.dir)
spot1.Beam(spot2, beam_icon_state,time = 2, maxdistance = 20, beam_type = dash_beam_type)
current_charges--
addtimer(CALLBACK(src, .proc/charge), charge_rate)
/obj/item/dash/energy_katana
/obj/item/energy_katana
name = "energy katana"
desc = "A katana infused with strong energy."
icon_state = "energy_katana"
@@ -73,23 +17,41 @@
sharpness = IS_SHARP
max_integrity = 200
resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF
bypass_density = TRUE
var/datum/effect_system/spark_spread/spark_system
var/datum/action/innate/dash/ninja/jaunt
var/dash_toggled = TRUE
/obj/item/dash/energy_katana/afterattack(atom/target, mob/user, proximity_flag, click_parameters)
/obj/item/energy_katana/Initialize()
. = ..()
jaunt = new(src)
spark_system = new /datum/effect_system/spark_spread()
spark_system.set_up(5, 0, src)
spark_system.attach(src)
/obj/item/energy_katana/afterattack(atom/target, mob/user, proximity_flag, click_parameters)
if(dash_toggled)
return ..()
jaunt.Teleport(user, target)
if(proximity_flag && (isobj(target) || issilicon(target)))
spark_system.start()
playsound(user, "sparks", 50, 1)
playsound(user, 'sound/weapons/blade1.ogg', 50, 1)
target.emag_act(user)
/obj/item/energy_katana/pickup(mob/living/user)
. = ..()
jaunt.Grant(user, src)
user.update_icons()
playsound(src, 'sound/items/unsheath.ogg', 25, 1)
/obj/item/energy_katana/dropped(mob/user)
. = ..()
jaunt.Remove(user)
user.update_icons()
//If we hit the Ninja who owns this Katana, they catch it.
//Works for if the Ninja throws it or it throws itself or someone tries
//To throw it at the ninja
/obj/item/dash/energy_katana/throw_impact(atom/hit_atom)
/obj/item/energy_katana/throw_impact(atom/hit_atom)
if(ishuman(hit_atom))
var/mob/living/carbon/human/H = hit_atom
if(istype(H.wear_suit, /obj/item/clothing/suit/space/space_ninja))
@@ -100,7 +62,7 @@
..()
/obj/item/dash/energy_katana/proc/returnToOwner(mob/living/carbon/human/user, doSpark = 1, caught = 0)
/obj/item/energy_katana/proc/returnToOwner(mob/living/carbon/human/user, doSpark = 1, caught = 0)
if(!istype(user))
return
forceMove(get_turf(user))
@@ -127,12 +89,15 @@
if(msg)
to_chat(user, "<span class='notice'>[msg]</span>")
/obj/item/dash/energy_katana/Initialize()
. = ..()
spark_system = new /datum/effect_system/spark_spread()
spark_system.set_up(5, 0, src)
spark_system.attach(src)
/obj/item/dash/energy_katana/Destroy()
/obj/item/energy_katana/Destroy()
QDEL_NULL(spark_system)
return ..()
/datum/action/innate/dash/ninja
current_charges = 3
max_charges = 3
charge_rate = 30
recharge_sound = null
+1 -1
View File
@@ -12,7 +12,7 @@
l_pocket = /obj/item/grenade/plastic/x4
r_pocket = /obj/item/tank/internals/emergency_oxygen
internals_slot = slot_r_store
belt = /obj/item/dash/energy_katana
belt = /obj/item/energy_katana
implants = list(/obj/item/implant/explosive)
+1 -1
View File
@@ -30,7 +30,7 @@ Contents:
var/datum/effect_system/spark_spread/spark_system
var/list/stored_research = list()//For stealing station research.
var/obj/item/disk/tech_disk/t_disk//To copy design onto disk.
var/obj/item/dash/energy_katana/energyKatana //For teleporting the katana back to the ninja (It's an ability)
var/obj/item/energy_katana/energyKatana //For teleporting the katana back to the ninja (It's an ability)
//Other articles of ninja gear worn together, used to easily reference them after initializing.
var/obj/item/clothing/head/helmet/space/space_ninja/n_hood
-15
View File
@@ -437,21 +437,6 @@ By design, d1 is the smallest direction and d2 is the highest
if(!P.connect_to_network()) //can't find a node cable on a the turf to connect to
P.disconnect_from_network() //remove from current network
/obj/structure/cable/shuttleRotate(rotation)
//..() is not called because wires are not supposed to have a non-default direction
//Rotate connections
if(d1)
d1 = angle2dir(rotation+dir2angle(d1))
if(d2)
d2 = angle2dir(rotation+dir2angle(d2))
//d1 should be less than d2 for cable icons to work
if(d1 > d2)
var/temp = d1
d1 = d2
d2 = temp
update_icon()
///////////////////////////////////////////////
// The cable coil object, used for laying cable
-4
View File
@@ -48,10 +48,6 @@ GLOBAL_LIST_EMPTY(gravity_generators) // We will keep track of this by adding ne
..()
icon_state = "[get_status()]_[sprite_number]"
//prevents shuttles attempting to rotate this since it messes up sprites
/obj/machinery/gravity_generator/shuttleRotate()
return
/obj/machinery/gravity_generator/proc/get_status()
return "off"
@@ -58,7 +58,7 @@
if(isliving(mover))
shock(mover)
if(istype(mover, /obj/machinery) || isstructure(mover) || ismecha(mover))
if(ismachinery(mover) || isstructure(mover) || ismecha(mover))
bump_field(mover)
/obj/machinery/field/containment/proc/set_master(master1,master2)
@@ -90,13 +90,13 @@
if(isliving(mover))
shock(mover)
return
if(istype(mover, /obj/machinery) || isstructure(mover) || ismecha(mover))
if(ismachinery(mover) || isstructure(mover) || ismecha(mover))
bump_field(mover)
return
/obj/machinery/field/CanPass(atom/movable/mover, turf/target)
if(hasShocked || isliving(mover) || istype(mover, /obj/machinery) || isstructure(mover) || ismecha(mover))
if(hasShocked || isliving(mover) || ismachinery(mover) || isstructure(mover) || ismecha(mover))
return FALSE
return ..()
+1 -1
View File
@@ -222,7 +222,7 @@
else if(closest_mob)
continue
else if(istype(A, /obj/machinery))
else if(ismachinery(A))
var/obj/machinery/M = A
var/dist = get_dist(source, A)
if(dist <= zap_range && (dist < closest_dist || !closest_machine) && !M.being_shocked)
@@ -8,7 +8,7 @@
hitsound_wall = "ricochet"
impact_effect_type = /obj/effect/temp_visual/impact_effect
/obj/item/projectile/bullet/pellet/Range()
/obj/item/projectile/bullet/pellet/shotgun_buckshot/Range()
..()
damage -= 0.75
if(damage < 0)
+4 -22
View File
@@ -11,14 +11,11 @@
var/last_tick = 1
var/addiction_tick = 1
var/list/datum/reagent/addiction_list = new/list()
var/flags_1
var/flags
/datum/reagents/New(maximum=100)
maximum_volume = maximum
if(!(flags_1 & REAGENT_NOREACT))
START_PROCESSING(SSobj, src)
//I dislike having these here but map-objects are initialised before world/New() is called. >_>
if(!GLOB.chemical_reagents_list)
//Chemical Reagents - Initialises all /datum/reagent into a list indexed by reagent id
@@ -54,7 +51,6 @@
/datum/reagents/Destroy()
. = ..()
STOP_PROCESSING(SSobj, src)
var/list/cached_reagents = reagent_list
for(var/reagent in cached_reagents)
var/datum/reagent/R = reagent
@@ -288,25 +284,11 @@
C.update_stamina()
update_total()
/datum/reagents/process()
var/list/cached_reagents = reagent_list
if(flags_1 & REAGENT_NOREACT)
STOP_PROCESSING(SSobj, src)
return
for(var/reagent in cached_reagents)
var/datum/reagent/R = reagent
R.on_tick()
/datum/reagents/proc/set_reacting(react = TRUE)
if(react)
// Order is important, process() can remove from processing if
// the flag is present
flags_1 &= ~(REAGENT_NOREACT)
START_PROCESSING(SSobj, src)
flags &= ~(REAGENT_NOREACT)
else
STOP_PROCESSING(SSobj, src)
flags_1 |= REAGENT_NOREACT
flags |= REAGENT_NOREACT
/datum/reagents/proc/conditional_update_move(atom/A, Running = 0)
var/list/cached_reagents = reagent_list
@@ -326,7 +308,7 @@
var/list/cached_reagents = reagent_list
var/list/cached_reactions = GLOB.chemical_reactions_list
var/datum/cached_my_atom = my_atom
if(flags_1 & REAGENT_NOREACT)
if(flags & REAGENT_NOREACT)
return //Yup, no reactions here. No siree.
var/reaction_occurred = 0
@@ -80,10 +80,6 @@
/datum/reagent/proc/on_update(atom/A)
return
// Called every time reagent containers process.
/datum/reagent/proc/on_tick(data)
return
// Called when the reagent container is hit by an explosion
/datum/reagent/proc/on_ex_act(severity)
return
@@ -169,18 +169,7 @@
/datum/reagent/consumable/laughter/on_mob_life(mob/living/carbon/M)
if(!iscarbon(M))
return
if(!M.silent)//cant laugh if you're mute
M.emote("laugh")
var/laughnum = rand(1,2)
if(M.gender == MALE)
if(laughnum == 1)
playsound(get_turf(M), 'sound/voice/human/manlaugh1.ogg', 50, 1)
if(laughnum == 2)
playsound(get_turf(M), 'sound/voice/human/manlaugh2.ogg', 50, 1)
else if(M.gender == FEMALE)
playsound(get_turf(M), 'sound/voice/human/womanlaugh.ogg', 65, 1)
else//non-binary gender just sounds like a man
playsound(get_turf(M), 'sound/voice/human/manlaugh1.ogg', 50, 1)
M.emote("laugh")
..()
/datum/reagent/consumable/potato_juice
@@ -196,13 +196,6 @@
M.bodytemperature -= 15
..()
/datum/reagent/cryostylane/on_tick()
if(holder.has_reagent("oxygen"))
holder.remove_reagent("oxygen", 1)
holder.chem_temp -= 10
holder.handle_reactions()
..()
/datum/reagent/cryostylane/reaction_turf(turf/T, reac_volume)
if(reac_volume >= 5)
for(var/mob/living/simple_animal/slime/M in T)
@@ -222,13 +215,6 @@
M.bodytemperature += 15
..()
/datum/reagent/pyrosium/on_tick()
if(holder.has_reagent("oxygen"))
holder.remove_reagent("oxygen", 1)
holder.chem_temp += 10
holder.handle_reactions()
..()
/datum/reagent/teslium //Teslium. Causes periodic shocks, and makes shocks against the target much more effective.
name = "Teslium"
id = "teslium"
@@ -342,6 +342,23 @@
holder.chem_temp = 20 // cools the fuck down
return
/datum/chemical_reaction/cryostylane_oxygen
name = "ephemeral cryostylane reaction"
id = "cryostylane_oxygen"
results = list("cryostylane" = 1)
required_reagents = list("cryostylane" = 1, "oxygen" = 1)
/datum/chemical_reaction/cryostylane_oxygen/on_reaction(datum/reagents/holder, created_volume)
holder.chem_temp -= 10*created_volume
/datum/chemical_reaction/pyrosium_oxygen
name = "ephemeral pyrosium reaction"
id = "pyrosium_oxygen"
results = list("pyrosium" = 1)
required_reagents = list("pyrosium" = 1, "oxygen" = 1)
/datum/chemical_reaction/pyrosium_oxygen/on_reaction(datum/reagents/holder, created_volume)
holder.chem_temp += 10*created_volume
/datum/chemical_reaction/pyrosium
name = "pyrosium"
@@ -339,16 +339,6 @@
if(current_size >= STAGE_FIVE)
deconstruct()
//Fixes dpdir on shuttle rotation
/obj/structure/disposalpipe/shuttleRotate(rotation)
..()
var/new_dpdir = 0
for(var/D in GLOB.cardinals)
if(dpdir & D)
new_dpdir = new_dpdir | angle2dir(rotation+dir2angle(D))
dpdir = new_dpdir
// *** TEST verb
//client/verb/dispstop()
// for(var/obj/structure/disposalholder/H in world)
+1 -1
View File
@@ -242,7 +242,7 @@
/obj/machinery/shuttle_manipulator/proc/load_template(
datum/map_template/shuttle/S)
// load shuttle template, centred at shuttle import landmark,
var/turf/landmark_turf = get_turf(locate("landmark*Shuttle Import"))
var/turf/landmark_turf = get_turf(locate(/obj/effect/landmark/shuttle_import) in GLOB.landmarks_list)
S.load(landmark_turf, centered = TRUE)
var/affected = S.get_affected_turfs(landmark_turf, centered=TRUE)
+12 -47
View File
@@ -83,7 +83,7 @@ All ShuttleMove procs go here
return
if(rotation)
shuttleRotate(rotation)
shuttleRotate(rotation) //see shuttle_rotate.dm
loc = newT
if(length(client_mobs_in_contents))
update_parallax_contents()
@@ -126,26 +126,6 @@ All ShuttleMove procs go here
/area/proc/afterShuttleMove()
return TRUE
/************************************Shuttle Rotation************************************/
/atom/proc/shuttleRotate(rotation)
//rotate our direction
setDir(angle2dir(rotation+dir2angle(dir)))
//resmooth if need be.
if(smooth)
queue_smooth(src)
//rotate the pixel offsets too.
if (pixel_x || pixel_y)
if (rotation < 0)
rotation += 360
for (var/turntimes=rotation/90;turntimes>0;turntimes--)
var/oldPX = pixel_x
var/oldPY = pixel_y
pixel_x = oldPY
pixel_y = (oldPX*(-1))
/************************************Turf move procs************************************/
/turf/open/afterShuttleMove(turf/oldT) //Recalculates SSair stuff for turfs on both sides
@@ -203,7 +183,7 @@ All ShuttleMove procs go here
if(pipe_vision_img)
pipe_vision_img.loc = loc
/obj/machinery/computer/auxillary_base/onShuttleMove(turf/newT, turf/oldT, rotation, list/movement_force, move_dir, old_dock)
/obj/machinery/computer/auxillary_base/afterShuttleMove(list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir)
. = ..()
if(z == ZLEVEL_MINING) //Avoids double logging and landing on other Z-levels due to badminnery
SSblackbox.add_details("colonies_dropped", "[x]|[y]|[z]") //Number of times a base has been dropped!
@@ -223,21 +203,6 @@ All ShuttleMove procs go here
. = ..()
. |= MOVE_CONTENTS
//Properly updates pipes on shuttle movement
/obj/machinery/atmospherics/shuttleRotate(rotation)
var/list/real_node_connect = getNodeConnects()
for(DEVICE_TYPE_LOOP)
real_node_connect[I] = angle2dir(rotation+dir2angle(real_node_connect[I]))
. = ..()
SetInitDirections()
var/list/supposed_node_connect = getNodeConnects()
var/list/nodes_copy = nodes.Copy()
for(DEVICE_TYPE_LOOP)
var/new_pos = supposed_node_connect.Find(real_node_connect[I])
nodes[new_pos] = nodes_copy[I]
/obj/machinery/atmospherics/afterShuttleMove(list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir)
. = ..()
var/missing_nodes = FALSE
@@ -297,24 +262,25 @@ All ShuttleMove procs go here
/************************************Item move procs************************************/
/obj/item/storage/pod/onShuttleMove(turf/newT, turf/oldT, rotation, list/movement_force, move_dir, old_dock)
/obj/item/storage/pod/afterShuttleMove(turf/newT, turf/oldT, rotation, list/movement_force, move_dir, old_dock)
. = ..()
unlocked = TRUE
// If the pod was launched, the storage will always open.
return ..()
/************************************Mob move procs************************************/
/mob/onShuttleMove(turf/newT, turf/oldT, rotation, list/movement_force, move_dir, old_dock)
if(!move_on_shuttle)
return 0
. = ..()
if(!.)
return
if(client)
. = ..()
/mob/afterShuttleMove(list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir)
. = ..()
if(client && movement_force)
var/shake_force = max(movement_force["THROW"], movement_force["KNOCKDOWN"])
if(buckled)
shake_camera(src, 2, 1) // turn it down a bit come on
else
shake_camera(src, 7, 1)
shake_force *= 0.25
shake_camera(src, shake_force, 1)
/mob/living/afterShuttleMove(list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir)
. = ..()
@@ -373,7 +339,6 @@ All ShuttleMove procs go here
/obj/docking_port/stationary/public_mining_dock/onShuttleMove(turf/newT, turf/oldT, rotation, list/movement_force, move_dir, old_dock)
id = "mining_public" //It will not move with the base, but will become enabled as a docking point.
return 0
/obj/effect/abstract/proximity_checker/onShuttleMove(turf/newT, turf/oldT, rotation, list/movement_force, move_dir, old_dock)
//timer so it only happens once
+14
View File
@@ -553,6 +553,8 @@
var/list/moved_atoms = list() //Everything not a turf that gets moved in the shuttle
var/list/areas_to_move = list() //unique assoc list of areas on turfs being moved
CHECK_TICK
/****************************************All beforeShuttleMove procs*****************************************/
var/index = 0
for(var/place in old_turfs)
@@ -578,6 +580,7 @@
areas_to_move[old_area] = TRUE
old_turfs[place] = move_mode
CHECK_TICK
/*******************************************All onShuttleMove procs******************************************/
@@ -608,17 +611,28 @@
var/turf/oldT = thing
var/turf/newT = new_turfs[index]
newT.afterShuttleMove(oldT) //turfs
CHECK_TICK
for(var/i in 1 to moved_atoms.len)
var/atom/movable/moved_object = moved_atoms[i]
moved_object.afterShuttleMove(movement_force, dir, preferred_direction, movement_direction) //atoms
CHECK_TICK
underlying_old_area.afterShuttleMove()
for(var/thing in areas_to_move)
var/area/internal_area = thing
internal_area.afterShuttleMove() //areas
CHECK_TICK
// Parallax handling
var/new_parallax_dir = FALSE
if(istype(new_dock, /obj/docking_port/stationary/transit))
new_parallax_dir = preferred_direction
for(var/i in shuttle_areas)
var/area/place = i
place.parallax_movedir = new_parallax_dir
CHECK_TICK
check_poddoors()
new_dock.last_dock_time = world.time
setDir(new_dock.dir)
+100
View File
@@ -0,0 +1,100 @@
/*
All shuttleRotate procs go here
*/
/************************************Base proc************************************/
/atom/proc/shuttleRotate(rotation)
//rotate our direction
setDir(angle2dir(rotation+dir2angle(dir)))
//resmooth if need be.
if(smooth)
queue_smooth(src)
//rotate the pixel offsets too.
if (pixel_x || pixel_y)
if (rotation < 0)
rotation += 360
for (var/turntimes=rotation/90;turntimes>0;turntimes--)
var/oldPX = pixel_x
var/oldPY = pixel_y
pixel_x = oldPY
pixel_y = (oldPX*(-1))
/************************************Turf rotate procs************************************/
/turf/closed/mineral/shuttleRotate(rotation)
setDir(angle2dir(rotation+dir2angle(dir)))
queue_smooth(src)
/************************************Mob rotate procs************************************/
//override to avoid rotating pixel_xy on mobs
/mob/shuttleRotate(rotation)
setDir(angle2dir(rotation+dir2angle(dir)))
/************************************Structure rotate procs************************************/
/obj/structure/door_assembly/door_assembly_pod/shuttleRotate(rotation)
. = ..()
expected_dir = angle2dir(rotation+dir2angle(dir))
/obj/structure/cable/shuttleRotate(rotation)
//..() is not called because wires are not supposed to have a non-default direction
//Rotate connections
if(d1)
d1 = angle2dir(rotation+dir2angle(d1))
if(d2)
d2 = angle2dir(rotation+dir2angle(d2))
//d1 should be less than d2 for cable icons to work
if(d1 > d2)
var/temp = d1
d1 = d2
d2 = temp
update_icon()
//Fixes dpdir on shuttle rotation
/obj/structure/disposalpipe/shuttleRotate(rotation)
. = ..()
var/new_dpdir = 0
for(var/D in GLOB.cardinals)
if(dpdir & D)
new_dpdir = new_dpdir | angle2dir(rotation+dir2angle(D))
dpdir = new_dpdir
/obj/structure/table/wood/bar/shuttleRotate(rotation)
. = ..()
boot_dir = angle2dir(rotation + dir2angle(boot_dir))
/obj/structure/alien/weeds/shuttleRotate(rotation)
return
/************************************Machine rotate procs************************************/
/obj/machinery/atmospherics/shuttleRotate(rotation)
var/list/real_node_connect = getNodeConnects()
for(DEVICE_TYPE_LOOP)
real_node_connect[I] = angle2dir(rotation+dir2angle(real_node_connect[I]))
. = ..()
SetInitDirections()
var/list/supposed_node_connect = getNodeConnects()
var/list/nodes_copy = nodes.Copy()
for(DEVICE_TYPE_LOOP)
var/new_pos = supposed_node_connect.Find(real_node_connect[I])
nodes[new_pos] = nodes_copy[I]
//prevents shuttles attempting to rotate this since it messes up sprites
/obj/machinery/gateway/shuttleRotate()
return
/obj/machinery/door/airlock/survival_pod/shuttleRotate(rotation)
expected_dir = angle2dir(rotation+dir2angle(dir))
return ..()
//prevents shuttles attempting to rotate this since it messes up sprites
/obj/machinery/gravity_generator/shuttleRotate()
return
-4
View File
@@ -195,10 +195,6 @@
else
. = ..()
/obj/structure/table/wood/bar/shuttleRotate(rotation)
. = ..()
boot_dir = angle2dir(rotation + dir2angle(boot_dir))
/obj/structure/table/wood/bar/proc/is_barstaff(mob/living/user)
. = FALSE
if(ishuman(user))