diff --git a/code/__defines/dcs/signals.dm b/code/__defines/dcs/signals.dm index f4b4048b00d..10f23e89cdc 100644 --- a/code/__defines/dcs/signals.dm +++ b/code/__defines/dcs/signals.dm @@ -791,4 +791,8 @@ #define COMSIG_VORE_HEALTHBAR_UPDATE "vore_healthbar_update" #define COMSIG_VORE_HEALTHBAR_CLEANUP "vore_healthbar_cleanup" #define HIDE_AND_SEEK_ROUND_END "round_end" +#define COMSIG_KEY_ATTACK "key_event" +#define COMSIG_DUNGEON_TRIGGER "dungeon_trigger" +#define COMSIG_DUNGEON_UNTRIGGER "dungeon_untrigger" +#define COMSIG_RESOLVE_ATTACKBY "resolve_attackby" //RS ADD END diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index 530bd938c7a..b4059dd740a 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -48,6 +48,9 @@ build_click(src, client.buildmode, params, A) return + if(client?.dungeon_maker) //RS ADD + dungeon_maker_click(src,client.dungeon_maker, params, A) //RS ADD + if(is_incorporeal()) //RS ADD START - don't shoot at or attack people while you are intangible face_atom(A) return //RS ADD END diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm index e166ef2efa8..b345b8995f3 100644 --- a/code/_onclick/item_attack.dm +++ b/code/_onclick/item_attack.dm @@ -45,6 +45,7 @@ avoid code duplication. This includes items that may sometimes act as a standard //I would prefer to rename this to attack(), but that would involve touching hundreds of files. /obj/item/proc/resolve_attackby(atom/A, mob/user, var/attack_modifier = 1, var/click_parameters) + SEND_SIGNAL(src,COMSIG_RESOLVE_ATTACKBY,A,user) //RS ADD add_fingerprint(user) . = pre_attack(A, user, click_parameters) if(.) // We're returning the value of pre_attack, important if it has a special return. diff --git a/code/game/Rogue Star/_Component/component_adder.dm b/code/game/Rogue Star/_Component/component_adder.dm new file mode 100644 index 00000000000..044578feb66 --- /dev/null +++ b/code/game/Rogue Star/_Component/component_adder.dm @@ -0,0 +1,156 @@ +//RS FILE +/obj/component_adder //This base type doesn't do anything! + name = "component adder" + desc = "You shouldn't see this." + icon = 'icons/rogue-star/component_adder.dmi' + icon_state = "adder" + plane = PLANE_ADMIN_SECRET + color = "#1ae200" + var/component_type + var/id = "REPLACE ME" + var/list/valid_types = list() + var/late = FALSE + +/obj/component_adder/New(loc, new_id) + . = ..() + if(new_id) + id = new_id + +/obj/component_adder/Initialize(mapload) + . = ..() + if(late) + return INITIALIZE_HINT_LATELOAD + seek_valid_target() + qdel(src) + +/obj/component_adder/LateInitialize() + seek_valid_target() + qdel(src) + +/obj/component_adder/proc/seek_valid_target() + if(!component_type) + return + var/turf/T = get_turf(src) + for(var/atom/thing in T.contents) + if(thing == src) + continue + for(var/type_check in valid_types) + if(istype(thing,type_check)) + if(!special_check(thing)) + add_component(thing) + +/obj/component_adder/proc/add_component(var/atom/target) + if(!target) + return + . = target.LoadComponent(component_type,id,color) + +/obj/component_adder/proc/consider_overlay_state(var/atom/consider) + return null + +/obj/component_adder/proc/special_check(var/atom/consider) + return FALSE + +/obj/component_adder/lock + name = "lock component" + icon_state = "lock" + component_type = /datum/component/dungeon_mechanic/lock + valid_types = list( + /obj/machinery/door/airlock, + /obj/structure/simple_door, + /obj/dungeon_obstacle, + /obj/machinery/door/blast, + /obj/dungeon_switch, + /obj/multipoint/teleporter, + /obj/structure/closet, + /obj/structure/portal_event + ) + var/onetime = FALSE + +/obj/component_adder/lock/add_component(atom/target) + var/datum/component/dungeon_mechanic/lock/L = ..() + L.onetime = onetime + +/obj/component_adder/key + name = "key component" + icon_state = "key" + component_type = /datum/component/dungeon_mechanic/key + valid_types = list( + /obj/item/key, + /obj/item/weapon/card + ) + var/onetime = FALSE + var/master = FALSE + +/obj/component_adder/key/add_component(atom/target) + var/datum/component/dungeon_mechanic/key/K = ..() + K.onetime = onetime + K.master_key = master + +/obj/component_adder/key/onetime + onetime = TRUE +/obj/component_adder/key/master + master = TRUE +/obj/component_adder/key/onetime_master + onetime = TRUE + master = TRUE + +/obj/component_adder/trigger + name = "trigger component" + icon_state = "trigger" + component_type = /datum/component/dungeon_mechanic/trigger + valid_types = list( + /obj/dungeon_obstacle, + /obj/dungeon_switch, + /obj/machinery/door/airlock, + /obj/structure/simple_door, + /obj/machinery/door/blast, + /obj/multipoint_trigger, + /obj/listener + ) + var/onetime = FALSE + var/solo = TRUE + var/key_lock = FALSE + +/obj/component_adder/trigger/onetime + onetime = TRUE +/obj/component_adder/trigger/non_solo + solo = FALSE +/obj/component_adder/trigger/puzzle + onetime = TRUE + solo = FALSE +/obj/component_adder/trigger/gather_gate + onetime = TRUE + solo = FALSE + key_lock = TRUE + +/obj/component_adder/trigger/add_component() + var/datum/component/dungeon_mechanic/trigger/T = ..() + T.onetime = onetime + T.solo = solo + T.key_lock = key_lock + +/obj/component_adder/reciever + name = "reciever component" + icon_state = "reciever" + component_type = /datum/component/dungeon_mechanic/reciever + valid_types = list( + /obj/machinery/door/airlock, + /obj/structure/simple_door, + /obj/dungeon_obstacle, + /obj/machinery/door/blast, + /obj/dungeon_switch, + /obj/multipoint/teleporter, + /obj/multipoint/barrier, + /obj/structure/portal_event + ) + late = TRUE + +/obj/component_adder/pair + name = "pair component" + icon_state = "pair" + component_type = /datum/component/dungeon_mechanic/pair + valid_types = list( + /obj/multipoint/teleporter, + /obj/structure/portal_event + ) + late = TRUE diff --git a/code/game/Rogue Star/_Component/dungeon_component.dm b/code/game/Rogue Star/_Component/dungeon_component.dm new file mode 100644 index 00000000000..fbb849d0f03 --- /dev/null +++ b/code/game/Rogue Star/_Component/dungeon_component.dm @@ -0,0 +1,314 @@ +//RS FILE +var/global/list/dungeon_components = list() + +/datum/component/dungeon_mechanic + var/id = "REPLACE ME" + var/overlay_icon = 'icons/rogue-star/component_adder.dmi' + var/overlay_state + var/overlay_color = "#1ae200" + var/static/list/overlays_cache = list() + +/datum/component/dungeon_mechanic/Initialize(var/our_id,var/our_color) + if(!isobj(parent)) + return COMPONENT_INCOMPATIBLE + if(our_id) + id = our_id + if(our_color) + overlay_color = our_color + dungeon_components |= src + var/obj/O = parent + RegisterSignal(O, COMSIG_ATOM_UPDATE_ICON , PROC_REF(add_component_overlay)) + add_component_overlay() + +/datum/component/dungeon_mechanic/proc/add_component_overlay() + if(!overlay_state) + return + var/key = "[overlay_state]-[overlay_color]" + var/image/overlay = overlays_cache[key] + if(!overlay) + overlay = image(overlay_icon,null,overlay_state) + overlay.color = overlay_color + overlay.plane = PLANE_ADMIN_SECRET + overlay.appearance_flags = RESET_COLOR|KEEP_APART|PIXEL_SCALE + overlays_cache[key] = overlay + var/obj/O = parent + O.add_overlay(overlay) + +//LOCK// - It won't work unless you unlock it +/datum/component/dungeon_mechanic/lock + overlay_state = "lock_s" + var/locked = TRUE + var/onetime = FALSE + +/datum/component/dungeon_mechanic/lock/Initialize(var/our_id) + . = ..() + var/obj/O = parent + O.dungeon_lock() + +/datum/component/dungeon_mechanic/lock/proc/toggle_lock(var/obj/O) + locked = !locked + if(locked) + O.dungeon_lock() + else + O.dungeon_unlock() + +//KEY// - The thing that asks locks to unlock +/datum/component/dungeon_mechanic/key + overlay_state = "key_s" + var/onetime = FALSE + var/master_key = FALSE + +/datum/component/dungeon_mechanic/key/Initialize(our_id, our_color) + . = ..() + RegisterSignal(parent, COMSIG_RESOLVE_ATTACKBY , PROC_REF(lock_interact)) + +/datum/component/dungeon_mechanic/key/proc/lock_interact() + var/obj/O = args[2] + if(!isobj(O)) + return + var/mob/living/user = args[3] + var/datum/component/dungeon_mechanic/lock/L = O.getlock() + if(!L) + return + + if(id == L.id || master_key) + if(!L.locked && onetime) + to_chat(user,SPAN_NOTICE("\The [O] is already unlocked! You don't need to use \the [parent] on it.")) + return + if(user) + user.visible_message(SPAN_NOTICE("\The [user] inserts \the [parent] into \the [O]..."),SPAN_NOTICE("You insert \the [parent] into \the [O]...")) + unlocked(user) + L.toggle_lock(O) + + else if(user) + to_chat(user,SPAN_DANGER("\The [parent] doesn't fit into \the [O]...")) + +/datum/component/dungeon_mechanic/key/proc/unlocked(var/mob/user) + if(onetime) + if(user) + to_chat(user,SPAN_DANGER("\The [parent] crumbles away to dust after being used.")) + user.drop_from_inventory(parent,get_turf(user)) + qdel(parent) + +//RECIEVER// - The thing that gets told what to do +/datum/component/dungeon_mechanic/reciever + overlay_state = "reciever_s" + +/datum/component/dungeon_mechanic/reciever/Initialize(var/our_id) + . = ..() + for(var/datum/component/dungeon_mechanic/trigger/T in dungeon_components) + if(T == src) + continue + if(!istype(T,/datum/component/dungeon_mechanic/trigger)) + continue + if(T.id == id) + RegisterSignal(T,COMSIG_DUNGEON_TRIGGER,PROC_REF(link_trigger)) + RegisterSignal(T,COMSIG_DUNGEON_UNTRIGGER,PROC_REF(link_trigger)) + +/datum/component/dungeon_mechanic/reciever/Destroy(force, silent) + dungeon_components -= src + for(var/datum/component/dungeon_mechanic/trigger/T in dungeon_components) + if(id == T.id) + UnregisterSignal(T,COMSIG_DUNGEON_TRIGGER) + UnregisterSignal(T,COMSIG_DUNGEON_UNTRIGGER) + return ..() + +/datum/component/dungeon_mechanic/reciever/proc/link_trigger() + var/obj/O = parent + O.dungeon_trigger() + +//TRIGGER// - The thing that tells other things to do things +/datum/component/dungeon_mechanic/trigger + overlay_state = "trigger_s" + var/triggered = FALSE //Are we triggered or untriggered + var/onetime = FALSE //If true we can only be triggered, once triggered, we can not be untriggered + var/solo = TRUE //If FALSE will require ALL of the triggers with the same ID to be triggered before it will send the trigger signal + var/key_lock = FALSE //If TRUE (and solo is FALSE) requires unique ckeys to hit each trigger + var/triggered_by //A recording of who triggered the trigger (only relevent if key_lock is TRUE) + var/last_triggered = 0 + +/datum/component/dungeon_mechanic/trigger/Initialize(our_id) + . = ..() + RegisterSignal(parent, COMSIG_DUNGEON_TRIGGER , PROC_REF(toggle_trigger)) + RegisterSignal(parent, COMSIG_DUNGEON_UNTRIGGER , PROC_REF(toggle_trigger)) + +/datum/component/dungeon_mechanic/trigger/Destroy(force, silent) + dungeon_components -= src + UnregisterSignal(parent, COMSIG_DUNGEON_TRIGGER) + UnregisterSignal(parent, COMSIG_DUNGEON_UNTRIGGER) + + for(var/datum/component/dungeon_mechanic/reciever/L in dungeon_components) + if(id == L.id) + L.UnregisterSignal(src,COMSIG_DUNGEON_TRIGGER) + return ..() + +/datum/component/dungeon_mechanic/trigger/proc/toggle_trigger() + if(last_triggered + 2 > world.time) + return + var/mob/user + if(args.len >= 2) + user = args[2] + + if(!triggered) + trigger(user) + else + untrigger() + +/datum/component/dungeon_mechanic/trigger/proc/should_key_trigger(var/key) + if(!key_lock) + return TRUE + + for(var/datum/component/dungeon_mechanic/trigger/T in dungeon_components) + if(T.id != id) + continue + if(!T.triggered_by) + continue + if(T.triggered_by == key) + return FALSE + + return TRUE + +/datum/component/dungeon_mechanic/trigger/proc/trigger(var/mob/user) + last_triggered = world.time + var/signal = TRUE + if(!solo) + for(var/datum/component/dungeon_mechanic/trigger/T in dungeon_components) + if(T == src) + continue + if(T.id != id) + continue + if(key_lock) //If key_lock is true then we need unique ckeys for each trigger. + if(!user) + return + if(!user.ckey) + return + if(T.triggered_by == user.ckey) + to_chat(user,SPAN_WARNING("\The [parent] very unsatisfyingly does nothing when you interact with it. Perhaps someone else needs to interact with this one.")) + return + if(!T.triggered) + signal = FALSE + + if(user?.ckey) + triggered_by = user.ckey + + triggered = TRUE + var/obj/P = parent + P.dungeon_trigger() + if(signal) + SEND_SIGNAL(src,COMSIG_DUNGEON_TRIGGER) + var/turf/T = get_turf(parent) + T.visible_message("\The [parent] clicks audibly as it is triggered...",runemessage = "click...") + +/datum/component/dungeon_mechanic/trigger/proc/untrigger() + if(onetime) + return + last_triggered = world.time + SEND_SIGNAL(src,COMSIG_DUNGEON_UNTRIGGER) + triggered = FALSE + triggered_by = null + + var/obj/P = parent + P.dungeon_untrigger() + + var/turf/T = get_turf(parent) + T.visible_message("\The [parent] clunks audibly as it is untriggered...",runemessage = "clunk...") + +//PAIR// - So things can know about eachother, such as teleporters +/datum/component/dungeon_mechanic/pair + overlay_state = "pair_s" + var/list/partner = list() + +/datum/component/dungeon_mechanic/pair/Initialize(our_id) + . = ..() + pair_with_partners() + +/datum/component/dungeon_mechanic/pair/proc/pair_with_partners() + var/paired = FALSE + for(var/datum/component/dungeon_mechanic/pair/P in dungeon_components) + if(P.type != type) + continue + if(P == src) + continue + if(id == P.id) + partner |= P + P.partner |= src + var/obj/O = P.parent + O.dungeon_pair() + if(paired) + var/obj/ourparent = parent + ourparent.dungeon_pair() + +/datum/component/dungeon_mechanic/pair/proc/unpair_with_partners() + for(var/datum/component/dungeon_mechanic/pair/P in partner) + P.partner -= src + partner -= P + +//////////RELATED OBJ PROCS////////// +/obj/proc/dungeon_trigger(var/mob/user) //This is the main trigger action, if you want something that always does the same thing, use this, all the other procs default to this + return FALSE +/obj/proc/dungeon_untrigger(var/mob/user) //If you need a specific untrigger action + dungeon_trigger(user) + +/obj/proc/dungeon_lock(var/mob/user) //If you need a specific lock action + dungeon_trigger(user) + +/obj/proc/dungeon_unlock(var/mob/user) //If you need a specific unlock action + dungeon_trigger(user) + +/obj/proc/dungeon_pair() + if(islocked()) + return FALSE + if(getreciever()) + return FALSE + return TRUE + +/obj/proc/getlock() + return GetComponent(/datum/component/dungeon_mechanic/lock) + +/obj/proc/islocked() + var/datum/component/dungeon_mechanic/lock/ourlock = GetComponent(/datum/component/dungeon_mechanic/lock) + if(ourlock?.locked) + return TRUE + return FALSE + +/obj/proc/cantrigger(var/mob/user) + var/datum/component/dungeon_mechanic/trigger/trigger = GetComponent(/datum/component/dungeon_mechanic/trigger) + if(!trigger) + return FALSE + if(trigger.onetime && trigger.triggered) + return FALSE + if(trigger.last_triggered + 2 > world.time) + return FALSE + if(trigger.key_lock) + if(!user.ckey) + return FALSE + return trigger.should_key_trigger(user.ckey) + + return TRUE + +/obj/proc/istriggered() + var/datum/component/dungeon_mechanic/trigger/trigger = GetComponent(/datum/component/dungeon_mechanic/trigger) + if(!trigger) + return FALSE + return trigger.triggered + +/obj/proc/get_dungeon_pair() + var/datum/component/dungeon_mechanic/pair/P = GetComponent(/datum/component/dungeon_mechanic/pair) + if(!P) + return FALSE + if(P.partner) + if(P.partner.len <= 0) + return FALSE + return P.partner + +/obj/proc/getkey() + var/datum/component/dungeon_mechanic/key/K = GetComponent(/datum/component/dungeon_mechanic/key) + if(!K) + return FALSE + return K + +/obj/proc/getreciever() + var/datum/component/dungeon_mechanic/reciever/R = GetComponent(/datum/component/dungeon_mechanic/reciever) + if(!R) + return FALSE + return R diff --git a/code/game/Rogue Star/dehydration.dm b/code/game/Rogue Star/dehydration.dm new file mode 100644 index 00000000000..415a4b89c3b --- /dev/null +++ b/code/game/Rogue Star/dehydration.dm @@ -0,0 +1,53 @@ +//RS FILE +/datum/reagent/dry + name = "dehydrated nutrint mix" + id = "dryfood" + description = "A specialised chemical mix that, once activated will expand into a prepared food item! Ingesting this before adding water is not advised, as the chemical reaction will take water from the body and dehydrate the imbiber." + taste_description = "meat chalk" + reagent_state = SOLID + color = "#523026" + +/datum/reagent/dry/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) + . = ..() + if(M.isSynthetic(M)) + return + M.add_modifier(/datum/modifier/dehydrated) + M.bloodstr.remove_reagent(id, volume) + +/datum/modifier/dehydrated + name = "dehydrated" + desc = "You're all dried out! You really need some water!" + + on_created_text = "Your mouth and eyes are dry, and you can feel a headache forming! You feel so weak... you could really use a drink..." + on_expired_text = "That's it!!! The water was just what you needed! You're feeling much better now." + + incoming_damage_percent = 1.5 + incoming_healing_percent = 0.5 + outgoing_melee_damage_percent = 0.5 + slowdown = 4 + evasion = -50 + accuracy = -50 + accuracy_dispersion = 20 + metabolism_percent = 4.0 + attack_speed_percent = 4 + pulse_modifier = 1.5 + +/datum/modifier/dehydrated/New(new_holder, new_origin) + . = ..() + holder.throw_alert("dehydrated", /obj/screen/alert/dehydrated) +/datum/modifier/dehydrated/expire(silent) + . = ..() + holder.clear_alert("dehydrated") + +/obj/screen/alert/dehydrated + name = "Dehydrated" + desc = "You could really use some water..." + icon = 'icons/rogue-star/misc.dmi' + icon_state = "dehydrated" + +/datum/reagent/water/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) + var/datum/modifier/dehydrated/D = M.get_modifier_of_type(/datum/modifier/dehydrated) + if(D) + D.expire() + else + ..() diff --git a/code/game/Rogue Star/dungeon_maker.dm b/code/game/Rogue Star/dungeon_maker.dm new file mode 100644 index 00000000000..da234c50eab --- /dev/null +++ b/code/game/Rogue Star/dungeon_maker.dm @@ -0,0 +1,141 @@ +//RS FILE +/client + var/list/utility + var/dungeon_maker = null + +/client/proc/toggle_dungeon_maker() + set name = "Toggle Dungeon Maker" + set category = "Special Verbs" + + if(!holder) + clear_utility() + return + + if(utility) + clear_utility() + return + utility = list() + show_popup_menus = FALSE + log_admin("[key_name(usr)] has entered dungeon maker.") + var/obj/effect/dungeon_maker/holder/H = new() + utility |= H + screen += H + +/client/proc/clear_utility() + for(var/thing in utility) + utility -= thing + screen -= thing + qdel(thing) + show_popup_menus = TRUE + QDEL_LIST_NULL(utility) + log_admin("[key_name(usr)] has left dungeon maker.") + +/obj/effect/dungeon_maker + density = TRUE + anchored = TRUE + layer = LAYER_HUD_BASE + plane = PLANE_PLAYER_HUD + dir = NORTH + icon = 'icons/rogue-star/dungeon_maker.dmi' + icon_state = "base" + color = "#ff9100" + +// screen_loc = "CENTER,WEST" + +/obj/effect/dungeon_maker/holder + var/lock_id = null + var/trigger_id = null + screen_loc = "WEST,CENTER" + icon = null + icon_state = null + +/obj/effect/dungeon_maker/holder/Initialize() + . = ..() + add_button(/obj/effect/dungeon_maker/button/link) + add_button(/obj/effect/dungeon_maker/button/lock) + add_button(/obj/effect/dungeon_maker/button/mechanic) + +/obj/effect/dungeon_maker/holder/Destroy() + for(var/thing in contents) + qdel(thing) + return ..() + +/obj/effect/dungeon_maker/holder/proc/add_button(var/button_type) + if(!ispath(button_type)) + log_and_message_admins("An dungeon_maker/holder was given [button_type], but that is not a type so it didn't make it.") + return + var/obj/effect/dungeon_maker/ourbutton = new button_type(src) + vis_contents += ourbutton + +/obj/effect/dungeon_maker/holder/Click(location, control, params) + var/list/pa = params2list(params) + if(pa.Find("middle")) + //??? + return + else if(pa.Find("left")) + //Close + return + else if(pa.Find("right")) + //??? + return + +/obj/effect/dungeon_maker/button + var/obj/effect/dungeon_maker/holder/master = null + +/obj/effect/dungeon_maker/button/link + name = "Link" + icon_state = "link" +// screen_loc = "CENTER,WEST" + +/obj/effect/dungeon_maker/button/link/Click(location, control, params) + to_world("link") + var/list/pa = params2list(params) + if(pa.Find("middle")) + //Pick up clicked trigger_id + return + else if(pa.Find("left")) + //Apply clicked trigger_id + return + else if(pa.Find("right")) + //Open context menu for given object + return + +/obj/effect/dungeon_maker/button/lock + name = "Lock" + icon_state = "lock" +// screen_loc = "CENTER-1,WEST" + pixel_y = -34 + +/obj/effect/dungeon_maker/button/lock/Click(location, control, params) + to_world("lock") + var/list/pa = params2list(params) + if(pa.Find("middle")) + //Pick up clicked lock_id + return + else if(pa.Find("left")) + //Add or update lock on clicked + return + else if(pa.Find("right")) + //Open context menu for given object + return + +/obj/effect/dungeon_maker/button/mechanic + name = "Mechanic" + icon_state = "mechanic" +// screen_loc = "CENTER-2,WEST" + pixel_y = -68 + +/obj/effect/dungeon_maker/button/mechanic/Click(location, control, params) + to_world("mechanic") + var/list/pa = params2list(params) + if(pa.Find("middle")) + //Pick up clicked object if it is a valid type + return + else if(pa.Find("left")) + //Place selected object if one exists + return + else if(pa.Find("right")) + //Open context menu for given object + return + +/proc/dungeon_maker_click(var/mob/user, buildmode, params, var/obj/object) diff --git a/code/game/Rogue Star/multipoint_barrier.dm b/code/game/Rogue Star/multipoint_barrier.dm index 426545a743d..bae3adcf590 100644 --- a/code/game/Rogue Star/multipoint_barrier.dm +++ b/code/game/Rogue Star/multipoint_barrier.dm @@ -9,8 +9,6 @@ var/global/list/multipoint_trigger_list = list() // Used for admin-only reset v icon = 'icons/rogue-star/misc.dmi' icon_state = "box" - var/trigger_id = "REPLACE ME" //Use this to set which triggers are connected to eachother and the object they are connected to - /obj/multipoint/New(loc, ...) . = ..() multipoint_triggerable_list |= src @@ -37,7 +35,6 @@ var/global/list/multipoint_trigger_list = list() // Used for admin-only reset v color = "#fc033d" plane = PLANE_LIGHTING_ABOVE - trigger_id = "barrier" //Use this to set which triggers are connected to eachother and the barrier they are connected to /obj/multipoint/barrier/Initialize() var/area/A = get_area(src) @@ -55,6 +52,12 @@ var/global/list/multipoint_trigger_list = list() // Used for admin-only reset v alpha = 255 plane = PLANE_LIGHTING_ABOVE +/obj/multipoint/barrier/dungeon_trigger(mob/user) + trigger() + +/obj/multipoint/barrier/dungeon_untrigger(mob/user) + untrigger() + /////TELEPORTER///// /obj/multipoint/teleporter name = "mysterious pad" @@ -82,14 +85,6 @@ var/global/list/multipoint_trigger_list = list() // Used for admin-only reset v return toggle_active() -/obj/multipoint/teleporter/New(loc, ...) - . = ..() - teleporters_list |= src - -/obj/multipoint/teleporter/Destroy() - teleporters_list -= src - . = ..() - /obj/multipoint/teleporter/Bumped(AM) . = ..() @@ -113,8 +108,8 @@ var/global/list/multipoint_trigger_list = list() // Used for admin-only reset v teleport(usr) /obj/multipoint/teleporter/update_icon() - . = ..() cut_overlays() + . = ..() if(density) icon_state = active_state if(!teleporter_overlay) @@ -137,16 +132,14 @@ var/global/list/multipoint_trigger_list = list() // Used for admin-only reset v /obj/multipoint/teleporter/proc/teleport(var/to_teleport) if(!to_teleport) return - var/list/targlist = list() - for(var/obj/multipoint/teleporter/tele in teleporters_list) - if(tele == src) - continue - if(tele.teleport_id == teleport_id) - targlist |= tele - + var/list/targlist = get_dungeon_pair() + if(!targlist) + return if(targlist.len <= 0) - toggle_active() - teleport_to_opposite_side_or_randomize(to_teleport,src,pick(targlist)) + return + var/datum/component/dungeon_mechanic/pair/P = pick(targlist) + var/obj/target = P.parent + teleport_to_opposite_side_or_randomize(to_teleport,src,target) /obj/multipoint/teleporter/proc/toggle_active() density = !density @@ -157,12 +150,29 @@ var/global/list/multipoint_trigger_list = list() // Used for admin-only reset v update_icon() /obj/multipoint/teleporter/proc/assess_activity() - for(var/obj/multipoint/teleporter/tele in teleporters_list) - if(tele == src) - continue - if(tele.teleport_id == teleport_id) - toggle_active() - return + var/list/targs = get_dungeon_pair() + if(!targs) + return + if(targs.len <= 0) + return + + toggle_active() + +/obj/multipoint/teleporter/dungeon_trigger(mob/user) + assess_activity() + +/obj/multipoint/teleporter/dungeon_lock(mob/user) + if(!density) + return + density = FALSE + update_icon() + visible_message(SPAN_DANGER("\The [src] shuts down..."),runemessage = "...") + +/obj/multipoint/teleporter/dungeon_pair() + . = ..() + + if(.) + assess_activity() /////DA BUTTAN///// /obj/multipoint_trigger @@ -178,7 +188,6 @@ var/global/list/multipoint_trigger_list = list() // Used for admin-only reset v var/triggered_key //When you press a key, you can't press another key var/static/list/trigger_list = list() //A list of our fellow triggers to iterate through - var/trigger_id = "REPLACE ME" //Customize this to set which triggers are connected to eachother and the barrier they are connected to var/triggered_state = "button-p" var/untriggered_state = "button" var/doubles = FALSE //If false, the trigger will not allow you to activate a linked trigger if you have already activated one. Any that are true will not care if you pushed another @@ -204,8 +213,9 @@ var/global/list/multipoint_trigger_list = list() // Used for admin-only reset v . = ..() /obj/multipoint_trigger/update_icon() + cut_overlays() . = ..() - if(!triggered_key) + if(!istriggered()) icon_state = untriggered_state if(!overlay_state) return @@ -219,7 +229,6 @@ var/global/list/multipoint_trigger_list = list() // Used for admin-only reset v overlays_cache[combine_key] = our_overlay add_overlay(our_overlay) else - cut_overlays() icon_state = triggered_state /obj/multipoint_trigger/Click(location, control, params) //You clicked it instead of stepping on it, what a weirdo, you don't know where it's been (it doesn't move) @@ -248,51 +257,12 @@ var/global/list/multipoint_trigger_list = list() // Used for admin-only reset v return if(!user.ckey) //Players only return - var/key_detect = FALSE //If true, we discovered the user's ckey on one of the triggers we care about - var/list/triggers = list() //We will gather a list of our triggers to compare to how many are triggered - var/triggered_triggers = 0 //This is what we will compare triggers against. - for(var/obj/multipoint_trigger/T in trigger_list) - if(trigger_id == T.trigger_id) //If our trigger_id is the same then we're controlling the same thing so we'll count it! - triggers |= T - if(T.triggered_key) //Someone pushed it - triggered_triggers ++ //Count it! - if(T.triggered_key == user.ckey) //It's our user!!! - key_detect = TRUE - - if(key_detect && !doubles) //We have already pushed another button. - If doubles, then we don't care if another button was pushed, it'll still push. - if(!triggered_key) //This button has not been pushed though, let's give a hint instead of doing nothing. - to_chat(user,SPAN_WARNING("\The [src] very unsatisfyingly does nothing when you interact with it. Perhaps someone else needs to interact with this one.")) - return + SEND_SIGNAL(src,COMSIG_DUNGEON_TRIGGER,user) - if(!triggered_key) //Our button wasn't pushed already and we did the checks we needed to see if we are allowed to push the button! - visible_message("\The [src] clicks audibly as it is triggered...",runemessage = "click...") //nice - triggered_key = user.ckey //We register the ckey so that you can't do shenanigans. - triggered_triggers ++ //Don't forget to count yourself, you might be the last one! - update_icon() - if(triggers.len == triggered_triggers) //We know how many triggers are connected, and how many have been pushed! If the number is the same, then they're all pushed! - trigger() //Woo! - -/obj/multipoint_trigger/proc/trigger() - for(var/obj/multipoint/T in multipoint_triggerable_list) - if(T.trigger_id == trigger_id) - T.trigger() - -/obj/multipoint_trigger/proc/reset_trigger() //Maybe you want to bring the barrier back up for whatever reason! || Tweaked for reset verb (Lira, January 2026) - for(var/obj/multipoint/T in multipoint_triggerable_list) - if(T.trigger_id == trigger_id) - T.untrigger() - - for(var/obj/multipoint_trigger/T in trigger_list) - if(T.trigger_id == trigger_id) - T.triggered_key = null - T.update_icon() +/obj/multipoint_trigger/dungeon_trigger(mob/user) + update_icon() +/obj/multipoint_trigger/dungeon_untrigger(mob/user) + update_icon() /obj/multipoint_trigger/Crossed(O) //You stepped on it instead of clicking it, good work! trigger_check(O) - -/client/proc/reset_multipoint_trigger(obj/multipoint_trigger/T in multipoint_trigger_list) //You can right click it to reset the trigger, it resets all of the ones connected to it || Tweaked for reset verb (Lira, January 2026) - set category = null - set name = "Reset Barrier Trigger" - if(!check_rights(R_FUN, show_msg = FALSE)) - return - T.reset_trigger() diff --git a/code/game/Rogue Star/obj/food_cubes.dm b/code/game/Rogue Star/obj/food_cubes.dm new file mode 100644 index 00000000000..1f93f2f52b0 --- /dev/null +++ b/code/game/Rogue Star/obj/food_cubes.dm @@ -0,0 +1,156 @@ +//RS FILE +/obj/item/weapon/reagent_containers/food/snacks/cube/d_food + name = "dehydrated food cube" + desc = "Some kind dehydrated food." + icon = 'icons/rogue-star/foodx32.dmi' + icon_state = "cube" + color = "#58482f" + food_type = list( + /obj/item/weapon/reagent_containers/food/snacks/applepie, + /obj/item/weapon/reagent_containers/food/snacks/appletart, + /obj/item/weapon/reagent_containers/food/snacks/bacon_and_eggs, + /obj/item/weapon/reagent_containers/food/snacks/bacon_flatbread, + /obj/item/weapon/reagent_containers/food/snacks/bangersandmash, + /obj/item/weapon/reagent_containers/food/snacks/bearburger, + /obj/item/weapon/reagent_containers/food/snacks/bearstew, + /obj/item/weapon/reagent_containers/food/snacks/benedict, + /obj/item/weapon/reagent_containers/food/snacks/bibimbap, + /obj/item/weapon/reagent_containers/food/snacks/bigbiteburger, + /obj/item/weapon/reagent_containers/food/snacks/blackpudding, + /obj/item/weapon/reagent_containers/food/snacks/blt, + /obj/item/weapon/reagent_containers/food/snacks/breakfast_wrap, + /obj/item/weapon/reagent_containers/food/snacks/burrito, + /obj/item/weapon/reagent_containers/food/snacks/burrito_cheese, + /obj/item/weapon/reagent_containers/food/snacks/burrito_cheese_spicy, + /obj/item/weapon/reagent_containers/food/snacks/burrito_hell, + /obj/item/weapon/reagent_containers/food/snacks/burrito_mystery, + /obj/item/weapon/reagent_containers/food/snacks/burrito_spicy, + /obj/item/weapon/reagent_containers/food/snacks/burrito_vegan, + /obj/item/weapon/reagent_containers/food/snacks/cheeseburger, + /obj/item/weapon/reagent_containers/food/snacks/cheeseburrito, + /obj/item/weapon/reagent_containers/food/snacks/cherrypie, + /obj/item/weapon/reagent_containers/food/snacks/chickenfillet, + /obj/item/weapon/reagent_containers/food/snacks/chickenmomo, + /obj/item/weapon/reagent_containers/food/snacks/chickennoodlesoup, + /obj/item/weapon/reagent_containers/food/snacks/chilicheesefries, + /obj/item/weapon/reagent_containers/food/snacks/cinnamonbun, + /obj/item/weapon/reagent_containers/food/snacks/clubsandwich, + /obj/item/weapon/reagent_containers/food/snacks/crab_legs, + /obj/item/weapon/reagent_containers/food/snacks/crabmeat, + /obj/item/weapon/reagent_containers/food/snacks/cubancarp, + /obj/item/weapon/reagent_containers/food/snacks/curryrice, + /obj/item/weapon/reagent_containers/food/snacks/custardbun, + /obj/item/weapon/reagent_containers/food/snacks/donerkebab, + /obj/item/weapon/reagent_containers/food/snacks/egg_pancake, + /obj/item/weapon/reagent_containers/food/snacks/eggbowl, + /obj/item/weapon/reagent_containers/food/snacks/enchiladas, + /obj/item/weapon/reagent_containers/food/snacks/father_breakfast, + /obj/item/weapon/reagent_containers/food/snacks/fish_taco, + /obj/item/weapon/reagent_containers/food/snacks/fishandchips, + /obj/item/weapon/reagent_containers/food/snacks/fishburger, + /obj/item/weapon/reagent_containers/food/snacks/fishfingers, + /obj/item/weapon/reagent_containers/food/snacks/friedegg, + /obj/item/weapon/reagent_containers/food/snacks/friedrice, + /obj/item/weapon/reagent_containers/food/snacks/fuegoburrito, + /obj/item/weapon/reagent_containers/food/snacks/goulash, + /obj/item/weapon/reagent_containers/food/snacks/greencurry, + /obj/item/weapon/reagent_containers/food/snacks/hotandsoursoup, + /obj/item/weapon/reagent_containers/food/snacks/jellyburger, + /obj/item/weapon/reagent_containers/food/snacks/jellysandwich, + /obj/item/weapon/reagent_containers/food/snacks/kitsuneudon, + /obj/item/weapon/reagent_containers/food/snacks/lasagna, + /obj/item/weapon/reagent_containers/food/snacks/lobstercooked, + /obj/item/weapon/reagent_containers/food/snacks/macncheese, + /obj/item/weapon/reagent_containers/food/snacks/meat_pocket, + /obj/item/weapon/reagent_containers/food/snacks/meatballspagetti, + /obj/item/weapon/reagent_containers/food/snacks/meatbun, + /obj/item/weapon/reagent_containers/food/snacks/meatpie, + /obj/item/weapon/reagent_containers/food/snacks/milosoup, + /obj/item/weapon/reagent_containers/food/snacks/omelette, + /obj/item/weapon/reagent_containers/food/snacks/omurice/heart, + /obj/item/weapon/reagent_containers/food/snacks/pancakes, + /obj/item/weapon/reagent_containers/food/snacks/pastatomato, + /obj/item/weapon/reagent_containers/food/snacks/pie, + /obj/item/weapon/reagent_containers/food/snacks/poachedegg, + /obj/item/weapon/reagent_containers/food/snacks/porkbowl, + /obj/item/weapon/reagent_containers/food/snacks/red_sun_special, + /obj/item/weapon/reagent_containers/food/snacks/redcurry, + /obj/item/weapon/reagent_containers/food/snacks/ribplate, + /obj/item/weapon/reagent_containers/food/snacks/risotto, + /obj/item/weapon/reagent_containers/food/snacks/risottoballs, + /obj/item/weapon/reagent_containers/food/snacks/roastbeef, + /obj/item/weapon/reagent_containers/food/snacks/sandwich, + /obj/item/weapon/reagent_containers/food/snacks/sashimi, + /obj/item/weapon/reagent_containers/food/snacks/spicedmeatbun, + /obj/item/weapon/reagent_containers/food/snacks/stew, + /obj/item/weapon/reagent_containers/food/snacks/stuffing, + /obj/item/weapon/reagent_containers/food/snacks/superbiteburger, + /obj/item/weapon/reagent_containers/food/snacks/sweet_and_sour, + /obj/item/weapon/reagent_containers/food/snacks/tofuburger, + /obj/item/weapon/reagent_containers/food/snacks/tofupie, + /obj/item/weapon/reagent_containers/food/snacks/tofurkey, + /obj/item/weapon/reagent_containers/food/snacks/tomatosoup, + /obj/item/weapon/reagent_containers/food/snacks/vegetablesoup, + /obj/item/weapon/reagent_containers/food/snacks/yellowcurry) + +/obj/item/weapon/reagent_containers/food/snacks/cube/d_food/examine(mob/user) + . = ..() + .+= SPAN_OCCULT("There is a message pressed into the side of the cube:") + .+= SPAN_DANGER("Do not eat before adding water.") + +/obj/item/weapon/reagent_containers/food/snacks/cube/d_food/Initialize() + . = ..() + reagents.add_reagent("dryfood", 5) + +/obj/item/weapon/storage/box/wings/tray/randomfood + starts_with = list(/obj/item/weapon/reagent_containers/food/snacks/cube/d_food = 8) + +/obj/item/weapon/reagent_containers/food/snacks/cube/d_food/lasagna + name = "lasagna cube" + desc = "Lasagna dehydrated into little cubes!" + icon = 'icons/rogue-star/foodx32.dmi' + icon_state = "cube" + color = "#857a56" + food_type = /obj/item/weapon/reagent_containers/food/snacks/lasagna + +/obj/item/weapon/storage/box/wings/tray/lasagna + starts_with = list(/obj/item/weapon/reagent_containers/food/snacks/cube/d_food/lasagna = 8) + +/obj/item/weapon/reagent_containers/food/snacks/cube/d_food/breakfast + name = "breakfast cube" + desc = "Little cubes of breakfast!" + icon = 'icons/rogue-star/foodx32.dmi' + icon_state = "cube" + color = "#b9a35a" + food_type = list( + /obj/item/weapon/reagent_containers/food/snacks/appletart, + /obj/item/weapon/reagent_containers/food/snacks/bacon_and_eggs, + /obj/item/weapon/reagent_containers/food/snacks/benedict, + /obj/item/weapon/reagent_containers/food/snacks/breakfast_wrap, + /obj/item/weapon/reagent_containers/food/snacks/father_breakfast, + /obj/item/weapon/reagent_containers/food/snacks/omelette, + /obj/item/weapon/reagent_containers/food/snacks/omurice/heart, + /obj/item/weapon/reagent_containers/food/snacks/pancakes, + /obj/item/weapon/reagent_containers/food/snacks/waffles + ) + +/obj/item/weapon/storage/box/wings/tray/breakfast + starts_with = list(/obj/item/weapon/reagent_containers/food/snacks/cube/d_food/breakfast = 8) + +/obj/item/weapon/reagent_containers/food/snacks/cube/d_food/tofu + name = "tofu cube" + desc = "Cubes of tofu food!" + icon = 'icons/rogue-star/foodx32.dmi' + icon_state = "cube" + color = "#ddcc92" + food_type = list( + /obj/item/weapon/reagent_containers/food/snacks/slice/tofubread/filled, + /obj/item/weapon/reagent_containers/food/snacks/tofu, + /obj/item/weapon/reagent_containers/food/snacks/tofuburger, + /obj/item/weapon/reagent_containers/food/snacks/tofukabob, + /obj/item/weapon/reagent_containers/food/snacks/tofupie, + /obj/item/weapon/reagent_containers/food/snacks/tofurkey + ) + +/obj/item/weapon/storage/box/wings/tray/tofu + starts_with = list(/obj/item/weapon/reagent_containers/food/snacks/cube/d_food/tofu = 8) diff --git a/code/game/Rogue Star/obj/keys.dm b/code/game/Rogue Star/obj/keys.dm index ec42f677f43..27ab9e2e305 100644 --- a/code/game/Rogue Star/obj/keys.dm +++ b/code/game/Rogue Star/obj/keys.dm @@ -6,10 +6,8 @@ icon_state = "key" persist_storable = FALSE w_class = ITEMSIZE_TINY - var/lock_id = "key" - var/one_time = FALSE //If true the key will delete itself after use - var/master_key = FALSE //If true then this key can open anything with a configured lock! - + drop_sound = 'sound/items/drop/ring.ogg' + pickup_sound = 'sound/items/pickup/ring.ogg' /obj/item/key/Initialize() . = ..() pixel_x = rand(-8,8) @@ -17,78 +15,87 @@ if(icon_state == "key") icon_state = "[icon_state]-[rand(1,6)]" color = "#b4cacc" - -/obj/item/key/resolve_attackby(atom/A, mob/user, attack_modifier, click_parameters) - if(!unlock(A,user)) - return ..() - -/obj/item/key/proc/unlock(var/atom/A,var/mob/user) - if(!A || !user) - return FALSE - - if(!isobj(A)) - return FALSE - - var/obj/O = A - if(!O.unlock_with_key(lock_id,src)) - to_chat(user,SPAN_DANGER("\The [src] doesn't fit into \the [A]...")) - return FALSE - - to_chat(user,SPAN_NOTICE("\The [src] fits cleanly into \the [A]. You give it a firm turn.")) - - if(one_time) - to_chat(user,SPAN_DANGER("\The [src] crumbles away to dust after being used.")) - user.drop_from_inventory(src,get_turf(user)) - qdel(src) - return TRUE - /obj/item/key/big name = "big key" desc = "It looks quite menacing! Upon very close inspection, there are some impossibly complicated and detailed engravings on this key." icon_state = "big-key" color = "#bb883b" - lock_id = "boss" -/obj/item/key/onetime - one_time = TRUE +/obj/item/key/scifi + desc = "A small electronic card with a plastic case, with one end bearing exposed contact points for plugging into an electronic lock." + icon_state = "scifi-a" + drop_sound = 'sound/items/drop/device.ogg' + pickup_sound = 'sound/items/pickup/device.ogg' + var/static/list/overlays_cache = list() + var/contact_color = "#f7b947" -/obj/proc/unlock_with_key(key_id,var/obj/item/key/K) - if(K) - if(K.master_key) - . = TRUE - if(!key_id) - return FALSE - -/obj/machinery/door/airlock/unlock_with_key(key_id,var/obj/item/key/K) +/obj/item/key/scifi/Initialize() . = ..() - - if(key_id == id_tag || (. && id_tag)) - if(K && !locked) - if(K.one_time) //Don't destroy keys for doors that are already unlocked. - return FALSE - if(locked) - unlock() - open() - else - lock() - return TRUE - -/obj/structure/simple_door/unlock_with_key(key_id,var/obj/item/key/K) + update_icon() + +/obj/item/key/scifi/update_icon() + cut_overlays() + if(contact_color) + var/combine_key = "[icon_state]-contacts-[contact_color]" + var/image/contact = overlays_cache[combine_key] + if(!contact) + contact = image(icon,null,"[icon_state]-contacts") + contact.color = contact_color + contact.appearance_flags = RESET_COLOR|KEEP_APART|PIXEL_SCALE + overlays_cache[combine_key] = contact + add_overlay(contact) + +/obj/item/key/scifi/big + icon_state = "scifi-b" + desc = "A broad electronic card with a solid metal case. One end has precisely machined contacts exposed for plugging into an electronic lock." + var/case_color = "#776f85" + +/obj/item/key/scifi/big/update_icon() . = ..() - - if(key_id == lock_id || (. && lock_id)) - if(K && !locked) - if(K.one_time) //Don't destroy keys for doors that are already unlocked. - return FALSE - locked = !locked - return TRUE - -/obj/event_obstical/unlock_with_key(key_id,var/obj/item/key/K) - . = ..() - - if(key_id == id || (. && id)) - if(K && !density) - if(K.one_time) //Don't destroy keys for doors that are already unlocked. - return FALSE - post_trigger() - return TRUE + if(case_color) + var/combine_key = "[icon_state]-case-[case_color]" + var/image/case = overlays_cache[combine_key] + if(!case) + case = image(icon,null,"[icon_state]-case") + case.color = case_color + case.appearance_flags = RESET_COLOR|KEEP_APART|PIXEL_SCALE + overlays_cache[combine_key] = case + add_overlay(case) + +/obj/item/key/scifi/red + color = "#ff0000" +/obj/item/key/scifi/blue + color = "#003cff" +/obj/item/key/scifi/yellow + color = "#ffd900" +/obj/item/key/scifi/magenta + color = "#cc00ff" + +/obj/item/key/scifi/big/red + color = "#ff0000" + case_color = "#6b5c5c" +/obj/item/key/scifi/big/blue + color = "#003cff" + case_color = "#545c5c" +/obj/item/key/scifi/big/yellow + color = "#ffd900" + case_color = "#7e5c5c" +/obj/item/key/scifi/big/magenta + color = "#cc00ff" + case_color = "#5a5c5c" + +/obj/item/key/card + name = "key card" + desc = "A small rectangular card with a magnet strip running along one side." + icon_state = "card" + drop_sound = 'sound/items/drop/card.ogg' + pickup_sound = 'sound/items/pickup/card.ogg' + +/obj/item/key/card/red + color = "#ff0000" +/obj/item/key/card/blue + color = "#003cff" +/obj/item/key/card/yellow + color = "#ffd900" +/obj/item/key/card/magenta + color = "#cc00ff" diff --git a/code/game/Rogue Star/obj/listener.dm b/code/game/Rogue Star/obj/listener.dm index 68f95bdbf1a..71978fb5d87 100644 --- a/code/game/Rogue Star/obj/listener.dm +++ b/code/game/Rogue Star/obj/listener.dm @@ -70,14 +70,17 @@ var/atom/ourpass = pw pw = ourpass.name if(findtext(P.message, pw)) - trigger() + if(cantrigger(M)) + trigger(M) -/obj/listener/proc/trigger() - action() -/obj/listener/proc/untrigger() - action(FALSE) +/obj/listener/proc/trigger(var/mob/user) + SEND_SIGNAL(src,COMSIG_DUNGEON_TRIGGER,user) + +/obj/listener/proc/untrigger(var/mob/user) + SEND_SIGNAL(src,COMSIG_DUNGEON_UNTRIGGER,user) /obj/listener/proc/action(var/trigger = TRUE) +/* var/multipoint_triggered = FALSE for(var/obj/thing as obj in view(world.view,get_turf(src))) if(istype(thing,/obj/machinery/door/blast)) @@ -102,8 +105,9 @@ D.close() D.lock() continue - if(istype(thing,/obj/event_obstical)) - var/obj/event_obstical/O = thing + + if(istype(thing,/obj/dungeon_obstacle)) + var/obj/dungeon_obstacle/O = thing if(listener_id == O.id) if(trigger) if(O.density) @@ -112,6 +116,7 @@ if(!O.density) O.post_trigger() continue + if(istype(thing,/obj/structure/simple_door)) var/obj/structure/simple_door/D = thing if(listener_id == D.lock_id) @@ -133,6 +138,7 @@ else T.untrigger() continue +*/ /obj/listener/wall icon_state = "listener" density = FALSE diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 57a3c483b30..27d8b71803a 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -333,6 +333,7 @@ // Previously this was defined both on /obj/ and /turf/ seperately. And that's bad. /atom/proc/update_icon() + SEND_SIGNAL(src,COMSIG_ATOM_UPDATE_ICON) //RS ADD return diff --git a/code/game/machinery/door_control.dm b/code/game/machinery/door_control.dm index 6e5618d39e0..e7b1135d3ea 100644 --- a/code/game/machinery/door_control.dm +++ b/code/game/machinery/door_control.dm @@ -149,6 +149,10 @@ M.close() return +//RS ADD +/obj/machinery/button/remote/blast_door/dungeon_trigger() + trigger() + /* Emitter remote control */ diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index b155462d70b..a11dc7352f5 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -87,6 +87,8 @@ ..() /obj/machinery/door/airlock/attack_alien(var/mob/user) //Familiar, right? Doors. -Mechoid + if(islocked()) //RS ADD + return //RS ADD if(istype(user, /mob/living/carbon/human)) var/mob/living/carbon/human/X = user if(istype(X.species, /datum/species/xenos)) @@ -535,6 +537,8 @@ PhoronBurn(exposed_temperature) /obj/machinery/door/airlock/phoron/proc/PhoronBurn(temperature) + if(islocked()) //RS ADD + return //RS ADD for(var/turf/simulated/floor/target_tile in range(2,loc)) target_tile.assume_gas("phoron", 35, 400+T0C) spawn (0) target_tile.hotspot_expose(temperature, 400) @@ -824,6 +828,7 @@ About the new airlock wires panel: /obj/machinery/door/airlock/update_icon() cut_overlays() + SEND_SIGNAL(src,COMSIG_ATOM_UPDATE_ICON) //RS ADD if(density) if(locked && lights && src.arePowerSystemsOn()) icon_state = "door_locked" @@ -875,6 +880,8 @@ About the new airlock wires panel: return /obj/machinery/door/airlock/attack_ai(mob/user as mob) + if(islocked()) //RS ADD + return //RS ADD tgui_interact(user) /obj/machinery/door/airlock/attack_ghost(mob/user) @@ -925,6 +932,8 @@ About the new airlock wires panel: return data /obj/machinery/door/airlock/proc/hack(mob/user as mob) + if(islocked()) //RS ADD + return //RS ADD if(src.aiHacking==0) src.aiHacking=1 spawn(20) @@ -1025,6 +1034,8 @@ About the new airlock wires panel: return /obj/machinery/door/airlock/tgui_act(action, params) + if(islocked()) //RS ADD + return //RS ADD if(..()) return TRUE if(!user_allowed(usr)) @@ -1087,6 +1098,8 @@ About the new airlock wires panel: return 1 /obj/machinery/door/airlock/proc/user_allowed(mob/user) + if(islocked()) //RS ADD + return FALSE //RS ADD var/allowed = (issilicon(user) && canAIControl(user)) if(!allowed && isobserver(user)) var/mob/observer/dead/D = user @@ -1128,7 +1141,12 @@ About the new airlock wires panel: return src.p_open && (operating < 0 || (!operating && welded && !src.arePowerSystemsOn() && density && (!src.locked || (stat & BROKEN)))) /obj/machinery/door/airlock/attackby(obj/item/C, mob/user as mob) - //to_world("airlock attackby src [src] obj [C] mob [user]") + if(SEND_SIGNAL(src, COMSIG_PARENT_ATTACKBY, C, user) & COMPONENT_CANCEL_ATTACK_CHAIN) //RS ADD START + return TRUE + if(islocked()) + if(C.getkey()) + return //RS ADD END + if(!istype(usr, /mob/living/silicon)) if(src.isElectrified()) if(src.shock(user, 75)) @@ -1163,6 +1181,8 @@ About the new airlock wires panel: src.update_icon() return else + if(islocked()) //RS ADD + return //RS ADD src.p_open = TRUE playsound(src, C.usesound, 50, 1) src.update_icon() @@ -1174,6 +1194,8 @@ About the new airlock wires panel: else if(istype(C, /obj/item/device/assembly/signaler)) return src.attack_hand(user) else if(istype(C, /obj/item/weapon/pai_cable)) // -- TLE + if(islocked()) //RS ADD + return //RS ADD var/obj/item/weapon/pai_cable/cable = C cable.plugin(src, user) else if(!repairing && C.is_crowbar()) @@ -1310,6 +1332,8 @@ About the new airlock wires panel: return ..() /obj/machinery/door/airlock/can_open(var/forced=0) + if(islocked()) //RS ADD + return FALSE //RS ADD if(!forced) if(!arePowerSystemsOn() || wires.is_cut(WIRE_OPEN_DOOR)) return 0 @@ -1539,6 +1563,8 @@ About the new airlock wires panel: electronics.one_access = 1 /obj/machinery/door/airlock/emp_act(var/severity) + if(islocked()) //RS ADD + return //RS ADD if(prob(40/severity)) var/duration = world.time + SecondsToTicks(30 / severity) if(duration > electrified_until) @@ -1574,9 +1600,33 @@ About the new airlock wires panel: return FALSE /obj/machinery/door/airlock/rcd_act(mob/living/user, obj/item/weapon/rcd/the_rcd, passed_mode) + if(islocked()) //RS ADD + return FALSE //RS ADD switch(passed_mode) if(RCD_DECONSTRUCT) to_chat(user, span("notice", "You deconstruct \the [src].")) qdel(src) return TRUE return FALSE + +//RS ADD START +/obj/machinery/door/airlock/dungeon_trigger(mob/user) + var/datum/component/dungeon_mechanic/lock/ourlock = getlock() + if(ourlock) + if(ourlock.locked) + dungeon_unlock(user) + else if(!ourlock.onetime) + dungeon_lock(user) + else + if(locked) + dungeon_unlock(user) + else + dungeon_lock(user) + +/obj/machinery/door/airlock/dungeon_unlock() + unlock() + open() + SEND_SIGNAL(src,COMSIG_DUNGEON_TRIGGER) +/obj/machinery/door/airlock/dungeon_lock() + lock() + SEND_SIGNAL(src,COMSIG_DUNGEON_UNTRIGGER) diff --git a/code/game/machinery/doors/blast_door.dm b/code/game/machinery/doors/blast_door.dm index 575dd81664a..bcb4656977f 100644 --- a/code/game/machinery/doors/blast_door.dm +++ b/code/game/machinery/doors/blast_door.dm @@ -60,6 +60,7 @@ // Parameters: None // Description: Updates icon of this object. Uses icon state variables. /obj/machinery/door/blast/update_icon() + SEND_SIGNAL(src,COMSIG_ATOM_UPDATE_ICON) //RS ADD if(density) icon_state = icon_state_closed else @@ -152,6 +153,12 @@ // Description: If we are clicked with crowbar, wielded fire axe, or armblade, try to manually open the door. // This only works on broken doors or doors without power. Also allows repair with Plasteel. /obj/machinery/door/blast/attackby(obj/item/weapon/C as obj, mob/user as mob) + if(SEND_SIGNAL(src, COMSIG_PARENT_ATTACKBY, C, user) & COMPONENT_CANCEL_ATTACK_CHAIN) //RS ADD START + return TRUE + if(islocked()) + if(C.getkey()) + return //RS ADD END + src.add_fingerprint(user) if(istype(C, /obj/item/weapon)) // For reasons unknown, sometimes C is actually not what it is advertised as, like a mob. if(C.pry == 1 && (user.a_intent != I_HURT || (stat & BROKEN))) // Can we pry it open with something, like a crowbar/fireaxe/lingblade? @@ -471,6 +478,26 @@ width = 2 dir = EAST - +//RS ADD START +/obj/machinery/door/blast/dungeon_trigger(mob/user) + var/datum/component/dungeon_mechanic/lock/ourlock = getlock() + if(ourlock) + if(ourlock.locked) + dungeon_unlock(user) + else if(!ourlock.onetime) + dungeon_lock(user) + else + if(density) + dungeon_unlock(user) + else + dungeon_lock(user) + +/obj/machinery/door/blast/dungeon_lock(mob/user) + close() + SEND_SIGNAL(src,COMSIG_DUNGEON_UNTRIGGER) +/obj/machinery/door/blast/dungeon_unlock(mob/user) + open() + SEND_SIGNAL(src,COMSIG_DUNGEON_TRIGGER) +//RS ADD END #undef BLAST_DOOR_CRUSH_DAMAGE #undef SHUTTER_CRUSH_DAMAGE diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index ddcac46c3cd..3101a8afcbb 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -168,6 +168,8 @@ return /obj/machinery/door/bullet_act(var/obj/item/projectile/Proj) + if(islocked()) //RS ADD + return //RS ADD ..() var/damage = Proj.get_structure_damage() @@ -216,8 +218,15 @@ ..() /obj/machinery/door/attackby(obj/item/I as obj, mob/user as mob) + if(SEND_SIGNAL(src, COMSIG_PARENT_ATTACKBY, I, user) & COMPONENT_CANCEL_ATTACK_CHAIN) //RS ADD + return TRUE //RS ADD + src.add_fingerprint(user) + if(islocked()) //RS ADD START + if(I.getkey()) + return //RS ADD END + if(istype(I)) if(attackby_vr(I, user)) //VOREStation begin: Fireproofing return //VOREStation begin: Fireproofing @@ -310,6 +319,8 @@ return /obj/machinery/door/emag_act(var/remaining_charges) + if(islocked()) //RS ADD + return //RS ADD if(density && operable()) do_animate("spark") sleep(6) @@ -318,6 +329,8 @@ return 1 /obj/machinery/door/take_damage(var/damage) + if(islocked()) //RS ADD + return //RS ADD var/initialhealth = src.health src.health = max(0, src.health - damage) if(src.health <= 0 && initialhealth > 0) @@ -354,6 +367,8 @@ /obj/machinery/door/emp_act(severity) + if(islocked()) //RS ADD + return //RS ADD if(prob(20/severity) && (istype(src,/obj/machinery/door/airlock) || istype(src,/obj/machinery/door/window)) ) spawn(0) open() @@ -361,6 +376,8 @@ /obj/machinery/door/ex_act(severity) + if(islocked()) //RS ADD + return //RS ADD switch(severity) if(1.0) qdel(src) @@ -387,6 +404,7 @@ take_damage(100) /obj/machinery/door/update_icon() + SEND_SIGNAL(src,COMSIG_ATOM_UPDATE_ICON) //RS ADD if(density) icon_state = "door1" else diff --git a/code/game/objects/crystal_key.dm b/code/game/objects/crystal_key.dm index a18663b2223..f8b4f0fdb67 100644 --- a/code/game/objects/crystal_key.dm +++ b/code/game/objects/crystal_key.dm @@ -1,209 +1,159 @@ //RS FILE - -#define DELETE_OBSTICAL 1 -#define TOGGLE_OBSTICAL 2 - -var/global/list/event_obstical_keys = list() - -/obj/event_key +/obj/dungeon_switch name = "crystal" icon = 'icons/rogue-star/misc.dmi' icon_state = "crystal_key" anchored = TRUE - var/id - var/spent = FALSE - var/spent_state = "gold_tri" - var/mob/living/link - var/reusable = FALSE - var/closed_icon = 'icons/rogue-star/misc.dmi' + var/open_state = "crystal_key" var/closed_state = "crystal_key_spent" -/obj/event_key/reusable - reusable = TRUE +/obj/dungeon_switch/attack_hand(mob/living/user) + . = ..() + user.visible_message(SPAN_NOTICE("\The [user] touches \the [src]."),SPAN_NOTICE("You touch \the [src]."),runemessage = "tuch") + if(!action(user)) + to_chat(user,SPAN_WARNING("\The [src] doesn't respond...")) + +/obj/dungeon_switch/hitby(atom/movable/AM) + . = ..() + if(isobj(AM)) + action() -/obj/event_key/Initialize() +/obj/dungeon_switch/bullet_act(obj/item/projectile/P, def_zone) . = ..() - global.event_obstical_keys += src - seek_link() + action() + +/obj/dungeon_switch/proc/action(var/mob/user) + if(!cantrigger(user)) + return FALSE + SEND_SIGNAL(src,COMSIG_DUNGEON_TRIGGER,user) + return TRUE -/obj/event_key/Destroy() - global.event_obstical_keys -= src - unregister_mob() - return ..() +/obj/dungeon_switch/dungeon_trigger(var/mob/user) + update_icon() -/obj/event_key/attack_hand(mob/living/user) +/obj/dungeon_switch/update_icon() . = ..() - if(spent) - return - if(link) - if(!link.client && (link?.ai_holder?.hostile || link?.ai_holder?.stance != STANCE_IDLE)) - to_chat(user,"A barrier prevents you from touching \the [src]. Something else must be done before you can use it.") - return - if(!src.Adjacent(link)) - to_chat(user,"A barrier prevents you from touching \the [src]. Something else must be done before you can use it.") - return - to_chat(user,"You activate \the [src].") - spent = TRUE - trigger() - -/obj/event_key/proc/trigger() - for(var/obj/thing in global.event_obstical_keys) - if(thing == src) - continue - if(istype(thing,/obj/event_key)) - var/obj/event_key/key = thing - if(id == key.id) - key.post_trigger() - continue - - if(istype(thing,/obj/event_obstical)) - var/obj/event_obstical/obstical = thing - if(id == obstical.id) - obstical.post_trigger() - continue - post_trigger() - -/obj/event_key/proc/post_trigger() var/turf/ourturf = get_turf(src) - if(reusable) - ourturf.visible_message("\The [src] rumbles as something moves in the distance!!!",runemessage = "rumble rumble") - spent = FALSE + if(istriggered()) + icon_state = closed_state + ourturf.visible_message(SPAN_WARNING("\The [src] shimmers as it closes up!!!"),runemessage = "clink") else - unregister_mob() - if(closed_state) - ourturf.visible_message("\The [src] shimmers as it closes up!!!",runemessage = "clink") - icon = closed_icon - icon_state = closed_state - else - ourturf.visible_message("\The [src] crumbles to dust!!!",runemessage = "crumble crumble") - qdel(src) - -/obj/event_key/proc/seek_link() - for(var/mob/living/thing in get_turf(src)) - if(isliving(thing)) - register_mob(thing) - return - -/obj/event_key/proc/register_mob(var/mob/living/ourmob) - if(isliving(ourmob)) - link = ourmob - RegisterSignal(link, COMSIG_MOB_DEATH, PROC_REF(trigger),TRUE) - RegisterSignal(link, COMSIG_PARENT_QDELETING, PROC_REF(trigger), TRUE) - -/obj/event_key/proc/unregister_mob() - if(link) - UnregisterSignal(link, COMSIG_MOB_DEATH) - UnregisterSignal(link, COMSIG_PARENT_QDELETING) - -/obj/event_key/hitby(atom/movable/AM) - . = ..() - if(isobj(AM)) - trigger() + icon_state = open_state + ourturf.visible_message(SPAN_WARNING("\The [src] flashes as it opens up!!!"),runemessage = "shing") -/obj/event_key/bullet_act(obj/item/projectile/P, def_zone) - . = ..() - trigger() +//Obstacle// -/obj/event_obstical - name = "impassable rock" - desc = "A shiny, impassable rock!" - icon = 'icons/turf/x64.dmi' - icon_state = "rock-crystal-shiny" - var/id +/obj/dungeon_obstacle + name = "decorated pillar" + desc = "An impassable pillar made of a very hard material. It has some intricate engravings etched in its surface." + icon = 'icons/rogue-star/misc.dmi' + icon_state = "crystal_pillar" anchored = TRUE density = TRUE opacity = TRUE - pixel_x = -16 - pixel_y = -16 - var/trigger_mode = DELETE_OBSTICAL - var/closed_icon = 'icons/turf/x64.dmi' - var/closed_state = null - var/open_icon = 'icons/turf/x64.dmi' - var/open_state = null + var/closed_state = "crystal_pillar" + var/open_state = "crystal_pillar_lowered" -/obj/event_obstical/Initialize() - . = ..() - global.event_obstical_keys += src - - if(trigger_mode == TOGGLE_OBSTICAL) - opacity = density - if(density) - if(closed_state) - icon = closed_icon - icon_state = closed_state - else - closed_state = icon_state - else - if(open_state) - icon = open_icon - icon_state = open_state - -/obj/event_obstical/Destroy() - global.event_obstical_keys -= src - return ..() - -/obj/event_obstical/proc/post_trigger() +/obj/dungeon_obstacle/dungeon_lock() + if(density) + return FALSE + var/turf/ourturf = get_turf(src) + density = TRUE + opacity = TRUE + icon_state = closed_state + SEND_SIGNAL(src,COMSIG_DUNGEON_TRIGGER) + ourturf.visible_message(SPAN_WARNING("\The [src] rumbles into a closed position!"),runemessage = "rumble") + return TRUE + +/obj/dungeon_obstacle/dungeon_unlock() + if(!density) + return FALSE var/turf/ourturf = get_turf(src) - switch(trigger_mode) - if(DELETE_OBSTICAL) - ourturf.visible_message("\The [src] crumbles to dust!!!",runemessage = "crumble crumble") - qdel(src) - if(TOGGLE_OBSTICAL) - if(!closed_state) - closed_state = icon_state - density = !density - opacity = density - if(density) - icon = closed_icon - icon_state = closed_state - else - icon = open_icon - icon_state = open_state - ourturf.visible_message("\The [src] rumbles as it moves!!!",runemessage = "rumble rumble") - -/obj/event_obstical/disguised + if(!open_state) + ourturf.visible_message(SPAN_WARNING("\The [src] crumbles to dust!!!"),runemessage = ". . .") + qdel(src) + return TRUE + density = FALSE + opacity = FALSE + icon_state = open_state + SEND_SIGNAL(src,COMSIG_DUNGEON_UNTRIGGER) + ourturf.visible_message(SPAN_NOTICE("\The [src] clunks into an open position!"),runemessage = "clunk") + return TRUE + +/obj/dungeon_obstacle/dungeon_trigger() //Something somewhere is telling us to trigger, so we're just going to assume it wants us to toggle our state + if(icon_state == closed_state) + return dungeon_unlock() + else + return dungeon_lock() + +/obj/dungeon_obstacle/pillar/open + icon_state = "crystal_pillar_lowered" + density = FALSE + opacity = FALSE + +/obj/dungeon_obstacle/disguised name = "wall" icon_state = "crystal_obstical_disguised" desc = "It seems to be a section of wall plated with steel." - icon = 'icons/rogue-star/misc.dmi' - pixel_x = 0 - pixel_y = 0 - - closed_icon = 'icons/rogue-star/misc.dmi' - open_icon = 'icons/rogue-star/misc.dmi' + closed_state = "crystal_obstical_disguised" + open_state = "crystal_obstical_disguised_lowered" +/obj/dungeon_obstacle/disguised/open + icon_state = "crystal_obstical_disguised_lowered" + density = FALSE + opacity = FALSE -/obj/event_obstical/disguised/wall +/obj/dungeon_obstacle/wall + name = "wall" + desc = "It seems to be a section of wall plated with steel." icon = 'icons/turf/wall_masks.dmi' icon_state = "generic" desc = "It seems to be a section of wall plated with steel." + closed_state = "generic" + open_state = "blank" - closed_icon = 'icons/turf/wall_masks.dmi' - open_icon = 'icons/turf/wall_masks.dmi' +/obj/dungeon_obstacle/wall/open + icon_state = "blank" + density = FALSE + opacity = FALSE -/obj/event_obstical/disguised/wall/reinforced +/obj/dungeon_obstacle/wall/reinforced icon_state = "rgeneric" desc = "It seems to be a section of wall reinforced with plasteel and plated with plasteel." + closed_state = "rgeneric" + +/obj/dungeon_obstacle/wall/reinforced/open + icon_state = "blank" + density = FALSE + opacity = FALSE -/obj/event_obstical/disguised/wall/cult +/obj/dungeon_obstacle/wall/cult icon_state = "cult" desc = "Hideous images dance beneath the surface." + closed_state = "cult" -/obj/event_obstical/disguised/pillar - name = "decorated pillar" - icon_state = "crystal_pillar" +/obj/dungeon_obstacle/wall/cult/open + icon_state = "blank" + density = FALSE opacity = FALSE - closed_state = "crystal_pillar" - open_state = "crystal_pillar_lowered" -/obj/event_obstical/disguised/pillar/toggle - trigger_mode = TOGGLE_OBSTICAL - -/obj/event_obstical/disguised/obstical +/obj/dungeon_obstacle/obstical name = "decorated wall" icon_state = "crystal_obstical" closed_state = "crystal_obstical" open_state = "crystal_obstical_lowered" -/obj/event_obstical/disguised/obstical/toggle - trigger_mode = TOGGLE_OBSTICAL +/obj/dungeon_obstacle/obstical/open + icon_state = "crystal_obstical_lowered" + density = FALSE + opacity = FALSE + +/obj/dungeon_obstacle/crystal + name = "impassable rock" + desc = "A shiny, impassable rock!" + icon = 'icons/turf/x64.dmi' + icon_state = "rock-crystal-shiny" + pixel_x = -16 + pixel_y = -16 + closed_state = "rock-crystal-shiny" + open_state = null diff --git a/code/game/objects/structures/crates_lockers/__closets.dm b/code/game/objects/structures/crates_lockers/__closets.dm index 05661ccedb0..b03a2f7b936 100644 --- a/code/game/objects/structures/crates_lockers/__closets.dm +++ b/code/game/objects/structures/crates_lockers/__closets.dm @@ -105,6 +105,9 @@ /obj/structure/closet/proc/can_open() if(sealed) return 0 + if(islocked()) //RS ADD START + to_chat(usr,SPAN_WARNING("It appears to have a lock on it, which is of course, locked. It can't be opened without using whatever opens it first.")) + return FALSE //RS ADD END return 1 /obj/structure/closet/proc/can_close() @@ -232,6 +235,8 @@ // this should probably use dump_contents() /obj/structure/closet/ex_act(severity) + if(islocked()) //RS ADD + return //RS ADD switch(severity) if(1) for(var/atom/movable/A as mob|obj in src)//pulls everything out of the locker and hits it with an explosion @@ -254,6 +259,8 @@ damage(100) /obj/structure/closet/proc/damage(var/damage) + if(islocked()) //RS ADD + return //RS ADD health -= damage if(health <= 0) for(var/atom/movable/A in src) @@ -271,6 +278,8 @@ return /obj/structure/closet/attackby(obj/item/weapon/W as obj, mob/user as mob) + if(W.getkey()) //RS ADD + return //RS ADD if(W.is_wrench()) if(opened) if(anchored) @@ -414,6 +423,8 @@ icon_state = "closed_unlocked[sealed ? "_welded" : ""]" /obj/structure/closet/attack_generic(var/mob/user, var/damage, var/attack_message = "destroys") + if(islocked()) //RS ADD + return //RS ADD if(damage < STRUCTURE_MIN_DAMAGE_THRESHOLD) return user.do_attack_animation(src) @@ -493,6 +504,8 @@ return return_air() /obj/structure/closet/take_damage(var/damage) + if(islocked()) //RS ADD + return //RS ADD if(damage < STRUCTURE_MIN_DAMAGE_THRESHOLD) return dump_contents() @@ -543,3 +556,22 @@ M.Multiply(matrix(cos(angle), 0, 0, -sin(angle) * closet_appearance.door_anim_squish, 1, 0)) M.Translate(closet_appearance.door_hinge, 0) return M + +//RS ADD START +/obj/structure/closet/dungeon_trigger(mob/user) + var/datum/component/dungeon_mechanic/lock/ourlock = getlock() + if(ourlock) + if(ourlock.locked) + dungeon_unlock(user) + else if(!ourlock.onetime) + dungeon_lock(user) + +/obj/structure/closet/dungeon_lock(mob/user) + SEND_SIGNAL(src,COMSIG_DUNGEON_UNTRIGGER) + visible_message(SPAN_WARNING("\The [src] clicks as it is locked."),runemessage = "click. . .") + playsound(src, 'sound/machines/click.ogg', 15, 1, -3) + +/obj/structure/closet/dungeon_unlock(mob/user) + SEND_SIGNAL(src,COMSIG_DUNGEON_TRIGGER) + visible_message(SPAN_NOTICE("\The [src] clunks as it is unlocked."),runemessage = "clunk. . .") + playsound(src, 'sound/machines/click.ogg', 15, 1, -3) diff --git a/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm b/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm index 85b9367b7d5..9ba4f626c05 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm @@ -19,6 +19,9 @@ return ..() /obj/structure/closet/secure_closet/emp_act(severity) + if(islocked()) //RS ADD + return //RS ADD + for(var/obj/O in src) O.emp_act(severity) if(!broken) @@ -43,6 +46,9 @@ if(user.loc == src) to_chat(user, "You can't reach the lock from inside.") return + if(islocked()) //RS ADD START + to_chat(user,SPAN_WARNING("It appears to have a lock on it, which is of course, locked. It can't be opened without using whatever opens it first.")) + return //RS ADD END if(allowed(user)) locked = !locked playsound(src, 'sound/machines/click.ogg', 15, 1, -3) @@ -54,6 +60,9 @@ to_chat(user, "Access Denied") /obj/structure/closet/secure_closet/attackby(obj/item/weapon/W as obj, mob/user as mob) + if(getlock()) //RS ADD START + if(W.getkey()) + return //RS ADD END if(W.is_wrench()) if(opened) if(anchored) @@ -84,6 +93,8 @@ if(W) W.forceMove(loc) else if(istype(W, /obj/item/weapon/melee/energy/blade)) + if(islocked()) //RS ADD + return //RS ADD if(emag_act(INFINITY, user, "The locker has been sliced open by [user] with \an [W]!", "You hear metal being sliced and sparks flying.")) var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread() spark_system.set_up(5, 0, loc) @@ -96,6 +107,8 @@ togglelock(user) /obj/structure/closet/secure_closet/emag_act(var/remaining_charges, var/mob/user, var/emag_source, var/visual_feedback = "", var/audible_feedback = "") + if(islocked()) //RS ADD + return //RS ADD if(!broken) broken = 1 locked = 0 @@ -156,3 +169,27 @@ broken = 1 locked = 0 ..() + +//RS ADD START +/obj/structure/closet/secure_closet/dungeon_trigger(mob/user) + var/datum/component/dungeon_mechanic/lock/ourlock = getlock() + if(ourlock) + if(ourlock.locked) + dungeon_unlock(user) + else if(!ourlock.onetime) + dungeon_lock(user) + else + if(locked) + dungeon_unlock(user) + else + dungeon_lock(user) + +/obj/structure/closet/secure_closet/dungeon_lock(mob/user) + . = ..() + locked = TRUE + update_icon() + +/obj/structure/closet/secure_closet/dungeon_unlock(mob/user) + . = ..() + locked = FALSE + update_icon() diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm index 7dfaf181876..4f0d61f8ed4 100644 --- a/code/game/objects/structures/crates_lockers/crates.dm +++ b/code/game/objects/structures/crates_lockers/crates.dm @@ -14,6 +14,9 @@ close_sound = 'sound/effects/crate_close.ogg' /obj/structure/closet/crate/can_open() + if(islocked()) //RS ADD START + to_chat(usr,SPAN_WARNING("It appears to have a lock on it, which is of course, locked. It can't be opened without using whatever opens it first.")) + return FALSE //RS ADD END return 1 /obj/structure/closet/crate/can_close() @@ -126,6 +129,8 @@ else return attack_hand(user) /obj/structure/closet/crate/ex_act(severity) + if(islocked()) //RS ADD + return //RS ADD switch(severity) if(1.0) for(var/obj/O in src.contents) @@ -153,6 +158,9 @@ var/locked = 1 /obj/structure/closet/crate/secure/can_open() + if(islocked()) //RS ADD START + to_chat(usr,SPAN_WARNING("It appears to have a lock on it, which is of course, locked. It can't be opened without using whatever opens it first.")) + return FALSE //RS ADD END return !locked /obj/structure/closet/crate/secure/update_icon() @@ -174,6 +182,9 @@ if(src.broken) to_chat(user, "The crate appears to be broken.") return + if(islocked()) //RS ADD START + to_chat(user,SPAN_WARNING("It appears to have a lock on it, which is of course, locked. It can't be opened without using whatever opens it first.")) + return //RS ADD END if(src.allowed(user)) set_locked(!locked, user) else @@ -210,6 +221,9 @@ src.toggle(user) /obj/structure/closet/crate/secure/attackby(obj/item/weapon/W as obj, mob/user as mob) + if(getlock()) //RS ADD START + if(W.getkey()) + return //RS ADD END if(is_type_in_list(W, list(/obj/item/weapon/packageWrap, /obj/item/stack/cable_coil, /obj/item/device/radio/electropack, /obj/item/weapon/tool/wirecutters))) return ..() if(istype(W, /obj/item/weapon/melee/energy/blade)) @@ -220,6 +234,8 @@ return ..() /obj/structure/closet/crate/secure/emag_act(var/remaining_charges, var/mob/user) + if(islocked()) //RS ADD + return //RS ADD if(!broken) playsound(src, "sparks", 60, 1) locked = 0 @@ -229,6 +245,8 @@ return 1 /obj/structure/closet/crate/secure/emp_act(severity) + if(islocked()) //RS ADD + return //RS ADD for(var/obj/O in src) O.emp_act(severity) if(!broken && !opened && prob(50/severity)) @@ -740,4 +758,26 @@ icon = 'icons/obj/closets/miningcar.dmi' closet_appearance = null open_sound = 'sound/effects/wooden_closet_open.ogg' - close_sound = 'sound/effects/wooden_closet_close.ogg' \ No newline at end of file + close_sound = 'sound/effects/wooden_closet_close.ogg' + +//RS ADD START +/obj/structure/closet/crate/secure/dungeon_trigger(mob/user) + var/datum/component/dungeon_mechanic/lock/ourlock = getlock() + if(ourlock) + if(ourlock.locked) + dungeon_unlock(user) + else if(!ourlock.onetime) + dungeon_lock(user) + else + if(locked) + dungeon_unlock(user) + else + dungeon_lock(user) + +/obj/structure/closet/crate/secure/dungeon_lock(mob/user) + . = ..() + set_locked(TRUE,user) + +/obj/structure/closet/crate/secure/dungeon_unlock(mob/user) + . = ..() + set_locked(FALSE,user) diff --git a/code/game/objects/structures/janicart.dm b/code/game/objects/structures/janicart.dm index 17dd5f489bc..44e30b8e3b4 100644 --- a/code/game/objects/structures/janicart.dm +++ b/code/game/objects/structures/janicart.dm @@ -426,8 +426,8 @@ GLOBAL_LIST_BOILERPLATE(all_janitorial_carts, /obj/structure/janitorialcart) /obj/structure/bed/chair/janicart/relaymove(mob/living/user, direction) if(user.stat || user.stunned || user.weakened || user.paralysis) unbuckle_mob() - var/obj/item/key/jani/J = user.get_type_in_hands(/obj/item/key) //RS EDIT - if(J.lock_id == "jani") //RS EDIT + var/obj/item/key/jani/J = user.get_type_in_hands(/obj/item/key/jani) //RS EDIT + if(J) //RS EDIT step(src, direction) update_mob() else @@ -499,4 +499,3 @@ GLOBAL_LIST_BOILERPLATE(all_janitorial_carts, /obj/structure/janitorialcart) icon = 'icons/obj/vehicles.dmi' icon_state = "keys" w_class = ITEMSIZE_TINY - lock_id = "jani" //RS ADD diff --git a/code/game/objects/structures/simple_doors.dm b/code/game/objects/structures/simple_doors.dm index f032855e3af..af6701727bb 100644 --- a/code/game/objects/structures/simple_doors.dm +++ b/code/game/objects/structures/simple_doors.dm @@ -17,15 +17,13 @@ var/knock_hammer_sound = 'sound/weapons/sonic_jackhammer.ogg' var/locked = FALSE //has the door been locked? - var/lock_id = null //does the door have an associated key? var/keysound = 'sound/items/toolbelt_equip.ogg' /obj/structure/simple_door/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) TemperatureAct(exposed_temperature) /obj/structure/simple_door/proc/TemperatureAct(temperature) - hardness -= material.combustion_effect(get_turf(src),temperature, 0.3) - CheckHardness() + take_damage(material.combustion_effect(get_turf(src),temperature, 0.3) * 10) //RS EDIT - Use the dang damage proc bro /obj/structure/simple_door/Initialize(mapload, var/material_name) . = ..() @@ -154,17 +152,11 @@ /obj/structure/simple_door/attackby(obj/item/weapon/W as obj, mob/user as mob) user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) - if(istype(W,/obj/item/weapon/simple_key)) - var/obj/item/weapon/simple_key/key = W - if(state) - to_chat(user,"\The [src] must be closed in order for you to lock it.") - else if(key.key_id != src.lock_id) - to_chat(user,"The [key] doesn't fit \the [src]'s lock!") - else if(key.key_id == src.lock_id) - visible_message("[user] [key.keyverb] \the [key] and [locked ? "unlocks" : "locks"] \the [src].") - locked = !locked - playsound(src, keysound,100, 1) - return + if(SEND_SIGNAL(src, COMSIG_PARENT_ATTACKBY, W, user) & COMPONENT_CANCEL_ATTACK_CHAIN) //RS ADD START + return TRUE + if(islocked()) + if(W.getkey()) + return //RS ADD END if(istype(W,/obj/item/weapon/pickaxe) && breakable) var/obj/item/weapon/pickaxe/digTool = W visible_message("[user] starts digging [src]!") @@ -172,7 +164,7 @@ visible_message("[user] finished digging [src]!") Dismantle() else if(istype(W,/obj/item/weapon) && breakable) //not sure, can't not just weapons get passed to this proc? - hardness -= W.force/10 + take_damage(W.force) //RS EDIT - Use the dang damage proc bro visible_message("[user] hits [src] with [W]!") if(material == get_material_by_name("resin")) playsound(src, 'sound/effects/attackblob.ogg', 100, 1) @@ -180,7 +172,6 @@ playsound(src, 'sound/effects/woodcutting.ogg', 100, 1) else playsound(src, 'sound/weapons/smash.ogg', 50, 1) - CheckHardness() else if(istype(W,/obj/item/weapon/weldingtool) && breakable) var/obj/item/weapon/weldingtool/WT = W if(material.ignition_point && WT.remove_fuel(0, user)) @@ -191,9 +182,10 @@ /obj/structure/simple_door/bullet_act(var/obj/item/projectile/Proj) take_damage(Proj.damage/10) - CheckHardness() /obj/structure/simple_door/take_damage(var/damage) + if(islocked()) //RS ADD + return //RS ADD hardness -= damage/10 CheckHardness() @@ -206,19 +198,22 @@ else playsound(src, 'sound/weapons/smash.ogg', 50, 1) user.do_attack_animation(src) - hardness -= damage/10 - CheckHardness() + take_damage(damage) //RS EDIT - Use the dang damage proc bro /obj/structure/simple_door/proc/CheckHardness() if(hardness <= 0) Dismantle(1) /obj/structure/simple_door/proc/Dismantle(devastated = 0) + if(islocked()) //RS ADD + return //RS ADD material.place_dismantled_product(get_turf(src)) visible_message("The [src] is destroyed!") qdel(src) /obj/structure/simple_door/ex_act(severity = 1) + if(islocked()) //RS ADD + return //RS ADD switch(severity) if(1) Dismantle(1) @@ -226,11 +221,9 @@ if(prob(20)) Dismantle(1) else - hardness-- - CheckHardness() + take_damage(10) //RS EDIT - Use the dang damage proc bro if(3) - hardness -= 0.1 - CheckHardness() + take_damage(1) //RS EDIT - Use the dang damage proc bro return /obj/structure/simple_door/process() @@ -281,3 +274,31 @@ if(!iscultist(L) && !istype(L, /mob/living/simple_mob/construct)) return ..() + +//RS ADD START +/obj/structure/simple_door/dungeon_trigger(mob/user) + var/datum/component/dungeon_mechanic/lock/ourlock = getlock() + if(ourlock) + if(ourlock.locked) + dungeon_unlock(user) + else if(!ourlock.onetime) + dungeon_lock(user) + else + if(locked) + dungeon_unlock(user) + else + dungeon_lock(user) + +/obj/structure/simple_door/dungeon_lock() + locked = TRUE + visible_message(SPAN_NOTICE("\The [src] clunks as it is locked.")) + playsound(src, keysound,100, 1) + SEND_SIGNAL(src,COMSIG_DUNGEON_UNTRIGGER) + return TRUE + +/obj/structure/simple_door/dungeon_unlock() + locked = FALSE + visible_message(SPAN_NOTICE("\The [src] clunks as it is unlocked.")) + playsound(src, keysound,100, 1) + SEND_SIGNAL(src,COMSIG_DUNGEON_TRIGGER) + return TRUE diff --git a/code/modules/admin/admin_verb_lists_vr.dm b/code/modules/admin/admin_verb_lists_vr.dm index a78d10159a7..971eb29def2 100644 --- a/code/modules/admin/admin_verb_lists_vr.dm +++ b/code/modules/admin/admin_verb_lists_vr.dm @@ -189,7 +189,7 @@ var/list/admin_verbs_fun = list( /client/proc/admin_lighting_manager, // RS ADD: New Lighting Manager Panel (Lira, October 2025) /client/proc/tag_game, //RS ADD /client/proc/report_all_objectives, //RS ADD - /client/proc/reset_multipoint_trigger //RS ADD +// /client/proc/toggle_dungeon_maker //RS ADD ) diff --git a/code/modules/food/food/snacks_vr.dm b/code/modules/food/food/snacks_vr.dm index 7b877d68bbd..39682ef5283 100644 --- a/code/modules/food/food/snacks_vr.dm +++ b/code/modules/food/food/snacks_vr.dm @@ -465,7 +465,14 @@ /obj/item/weapon/reagent_containers/food/snacks/cube/proc/Expand() src.visible_message("\The [src] expands!") - new food_type(get_turf(src)) + var/turf/T = get_turf(src) //RS EDIT START + var/food_actual + if(islist(food_type)) + food_actual = pickweight(food_type) + else + food_actual = food_type + new food_actual(T) + playsound(T, 'sound/effects/bubbles.ogg', 50, 1) //RS EDIT END qdel(src) /obj/item/weapon/reagent_containers/food/snacks/cube/on_reagent_change() @@ -522,8 +529,24 @@ /obj/item/weapon/reagent_containers/food/snacks/cube/protein = 4, /obj/item/weapon/reagent_containers/food/snacks/cube/nutriment = 4 ) - can_hold = list(/obj/item/weapon/reagent_containers/food/snacks/cube/protein, - /obj/item/weapon/reagent_containers/food/snacks/cube/nutriment) + can_hold = list(/obj/item/weapon/reagent_containers/food/snacks/cube) //RS EDIT + +/obj/item/weapon/storage/box/wings/tray/water_act(amount) //RS ADD START + visible_message(SPAN_DANGER("\The [src] gets wet, soaking its contents!"),runemessage = "splash") + START_PROCESSING(SSfastprocess, src) + +/obj/item/weapon/storage/box/wings/tray/process() + if(src.contents.len <= 0) + STOP_PROCESSING(SSfastprocess,src) + return + if(prob(20)) + var/howmany = contents.len + var/obj/item/weapon/reagent_containers/food/snacks/cube/C = pick(contents) + if(istype(C,/obj/item/weapon/reagent_containers/food/snacks/cube)) + C.Expand() + if(howmany == contents.len) //We have something in there that isn't expanding so let's stop trying instead of trying forever + STOP_PROCESSING(SSfastprocess,src) + update_icon() //RS ADD END /obj/item/weapon/reagent_containers/food/snacks/carpmeat/sif //Making fish meat non-toxic! As advised by Ascian! toxin_type = null diff --git a/code/modules/multiz/portals_vr.dm b/code/modules/multiz/portals_vr.dm index 9f2cfd6129b..d4a8f2de882 100644 --- a/code/modules/multiz/portals_vr.dm +++ b/code/modules/multiz/portals_vr.dm @@ -12,13 +12,15 @@ var/portal_enabled = FALSE var/static/list/event_portal_list = list() var/notify_ckey_once // Send a message to this person on next use - var/open = TRUE // If it's currently usable var/close_after_uses // Will autoclose after this many uses /obj/structure/portal_event/Initialize() . = ..() event_portal_list += src + seek_link() //RS ADD +//RS EDIT START - Generalized the logic so I can use it elsewhere too +/obj/structure/portal_event/proc/seek_link() if(portal_id && !target) for(var/obj/structure/portal_event/P in event_portal_list) if(P == src) @@ -27,6 +29,7 @@ target = P target.target = src toggle_portal() //RS ADD END +//RS EDIT END /obj/structure/portal_event/Destroy() event_portal_list -= src //RS EDIT @@ -49,23 +52,10 @@ return return -/obj/structure/portal_event/Crossed(AM as mob|obj) - if(istype(AM,/mob) && !(istype(AM,/mob/living))) - return //do not send ghosts, zshadows, ai eyes, etc - spawn(0) - src.teleport(AM) - return - return - /obj/structure/portal_event/attack_hand(mob/user as mob) if(!istype(user)) return - if(!target) - if(isliving(user)) - to_chat(user, "Your hand scatters \the [src]...") - qdel(src) //Delete portals which aren't set that people mess with. - else return //do not send ghosts, zshadows, ai eyes, etc - else if(isliving(user) || istype(user, /mob/observer/dead) && user?.client?.holder) //unless they're staff + if(isliving(user) || istype(user, /mob/observer/dead) && user?.client?.holder) //unless they're staff //RS EDIT spawn(0) src.teleport(user) @@ -137,14 +127,16 @@ if(target && istype(target, /obj/structure/portal_event) && tgui_alert(user, "Would you like portal's target portal to match this style?", "Both?", list("Yes", "No")) == "Yes") //RS EDIT target.icon_state = portal_icon_selection //RS EDIT -/obj/structure/portal_event/proc/teleport(atom/movable/M as mob|obj) - if(!portal_enabled && isliving(M)) //RS EDIT - to_chat(M, "\The [src] wavers as you pass through it... it seems to not accept you through... for now...") //RS EDIT - return //RS EDIT - if(isAI(M) || istype(M,/mob/observer/eye)) //RS EDIT - return //RS EDIT +/obj/structure/portal_event/proc/teleport(atom/movable/M as mob|obj) //RS EDIT START + if(isAI(M) || istype(M,/mob/observer/eye)) + return + + if(!portal_enabled && !isobserver(M)) + if(isliving(M)) + to_chat(M, "\The [src] wavers as you pass through it... it seems to not accept you through... for now...") + return // RS Add: Shells can't leave the station (Lira, October 2025) - if(ismob(M) && isrobot(M)) + if(isrobot(M)) var/mob/living/silicon/robot/R = M if(R.shell) var/turf/source_turf = get_turf(src) @@ -154,20 +146,21 @@ if(!source_turf || !target_turf || !isStationLevel(source_turf.z) || !isStationLevel(target_turf.z)) to_chat(R, "The [src] flares and refuses the remote shell.") return - if(istype(M, /obj/effect)) //sparks don't teleport - return - if (M.anchored&&istype(M, /obj/mecha)) - return - if (!target) - to_chat(M, "\The [src] scatters as you pass through it...") - qdel(src) - return - if (!istype(M, /atom/movable)) - return - if (!open) //RS EDIT START + + var/atom/where + if(target) + where = target + else + var/datum/component/dungeon_mechanic/pair/P = pick(get_dungeon_pair()) + if(P) + where = P.parent + if(!isatom(where)) + where = null + if (!where) to_chat(M, "\The [src] seems inert for now...") return - var/turf/ourturf = find_opposite_side_or_randomize(M,src,target) //RS EDIT START + + var/turf/ourturf = find_opposite_side_or_randomize(M,src,where) if(ourturf.check_density(TRUE,TRUE)) //Make sure there isn't a wall there return M.unbuckle_all_mobs(TRUE) @@ -190,11 +183,11 @@ return temptarg /obj/structure/portal_event/proc/close() - open = FALSE + portal_enabled = FALSE //RS EDIT alpha = 100 /obj/structure/portal_event/proc/open() - open = TRUE + portal_enabled = TRUE //RS EDIT alpha = initial(alpha) /obj/structure/portal_event/proc/post_crossed(atom/movable/M) @@ -339,4 +332,24 @@ else return -//RS ADD END +//RS ADD +/obj/structure/portal_event/dungeon_trigger(mob/user) + if(portal_enabled) + dungeon_lock(user) + else + dungeon_unlock(user) +/obj/structure/portal_event/dungeon_lock(mob/user) + portal_enabled = FALSE + density = FALSE + +/obj/structure/portal_event/dungeon_unlock(mob/user) + portal_enabled = TRUE + density = TRUE + visible_message(SPAN_NOTICE("\The [src] opens!!!"),runemessage = "! ! !") + +/obj/structure/portal_event/dungeon_pair() + . = ..() + if(!.) + dungeon_lock() + else + dungeon_unlock() diff --git a/code/modules/reagents/reagents/food_drinks_vr.dm b/code/modules/reagents/reagents/food_drinks_vr.dm index 94ae4c71e2b..b96a8f7fd43 100644 --- a/code/modules/reagents/reagents/food_drinks_vr.dm +++ b/code/modules/reagents/reagents/food_drinks_vr.dm @@ -1,20 +1,18 @@ -/datum/reagent/toxin/meatcolony +/datum/reagent/dry/meatcolony //RS EDIT name = "A colony of meat cells" id = "meatcolony" - description = "Specialised cells designed to produce a large amount of meat once activated, whilst manufacturers have managed to stop these cells from taking over the body when ingested, it's still poisonous." + description = "Specialised cells designed to produce a large amount of meat once activated, whilst manufacturers have managed to stop these cells from taking over the body when ingested, they will still pull any water they come into contact with, and will cause dehydration." //RS EDIT taste_description = "a fibrous mess" reagent_state = LIQUID color = "#ff2424" - strength = 10 -/datum/reagent/toxin/plantcolony +/datum/reagent/dry/plantcolony //RS EDIT name = "A colony of plant cells" id = "plantcolony" - description = "Specialised cells designed to produce a large amount of nutriment once activated, whilst manufacturers have managed to stop these cells from taking over the body when ingested, it's still poisonous." + description = "Specialised cells designed to produce a large amount of nutriment once activated, whilst manufacturers have managed to stop these cells from taking over the body when ingested, they will still pull any water they come into contact with, and will cause dehydration." //RS EDIT taste_description = "a fibrous mess" reagent_state = LIQUID color = "#7ce01f" - strength = 10 /datum/reagent/nutriment/grubshake name = "Grub shake" diff --git a/icons/rogue-star/component_adder.dmi b/icons/rogue-star/component_adder.dmi new file mode 100644 index 00000000000..2587cf36d19 Binary files /dev/null and b/icons/rogue-star/component_adder.dmi differ diff --git a/icons/rogue-star/dungeon_maker.dmi b/icons/rogue-star/dungeon_maker.dmi new file mode 100644 index 00000000000..1791d6edc40 Binary files /dev/null and b/icons/rogue-star/dungeon_maker.dmi differ diff --git a/icons/rogue-star/foodx32.dmi b/icons/rogue-star/foodx32.dmi new file mode 100644 index 00000000000..6f2c56f5dbb Binary files /dev/null and b/icons/rogue-star/foodx32.dmi differ diff --git a/icons/rogue-star/keys.dmi b/icons/rogue-star/keys.dmi index 3cf96cd774b..8a9b001888e 100644 Binary files a/icons/rogue-star/keys.dmi and b/icons/rogue-star/keys.dmi differ diff --git a/icons/rogue-star/misc.dmi b/icons/rogue-star/misc.dmi index 8812cdae936..07588c2c9c8 100644 Binary files a/icons/rogue-star/misc.dmi and b/icons/rogue-star/misc.dmi differ diff --git a/maps/example/event_example.dmm b/maps/example/event_example.dmm index be019eb4f3b..7e598d8aa2f 100644 --- a/maps/example/event_example.dmm +++ b/maps/example/event_example.dmm @@ -1,52 +1,86 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"aH" = ( -/obj/multipoint_trigger{ - trigger_id = "REPLACE ME WITH A STRING" +"aC" = ( +/obj/item/weapon/paper{ + info = "The multipoint trigger can be used in a couple of ways. When triggered, it will check to see if there are any other /multipoint_trigger in the world which share its trigger_id variable. If so, and any of them are not also triggered, then it will do nothing. If all triggers sharing a trigger_id are triggered, then it will attempt to trigger any /multipoint object in the world that shares its trigger_id. There are two variants of the /multipoint_trigger, the base type requires each trigger to be pressed by a player of a different ckey, requiring as many players as there are triggers. The /puzzle variant does not require different ckeys to be triggered, and will allow one person to trigger as many as they can find. These can be reset by using the 'reset barrier trigger' verb! ----- Important variables: trigger_id"; + name = "/multipoint_trigger" }, -/turf/unsimulated/spookygrass{ - color = "#00058a" +/turf/unsimulated/spookygrass, +/area/submap/admin_upload/powlit) +"aH" = ( +/obj/machinery/door/airlock, +/obj/component_adder/lock{ + color = "yellow"; + id = "le1" }, +/turf/unsimulated/spookygrass, /area/submap/admin_upload/powlit) "bC" = ( -/obj/multipoint/teleporter{ - teleport_id = "event_example"; - trigger_id = "portal_example_2" - }, +/obj/item/stack/material/flint, /turf/unsimulated/spookygrass, /area/submap/admin_upload/powlit) "bK" = ( -/obj/event_obstical/disguised, -/turf/unsimulated/spookygrass{ - color = "#8a0000" +/obj/component_adder/reciever{ + id = "listener_example" + }, +/obj/dungeon_obstacle/pillar, +/turf/unsimulated/spookygrass, +/area/submap/admin_upload/powlit) +"cf" = ( +/obj/component_adder/trigger{ + id = "listener_example" }, +/obj/listener, +/turf/unsimulated/spookygrass, /area/submap/admin_upload/powlit) "dj" = ( -/obj/item/weapon/paper{ - info = "/The listener triggers off of players speaking in say. If they say the appropriate password, any configured object in sight range of the listener will be triggered! For /multipoint objects it works at global range, just because that's easy, and that's how those are intended to work. For other kinds of doors though it only works in sight range, in part because that's just intuitive, but also because searching the whole world for a door with the right id_tag might lag the server!!! Anyway, you can say 'example' to trigger this. You can also aghost and click the listener to configure it to add or remove passwords, or trigger/untrigger it."; - name = "/listener example" +/obj/component_adder/trigger/onetime{ + id = "event_key_1" }, +/obj/dungeon_switch, /turf/unsimulated/spookygrass, /area/submap/admin_upload/powlit) "dn" = ( -/obj/multipoint_trigger/puzzle, -/turf/unsimulated/spookygrass{ - color = "#00058a" +/obj/component_adder/reciever{ + color = "yellow"; + id = "event_key_2" }, +/obj/dungeon_obstacle/pillar, +/turf/unsimulated/spookygrass, /area/submap/admin_upload/powlit) "dS" = ( -/turf/unsimulated/spookygrass{ - color = "#8a0000" +/obj/component_adder/trigger/gather_gate{ + color = "red"; + id = "portal_example_2" }, +/obj/multipoint_trigger/puzzle, +/turf/unsimulated/spookygrass, /area/submap/admin_upload/powlit) "dZ" = ( -/obj/listener{ - listener_id = "REPLACE ME WITH A STRING" +/obj/item/key, +/obj/component_adder/key{ + color = "yellow"; + id = "le1" }, /turf/unsimulated/spookygrass, /area/submap/admin_upload/powlit) "er" = ( -/obj/machinery/door/blast/angled{ - id = "listener_example" +/obj/item/weapon/paper{ + info = "Basic /multipoint_trigger switches do not allow the same ckey to trigger more than one trigger for triggers sharing the same trigger_id. These triggers are impossible for only one person to trigger, unless there is only one with the given trigger_id."; + name = "/multipoint_trigger example" + }, +/turf/unsimulated/spookygrass, +/area/submap/admin_upload/powlit) +"gA" = ( +/obj/item/weapon/paper{ + info = "/The listener triggers off of players speaking in say. If they say the appropriate password, any configured object in sight range of the listener will be triggered! For /multipoint objects it works at global range, just because that's easy, and that's how those are intended to work. For other kinds of doors though it only works in sight range, in part because that's just intuitive, but also because searching the whole world for a door with the right id_tag might lag the server!!! Anyway, you can say 'example' to trigger this. You can also aghost and click the listener to configure it to add or remove passwords, or trigger/untrigger it."; + name = "/listener example" + }, +/turf/unsimulated/spookygrass, +/area/submap/admin_upload/powlit) +"ih" = ( +/obj/item/weapon/paper{ + info = "The /event_key can be triggered by clicking on it, or by impacting it with a thrown object!"; + name = "/event_key example" }, /turf/unsimulated/spookygrass, /area/submap/admin_upload/powlit) @@ -56,90 +90,96 @@ }, /area/submap/admin_upload/powlit) "kn" = ( -/obj/event_obstical/disguised/pillar/toggle{ - id = "listener_example" +/obj/component_adder/pair{ + color = "cyan"; + id = "event_example" + }, +/obj/component_adder/reciever{ + id = "portal_example_1" }, +/obj/multipoint/teleporter, /turf/unsimulated/spookygrass, /area/submap/admin_upload/powlit) -"kC" = ( -/turf/simulated/floor/lava, -/area/submap/admin_upload/powlit) "ly" = ( -/obj/multipoint/teleporter{ - teleport_id = "listener_example"; - trigger_id = "listener_example" +/obj/item/weapon/paper{ + info = "/teleporter starts inactive, and can be activated by certain trigger objects! Teleporters will only be triggered by things seeking to trigger their trigger_id, and will only teleport to teleporters that share their teleporter_id. If you give different teleporters different trigger_ids but the same teleporter_id, the teleporters will work as one way teleporters until both sides are triggered."; + name = "/teleporter example" }, /turf/unsimulated/spookygrass, /area/submap/admin_upload/powlit) "lN" = ( -/obj/item/weapon/paper{ - info = "Objectives are a generic item that is easy to track. They are intended to have their name, description, icon and/or icon_state changed. They don’t really do anything on their own, but they can be tracked using the fun > report objectives verb, which will print all of their current locations, along with a convenient jump link!"; - name = "/objective" +/obj/component_adder/pair{ + color = "cyan"; + id = "event_example" }, -/turf/unsimulated/spookygrass{ - color = "#666666" +/obj/component_adder/reciever{ + color = "red"; + id = "portal_example_2" }, +/obj/multipoint/teleporter, +/turf/unsimulated/spookygrass, /area/submap/admin_upload/powlit) "mB" = ( -/obj/item/weapon/paper{ - info = "Contrary to its name, the bus_spawner does not spawn buses. The bus_spawner allows you to spawn things with modified properties repeatedly. So for example if you want to be able to repeatedly dispense an object with an altered sprite, name, and description, this would allow you to do that without manually editing them over and over. The bus spawner needs a type path to function. To get started, you will need to click on the object, where you can enter a partial path. From there it will run through each of the variables it supports. After it is set up, clicking on it again will spawn whatever you configured it to spawn!"; - name = "/bus_spawner" +/obj/component_adder/reciever{ + id = "listener_example" }, -/turf/unsimulated/spookygrass{ - color = "#666666" +/obj/structure/simple_door/iron, +/obj/component_adder/lock{ + id = "nuffin" }, +/turf/unsimulated/spookygrass, /area/submap/admin_upload/powlit) "nd" = ( -/obj/item/weapon/paper{ - info = "Basic /multipoint_trigger switches do not allow the same ckey to trigger more than one trigger for triggers sharing the same trigger_id. These triggers are impossible for only one person to trigger, unless there is only one with the given trigger_id."; - name = "/multipoint_trigger example" +/obj/component_adder/reciever{ + id = "listener_example" }, +/obj/machinery/door/blast/angled, /turf/unsimulated/spookygrass, /area/submap/admin_upload/powlit) "nu" = ( -/obj/event_obstical/disguised/pillar{ - id = "event_key_2" +/obj/item/weapon/paper{ + info = "/puzzle switches like these can all be triggered by only one person! Because their trigger_id is the same, they all need to be pressed to activate their teleporter."; + name = "/puzzle example" }, /turf/unsimulated/spookygrass, /area/submap/admin_upload/powlit) "nv" = ( -/obj/machinery/door/airlock{ - id_tag = "listener_example" - }, -/turf/unsimulated/spookygrass, -/area/submap/admin_upload/powlit) -"om" = ( -/obj/event_key/reusable{ - id = "event_key_1" - }, -/turf/unsimulated/spookygrass, +/turf/simulated/floor/lava, /area/submap/admin_upload/powlit) "oz" = ( -/obj/item/stack/material/flint, +/obj/component_adder/reciever{ + id = "listener_example" + }, +/obj/multipoint/barrier, /turf/unsimulated/spookygrass, /area/submap/admin_upload/powlit) "pA" = ( -/obj/multipoint/teleporter{ - teleport_id = "REPLACE ME WITH A STRING"; - trigger_id = "REPLACE ME WITH A STRING" +/obj/multipoint/teleporter, +/obj/component_adder/reciever{ + color = "magenta"; + id = "e3" }, -/turf/unsimulated/spookygrass{ - color = "#00058a" +/obj/component_adder/pair{ + id = "linka" }, +/turf/unsimulated/spookygrass, /area/submap/admin_upload/powlit) "ru" = ( -/obj/event_obstical/disguised/pillar, -/turf/unsimulated/spookygrass{ - color = "#8a0000" +/obj/multipoint_trigger/puzzle, +/obj/component_adder/trigger/puzzle{ + id = "portal_example_1" }, +/turf/unsimulated/spookygrass, /area/submap/admin_upload/powlit) "rK" = ( -/obj/event_obstical{ - id = "REPLACE ME WITH A STRING" +/obj/listener{ + password_list = list("example") }, -/turf/unsimulated/spookygrass{ - color = "#8a0000" +/obj/component_adder/trigger{ + color = "magenta"; + id = "e3" }, +/turf/unsimulated/spookygrass, /area/submap/admin_upload/powlit) "tc" = ( /mob/living/simple_mob/vore/woof/cass, @@ -149,59 +189,60 @@ /area/submap/admin_upload/powlit) "uw" = ( /obj/item/weapon/paper{ - info = "The listener essentially listens for the crew to say a password. This can be configured and adjusted by staff while ghosting by clicking on the listener. Listeners can have as many passwords as you like. The listener will trigger even if a person says a password as a part of a larger message, so for example if your password is 'fire' and someone says 'Where is the fireman?' within sight range of the listener, the listener will trigger. You can even set it to only accept inputs given in one of the various languages. The listener can trigger a variety of things, including /door/blast with a matching id, /door/airlock with a matching id_tag, /simple_door with a matching lock_id, /event_obstical with a matching id, and /multipoint with a matching trigger_id. ----- Important variables: listener_id"; - name = "/listener" + info = "REPLACE ME"; + name = "/key" }, /turf/unsimulated/spookygrass, /area/submap/admin_upload/powlit) "uA" = ( -/obj/item/weapon/paper{ - info = "The multipoint trigger can be used in a couple of ways. When triggered, it will check to see if there are any other /multipoint_trigger in the world which share its trigger_id variable. If so, and any of them are not also triggered, then it will do nothing. If all triggers sharing a trigger_id are triggered, then it will attempt to trigger any /multipoint object in the world that shares its trigger_id. There are two variants of the /multipoint_trigger, the base type requires each trigger to be pressed by a player of a different ckey, requiring as many players as there are triggers. The /puzzle variant does not require different ckeys to be triggered, and will allow one person to trigger as many as they can find. These can be reset by using the 'reset barrier trigger' verb! ----- Important variables: trigger_id"; - name = "/multipoint_trigger" - }, -/turf/unsimulated/spookygrass{ - color = "#00058a" +/obj/component_adder/reciever{ + id = "event_key_1" }, +/obj/dungeon_obstacle/pillar, +/turf/unsimulated/spookygrass, /area/submap/admin_upload/powlit) "vw" = ( -/obj/effect/bus_spawner, -/turf/unsimulated/spookygrass{ - color = "#666666" +/obj/component_adder/trigger{ + color = "yellow"; + id = "event_key_2" }, +/obj/dungeon_switch, +/turf/unsimulated/spookygrass, /area/submap/admin_upload/powlit) "vT" = ( /turf/unsimulated/wall/dark, /area/submap/admin_upload/powlit) "wc" = ( -/obj/multipoint/barrier{ - trigger_id = "listener_example" +/obj/component_adder/reciever{ + id = "listener_example" + }, +/obj/machinery/door/airlock, +/obj/component_adder/lock{ + id = "nuffin" }, /turf/unsimulated/spookygrass, /area/submap/admin_upload/powlit) "xa" = ( /obj/item/weapon/paper{ - info = "Each of these obsticals works the same way, they just come in many flavors. Normally once these are triggered, they are destroyed. There are /toggle variants of certain ones which will instead toggle between a passable and impassable state, which can allow for more complicated puzzles. ----- Important variables: id"; - name = "/event_obstical" - }, -/turf/unsimulated/spookygrass{ - color = "#8a0000" - }, -/area/submap/admin_upload/powlit) -"xS" = ( -/obj/event_obstical/disguised/pillar/toggle{ - id = "event_key_1" + info = "The listener essentially listens for the crew to say a password. This can be configured and adjusted by staff while ghosting by clicking on the listener. Listeners can have as many passwords as you like. The listener will trigger even if a person says a password as a part of a larger message, so for example if your password is 'fire' and someone says 'Where is the fireman?' within sight range of the listener, the listener will trigger. You can even set it to only accept inputs given in one of the various languages. The listener can trigger a variety of things, including /door/blast with a matching id, /door/airlock with a matching id_tag, /simple_door with a matching lock_id, /event_obstical with a matching id, and /multipoint with a matching trigger_id. ----- Important variables: listener_id"; + name = "/listener" }, /turf/unsimulated/spookygrass, /area/submap/admin_upload/powlit) "yA" = ( -/obj/event_obstical/disguised/wall/cult, -/turf/unsimulated/spookygrass{ - color = "#8a0000" +/obj/component_adder/reciever{ + id = "listener_example" }, +/obj/multipoint/teleporter, +/obj/component_adder/pair{ + id = "event_example1" + }, +/turf/unsimulated/spookygrass, /area/submap/admin_upload/powlit) "yH" = ( -/obj/event_key{ - id = "event_key_1" +/obj/item/weapon/paper{ + info = "With the /reusable subtype and a /toggle subtype of /event_obstical, it is possible to create obsticles that can be toggled back and forth. This can make for some very interesting puzzles."; + name = "/event_key/reusable example" }, /turf/unsimulated/spookygrass, /area/submap/admin_upload/powlit) @@ -210,25 +251,21 @@ info = "The trait adder allows any trait to be added to any character that passes over it. Apply the path of a trait to the 'trait' variable to get it to work. This can be used to ensure the players have a trait if they need it for your event. Useful for sneakily adding darksight onto people, or giving them special abilities!"; name = "/trait_adder" }, -/turf/unsimulated/spookygrass{ - color = "#666666" - }, +/turf/unsimulated/spookygrass, /area/submap/admin_upload/powlit) "By" = ( -/obj/multipoint/barrier{ - trigger_id = "REPLACE ME WITH A STRING" - }, -/turf/unsimulated/spookygrass{ - color = "#00058a" +/obj/dungeon_obstacle, +/obj/component_adder/reciever{ + id = "e1" }, +/turf/unsimulated/spookygrass, /area/submap/admin_upload/powlit) "CP" = ( -/obj/event_key{ - id = "REPLACE ME WITH A STRING" - }, -/turf/unsimulated/spookygrass{ - color = "#8a0000" +/obj/dungeon_switch, +/obj/component_adder/trigger{ + id = "e1" }, +/turf/unsimulated/spookygrass, /area/submap/admin_upload/powlit) "CW" = ( /turf/unsimulated/spookygrass{ @@ -236,32 +273,36 @@ }, /area/submap/admin_upload/powlit) "Ee" = ( -/obj/event_obstical/disguised/wall/reinforced, -/turf/unsimulated/spookygrass{ - color = "#8a0000" +/obj/component_adder/trigger{ + id = "event_key_1" }, +/obj/dungeon_switch, +/turf/unsimulated/spookygrass, /area/submap/admin_upload/powlit) "EO" = ( -/obj/multipoint_trigger/puzzle{ - trigger_id = "portal_example_1" +/obj/dungeon_obstacle/wall/cult, +/turf/unsimulated/spookygrass, +/area/submap/admin_upload/powlit) +"FY" = ( +/obj/multipoint/barrier, +/obj/component_adder/reciever{ + color = "cyan"; + id = "e2" }, /turf/unsimulated/spookygrass, /area/submap/admin_upload/powlit) "Gk" = ( -/obj/listener/wall, +/obj/item/objective, /turf/unsimulated/spookygrass, /area/submap/admin_upload/powlit) "Gz" = ( -/obj/item/weapon/paper{ - info = "With the /reusable subtype and a /toggle subtype of /event_obstical, it is possible to create obsticles that can be toggled back and forth. This can make for some very interesting puzzles."; - name = "/event_key/reusable example" - }, +/obj/dungeon_obstacle/wall/reinforced, /turf/unsimulated/spookygrass, /area/submap/admin_upload/powlit) "HU" = ( -/obj/listener{ - listener_id = "listener_example"; - password_list = list("example") +/obj/item/weapon/paper{ + info = "Objectives are a generic item that is easy to track. They are intended to have their name, description, icon and/or icon_state changed. They don’t really do anything on their own, but they can be tracked using the fun > report objectives verb, which will print all of their current locations, along with a convenient jump link!"; + name = "/objective" }, /turf/unsimulated/spookygrass, /area/submap/admin_upload/powlit) @@ -283,20 +324,19 @@ color = "#666666" }, /area/submap/admin_upload/powlit) +"JH" = ( +/obj/dungeon_obstacle/wall, +/turf/unsimulated/spookygrass, +/area/submap/admin_upload/powlit) "JU" = ( /obj/item/weapon/paper{ info = "The /event_key is a simple triggering mechanism which reacts to being clicked on, or having items thrown at it to trigger. The base type can only be triggered one time. The /reusable subtype can be triggered repeatedly, which can be useful for things like togglable obsticals. ----- Important variables: id"; name = "/event_key" }, -/turf/unsimulated/spookygrass{ - color = "#8a0000" - }, +/turf/unsimulated/spookygrass, /area/submap/admin_upload/powlit) "Kt" = ( -/obj/item/weapon/paper{ - info = "/puzzle switches like these can all be triggered by only one person! Because their trigger_id is the same, they all need to be pressed to activate their teleporter."; - name = "/puzzle example" - }, +/obj/item/key/scifi/big/magenta, /turf/unsimulated/spookygrass, /area/submap/admin_upload/powlit) "LQ" = ( @@ -309,29 +349,19 @@ }, /area/submap/admin_upload/powlit) "MH" = ( -/obj/event_key/reusable, -/turf/unsimulated/spookygrass{ - color = "#8a0000" - }, +/obj/dungeon_obstacle/pillar, +/turf/unsimulated/spookygrass, /area/submap/admin_upload/powlit) "NP" = ( -/obj/multipoint/teleporter{ - teleport_id = "event_example"; - trigger_id = "portal_example_1" - }, +/obj/item/key/scifi/blue, /turf/unsimulated/spookygrass, /area/submap/admin_upload/powlit) "Oe" = ( -/obj/structure/simple_door/iron{ - lock_id = "listener_example" - }, +/obj/effect/bus_spawner, /turf/unsimulated/spookygrass, /area/submap/admin_upload/powlit) "OH" = ( -/obj/item/weapon/paper{ - info = "The /event_key can be triggered by clicking on it, or by impacting it with a thrown object!"; - name = "/event_key example" - }, +/obj/dungeon_obstacle/obstical, /turf/unsimulated/spookygrass, /area/submap/admin_upload/powlit) "Qz" = ( @@ -341,69 +371,94 @@ /obj/trait_adder{ trait = "REPLACE ME WITH A TRAIT PATH" }, -/turf/unsimulated/spookygrass{ - color = "#666666" - }, +/turf/unsimulated/spookygrass, /area/submap/admin_upload/powlit) "Sp" = ( -/turf/unsimulated/spookygrass{ - color = "#00058a" - }, +/obj/structure/portal_event, +/turf/unsimulated/spookygrass, +/area/submap/admin_upload/powlit) +"Tm" = ( +/obj/item/key/big, +/turf/unsimulated/spookygrass, /area/submap/admin_upload/powlit) "Ur" = ( -/obj/event_obstical/disguised/wall, -/turf/unsimulated/spookygrass{ - color = "#8a0000" +/obj/structure/simple_door/iron, +/obj/component_adder/lock{ + color = "yellow"; + id = "le1" }, +/turf/unsimulated/spookygrass, /area/submap/admin_upload/powlit) "UH" = ( -/obj/item/objective, -/turf/unsimulated/spookygrass{ - color = "#666666" - }, +/obj/item/key/card/yellow, +/turf/unsimulated/spookygrass, /area/submap/admin_upload/powlit) -"Yc" = ( -/obj/item/weapon/paper{ - info = "/teleporter starts inactive, and can be activated by certain trigger objects! Teleporters will only be triggered by things seeking to trigger their trigger_id, and will only teleport to teleporters that share their teleporter_id. If you give different teleporters different trigger_ids but the same teleporter_id, the teleporters will work as one way teleporters until both sides are triggered."; - name = "/teleporter example" +"VL" = ( +/obj/multipoint_trigger, +/obj/component_adder/trigger{ + color = "cyan"; + id = "e2" }, /turf/unsimulated/spookygrass, /area/submap/admin_upload/powlit) -"YB" = ( +"VS" = ( /obj/item/weapon/paper{ info = "This object simply blocks things, and can be easily colored. Unlike /event_obstical you can usually see through /barrier, this can allow a barrier to be bypassed by targetted short range teleportation, such as bluespace harpoons. You can set the 'opacity' variable to 1 if you want it to also block sight. Barriers automatically set the 'block_phase_shift' variable of any area they appear in to 1, preventing phase shifting creatures from easily bypassing them. ----- Important variables: trigger_id"; name = "/barrier" }, -/turf/unsimulated/spookygrass{ - color = "#00058a" +/turf/unsimulated/spookygrass, +/area/submap/admin_upload/powlit) +"Xf" = ( +/obj/item/weapon/paper{ + info = "Contrary to its name, the bus_spawner does not spawn buses. The bus_spawner allows you to spawn things with modified properties repeatedly. So for example if you want to be able to repeatedly dispense an object with an altered sprite, name, and description, this would allow you to do that without manually editing them over and over. The bus spawner needs a type path to function. To get started, you will need to click on the object, where you can enter a partial path. From there it will run through each of the variables it supports. After it is set up, clicking on it again will spawn whatever you configured it to spawn!"; + name = "/bus_spawner" + }, +/turf/unsimulated/spookygrass, +/area/submap/admin_upload/powlit) +"Yc" = ( +/obj/dungeon_obstacle/disguised, +/obj/component_adder/lock{ + color = "yellow"; + id = "le1" + }, +/turf/unsimulated/spookygrass, +/area/submap/admin_upload/powlit) +"YB" = ( +/obj/item/weapon/paper{ + info = "Each of these obsticals works the same way, they just come in many flavors. Normally once these are triggered, they are destroyed. There are /toggle variants of certain ones which will instead toggle between a passable and impassable state, which can allow for more complicated puzzles. ----- Important variables: id"; + name = "/event_obstical" }, +/turf/unsimulated/spookygrass, /area/submap/admin_upload/powlit) "YY" = ( -/obj/event_key{ - id = "event_key_2" +/obj/multipoint/teleporter, +/obj/component_adder/lock{ + color = "yellow"; + id = "le1" + }, +/obj/component_adder/pair{ + id = "linka" }, /turf/unsimulated/spookygrass, /area/submap/admin_upload/powlit) "Ze" = ( -/obj/multipoint_trigger{ - trigger_id = "portal_example_2" +/obj/machinery/door/blast/angled, +/obj/component_adder/lock{ + color = "yellow"; + id = "le1" }, /turf/unsimulated/spookygrass, /area/submap/admin_upload/powlit) "Zi" = ( -/obj/event_obstical/disguised/obstical, -/turf/unsimulated/spookygrass{ - color = "#8a0000" - }, +/obj/listener/wall, +/turf/unsimulated/spookygrass, /area/submap/admin_upload/powlit) "ZY" = ( /obj/item/weapon/paper{ info = "This teleporter is inactive by default, it can be activated by /multipoint_trigger and /listener which match its trigger_id. If triggered, it will search for any other /teleporter with a matching teleport_id. If it finds one, it will activate. It is important to note, that the teleporter can be complicated, as it can link to other teleporters with different trigger_ids, which can create one way teleports. Additionally, if you create multiple teleporters with the same teleport_id, then when the players teleport, it will pick a random teleporter, minus itself, which can be used to confusing effect. ----- Important variables: trigger_id - teleport_id"; name = "/teleporter" }, -/turf/unsimulated/spookygrass{ - color = "#00058a" - }, +/turf/unsimulated/spookygrass, /area/submap/admin_upload/powlit) (1,1,1) = {" @@ -804,26 +859,26 @@ jk jk jk jk +Qz +Qz +Qz +Qz +Qz +Qz +Qz +Qz +Qz +Qz jk jk jk -jk -jk -jk -jk -jk -jk -jk -jk -jk -jk -jk -jk -jk -jk -jk -jk -jk +Qz +Gk +HU +Qz +Oe +Xf +Qz QC Aw jk @@ -943,31 +998,31 @@ CW CW jk jk +jk +jk +jk Qz Qz Qz Qz +kn Qz Qz Qz Qz Qz -Qz -jk -jk -jk -jk -jk -jk -jk -jk -jk -jk -jk -jk jk jk jk +Qz +Qz +Qz +Qz +Qz +Qz +Qz +Qz +Qz jk LQ jk @@ -1085,29 +1140,29 @@ CW CW jk jk +jk +jk +jk Qz Qz +dS Qz Qz -NP -Qz Qz +ru Qz Qz Qz jk jk jk -jk -jk -jk -jk -dS -dS -dS -dS -dS -MH +Qz +Qz +Qz +Qz +Qz +Qz +Qz CP JU jk @@ -1227,31 +1282,31 @@ CW CW jk jk +jk +jk +jk Qz Qz -Ze -Qz -Qz +er Qz -EO +ly Qz Qz +nu +ru Qz jk jk jk -jk -jk -jk -jk -dS -dS -dS -dS -dS -dS -dS -dS +Qz +Qz +Qz +Qz +Qz +Qz +Qz +VL +aC JE jk jk @@ -1369,29 +1424,29 @@ CW CW jk jk -Ze +jk +jk +jk Qz -nd Qz -Yc +dS +Qz +Qz +Qz +ru Qz Qz -Kt -EO Qz -jk jk jk jk Qz Qz Qz -yA -Ee -Ur -ru +Qz +Qz Zi -bK +Qz rK xa jk @@ -1511,31 +1566,31 @@ CW CW jk jk +jk +jk +jk Qz Qz -Ze Qz Qz +lN Qz -EO Qz Qz Qz -jk -jk -jk -jk Qz jk jk jk -jk -jk -jk -jk -jk -jk -jk +Qz +Qz +Qz +Qz +Qz +Qz +Qz +Qz +Qz jk jk jk @@ -1653,11 +1708,14 @@ CW CW jk jk +jk +jk +jk +Qz Qz Qz Qz Qz -bC Qz Qz Qz @@ -1666,16 +1724,13 @@ Qz jk jk jk -jk -Qz -Qz +EO +Gz +JH +MH +OH +Yc Qz -Sp -Sp -Sp -Sp -Sp -Sp By YB jk @@ -1795,6 +1850,22 @@ CW CW jk jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk Qz Qz Qz @@ -1802,24 +1873,8 @@ Qz Qz Qz Qz -Qz -Qz -Qz -jk -jk -jk -jk -Qz -jk -jk -Sp -Sp -Sp -Sp -Sp -Sp -Sp -Sp +FY +VS jk jk jk @@ -1940,26 +1995,26 @@ jk jk jk jk -jk -jk -jk -jk -jk -jk -jk -jk +Qz +Qz +Qz +Qz +Qz +Qz +Qz +Qz +Qz +bK jk jk jk Qz Qz Qz +Qz Sp -Sp -Sp -Sp -Sp -Sp +YY +Qz pA ZY jk @@ -2079,7 +2134,22 @@ CW CW jk jk +jk +jk +jk Qz +bK +Qz +Qz +oz +oz +oz +oz +oz +Qz +jk +jk +jk Qz Qz Qz @@ -2088,22 +2158,7 @@ Qz Qz Qz Qz -kn -jk -jk -jk -jk Qz -jk -jk -Sp -Sp -Sp -Sp -Sp -Sp -Sp -Sp In jk jk @@ -2221,31 +2276,31 @@ CW CW jk jk +jk +jk +jk Qz -kn Qz Qz -wc -wc -wc -wc -wc Qz -jk +oz +mB +Qz +yA +oz +Qz jk jk jk Qz -jk -jk -Sp -Sp -Sp -Sp -Sp -dn +Qz +Qz +Qz +Ur +Ze +Qz aH -uA +ZY jk jk jk @@ -2363,31 +2418,31 @@ CW CW jk jk +jk +jk +jk Qz +cf +gA Qz -Qz -Qz +oz wc -Oe Qz -ly -wc Qz -jk -jk -jk -jk +oz Qz jk jk jk -jk -jk -jk -jk -jk -jk -jk +Qz +Qz +Qz +Qz +Qz +Qz +Qz +Qz +Qz jk jk jk @@ -2505,17 +2560,6 @@ CW CW jk jk -Qz -HU -dj -Qz -wc -nv -Qz -Qz -wc -Qz -jk jk jk jk @@ -2523,11 +2567,22 @@ Qz Qz Qz Qz +oz +nd +Qz +yA +oz Qz +jk +jk +jk Qz Qz +Kt +NP +UH +Tm Qz -Gk dZ uw jk @@ -2647,31 +2702,31 @@ CW CW jk jk +jk +jk +jk Qz +bK Qz Qz +oz +oz +oz +oz +oz Qz -wc -er -Qz -ly -wc -Qz -jk -jk -jk -jk -jk -jk -jk -jk -jk -jk -jk -jk jk jk jk +Qz +Qz +Qz +Qz +Qz +Qz +Qz +Qz +Qz jk jk jk @@ -2789,31 +2844,31 @@ CW CW jk jk +jk +jk +jk Qz -kn Qz Qz -wc -wc -wc -wc -wc Qz +Qz +Qz +Qz +Qz +Qz +bK jk jk jk -jk -jk -jk -jk -jk -jk -jk -jk -jk -jk -UH -lN +Qz +Qz +Qz +Qz +Qz +Qz +Qz +Qz +Qz jk jk jk @@ -2931,16 +2986,6 @@ CW CW jk jk -Qz -Qz -Qz -Qz -Qz -Qz -Qz -Qz -Qz -kn jk jk jk @@ -2957,6 +3002,16 @@ jk jk jk jk +Qz +Qz +Qz +Qz +Qz +Qz +Qz +Qz +Qz +jk jk jk jk @@ -3076,28 +3131,28 @@ jk jk jk jk +bC +Qz +Qz +Qz +Qz +Qz +Qz +Qz +Qz +Qz jk jk jk -jk -jk -jk -jk -jk -jk -jk -jk -jk -jk -jk -jk -jk -jk -jk -jk -jk -vw -mB +Qz +Qz +Qz +Qz +Qz +Qz +Qz +Qz +Qz jk jk jk @@ -3215,7 +3270,22 @@ CW CW jk jk -oz +jk +jk +jk +bC +dj +ih +Qz +Qz +Qz +uA +yH +Ee +Qz +jk +jk +jk Qz Qz Qz @@ -3225,21 +3295,6 @@ Qz Qz Qz Qz -jk -jk -jk -jk -jk -jk -jk -jk -jk -jk -jk -jk -jk -jk -jk jk jk jk @@ -3357,31 +3412,31 @@ CW CW jk jk -oz -yH -OH +jk +jk +jk +bC +Qz +Qz +Qz +Qz +Qz Qz Qz Qz -xS -Gz -om Qz jk jk jk -jk -jk -jk -jk -jk -jk -jk -jk -jk -jk -jk -jk +Qz +Qz +Qz +Qz +Qz +Qz +Qz +Qz +Qz jk jk jk @@ -3499,14 +3554,17 @@ CW CW jk jk -oz -Qz -Qz -Qz +jk +jk +jk +bC Qz Qz Qz Qz +nv +nv +nv Qz Qz jk @@ -3525,9 +3583,6 @@ jk jk jk jk -jk -jk -jk vT "} (23,1,1) = {" @@ -3641,14 +3696,17 @@ CW CW jk jk -oz -Qz +jk +jk +jk +bC +dn Qz Qz Qz -kC -kC -kC +nv +vw +nv Qz Qz jk @@ -3667,9 +3725,6 @@ jk jk jk jk -jk -jk -jk vT "} (24,1,1) = {" @@ -3783,19 +3838,19 @@ CW CW jk jk -oz -nu +jk +jk +jk +bC Qz Qz Qz -kC -YY -kC +Qz +nv +nv +nv Qz Qz -jk -jk -jk jk jk jk @@ -3925,19 +3980,19 @@ CW CW jk jk -oz +jk +jk +jk +bC +Qz +Qz +Qz Qz Qz Qz Qz -kC -kC -kC Qz Qz -jk -jk -jk jk jk jk @@ -4067,16 +4122,16 @@ CW CW jk jk -oz -Qz -Qz -Qz -Qz -Qz -Qz -Qz -Qz -Qz +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk jk jk jk @@ -4491,37 +4546,37 @@ CW CW CW CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk vT "} (30,1,1) = {" @@ -4633,6 +4688,41 @@ CW CW CW CW +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +vT +"} +(31,1,1) = {" +vT CW CW CW @@ -4664,14 +4754,6 @@ CW CW CW CW -vT -"} -(31,1,1) = {" -vT -CW -CW -CW -CW CW CW CW @@ -4748,6 +4830,41 @@ CW CW CW CW +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +vT +"} +(32,1,1) = {" +vT CW CW CW @@ -4806,10 +4923,6 @@ CW CW CW CW -vT -"} -(32,1,1) = {" -vT CW CW CW @@ -4859,6 +4972,41 @@ CW CW CW CW +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +vT +"} +(33,1,1) = {" +vT CW CW CW @@ -4948,10 +5096,6 @@ CW CW CW CW -vT -"} -(33,1,1) = {" -vT CW CW CW @@ -4970,6 +5114,42 @@ CW CW CW CW +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +vT +"} +(34,1,1) = {" +vT +CW CW CW CW @@ -5076,6 +5256,41 @@ CW CW CW CW +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +vT +"} +(35,1,1) = {" +vT CW CW CW @@ -5090,10 +5305,6 @@ CW CW CW CW -vT -"} -(34,1,1) = {" -vT CW CW CW @@ -5187,6 +5398,41 @@ CW CW CW CW +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +vT +"} +(36,1,1) = {" +vT CW CW CW @@ -5232,10 +5478,6 @@ CW CW CW CW -vT -"} -(35,1,1) = {" -vT CW CW CW @@ -5298,6 +5540,41 @@ CW CW CW CW +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +vT +"} +(37,1,1) = {" +vT CW CW CW @@ -5374,10 +5651,6 @@ CW CW CW CW -vT -"} -(36,1,1) = {" -vT CW CW CW @@ -5409,6 +5682,41 @@ CW CW CW CW +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +vT +"} +(38,1,1) = {" +vT CW CW CW @@ -5516,9 +5824,40 @@ CW CW CW CW +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk vT "} -(37,1,1) = {" +(39,1,1) = {" vT CW CW @@ -5627,6 +5966,41 @@ CW CW CW CW +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +vT +"} +(40,1,1) = {" +vT CW CW CW @@ -5658,27 +6032,6 @@ CW CW CW CW -vT -"} -(38,1,1) = {" -vT -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW CW CW CW @@ -5755,6 +6108,41 @@ CW CW CW CW +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +vT +"} +(41,1,1) = {" +vT CW CW CW @@ -5800,10 +6188,6 @@ CW CW CW CW -vT -"} -(39,1,1) = {" -vT CW CW CW @@ -5866,6 +6250,41 @@ CW CW CW CW +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +vT +"} +(42,1,1) = {" +vT CW CW CW @@ -5942,10 +6361,6 @@ CW CW CW CW -vT -"} -(40,1,1) = {" -vT CW CW CW @@ -5977,6 +6392,41 @@ CW CW CW CW +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +vT +"} +(43,1,1) = {" +vT CW CW CW @@ -6084,9 +6534,40 @@ CW CW CW CW +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk vT "} -(41,1,1) = {" +(44,1,1) = {" vT CW CW @@ -6195,6 +6676,41 @@ CW CW CW CW +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +vT +"} +(45,1,1) = {" +vT CW CW CW @@ -6226,21 +6742,6 @@ CW CW CW CW -vT -"} -(42,1,1) = {" -vT -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW CW CW CW @@ -6317,6 +6818,41 @@ CW CW CW CW +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +vT +"} +(46,1,1) = {" +vT CW CW CW @@ -6368,16 +6904,6 @@ CW CW CW CW -vT -"} -(43,1,1) = {" -vT -CW -CW -CW -CW -CW -CW CW CW CW @@ -6434,6 +6960,41 @@ CW CW CW CW +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +vT +"} +(47,1,1) = {" +vT CW CW CW @@ -6510,10 +7071,6 @@ CW CW CW CW -vT -"} -(44,1,1) = {" -vT CW CW CW @@ -6545,6 +7102,41 @@ CW CW CW CW +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +vT +"} +(48,1,1) = {" +vT CW CW CW @@ -6652,9 +7244,40 @@ CW CW CW CW +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk vT "} -(45,1,1) = {" +(49,1,1) = {" vT CW CW @@ -6763,40 +7386,40 @@ CW CW CW CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk vT "} -(46,1,1) = {" +(50,1,1) = {" vT CW CW @@ -6905,6 +7528,41 @@ CW CW CW CW +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +vT +"} +(51,1,1) = {" +vT CW CW CW @@ -6936,11 +7594,6 @@ CW CW CW CW -vT -"} -(47,1,1) = {" -vT -CW CW CW CW @@ -7017,1522 +7670,41 @@ CW CW CW CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -vT -"} -(48,1,1) = {" -vT -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -vT -"} -(49,1,1) = {" -vT -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -vT -"} -(50,1,1) = {" -vT -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -vT -"} -(51,1,1) = {" -vT -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -vT -"} -(52,1,1) = {" -vT -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -vT -"} -(53,1,1) = {" -vT -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -vT -"} -(54,1,1) = {" -vT -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -vT -"} -(55,1,1) = {" -vT -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -vT -"} -(56,1,1) = {" -vT -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -vT -"} -(57,1,1) = {" -vT -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -vT -"} -(58,1,1) = {" -vT -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +vT +"} +(52,1,1) = {" +vT CW CW CW @@ -8640,9 +7812,40 @@ CW CW CW CW +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk vT "} -(59,1,1) = {" +(53,1,1) = {" vT CW CW @@ -8751,40 +7954,40 @@ CW CW CW CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk vT "} -(60,1,1) = {" +(54,1,1) = {" vT CW CW @@ -8893,6 +8096,41 @@ CW CW CW CW +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +vT +"} +(55,1,1) = {" +vT CW CW CW @@ -8924,27 +8162,6 @@ CW CW CW CW -vT -"} -(61,1,1) = {" -vT -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW CW CW CW @@ -9021,6 +8238,41 @@ CW CW CW CW +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +vT +"} +(56,1,1) = {" +vT CW CW CW @@ -9066,10 +8318,6 @@ CW CW CW CW -vT -"} -(62,1,1) = {" -vT CW CW CW @@ -9132,6 +8380,41 @@ CW CW CW CW +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +vT +"} +(57,1,1) = {" +vT CW CW CW @@ -9208,10 +8491,6 @@ CW CW CW CW -vT -"} -(63,1,1) = {" -vT CW CW CW @@ -9243,6 +8522,41 @@ CW CW CW CW +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +vT +"} +(58,1,1) = {" +vT CW CW CW @@ -9350,9 +8664,40 @@ CW CW CW CW +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk vT "} -(64,1,1) = {" +(59,1,1) = {" vT CW CW @@ -9461,6 +8806,41 @@ CW CW CW CW +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +vT +"} +(60,1,1) = {" +vT CW CW CW @@ -9492,27 +8872,6 @@ CW CW CW CW -vT -"} -(65,1,1) = {" -vT -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW CW CW CW @@ -9589,6 +8948,41 @@ CW CW CW CW +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +vT +"} +(61,1,1) = {" +vT CW CW CW @@ -9634,10 +9028,6 @@ CW CW CW CW -vT -"} -(66,1,1) = {" -vT CW CW CW @@ -9700,6 +9090,41 @@ CW CW CW CW +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +vT +"} +(62,1,1) = {" +vT CW CW CW @@ -9776,10 +9201,6 @@ CW CW CW CW -vT -"} -(67,1,1) = {" -vT CW CW CW @@ -9811,6 +9232,41 @@ CW CW CW CW +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +vT +"} +(63,1,1) = {" +vT CW CW CW @@ -9918,9 +9374,40 @@ CW CW CW CW +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk vT "} -(68,1,1) = {" +(64,1,1) = {" vT CW CW @@ -10029,6 +9516,41 @@ CW CW CW CW +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +vT +"} +(65,1,1) = {" +vT CW CW CW @@ -10060,13 +9582,6 @@ CW CW CW CW -vT -"} -(69,1,1) = {" -vT -CW -CW -CW CW CW CW @@ -10143,6 +9658,41 @@ CW CW CW CW +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +vT +"} +(66,1,1) = {" +vT CW CW CW @@ -10202,10 +9752,6 @@ CW CW CW CW -vT -"} -(70,1,1) = {" -vT CW CW CW @@ -10254,6 +9800,41 @@ CW CW CW CW +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +vT +"} +(67,1,1) = {" +vT CW CW CW @@ -10344,10 +9925,6 @@ CW CW CW CW -vT -"} -(71,1,1) = {" -vT CW CW CW @@ -10365,6 +9942,41 @@ CW CW CW CW +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +vT +"} +(68,1,1) = {" +vT CW CW CW @@ -10472,6 +10084,41 @@ CW CW CW CW +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +vT +"} +(69,1,1) = {" +vT CW CW CW @@ -10486,10 +10133,6 @@ CW CW CW CW -vT -"} -(72,1,1) = {" -vT CW CW CW @@ -10583,6 +10226,41 @@ CW CW CW CW +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +vT +"} +(70,1,1) = {" +vT CW CW CW @@ -10628,10 +10306,6 @@ CW CW CW CW -vT -"} -(73,1,1) = {" -vT CW CW CW @@ -10694,6 +10368,41 @@ CW CW CW CW +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +vT +"} +(71,1,1) = {" +vT CW CW CW @@ -10770,10 +10479,6 @@ CW CW CW CW -vT -"} -(74,1,1) = {" -vT CW CW CW @@ -10805,6 +10510,41 @@ CW CW CW CW +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +vT +"} +(72,1,1) = {" +vT CW CW CW @@ -10912,9 +10652,40 @@ CW CW CW CW +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk vT "} -(75,1,1) = {" +(73,1,1) = {" vT CW CW @@ -11023,6 +10794,41 @@ CW CW CW CW +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +vT +"} +(74,1,1) = {" +vT CW CW CW @@ -11054,13 +10860,6 @@ CW CW CW CW -vT -"} -(76,1,1) = {" -vT -CW -CW -CW CW CW CW @@ -11137,6 +10936,41 @@ CW CW CW CW +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +vT +"} +(75,1,1) = {" +vT CW CW CW @@ -11196,10 +11030,6 @@ CW CW CW CW -vT -"} -(77,1,1) = {" -vT CW CW CW @@ -11248,6 +11078,41 @@ CW CW CW CW +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +vT +"} +(76,1,1) = {" +vT CW CW CW @@ -11338,10 +11203,6 @@ CW CW CW CW -vT -"} -(78,1,1) = {" -vT CW CW CW @@ -11359,6 +11220,41 @@ CW CW CW CW +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +vT +"} +(77,1,1) = {" +vT CW CW CW @@ -11466,6 +11362,41 @@ CW CW CW CW +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +vT +"} +(78,1,1) = {" +vT CW CW CW @@ -11480,10 +11411,6 @@ CW CW CW CW -vT -"} -(79,1,1) = {" -vT CW CW CW @@ -11577,6 +11504,41 @@ CW CW CW CW +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +vT +"} +(79,1,1) = {" +vT CW CW CW @@ -11622,10 +11584,6 @@ CW CW CW CW -vT -"} -(80,1,1) = {" -vT CW CW CW @@ -11688,6 +11646,41 @@ CW CW CW CW +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +vT +"} +(80,1,1) = {" +vT CW CW CW @@ -11764,10 +11757,6 @@ CW CW CW CW -vT -"} -(81,1,1) = {" -vT CW CW CW @@ -11799,6 +11788,41 @@ CW CW CW CW +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +vT +"} +(81,1,1) = {" +vT CW CW CW @@ -11906,6 +11930,37 @@ CW CW CW CW +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk vT "} (82,1,1) = {" @@ -12017,37 +12072,37 @@ CW CW CW CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW -CW +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk +jk vT "} (83,1,1) = {" diff --git a/maps/redgate/fantasy.dmm b/maps/redgate/fantasy.dmm index a0eec012cc4..2311bfcf6c2 100644 --- a/maps/redgate/fantasy.dmm +++ b/maps/redgate/fantasy.dmm @@ -4309,7 +4309,10 @@ "Aq" = ( /obj/structure/closet/cabinet, /obj/item/weapon/moneybag, -/obj/item/weapon/simple_key/dungeon, +/obj/item/key/dungeon, +/obj/component_adder/key{ + id = "dungeon" + }, /turf/simulated/floor/wood/alt, /area/redgate/fantasy/house) "As" = ( diff --git a/maps/redgate/fantasy_dungeon.dmm b/maps/redgate/fantasy_dungeon.dmm index 39ec92e8b90..e572ffa228d 100644 --- a/maps/redgate/fantasy_dungeon.dmm +++ b/maps/redgate/fantasy_dungeon.dmm @@ -1292,6 +1292,9 @@ /area/redgate/fantasy/dungeon) "Bg" = ( /obj/structure/simple_door/dungeon/locked, +/obj/component_adder/lock{ + id = "dungeon" + }, /turf/simulated/floor/wmarble, /area/redgate/fantasy/dungeon) "Bh" = ( diff --git a/maps/redgate/fantasy_items.dm b/maps/redgate/fantasy_items.dm index a49aa0e11c9..6b2b8a2c0cf 100644 --- a/maps/redgate/fantasy_items.dm +++ b/maps/redgate/fantasy_items.dm @@ -540,10 +540,9 @@ This device records all warnings given and teleport events for admin review in c /obj/structure/simple_door/dungeon/locked locked = TRUE breakable = FALSE - lock_id = "dungeon" -/obj/item/weapon/simple_key/dungeon +/obj/item/key/dungeon //RS EDIT name = "old key" desc = "A plain, old-timey key, as one might use to unlock a door." + icon = 'icons/obj/keys.dmi' //RS EDIT icon_state = "dungeon" - key_id = "dungeon" diff --git a/vorestation.dme b/vorestation.dme index c47c810a103..3fdc8bed485 100644 --- a/vorestation.dme +++ b/vorestation.dme @@ -1661,7 +1661,9 @@ #include "code\game\objects\structures\stool_bed_chair_nest\wheelchair.dm" #include "code\game\objects\structures\stool_bed_chair_nest\wheelchair_item.dm" #include "code\game\Rogue Star\bus_spawner.dm" +#include "code\game\Rogue Star\dehydration.dm" #include "code\game\Rogue Star\deployable_teleporter.dm" +#include "code\game\Rogue Star\dungeon_maker.dm" #include "code\game\Rogue Star\easter.dm" #include "code\game\Rogue Star\effect_trail.dm" #include "code\game\Rogue Star\event_tally.dm" @@ -1675,12 +1677,15 @@ #include "code\game\Rogue Star\special_persist.dm" #include "code\game\Rogue Star\tag.dm" #include "code\game\Rogue Star\waddle.dm" +#include "code\game\Rogue Star\_Component\component_adder.dm" +#include "code\game\Rogue Star\_Component\dungeon_component.dm" #include "code\game\Rogue Star\abilities\return.dm" #include "code\game\Rogue Star\abilities\search.dm" #include "code\game\Rogue Star\catborgs\catborgs.dm" #include "code\game\Rogue Star\clothing\storage\BarkRIG.dm" #include "code\game\Rogue Star\fluff\sari-outfit-fluff.dm" #include "code\game\Rogue Star\mob\seething.dm" +#include "code\game\Rogue Star\obj\food_cubes.dm" #include "code\game\Rogue Star\obj\keys.dm" #include "code\game\Rogue Star\obj\listener.dm" #include "code\game\Rogue Star\obj\spookytrees.dm"