mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2025-12-09 16:12:17 +00:00
Merge remote-tracking branch 'upstream/master'
This commit is contained in:
@@ -289,3 +289,17 @@ var/global/list/##LIST_NAME = list();\
|
||||
#define IS_CROWBAR "crowbar"
|
||||
#define IS_WIRECUTTER "wirecutter"
|
||||
#define IS_WRENCH "wrench"
|
||||
|
||||
// RCD modes. Used on the RCD, and gets passed to an object's rcd_act() when an RCD is used on it, to determine what happens.
|
||||
#define RCD_FLOORWALL "Floor / Wall" // Builds plating on space/ground/open tiles. Builds a wall when on floors. Finishes walls when used on girders.
|
||||
#define RCD_AIRLOCK "Airlock" // Builds an airlock on the tile if one isn't already there.
|
||||
#define RCD_WINDOWGRILLE "Window / Grille" // Builds a full tile window and grille pair on floors.
|
||||
#define RCD_DECONSTRUCT "Deconstruction" // Removes various things. Still consumes compressed matter.
|
||||
|
||||
#define RCD_VALUE_MODE "mode"
|
||||
#define RCD_VALUE_DELAY "delay"
|
||||
#define RCD_VALUE_COST "cost"
|
||||
|
||||
|
||||
#define RCD_SHEETS_PER_MATTER_UNIT 4 // Each physical material sheet is worth four matter units.
|
||||
#define RCD_MAX_CAPACITY 30 * RCD_SHEETS_PER_MATTER_UNIT
|
||||
@@ -15,6 +15,7 @@
|
||||
bar = image('icons/effects/progessbar.dmi', target, "prog_bar_0")
|
||||
bar.appearance_flags = APPEARANCE_UI_IGNORE_ALPHA
|
||||
bar.pixel_y = 32
|
||||
bar.plane = PLANE_PLAYER_HUD
|
||||
src.user = user
|
||||
if(user)
|
||||
client = user.client
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/datum/supply_pack/munitions/expeditionguns
|
||||
name = "Frontier phaser (station-locked) crate"
|
||||
contains = list(
|
||||
/obj/item/weapon/gun/energy/frontier/locked/basic = 2,
|
||||
/obj/item/weapon/gun/energy/frontier/locked = 2,
|
||||
/obj/item/weapon/gun/energy/frontier/locked/holdout = 1,
|
||||
)
|
||||
cost = 35
|
||||
|
||||
@@ -209,6 +209,16 @@
|
||||
/atom/proc/fire_act()
|
||||
return
|
||||
|
||||
|
||||
// Returns an assoc list of RCD information.
|
||||
// Example would be: list(RCD_VALUE_MODE = RCD_DECONSTRUCT, RCD_VALUE_DELAY = 50, RCD_VALUE_COST = RCD_SHEETS_PER_MATTER_UNIT * 4)
|
||||
// This occurs before rcd_act() is called, and it won't be called if it returns FALSE.
|
||||
/atom/proc/rcd_values(mob/living/user, obj/item/weapon/rcd/the_rcd, passed_mode)
|
||||
return FALSE
|
||||
|
||||
/atom/proc/rcd_act(mob/living/user, obj/item/weapon/rcd/the_rcd, passed_mode)
|
||||
return
|
||||
|
||||
/atom/proc/melt()
|
||||
return
|
||||
|
||||
|
||||
@@ -1260,3 +1260,24 @@ About the new airlock wires panel:
|
||||
src.open()
|
||||
src.lock()
|
||||
return
|
||||
|
||||
|
||||
/obj/machinery/door/airlock/rcd_values(mob/living/user, obj/item/weapon/rcd/the_rcd, passed_mode)
|
||||
switch(passed_mode)
|
||||
if(RCD_DECONSTRUCT)
|
||||
// Old RCD code made it cost 10 units to decon an airlock.
|
||||
// Now the new one costs ten "sheets".
|
||||
return list(
|
||||
RCD_VALUE_MODE = RCD_DECONSTRUCT,
|
||||
RCD_VALUE_DELAY = 5 SECONDS,
|
||||
RCD_VALUE_COST = RCD_SHEETS_PER_MATTER_UNIT * 10
|
||||
)
|
||||
return FALSE
|
||||
|
||||
/obj/machinery/door/airlock/rcd_act(mob/living/user, obj/item/weapon/rcd/the_rcd, passed_mode)
|
||||
switch(passed_mode)
|
||||
if(RCD_DECONSTRUCT)
|
||||
to_chat(user, span("notice", "You deconstruct \the [src]."))
|
||||
qdel(src)
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
@@ -18,47 +18,12 @@
|
||||
SPECIES_ZORREN_HIGH
|
||||
)
|
||||
|
||||
/obj/machinery/suit_cycler/explorer
|
||||
name = "Explorer suit cycler"
|
||||
model_text = "Exploration"
|
||||
// Old Exploration is too WIP to use right now
|
||||
/obj/machinery/suit_cycler/exploration
|
||||
req_access = list(access_explorer)
|
||||
departments = list("Exploration")
|
||||
|
||||
// Pilot Blue is still missing a few sprites on polaris end
|
||||
/obj/machinery/suit_cycler/pilot
|
||||
req_access = list(access_pilot)
|
||||
departments = list("Exploration","Pilot")
|
||||
|
||||
/obj/machinery/suit_cycler/explorer/initialize()
|
||||
species -= SPECIES_TESHARI
|
||||
return ..()
|
||||
|
||||
/obj/machinery/suit_cycler/apply_paintjob()
|
||||
if(!target_species || !target_department)
|
||||
return
|
||||
|
||||
if(target_species)
|
||||
if(helmet) helmet.refit_for_species(target_species)
|
||||
if(suit) suit.refit_for_species(target_species)
|
||||
|
||||
switch(target_department)
|
||||
if("Exploration")
|
||||
if(helmet)
|
||||
helmet.name = "exploration voidsuit helmet"
|
||||
helmet.icon_state = "helm_explorer"
|
||||
helmet.item_state = "helm_explorer"
|
||||
if(suit)
|
||||
suit.name = "exploration voidsuit"
|
||||
suit.icon_state = "void_explorer"
|
||||
suit.item_state = "void_explorer"
|
||||
suit.item_state_slots[slot_r_hand_str] = "wiz_voidsuit"
|
||||
suit.item_state_slots[slot_l_hand_str] = "wiz_voidsuit"
|
||||
if("Pilot")
|
||||
if(helmet)
|
||||
helmet.name = "pilot voidsuit helmet"
|
||||
helmet.icon_state = "rig0_pilot"
|
||||
helmet.item_state = "pilot_helm"
|
||||
if(suit)
|
||||
suit.name = "pilot voidsuit"
|
||||
suit.icon_state = "rig-pilot"
|
||||
suit.item_state = "rig-pilot"
|
||||
suit.item_state_slots[slot_r_hand_str] = "sec_voidsuitTG"
|
||||
suit.item_state_slots[slot_l_hand_str] = "sec_voidsuitTG"
|
||||
else
|
||||
return ..()
|
||||
|
||||
departments = list("Pilot")
|
||||
|
||||
@@ -244,100 +244,43 @@
|
||||
equip_cooldown = 10
|
||||
energy_drain = 250
|
||||
range = MELEE|RANGED
|
||||
var/mode = 0 //0 - deconstruct, 1 - wall or floor, 2 - airlock.
|
||||
var/disabled = 0 //malf
|
||||
|
||||
equip_type = EQUIP_SPECIAL
|
||||
var/obj/item/weapon/rcd/electric/mounted/mecha/my_rcd = null
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/rcd/initialize()
|
||||
my_rcd = new(src)
|
||||
return ..()
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/rcd/Destroy()
|
||||
QDEL_NULL(my_rcd)
|
||||
return ..()
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/rcd/action(atom/target)
|
||||
if(istype(target,/area/shuttle)||istype(target, /turf/space/transit))//>implying these are ever made -Sieve
|
||||
disabled = 1
|
||||
else
|
||||
disabled = 0
|
||||
if(!istype(target, /turf) && !istype(target, /obj/machinery/door/airlock))
|
||||
target = get_turf(target)
|
||||
if(!action_checks(target) || disabled || get_dist(chassis, target)>3) return
|
||||
playsound(chassis, 'sound/machines/click.ogg', 50, 1)
|
||||
//meh
|
||||
switch(mode)
|
||||
if(0)
|
||||
if (istype(target, /turf/simulated/wall))
|
||||
occupant_message("Deconstructing [target]...")
|
||||
set_ready_state(0)
|
||||
if(do_after_cooldown(target))
|
||||
if(disabled) return
|
||||
chassis.spark_system.start()
|
||||
target:ChangeTurf(/turf/simulated/floor/plating)
|
||||
playsound(target, 'sound/items/Deconstruct.ogg', 50, 1)
|
||||
chassis.use_power(energy_drain)
|
||||
else if (istype(target, /turf/simulated/floor))
|
||||
occupant_message("Deconstructing [target]...")
|
||||
set_ready_state(0)
|
||||
if(do_after_cooldown(target))
|
||||
if(disabled) return
|
||||
chassis.spark_system.start()
|
||||
target:ChangeTurf(get_base_turf_by_area(target))
|
||||
playsound(target, 'sound/items/Deconstruct.ogg', 50, 1)
|
||||
chassis.use_power(energy_drain)
|
||||
else if (istype(target, /obj/machinery/door/airlock))
|
||||
occupant_message("Deconstructing [target]...")
|
||||
set_ready_state(0)
|
||||
if(do_after_cooldown(target))
|
||||
if(disabled) return
|
||||
chassis.spark_system.start()
|
||||
qdel(target)
|
||||
playsound(target, 'sound/items/Deconstruct.ogg', 50, 1)
|
||||
chassis.use_power(energy_drain)
|
||||
if(1)
|
||||
if(istype(target, /turf/space) || istype(target,get_base_turf_by_area(target)))
|
||||
occupant_message("Building Floor...")
|
||||
set_ready_state(0)
|
||||
if(do_after_cooldown(target))
|
||||
if(disabled) return
|
||||
target:ChangeTurf(/turf/simulated/floor/plating)
|
||||
playsound(target, 'sound/items/Deconstruct.ogg', 50, 1)
|
||||
chassis.spark_system.start()
|
||||
chassis.use_power(energy_drain*2)
|
||||
else if(istype(target, /turf/simulated/floor))
|
||||
occupant_message("Building Wall...")
|
||||
set_ready_state(0)
|
||||
if(do_after_cooldown(target))
|
||||
if(disabled) return
|
||||
target:ChangeTurf(/turf/simulated/wall)
|
||||
playsound(target, 'sound/items/Deconstruct.ogg', 50, 1)
|
||||
chassis.spark_system.start()
|
||||
chassis.use_power(energy_drain*2)
|
||||
if(2)
|
||||
if(istype(target, /turf/simulated/floor))
|
||||
occupant_message("Building Airlock...")
|
||||
set_ready_state(0)
|
||||
if(do_after_cooldown(target))
|
||||
if(disabled) return
|
||||
chassis.spark_system.start()
|
||||
var/obj/machinery/door/airlock/T = new /obj/machinery/door/airlock(target)
|
||||
T.autoclose = 1
|
||||
playsound(target, 'sound/items/Deconstruct.ogg', 50, 1)
|
||||
playsound(target, 'sound/effects/sparks2.ogg', 50, 1)
|
||||
chassis.use_power(energy_drain*2)
|
||||
return
|
||||
if(!action_checks(target) || get_dist(chassis, target) > 3)
|
||||
return FALSE
|
||||
|
||||
my_rcd.use_rcd(target, chassis.occupant)
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/rcd/Topic(href,href_list)
|
||||
..()
|
||||
if(href_list["mode"])
|
||||
mode = text2num(href_list["mode"])
|
||||
switch(mode)
|
||||
if(0)
|
||||
occupant_message("Switched RCD to Deconstruct.")
|
||||
if(1)
|
||||
occupant_message("Switched RCD to Construct.")
|
||||
if(2)
|
||||
occupant_message("Switched RCD to Construct Airlock.")
|
||||
return
|
||||
|
||||
my_rcd.mode_index = text2num(href_list["mode"])
|
||||
occupant_message("RCD reconfigured to '[my_rcd.modes[my_rcd.mode_index]]'.")
|
||||
/*
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/rcd/get_equip_info()
|
||||
return "[..()] \[<a href='?src=\ref[src];mode=0'>D</a>|<a href='?src=\ref[src];mode=1'>C</a>|<a href='?src=\ref[src];mode=2'>A</a>\]"
|
||||
*/
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/rcd/get_equip_info()
|
||||
var/list/content = list(..()) // This is all for one line, in the interest of string tree conservation.
|
||||
var/i = 1
|
||||
content += "<br>"
|
||||
for(var/mode in my_rcd.modes)
|
||||
content += " <a href='?src=\ref[src];mode=[i]'>[mode]</a>"
|
||||
if(i < my_rcd.modes.len)
|
||||
content += "<br>"
|
||||
i++
|
||||
|
||||
|
||||
return content.Join()
|
||||
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/teleporter
|
||||
|
||||
@@ -769,6 +769,7 @@ var/global/list/default_medbay_channels = list(
|
||||
icon_state = "red_phone"
|
||||
listening = 1
|
||||
name = "phone"
|
||||
anchored = FALSE
|
||||
|
||||
/obj/item/device/radio/phone/medbay
|
||||
frequency = MED_I_FREQ
|
||||
|
||||
@@ -1,167 +1,291 @@
|
||||
//Contains the rapid construction device.
|
||||
// Contains the rapid construction device.
|
||||
/obj/item/weapon/rcd
|
||||
name = "rapid construction device"
|
||||
desc = "A device used to rapidly build walls and floors."
|
||||
icon = 'icons/obj/items.dmi'
|
||||
desc = "A device used to rapidly build and deconstruct. Reload with compressed matter cartridges."
|
||||
icon = 'icons/obj/tools.dmi'
|
||||
icon_state = "rcd"
|
||||
opacity = 0
|
||||
density = 0
|
||||
anchored = 0.0
|
||||
flags = CONDUCT
|
||||
force = 10.0
|
||||
throwforce = 10.0
|
||||
item_state = "rcd"
|
||||
flags = CONDUCT | NOBLUDGEON
|
||||
force = 10
|
||||
throwforce = 10
|
||||
throw_speed = 1
|
||||
throw_range = 5
|
||||
w_class = ITEMSIZE_NORMAL
|
||||
origin_tech = list(TECH_ENGINEERING = 4, TECH_MATERIAL = 2)
|
||||
matter = list(DEFAULT_WALL_MATERIAL = 50000)
|
||||
preserve_item = 1
|
||||
preserve_item = TRUE // RCDs are pretty important.
|
||||
var/datum/effect/effect/system/spark_spread/spark_system
|
||||
var/stored_matter = 0
|
||||
var/max_stored_matter = 30
|
||||
var/working = 0
|
||||
var/mode = 1
|
||||
var/list/modes = list("Floor & Walls","Airlock","Deconstruct")
|
||||
var/canRwall = 0
|
||||
var/disabled = 0
|
||||
var/max_stored_matter = RCD_MAX_CAPACITY
|
||||
var/ranged = FALSE
|
||||
var/busy = FALSE
|
||||
var/allow_concurrent_building = FALSE // If true, allows for multiple RCD builds at the same time.
|
||||
var/mode_index = 1
|
||||
var/list/modes = list(RCD_FLOORWALL, RCD_AIRLOCK, RCD_WINDOWGRILLE, RCD_DECONSTRUCT)
|
||||
var/can_remove_rwalls = FALSE
|
||||
var/airlock_type = /obj/machinery/door/airlock
|
||||
var/window_type = /obj/structure/window/reinforced/full
|
||||
var/material_to_use = DEFAULT_WALL_MATERIAL // So badmins can make RCDs that print diamond walls.
|
||||
var/make_rwalls = FALSE // If true, when building walls, they will be reinforced.
|
||||
|
||||
/obj/item/weapon/rcd/attack()
|
||||
return 0
|
||||
|
||||
/obj/item/weapon/rcd/proc/can_use(var/mob/user,var/turf/T)
|
||||
var/usable = 0
|
||||
if(user.Adjacent(T) && user.get_active_hand() == src && !user.stat && !user.restrained())
|
||||
usable = 1
|
||||
if(!user.IsAdvancedToolUser() && istype(user, /mob/living/simple_animal))
|
||||
var/mob/living/simple_animal/S = user
|
||||
if(!S.IsHumanoidToolUser(src))
|
||||
usable = 0
|
||||
return usable
|
||||
|
||||
/obj/item/weapon/rcd/examine()
|
||||
..()
|
||||
if(src.type == /obj/item/weapon/rcd && loc == usr)
|
||||
usr << "It currently holds [stored_matter]/[max_stored_matter] matter-units."
|
||||
|
||||
/obj/item/weapon/rcd/New()
|
||||
..()
|
||||
/obj/item/weapon/rcd/initialize()
|
||||
src.spark_system = new /datum/effect/effect/system/spark_spread
|
||||
spark_system.set_up(5, 0, src)
|
||||
spark_system.attach(src)
|
||||
return ..()
|
||||
|
||||
/obj/item/weapon/rcd/Destroy()
|
||||
qdel(spark_system)
|
||||
QDEL_NULL(spark_system)
|
||||
spark_system = null
|
||||
return ..()
|
||||
|
||||
/obj/item/weapon/rcd/attackby(obj/item/weapon/W, mob/user)
|
||||
/obj/item/weapon/rcd/examine(mob/user)
|
||||
..()
|
||||
to_chat(user, display_resources())
|
||||
|
||||
// Used to show how much stuff (matter units, cell charge, etc) is left inside.
|
||||
/obj/item/weapon/rcd/proc/display_resources()
|
||||
return "It currently holds [stored_matter]/[max_stored_matter] matter-units."
|
||||
|
||||
// Used to add new cartridges.
|
||||
/obj/item/weapon/rcd/attackby(obj/item/weapon/W, mob/user)
|
||||
if(istype(W, /obj/item/weapon/rcd_ammo))
|
||||
var/obj/item/weapon/rcd_ammo/cartridge = W
|
||||
if((stored_matter + cartridge.remaining) > max_stored_matter)
|
||||
to_chat(user, "<span class='notice'>The RCD can't hold that many additional matter-units.</span>")
|
||||
return
|
||||
to_chat(user, span("warning", "The RCD can't hold that many additional matter-units."))
|
||||
return FALSE
|
||||
stored_matter += cartridge.remaining
|
||||
user.drop_from_inventory(W)
|
||||
qdel(W)
|
||||
playsound(src.loc, 'sound/machines/click.ogg', 50, 1)
|
||||
to_chat(user, "<span class='notice'>The RCD now holds [stored_matter]/[max_stored_matter] matter-units.</span>")
|
||||
return
|
||||
..()
|
||||
to_chat(user, span("notice", "The RCD now holds [stored_matter]/[max_stored_matter] matter-units."))
|
||||
return TRUE
|
||||
return ..()
|
||||
|
||||
/obj/item/weapon/rcd/attack_self(mob/user)
|
||||
//Change the mode
|
||||
if(++mode > 3) mode = 1
|
||||
user << "<span class='notice'>Changed mode to '[modes[mode]]'</span>"
|
||||
playsound(src.loc, 'sound/effects/pop.ogg', 50, 0)
|
||||
if(prob(20)) src.spark_system.start()
|
||||
|
||||
/obj/item/weapon/rcd/afterattack(atom/A, mob/user, proximity)
|
||||
if(!proximity) return
|
||||
if(disabled && !isrobot(user))
|
||||
return 0
|
||||
if(istype(get_area(A),/area/shuttle)||istype(get_area(A),/turf/space/transit))
|
||||
return 0
|
||||
return alter_turf(A,user,(mode == 3))
|
||||
|
||||
/obj/item/weapon/rcd/proc/useResource(var/amount, var/mob/user)
|
||||
if(stored_matter < amount)
|
||||
return 0
|
||||
stored_matter -= amount
|
||||
return 1
|
||||
|
||||
/obj/item/weapon/rcd/proc/alter_turf(var/turf/T,var/mob/user,var/deconstruct)
|
||||
|
||||
var/build_cost = 0
|
||||
var/build_type
|
||||
var/build_turf
|
||||
var/build_delay
|
||||
var/build_other
|
||||
|
||||
if(working == 1)
|
||||
return 0
|
||||
|
||||
if(mode == 3 && istype(T,/obj/machinery/door/airlock))
|
||||
build_cost = 10
|
||||
build_delay = 50
|
||||
build_type = "airlock"
|
||||
else if(mode == 2 && !deconstruct && istype(T,/turf/simulated/floor))
|
||||
build_cost = 10
|
||||
build_delay = 50
|
||||
build_type = "airlock"
|
||||
build_other = /obj/machinery/door/airlock
|
||||
else if(!deconstruct && isturf(T) && (istype(T,/turf/space) || istype(T,get_base_turf_by_area(T))))
|
||||
build_cost = 1
|
||||
build_type = "floor"
|
||||
build_turf = /turf/simulated/floor/airless
|
||||
else if(!deconstruct && istype(T,/turf/simulated/mineral/floor))
|
||||
build_cost = 1
|
||||
build_type = "floor"
|
||||
build_turf = /turf/simulated/floor/plating
|
||||
else if(deconstruct && istype(T,/turf/simulated/wall))
|
||||
var/turf/simulated/wall/W = T
|
||||
build_delay = deconstruct ? 50 : 40
|
||||
build_cost = 5
|
||||
build_type = (!canRwall && W.reinf_material) ? null : "wall"
|
||||
build_turf = /turf/simulated/floor
|
||||
else if(istype(T,/turf/simulated/floor) || (istype(T,/turf/simulated/mineral) && !T.density))
|
||||
var/turf/simulated/F = T
|
||||
build_delay = deconstruct ? 50 : 20
|
||||
build_cost = deconstruct ? 10 : 3
|
||||
build_type = deconstruct ? "floor" : "wall"
|
||||
build_turf = deconstruct ? get_base_turf_by_area(F) : /turf/simulated/wall
|
||||
|
||||
if(!build_type)
|
||||
working = 0
|
||||
return 0
|
||||
|
||||
if(!useResource(build_cost, user))
|
||||
user << "Insufficient resources."
|
||||
return 0
|
||||
|
||||
playsound(src.loc, 'sound/machines/click.ogg', 50, 1)
|
||||
|
||||
working = 1
|
||||
user << "[(deconstruct ? "Deconstructing" : "Building")] [build_type]..."
|
||||
|
||||
if(build_delay && !do_after(user, build_delay))
|
||||
working = 0
|
||||
return 0
|
||||
|
||||
working = 0
|
||||
if(build_delay && !can_use(user,T))
|
||||
return 0
|
||||
|
||||
if(build_turf)
|
||||
T.ChangeTurf(build_turf, preserve_outdoors = TRUE)
|
||||
else if(build_other)
|
||||
new build_other(T)
|
||||
// Changes which mode it is on.
|
||||
/obj/item/weapon/rcd/attack_self(mob/living/user)
|
||||
if(mode_index >= modes.len) // Shouldn't overflow unless someone messes with it in VV poorly but better safe than sorry.
|
||||
mode_index = 1
|
||||
else
|
||||
qdel(T)
|
||||
mode_index++
|
||||
|
||||
playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
|
||||
return 1
|
||||
to_chat(user, span("notice", "Changed mode to '[modes[mode_index]]'."))
|
||||
playsound(src.loc, 'sound/effects/pop.ogg', 50, 0)
|
||||
|
||||
if(prob(20))
|
||||
src.spark_system.start()
|
||||
|
||||
// Removes resources if the RCD can afford it.
|
||||
/obj/item/weapon/rcd/proc/consume_resources(amount)
|
||||
if(!can_afford(amount))
|
||||
return FALSE
|
||||
stored_matter -= amount
|
||||
return TRUE
|
||||
|
||||
// Useful for testing before actually paying (e.g. before a do_after() ).
|
||||
/obj/item/weapon/rcd/proc/can_afford(amount)
|
||||
return stored_matter >= amount
|
||||
|
||||
/obj/item/weapon/rcd/afterattack(atom/A, mob/living/user, proximity)
|
||||
if(!ranged && !proximity)
|
||||
return FALSE
|
||||
use_rcd(A, user)
|
||||
|
||||
// Used to call rcd_act() on the atom hit.
|
||||
/obj/item/weapon/rcd/proc/use_rcd(atom/A, mob/living/user)
|
||||
if(busy && !allow_concurrent_building)
|
||||
to_chat(user, span("warning", "\The [src] is busy finishing its current operation, be patient."))
|
||||
return FALSE
|
||||
|
||||
var/list/rcd_results = A.rcd_values(user, src, modes[mode_index])
|
||||
if(!rcd_results)
|
||||
to_chat(user, span("warning", "\The [src] blinks a red light as you point it towards \the [A], indicating \
|
||||
that it won't work. Try changing the mode, or use it on something else."))
|
||||
return FALSE
|
||||
if(!can_afford(rcd_results[RCD_VALUE_COST]))
|
||||
to_chat(user, span("warning", "\The [src] lacks the required material to start."))
|
||||
return FALSE
|
||||
|
||||
playsound(get_turf(src), 'sound/machines/click.ogg', 50, 1)
|
||||
|
||||
var/true_delay = rcd_results[RCD_VALUE_DELAY] * toolspeed
|
||||
|
||||
var/datum/beam/rcd_beam = null
|
||||
if(ranged)
|
||||
var/atom/movable/beam_origin = user // This is needed because mecha pilots are inside an object and the beam won't be made if it tries to attach to them..
|
||||
if(!isturf(beam_origin.loc))
|
||||
beam_origin = user.loc
|
||||
rcd_beam = beam_origin.Beam(A, icon_state = "rped_upgrade", time = max(true_delay, 5))
|
||||
busy = TRUE
|
||||
|
||||
if(do_after(user, true_delay, target = A))
|
||||
busy = FALSE
|
||||
// Doing another check in case we lost matter during the delay for whatever reason.
|
||||
if(!can_afford(rcd_results[RCD_VALUE_COST]))
|
||||
to_chat(user, span("warning", "\The [src] lacks the required material to finish the operation."))
|
||||
return FALSE
|
||||
if(A.rcd_act(user, src, rcd_results[RCD_VALUE_MODE]))
|
||||
consume_resources(rcd_results[RCD_VALUE_COST])
|
||||
playsound(get_turf(A), 'sound/items/deconstruct.ogg', 50, 1)
|
||||
return TRUE
|
||||
|
||||
// If they moved, kill the beam immediately.
|
||||
qdel(rcd_beam)
|
||||
busy = FALSE
|
||||
return FALSE
|
||||
|
||||
// RCD variants.
|
||||
|
||||
// This one starts full.
|
||||
/obj/item/weapon/rcd/loaded/initialize()
|
||||
stored_matter = max_stored_matter
|
||||
return ..()
|
||||
|
||||
// This one makes cooler walls by using an alternative material.
|
||||
/obj/item/weapon/rcd/shipwright
|
||||
name = "shipwright's rapid construction device"
|
||||
desc = "A device used to rapidly build and deconstruct. This version creates a stronger variant of wall, often \
|
||||
used in the construction of hulls for starships. Reload with compressed matter cartridges."
|
||||
material_to_use = MAT_STEELHULL
|
||||
|
||||
/obj/item/weapon/rcd/shipwright/loaded/initialize()
|
||||
stored_matter = max_stored_matter
|
||||
return ..()
|
||||
|
||||
|
||||
/obj/item/weapon/rcd/advanced
|
||||
name = "advanced rapid construction device"
|
||||
desc = "A device used to rapidly build and deconstruct. This version works at a range, builds faster, and has a much larger capacity. \
|
||||
Reload with compressed matter cartridges."
|
||||
icon_state = "adv_rcd"
|
||||
ranged = TRUE
|
||||
toolspeed = 0.5 // Twice as fast.
|
||||
max_stored_matter = RCD_MAX_CAPACITY * 3 // Three times capacity.
|
||||
|
||||
/obj/item/weapon/rcd/advanced/loaded/initialize()
|
||||
stored_matter = max_stored_matter
|
||||
return ..()
|
||||
|
||||
|
||||
// Electric RCDs.
|
||||
// Currently just a base for the mounted RCDs.
|
||||
// Currently there isn't a way to swap out the cells.
|
||||
// One could be added if there is demand to do so.
|
||||
/obj/item/weapon/rcd/electric
|
||||
name = "electric rapid construction device"
|
||||
desc = "A device used to rapidly build and deconstruct. It runs directly off of electricity, no matter cartridges needed."
|
||||
icon_state = "electric_rcd"
|
||||
var/obj/item/weapon/cell/cell = null
|
||||
var/make_cell = TRUE // If false, initialize() won't spawn a cell for this.
|
||||
var/electric_cost_coefficent = 83.33 // Higher numbers make it less efficent. 86.3... means it should matche the standard RCD capacity on a 10k cell.
|
||||
|
||||
/obj/item/weapon/rcd/electric/initialize()
|
||||
if(make_cell)
|
||||
cell = new /obj/item/weapon/cell/high(src)
|
||||
return ..()
|
||||
|
||||
/obj/item/weapon/rcd/electric/Destroy()
|
||||
if(cell)
|
||||
QDEL_NULL(cell)
|
||||
return ..()
|
||||
|
||||
/obj/item/weapon/rcd/electric/get_cell()
|
||||
return cell
|
||||
|
||||
/obj/item/weapon/rcd/electric/can_afford(amount) // This makes it so borgs won't drain their last sliver of charge by mistake, as a bonus.
|
||||
var/obj/item/weapon/cell/cell = get_cell()
|
||||
if(cell)
|
||||
return cell.check_charge(amount * electric_cost_coefficent)
|
||||
return FALSE
|
||||
|
||||
/obj/item/weapon/rcd/electric/consume_resources(amount)
|
||||
if(!can_afford(amount))
|
||||
return FALSE
|
||||
var/obj/item/weapon/cell/cell = get_cell()
|
||||
return cell.checked_use(amount * electric_cost_coefficent)
|
||||
|
||||
/obj/item/weapon/rcd/electric/display_resources()
|
||||
var/obj/item/weapon/cell/cell = get_cell()
|
||||
if(cell)
|
||||
return "The power source connected to \the [src] has a charge of [cell.percent()]%."
|
||||
return "It lacks a source of power, and cannot function."
|
||||
|
||||
|
||||
|
||||
// 'Mounted' RCDs, used for borgs/RIGs/Mechas, all of which use their cells to drive the RCD.
|
||||
/obj/item/weapon/rcd/electric/mounted
|
||||
name = "mounted electric rapid construction device"
|
||||
desc = "A device used to rapidly build and deconstruct. It runs directly off of electricity from an external power source."
|
||||
make_cell = FALSE
|
||||
|
||||
/obj/item/weapon/rcd/electric/mounted/get_cell()
|
||||
return get_external_power_supply()
|
||||
|
||||
/obj/item/weapon/rcd/electric/mounted/proc/get_external_power_supply()
|
||||
if(isrobot(loc)) // In a borg.
|
||||
var/mob/living/silicon/robot/R = loc
|
||||
return R.cell
|
||||
if(istype(loc, /obj/item/rig_module)) // In a RIG.
|
||||
var/obj/item/rig_module/module = loc
|
||||
if(module.holder) // Is it attached to a RIG?
|
||||
return module.holder.cell
|
||||
if(istype(loc, /obj/item/mecha_parts/mecha_equipment)) // In a mech.
|
||||
var/obj/item/mecha_parts/mecha_equipment/ME = loc
|
||||
if(ME.chassis) // Is the part attached to a mech?
|
||||
return ME.chassis.cell
|
||||
return null
|
||||
|
||||
|
||||
// RCDs for borgs.
|
||||
/obj/item/weapon/rcd/electric/mounted/borg
|
||||
can_remove_rwalls = TRUE
|
||||
desc = "A device used to rapidly build and deconstruct. It runs directly off of electricity, drawing directly from your cell."
|
||||
electric_cost_coefficent = 41.66 // Twice as efficent, out of pity.
|
||||
toolspeed = 0.5 // Twice as fast, since borg versions typically have this.
|
||||
|
||||
/obj/item/weapon/rcd/electric/mounted/borg/lesser
|
||||
can_remove_rwalls = FALSE
|
||||
|
||||
|
||||
// RCDs for RIGs.
|
||||
/obj/item/weapon/rcd/electric/mounted/rig
|
||||
|
||||
|
||||
// RCDs for Mechs.
|
||||
/obj/item/weapon/rcd/electric/mounted/mecha
|
||||
ranged = TRUE
|
||||
toolspeed = 0.5
|
||||
|
||||
|
||||
// Infinite use RCD for debugging/adminbuse.
|
||||
/obj/item/weapon/rcd/debug
|
||||
name = "self-repleshing rapid construction device"
|
||||
desc = "An RCD that appears to be plated with gold. For some reason it also seems to just \
|
||||
be vastly superior to all other RCDs ever created, possibly due to it being colored gold."
|
||||
icon_state = "debug_rcd"
|
||||
ranged = TRUE
|
||||
can_remove_rwalls = TRUE
|
||||
allow_concurrent_building = TRUE
|
||||
toolspeed = 0.25 // Four times as fast.
|
||||
|
||||
/obj/item/weapon/rcd/debug/can_afford(amount)
|
||||
return TRUE
|
||||
|
||||
/obj/item/weapon/rcd/debug/consume_resources(amount)
|
||||
return TRUE
|
||||
|
||||
/obj/item/weapon/rcd/debug/attackby(obj/item/weapon/W, mob/user)
|
||||
if(istype(W, /obj/item/weapon/rcd_ammo))
|
||||
to_chat(user, span("notice", "\The [src] makes its own material, no need to add more."))
|
||||
return FALSE
|
||||
return ..()
|
||||
|
||||
/obj/item/weapon/rcd/debug/display_resources()
|
||||
return "It has UNLIMITED POWER!"
|
||||
|
||||
|
||||
|
||||
// Ammo for the (non-electric) RCDs.
|
||||
/obj/item/weapon/rcd_ammo
|
||||
name = "compressed matter cartridge"
|
||||
desc = "Highly compressed matter for the RCD."
|
||||
@@ -171,50 +295,11 @@
|
||||
w_class = ITEMSIZE_SMALL
|
||||
origin_tech = list(TECH_MATERIAL = 2)
|
||||
matter = list(DEFAULT_WALL_MATERIAL = 30000,"glass" = 15000)
|
||||
var/remaining = 10
|
||||
var/remaining = RCD_MAX_CAPACITY / 3
|
||||
|
||||
/obj/item/weapon/rcd_ammo/large
|
||||
name = "high-capacity matter cartridge"
|
||||
desc = "Do not ingest."
|
||||
matter = list(DEFAULT_WALL_MATERIAL = 45000,"glass" = 22500)
|
||||
remaining = 30
|
||||
origin_tech = list(TECH_MATERIAL = 4)
|
||||
|
||||
/obj/item/weapon/rcd/borg
|
||||
canRwall = 1
|
||||
|
||||
/obj/item/weapon/rcd/borg/lesser
|
||||
canRwall = FALSE
|
||||
|
||||
/obj/item/weapon/rcd/borg/useResource(var/amount, var/mob/user)
|
||||
if(isrobot(user))
|
||||
var/mob/living/silicon/robot/R = user
|
||||
if(R.cell)
|
||||
var/cost = amount*30
|
||||
if(R.cell.charge >= cost)
|
||||
R.cell.use(cost)
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/obj/item/weapon/rcd/borg/attackby()
|
||||
return
|
||||
|
||||
/obj/item/weapon/rcd/borg/can_use(var/mob/user,var/turf/T)
|
||||
return (user.Adjacent(T) && !user.stat)
|
||||
|
||||
|
||||
/obj/item/weapon/rcd/mounted/useResource(var/amount, var/mob/user)
|
||||
var/cost = amount*130 //so that a rig with default powercell can build ~2.5x the stuff a fully-loaded RCD can.
|
||||
if(istype(loc,/obj/item/rig_module))
|
||||
var/obj/item/rig_module/module = loc
|
||||
if(module.holder && module.holder.cell)
|
||||
if(module.holder.cell.charge >= cost)
|
||||
module.holder.cell.use(cost)
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/obj/item/weapon/rcd/mounted/attackby()
|
||||
return
|
||||
|
||||
/obj/item/weapon/rcd/mounted/can_use(var/mob/user,var/turf/T)
|
||||
return (user.Adjacent(T) && !user.stat && !user.restrained())
|
||||
remaining = RCD_MAX_CAPACITY
|
||||
|
||||
@@ -140,7 +140,7 @@
|
||||
icon_state = "tape"
|
||||
w_class = ITEMSIZE_TINY
|
||||
plane = MOB_PLANE
|
||||
anchored = 1 //it's sticky, no you cant move it
|
||||
anchored = FALSE
|
||||
|
||||
var/obj/item/weapon/stuck = null
|
||||
|
||||
@@ -180,6 +180,10 @@
|
||||
qdel(I)
|
||||
to_chat(user, "<span-class='notice'>You place \the [I] back into \the [src].</span>")
|
||||
|
||||
/obj/item/weapon/ducttape/attack_hand(mob/living/L)
|
||||
anchored = FALSE
|
||||
return ..() // Pick it up now that it's unanchored.
|
||||
|
||||
/obj/item/weapon/ducttape/afterattack(var/A, mob/user, flag, params)
|
||||
|
||||
if(!in_range(user, A) || istype(A, /obj/machinery/door) || !stuck)
|
||||
@@ -198,6 +202,7 @@
|
||||
user.drop_from_inventory(src)
|
||||
playsound(src, 'sound/effects/tape.ogg',25)
|
||||
forceMove(source_turf)
|
||||
anchored = TRUE
|
||||
|
||||
if(params)
|
||||
var/list/mouse_control = params2list(params)
|
||||
|
||||
@@ -353,3 +353,54 @@
|
||||
to_chat(user, "<span class='notice'>You drill through the girder!</span>")
|
||||
new /obj/effect/decal/remains/human(get_turf(src))
|
||||
dismantle()
|
||||
|
||||
|
||||
/obj/structure/girder/rcd_values(mob/living/user, obj/item/weapon/rcd/the_rcd, passed_mode)
|
||||
var/turf/simulated/T = get_turf(src)
|
||||
if(!istype(T) || T.density)
|
||||
return FALSE
|
||||
|
||||
switch(passed_mode)
|
||||
if(RCD_FLOORWALL)
|
||||
// Finishing a wall costs two sheets.
|
||||
var/cost = RCD_SHEETS_PER_MATTER_UNIT * 2
|
||||
// Rwalls cost three to finish.
|
||||
if(the_rcd.make_rwalls)
|
||||
cost += RCD_SHEETS_PER_MATTER_UNIT * 1
|
||||
return list(
|
||||
RCD_VALUE_MODE = RCD_FLOORWALL,
|
||||
RCD_VALUE_DELAY = 2 SECONDS,
|
||||
RCD_VALUE_COST = cost
|
||||
)
|
||||
if(RCD_DECONSTRUCT)
|
||||
return list(
|
||||
RCD_VALUE_MODE = RCD_DECONSTRUCT,
|
||||
RCD_VALUE_DELAY = 2 SECONDS,
|
||||
RCD_VALUE_COST = RCD_SHEETS_PER_MATTER_UNIT * 5
|
||||
)
|
||||
return FALSE
|
||||
|
||||
/obj/structure/girder/rcd_act(mob/living/user, obj/item/weapon/rcd/the_rcd, passed_mode)
|
||||
var/turf/simulated/T = get_turf(src)
|
||||
if(!istype(T) || T.density) // Should stop future bugs of people bringing girders to centcom and RCDing them, or somehow putting a girder on a durasteel wall and deconning it.
|
||||
return FALSE
|
||||
|
||||
switch(passed_mode)
|
||||
if(RCD_FLOORWALL)
|
||||
to_chat(user, span("notice", "You finish a wall."))
|
||||
// This is mostly the same as using on a floor. The girder's material is preserved, however.
|
||||
T.ChangeTurf(/turf/simulated/wall)
|
||||
var/turf/simulated/wall/new_T = get_turf(src) // Ref to the wall we just built.
|
||||
// Apparently set_material(...) for walls requires refs to the material singletons and not strings.
|
||||
// This is different from how other material objects with their own set_material(...) do it, but whatever.
|
||||
var/material/M = name_to_material[the_rcd.material_to_use]
|
||||
new_T.set_material(M, the_rcd.make_rwalls ? M : null, girder_material)
|
||||
new_T.add_hiddenprint(user)
|
||||
qdel(src)
|
||||
return TRUE
|
||||
|
||||
if(RCD_DECONSTRUCT)
|
||||
to_chat(user, span("notice", "You deconstruct \the [src]."))
|
||||
qdel(src)
|
||||
return TRUE
|
||||
|
||||
|
||||
@@ -96,7 +96,9 @@
|
||||
/obj/structure/grille/attackby(obj/item/W as obj, mob/user as mob)
|
||||
if(!istype(W))
|
||||
return
|
||||
if(W.is_wirecutter())
|
||||
if(istype(W, /obj/item/weapon/rcd)) // To stop us from hitting the grille when building windows, because grilles don't let parent handle it properly.
|
||||
return FALSE
|
||||
else if(W.is_wirecutter())
|
||||
if(!shock(user, 100))
|
||||
playsound(src, W.usesound, 100, 1)
|
||||
new /obj/item/stack/rods(get_turf(src), destroyed ? 1 : 2)
|
||||
@@ -252,3 +254,38 @@
|
||||
|
||||
/obj/structure/grille/broken/rustic
|
||||
icon_state = "grillerustic-b"
|
||||
|
||||
|
||||
/obj/structure/grille/rcd_values(mob/living/user, obj/item/weapon/rcd/the_rcd, passed_mode)
|
||||
switch(passed_mode)
|
||||
if(RCD_WINDOWGRILLE)
|
||||
// A full tile window costs 4 glass sheets.
|
||||
return list(
|
||||
RCD_VALUE_MODE = RCD_WINDOWGRILLE,
|
||||
RCD_VALUE_DELAY = 2 SECONDS,
|
||||
RCD_VALUE_COST = RCD_SHEETS_PER_MATTER_UNIT * 4
|
||||
)
|
||||
|
||||
if(RCD_DECONSTRUCT)
|
||||
return list(
|
||||
RCD_VALUE_MODE = RCD_DECONSTRUCT,
|
||||
RCD_VALUE_DELAY = 2 SECONDS,
|
||||
RCD_VALUE_COST = RCD_SHEETS_PER_MATTER_UNIT * 2
|
||||
)
|
||||
return FALSE
|
||||
|
||||
/obj/structure/grille/rcd_act(mob/living/user, obj/item/weapon/rcd/the_rcd, passed_mode)
|
||||
switch(passed_mode)
|
||||
if(RCD_DECONSTRUCT)
|
||||
to_chat(user, span("notice", "You deconstruct \the [src]."))
|
||||
qdel(src)
|
||||
return TRUE
|
||||
if(RCD_WINDOWGRILLE)
|
||||
if(locate(/obj/structure/window) in loc)
|
||||
return FALSE
|
||||
to_chat(user, span("notice", "You construct a window."))
|
||||
var/obj/structure/window/WD = new the_rcd.window_type(loc)
|
||||
WD.anchored = TRUE
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
|
||||
@@ -647,3 +647,20 @@
|
||||
MT.update_icon()
|
||||
return TRUE
|
||||
. = ..()
|
||||
|
||||
/obj/structure/window/rcd_values(mob/living/user, obj/item/weapon/rcd/the_rcd, passed_mode)
|
||||
switch(passed_mode)
|
||||
if(RCD_DECONSTRUCT)
|
||||
return list(
|
||||
RCD_VALUE_MODE = RCD_DECONSTRUCT,
|
||||
RCD_VALUE_DELAY = 5 SECONDS,
|
||||
RCD_VALUE_COST = RCD_SHEETS_PER_MATTER_UNIT * 5
|
||||
)
|
||||
|
||||
/obj/structure/window/rcd_act(mob/living/user, obj/item/weapon/rcd/the_rcd, passed_mode)
|
||||
switch(passed_mode)
|
||||
if(RCD_DECONSTRUCT)
|
||||
to_chat(user, span("notice", "You deconstruct \the [src]."))
|
||||
qdel(src)
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
@@ -135,9 +135,9 @@
|
||||
if ("thunder") soundin = pick('sound/effects/thunder/thunder1.ogg', 'sound/effects/thunder/thunder2.ogg', 'sound/effects/thunder/thunder3.ogg', 'sound/effects/thunder/thunder4.ogg',
|
||||
'sound/effects/thunder/thunder5.ogg', 'sound/effects/thunder/thunder6.ogg', 'sound/effects/thunder/thunder7.ogg', 'sound/effects/thunder/thunder8.ogg', 'sound/effects/thunder/thunder9.ogg',
|
||||
'sound/effects/thunder/thunder10.ogg')
|
||||
if ("casing_sound") soundin = pick('sound/weapons/casingfall1.ogg','sound/weapons/casingfall2.ogg','sound/weapons/casingfall3.ogg')
|
||||
return soundin
|
||||
|
||||
//Are these even used?
|
||||
var/list/casing_sound = list ('sound/weapons/casingfall1.ogg','sound/weapons/casingfall2.ogg','sound/weapons/casingfall3.ogg')
|
||||
var/list/keyboard_sound = list ('sound/effects/keyboard/keyboard1.ogg','sound/effects/keyboard/keyboard2.ogg','sound/effects/keyboard/keyboard3.ogg', 'sound/effects/keyboard/keyboard4.ogg')
|
||||
var/list/bodyfall_sound = list('sound/effects/bodyfall1.ogg','sound/effects/bodyfall2.ogg','sound/effects/bodyfall3.ogg','sound/effects/bodyfall4.ogg')
|
||||
|
||||
@@ -298,7 +298,7 @@
|
||||
initial_flooring = /decl/flooring/tiling/asteroidfloor
|
||||
|
||||
/turf/simulated/floor/tiled/asteroid_steel/airless
|
||||
name = "airless plating"
|
||||
name = "plating"
|
||||
oxygen = 0
|
||||
nitrogen = 0
|
||||
|
||||
@@ -332,25 +332,25 @@
|
||||
temperature = TCMB
|
||||
|
||||
/turf/simulated/floor/airless
|
||||
name = "airless plating"
|
||||
name = "plating"
|
||||
oxygen = 0
|
||||
nitrogen = 0
|
||||
temperature = TCMB
|
||||
|
||||
/turf/simulated/floor/tiled/airless
|
||||
name = "airless floor"
|
||||
name = "floor"
|
||||
oxygen = 0
|
||||
nitrogen = 0
|
||||
temperature = TCMB
|
||||
|
||||
/turf/simulated/floor/bluegrid/airless
|
||||
name = "airless floor"
|
||||
name = "floor"
|
||||
oxygen = 0
|
||||
nitrogen = 0
|
||||
temperature = TCMB
|
||||
|
||||
/turf/simulated/floor/greengrid/airless
|
||||
name = "airless floor"
|
||||
name = "floor"
|
||||
oxygen = 0
|
||||
nitrogen = 0
|
||||
temperature = TCMB
|
||||
@@ -359,7 +359,7 @@
|
||||
oxygen = 0
|
||||
|
||||
/turf/simulated/floor/tiled/white/airless
|
||||
name = "airless floor"
|
||||
name = "floor"
|
||||
oxygen = 0
|
||||
nitrogen = 0
|
||||
temperature = TCMB
|
||||
|
||||
@@ -91,3 +91,71 @@
|
||||
/turf/simulated/floor/levelupdate()
|
||||
for(var/obj/O in src)
|
||||
O.hide(O.hides_under_flooring() && src.flooring)
|
||||
|
||||
/turf/simulated/floor/rcd_values(mob/living/user, obj/item/weapon/rcd/the_rcd, passed_mode)
|
||||
switch(passed_mode)
|
||||
if(RCD_FLOORWALL)
|
||||
// A wall costs four sheets to build (two for the grider and two for finishing it).
|
||||
var/cost = RCD_SHEETS_PER_MATTER_UNIT * 4
|
||||
// R-walls cost five sheets, however.
|
||||
if(the_rcd.make_rwalls)
|
||||
cost += RCD_SHEETS_PER_MATTER_UNIT * 1
|
||||
return list(
|
||||
RCD_VALUE_MODE = RCD_FLOORWALL,
|
||||
RCD_VALUE_DELAY = 2 SECONDS,
|
||||
RCD_VALUE_COST = cost
|
||||
)
|
||||
if(RCD_AIRLOCK)
|
||||
// Airlock assemblies cost four sheets. Let's just add another for the electronics/wires/etc.
|
||||
return list(
|
||||
RCD_VALUE_MODE = RCD_AIRLOCK,
|
||||
RCD_VALUE_DELAY = 5 SECONDS,
|
||||
RCD_VALUE_COST = RCD_SHEETS_PER_MATTER_UNIT * 5
|
||||
)
|
||||
if(RCD_WINDOWGRILLE)
|
||||
// One steel sheet for the girder (two rods, which is one sheet).
|
||||
return list(
|
||||
RCD_VALUE_MODE = RCD_WINDOWGRILLE,
|
||||
RCD_VALUE_DELAY = 1 SECOND,
|
||||
RCD_VALUE_COST = RCD_SHEETS_PER_MATTER_UNIT * 1
|
||||
)
|
||||
if(RCD_DECONSTRUCT)
|
||||
// Old RCDs made deconning the floor cost 10 units (IE, three times on full RCD).
|
||||
// Now it's ten sheets worth of units (which is the same capacity-wise, three times on full RCD).
|
||||
return list(
|
||||
RCD_VALUE_MODE = RCD_DECONSTRUCT,
|
||||
RCD_VALUE_DELAY = 5 SECONDS,
|
||||
RCD_VALUE_COST = RCD_SHEETS_PER_MATTER_UNIT * 10
|
||||
)
|
||||
return FALSE
|
||||
|
||||
|
||||
/turf/simulated/floor/rcd_act(mob/living/user, obj/item/weapon/rcd/the_rcd, passed_mode)
|
||||
switch(passed_mode)
|
||||
if(RCD_FLOORWALL)
|
||||
to_chat(user, span("notice", "You build a wall."))
|
||||
ChangeTurf(/turf/simulated/wall)
|
||||
var/turf/simulated/wall/T = get_turf(src) // Ref to the wall we just built.
|
||||
// Apparently set_material(...) for walls requires refs to the material singletons and not strings.
|
||||
// This is different from how other material objects with their own set_material(...) do it, but whatever.
|
||||
var/material/M = name_to_material[the_rcd.material_to_use]
|
||||
T.set_material(M, the_rcd.make_rwalls ? M : null, M)
|
||||
T.add_hiddenprint(user)
|
||||
return TRUE
|
||||
if(RCD_AIRLOCK)
|
||||
if(locate(/obj/machinery/door/airlock) in src)
|
||||
return FALSE // No more airlock stacking.
|
||||
to_chat(user, span("notice", "You build an airlock."))
|
||||
new the_rcd.airlock_type(src)
|
||||
return TRUE
|
||||
if(RCD_WINDOWGRILLE)
|
||||
if(locate(/obj/structure/grille) in src)
|
||||
return FALSE
|
||||
to_chat(user, span("notice", "You construct the grille."))
|
||||
var/obj/structure/grille/G = new(src)
|
||||
G.anchored = TRUE
|
||||
return TRUE
|
||||
if(RCD_DECONSTRUCT)
|
||||
to_chat(user, span("notice", "You deconstruct \the [src]."))
|
||||
ChangeTurf(get_base_turf_by_area(src), preserve_outdoors = TRUE)
|
||||
return TRUE
|
||||
|
||||
@@ -15,6 +15,7 @@ var/list/turf_edge_cache = list()
|
||||
edge_blending_priority = 1
|
||||
outdoors = TRUE // This variable is used for weather effects.
|
||||
can_dirty = FALSE // Looks hideous with dirt on it.
|
||||
can_build_into_floor = TRUE
|
||||
|
||||
// When a turf gets demoted or promoted, this list gets adjusted. The top-most layer is the layer on the bottom of the list, due to how pop() works.
|
||||
var/list/turf_layers = list(/turf/simulated/floor/outdoors/rocks)
|
||||
|
||||
@@ -287,3 +287,27 @@
|
||||
W.burn((temperature/4))
|
||||
for(var/obj/machinery/door/airlock/phoron/D in range(3,src))
|
||||
D.ignite(temperature/4)
|
||||
|
||||
/turf/simulated/wall/rcd_values(mob/living/user, obj/item/weapon/rcd/the_rcd, passed_mode)
|
||||
if(material.integrity > 1000) // Don't decon things like elevatorium.
|
||||
return FALSE
|
||||
if(reinf_material && !the_rcd.can_remove_rwalls) // Gotta do it the old fashioned way if your RCD can't.
|
||||
return FALSE
|
||||
|
||||
if(passed_mode == RCD_DECONSTRUCT)
|
||||
var/delay_to_use = material.integrity / 3 // Steel has 150 integrity, so it'll take five seconds to down a regular wall.
|
||||
if(reinf_material)
|
||||
delay_to_use += reinf_material.integrity / 3
|
||||
return list(
|
||||
RCD_VALUE_MODE = RCD_DECONSTRUCT,
|
||||
RCD_VALUE_DELAY = delay_to_use,
|
||||
RCD_VALUE_COST = RCD_SHEETS_PER_MATTER_UNIT * 5
|
||||
)
|
||||
return FALSE
|
||||
|
||||
/turf/simulated/wall/rcd_act(mob/living/user, obj/item/weapon/rcd/the_rcd, passed_mode)
|
||||
if(passed_mode == RCD_DECONSTRUCT)
|
||||
to_chat(user, span("notice", "You deconstruct \the [src]."))
|
||||
ChangeTurf(/turf/simulated/floor/airless, preserve_outdoors = TRUE)
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
|
||||
temperature = T20C
|
||||
thermal_conductivity = OPEN_HEAT_TRANSFER_COEFFICIENT
|
||||
can_build_into_floor = TRUE
|
||||
var/keep_sprite = FALSE
|
||||
// heat_capacity = 700000 No.
|
||||
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
/turf/space/transit
|
||||
keep_sprite = TRUE
|
||||
can_build_into_floor = FALSE
|
||||
var/pushdirection // push things that get caught in the transit tile this direction
|
||||
|
||||
//Overwrite because we dont want people building rods in space.
|
||||
|
||||
@@ -31,6 +31,7 @@
|
||||
var/list/footstep_sounds = null
|
||||
|
||||
var/block_tele = FALSE // If true, most forms of teleporting to or from this turf tile will fail.
|
||||
var/can_build_into_floor = FALSE // Used for things like RCDs (and maybe lattices/floor tiles in the future), to see if a floor should replace it.
|
||||
|
||||
/turf/New()
|
||||
..()
|
||||
@@ -320,3 +321,28 @@ var/const/enterloopsanity = 100
|
||||
|
||||
/turf/AllowDrop()
|
||||
return TRUE
|
||||
|
||||
// This is all the way up here since its the common ancestor for things that need to get replaced with a floor when an RCD is used on them.
|
||||
// More specialized turfs like walls should instead override this.
|
||||
// The code for applying lattices/floor tiles onto lattices could also utilize something similar in the future.
|
||||
/turf/rcd_values(mob/living/user, obj/item/weapon/rcd/the_rcd, passed_mode)
|
||||
if(density || !can_build_into_floor)
|
||||
return FALSE
|
||||
if(passed_mode == RCD_FLOORWALL)
|
||||
var/obj/structure/lattice/L = locate() in src
|
||||
// A lattice costs one rod to make. A sheet can make two rods, meaning a lattice costs half of a sheet.
|
||||
// A sheet also makes four floor tiles, meaning it costs 1/4th of a sheet to place a floor tile on a lattice.
|
||||
// Therefore it should cost 3/4ths of a sheet if a lattice is not present, or 1/4th of a sheet if it does.
|
||||
return list(
|
||||
RCD_VALUE_MODE = RCD_FLOORWALL,
|
||||
RCD_VALUE_DELAY = 0,
|
||||
RCD_VALUE_COST = L ? RCD_SHEETS_PER_MATTER_UNIT * 0.25 : RCD_SHEETS_PER_MATTER_UNIT * 0.75
|
||||
)
|
||||
return FALSE
|
||||
|
||||
/turf/rcd_act(mob/living/user, obj/item/weapon/rcd/the_rcd, passed_mode)
|
||||
if(passed_mode == RCD_FLOORWALL)
|
||||
to_chat(user, span("notice", "You build a floor."))
|
||||
ChangeTurf(/turf/simulated/floor/airless, preserve_outdoors = TRUE)
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
@@ -15,3 +15,10 @@
|
||||
..()
|
||||
icon_state = "[((x + y) ^ ~(x * y) + z) % 25]"
|
||||
//VOREStation Add End
|
||||
|
||||
// Better nip this just in case.
|
||||
/turf/unsimulated/rcd_values(mob/living/user, obj/item/weapon/rcd/the_rcd, passed_mode)
|
||||
return FALSE
|
||||
|
||||
/turf/unsimulated/rcd_act(mob/living/user, obj/item/weapon/rcd/the_rcd, passed_mode)
|
||||
return FALSE
|
||||
|
||||
@@ -23,11 +23,11 @@
|
||||
html += "<div class='block'>"
|
||||
html += "<h3 class='uiContent highlight' style='font-size:16px'>[H.real_name]</h3><br>"
|
||||
if(H.flavor_texts["general"])
|
||||
html += "<a onclick='togglesection(\"[H.real_name] [curID] flavor\")'>Flavor text</a>"
|
||||
html += "<p class='uiContent' style='display:none' id='[H.real_name] [curID] flavor'>[H.flavor_texts["general"]]</p>"
|
||||
html += "<a onclick='togglesection(\"[ckey(H.real_name)] [curID] flavor\")'>Flavor text</a>"
|
||||
html += "<p class='uiContent' style='display:none' id='[ckey(H.real_name)] [curID] flavor'>[H.flavor_texts["general"]]</p>"
|
||||
if(H.ooc_notes)
|
||||
html += "<a onclick='togglesection(\"[H.real_name] [curID] ooc\")'>OOC notes</a>"
|
||||
html += "<p class='uiContent' style='display:none' id='[H.real_name] [curID] ooc'>[H.ooc_notes]</p>"
|
||||
html += "<a onclick='togglesection(\"[ckey(H.real_name)] [curID] ooc\")'>OOC notes</a>"
|
||||
html += "<p class='uiContent' style='display:none' id='[ckey(H.real_name)] [curID] ooc'>[H.ooc_notes]</p>"
|
||||
html += "</div>"
|
||||
if(!curID)
|
||||
html += "<p class='uiContent'>404: Station not found</p>"
|
||||
|
||||
@@ -267,7 +267,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new)
|
||||
|
||||
AddInteraction("<font color='purple'>Reopened by [key_name_admin(usr)]</font>")
|
||||
if(initiator)
|
||||
to_chat(initiator, "<font color='purple'>Ticket [TicketHref("#[id]")] was reopened by [key_name(usr)].</font>")
|
||||
to_chat(initiator, "<font color='purple'>Ticket [TicketHref("#[id]")] was reopened by [key_name(usr,FALSE,FALSE)].</font>")
|
||||
var/msg = "<span class='adminhelp'>Ticket [TicketHref("#[id]")] reopened by [key_name_admin(usr)].</span>"
|
||||
message_admins(msg)
|
||||
log_admin(msg)
|
||||
@@ -293,7 +293,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new)
|
||||
GLOB.ahelp_tickets.ListInsert(src)
|
||||
AddInteraction("<font color='red'>Closed by [key_name_admin(usr)].</font>")
|
||||
if(initiator)
|
||||
to_chat(initiator, "<font color='red'>Ticket [TicketHref("#[id]")] was closed by [key_name(usr)].</font>")
|
||||
to_chat(initiator, "<font color='red'>Ticket [TicketHref("#[id]")] was closed by [key_name(usr,FALSE,FALSE)].</font>")
|
||||
if(!silent)
|
||||
feedback_inc("ahelp_close")
|
||||
var/msg = "Ticket [TicketHref("#[id]")] closed by [key_name_admin(usr)]."
|
||||
@@ -310,7 +310,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new)
|
||||
|
||||
AddInteraction("<font color='green'>Resolved by [key_name_admin(usr)].</font>")
|
||||
if(initiator)
|
||||
to_chat(initiator, "<font color='green'>Ticket [TicketHref("#[id]")] was marked resolved by [key_name(usr)].</font>")
|
||||
to_chat(initiator, "<font color='green'>Ticket [TicketHref("#[id]")] was marked resolved by [key_name(usr,FALSE,FALSE)].</font>")
|
||||
if(!silent)
|
||||
feedback_inc("ahelp_resolve")
|
||||
var/msg = "Ticket [TicketHref("#[id]")] resolved by [key_name_admin(usr)]"
|
||||
@@ -360,13 +360,13 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new)
|
||||
if(state != AHELP_ACTIVE)
|
||||
return
|
||||
|
||||
var/msg = "<font color='red'>Your AdminHelp is being handled by [key_name(usr)] please be patient.</font>"
|
||||
var/msg = "<font color='red'>Your AdminHelp is being handled by [key_name(usr,FALSE,FALSE)] please be patient.</font>"
|
||||
|
||||
if(initiator)
|
||||
to_chat(initiator, msg)
|
||||
|
||||
feedback_inc("ahelp_icissue")
|
||||
msg = "Ticket [TicketHref("#[id]")] being handled by [key_name(usr)]"
|
||||
msg = "Ticket [TicketHref("#[id]")] being handled by [key_name(usr,FALSE,FALSE)]"
|
||||
message_admins(msg)
|
||||
log_admin(msg)
|
||||
AddInteraction("[key_name_admin(usr)] is now handling this ticket.")
|
||||
@@ -550,7 +550,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new)
|
||||
. = list("total" = list(), "noflags" = list(), "afk" = list(), "stealth" = list(), "present" = list())
|
||||
for(var/client/X in admins)
|
||||
.["total"] += X
|
||||
if(requiredflags != 0 && !check_rights(rights_required = requiredflags, show_msg = FALSE, C = X)) //VOREStation Edit
|
||||
if(requiredflags != 0 && !check_rights(rights_required = requiredflags, show_msg = FALSE, C = X))
|
||||
.["noflags"] += X
|
||||
else if(X.is_afk())
|
||||
.["afk"] += X
|
||||
|
||||
@@ -94,7 +94,7 @@
|
||||
usable = 1
|
||||
engage_string = "Configure RCD"
|
||||
|
||||
device_type = /obj/item/weapon/rcd/mounted
|
||||
device_type = /obj/item/weapon/rcd/electric/mounted/rig
|
||||
|
||||
/obj/item/rig_module/device/New()
|
||||
..()
|
||||
|
||||
@@ -1,42 +0,0 @@
|
||||
//Exploration
|
||||
/obj/item/clothing/head/helmet/space/void/exploration
|
||||
name = "exploration voidsuit helmet"
|
||||
desc = "A radiation-resistant helmet made especially for exploring unknown planetary environments."
|
||||
icon_state = "helm_explorer"
|
||||
item_state = "helm_explorer"
|
||||
armor = list(melee = 40, bullet = 15, laser = 25,energy = 35, bomb = 30, bio = 100, rad = 70)
|
||||
light_overlay = "helmet_light_dual" //explorer_light
|
||||
|
||||
/obj/item/clothing/suit/space/void/exploration
|
||||
name = "exploration voidsuit"
|
||||
desc = "A lightweight, radiation-resistant voidsuit, featuring the Explorer emblem on its chest plate. Designed for exploring unknown planetary environments."
|
||||
icon_state = "void_explorer"
|
||||
armor = list(melee = 40, bullet = 15, laser = 25,energy = 35, bomb = 30, bio = 100, rad = 70)
|
||||
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/stack/flag,/obj/item/device/healthanalyzer,/obj/item/device/gps,/obj/item/device/radio/beacon,/obj/item/weapon/shovel)
|
||||
|
||||
/obj/item/clothing/suit/space/void/exploration/prepared
|
||||
helmet = /obj/item/clothing/head/helmet/space/void/exploration
|
||||
boots = /obj/item/clothing/shoes/magboots
|
||||
|
||||
//Pilot
|
||||
/obj/item/clothing/head/helmet/space/void/pilot
|
||||
desc = "An atmos resistant helmet for space and planet exploration."
|
||||
name = "pilot voidsuit helmet"
|
||||
icon_state = "rig0_pilot"
|
||||
item_state = "pilot_helm"
|
||||
armor = list(melee = 40, bullet = 5, laser = 20,energy = 5, bomb = 15, bio = 100, rad = 50)
|
||||
max_heat_protection_temperature = FIRE_HELMET_MAX_HEAT_PROTECTION_TEMPERATURE
|
||||
light_overlay = "helmet_light_dual"
|
||||
|
||||
/obj/item/clothing/suit/space/void/pilot
|
||||
desc = "An atmos resistant voidsuit for space and planet exploration."
|
||||
icon_state = "rig-pilot"
|
||||
item_state = "rig-pilot"
|
||||
name = "pilot voidsuit"
|
||||
armor = list(melee = 40, bullet = 5, laser = 20,energy = 5, bomb = 15, bio = 100, rad = 50)
|
||||
max_heat_protection_temperature = FIRESUIT_MAX_HEAT_PROTECTION_TEMPERATURE
|
||||
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/weapon/storage/toolbox,/obj/item/weapon/storage/briefcase/inflatable,/obj/item/device/t_scanner,/obj/item/weapon/rcd)
|
||||
|
||||
/obj/item/clothing/suit/space/void/pilot/prepared
|
||||
helmet = /obj/item/clothing/head/helmet/space/void/pilot
|
||||
boots = /obj/item/clothing/shoes/magboots
|
||||
@@ -9,6 +9,7 @@
|
||||
|
||||
/obj/item/weapon/mining_scanner/attack_self(mob/user as mob)
|
||||
user << "You begin sweeping \the [src] about, scanning for metal deposits."
|
||||
playsound(loc, 'sound/items/goggles_charge.ogg', 50, 1, -6)
|
||||
|
||||
if(!do_after(user, 50))
|
||||
return
|
||||
|
||||
@@ -70,6 +70,7 @@ var/list/mining_overlay_cache = list()
|
||||
density = 0
|
||||
opacity = 0
|
||||
blocks_air = 0
|
||||
can_build_into_floor = TRUE
|
||||
|
||||
/turf/simulated/mineral/floor/ignore_mapgen
|
||||
ignore_mapgen = 1
|
||||
@@ -80,6 +81,7 @@ var/list/mining_overlay_cache = list()
|
||||
density = 0
|
||||
opacity = 0
|
||||
blocks_air = 0
|
||||
can_build_into_floor = TRUE
|
||||
update_general()
|
||||
|
||||
/turf/simulated/mineral/proc/make_wall()
|
||||
@@ -88,6 +90,7 @@ var/list/mining_overlay_cache = list()
|
||||
density = 1
|
||||
opacity = 1
|
||||
blocks_air = 1
|
||||
can_build_into_floor = FALSE
|
||||
update_general()
|
||||
|
||||
/turf/simulated/mineral/proc/update_general()
|
||||
@@ -460,6 +463,8 @@ var/list/mining_overlay_cache = list()
|
||||
//update overlays displaying excavation level
|
||||
if( !(excav_overlay && excavation_level > 0) || update_excav_overlay )
|
||||
var/excav_quadrant = round(excavation_level / 25) + 1
|
||||
if(excav_quadrant > 5)
|
||||
excav_quadrant = 5
|
||||
cut_overlay(excav_overlay)
|
||||
excav_overlay = "overlay_excv[excav_quadrant]_[rand(1,3)]"
|
||||
add_overlay(excav_overlay)
|
||||
|
||||
@@ -426,7 +426,7 @@ var/global/list/robot_modules = list(
|
||||
src.modules += new /obj/item/weapon/inflatable_dispenser/robot(src)
|
||||
src.emag = new /obj/item/weapon/melee/baton/robot/arm(src)
|
||||
src.modules += new /obj/item/device/geiger(src)
|
||||
src.modules += new /obj/item/weapon/rcd/borg(src)
|
||||
src.modules += new /obj/item/weapon/rcd/electric/mounted/borg(src)
|
||||
src.modules += new /obj/item/weapon/pickaxe/plasmacutter(src)
|
||||
src.modules += new /obj/item/weapon/gripper/no_use/loader(src)
|
||||
|
||||
@@ -895,7 +895,7 @@ var/global/list/robot_modules = list(
|
||||
|
||||
/obj/item/weapon/robot_module/drone/construction/New()
|
||||
..()
|
||||
src.modules += new /obj/item/weapon/rcd/borg(src)
|
||||
src.modules += new /obj/item/weapon/rcd/electric/mounted/borg/lesser(src)
|
||||
|
||||
/obj/item/weapon/robot_module/drone/respawn_consumable(var/mob/living/silicon/robot/R, var/amount)
|
||||
var/obj/item/device/lightreplacer/LR = locate() in src.modules
|
||||
|
||||
@@ -83,7 +83,7 @@
|
||||
src.modules += new /obj/item/weapon/tool/wirecutters/cyborg(src)
|
||||
src.modules += new /obj/item/device/multitool/ai_detector(src)
|
||||
src.modules += new /obj/item/weapon/pickaxe/plasmacutter(src)
|
||||
src.modules += new /obj/item/weapon/rcd/borg/lesser(src) // Can't eat rwalls to prevent AI core cheese.
|
||||
src.modules += new /obj/item/weapon/rcd/electric/mounted/borg/lesser(src) // Can't eat rwalls to prevent AI core cheese.
|
||||
src.modules += new /obj/item/weapon/melee/energy/sword/ionic_rapier(src)
|
||||
|
||||
// FBP repair.
|
||||
|
||||
@@ -26,6 +26,7 @@
|
||||
plane = OPENSPACE_PLANE_START
|
||||
pathweight = 100000 //Seriously, don't try and path over this one numbnuts
|
||||
dynamic_lighting = 0 // Someday lets do proper lighting z-transfer. Until then we are leaving this off so it looks nicer.
|
||||
can_build_into_floor = TRUE
|
||||
|
||||
var/turf/below
|
||||
|
||||
|
||||
@@ -78,6 +78,9 @@ var/list/adminfaxes = list() //cache for faxes that have been sent to admins
|
||||
|
||||
else if(href_list["remove"])
|
||||
if(copyitem)
|
||||
if(get_dist(usr, src) >= 2)
|
||||
to_chat(usr, "\The [copyitem] is too far away for you to remove it.")
|
||||
return
|
||||
copyitem.loc = usr.loc
|
||||
usr.put_in_hands(copyitem)
|
||||
to_chat(usr, "<span class='notice'>You take \the [copyitem] out of \the [src].</span>")
|
||||
|
||||
@@ -147,6 +147,11 @@
|
||||
to_chat(user, "<span class='notice'>[src] is already empty!</span>")
|
||||
return
|
||||
to_chat(user, "<span class='notice'>You empty [src].</span>")
|
||||
playsound(user.loc, "casing_sound", 50, 1)
|
||||
spawn(7)
|
||||
playsound(user.loc, "casing_sound", 50, 1)
|
||||
spawn(10)
|
||||
playsound(user.loc, "casing_sound", 50, 1)
|
||||
for(var/obj/item/ammo_casing/C in stored_ammo)
|
||||
C.loc = user.loc
|
||||
C.set_dir(pick(cardinal))
|
||||
|
||||
@@ -327,7 +327,7 @@
|
||||
|
||||
/obj/item/ammo_magazine/m9mmR/saber
|
||||
desc = "A very high capacity double stack magazine made specially for the SABER SMG. Filled with 22 9mm bullets."
|
||||
icon_state = "S9mm-22"
|
||||
icon_state = "S9mm"
|
||||
mag_type = MAGAZINE
|
||||
ammo_type = /obj/item/ammo_casing/a9mm
|
||||
matter = list(DEFAULT_WALL_MATERIAL = 1200)
|
||||
@@ -338,14 +338,9 @@
|
||||
|
||||
/obj/item/ammo_magazine/m9mmR/saber/ap
|
||||
desc = "A high capacity double stack magazine made specially for the SABER SMG. Filled with 22 9mm armor piercing bullets."
|
||||
icon_state = "S9mm-22"
|
||||
mag_type = MAGAZINE
|
||||
icon_state = "S9mm"
|
||||
ammo_type = /obj/item/ammo_casing/a9mm/ap
|
||||
matter = list(DEFAULT_WALL_MATERIAL = 2000)
|
||||
caliber = "9mm"
|
||||
max_ammo = 22
|
||||
origin_tech = list(TECH_COMBAT = 2, TECH_ILLEGAL = 1)
|
||||
multiple_sprites = 1
|
||||
|
||||
/obj/item/ammo_magazine/m9mmR/saber/empty
|
||||
initial_ammo = 0
|
||||
|
||||
@@ -743,6 +743,10 @@
|
||||
var/recharging = 0
|
||||
|
||||
projectile_type = /obj/item/projectile/beam
|
||||
firemodes = list(
|
||||
list(mode_name="normal", fire_delay=12, projectile_type=/obj/item/projectile/beam, charge_cost = 300),
|
||||
list(mode_name="low-power", fire_delay=8, projectile_type=/obj/item/projectile/beam/weaklaser, charge_cost = 60),
|
||||
)
|
||||
|
||||
/obj/item/weapon/gun/energy/frontier/unload_ammo(var/mob/user)
|
||||
if(recharging)
|
||||
@@ -774,13 +778,6 @@
|
||||
/obj/item/weapon/gun/energy/frontier/ex_act() //|rugged|
|
||||
return
|
||||
|
||||
//Needed to fix a bug with the holdout phaser
|
||||
/obj/item/weapon/gun/energy/frontier/basic
|
||||
firemodes = list(
|
||||
list(mode_name="normal", fire_delay=12, projectile_type=/obj/item/projectile/beam, charge_cost = 300),
|
||||
list(mode_name="low-power", fire_delay=8, projectile_type=/obj/item/projectile/beam/weaklaser, charge_cost = 60),
|
||||
)
|
||||
|
||||
/obj/item/weapon/gun/energy/frontier/locked
|
||||
desc = "An extraordinarily rugged laser weapon, built to last and requiring effectively no maintenance. Includes a built-in crank charger for recharging away from civilization. This one has a safety interlock that prevents firing while in proximity to the facility."
|
||||
req_access = list(access_armory) //for toggling safety
|
||||
@@ -811,13 +808,6 @@
|
||||
return 0
|
||||
return ..()
|
||||
|
||||
//Needed to fix a bug with the holdout phaser
|
||||
/obj/item/weapon/gun/energy/frontier/locked/basic
|
||||
firemodes = list(
|
||||
list(mode_name="normal", fire_delay=12, projectile_type=/obj/item/projectile/beam, charge_cost = 300),
|
||||
list(mode_name="low-power", fire_delay=8, projectile_type=/obj/item/projectile/beam/weaklaser, charge_cost = 60),
|
||||
)
|
||||
|
||||
//Expeditionary Holdout Phaser
|
||||
/obj/item/weapon/gun/energy/frontier/locked/holdout
|
||||
name = "holdout frontier phaser"
|
||||
@@ -826,9 +816,10 @@
|
||||
icon_state = "PDW"
|
||||
item_state = "gun"
|
||||
w_class = ITEMSIZE_SMALL
|
||||
charge_cost = 600
|
||||
firemodes = list(
|
||||
list(mode_name="normal", fire_delay=12, projectile_type=/obj/item/projectile/beam, charge_cost = 1200),
|
||||
list(mode_name="low-power", fire_delay=8, projectile_type=/obj/item/projectile/beam/weaklaser, charge_cost = 240),
|
||||
list(mode_name="normal", fire_delay=12, projectile_type=/obj/item/projectile/beam, charge_cost = 600),
|
||||
list(mode_name="low-power", fire_delay=8, projectile_type=/obj/item/projectile/beam/weaklaser, charge_cost = 120),
|
||||
)
|
||||
|
||||
/obj/item/weapon/gun/energy/frontier/locked/holdout/proc/update_mode()
|
||||
|
||||
37
html/changelogs/Neerti-RCDs.yml
Normal file
37
html/changelogs/Neerti-RCDs.yml
Normal file
@@ -0,0 +1,37 @@
|
||||
################################
|
||||
# Example Changelog File
|
||||
#
|
||||
# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb.
|
||||
#
|
||||
# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.)
|
||||
# When it is, any changes listed below will disappear.
|
||||
#
|
||||
# Valid Prefixes:
|
||||
# bugfix
|
||||
# wip (For works in progress)
|
||||
# tweak
|
||||
# soundadd
|
||||
# sounddel
|
||||
# rscadd (general adding of nice things)
|
||||
# rscdel (general deleting of nice things)
|
||||
# imageadd
|
||||
# imagedel
|
||||
# maptweak
|
||||
# spellcheck (typo fixes)
|
||||
# experiment
|
||||
#################################
|
||||
|
||||
# Your name.
|
||||
author: Neerti
|
||||
|
||||
# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
|
||||
delete-after: True
|
||||
|
||||
# Any changes you've made. See valid prefix list above.
|
||||
# INDENT WITH TWO SPACES. NOT TABS. SPACES.
|
||||
# SCREW THIS UP AND IT WON'T WORK.
|
||||
# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries.
|
||||
# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog.
|
||||
changes:
|
||||
- rscadd: "RCDs can now build grilles and windows, with a new mode. They can also finish walls when used on girders on floor/wall mode."
|
||||
- rscadd: "Adds various new RCDs that are not obtainable at the moment."
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 62 KiB After Width: | Height: | Size: 61 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 9.9 KiB After Width: | Height: | Size: 13 KiB |
@@ -7,7 +7,7 @@
|
||||
icon_opened = "secureexpopen"
|
||||
icon_broken = "secureexpbroken"
|
||||
icon_off = "secureexpoff"
|
||||
req_access = list(access_explorer)
|
||||
req_access = list(access_gateway)
|
||||
|
||||
starts_with = list(
|
||||
/obj/item/clothing/under/explorer,
|
||||
|
||||
@@ -1948,7 +1948,7 @@
|
||||
dir = 8
|
||||
},
|
||||
/obj/effect/floor_decal/steeldecal/steel_decals9,
|
||||
/obj/machinery/suit_cycler/explorer,
|
||||
/obj/machinery/suit_cycler/exploration,
|
||||
/turf/simulated/floor/tiled,
|
||||
/area/tether/station/explorer_prep)
|
||||
"aeC" = (
|
||||
@@ -22129,9 +22129,23 @@
|
||||
},
|
||||
/turf/simulated/floor/tiled,
|
||||
/area/tether/station/explorer_meeting)
|
||||
"pTz" = (
|
||||
/obj/effect/floor_decal/steeldecal/steel_decals9,
|
||||
/obj/effect/floor_decal/steeldecal/steel_decals9{
|
||||
dir = 8
|
||||
},
|
||||
/obj/effect/floor_decal/steeldecal/steel_decals9{
|
||||
dir = 4
|
||||
},
|
||||
/obj/effect/floor_decal/steeldecal/steel_decals9{
|
||||
dir = 1
|
||||
},
|
||||
/obj/machinery/suit_cycler/pilot,
|
||||
/turf/simulated/floor/tiled,
|
||||
/area/tether/station/excursion_dock)
|
||||
"pYE" = (
|
||||
/obj/structure/closet/secure_closet/pathfinder{
|
||||
req_access = list(18,43,67)
|
||||
req_access = list(62)
|
||||
},
|
||||
/obj/effect/floor_decal/industrial/outline/yellow,
|
||||
/obj/effect/floor_decal/steeldecal/steel_decals9,
|
||||
@@ -22462,7 +22476,7 @@
|
||||
/obj/machinery/door/firedoor/glass,
|
||||
/obj/machinery/door/airlock/research{
|
||||
name = "Pathfinder's Office";
|
||||
req_access = list(18,43,67)
|
||||
req_access = list(62)
|
||||
},
|
||||
/obj/structure/cable/green{
|
||||
d1 = 4;
|
||||
@@ -35486,7 +35500,7 @@ aad
|
||||
aaH
|
||||
aah
|
||||
aah
|
||||
aah
|
||||
pTz
|
||||
abc
|
||||
aad
|
||||
abU
|
||||
|
||||
@@ -174,7 +174,7 @@
|
||||
name = "shuttle control console"
|
||||
shuttle_tag = "Excursion Shuttle"
|
||||
req_access = list()
|
||||
req_one_access = list(access_heads,access_explorer,access_pilot)
|
||||
req_one_access = list(access_explorer,access_pilot)
|
||||
var/wait_time = 45 MINUTES
|
||||
|
||||
/obj/machinery/computer/shuttle_control/web/excursion/ui_interact()
|
||||
|
||||
@@ -395,7 +395,7 @@ var/global/list/latejoin_tram = list()
|
||||
/obj/structure/closet/secure_closet/guncabinet/excursion/New()
|
||||
..()
|
||||
for(var/i = 1 to 4)
|
||||
new /obj/item/weapon/gun/energy/frontier/locked/basic(src)
|
||||
new /obj/item/weapon/gun/energy/frontier/locked(src)
|
||||
for(var/i = 1 to 4)
|
||||
new /obj/item/weapon/gun/energy/frontier/locked/holdout(src)
|
||||
|
||||
|
||||
@@ -846,18 +846,6 @@
|
||||
#include "code\game\machinery\embedded_controller\embedded_controller_base.dm"
|
||||
#include "code\game\machinery\embedded_controller\embedded_program_base.dm"
|
||||
#include "code\game\machinery\embedded_controller\simple_docking_controller.dm"
|
||||
#include "code\game\machinery\kitchen\gibber.dm"
|
||||
#include "code\game\machinery\kitchen\icecream.dm"
|
||||
#include "code\game\machinery\kitchen\microwave.dm"
|
||||
#include "code\game\machinery\kitchen\smartfridge.dm"
|
||||
#include "code\game\machinery\kitchen\smartfridge_vr.dm"
|
||||
#include "code\game\machinery\kitchen\cooking_machines\_cooker.dm"
|
||||
#include "code\game\machinery\kitchen\cooking_machines\_cooker_output.dm"
|
||||
#include "code\game\machinery\kitchen\cooking_machines\candy.dm"
|
||||
#include "code\game\machinery\kitchen\cooking_machines\cereal.dm"
|
||||
#include "code\game\machinery\kitchen\cooking_machines\fryer.dm"
|
||||
#include "code\game\machinery\kitchen\cooking_machines\grill.dm"
|
||||
#include "code\game\machinery\kitchen\cooking_machines\oven.dm"
|
||||
#include "code\game\machinery\pipe\construction.dm"
|
||||
#include "code\game\machinery\pipe\pipe_dispenser.dm"
|
||||
#include "code\game\machinery\pipe\pipe_recipes.dm"
|
||||
@@ -1635,7 +1623,6 @@
|
||||
#include "code\modules\clothing\spacesuits\void\merc.dm"
|
||||
#include "code\modules\clothing\spacesuits\void\military_vr.dm"
|
||||
#include "code\modules\clothing\spacesuits\void\station.dm"
|
||||
#include "code\modules\clothing\spacesuits\void\station_vr.dm"
|
||||
#include "code\modules\clothing\spacesuits\void\void.dm"
|
||||
#include "code\modules\clothing\spacesuits\void\void_vr.dm"
|
||||
#include "code\modules\clothing\spacesuits\void\wizard.dm"
|
||||
@@ -1786,9 +1773,43 @@
|
||||
#include "code\modules\flufftext\Hallucination.dm"
|
||||
#include "code\modules\flufftext\look_up.dm"
|
||||
#include "code\modules\flufftext\TextFilters.dm"
|
||||
#include "code\modules\food\food.dm"
|
||||
#include "code\modules\food\recipe_dump.dm"
|
||||
#include "code\modules\food\recipes_microwave.dm"
|
||||
#include "code\modules\food\recipes_microwave_vr.dm"
|
||||
#include "code\modules\food\drinkingglass\drinkingglass.dm"
|
||||
#include "code\modules\food\drinkingglass\extras.dm"
|
||||
#include "code\modules\food\drinkingglass\glass_boxes.dm"
|
||||
#include "code\modules\food\drinkingglass\glass_types.dm"
|
||||
#include "code\modules\food\drinkingglass\metaglass.dm"
|
||||
#include "code\modules\food\drinkingglass\shaker.dm"
|
||||
#include "code\modules\food\food\cans.dm"
|
||||
#include "code\modules\food\food\condiment.dm"
|
||||
#include "code\modules\food\food\drinks.dm"
|
||||
#include "code\modules\food\food\lunch.dm"
|
||||
#include "code\modules\food\food\sandwich.dm"
|
||||
#include "code\modules\food\food\snacks.dm"
|
||||
#include "code\modules\food\food\snacks_vr.dm"
|
||||
#include "code\modules\food\food\z_custom_food_vr.dm"
|
||||
#include "code\modules\food\food\drinks\bottle.dm"
|
||||
#include "code\modules\food\food\drinks\cup.dm"
|
||||
#include "code\modules\food\food\drinks\drinkingglass.dm"
|
||||
#include "code\modules\food\food\drinks\jar.dm"
|
||||
#include "code\modules\food\food\drinks\bottle\robot.dm"
|
||||
#include "code\modules\food\food\snacks\meat.dm"
|
||||
#include "code\modules\food\glass\bottle.dm"
|
||||
#include "code\modules\food\glass\bottle\robot.dm"
|
||||
#include "code\modules\food\kitchen\gibber.dm"
|
||||
#include "code\modules\food\kitchen\icecream.dm"
|
||||
#include "code\modules\food\kitchen\microwave.dm"
|
||||
#include "code\modules\food\kitchen\smartfridge.dm"
|
||||
#include "code\modules\food\kitchen\cooking_machines\_cooker.dm"
|
||||
#include "code\modules\food\kitchen\cooking_machines\_cooker_output.dm"
|
||||
#include "code\modules\food\kitchen\cooking_machines\candy.dm"
|
||||
#include "code\modules\food\kitchen\cooking_machines\cereal.dm"
|
||||
#include "code\modules\food\kitchen\cooking_machines\fryer.dm"
|
||||
#include "code\modules\food\kitchen\cooking_machines\grill.dm"
|
||||
#include "code\modules\food\kitchen\cooking_machines\oven.dm"
|
||||
#include "code\modules\gamemaster\controller.dm"
|
||||
#include "code\modules\gamemaster\defines.dm"
|
||||
#include "code\modules\gamemaster\game_master.dm"
|
||||
@@ -2654,7 +2675,6 @@
|
||||
#include "code\modules\reagents\reagent_containers\blood_pack_vr.dm"
|
||||
#include "code\modules\reagents\reagent_containers\borghydro.dm"
|
||||
#include "code\modules\reagents\reagent_containers\dropper.dm"
|
||||
#include "code\modules\reagents\reagent_containers\food.dm"
|
||||
#include "code\modules\reagents\reagent_containers\glass.dm"
|
||||
#include "code\modules\reagents\reagent_containers\glass_vr.dm"
|
||||
#include "code\modules\reagents\reagent_containers\hypospray.dm"
|
||||
@@ -2663,30 +2683,6 @@
|
||||
#include "code\modules\reagents\reagent_containers\spray.dm"
|
||||
#include "code\modules\reagents\reagent_containers\spray_vr.dm"
|
||||
#include "code\modules\reagents\reagent_containers\syringes.dm"
|
||||
#include "code\modules\reagents\reagent_containers\syringes_vr.dm"
|
||||
#include "code\modules\reagents\reagent_containers\drinkingglass\drinkingglass.dm"
|
||||
#include "code\modules\reagents\reagent_containers\drinkingglass\extras.dm"
|
||||
#include "code\modules\reagents\reagent_containers\drinkingglass\glass_boxes.dm"
|
||||
#include "code\modules\reagents\reagent_containers\drinkingglass\glass_types.dm"
|
||||
#include "code\modules\reagents\reagent_containers\drinkingglass\metaglass.dm"
|
||||
#include "code\modules\reagents\reagent_containers\drinkingglass\shaker.dm"
|
||||
#include "code\modules\reagents\reagent_containers\food\cans.dm"
|
||||
#include "code\modules\reagents\reagent_containers\food\condiment.dm"
|
||||
#include "code\modules\reagents\reagent_containers\food\drinks.dm"
|
||||
#include "code\modules\reagents\reagent_containers\food\lunch.dm"
|
||||
#include "code\modules\reagents\reagent_containers\food\sandwich.dm"
|
||||
#include "code\modules\reagents\reagent_containers\food\snacks.dm"
|
||||
#include "code\modules\reagents\reagent_containers\food\snacks_vr.dm"
|
||||
#include "code\modules\reagents\reagent_containers\food\z_custom_food_vr.dm"
|
||||
#include "code\modules\reagents\reagent_containers\food\drinks\bluespacecoffee.dm"
|
||||
#include "code\modules\reagents\reagent_containers\food\drinks\bottle.dm"
|
||||
#include "code\modules\reagents\reagent_containers\food\drinks\cup.dm"
|
||||
#include "code\modules\reagents\reagent_containers\food\drinks\jar.dm"
|
||||
#include "code\modules\reagents\reagent_containers\food\drinks\bottle\robot.dm"
|
||||
#include "code\modules\reagents\reagent_containers\food\snacks\meat.dm"
|
||||
#include "code\modules\reagents\reagent_containers\glass\bottle.dm"
|
||||
#include "code\modules\reagents\reagent_containers\glass\bottle_vr.dm"
|
||||
#include "code\modules\reagents\reagent_containers\glass\bottle\robot.dm"
|
||||
#include "code\modules\recycling\conveyor2.dm"
|
||||
#include "code\modules\recycling\disposal-construction.dm"
|
||||
#include "code\modules\recycling\disposal.dm"
|
||||
|
||||
Reference in New Issue
Block a user