Reee mirror bot. Hard syncs some missed PR stuff + maps (#5951)
* maps and tgui * missed defines and helpsers * controller things * datums * game folder stuff * module things * icons * stragglers * map sync and updating wew lad
This commit is contained in:
@@ -80,7 +80,7 @@
|
||||
#define MAT_BANANIUM "$bananium"
|
||||
#define MAT_TITANIUM "$titanium"
|
||||
#define MAT_BIOMASS "$biomass"
|
||||
#define MAT_PLASTIC "$plastic"
|
||||
#define MAT_PLASTIC "$plastic" // CITADEL ADDITION
|
||||
//The amount of materials you get from a sheet of mineral like iron/diamond/glass etc
|
||||
#define MINERAL_MATERIAL_AMOUNT 2000
|
||||
//The maximum size of a stack object.
|
||||
|
||||
@@ -29,7 +29,7 @@
|
||||
#define BIOGENERATOR 32 //Uses biomass
|
||||
#define LIMBGROWER 64 //Uses synthetic flesh
|
||||
#define SMELTER 128 //uses various minerals
|
||||
#define AUTOYLATHE 256 //Uses glass/metal/Plastic
|
||||
#define AUTOYLATHE 256 //CITADEL ADDITION Uses glass/metal/Plastic CID
|
||||
//Note: More then one of these can be added to a design but imprinter and lathe designs are incompatable.
|
||||
|
||||
//Modular computer/NTNet defines
|
||||
|
||||
@@ -15,6 +15,8 @@
|
||||
var/turf/sourceT = found_turfs[1]
|
||||
if(break_if_found[sourceT.type])
|
||||
return FALSE
|
||||
if (is_type_in_typecache(sourceT.loc, GLOB.typecache_shuttle_area))
|
||||
return FALSE
|
||||
found_turfs.Cut(1, 2)
|
||||
var/dir_flags = checked_turfs[sourceT]
|
||||
for(var/dir in GLOB.alldirs)
|
||||
@@ -37,7 +39,7 @@
|
||||
var/static/blacklisted_areas = typecacheof(/area/space)
|
||||
var/list/turfs = detect_room(get_turf(creator), blacklisted_turfs)
|
||||
if(!turfs)
|
||||
to_chat(creator, "<span class='warning'>The new area must be completely airtight.</span>")
|
||||
to_chat(creator, "<span class='warning'>The new area must be completely airtight and not a part of a shuttle.</span>")
|
||||
return
|
||||
if(turfs.len > BP_MAX_ROOM_SIZE)
|
||||
to_chat(creator, "<span class='warning'>The room you're in is too big. It is [((turfs.len / BP_MAX_ROOM_SIZE)-1)*100]% larger than allowed.</span>")
|
||||
@@ -45,7 +47,7 @@
|
||||
var/list/areas = list("New Area" = /area)
|
||||
for(var/i in 1 to turfs.len)
|
||||
var/area/place = get_area(turfs[i])
|
||||
if(blacklisted_areas[place.type])
|
||||
if(blacklisted_areas[place.type] || GLOB.typecache_shuttle_area[place.type])
|
||||
continue
|
||||
if(!place.requires_power || place.noteleport || place.hidden)
|
||||
continue // No expanding powerless rooms etc
|
||||
@@ -91,4 +93,4 @@
|
||||
to_chat(creator, "<span class='notice'>You have created a new area, named [newA.name]. It is now weather proof, and constructing an APC will allow it to be powered.</span>")
|
||||
return TRUE
|
||||
|
||||
#undef BP_MAX_ROOM_SIZE
|
||||
#undef BP_MAX_ROOM_SIZE
|
||||
|
||||
@@ -144,7 +144,7 @@ GLOBAL_VAR_INIT(rollovercheck_last_timeofday, 0)
|
||||
else if(day && (!minute || !second))
|
||||
hour = " and 1 hour"
|
||||
else
|
||||
day = "[truncate ? "hour" : "1 hour"]"
|
||||
hour = "[truncate ? "hour" : "1 hour"]"
|
||||
else
|
||||
hour = null
|
||||
|
||||
|
||||
@@ -9,3 +9,4 @@ GLOBAL_LIST_INIT(typecache_living, typecacheof(/mob/living))
|
||||
|
||||
GLOBAL_LIST_INIT(typecache_machine_or_structure, typecacheof(list(/obj/machinery, /obj/structure)))
|
||||
|
||||
GLOBAL_LIST_INIT(typecache_shuttle_area, typecacheof(/area/shuttle))
|
||||
|
||||
@@ -405,7 +405,7 @@ GLOBAL_REAL(Master, /datum/controller/master) = new
|
||||
if (SS_flags & SS_NO_FIRE)
|
||||
subsystemstocheck -= SS
|
||||
continue
|
||||
if (!(SS_flags & SS_TICKER) && (SS_flags & SS_KEEP_TIMING) && SS.last_fire + (SS.wait * 0.75) > world.time)
|
||||
if ((SS_flags & (SS_TICKER|SS_KEEP_TIMING)) == SS_KEEP_TIMING && SS.last_fire + (SS.wait * 0.75) > world.time)
|
||||
continue
|
||||
SS.enqueue()
|
||||
. = 1
|
||||
|
||||
@@ -649,6 +649,7 @@ SUBSYSTEM_DEF(ticker)
|
||||
|
||||
/datum/controller/subsystem/ticker/Shutdown()
|
||||
gather_newscaster() //called here so we ensure the log is created even upon admin reboot
|
||||
save_admin_data()
|
||||
if(!round_end_sound)
|
||||
round_end_sound = pick(\
|
||||
'sound/roundend/newroundsexy.ogg',
|
||||
|
||||
@@ -647,3 +647,45 @@
|
||||
var/datum/language_holder/H = M.get_language_holder()
|
||||
H.open_language_menu(usr)
|
||||
|
||||
/datum/action/item_action/wheelys
|
||||
name = "Toggle Wheely-Heel's Wheels"
|
||||
desc = "Pops out or in your wheely-heel's wheels."
|
||||
icon_icon = 'icons/mob/actions/actions_items.dmi'
|
||||
button_icon_state = "wheelys"
|
||||
|
||||
/datum/action/item_action/kindleKicks
|
||||
name = "Activate Kindle Kicks"
|
||||
desc = "Kick you feet together, activating the lights in your Kindle Kicks."
|
||||
icon_icon = 'icons/mob/actions/actions_items.dmi'
|
||||
button_icon_state = "kindleKicks"
|
||||
|
||||
//Small sprites
|
||||
/datum/action/small_sprite
|
||||
name = "Toggle Giant Sprite"
|
||||
desc = "Others will always see you as giant"
|
||||
button_icon_state = "smallqueen"
|
||||
background_icon_state = "bg_alien"
|
||||
var/small = FALSE
|
||||
var/small_icon
|
||||
var/small_icon_state
|
||||
|
||||
/datum/action/small_sprite/queen
|
||||
small_icon = 'icons/mob/alien.dmi'
|
||||
small_icon_state = "alienq"
|
||||
|
||||
/datum/action/small_sprite/drake
|
||||
small_icon = 'icons/mob/lavaland/lavaland_monsters.dmi'
|
||||
small_icon_state = "ash_whelp"
|
||||
|
||||
/datum/action/small_sprite/Trigger()
|
||||
..()
|
||||
if(!small)
|
||||
var/image/I = image(icon = small_icon, icon_state = small_icon_state, loc = owner)
|
||||
I.override = TRUE
|
||||
I.pixel_x -= owner.pixel_x
|
||||
I.pixel_y -= owner.pixel_y
|
||||
owner.add_alt_appearance(/datum/atom_hud/alternate_appearance/basic, "smallsprite", I)
|
||||
small = TRUE
|
||||
else
|
||||
owner.remove_alt_appearance("smallsprite")
|
||||
small = FALSE
|
||||
|
||||
@@ -350,8 +350,3 @@
|
||||
/datum/material/biomass
|
||||
name = "Biomass"
|
||||
id = MAT_BIOMASS
|
||||
|
||||
/datum/material/plastic
|
||||
name = "Plastic"
|
||||
id = MAT_PLASTIC
|
||||
sheet_type = /obj/item/stack/sheet/plastic
|
||||
|
||||
@@ -46,60 +46,3 @@ BONUS
|
||||
stage_speed = 5
|
||||
transmittable = 3
|
||||
level = 3
|
||||
|
||||
/*
|
||||
//////////////////////////////////////
|
||||
|
||||
Viral aggressive metabolism
|
||||
|
||||
Reduced stealth.
|
||||
Small resistance boost.
|
||||
Increased stage speed.
|
||||
Small transmittablity boost.
|
||||
Medium Level.
|
||||
|
||||
Bonus
|
||||
The virus starts at stage 5, but after a certain time will start curing itself.
|
||||
Stages still increase naturally with stage speed.
|
||||
|
||||
//////////////////////////////////////
|
||||
*/
|
||||
|
||||
/datum/symptom/viralreverse
|
||||
|
||||
name = "Viral aggressive metabolism"
|
||||
desc = "The virus sacrifices its long term survivability to nearly instantly fully spread inside a host. \
|
||||
The virus will start at the last stage, but will eventually decay and die off by itself."
|
||||
stealth = -2
|
||||
resistance = 1
|
||||
stage_speed = 3
|
||||
transmittable = 1
|
||||
level = 3
|
||||
symptom_delay_min = 1
|
||||
symptom_delay_max = 1
|
||||
var/time_to_cure
|
||||
threshold_desc = "<b>Resistance/Stage Speed:</b> Highest between these determines the amount of time before self-curing.<br>\
|
||||
<b>Stealth 4:</b> Doubles the time before the virus self-cures."
|
||||
|
||||
/datum/symptom/viralreverse/Activate(datum/disease/advance/A)
|
||||
if(!..())
|
||||
return
|
||||
if(time_to_cure > 0)
|
||||
time_to_cure--
|
||||
else
|
||||
var/mob/living/M = A.affected_mob
|
||||
Heal(M, A)
|
||||
|
||||
/datum/symptom/viralreverse/proc/Heal(mob/living/M, datum/disease/advance/A)
|
||||
A.stage -= 1
|
||||
if(A.stage < 2)
|
||||
to_chat(M, "<span class='notice'>You suddenly feel healthy.</span>")
|
||||
A.cure()
|
||||
|
||||
/datum/symptom/viralreverse/Start(datum/disease/advance/A)
|
||||
if(!..())
|
||||
return
|
||||
A.stage = 5
|
||||
if(A.properties["stealth"] >= 4) //more time before it's cured
|
||||
power = 2
|
||||
time_to_cure = max(A.properties["resistance"], A.properties["stage_rate"]) * 10 * power
|
||||
|
||||
@@ -530,6 +530,7 @@
|
||||
/atom/movable/proc/relay_container_resist(mob/living/user, obj/O)
|
||||
return
|
||||
|
||||
|
||||
// CITADEL CHANGE - adds final_pixel_y and final_pixel_x to do_attack_animation args
|
||||
/atom/movable/proc/do_attack_animation(atom/A, visual_effect_icon, obj/item/used_item, no_effect, end_pixel_y, final_pixel_y, final_pixel_x)
|
||||
if(!no_effect && (visual_effect_icon || used_item))
|
||||
@@ -693,10 +694,18 @@
|
||||
message_admins("[src] has been moved out of bounds in [ADMIN_COORDJMP(currentturf)]. Moving it to [ADMIN_COORDJMP(targetturf)].")
|
||||
|
||||
/atom/movable/proc/in_bounds()
|
||||
. = FALSE
|
||||
var/static/list/allowed_shuttles = typecacheof(list(/area/shuttle/syndicate, /area/shuttle/escape, /area/shuttle/pod_1, /area/shuttle/pod_2, /area/shuttle/pod_3, /area/shuttle/pod_4))
|
||||
var/turf/T = get_turf(src)
|
||||
if (T && (is_centcom_level(T.z) || is_station_level(T.z) || is_transit_level(T.z)))
|
||||
. = TRUE
|
||||
if (!T)
|
||||
return FALSE
|
||||
if (is_station_level(T.z) || is_centcom_level(T.z))
|
||||
return TRUE
|
||||
if (is_transit_level(T.z))
|
||||
var/area/A = T.loc
|
||||
if (is_type_in_typecache(A, allowed_shuttles))
|
||||
return TRUE
|
||||
|
||||
return FALSE
|
||||
|
||||
|
||||
/* Language procs */
|
||||
|
||||
@@ -172,7 +172,7 @@
|
||||
/obj/machinery/button/door
|
||||
name = "door button"
|
||||
desc = "A door remote control switch."
|
||||
var/normaldoorcontrol = 0
|
||||
var/normaldoorcontrol = FALSE
|
||||
var/specialfunctions = OPEN // Bitflag, see assembly file
|
||||
|
||||
/obj/machinery/button/door/setup_device()
|
||||
|
||||
@@ -49,7 +49,9 @@
|
||||
/obj/item/toy/toy_dagger = 2,
|
||||
/obj/item/extendohand/acme = 1,
|
||||
/obj/item/hot_potato/harmless/toy = 1,
|
||||
/obj/item/card/emagfake = 1)
|
||||
/obj/item/card/emagfake = 1,
|
||||
/obj/item/clothing/shoes/wheelys = 2,
|
||||
/obj/item/clothing/shoes/kindleKicks = 2)
|
||||
|
||||
light_color = LIGHT_COLOR_GREEN
|
||||
|
||||
|
||||
@@ -50,6 +50,12 @@
|
||||
integrity_failure = 70
|
||||
damage_deflection = AIRLOCK_DAMAGE_DEFLECTION_N
|
||||
interact_open = TRUE
|
||||
autoclose = TRUE
|
||||
secondsElectrified = 0 //How many seconds remain until the door is no longer electrified. -1 if it is permanently electrified until someone fixes it.
|
||||
assemblytype = /obj/structure/door_assembly
|
||||
normalspeed = 1
|
||||
explosion_block = 1
|
||||
hud_possible = list(DIAG_AIRLOCK_HUD)
|
||||
|
||||
var/security_level = 0 //How much are wires secured
|
||||
var/aiControlDisabled = 0 //If 1, AI control is disabled until the AI hacks back in and disables the lock. If 2, the AI has bypassed the lock. If -1, the control is enabled but the AI had bypassed it earlier, so if it is disabled again the AI would have no trouble getting back in.
|
||||
@@ -58,21 +64,16 @@
|
||||
var/secondsBackupPowerLost = 0 //The number of seconds until power is restored.
|
||||
var/spawnPowerRestoreRunning = FALSE
|
||||
var/lights = TRUE // bolt lights show by default
|
||||
secondsElectrified = 0 //How many seconds remain until the door is no longer electrified. -1 if it is permanently electrified until someone fixes it.
|
||||
var/aiDisabledIdScanner = FALSE
|
||||
var/aiHacking = FALSE
|
||||
var/obj/machinery/door/airlock/closeOther = null
|
||||
var/closeOtherId = null
|
||||
var/lockdownbyai = FALSE
|
||||
assemblytype = /obj/structure/door_assembly
|
||||
var/closeOtherId //Cyclelinking for airlocks that aren't on the same x or y coord as the target.
|
||||
var/obj/machinery/door/airlock/closeOther
|
||||
var/justzap = FALSE
|
||||
normalspeed = 1
|
||||
var/obj/item/electronics/airlock/electronics = null
|
||||
var/obj/item/electronics/airlock/electronics
|
||||
var/shockCooldown = FALSE //Prevents multiple shocks from happening
|
||||
autoclose = TRUE
|
||||
var/obj/item/device/doorCharge/charge = null //If applied, causes an explosion upon opening the door
|
||||
var/obj/item/device/doorCharge/charge //If applied, causes an explosion upon opening the door
|
||||
var/obj/item/note //Any papers pinned to the airlock
|
||||
var/detonated = 0
|
||||
var/detonated = FALSE
|
||||
var/abandoned = FALSE
|
||||
var/doorOpen = 'sound/machines/airlock.ogg'
|
||||
var/doorClose = 'sound/machines/airlockclose.ogg'
|
||||
@@ -81,7 +82,7 @@
|
||||
var/boltDown = 'sound/machines/boltsdown.ogg'
|
||||
var/noPower = 'sound/machines/doorclick.ogg'
|
||||
var/previous_airlock = /obj/structure/door_assembly //what airlock assembly mineral plating was applied to
|
||||
var/airlock_material = null //material of inner filling; if its an airlock with glass, this should be set to "glass"
|
||||
var/airlock_material //material of inner filling; if its an airlock with glass, this should be set to "glass"
|
||||
var/overlays_file = 'icons/obj/doors/airlocks/station/overlays.dmi'
|
||||
var/note_overlay_file = 'icons/obj/doors/airlocks/station/overlays.dmi' //Used for papers and photos pinned to the airlock
|
||||
|
||||
@@ -90,9 +91,6 @@
|
||||
var/shuttledocked = 0
|
||||
var/delayed_close_requested = FALSE // TRUE means the door will automatically close the next time it's opened.
|
||||
|
||||
explosion_block = 1
|
||||
hud_possible = list(DIAG_AIRLOCK_HUD)
|
||||
|
||||
var/air_tight = FALSE //TRUE means density will be set as soon as the door begins to close
|
||||
var/prying_so_hard = FALSE
|
||||
|
||||
|
||||
@@ -404,7 +404,7 @@
|
||||
overlays_file = 'icons/obj/doors/airlocks/cult/runed/overlays.dmi'
|
||||
assemblytype = /obj/structure/door_assembly/door_assembly_cult
|
||||
hackProof = TRUE
|
||||
aiControlDisabled = TRUE
|
||||
aiControlDisabled = 1
|
||||
req_access = list(ACCESS_BLOODCULT)
|
||||
damage_deflection = 10
|
||||
var/openingoverlaytype = /obj/effect/temp_visual/cult/door
|
||||
@@ -511,7 +511,7 @@
|
||||
icon = 'icons/obj/doors/airlocks/clockwork/pinion_airlock.dmi'
|
||||
overlays_file = 'icons/obj/doors/airlocks/clockwork/overlays.dmi'
|
||||
hackProof = TRUE
|
||||
aiControlDisabled = TRUE
|
||||
aiControlDisabled = 1
|
||||
req_access = list(ACCESS_CLOCKCULT)
|
||||
use_power = FALSE
|
||||
resistance_flags = FIRE_PROOF | ACID_PROOF
|
||||
|
||||
@@ -28,7 +28,6 @@
|
||||
var/safe = TRUE //whether the door detects things and mobs in its way and reopen or crushes them.
|
||||
var/locked = FALSE //whether the door is bolted or not.
|
||||
var/assemblytype //the type of door frame to drop during deconstruction
|
||||
var/auto_close //TO BE REMOVED, no longer used, it's just preventing a runtime with a map var edit.
|
||||
var/datum/effect_system/spark_spread/spark_system
|
||||
var/damage_deflection = 10
|
||||
var/real_explosion_block //ignore this, just use explosion_block
|
||||
|
||||
@@ -193,11 +193,8 @@ Buildable meters
|
||||
w_class = WEIGHT_CLASS_BULKY
|
||||
var/piping_layer = PIPING_LAYER_DEFAULT
|
||||
|
||||
/obj/item/pipe_meter/attackby(obj/item/I, mob/user, params)
|
||||
..()
|
||||
obj/item/pipe_meter/wrench_act(mob/living/user, obj/item/wrench/W)
|
||||
|
||||
if (!istype(I, /obj/item/wrench))
|
||||
return ..()
|
||||
var/obj/machinery/atmospherics/pipe/pipe
|
||||
for(var/obj/machinery/atmospherics/pipe/P in loc)
|
||||
if(P.piping_layer == piping_layer)
|
||||
@@ -207,10 +204,20 @@ Buildable meters
|
||||
to_chat(user, "<span class='warning'>You need to fasten it to a pipe!</span>")
|
||||
return TRUE
|
||||
new /obj/machinery/meter(loc, piping_layer)
|
||||
I.play_tool_sound(src)
|
||||
W.play_tool_sound(src)
|
||||
to_chat(user, "<span class='notice'>You fasten the meter to the pipe.</span>")
|
||||
qdel(src)
|
||||
|
||||
obj/item/pipe_meter/screwdriver_act(mob/living/user, obj/item/S)
|
||||
if(!isturf(loc))
|
||||
to_chat(user, "<span class='warning'>You need to fasten it to the floor!</span>")
|
||||
return TRUE
|
||||
|
||||
new /obj/machinery/meter/turf(loc, piping_layer)
|
||||
S.play_tool_sound(src)
|
||||
to_chat(user, "<span class='notice'>You fasten the meter to the [loc.name].</span>")
|
||||
qdel(src)
|
||||
|
||||
/obj/item/pipe_meter/dropped()
|
||||
. = ..()
|
||||
if(loc)
|
||||
|
||||
@@ -381,7 +381,7 @@
|
||||
|
||||
if(iscyborg(sillycone))
|
||||
var/mob/living/silicon/robot/sillyconerobot = A
|
||||
if(faction == "syndicate" && sillyconerobot.emagged == 1)
|
||||
if(LAZYLEN(faction) && (ROLE_SYNDICATE in faction) && sillyconerobot.emagged == TRUE)
|
||||
continue
|
||||
|
||||
targets += sillycone
|
||||
|
||||
@@ -890,8 +890,8 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
|
||||
icon_deny = "wallmed-deny"
|
||||
density = FALSE
|
||||
products = list(/obj/item/reagent_containers/syringe = 3, /obj/item/reagent_containers/pill/patch/styptic = 5,
|
||||
/obj/item/reagent_containers/pill/patch/silver_sulf = 5, /obj/item/reagent_containers/pill/charcoal = 2,
|
||||
/obj/item/reagent_containers/medspray/sterilizine = 1)
|
||||
/obj/item/reagent_containers/pill/patch/silver_sulf = 5, /obj/item/reagent_containers/medspray/styptic = 2, /obj/item/reagent_containers/medspray/silver_sulf = 2,
|
||||
/obj/item/reagent_containers/pill/charcoal = 2, /obj/item/reagent_containers/medspray/sterilizine = 1)
|
||||
contraband = list(/obj/item/reagent_containers/pill/tox = 2, /obj/item/reagent_containers/pill/morphine = 2)
|
||||
armor = list("melee" = 100, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50)
|
||||
resistance_flags = FIRE_PROOF
|
||||
|
||||
@@ -6,9 +6,8 @@ RPD
|
||||
#define PAINT_MODE -2
|
||||
#define EATING_MODE -1
|
||||
#define ATMOS_MODE 0
|
||||
#define METER_MODE 1
|
||||
#define DISPOSALS_MODE 2
|
||||
#define TRANSIT_MODE 3
|
||||
#define DISPOSALS_MODE 1
|
||||
#define TRANSIT_MODE 2
|
||||
|
||||
|
||||
GLOBAL_LIST_INIT(atmos_pipe_recipes, list(
|
||||
@@ -318,7 +317,7 @@ GLOBAL_LIST_INIT(transit_tube_recipes, list(
|
||||
var/queued_p_flipped = p_flipped
|
||||
|
||||
// clicking on an existing component puts the new one on the same layer
|
||||
if ((mode == ATMOS_MODE || mode == METER_MODE) && istype(A, /obj/machinery/atmospherics))
|
||||
if (mode == ATMOS_MODE && istype(A, /obj/machinery/atmospherics))
|
||||
var/obj/machinery/atmospherics/AM = A
|
||||
temp_piping_layer = AM.piping_layer
|
||||
A = get_turf(user)
|
||||
@@ -352,35 +351,30 @@ GLOBAL_LIST_INIT(transit_tube_recipes, list(
|
||||
if(ATMOS_MODE) //Making pipes
|
||||
if(!can_make_pipe)
|
||||
return ..()
|
||||
to_chat(user, "<span class='notice'>You start building a pipe...</span>")
|
||||
playsound(get_turf(src), 'sound/machines/click.ogg', 50, 1)
|
||||
if(do_after(user, 2, target = A))
|
||||
activate()
|
||||
if (recipe.type == /datum/pipe_info/meter)
|
||||
to_chat(user, "<span class='notice'>You start building a meter...</span>")
|
||||
if(do_after(user, 2, target = A))
|
||||
activate()
|
||||
var/obj/item/pipe_meter/PM = new /obj/item/pipe_meter(get_turf(A))
|
||||
PM.setAttachLayer(temp_piping_layer)
|
||||
else
|
||||
to_chat(user, "<span class='notice'>You start building a pipe...</span>")
|
||||
if(do_after(user, 2, target = A))
|
||||
activate()
|
||||
var/obj/machinery/atmospherics/path = queued_p_type
|
||||
var/pipe_item_type = initial(path.construction_type) || /obj/item/pipe
|
||||
var/obj/item/pipe/P = new pipe_item_type(get_turf(A), queued_p_type, queued_p_dir)
|
||||
|
||||
var/obj/machinery/atmospherics/path = queued_p_type
|
||||
var/pipe_item_type = initial(path.construction_type) || /obj/item/pipe
|
||||
|
||||
var/obj/item/pipe/P = new pipe_item_type(get_turf(A), queued_p_type, queued_p_dir)
|
||||
|
||||
if(queued_p_flipped && istype(P, /obj/item/pipe/trinary/flippable))
|
||||
var/obj/item/pipe/trinary/flippable/F = P
|
||||
F.flipped = queued_p_flipped
|
||||
|
||||
P.update()
|
||||
P.add_fingerprint(usr)
|
||||
P.setPipingLayer(temp_piping_layer)
|
||||
P.add_atom_colour(GLOB.pipe_paint_colors[paint_color], FIXED_COLOUR_PRIORITY)
|
||||
|
||||
if(METER_MODE) //Making pipe meters
|
||||
if(!can_make_pipe)
|
||||
return ..()
|
||||
to_chat(user, "<span class='notice'>You start building a meter...</span>")
|
||||
playsound(get_turf(src), 'sound/machines/click.ogg', 50, 1)
|
||||
if(do_after(user, 2, target = A))
|
||||
activate()
|
||||
var/obj/item/pipe_meter/PM = new /obj/item/pipe_meter(get_turf(A))
|
||||
PM.setAttachLayer(temp_piping_layer)
|
||||
if(queued_p_flipped && istype(P, /obj/item/pipe/trinary/flippable))
|
||||
var/obj/item/pipe/trinary/flippable/F = P
|
||||
F.flipped = queued_p_flipped
|
||||
|
||||
P.update()
|
||||
P.add_fingerprint(usr)
|
||||
P.setPipingLayer(temp_piping_layer)
|
||||
P.add_atom_colour(GLOB.pipe_paint_colors[paint_color], FIXED_COLOUR_PRIORITY)
|
||||
|
||||
if(DISPOSALS_MODE) //Making disposals pipes
|
||||
if(!can_make_pipe)
|
||||
return ..()
|
||||
@@ -439,5 +433,4 @@ GLOBAL_LIST_INIT(transit_tube_recipes, list(
|
||||
#undef PAINT_MODE
|
||||
#undef EATING_MODE
|
||||
#undef ATMOS_MODE
|
||||
#undef METER_MODE
|
||||
#undef DISPOSALS_MODE
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
new /obj/item/storage/lockbox/medal/cargo(src)
|
||||
new /obj/item/clothing/under/rank/cargo(src)
|
||||
new /obj/item/clothing/shoes/sneakers/brown(src)
|
||||
// new /obj/item/device/radio/headset/headset_cargo(src)
|
||||
new /obj/item/device/radio/headset/headset_cargo(src)
|
||||
new /obj/item/clothing/suit/fire/firefighter(src)
|
||||
new /obj/item/clothing/gloves/fingerless(src)
|
||||
new /obj/item/device/megaphone/cargo(src)
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
var/list/tube_dirs //list of directions this tube section can connect to.
|
||||
var/exit_delay = 1
|
||||
var/enter_delay = 0
|
||||
var/const/time_to_unwrench = 2 SECONDS
|
||||
|
||||
/obj/structure/transit_tube/CanPass(atom/movable/mover, turf/target)
|
||||
if(istype(mover) && (mover.pass_flags & PASSGLASS))
|
||||
@@ -42,7 +43,7 @@
|
||||
to_chat(user, "<span class='warning'>Remove the pod first!</span>")
|
||||
return
|
||||
user.visible_message("[user] starts to deattach \the [src].", "<span class='notice'>You start to deattach the [name]...</span>")
|
||||
if(W.use_tool(src, user, 40, volume=50))
|
||||
if(W.use_tool(src, user, time_to_unwrench, volume=50))
|
||||
to_chat(user, "<span class='notice'>You deattach the [name].</span>")
|
||||
var/obj/structure/c_transit_tube/R = new tube_construction(loc)
|
||||
R.setDir(dir)
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
density = FALSE
|
||||
layer = LOW_ITEM_LAYER //same as the built tube
|
||||
anchored = FALSE
|
||||
var/const/time_to_unwrench = 2 SECONDS
|
||||
var/flipped = 0
|
||||
var/build_type = /obj/structure/transit_tube
|
||||
var/flipped_build_type
|
||||
@@ -33,7 +34,7 @@
|
||||
/obj/structure/c_transit_tube/wrench_act(mob/living/user, obj/item/I)
|
||||
to_chat(user, "<span class='notice'>You start attaching the [name]...</span>")
|
||||
add_fingerprint(user)
|
||||
if(I.use_tool(src, user, 40, volume=50))
|
||||
if(I.use_tool(src, user, time_to_unwrench, volume=50))
|
||||
to_chat(user, "<span class='notice'>You attach the [name].</span>")
|
||||
var/obj/structure/transit_tube/R = new build_type(loc, dir)
|
||||
transfer_fingerprints_to(R)
|
||||
|
||||
@@ -130,7 +130,24 @@
|
||||
return
|
||||
|
||||
if(destination_z && destination_x && destination_y)
|
||||
A.forceMove(locate(destination_x, destination_y, destination_z))
|
||||
var/tx = destination_x
|
||||
var/ty = destination_y
|
||||
var/turf/DT = locate(tx, ty, destination_z)
|
||||
var/itercount = 0
|
||||
while(DT.density || istype(DT.loc,/area/shuttle)) // Extend towards the center of the map, trying to look for a better place to arrive
|
||||
if (itercount++ >= 100)
|
||||
log_game("SPACE Z-TRANSIT ERROR: Could not not find a safe place to land [A] within 100 iterations.")
|
||||
break
|
||||
if (tx < 128)
|
||||
tx++
|
||||
else
|
||||
tx--
|
||||
if (ty < 128)
|
||||
ty++
|
||||
else
|
||||
ty--
|
||||
DT = locate(tx, ty, destination_z)
|
||||
A.forceMove(DT)
|
||||
|
||||
if(isliving(A))
|
||||
var/mob/living/L = A
|
||||
|
||||
@@ -73,7 +73,7 @@
|
||||
var/task = href_list["editrights"]
|
||||
var/skip
|
||||
if(task == "activate" || task == "deactivate")
|
||||
skip = 1
|
||||
skip = TRUE
|
||||
if(!CONFIG_GET(flag/admin_legacy_system) && CONFIG_GET(flag/protect_legacy_admins) && task == "rank")
|
||||
if(admin_ckey in GLOB.protected_admins)
|
||||
to_chat(usr, "<span class='admin prefix'>Editing the rank of this admin is blocked by server configuration.</span>")
|
||||
@@ -82,20 +82,20 @@
|
||||
if(D.rank in GLOB.protected_ranks)
|
||||
to_chat(usr, "<span class='admin prefix'>Editing the flags of this rank is blocked by server configuration.</span>")
|
||||
return
|
||||
if(check_rights(R_DBRANKS, 0))
|
||||
if(check_rights(R_DBRANKS, FALSE))
|
||||
if(!skip)
|
||||
if(!SSdbcore.Connect())
|
||||
to_chat(usr, "<span class='danger'>Unable to connect to database, changes are temporary only.</span>")
|
||||
use_db = "Temporary"
|
||||
if(!use_db)
|
||||
use_db = FALSE
|
||||
else
|
||||
use_db = alert("Permanent changes are saved to the database for future rounds, temporary changes will affect only the current round", "Permanent or Temporary?", "Permanent", "Temporary", "Cancel")
|
||||
if(use_db == "Cancel")
|
||||
return
|
||||
if(use_db == "Permanent")
|
||||
use_db = 1
|
||||
use_db = TRUE
|
||||
admin_ckey = sanitizeSQL(admin_ckey)
|
||||
else
|
||||
use_db = 0
|
||||
use_db = FALSE
|
||||
if(task != "add")
|
||||
D = GLOB.admin_datums[admin_ckey]
|
||||
if(!D)
|
||||
@@ -124,19 +124,20 @@
|
||||
edit_admin_permissions()
|
||||
|
||||
/datum/admins/proc/add_admin(use_db)
|
||||
. = sanitizeSQL(ckey(input("New admin's ckey","Admin ckey") as text|null))
|
||||
. = ckey(input("New admin's ckey","Admin ckey") as text|null)
|
||||
if(!.)
|
||||
return 0
|
||||
return FALSE
|
||||
if(. in GLOB.admin_datums+GLOB.deadmins)
|
||||
to_chat(usr, "<span class='danger'>[.] is already an admin.</span>")
|
||||
return 0
|
||||
return FALSE
|
||||
if(use_db)
|
||||
. = sanitizeSQL(.)
|
||||
var/datum/DBQuery/query_add_admin = SSdbcore.NewQuery("INSERT INTO [format_table_name("admin")] (ckey, rank) VALUES ('[.]', 'NEW ADMIN')")
|
||||
if(!query_add_admin.warn_execute())
|
||||
return 0
|
||||
return FALSE
|
||||
var/datum/DBQuery/query_add_admin_log = SSdbcore.NewQuery("INSERT INTO [format_table_name("admin_log")] (datetime, adminckey, adminip, operation, log) VALUES ('[SQLtime()]', '[sanitizeSQL(usr.ckey)]', INET_ATON('[sanitizeSQL(usr.client.address)]'), 'add admin', 'New admin added: [.]')")
|
||||
if(!query_add_admin_log.warn_execute())
|
||||
return 0
|
||||
return FALSE
|
||||
|
||||
/datum/admins/proc/remove_admin(admin_ckey, use_db, datum/admins/D)
|
||||
if(alert("Are you sure you want to remove [admin_ckey]?","Confirm Removal","Do it","Cancel") == "Do it")
|
||||
@@ -175,7 +176,7 @@
|
||||
rank_names[R.name] = R
|
||||
var/new_rank = input("Please select a rank", "New rank") as null|anything in rank_names
|
||||
if(new_rank == "*New Rank*")
|
||||
new_rank = sanitizeSQL(ckeyEx(input("Please input a new rank", "New custom rank") as text|null))
|
||||
new_rank = ckeyEx(input("Please input a new rank", "New custom rank") as text|null)
|
||||
if(!new_rank)
|
||||
return
|
||||
R = rank_names[new_rank]
|
||||
@@ -186,6 +187,7 @@
|
||||
R = new(new_rank) //blank new admin_rank
|
||||
GLOB.admin_ranks += R
|
||||
if(use_db)
|
||||
new_rank = sanitizeSQL(new_rank)
|
||||
if(!R)
|
||||
var/datum/DBQuery/query_add_rank = SSdbcore.NewQuery("INSERT INTO [format_table_name("admin_ranks")] (rank, flags, exclude_flags, can_edit_rights) VALUES ('[new_rank]', '0', '0', '0')")
|
||||
if(!query_add_rank.warn_execute())
|
||||
@@ -208,7 +210,8 @@
|
||||
if(D) //they were previously an admin
|
||||
D.disassociate() //existing admin needs to be disassociated
|
||||
D.rank = R //set the admin_rank as our rank
|
||||
D.associate()
|
||||
var/client/C = GLOB.directory[admin_ckey]
|
||||
D.associate(C)
|
||||
else
|
||||
D = new(R, admin_ckey, TRUE) //new admin
|
||||
message_admins("[key_name_admin(usr)] edited the admin rank of [admin_ckey] to [new_rank] [use_db ? "permanently" : "temporarily"]")
|
||||
|
||||
@@ -96,6 +96,17 @@ the new instance inside the host to be updated to the template's stats.
|
||||
if(adapt_ready > 0)
|
||||
stat("Adaptation Ready: [round(adapt_ready/10, 0.1)]s")
|
||||
|
||||
|
||||
/mob/camera/disease/examine(mob/user)
|
||||
..()
|
||||
if(isobserver(user))
|
||||
to_chat(user, "<span class='notice'>[src] has [points]/[total_points] adaptation points.</span>")
|
||||
to_chat(user, "<span class='notice'>[src] has the following unlocked:</span>")
|
||||
for(var/A in purchased_abilities)
|
||||
var/datum/disease_ability/B = A
|
||||
if(istype(B))
|
||||
to_chat(user, "<span class='notice'>[B.name]</span>")
|
||||
|
||||
/mob/camera/disease/say(message)
|
||||
return
|
||||
|
||||
|
||||
@@ -86,5 +86,6 @@ GLOBAL_LIST_EMPTY(jam_on_wardec)
|
||||
return TRUE
|
||||
|
||||
#undef CHALLENGE_TELECRYSTALS
|
||||
#undef CHALLENGE_TIME_LIMIT
|
||||
#undef CHALLENGE_MIN_PLAYERS
|
||||
#undef CHALLENGE_SHUTTLE_DELAY
|
||||
|
||||
@@ -137,6 +137,9 @@
|
||||
/datum/gas/pluoxium = new/datum/tlv(-1, -1, 135, 140) // Partial pressure, kpa
|
||||
)
|
||||
|
||||
/obj/machinery/airalarm/unlocked
|
||||
locked = FALSE
|
||||
|
||||
/obj/machinery/airalarm/engine
|
||||
name = "engine air alarm"
|
||||
locked = FALSE
|
||||
|
||||
@@ -253,3 +253,68 @@
|
||||
/obj/item/clothing/shoes/bronze/Initialize()
|
||||
. = ..()
|
||||
AddComponent(/datum/component/squeak, list('sound/machines/clockcult/integration_cog_install.ogg' = 1, 'sound/magic/clockwork/fellowship_armory.ogg' = 1), 50)
|
||||
|
||||
/obj/item/clothing/shoes/wheelys
|
||||
name = "Wheely-Heels"
|
||||
desc = "Uses patented retractable wheel technology. Never sacrifice speed for style - not that this provides much of either." //Thanks Fel
|
||||
icon_state = "wheelys"
|
||||
item_state = "wheelys"
|
||||
actions_types = list(/datum/action/item_action/wheelys)
|
||||
var/wheelToggle = FALSE //False means wheels are not popped out
|
||||
var/obj/vehicle/ridden/scooter/wheelys/W
|
||||
|
||||
/obj/item/clothing/shoes/wheelys/Initialize()
|
||||
. = ..()
|
||||
W = new /obj/vehicle/ridden/scooter/wheelys(null)
|
||||
|
||||
/obj/item/clothing/shoes/wheelys/ui_action_click(mob/user, action)
|
||||
if(!isliving(user))
|
||||
return
|
||||
if(!istype(user.get_item_by_slot(slot_shoes), /obj/item/clothing/shoes/wheelys))
|
||||
to_chat(user, "<span class='warning'>You must be wearing the wheely-heels to use them!</span>")
|
||||
return
|
||||
if(!(W.is_occupant(user)))
|
||||
wheelToggle = FALSE
|
||||
if(wheelToggle)
|
||||
W.unbuckle_mob(user)
|
||||
wheelToggle = FALSE
|
||||
return
|
||||
W.forceMove(get_turf(user))
|
||||
W.buckle_mob(user)
|
||||
wheelToggle = TRUE
|
||||
|
||||
/obj/item/clothing/shoes/wheelys/dropped(mob/user)
|
||||
if(wheelToggle)
|
||||
W.unbuckle_mob(user)
|
||||
wheelToggle = FALSE
|
||||
..()
|
||||
|
||||
/obj/item/clothing/shoes/wheelys/Destroy()
|
||||
QDEL_NULL(W)
|
||||
. = ..()
|
||||
|
||||
/obj/item/clothing/shoes/kindleKicks
|
||||
name = "Kindle Kicks"
|
||||
desc = "They'll sure kindle something in you, and it's not childhood nostalgia..."
|
||||
icon_state = "kindleKicks"
|
||||
item_state = "kindleKicks"
|
||||
actions_types = list(/datum/action/item_action/kindleKicks)
|
||||
var/lightCycle = 0
|
||||
var/active = FALSE
|
||||
|
||||
/obj/item/clothing/shoes/kindleKicks/ui_action_click(mob/user, action)
|
||||
if(active)
|
||||
return
|
||||
active = TRUE
|
||||
set_light(2, 3, rgb(rand(0,255),rand(0,255),rand(0,255)))
|
||||
addtimer(CALLBACK(src, .proc/lightUp), 5)
|
||||
|
||||
/obj/item/clothing/shoes/kindleKicks/proc/lightUp(mob/user)
|
||||
if(lightCycle < 15)
|
||||
set_light(2, 3, rgb(rand(0,255),rand(0,255),rand(0,255)))
|
||||
lightCycle += 1
|
||||
addtimer(CALLBACK(src, .proc/lightUp), 5)
|
||||
else
|
||||
set_light(0)
|
||||
lightCycle = 0
|
||||
active = FALSE
|
||||
@@ -144,9 +144,11 @@ interface with the mining shuttle at the landing site if a mobile beacon is also
|
||||
return
|
||||
if(!no_restrictions)
|
||||
var/static/list/disallowed_turf_types = typecacheof(list(
|
||||
/turf/closed,
|
||||
/turf/open/lava,
|
||||
/turf/closed/indestructible,
|
||||
/turf/open/indestructible,
|
||||
)) - typecacheof(list(
|
||||
/turf/closed/mineral,
|
||||
))
|
||||
|
||||
if(!is_mining_level(T.z))
|
||||
@@ -231,7 +233,7 @@ interface with the mining shuttle at the landing site if a mobile beacon is also
|
||||
if(BAD_COORDS)
|
||||
to_chat(user, "<span class='warning'>Location is too close to the edge of the station's scanning range. Move several paces away and try again.</span>")
|
||||
if(BAD_TURF)
|
||||
to_chat(user, "<span class='warning'>The landing zone contains turfs unsuitable for a base.</span>")
|
||||
to_chat(user, "<span class='warning'>The landing zone contains turfs unsuitable for a base. Make sure you've removed all walls and dangerous terrain from the landing zone.</span>")
|
||||
|
||||
/obj/item/device/assault_pod/mining/unrestricted
|
||||
name = "omni-locational landing field designator"
|
||||
@@ -248,6 +250,13 @@ interface with the mining shuttle at the landing site if a mobile beacon is also
|
||||
width = 9
|
||||
height = 9
|
||||
|
||||
/obj/docking_port/mobile/auxillary_base/takeoff(list/old_turfs, list/new_turfs, list/moved_atoms, rotation, movement_direction, old_dock, area/underlying_old_area)
|
||||
for(var/i in new_turfs)
|
||||
var/turf/place = i
|
||||
if(istype(place, /turf/closed/mineral))
|
||||
place.ScrapeAway()
|
||||
return ..()
|
||||
|
||||
obj/docking_port/stationary/public_mining_dock
|
||||
name = "public mining base dock"
|
||||
id = "disabled" //The Aux Base has to leave before this can be used as a dock.
|
||||
|
||||
@@ -22,27 +22,7 @@
|
||||
maxHealth = 400
|
||||
health = 400
|
||||
icon_state = "alienq"
|
||||
var/datum/action/small_sprite/smallsprite = new/datum/action/small_sprite()
|
||||
|
||||
/datum/action/small_sprite
|
||||
name = "Toggle Giant Sprite - Others will always see you as giant"
|
||||
button_icon_state = "smallqueen"
|
||||
background_icon_state = "bg_alien"
|
||||
var/small = 0
|
||||
|
||||
/datum/action/small_sprite/Trigger()
|
||||
..()
|
||||
if(!small)
|
||||
var/image/I = image(icon = 'icons/mob/alien.dmi' , icon_state = "alienq", loc = owner)
|
||||
I.override = 1
|
||||
I.pixel_x -= owner.pixel_x
|
||||
I.pixel_y -= owner.pixel_y
|
||||
owner.add_alt_appearance(/datum/atom_hud/alternate_appearance/basic, "smallqueen", I)
|
||||
|
||||
small = 1
|
||||
else
|
||||
owner.remove_alt_appearance("smallqueen")
|
||||
small = 0
|
||||
var/datum/action/small_sprite/smallsprite = new/datum/action/small_sprite/queen()
|
||||
|
||||
/mob/living/carbon/alien/humanoid/royal/queen/Initialize()
|
||||
//there should only be one queen
|
||||
|
||||
@@ -163,10 +163,10 @@
|
||||
for(var/turf in obscuredTurfs)
|
||||
var/turf/t = turf
|
||||
if(!t.obscured)
|
||||
t.obscured = image('icons/effects/cameravis.dmi', t, null, LIGHTING_LAYER+1)
|
||||
t.obscured = image('icons/effects/cameravis.dmi', t, null, BYOND_LIGHTING_LAYER+0.1)
|
||||
t.obscured.pixel_x = -t.pixel_x
|
||||
t.obscured.pixel_y = -t.pixel_y
|
||||
t.obscured.plane = LIGHTING_PLANE+1
|
||||
t.obscured.plane = BYOND_LIGHTING_PLANE+0.1
|
||||
obscured += t.obscured
|
||||
|
||||
#undef UPDATE_BUFFER
|
||||
|
||||
@@ -38,11 +38,11 @@ Difficulty: Medium
|
||||
spacewalk = TRUE
|
||||
attacktext = "chomps"
|
||||
attack_sound = 'sound/magic/demon_attack1.ogg'
|
||||
icon = 'icons/mob/lavaland/64x64megafauna.dmi'
|
||||
icon_state = "dragon"
|
||||
icon_living = "dragon"
|
||||
icon_dead = "dragon_dead"
|
||||
friendly = "stares down"
|
||||
icon = 'icons/mob/lavaland/64x64megafauna.dmi'
|
||||
speak_emote = list("roars")
|
||||
armour_penetration = 40
|
||||
melee_damage_lower = 40
|
||||
@@ -61,8 +61,10 @@ Difficulty: Medium
|
||||
score_type = DRAKE_SCORE
|
||||
deathmessage = "collapses into a pile of bones, its flesh sloughing away."
|
||||
death_sound = 'sound/magic/demon_dies.ogg'
|
||||
var/datum/action/small_sprite/smallsprite = new/datum/action/small_sprite/drake()
|
||||
|
||||
/mob/living/simple_animal/hostile/megafauna/dragon/Initialize()
|
||||
smallsprite.Grant(src)
|
||||
. = ..()
|
||||
internal = new/obj/item/device/gps/internal/dragon(src)
|
||||
|
||||
@@ -380,6 +382,7 @@ Difficulty: Medium
|
||||
obj_damage = 80
|
||||
melee_damage_upper = 30
|
||||
melee_damage_lower = 30
|
||||
mouse_opacity = MOUSE_OPACITY_ICON
|
||||
damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1)
|
||||
loot = list()
|
||||
crusher_loot = list()
|
||||
|
||||
@@ -96,6 +96,9 @@
|
||||
var/update_overlay = -1
|
||||
var/icon_update_needed = FALSE
|
||||
|
||||
/obj/machinery/power/apc/unlocked
|
||||
locked = FALSE
|
||||
|
||||
/obj/machinery/power/apc/highcap/five_k
|
||||
cell_type = /obj/item/stock_parts/cell/upgraded/plus
|
||||
|
||||
|
||||
@@ -132,9 +132,9 @@
|
||||
icon_state = "rpcoil[anchored]"
|
||||
|
||||
/obj/machinery/power/tesla_coil/research/attackby(obj/item/W, mob/user, params)
|
||||
. = ..()
|
||||
if(default_deconstruction_screwdriver(user, "rpcoil_open[anchored]", "rpcoil[anchored]", W))
|
||||
return
|
||||
return ..()
|
||||
|
||||
/obj/machinery/power/grounding_rod
|
||||
name = "grounding rod"
|
||||
|
||||
@@ -316,7 +316,7 @@
|
||||
to_chat(user, "<span class='warning'>You feel yourself radically changing your slime type...</span>")
|
||||
if(do_after(user, 120, target = user))
|
||||
to_chat(user, "<span class='warning'>You feel different!</span>")
|
||||
user.set_species(/datum/species/jelly/slime)
|
||||
user.set_species(pick(/datum/species/jelly/slime, /datum/species/jelly/stargazer))
|
||||
return
|
||||
to_chat(user, "<span class='notice'>You stop the transformation.</span>")
|
||||
|
||||
@@ -870,8 +870,9 @@
|
||||
force = 6
|
||||
materials = list(MAT_METAL=500)
|
||||
throwforce = 10
|
||||
throw_speed = 3
|
||||
throw_range = 7
|
||||
throw_speed = 0.1
|
||||
throw_range = 28
|
||||
glide_size = 2
|
||||
flags_1 = CONDUCT_1
|
||||
max_amount = 60
|
||||
turf_type = /turf/open/floor/sepia
|
||||
|
||||
@@ -150,6 +150,7 @@
|
||||
log_game("[key_name(user)] has emagged the emergency shuttle in \
|
||||
[COORD(src)] [time] seconds before launch.")
|
||||
obj_flags |= EMAGGED
|
||||
SSshuttle.emergency.movement_force = list("KNOCKDOWN" = 60, "THROW" = 20)//YOUR PUNY SEATBELTS can SAVE YOU NOW, MORTAL
|
||||
var/datum/species/S = new
|
||||
for(var/i in 1 to 10)
|
||||
// the shuttle system doesn't know who these people are, but they
|
||||
|
||||
@@ -146,3 +146,44 @@
|
||||
qdel(src)
|
||||
return TRUE
|
||||
|
||||
//Wheelys
|
||||
/obj/vehicle/ridden/scooter/wheelys
|
||||
name = "Wheely-Heels"
|
||||
desc = "Uses patented retractable wheel technology. Never sacrifice speed for style - not that this provides much of either."
|
||||
icon = null
|
||||
density = FALSE
|
||||
|
||||
/obj/vehicle/ridden/scooter/wheelys/Initialize()
|
||||
. = ..()
|
||||
var/datum/component/riding/D = LoadComponent(/datum/component/riding)
|
||||
D.vehicle_move_delay = 0
|
||||
D.set_vehicle_dir_layer(SOUTH, ABOVE_MOB_LAYER)
|
||||
D.set_vehicle_dir_layer(NORTH, OBJ_LAYER)
|
||||
D.set_vehicle_dir_layer(EAST, OBJ_LAYER)
|
||||
D.set_vehicle_dir_layer(WEST, OBJ_LAYER)
|
||||
|
||||
/obj/vehicle/ridden/scooter/wheelys/post_unbuckle_mob(mob/living/M)
|
||||
if(!has_buckled_mobs())
|
||||
to_chat(M, "<span class='notice'>You pop the Wheely-Heel's wheels back into place.</span>")
|
||||
moveToNullspace()
|
||||
return ..()
|
||||
|
||||
/obj/vehicle/ridden/scooter/wheelys/post_buckle_mob(mob/living/M)
|
||||
to_chat(M, "<span class='notice'>You pop out the Wheely-Heel's wheels.</span>")
|
||||
return ..()
|
||||
|
||||
/obj/vehicle/ridden/scooter/wheelys/Collide(atom/A)
|
||||
. = ..()
|
||||
if(A.density && has_buckled_mobs())
|
||||
var/mob/living/H = buckled_mobs[1]
|
||||
var/atom/throw_target = get_edge_target_turf(H, pick(GLOB.cardinals))
|
||||
unbuckle_mob(H)
|
||||
H.throw_at(throw_target, 4, 3)
|
||||
H.Knockdown(30)
|
||||
H.adjustStaminaLoss(10)
|
||||
var/head_slot = H.get_item_by_slot(slot_head)
|
||||
if(!head_slot || !(istype(head_slot,/obj/item/clothing/head/helmet) || istype(head_slot,/obj/item/clothing/head/hardhat)))
|
||||
H.adjustBrainLoss(1)
|
||||
H.updatehealth()
|
||||
visible_message("<span class='danger'>[src] crashes into [A], sending [H] flying!</span>")
|
||||
playsound(src, 'sound/effects/bang.ogg', 50, 1)
|
||||
Reference in New Issue
Block a user