Merge branch 'master' of https://github.com/Citadel-Station-13/Citadel-Station-13
This commit is contained in:
@@ -14,6 +14,7 @@
|
||||
#define CLOSED_TURF_LAYER 2.05
|
||||
#define ABOVE_NORMAL_TURF_LAYER 2.08
|
||||
#define LATTICE_LAYER 2.2
|
||||
#define OVER_LATTICE_LAYER 2.25
|
||||
#define DISPOSAL_PIPE_LAYER 2.3
|
||||
#define GAS_PIPE_HIDDEN_LAYER 2.35
|
||||
#define WIRE_LAYER 2.4
|
||||
|
||||
@@ -45,4 +45,9 @@
|
||||
#define HYPERSPACE_LAUNCH 2
|
||||
#define HYPERSPACE_END 3
|
||||
|
||||
#define CALL_SHUTTLE_REASON_LENGTH 12
|
||||
#define CALL_SHUTTLE_REASON_LENGTH 12
|
||||
|
||||
//Engine related
|
||||
#define ENGINE_COEFF_MIN 0.5
|
||||
#define ENGINE_COEFF_MAX 2
|
||||
#define ENGINE_DEFAULT_MAXSPEED_ENGINES 5
|
||||
@@ -47,7 +47,7 @@ SUBSYSTEM_DEF(shuttle)
|
||||
|
||||
var/lockdown = FALSE //disallow transit after nuke goes off
|
||||
|
||||
var/auto_call = 99000 //time before in deciseconds in which the shuttle is auto called. Default is 2½ hours plus 15 for the shuttle. So total is 3.
|
||||
var/auto_call = 99000 //time before in deciseconds in which the shuttle is auto called. Default is 2½ hours plus 15 for the shuttle. So total is 3.
|
||||
|
||||
/datum/controller/subsystem/shuttle/Initialize(timeofday)
|
||||
if(!arrivals)
|
||||
@@ -544,3 +544,8 @@ SUBSYSTEM_DEF(shuttle)
|
||||
for(var/obj/docking_port/mobile/M in mobile)
|
||||
if(M.is_in_shuttle_bounds(A))
|
||||
return TRUE
|
||||
|
||||
/datum/controller/subsystem/shuttle/proc/get_containing_shuttle(atom/A)
|
||||
for(var/obj/docking_port/mobile/M in mobile)
|
||||
if(M.is_in_shuttle_bounds(A))
|
||||
return M
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
diff a/code/controllers/subsystem/shuttle.dm b/code/controllers/subsystem/shuttle.dm (rejected hunks)
|
||||
@@ -536,3 +536,7 @@ SUBSYSTEM_DEF(shuttle)
|
||||
if(M.is_in_shuttle_bounds(A))
|
||||
return TRUE
|
||||
|
||||
+/datum/controller/subsystem/shuttle/proc/get_containing_shuttle(atom/A)
|
||||
+ for(var/obj/docking_port/mobile/M in mobile)
|
||||
+ if(M.is_in_shuttle_bounds(A))
|
||||
+ return M
|
||||
@@ -29,7 +29,7 @@
|
||||
qdel(H.gloves)
|
||||
|
||||
var/obj/item/clothing/suit/space/space_ninja/theSuit = new(H)
|
||||
var/obj/item/weapon/katana/energy/EK = new(H)
|
||||
var/obj/item/weapon/dash/energy_katana/EK = new(H)
|
||||
theSuit.energyKatana = EK
|
||||
|
||||
H.equip_to_slot_or_del(new /obj/item/device/radio/headset(H), slot_ears)
|
||||
|
||||
@@ -21,6 +21,10 @@
|
||||
mappath = "[prefix][shuttle_id].dmm"
|
||||
. = ..()
|
||||
|
||||
//Whatever special stuff you want
|
||||
/datum/map_template/shuttle/proc/on_bought()
|
||||
return
|
||||
|
||||
/datum/map_template/shuttle/emergency
|
||||
port_id = "emergency"
|
||||
name = "Base Shuttle Template (Emergency)"
|
||||
@@ -49,6 +53,12 @@
|
||||
// first 10 minutes only
|
||||
return world.time - SSticker.round_start_time < 6000
|
||||
|
||||
/datum/map_template/shuttle/emergency/airless/on_bought()
|
||||
//enable buying engines from cargo
|
||||
var/datum/supply_pack/P = SSshuttle.supply_packs[/datum/supply_pack/engineering/shuttle_engine]
|
||||
P.special_enabled = TRUE
|
||||
|
||||
|
||||
/datum/map_template/shuttle/emergency/asteroid
|
||||
suffix = "asteroid"
|
||||
name = "Asteroid Station Emergency Shuttle"
|
||||
|
||||
@@ -262,7 +262,7 @@
|
||||
|
||||
/obj/item/weapon/nullrod/clown
|
||||
icon = 'icons/obj/wizard.dmi'
|
||||
icon_state = "honkrender"
|
||||
icon_state = "clownrender"
|
||||
item_state = "render"
|
||||
name = "clown dagger"
|
||||
desc = "Used for absolutely hilarious sacrifices."
|
||||
|
||||
@@ -62,6 +62,15 @@
|
||||
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)
|
||||
|
||||
@@ -58,7 +58,7 @@
|
||||
for(var/i in 1 to 3)
|
||||
new /obj/item/clothing/head/welding(src)
|
||||
for(var/i in 1 to 3)
|
||||
new /obj/item/weapon/weldingtool/largetank(src)
|
||||
new /obj/item/weapon/weldingtool(src)
|
||||
|
||||
/obj/structure/closet/secure_closet/engineering_personal
|
||||
name = "engineer's locker"
|
||||
|
||||
@@ -91,6 +91,11 @@
|
||||
icon_state = "[icon_state][rand(1, 6)]"
|
||||
..()
|
||||
|
||||
/obj/structure/flora/tree/jungle/small
|
||||
pixel_y = 0
|
||||
pixel_x = -32
|
||||
icon = 'icons/obj/flora/jungletreesmall.dmi'
|
||||
|
||||
//grass
|
||||
/obj/structure/flora/grass
|
||||
name = "grass"
|
||||
@@ -381,5 +386,5 @@
|
||||
pixel_y = -16
|
||||
|
||||
/obj/structure/flora/rock/pile/largejungle/Initialize()
|
||||
..()
|
||||
icon_state = "[initial(icon_state)][rand(1,3)]"
|
||||
. = ..()
|
||||
icon_state = "[initial(icon_state)][rand(1,3)]"
|
||||
|
||||
@@ -1,21 +1,95 @@
|
||||
#define ENGINE_UNWRENCHED 0
|
||||
#define ENGINE_WRENCHED 1
|
||||
#define ENGINE_WELDED 2
|
||||
#define ENGINE_WELDTIME 200
|
||||
|
||||
/obj/structure/shuttle
|
||||
name = "shuttle"
|
||||
icon = 'icons/turf/shuttle.dmi'
|
||||
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF
|
||||
resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF
|
||||
obj_integrity = 500
|
||||
max_integrity = 500
|
||||
armor = list(melee = 100, bullet = 10, laser = 10, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 50, acid = 70) //default + ignores melee
|
||||
|
||||
/obj/structure/shuttle/engine
|
||||
name = "engine"
|
||||
density = 1
|
||||
anchored = 1
|
||||
density = TRUE
|
||||
anchored = TRUE
|
||||
var/engine_power = 1
|
||||
var/state = ENGINE_WELDED //welding shmelding
|
||||
|
||||
//Ugh this is a lot of copypasta from emitters, welding need some boilerplate reduction
|
||||
/obj/structure/shuttle/engine/can_be_unfasten_wrench(mob/user, silent)
|
||||
if(state == ENGINE_WELDED)
|
||||
if(!silent)
|
||||
to_chat(user, "<span class='warning'>[src] is welded to the floor!</span>")
|
||||
return FAILED_UNFASTEN
|
||||
return ..()
|
||||
|
||||
/obj/structure/shuttle/engine/default_unfasten_wrench(mob/user, obj/item/weapon/wrench/W, time = 20)
|
||||
. = ..()
|
||||
if(. == SUCCESSFUL_UNFASTEN)
|
||||
if(anchored)
|
||||
state = ENGINE_WRENCHED
|
||||
else
|
||||
state = ENGINE_UNWRENCHED
|
||||
|
||||
/obj/structure/shuttle/engine/attackby(obj/item/I, mob/user, params)
|
||||
add_fingerprint(user)
|
||||
if(default_unfasten_wrench(user, I))
|
||||
return
|
||||
else if(istype(I, /obj/item/weapon/weldingtool))
|
||||
var/obj/item/weapon/weldingtool/WT = I
|
||||
switch(state)
|
||||
if(ENGINE_UNWRENCHED)
|
||||
to_chat(user, "<span class='warning'>The [src.name] needs to be wrenched to the floor!</span>")
|
||||
if(EM_SECURED)
|
||||
if(WT.remove_fuel(0,user))
|
||||
playsound(loc, WT.usesound, 50, 1)
|
||||
user.visible_message("[user.name] starts to weld the [name] to the floor.", \
|
||||
"<span class='notice'>You start to weld \the [src] to the floor...</span>", \
|
||||
"<span class='italics'>You hear welding.</span>")
|
||||
if(do_after(user,ENGINE_WELDTIME*WT.toolspeed, target = src) && WT.isOn())
|
||||
state = ENGINE_WELDED
|
||||
to_chat(user, "<span class='notice'>You weld \the [src] to the floor.</span>")
|
||||
alter_engine_power(engine_power)
|
||||
if(EM_WELDED)
|
||||
if(WT.remove_fuel(0,user))
|
||||
playsound(loc, WT.usesound, 50, 1)
|
||||
user.visible_message("[user.name] starts to cut the [name] free from the floor.", \
|
||||
"<span class='notice'>You start to cut \the [src] free from the floor...</span>", \
|
||||
"<span class='italics'>You hear welding.</span>")
|
||||
if(do_after(user,ENGINE_WELDTIME*WT.toolspeed, target = src) && WT.isOn())
|
||||
state = ENGINE_WRENCHED
|
||||
to_chat(user, "<span class='notice'>You cut \the [src] free from the floor.</span>")
|
||||
alter_engine_power(-engine_power)
|
||||
return
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/structure/shuttle/engine/Destroy()
|
||||
if(state == ENGINE_WELDED)
|
||||
alter_engine_power(-engine_power)
|
||||
. = ..()
|
||||
|
||||
//Propagates the change to the shuttle.
|
||||
/obj/structure/shuttle/engine/proc/alter_engine_power(mod)
|
||||
if(mod == 0)
|
||||
return
|
||||
if(SSshuttle.is_in_shuttle_bounds(src))
|
||||
var/obj/docking_port/mobile/M = SSshuttle.get_containing_shuttle(src)
|
||||
if(M)
|
||||
M.alter_engines(mod)
|
||||
|
||||
/obj/structure/shuttle/engine/heater
|
||||
name = "heater"
|
||||
icon_state = "heater"
|
||||
engine_power = 0 // todo make these into 2x1 parts
|
||||
|
||||
/obj/structure/shuttle/engine/platform
|
||||
name = "platform"
|
||||
icon_state = "platform"
|
||||
engine_power = 0
|
||||
|
||||
/obj/structure/shuttle/engine/propulsion
|
||||
name = "propulsion"
|
||||
@@ -25,6 +99,10 @@
|
||||
/obj/structure/shuttle/engine/propulsion/burst
|
||||
name = "burst"
|
||||
|
||||
/obj/structure/shuttle/engine/propulsion/burst/cargo
|
||||
state = ENGINE_UNWRENCHED
|
||||
anchored = FALSE
|
||||
|
||||
/obj/structure/shuttle/engine/propulsion/burst/left
|
||||
name = "left"
|
||||
icon_state = "burst_l"
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
diff a/code/game/shuttle_engines.dm b/code/game/shuttle_engines.dm (rejected hunks)
|
||||
@@ -46,7 +117,7 @@
|
||||
bound_height = 64
|
||||
appearance_flags = 0
|
||||
|
||||
-obj/structure/shuttle/engine/huge
|
||||
+/obj/structure/shuttle/engine/huge
|
||||
name = "engine"
|
||||
opacity = 1
|
||||
icon = 'icons/obj/3x3.dmi'
|
||||
@@ -116,6 +116,23 @@
|
||||
underlay_appearance.icon_state = "necro1"
|
||||
return TRUE
|
||||
|
||||
/turf/closed/indestructible/riveted/boss
|
||||
name = "stone wall"
|
||||
desc = "A thick, seemingly indestructible stone wall."
|
||||
icon = 'icons/turf/walls/boss_wall.dmi'
|
||||
icon_state = "wall"
|
||||
explosion_block = 50
|
||||
baseturf = /turf/closed/indestructible/riveted/boss
|
||||
|
||||
/turf/closed/indestructible/riveted/boss/hot
|
||||
icon = 'icons/turf/walls/boss_wall_hot.dmi'
|
||||
baseturf = /turf/closed/indestructible/riveted/boss/hot
|
||||
|
||||
/turf/closed/indestructible/riveted/boss/get_smooth_underlay_icon(mutable_appearance/underlay_appearance, turf/asking_turf, adjacency_dir)
|
||||
underlay_appearance.icon = 'icons/turf/floors.dmi'
|
||||
underlay_appearance.icon_state = "basalt"
|
||||
return TRUE
|
||||
|
||||
/turf/closed/indestructible/riveted/hierophant
|
||||
name = "wall"
|
||||
desc = "A wall made out of a strange metal. The squares on it pulse in a predictable pattern."
|
||||
|
||||
@@ -54,8 +54,16 @@
|
||||
else
|
||||
to_chat(user, "<span class='warning'>The plating is going to need some support! Place metal rods first.</span>")
|
||||
|
||||
/turf/open/chasm/proc/is_safe()
|
||||
//if anything matching this typecache is found in the chasm, we don't drop things
|
||||
var/static/list/chasm_safeties_typecache = typecacheof(list(/obj/structure/lattice/catwalk, /obj/structure/stone_tile))
|
||||
var/list/found_safeties = typecache_filter_list(contents, chasm_safeties_typecache)
|
||||
return LAZYLEN(found_safeties)
|
||||
|
||||
/turf/open/chasm/proc/drop_stuff(AM)
|
||||
. = 0
|
||||
if(is_safe())
|
||||
return FALSE
|
||||
var/thing_to_check = src
|
||||
if(AM)
|
||||
thing_to_check = list(AM)
|
||||
|
||||
@@ -54,7 +54,7 @@
|
||||
|
||||
/turf/open/floor/plating/lava/proc/is_safe()
|
||||
//if anything matching this typecache is found in the lava, we don't burn things
|
||||
var/static/list/lava_safeties_typecache = typecacheof(list(/obj/structure/lattice/catwalk))
|
||||
var/static/list/lava_safeties_typecache = typecacheof(list(/obj/structure/lattice/catwalk, /obj/structure/stone_tile))
|
||||
var/list/found_safeties = typecache_filter_list(contents, lava_safeties_typecache)
|
||||
return LAZYLEN(found_safeties)
|
||||
|
||||
|
||||
@@ -710,6 +710,15 @@
|
||||
/obj/item/weapon/am_containment)
|
||||
crate_name = "antimatter jar crate"
|
||||
|
||||
/datum/supply_pack/engineering/shuttle_engine
|
||||
name = "Shuttle Engine Crate"
|
||||
cost = 5000
|
||||
access = GLOB.access_ce
|
||||
contains = list(/obj/structure/shuttle/engine/propulsion/burst/cargo)
|
||||
crate_name = "shuttle engine crate"
|
||||
crate_type = /obj/structure/closet/crate/secure/engineering
|
||||
special = TRUE
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
//////////////////////////// Medical /////////////////////////////////////////
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
@@ -83,7 +83,7 @@ Station Engineer
|
||||
name = "Station Engineer"
|
||||
jobtype = /datum/job/engineer
|
||||
|
||||
belt = /obj/item/weapon/storage/belt/utility/full
|
||||
belt = /obj/item/weapon/storage/belt/utility/full/engi
|
||||
l_pocket = /obj/item/device/pda/engineering
|
||||
ears = /obj/item/device/radio/headset/headset_eng
|
||||
uniform = /obj/item/clothing/under/rank/engineer
|
||||
|
||||
@@ -309,7 +309,7 @@
|
||||
/obj/item/weapon/melee/supermatter_sword,
|
||||
/obj/item/weapon/shield/changeling,
|
||||
/obj/item/weapon/lava_staff,
|
||||
/obj/item/weapon/katana/energy,
|
||||
/obj/item/weapon/dash/energy_katana,
|
||||
/obj/item/weapon/hierophant_club,
|
||||
/obj/item/weapon/his_grace,
|
||||
/obj/item/weapon/gun/ballistic/minigun,
|
||||
|
||||
@@ -4,12 +4,14 @@
|
||||
var/blacklisted_turfs
|
||||
var/whitelisted_turfs
|
||||
var/banned_areas
|
||||
var/banned_objects
|
||||
|
||||
/datum/map_template/shelter/New()
|
||||
. = ..()
|
||||
blacklisted_turfs = typecacheof(/turf/closed)
|
||||
whitelisted_turfs = list()
|
||||
banned_areas = typecacheof(/area/shuttle)
|
||||
banned_objects = list()
|
||||
|
||||
/datum/map_template/shelter/proc/check_deploy(turf/deploy_location)
|
||||
var/affected = get_affected_turfs(deploy_location, centered=TRUE)
|
||||
@@ -24,7 +26,7 @@
|
||||
return SHELTER_DEPLOY_BAD_TURFS
|
||||
|
||||
for(var/obj/O in T)
|
||||
if(O.density && O.anchored)
|
||||
if((O.density && O.anchored) || is_type_in_typecache(O, banned_objects))
|
||||
return SHELTER_DEPLOY_ANCHORED_OBJECTS
|
||||
return SHELTER_DEPLOY_ALLOWED
|
||||
|
||||
@@ -40,7 +42,7 @@
|
||||
/datum/map_template/shelter/alpha/New()
|
||||
. = ..()
|
||||
whitelisted_turfs = typecacheof(/turf/closed/mineral)
|
||||
|
||||
banned_objects = typecacheof(/obj/structure/stone_tile)
|
||||
|
||||
/datum/map_template/shelter/beta
|
||||
name = "Shelter Beta"
|
||||
@@ -55,3 +57,4 @@
|
||||
/datum/map_template/shelter/beta/New()
|
||||
. = ..()
|
||||
whitelisted_turfs = typecacheof(/turf/closed/mineral)
|
||||
banned_objects = typecacheof(/obj/structure/stone_tile)
|
||||
|
||||
@@ -164,6 +164,9 @@
|
||||
|
||||
. = ..()
|
||||
|
||||
/mob/living/silicon/ai/IgniteMob()
|
||||
fire_stacks = 0
|
||||
. = ..()
|
||||
|
||||
/mob/living/silicon/ai/verb/pick_icon()
|
||||
set category = "AI Commands"
|
||||
|
||||
@@ -4,12 +4,11 @@
|
||||
stat = DEAD
|
||||
canmove = 0
|
||||
card.removePersonality()
|
||||
if(holoform)
|
||||
card.forceMove(loc)
|
||||
card.forceMove(loc)
|
||||
update_sight()
|
||||
clear_fullscreens()
|
||||
|
||||
//New pAI's get a brand new mind to prevent meta stuff from their previous life. This new mind causes problems down the line if it's not deleted here.
|
||||
GLOB.living_mob_list -= src
|
||||
ghostize()
|
||||
qdel(src)
|
||||
qdel(src)
|
||||
|
||||
@@ -316,7 +316,7 @@ Difficulty: Medium
|
||||
for(var/mob/living/L in T.contents)
|
||||
if(istype(L, /mob/living/simple_animal/hostile/megafauna/dragon))
|
||||
continue
|
||||
if(!islist(flame_hit) || !flame_hit[L])
|
||||
if(islist(flame_hit) && !flame_hit[L])
|
||||
L.adjustFireLoss(40)
|
||||
to_chat(L, "<span class='userdanger'>You're hit by the drake's fire breath!</span>")
|
||||
flame_hit[L] = TRUE
|
||||
|
||||
@@ -350,7 +350,7 @@ Difficulty: Hard
|
||||
INVOKE_ASYNC(src, .proc/arena_squares, T, d)
|
||||
for(var/t in RANGE_TURFS(11, T))
|
||||
if(t && get_dist(t, T) == 11)
|
||||
new /obj/effect/temp_visual/hierophant/wall(t)
|
||||
new /obj/effect/temp_visual/hierophant/wall(t, src)
|
||||
new /obj/effect/temp_visual/hierophant/blast(t, src, FALSE)
|
||||
if(get_dist(src, T) >= 11) //hey you're out of range I need to get closer to you!
|
||||
INVOKE_ASYNC(src, .proc/blink, T)
|
||||
@@ -469,6 +469,8 @@ Difficulty: Hard
|
||||
return ..()
|
||||
|
||||
/obj/effect/temp_visual/hierophant/wall/CanPass(atom/movable/mover, turf/target, height = 0)
|
||||
if(QDELETED(caster))
|
||||
return FALSE
|
||||
if(mover == caster.pulledby)
|
||||
return TRUE
|
||||
if(istype(mover, /obj/item/projectile))
|
||||
|
||||
@@ -1,30 +1,93 @@
|
||||
/obj/item/weapon/katana/energy
|
||||
/obj/item/weapon/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/weapon/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/weapon/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/weapon/dash/afterattack(atom/target, mob/user, proximity_flag, click_parameters)
|
||||
if(dash_toggled)
|
||||
dash(user, target)
|
||||
return
|
||||
|
||||
/obj/item/weapon/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/weapon/dash/energy_katana
|
||||
name = "energy katana"
|
||||
desc = "A katana infused with strong energy."
|
||||
icon_state = "energy_katana"
|
||||
item_state = "energy_katana"
|
||||
force = 40
|
||||
throwforce = 20
|
||||
block_chance = 50
|
||||
armour_penetration = 50
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
hitsound = 'sound/weapons/bladeslice.ogg'
|
||||
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
|
||||
block_chance = 50
|
||||
sharpness = IS_SHARP
|
||||
obj_integrity = 200
|
||||
max_integrity = 200
|
||||
resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF
|
||||
bypass_density = TRUE
|
||||
var/datum/effect_system/spark_spread/spark_system
|
||||
|
||||
/obj/item/weapon/katana/energy/afterattack(atom/target, mob/user, proximity_flag, click_parameters)
|
||||
if(!user || !target)
|
||||
return
|
||||
|
||||
if(proximity_flag)
|
||||
if(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/weapon/dash/energy_katana/afterattack(atom/target, mob/user, proximity_flag, click_parameters)
|
||||
if(dash_toggled)
|
||||
return ..()
|
||||
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)
|
||||
|
||||
|
||||
//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/weapon/katana/energy/throw_impact(atom/hit_atom)
|
||||
/obj/item/weapon/dash/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))
|
||||
@@ -35,7 +98,7 @@
|
||||
|
||||
..()
|
||||
|
||||
/obj/item/weapon/katana/energy/proc/returnToOwner(mob/living/carbon/human/user, doSpark = 1, caught = 0)
|
||||
/obj/item/weapon/dash/energy_katana/proc/returnToOwner(mob/living/carbon/human/user, doSpark = 1, caught = 0)
|
||||
if(!istype(user))
|
||||
return
|
||||
forceMove(get_turf(user))
|
||||
@@ -62,13 +125,12 @@
|
||||
if(msg)
|
||||
to_chat(user, "<span class='notice'>[msg]</span>")
|
||||
|
||||
/obj/item/weapon/katana/energy/New()
|
||||
..()
|
||||
/obj/item/weapon/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/weapon/katana/energy/Destroy()
|
||||
qdel(spark_system)
|
||||
spark_system = null
|
||||
return ..()
|
||||
/obj/item/weapon/dash/energy_katana/Destroy()
|
||||
QDEL_NULL(spark_system)
|
||||
return ..()
|
||||
|
||||
@@ -22,7 +22,7 @@ Contents:
|
||||
armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 30, fire = 100, acid = 100)
|
||||
strip_delay = 12
|
||||
|
||||
actions_types = list(/datum/action/item_action/initialize_ninja_suit, /datum/action/item_action/ninjajaunt, /datum/action/item_action/ninjasmoke, /datum/action/item_action/ninjaboost, /datum/action/item_action/ninjapulse, /datum/action/item_action/ninjastar, /datum/action/item_action/ninjanet, /datum/action/item_action/ninja_sword_recall, /datum/action/item_action/ninja_stealth, /datum/action/item_action/toggle_glove)
|
||||
actions_types = list(/datum/action/item_action/initialize_ninja_suit, /datum/action/item_action/ninjasmoke, /datum/action/item_action/ninjaboost, /datum/action/item_action/ninjapulse, /datum/action/item_action/ninjastar, /datum/action/item_action/ninjanet, /datum/action/item_action/ninja_sword_recall, /datum/action/item_action/ninja_stealth, /datum/action/item_action/toggle_glove)
|
||||
|
||||
//Important parts of the suit.
|
||||
var/mob/living/carbon/human/affecting = null
|
||||
@@ -31,7 +31,7 @@ Contents:
|
||||
var/list/reagent_list = list("omnizine","salbutamol","spaceacillin","charcoal","nutriment","radium","potass_iodide")//The reagents ids which are added to the suit at New().
|
||||
var/list/stored_research = list()//For stealing station research.
|
||||
var/obj/item/weapon/disk/tech_disk/t_disk//To copy design onto disk.
|
||||
var/obj/item/weapon/katana/energy/energyKatana //For teleporting the katana back to the ninja (It's an ability)
|
||||
var/obj/item/weapon/dash/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
|
||||
@@ -181,9 +181,6 @@ Contents:
|
||||
if(!s_initialized)
|
||||
to_chat(user, "<span class='warning'><b>ERROR</b>: suit offline. Please activate suit.</span>")
|
||||
return FALSE
|
||||
if(istype(action, /datum/action/item_action/ninjajaunt))
|
||||
ninjajaunt()
|
||||
return TRUE
|
||||
if(istype(action, /datum/action/item_action/ninjasmoke))
|
||||
ninjasmoke()
|
||||
return TRUE
|
||||
|
||||
@@ -71,7 +71,6 @@
|
||||
|
||||
/obj/item/clothing/suit/space/space_ninja/proc/deinitialize_three(delay, mob/living/carbon/human/U)
|
||||
to_chat(U, "<span class='notice'>Logging off, [U:real_name]. Shutting down <B>SpiderOS</B>.</span>")
|
||||
remove_ninja_verbs()
|
||||
addtimer(CALLBACK(src, .proc/deinitialize_four, delay, U), delay)
|
||||
|
||||
/obj/item/clothing/suit/space/space_ninja/proc/deinitialize_four(delay, mob/living/carbon/human/U)
|
||||
|
||||
@@ -22,11 +22,5 @@ Contents:
|
||||
|
||||
|
||||
/obj/item/clothing/suit/space/space_ninja/proc/grant_ninja_verbs()
|
||||
verbs += /obj/item/clothing/suit/space/space_ninja/proc/ninjashift
|
||||
|
||||
s_initialized=1
|
||||
slowdown=0
|
||||
|
||||
|
||||
/obj/item/clothing/suit/space/space_ninja/proc/remove_ninja_verbs()
|
||||
verbs -= /obj/item/clothing/suit/space/space_ninja/proc/ninjashift
|
||||
slowdown=0
|
||||
@@ -87,6 +87,8 @@
|
||||
new impact_effect_type(target_loca, target, src)
|
||||
return 0
|
||||
var/mob/living/L = target
|
||||
if(L.buckled && ismob(L.buckled))
|
||||
L = L.buckled
|
||||
if(blocked != 100) // not completely blocked
|
||||
if(damage && L.blood_volume && damage_type == BRUTE)
|
||||
var/splatter_dir = dir
|
||||
|
||||
@@ -60,3 +60,168 @@
|
||||
. = ..()
|
||||
else
|
||||
return QDEL_HINT_LETMELIVE
|
||||
|
||||
//stone tiles for boss arenas
|
||||
/obj/structure/stone_tile
|
||||
name = "stone tile"
|
||||
icon = 'icons/turf/boss_floors.dmi'
|
||||
icon_state = "pristine_tile1"
|
||||
layer = OVER_LATTICE_LAYER
|
||||
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
|
||||
var/tile_key = "pristine_tile"
|
||||
var/tile_random_sprite_max = 24
|
||||
|
||||
/obj/structure/stone_tile/Initialize(mapload)
|
||||
. = ..()
|
||||
icon_state = "[tile_key][rand(1, tile_random_sprite_max)]"
|
||||
|
||||
/obj/structure/stone_tile/block
|
||||
name = "stone block"
|
||||
icon_state = "pristine_block1"
|
||||
tile_key = "pristine_block"
|
||||
tile_random_sprite_max = 4
|
||||
|
||||
/obj/structure/stone_tile/slab
|
||||
name = "stone slab"
|
||||
icon_state = "pristine_slab1"
|
||||
tile_key = "pristine_slab"
|
||||
tile_random_sprite_max = 4
|
||||
|
||||
/obj/structure/stone_tile/center
|
||||
name = "stone center tile"
|
||||
icon_state = "pristine_center1"
|
||||
tile_key = "pristine_center"
|
||||
tile_random_sprite_max = 4
|
||||
|
||||
/obj/structure/stone_tile/surrounding
|
||||
name = "stone surrounding slab"
|
||||
icon_state = "pristine_surrounding1"
|
||||
tile_key = "pristine_surrounding"
|
||||
tile_random_sprite_max = 2
|
||||
|
||||
/obj/structure/stone_tile/surrounding_tile
|
||||
name = "stone surrounding tile"
|
||||
icon_state = "pristine_surrounding_tile1"
|
||||
tile_key = "pristine_surrounding_tile"
|
||||
tile_random_sprite_max = 2
|
||||
|
||||
//cracked stone tiles
|
||||
/obj/structure/stone_tile/cracked
|
||||
name = "cracked stone tile"
|
||||
icon_state = "cracked_tile1"
|
||||
tile_key = "cracked_tile"
|
||||
|
||||
/obj/structure/stone_tile/block/cracked
|
||||
name = "cracked stone block"
|
||||
icon_state = "cracked_block1"
|
||||
tile_key = "cracked_block"
|
||||
|
||||
/obj/structure/stone_tile/slab/cracked
|
||||
name = "cracked stone slab"
|
||||
icon_state = "cracked_slab1"
|
||||
tile_key = "cracked_slab"
|
||||
tile_random_sprite_max = 1
|
||||
|
||||
/obj/structure/stone_tile/center/cracked
|
||||
name = "cracked stone center tile"
|
||||
icon_state = "cracked_center1"
|
||||
tile_key = "cracked_center"
|
||||
|
||||
/obj/structure/stone_tile/surrounding/cracked
|
||||
name = "cracked stone surrounding slab"
|
||||
icon_state = "cracked_surrounding1"
|
||||
tile_key = "cracked_surrounding"
|
||||
tile_random_sprite_max = 1
|
||||
|
||||
/obj/structure/stone_tile/surrounding_tile/cracked
|
||||
name = "cracked stone surrounding tile"
|
||||
icon_state = "cracked_surrounding_tile1"
|
||||
tile_key = "cracked_surrounding_tile"
|
||||
|
||||
//burnt stone tiles
|
||||
/obj/structure/stone_tile/burnt
|
||||
name = "burnt stone tile"
|
||||
icon_state = "burnt_tile1"
|
||||
tile_key = "burnt_tile"
|
||||
|
||||
/obj/structure/stone_tile/block/burnt
|
||||
name = "burnt stone block"
|
||||
icon_state = "burnt_block1"
|
||||
tile_key = "burnt_block"
|
||||
|
||||
/obj/structure/stone_tile/slab/burnt
|
||||
name = "burnt stone slab"
|
||||
icon_state = "burnt_slab1"
|
||||
tile_key = "burnt_slab"
|
||||
|
||||
/obj/structure/stone_tile/center/burnt
|
||||
name = "burnt stone center tile"
|
||||
icon_state = "burnt_center1"
|
||||
tile_key = "burnt_center"
|
||||
|
||||
/obj/structure/stone_tile/surrounding/burnt
|
||||
name = "burnt stone surrounding slab"
|
||||
icon_state = "burnt_surrounding1"
|
||||
tile_key = "burnt_surrounding"
|
||||
|
||||
/obj/structure/stone_tile/surrounding_tile/burnt
|
||||
name = "burnt stone surrounding tile"
|
||||
icon_state = "burnt_surrounding_tile1"
|
||||
tile_key = "burnt_surrounding_tile"
|
||||
|
||||
//hot stone tiles, cosmetic only
|
||||
/obj/structure/stone_tile/hot
|
||||
icon = 'icons/turf/boss_floors_hot.dmi'
|
||||
|
||||
/obj/structure/stone_tile/block/hot
|
||||
icon = 'icons/turf/boss_floors_hot.dmi'
|
||||
|
||||
/obj/structure/stone_tile/slab/hot
|
||||
icon = 'icons/turf/boss_floors_hot.dmi'
|
||||
|
||||
/obj/structure/stone_tile/center/hot
|
||||
icon = 'icons/turf/boss_floors_hot.dmi'
|
||||
|
||||
/obj/structure/stone_tile/surrounding/hot
|
||||
icon = 'icons/turf/boss_floors_hot.dmi'
|
||||
|
||||
/obj/structure/stone_tile/surrounding_tile/hot
|
||||
icon = 'icons/turf/boss_floors_hot.dmi'
|
||||
|
||||
//hot cracked stone tiles, cosmetic only
|
||||
/obj/structure/stone_tile/cracked/hot
|
||||
icon = 'icons/turf/boss_floors_hot.dmi'
|
||||
|
||||
/obj/structure/stone_tile/block/cracked/hot
|
||||
icon = 'icons/turf/boss_floors_hot.dmi'
|
||||
|
||||
/obj/structure/stone_tile/slab/cracked/hot
|
||||
icon = 'icons/turf/boss_floors_hot.dmi'
|
||||
|
||||
/obj/structure/stone_tile/center/cracked/hot
|
||||
icon = 'icons/turf/boss_floors_hot.dmi'
|
||||
|
||||
/obj/structure/stone_tile/surrounding/cracked/hot
|
||||
icon = 'icons/turf/boss_floors_hot.dmi'
|
||||
|
||||
/obj/structure/stone_tile/surrounding_tile/cracked/hot
|
||||
icon = 'icons/turf/boss_floors_hot.dmi'
|
||||
|
||||
//hot burnt stone tiles, cosmetic only
|
||||
/obj/structure/stone_tile/burnt/hot
|
||||
icon = 'icons/turf/boss_floors_hot.dmi'
|
||||
|
||||
/obj/structure/stone_tile/block/burnt/hot
|
||||
icon = 'icons/turf/boss_floors_hot.dmi'
|
||||
|
||||
/obj/structure/stone_tile/slab/burnt/hot
|
||||
icon = 'icons/turf/boss_floors_hot.dmi'
|
||||
|
||||
/obj/structure/stone_tile/center/burnt/hot
|
||||
icon = 'icons/turf/boss_floors_hot.dmi'
|
||||
|
||||
/obj/structure/stone_tile/surrounding/burnt/hot
|
||||
icon = 'icons/turf/boss_floors_hot.dmi'
|
||||
|
||||
/obj/structure/stone_tile/surrounding_tile/burnt/hot
|
||||
icon = 'icons/turf/boss_floors_hot.dmi'
|
||||
|
||||
@@ -213,7 +213,7 @@
|
||||
set_coefficient = 1
|
||||
else
|
||||
set_coefficient = 0.5
|
||||
var/call_time = SSshuttle.emergencyCallTime * set_coefficient
|
||||
var/call_time = SSshuttle.emergencyCallTime * set_coefficient * engine_coeff
|
||||
switch(mode)
|
||||
// The shuttle can not normally be called while "recalling", so
|
||||
// if this proc is called, it's via admin fiat
|
||||
@@ -359,7 +359,7 @@
|
||||
enterTransit()
|
||||
mode = SHUTTLE_ESCAPE
|
||||
launch_status = ENDGAME_LAUNCHED
|
||||
setTimer(SSshuttle.emergencyEscapeTime)
|
||||
setTimer(SSshuttle.emergencyEscapeTime * engine_coeff)
|
||||
priority_announce("The Emergency Shuttle has left the station. Estimate [timeLeft(600)] minutes until the shuttle docks at Central Command.", null, null, "Priority")
|
||||
|
||||
if(SHUTTLE_STRANDED)
|
||||
|
||||
@@ -285,6 +285,9 @@
|
||||
|
||||
message_admins(msg)
|
||||
WARNING(msg)
|
||||
return
|
||||
//Everything fine
|
||||
S.on_bought()
|
||||
|
||||
/obj/machinery/shuttle_manipulator/proc/unload_preview()
|
||||
if(preview_shuttle)
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
|
||||
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
|
||||
anchored = 1
|
||||
|
||||
//
|
||||
var/id
|
||||
// this should point -away- from the dockingport door, ie towards the ship
|
||||
dir = NORTH
|
||||
@@ -224,11 +224,9 @@
|
||||
var/timid = FALSE
|
||||
|
||||
var/list/ripples = list()
|
||||
|
||||
/obj/docking_port/mobile/Initialize()
|
||||
. = ..()
|
||||
if(!timid)
|
||||
register()
|
||||
var/engine_coeff = 1 //current engine coeff
|
||||
var/current_engines = 0 //current engine power
|
||||
var/initial_engines = 0 //initial engine power
|
||||
|
||||
/obj/docking_port/mobile/proc/register()
|
||||
SSshuttle.mobile += src
|
||||
@@ -244,6 +242,8 @@
|
||||
|
||||
/obj/docking_port/mobile/Initialize(mapload)
|
||||
. = ..()
|
||||
if(!timid)
|
||||
register()
|
||||
|
||||
var/area/A = get_area(src)
|
||||
if(istype(A, /area/shuttle))
|
||||
@@ -259,6 +259,9 @@
|
||||
areaInstance.name = name
|
||||
areaInstance.contents += return_ordered_turfs()
|
||||
|
||||
initial_engines = count_engines()
|
||||
current_engines = initial_engines
|
||||
|
||||
#ifdef DOCKING_PORT_HIGHLIGHT
|
||||
highlight("#0f0")
|
||||
#endif
|
||||
@@ -325,17 +328,17 @@
|
||||
switch(mode)
|
||||
if(SHUTTLE_CALL)
|
||||
if(S == destination)
|
||||
if(timeLeft(1) < callTime)
|
||||
setTimer(callTime)
|
||||
if(timeLeft(1) < callTime * engine_coeff)
|
||||
setTimer(callTime * engine_coeff)
|
||||
else
|
||||
destination = S
|
||||
setTimer(callTime)
|
||||
setTimer(callTime * engine_coeff)
|
||||
if(SHUTTLE_RECALL)
|
||||
if(S == destination)
|
||||
setTimer(callTime - timeLeft(1))
|
||||
setTimer(callTime * engine_coeff - timeLeft(1))
|
||||
else
|
||||
destination = S
|
||||
setTimer(callTime)
|
||||
setTimer(callTime * engine_coeff)
|
||||
mode = SHUTTLE_CALL
|
||||
if(SHUTTLE_IDLE, SHUTTLE_IGNITING)
|
||||
destination = S
|
||||
@@ -621,7 +624,7 @@
|
||||
return
|
||||
else
|
||||
mode = SHUTTLE_CALL
|
||||
setTimer(callTime)
|
||||
setTimer(callTime * engine_coeff)
|
||||
enterTransit()
|
||||
return
|
||||
|
||||
@@ -685,7 +688,7 @@
|
||||
|
||||
var/ds_remaining
|
||||
if(!timer)
|
||||
ds_remaining = callTime
|
||||
ds_remaining = callTime * engine_coeff
|
||||
else
|
||||
ds_remaining = max(0, timer - world.time)
|
||||
|
||||
@@ -765,5 +768,62 @@
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
// Losing all initial engines should get you 2
|
||||
// Adding another set of engines at 0.5 time
|
||||
/obj/docking_port/mobile/proc/alter_engines(mod)
|
||||
if(mod == 0)
|
||||
return
|
||||
var/old_coeff = engine_coeff
|
||||
engine_coeff = get_engine_coeff(current_engines,mod)
|
||||
current_engines = max(0,current_engines + mod)
|
||||
if(in_flight())
|
||||
var/delta_coeff = engine_coeff / old_coeff
|
||||
modTimer(delta_coeff)
|
||||
|
||||
/obj/docking_port/mobile/proc/count_engines()
|
||||
. = 0
|
||||
for(var/obj/structure/shuttle/engine/E in areaInstance.contents)
|
||||
if(!QDELETED(E))
|
||||
. += E.engine_power
|
||||
|
||||
// Double initial engines to get to 0.5 minimum
|
||||
// Lose all initial engines to get to 2
|
||||
//For 0 engine shuttles like BYOS 5 engines to get to doublespeed
|
||||
/obj/docking_port/mobile/proc/get_engine_coeff(current,engine_mod)
|
||||
var/new_value = max(0,current + engine_mod)
|
||||
if(new_value == initial_engines)
|
||||
return 1
|
||||
if(new_value > initial_engines)
|
||||
var/delta = new_value - initial_engines
|
||||
var/change_per_engine = (1 - ENGINE_COEFF_MIN) / ENGINE_DEFAULT_MAXSPEED_ENGINES // 5 by default
|
||||
if(initial_engines > 0)
|
||||
change_per_engine = (1 - ENGINE_COEFF_MIN) / initial_engines // or however many it had
|
||||
return Clamp(1 - delta * change_per_engine,ENGINE_COEFF_MIN,ENGINE_COEFF_MAX)
|
||||
if(new_value < initial_engines)
|
||||
var/delta = initial_engines - new_value
|
||||
var/change_per_engine = 1 //doesn't really matter should not be happening for 0 engine shuttles
|
||||
if(initial_engines > 0)
|
||||
change_per_engine = (ENGINE_COEFF_MAX - 1) / initial_engines //just linear drop to max delay
|
||||
return Clamp(1 + delta * change_per_engine,ENGINE_COEFF_MIN,ENGINE_COEFF_MAX)
|
||||
|
||||
|
||||
/obj/docking_port/mobile/proc/in_flight()
|
||||
switch(mode)
|
||||
if(SHUTTLE_CALL,SHUTTLE_RECALL)
|
||||
return TRUE
|
||||
if(SHUTTLE_IDLE,SHUTTLE_IGNITING)
|
||||
return FALSE
|
||||
else
|
||||
return FALSE // hmm
|
||||
|
||||
/obj/docking_port/mobile/emergency/in_flight()
|
||||
switch(mode)
|
||||
if(SHUTTLE_ESCAPE)
|
||||
return TRUE
|
||||
if(SHUTTLE_STRANDED,SHUTTLE_ENDGAME)
|
||||
return FALSE
|
||||
else
|
||||
return ..()
|
||||
|
||||
|
||||
#undef DOCKING_PORT_HIGHLIGHT
|
||||
|
||||
Reference in New Issue
Block a user