@@ -2282,7 +2282,6 @@
|
||||
},
|
||||
/obj/docking_port/mobile/emergency{
|
||||
name = "Box emergency shuttle";
|
||||
timid = 0
|
||||
},
|
||||
/obj/docking_port/stationary{
|
||||
dir = 4;
|
||||
|
||||
@@ -16885,7 +16885,6 @@
|
||||
dwidth = 5;
|
||||
height = 11;
|
||||
name = "Omega emergency shuttle";
|
||||
timid = 0;
|
||||
width = 19
|
||||
},
|
||||
/obj/docking_port/stationary{
|
||||
|
||||
@@ -224,7 +224,7 @@
|
||||
},
|
||||
/obj/docking_port/mobile/emergency{
|
||||
name = "Box emergency shuttle";
|
||||
timid = 0
|
||||
timid = 1
|
||||
},
|
||||
/turf/open/floor/plating,
|
||||
/area/shuttle/escape)
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
port_direction = 8;
|
||||
preferred_direction = 4;
|
||||
roundstart_move = "whiteship_away";
|
||||
timid = null;
|
||||
timid = 1;
|
||||
width = 35
|
||||
},
|
||||
/turf/open/floor/mineral/titanium,
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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>")
|
||||
+1
-1
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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,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,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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -51,7 +51,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)
|
||||
. = ..()
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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()
|
||||
|
||||
|
||||
@@ -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>")
|
||||
|
||||
|
||||
@@ -273,7 +273,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
|
||||
|
||||
+508
-492
File diff suppressed because it is too large
Load Diff
@@ -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)
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 ..()
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
@@ -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))
|
||||
|
||||
@@ -0,0 +1,4 @@
|
||||
author: "Naksu"
|
||||
delete-after: True
|
||||
changes:
|
||||
- balance: "Pyrosium and cryostylane now react at ludicrous speeds."
|
||||
@@ -0,0 +1,4 @@
|
||||
author: "ShizCalev"
|
||||
delete-after: True
|
||||
changes:
|
||||
- soundadd: "Space ninja energy katanas now make a swish when drawn!"
|
||||
@@ -0,0 +1,4 @@
|
||||
author: "ShizCalev"
|
||||
delete-after: True
|
||||
changes:
|
||||
- bugfix: "Wizards will now have the correct name when attacked with Envy's knife!"
|
||||
@@ -0,0 +1,4 @@
|
||||
author: "CitadelStationBot"
|
||||
delete-after: True
|
||||
changes:
|
||||
- tweak: "The PDA default font has been switched from \"eye bleed\" to old-style monospace. Check your preference."
|
||||
@@ -0,0 +1,4 @@
|
||||
author: "RandomMarine"
|
||||
delete-after: True
|
||||
changes:
|
||||
- bugfix: "Simple mobs should no longer experience severe hud/lighting glitches when reconnecting."
|
||||
@@ -0,0 +1,4 @@
|
||||
author: "JJRcop"
|
||||
delete-after: True
|
||||
changes:
|
||||
- tweak: "Admin volume slider moved to its own menu for better visibility."
|
||||
@@ -0,0 +1,4 @@
|
||||
author: "Xhuis and Y0SH1_M4S73R"
|
||||
delete-after: True
|
||||
changes:
|
||||
- bugfix: "Servants of Ratvar now spawn in as the actual race set on their preferences, with plasmamen getting the gear they need to not immediately die."
|
||||
@@ -0,0 +1,4 @@
|
||||
author: "CitadelStationBot"
|
||||
delete-after: True
|
||||
changes:
|
||||
- bugfix: "Jaunters equipped on the belt slot will save you from chasms again."
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 16 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 27 KiB |
@@ -257,6 +257,7 @@
|
||||
#include "code\datums\browser.dm"
|
||||
#include "code\datums\callback.dm"
|
||||
#include "code\datums\cinematic.dm"
|
||||
#include "code\datums\dash_weapon.dm"
|
||||
#include "code\datums\datacore.dm"
|
||||
#include "code\datums\datum.dm"
|
||||
#include "code\datums\datumvars.dm"
|
||||
@@ -2153,6 +2154,7 @@
|
||||
#include "code\modules\shuttle\on_move.dm"
|
||||
#include "code\modules\shuttle\ripple.dm"
|
||||
#include "code\modules\shuttle\shuttle.dm"
|
||||
#include "code\modules\shuttle\shuttle_rotate.dm"
|
||||
#include "code\modules\shuttle\special.dm"
|
||||
#include "code\modules\shuttle\supply.dm"
|
||||
#include "code\modules\shuttle\syndicate.dm"
|
||||
|
||||
Reference in New Issue
Block a user