diff --git a/code/__defines/_planes+layers.dm b/code/__defines/_planes+layers.dm index ad2962547c..3686518108 100644 --- a/code/__defines/_planes+layers.dm +++ b/code/__defines/_planes+layers.dm @@ -58,7 +58,7 @@ What is the naming convention for planes or layers? #define ATMOS_LAYER 2.4 // Pipe-like atmos machinery that goes on the floor, like filters. #define ABOVE_UTILITY 2.5 // Above stuff like pipes and wires #define TURF_PLANE -45 // Turfs themselves, most flooring - #define ABOVE_TURF_LAYER 2.1 // Snow and such + #define ABOVE_TURF_LAYER 2.1 // Snow and wallmounted/floormounted equipment #define DECAL_PLANE -44 // Permanent decals #define DIRTY_PLANE -43 // Nonpermanent decals #define BLOOD_PLANE -42 // Blood is really dirty, but we can do special stuff if we separate it @@ -74,9 +74,6 @@ What is the naming convention for planes or layers? #define DOOR_CLOSED_LAYER 3.1 // Doors when closed #define WINDOW_LAYER 3.2 // Windows #define ON_WINDOW_LAYER 3.3 // Ontop of a window - #define SHOWER_OPEN_LAYER 3.4 // Showers when open - // Obj/Mob layer boundary - #define SHOWER_CLOSED_LAYER 4.2 // Should be converted to plane swaps // Mob planes #define MOB_PLANE -25 diff --git a/code/__defines/lighting.dm b/code/__defines/lighting.dm index 00e473fc2a..9304a26efe 100644 --- a/code/__defines/lighting.dm +++ b/code/__defines/lighting.dm @@ -72,4 +72,7 @@ #define LIGHT_COLOR_FLARE "#FA644B" //Bright, non-saturated red. Leaning slightly towards pink for visibility. rgb(250, 100, 75) #define LIGHT_COLOR_SLIME_LAMP "#AFC84B" //Weird color, between yellow and green, very slimy. rgb(175, 200, 75) #define LIGHT_COLOR_TUNGSTEN "#FAE1AF" //Extremely diluted yellow, close to skin color (for some reason). rgb(250, 225, 175) -#define LIGHT_COLOR_HALOGEN "#F0FAFA" //Barely visible cyan-ish hue, as the doctor prescribed. rgb(240, 250, 250) \ No newline at end of file +#define LIGHT_COLOR_HALOGEN "#F0FAFA" //Barely visible cyan-ish hue, as the doctor prescribed. rgb(240, 250, 250) + +//Fake ambient occlusion filter +#define AMBIENT_OCCLUSION filter(type="drop_shadow", x=0, y=-2, size=4, border=4, color="#04080FAA") diff --git a/code/__defines/misc.dm b/code/__defines/misc.dm index 79848c748a..eea0e7deda 100644 --- a/code/__defines/misc.dm +++ b/code/__defines/misc.dm @@ -104,7 +104,7 @@ #define WAIT_FINISH 4 // Setting this much higher than 1024 could allow spammers to DOS the server easily. -#define MAX_MESSAGE_LEN 1024 +#define MAX_MESSAGE_LEN 2048 //VOREStation Edit - I'm not sure about "easily". It can be a little longer. #define MAX_PAPER_MESSAGE_LEN 6144 #define MAX_BOOK_MESSAGE_LEN 24576 #define MAX_RECORD_LENGTH 24576 diff --git a/code/__defines/mobs.dm b/code/__defines/mobs.dm index 23e0825299..53707c98cd 100644 --- a/code/__defines/mobs.dm +++ b/code/__defines/mobs.dm @@ -299,7 +299,11 @@ #define VIS_MESONS 18 -#define VIS_COUNT 18 //Must be highest number from above. +#define VIS_TURFS 19 +#define VIS_OBJS 20 +#define VIS_MOBS 21 + +#define VIS_COUNT 21 //Must be highest number from above. //Some mob icon layering defines #define BODY_LAYER -100 diff --git a/code/__defines/mobs_vr.dm b/code/__defines/mobs_vr.dm index d80d22df36..2e3f8b0760 100644 --- a/code/__defines/mobs_vr.dm +++ b/code/__defines/mobs_vr.dm @@ -1,13 +1,13 @@ #undef VIS_COUNT -#define VIS_CH_STATUS_R 19 -#define VIS_CH_HEALTH_VR 20 -#define VIS_CH_BACKUP 21 -#define VIS_CH_VANTAG 22 +#define VIS_CH_STATUS_R 22 +#define VIS_CH_HEALTH_VR 23 +#define VIS_CH_BACKUP 24 +#define VIS_CH_VANTAG 25 -#define VIS_AUGMENTED 23 +#define VIS_AUGMENTED 26 -#define VIS_COUNT 23 +#define VIS_COUNT 26 //Protean organs #define O_ORCH "orchestrator" diff --git a/code/controllers/subsystems/transcore_vr.dm b/code/controllers/subsystems/transcore_vr.dm index 4958d87f3d..feae05ae91 100644 --- a/code/controllers/subsystems/transcore_vr.dm +++ b/code/controllers/subsystems/transcore_vr.dm @@ -139,10 +139,12 @@ SUBSYSTEM_DEF(transcore) var/datum/nifsoft/nifsoft = N nifsofts += nifsoft.type MR.nif_software = nifsofts + MR.nif_savedata = nif.save_data.Copy() else if(isnull(nif)) //Didn't pass anything, so no NIF MR.nif_path = null MR.nif_durability = null MR.nif_software = null + MR.nif_savedata = null else MR = new(mind, mind.current, add_to_db = TRUE, one_time = one_time) diff --git a/code/datums/supplypacks/robotics_vr.dm b/code/datums/supplypacks/robotics_vr.dm index 24dc073874..9ee67ebb9d 100644 --- a/code/datums/supplypacks/robotics_vr.dm +++ b/code/datums/supplypacks/robotics_vr.dm @@ -1,3 +1,38 @@ +/datum/supply_packs/robotics/mecha_gopher + name = "Circuit Crate (\"Gopher\" APLU)" + contains = list( + /obj/item/weapon/circuitboard/mecha/gopher/main, + /obj/item/weapon/circuitboard/mecha/gopher/peripherals + ) + cost = 25 + containertype = /obj/structure/closet/crate/secure/science + containername = "APLU \"Gopher\" Circuit Crate" + access = access_robotics + +/datum/supply_packs/robotics/mecha_polecat + name = "Circuit Crate (\"Polecat\" APLU)" + contains = list( + /obj/item/weapon/circuitboard/mecha/polecat/main, + /obj/item/weapon/circuitboard/mecha/polecat/peripherals, + /obj/item/weapon/circuitboard/mecha/polecat/targeting + ) + cost = 25 + containertype = /obj/structure/closet/crate/secure/science + containername = "APLU \"Polecat\" Circuit Crate" + access = access_robotics + +/datum/supply_packs/robotics/mecha_weasel + name = "Circuit Crate (\"Weasel\" APLU)" + contains = list( + /obj/item/weapon/circuitboard/mecha/weasel/main, + /obj/item/weapon/circuitboard/mecha/weasel/peripherals, + /obj/item/weapon/circuitboard/mecha/weasel/targeting + ) + cost = 25 + containertype = /obj/structure/closet/crate/secure/science + containername = "APLU \"Weasel\" Circuit Crate" + access = access_robotics + /datum/supply_packs/robotics/some_robolimbs name = "Basic Robolimb Blueprints" contains = list( @@ -35,4 +70,4 @@ cost = 40 containertype = /obj/structure/closet/crate/secure containername = "Advanced Robolimb Blueprint Crate" - access = access_robotics \ No newline at end of file + access = access_robotics diff --git a/code/game/machinery/alarm.dm b/code/game/machinery/alarm.dm index 6a435ef388..ee0bdc05a7 100644 --- a/code/game/machinery/alarm.dm +++ b/code/game/machinery/alarm.dm @@ -36,6 +36,8 @@ name = "alarm" icon = 'icons/obj/monitors.dmi' icon_state = "alarm0" + plane = TURF_PLANE + layer = ABOVE_TURF_LAYER anchored = 1 use_power = 1 idle_power_usage = 80 @@ -804,6 +806,8 @@ FIRE ALARM desc = "\"Pull this in case of emergency\". Thus, keep pulling it forever." icon = 'icons/obj/monitors.dmi' icon_state = "fire0" + plane = TURF_PLANE + layer = ABOVE_TURF_LAYER var/detecting = 1.0 var/working = 1.0 var/time = 10.0 diff --git a/code/game/machinery/buttons.dm b/code/game/machinery/buttons.dm index d51b79ae48..cec980c54e 100644 --- a/code/game/machinery/buttons.dm +++ b/code/game/machinery/buttons.dm @@ -2,6 +2,8 @@ name = "button" icon = 'icons/obj/objects.dmi' icon_state = "launcherbtt" +// plane = TURF_PLANE //Can't have them under tables, oh well. +// layer = ABOVE_TURF_LAYER desc = "A remote control switch for something." var/id = null var/active = 0 diff --git a/code/game/machinery/computer/camera.dm b/code/game/machinery/computer/camera.dm index 785abecbec..7c16309ec0 100644 --- a/code/game/machinery/computer/camera.dm +++ b/code/game/machinery/computer/camera.dm @@ -205,6 +205,8 @@ name = "Telescreen" desc = "Used for watching an empty arena." icon_state = "wallframe" + plane = TURF_PLANE + layer = ABOVE_TURF_LAYER icon_keyboard = null icon_screen = null light_range_on = 0 diff --git a/code/game/machinery/computer/guestpass.dm b/code/game/machinery/computer/guestpass.dm index 3a70d57173..3345e30ab7 100644 --- a/code/game/machinery/computer/guestpass.dm +++ b/code/game/machinery/computer/guestpass.dm @@ -78,6 +78,8 @@ /obj/machinery/computer/guestpass name = "guest pass terminal" icon_state = "guest" + plane = TURF_PLANE + layer = ABOVE_TURF_LAYER icon_keyboard = null icon_screen = "pass" density = 0 diff --git a/code/game/machinery/doors/firedoor_vr.dm b/code/game/machinery/doors/firedoor_vr.dm index d15e435e69..2bc297a041 100644 --- a/code/game/machinery/doors/firedoor_vr.dm +++ b/code/game/machinery/doors/firedoor_vr.dm @@ -2,6 +2,15 @@ name = "\improper Emergency Shutter System" desc = "Emergency air-tight shutter, capable of sealing off breached areas. This model fits flush with the walls, and has a panel in the floor for maintenance." icon = 'icons/obj/doors/DoorHazardHidden.dmi' + plane = TURF_PLANE + +/obj/machinery/door/firedoor/glass/hidden/open() + . = ..() + plane = TURF_PLANE + +/obj/machinery/door/firedoor/glass/hidden/close() + . = ..() + plane = OBJ_PLANE /obj/machinery/door/firedoor/glass/hidden/steel name = "\improper Emergency Shutter System" diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm index 8c2c97f5a8..623cac6ef0 100644 --- a/code/game/machinery/hologram.dm +++ b/code/game/machinery/hologram.dm @@ -35,7 +35,8 @@ var/const/HOLOPAD_MODE = RANGE_BASED icon_state = "holopad0" show_messages = 1 circuit = /obj/item/weapon/circuitboard/holopad - layer = TURF_LAYER+0.1 //Preventing mice and drones from sneaking under them. + plane = TURF_PLANE + layer = ABOVE_TURF_LAYER var/power_per_hologram = 500 //per usage per hologram idle_power_usage = 5 use_power = 1 diff --git a/code/game/machinery/kitchen/smartfridge_vr.dm b/code/game/machinery/kitchen/smartfridge_vr.dm new file mode 100644 index 0000000000..8b77e2f81d --- /dev/null +++ b/code/game/machinery/kitchen/smartfridge_vr.dm @@ -0,0 +1,32 @@ +/obj/machinery/smartfridge + var/expert_job = "Chef" +/obj/machinery/smartfridge/seeds + expert_job = "Botanist" +/obj/machinery/smartfridge/secure/extract + expert_job = "Xenobiologist" +/obj/machinery/smartfridge/secure/medbay + expert_job = "Chemist" +/obj/machinery/smartfridge/secure/virology + expert_job = "Medical Doctor" //Virologist is an alt-title unfortunately +/obj/machinery/smartfridge/chemistry + expert_job = "Chemist" //Unsure what this one is used for, actually +/obj/machinery/smartfridge/drinks + expert_job = "Bartender" + +// Allow thrown items into smartfridges +/obj/machinery/smartfridge/throw_impact(var/atom/movable/A) + . = ..() + if(accept_check(A) && A.thrower) + //Try to find what job they are via ID + var/obj/item/weapon/card/id/thrower_id + if(ismob(A.thrower)) + var/mob/T = A.thrower + thrower_id = T.GetIdCard() + + //98% chance the expert makes it + if(expert_job && thrower_id && thrower_id.rank == expert_job && prob(98)) + stock(A) + + //20% chance a non-expert makes it + else if(prob(20)) + stock(A) diff --git a/code/game/machinery/newscaster.dm b/code/game/machinery/newscaster.dm index b9bd4a6855..048c1563b9 100644 --- a/code/game/machinery/newscaster.dm +++ b/code/game/machinery/newscaster.dm @@ -125,6 +125,8 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co desc = "A standard newsfeed handler for use on commercial space stations. All the news you absolutely have no use for, in one place!" icon = 'icons/obj/terminals.dmi' icon_state = "newscaster_normal" + plane = TURF_PLANE + layer = ABOVE_TURF_LAYER var/isbroken = 0 //1 if someone banged it with something heavy var/ispowered = 1 //starts powered, changes with power_change() //var/list/datum/feed_channel/channel_list = list() //This list will contain the names of the feed channels. Each name will refer to a data region where the messages of the feed channels are stored. diff --git a/code/game/machinery/recharger.dm b/code/game/machinery/recharger.dm index c47d3738a0..3d2601b59d 100644 --- a/code/game/machinery/recharger.dm +++ b/code/game/machinery/recharger.dm @@ -249,6 +249,8 @@ obj/machinery/recharger name = "wall recharger" icon = 'icons/obj/stationobjs.dmi' icon_state = "wrecharger0" + plane = TURF_PLANE + layer = ABOVE_TURF_LAYER active_power_usage = 25000 //25 kW , It's more specialized than the standalone recharger (guns, batons, and flashlights only) so make it more powerful allowed_devices = list(/obj/item/weapon/gun/energy, /obj/item/weapon/gun/magnetic, /obj/item/weapon/melee/baton, /obj/item/device/flashlight, /obj/item/weapon/cell/device) icon_state_charged = "wrecharger2" diff --git a/code/game/machinery/requests_console.dm b/code/game/machinery/requests_console.dm index 45e1a7315d..65583f3473 100644 --- a/code/game/machinery/requests_console.dm +++ b/code/game/machinery/requests_console.dm @@ -28,6 +28,8 @@ var/list/obj/machinery/requests_console/allConsoles = list() anchored = 1 icon = 'icons/obj/terminals.dmi' icon_state = "req_comp0" + plane = TURF_PLANE + layer = ABOVE_TURF_LAYER circuit = /obj/item/weapon/circuitboard/request var/department = "Unknown" //The list of all departments on the station (Determined from this variable on each unit) Set this to the same thing if you want several consoles in one department var/list/message_log = list() //List of all messages diff --git a/code/game/machinery/status_display.dm b/code/game/machinery/status_display.dm index 9a02fddfd2..e3a00abb4d 100644 --- a/code/game/machinery/status_display.dm +++ b/code/game/machinery/status_display.dm @@ -12,6 +12,8 @@ /obj/machinery/status_display icon = 'icons/obj/status_display.dmi' icon_state = "frame" + plane = TURF_PLANE + layer = ABOVE_TURF_LAYER name = "status display" anchored = 1 density = 0 diff --git a/code/game/mecha/micro/mecha_construction_paths_vr.dm b/code/game/mecha/micro/mecha_construction_paths_vr.dm new file mode 100644 index 0000000000..305cdfcf92 --- /dev/null +++ b/code/game/mecha/micro/mecha_construction_paths_vr.dm @@ -0,0 +1,768 @@ + +/datum/construction/mecha/polecat_chassis + steps = list(list("key"=/obj/item/mecha_parts/micro/part/polecat_torso),//1 + list("key"=/obj/item/mecha_parts/micro/part/polecat_left_arm),//2 + list("key"=/obj/item/mecha_parts/micro/part/polecat_right_arm),//3 + list("key"=/obj/item/mecha_parts/micro/part/polecat_left_leg),//4 + list("key"=/obj/item/mecha_parts/micro/part/polecat_right_leg)//5 + ) + + custom_action(step, atom/used_atom, mob/user) + user.visible_message("[user] has connected [used_atom] to [holder].", "You connect [used_atom] to [holder]") + holder.overlays += used_atom.icon_state+"+o" + qdel(used_atom) + return 1 + + action(atom/used_atom,mob/user as mob) + return check_all_steps(used_atom,user) + + spawn_result() + var/obj/item/mecha_parts/chassis/const_holder = holder + const_holder.construct = new /datum/construction/reversible/mecha/polecat(const_holder) + const_holder.icon = 'icons/mecha/mech_construction_vr.dmi' + const_holder.icon_state = "polecat0" + const_holder.density = 1 + const_holder.overlays.len = 0 + spawn() + qdel(src) + return + + +/datum/construction/reversible/mecha/polecat + result = "/obj/mecha/micro/sec/polecat" + steps = list( + //1 + list("key"=/obj/item/weapon/weldingtool, + "backkey"=/obj/item/weapon/wrench, + "desc"="External armor is wrenched."), + //2 + list("key"=/obj/item/weapon/wrench, + "backkey"=/obj/item/weapon/crowbar, + "desc"="External armor is installed."), + //3 + list("key"=/obj/item/mecha_parts/micro/part/polecat_armour, + "backkey"=/obj/item/weapon/weldingtool, + "desc"="Internal armor is welded."), + //4 + list("key"=/obj/item/weapon/weldingtool, + "backkey"=/obj/item/weapon/wrench, + "desc"="Internal armor is wrenched"), + //5 + list("key"=/obj/item/weapon/wrench, + "backkey"=/obj/item/weapon/crowbar, + "desc"="Internal armor is installed"), + //6 + list("key"=/obj/item/stack/material/steel, + "backkey"=/obj/item/weapon/screwdriver, + "desc"="Advanced capacitor is secured"), + //7 + list("key"=/obj/item/weapon/screwdriver, + "backkey"=/obj/item/weapon/crowbar, + "desc"="Advanced capacitor is installed"), + //8 + list("key"=/obj/item/weapon/stock_parts/capacitor/adv, + "backkey"=/obj/item/weapon/screwdriver, + "desc"="Advanced scanner module is secured"), + //9 + list("key"=/obj/item/weapon/screwdriver, + "backkey"=/obj/item/weapon/crowbar, + "desc"="Advanced scanner module is installed"), + //10 + list("key"=/obj/item/weapon/stock_parts/scanning_module/adv, + "backkey"=/obj/item/weapon/screwdriver, + "desc"="Targeting module is secured"), + //11 + list("key"=/obj/item/weapon/screwdriver, + "backkey"=/obj/item/weapon/crowbar, + "desc"="Targeting module is installed"), + //12 + list("key"=/obj/item/weapon/circuitboard/mecha/polecat/targeting, + "backkey"=/obj/item/weapon/screwdriver, + "desc"="Peripherals control module is secured"), + //13 + list("key"=/obj/item/weapon/screwdriver, + "backkey"=/obj/item/weapon/crowbar, + "desc"="Peripherals control module is installed"), + //14 + list("key"=/obj/item/weapon/circuitboard/mecha/polecat/peripherals, + "backkey"=/obj/item/weapon/screwdriver, + "desc"="Central control module is secured"), + //15 + list("key"=/obj/item/weapon/screwdriver, + "backkey"=/obj/item/weapon/crowbar, + "desc"="Central control module is installed"), + //16 + list("key"=/obj/item/weapon/circuitboard/mecha/polecat/main, + "backkey"=/obj/item/weapon/screwdriver, + "desc"="The wiring is adjusted"), + //17 + list("key"=/obj/item/weapon/wirecutters, + "backkey"=/obj/item/weapon/screwdriver, + "desc"="The wiring is added"), + //18 + list("key"=/obj/item/stack/cable_coil, + "backkey"=/obj/item/weapon/screwdriver, + "desc"="The hydraulic systems are active."), + //19 + list("key"=/obj/item/weapon/screwdriver, + "backkey"=/obj/item/weapon/wrench, + "desc"="The hydraulic systems are connected."), + //20 + list("key"=/obj/item/weapon/wrench, + "desc"="The hydraulic systems are disconnected.") + ) + + + action(atom/used_atom,mob/user as mob) + return check_step(used_atom,user) + + custom_action(index, diff, atom/used_atom, mob/user) + if(!..()) + return 0 + //TODO: better messages. + switch(index) + if(20) + user.visible_message("[user] connects [holder] hydraulic systems", "You connect [holder] hydraulic systems.") + holder.icon_state = "polecat1" + if(19) + if(diff==FORWARD) + user.visible_message("[user] activates [holder] hydraulic systems.", "You activate [holder] hydraulic systems.") + holder.icon_state = "polecat2" + else + user.visible_message("[user] disconnects [holder] hydraulic systems", "You disconnect [holder] hydraulic systems.") + holder.icon_state = "polecat0" + if(18) + if(diff==FORWARD) + user.visible_message("[user] adds the wiring to [holder].", "You add the wiring to [holder].") + holder.icon_state = "polecat3" + else + user.visible_message("[user] deactivates [holder] hydraulic systems.", "You deactivate [holder] hydraulic systems.") + holder.icon_state = "polecat1" + if(17) + if(diff==FORWARD) + user.visible_message("[user] adjusts the wiring of [holder].", "You adjust the wiring of [holder].") + holder.icon_state = "polecat4" + else + user.visible_message("[user] removes the wiring from [holder].", "You remove the wiring from [holder].") + var/obj/item/stack/cable_coil/coil = new /obj/item/stack/cable_coil(get_turf(holder)) + coil.amount = 4 + holder.icon_state = "polecat2" + if(16) + if(diff==FORWARD) + user.visible_message("[user] installs the central control module into [holder].", "You install the central computer mainboard into [holder].") + qdel(used_atom) + holder.icon_state = "polecat5" + else + user.visible_message("[user] disconnects the wiring of [holder].", "You disconnect the wiring of [holder].") + holder.icon_state = "polecat3" + if(15) + if(diff==FORWARD) + user.visible_message("[user] secures the mainboard.", "You secure the mainboard.") + holder.icon_state = "polecat6" + else + user.visible_message("[user] removes the central control module from [holder].", "You remove the central computer mainboard from [holder].") + new /obj/item/weapon/circuitboard/mecha/polecat/main(get_turf(holder)) + holder.icon_state = "polecat4" + if(14) + if(diff==FORWARD) + user.visible_message("[user] installs the peripherals control module into [holder].", "You install the peripherals control module into [holder].") + qdel(used_atom) + holder.icon_state = "polecat7" + else + user.visible_message("[user] unfastens the mainboard.", "You unfasten the mainboard.") + holder.icon_state = "polecat5" + if(13) + if(diff==FORWARD) + user.visible_message("[user] secures the peripherals control module.", "You secure the peripherals control module.") + holder.icon_state = "polecat8" + else + user.visible_message("[user] removes the peripherals control module from [holder].", "You remove the peripherals control module from [holder].") + new /obj/item/weapon/circuitboard/mecha/polecat/peripherals(get_turf(holder)) + holder.icon_state = "polecat6" + if(12) + if(diff==FORWARD) + user.visible_message("[user] installs the weapon control module into [holder].", "You install the weapon control module into [holder].") + qdel(used_atom) + holder.icon_state = "polecat9" + else + user.visible_message("[user] unfastens the peripherals control module.", "You unfasten the peripherals control module.") + holder.icon_state = "polecat7" + if(11) + if(diff==FORWARD) + user.visible_message("[user] secures the weapon control module.", "You secure the weapon control module.") + holder.icon_state = "polecat10" + else + user.visible_message("[user] removes the weapon control module from [holder].", "You remove the weapon control module from [holder].") + new /obj/item/weapon/circuitboard/mecha/polecat/targeting(get_turf(holder)) + holder.icon_state = "polecat8" + if(10) + if(diff==FORWARD) + user.visible_message("[user] installs advanced scanner module to [holder].", "You install advanced scanner module to [holder].") + qdel(used_atom) + holder.icon_state = "polecat11" + else + user.visible_message("[user] unfastens the weapon control module.", "You unfasten the weapon control module.") + holder.icon_state = "polecat9" + if(9) + if(diff==FORWARD) + user.visible_message("[user] secures the advanced scanner module.", "You secure the advanced scanner module.") + holder.icon_state = "polecat12" + else + user.visible_message("[user] removes the advanced scanner module from [holder].", "You remove the advanced scanner module from [holder].") + new /obj/item/weapon/stock_parts/scanning_module/adv(get_turf(holder)) + holder.icon_state = "polecat10" + if(8) + if(diff==FORWARD) + user.visible_message("[user] installs advanced capacitor to [holder].", "You install advanced capacitor to [holder].") + qdel(used_atom) + holder.icon_state = "polecat13" + else + user.visible_message("[user] unfastens the advanced scanner module.", "You unfasten the advanced scanner module.") + holder.icon_state = "polecat11" + if(7) + if(diff==FORWARD) + user.visible_message("[user] secures the advanced capacitor.", "You secure the advanced capacitor.") + holder.icon_state = "polecat14" + else + user.visible_message("[user] removes the advanced capacitor from [holder].", "You remove the advanced capacitor from [holder].") + new /obj/item/weapon/stock_parts/capacitor/adv(get_turf(holder)) + holder.icon_state = "polecat12" + if(6) + if(diff==FORWARD) + user.visible_message("[user] installs internal armor layer to [holder].", "You install internal armor layer to [holder].") + holder.icon_state = "polecat15" + else + user.visible_message("[user] unfastens the advanced capacitor.", "You unfasten the advanced capacitor.") + holder.icon_state = "polecat13" + if(5) + if(diff==FORWARD) + user.visible_message("[user] secures internal armor layer.", "You secure internal armor layer.") + holder.icon_state = "polecat16" + else + user.visible_message("[user] pries internal armor layer from [holder].", "You prie internal armor layer from [holder].") + var/obj/item/stack/material/steel/MS = new /obj/item/stack/material/steel(get_turf(holder)) + MS.amount = 3 + holder.icon_state = "polecat14" + if(4) + if(diff==FORWARD) + user.visible_message("[user] welds internal armor layer to [holder].", "You weld the internal armor layer to [holder].") + holder.icon_state = "polecat17" + else + user.visible_message("[user] unfastens the internal armor layer.", "You unfasten the internal armor layer.") + holder.icon_state = "polecat15" + if(3) + if(diff==FORWARD) + user.visible_message("[user] installs external reinforced armor layer to [holder].", "You install external reinforced armor layer to [holder].") + holder.icon_state = "polecat18" + else + user.visible_message("[user] cuts internal armor layer from [holder].", "You cut the internal armor layer from [holder].") + holder.icon_state = "polecat16" + if(2) + if(diff==FORWARD) + user.visible_message("[user] secures external armor layer.", "You secure external reinforced armor layer.") + holder.icon_state = "polecat19" + else + user.visible_message("[user] pries external armor layer from [holder].", "You prie external armor layer from [holder].") + var/obj/item/stack/material/plasteel/MS = new /obj/item/stack/material/plasteel(get_turf(holder)) + MS.amount = 5 + holder.icon_state = "polecat17" + if(1) + if(diff==FORWARD) + user.visible_message("[user] welds external armor layer to [holder].", "You weld external armor layer to [holder].") + else + user.visible_message("[user] unfastens the external armor layer.", "You unfasten the external armor layer.") + holder.icon_state = "polecat18" + return 1 + + spawn_result() + ..() + feedback_inc("mecha_polecat_created",1) + return + +/datum/construction/mecha/gopher_chassis + steps = list(list("key"=/obj/item/mecha_parts/micro/part/gopher_torso),//1 + list("key"=/obj/item/mecha_parts/micro/part/gopher_left_arm),//2 + list("key"=/obj/item/mecha_parts/micro/part/gopher_right_arm),//3 + list("key"=/obj/item/mecha_parts/micro/part/gopher_left_leg),//4 + list("key"=/obj/item/mecha_parts/micro/part/gopher_right_leg)//5 + ) + + custom_action(step, atom/used_atom, mob/user) + user.visible_message("[user] has connected [used_atom] to [holder].", "You connect [used_atom] to [holder]") + holder.overlays += used_atom.icon_state+"+o" + qdel(used_atom) + return 1 + + action(atom/used_atom,mob/user as mob) + return check_all_steps(used_atom,user) + + spawn_result() + var/obj/item/mecha_parts/chassis/const_holder = holder + const_holder.construct = new /datum/construction/reversible/mecha/gopher(const_holder) + const_holder.icon = 'icons/mecha/mech_construction_vr.dmi' + const_holder.icon_state = "gopher0" + const_holder.density = 1 + const_holder.overlays.len = 0 + spawn() + qdel(src) + return + + +/datum/construction/reversible/mecha/gopher + result = "/obj/mecha/micro/utility/gopher" + steps = list( + //1 + list("key"=/obj/item/weapon/weldingtool, + "backkey"=/obj/item/weapon/wrench, + "desc"="External armor is wrenched."), + //2 + list("key"=/obj/item/weapon/wrench, + "backkey"=/obj/item/weapon/crowbar, + "desc"="External armor is installed."), + //3 + list("key"=/obj/item/stack/material/plasteel, + "backkey"=/obj/item/weapon/weldingtool, + "desc"="Internal armor is welded."), + //4 + list("key"=/obj/item/weapon/weldingtool, + "backkey"=/obj/item/weapon/wrench, + "desc"="Internal armor is wrenched"), + //5 + list("key"=/obj/item/weapon/wrench, + "backkey"=/obj/item/weapon/crowbar, + "desc"="Internal armor is installed"), + //6 + list("key"=/obj/item/stack/material/steel, + "backkey"=/obj/item/weapon/screwdriver, + "desc"="Peripherals control module is secured"), + //7 + list("key"=/obj/item/weapon/screwdriver, + "backkey"=/obj/item/weapon/crowbar, + "desc"="Peripherals control module is installed"), + //8 + list("key"=/obj/item/weapon/circuitboard/mecha/gopher/peripherals, + "backkey"=/obj/item/weapon/screwdriver, + "desc"="Central control module is secured"), + //9 + list("key"=/obj/item/weapon/screwdriver, + "backkey"=/obj/item/weapon/crowbar, + "desc"="Central control module is installed"), + //10 + list("key"=/obj/item/weapon/circuitboard/mecha/gopher/main, + "backkey"=/obj/item/weapon/screwdriver, + "desc"="The wiring is adjusted"), + //11 + list("key"=/obj/item/weapon/wirecutters, + "backkey"=/obj/item/weapon/screwdriver, + "desc"="The wiring is added"), + //12 + list("key"=/obj/item/stack/cable_coil, + "backkey"=/obj/item/weapon/screwdriver, + "desc"="The hydraulic systems are active."), + //13 + list("key"=/obj/item/weapon/screwdriver, + "backkey"=/obj/item/weapon/wrench, + "desc"="The hydraulic systems are connected."), + //14 + list("key"=/obj/item/weapon/wrench, + "desc"="The hydraulic systems are disconnected.") + ) + + action(atom/used_atom,mob/user as mob) + return check_step(used_atom,user) + + custom_action(index, diff, atom/used_atom, mob/user) + if(!..()) + return 0 + + //TODO: better messages. + switch(index) + if(14) + user.visible_message("[user] connects [holder] hydraulic systems", "You connect [holder] hydraulic systems.") + holder.icon_state = "gopher1" + if(13) + if(diff==FORWARD) + user.visible_message("[user] activates [holder] hydraulic systems.", "You activate [holder] hydraulic systems.") + holder.icon_state = "gopher2" + else + user.visible_message("[user] disconnects [holder] hydraulic systems", "You disconnect [holder] hydraulic systems.") + holder.icon_state = "gopher0" + if(12) + if(diff==FORWARD) + user.visible_message("[user] adds the wiring to [holder].", "You add the wiring to [holder].") + holder.icon_state = "gopher3" + else + user.visible_message("[user] deactivates [holder] hydraulic systems.", "You deactivate [holder] hydraulic systems.") + holder.icon_state = "gopher1" + if(11) + if(diff==FORWARD) + user.visible_message("[user] adjusts the wiring of [holder].", "You adjust the wiring of [holder].") + holder.icon_state = "gopher4" + else + user.visible_message("[user] removes the wiring from [holder].", "You remove the wiring from [holder].") + var/obj/item/stack/cable_coil/coil = new /obj/item/stack/cable_coil(get_turf(holder)) + coil.amount = 4 + holder.icon_state = "gopher2" + if(10) + if(diff==FORWARD) + user.visible_message("[user] installs the central control module into [holder].", "You install the central computer mainboard into [holder].") + qdel(used_atom) + holder.icon_state = "gopher5" + else + user.visible_message("[user] disconnects the wiring of [holder].", "You disconnect the wiring of [holder].") + holder.icon_state = "gopher3" + if(9) + if(diff==FORWARD) + user.visible_message("[user] secures the mainboard.", "You secure the mainboard.") + holder.icon_state = "gopher6" + else + user.visible_message("[user] removes the central control module from [holder].", "You remove the central computer mainboard from [holder].") + new /obj/item/weapon/circuitboard/mecha/gopher/main(get_turf(holder)) + holder.icon_state = "gopher4" + if(8) + if(diff==FORWARD) + user.visible_message("[user] installs the peripherals control module into [holder].", "You install the peripherals control module into [holder].") + qdel(used_atom) + holder.icon_state = "gopher7" + else + user.visible_message("[user] unfastens the mainboard.", "You unfasten the mainboard.") + holder.icon_state = "gopher5" + if(7) + if(diff==FORWARD) + user.visible_message("[user] secures the peripherals control module.", "You secure the peripherals control module.") + holder.icon_state = "gopher8" + else + user.visible_message("[user] removes the peripherals control module from [holder].", "You remove the peripherals control module from [holder].") + new /obj/item/weapon/circuitboard/mecha/gopher/peripherals(get_turf(holder)) + holder.icon_state = "gopher6" + if(6) + if(diff==FORWARD) + user.visible_message("[user] installs internal armor layer to [holder].", "You install internal armor layer to [holder].") + holder.icon_state = "gopher9" + else + user.visible_message("[user] unfastens the peripherals control module.", "You unfasten the peripherals control module.") + holder.icon_state = "gopher7" + if(5) + if(diff==FORWARD) + user.visible_message("[user] secures internal armor layer.", "You secure internal armor layer.") + holder.icon_state = "gopher10" + else + user.visible_message("[user] pries internal armor layer from [holder].", "You prie internal armor layer from [holder].") + var/obj/item/stack/material/steel/MS = new /obj/item/stack/material/steel(get_turf(holder)) + MS.amount = 3 + holder.icon_state = "gopher8" + if(4) + if(diff==FORWARD) + user.visible_message("[user] welds internal armor layer to [holder].", "You weld the internal armor layer to [holder].") + holder.icon_state = "gopher11" + else + user.visible_message("[user] unfastens the internal armor layer.", "You unfasten the internal armor layer.") + holder.icon_state = "gopher9" + if(3) + if(diff==FORWARD) + user.visible_message("[user] installs external reinforced armor layer to [holder].", "You install external reinforced armor layer to [holder].") + holder.icon_state = "gopher12" + else + user.visible_message("[user] cuts internal armor layer from [holder].", "You cut the internal armor layer from [holder].") + holder.icon_state = "gopher10" + if(2) + if(diff==FORWARD) + user.visible_message("[user] secures external armor layer.", "You secure external reinforced armor layer.") + holder.icon_state = "gopher13" + else + user.visible_message("[user] pries external armor layer from [holder].", "You prie external armor layer from [holder].") + var/obj/item/stack/material/plasteel/MS = new /obj/item/stack/material/plasteel(get_turf(holder)) + MS.amount = 2 + holder.icon_state = "gopher11" + if(1) + if(diff==FORWARD) + user.visible_message("[user] welds external armor layer to [holder].", "You weld external armor layer to [holder].") + else + user.visible_message("[user] unfastens the external armor layer.", "You unfasten the external armor layer.") + holder.icon_state = "gopher12" + return 1 + + spawn_result() + ..() + feedback_inc("mecha_gopher_created",1) + return + +/datum/construction/mecha/weasel_chassis + steps = list(list("key"=/obj/item/mecha_parts/micro/part/weasel_torso),//1 + list("key"=/obj/item/mecha_parts/micro/part/weasel_head),//2 + list("key"=/obj/item/mecha_parts/micro/part/weasel_left_arm),//3 + list("key"=/obj/item/mecha_parts/micro/part/weasel_right_arm),//4 + list("key"=/obj/item/mecha_parts/micro/part/weasel_tri_leg),//5 + ) + + custom_action(step, atom/used_atom, mob/user) + user.visible_message("[user] has connected [used_atom] to [holder].", "You connect [used_atom] to [holder]") + holder.overlays += used_atom.icon_state+"+o" + qdel(used_atom) + return 1 + + action(atom/used_atom,mob/user as mob) + return check_all_steps(used_atom,user) + + spawn_result() + var/obj/item/mecha_parts/chassis/const_holder = holder + const_holder.construct = new /datum/construction/reversible/mecha/weasel(const_holder) + const_holder.icon = 'icons/mecha/mech_construction_vr.dmi' + const_holder.icon_state = "weasel0" + const_holder.density = 1 + const_holder.overlays.len = 0 + spawn() + qdel(src) + return + + +/datum/construction/reversible/mecha/weasel + result = "/obj/mecha/micro/sec/weasel" + steps = list( + //1 + list("key"=/obj/item/weapon/weldingtool, + "backkey"=/obj/item/weapon/wrench, + "desc"="External armor is wrenched."), + //2 + list("key"=/obj/item/weapon/wrench, + "backkey"=/obj/item/weapon/crowbar, + "desc"="External armor is installed."), + //3 + list("key"=/obj/item/stack/material/plasteel, + "backkey"=/obj/item/weapon/weldingtool, + "desc"="Internal armor is welded."), + //4 + list("key"=/obj/item/weapon/weldingtool, + "backkey"=/obj/item/weapon/wrench, + "desc"="Internal armor is wrenched"), + //5 + list("key"=/obj/item/weapon/wrench, + "backkey"=/obj/item/weapon/crowbar, + "desc"="Internal armor is installed"), + //6 + list("key"=/obj/item/stack/material/steel, + "backkey"=/obj/item/weapon/screwdriver, + "desc"="Advanced capacitor is secured"), + //7 + list("key"=/obj/item/weapon/screwdriver, + "backkey"=/obj/item/weapon/crowbar, + "desc"="Advanced capacitor is installed"), + //8 + list("key"=/obj/item/weapon/stock_parts/capacitor/adv, + "backkey"=/obj/item/weapon/screwdriver, + "desc"="Advanced scanner module is secured"), + //9 + list("key"=/obj/item/weapon/screwdriver, + "backkey"=/obj/item/weapon/crowbar, + "desc"="Advanced scanner module is installed"), + //10 + list("key"=/obj/item/weapon/stock_parts/scanning_module/adv, + "backkey"=/obj/item/weapon/screwdriver, + "desc"="Targeting module is secured"), + //11 + list("key"=/obj/item/weapon/screwdriver, + "backkey"=/obj/item/weapon/crowbar, + "desc"="Targeting module is installed"), + //12 + list("key"=/obj/item/weapon/circuitboard/mecha/weasel/targeting, + "backkey"=/obj/item/weapon/screwdriver, + "desc"="Peripherals control module is secured"), + //13 + list("key"=/obj/item/weapon/screwdriver, + "backkey"=/obj/item/weapon/crowbar, + "desc"="Peripherals control module is installed"), + //14 + list("key"=/obj/item/weapon/circuitboard/mecha/weasel/peripherals, + "backkey"=/obj/item/weapon/screwdriver, + "desc"="Central control module is secured"), + //15 + list("key"=/obj/item/weapon/screwdriver, + "backkey"=/obj/item/weapon/crowbar, + "desc"="Central control module is installed"), + //16 + list("key"=/obj/item/weapon/circuitboard/mecha/weasel/main, + "backkey"=/obj/item/weapon/screwdriver, + "desc"="The wiring is adjusted"), + //17 + list("key"=/obj/item/weapon/wirecutters, + "backkey"=/obj/item/weapon/screwdriver, + "desc"="The wiring is added"), + //18 + list("key"=/obj/item/stack/cable_coil, + "backkey"=/obj/item/weapon/screwdriver, + "desc"="The hydraulic systems are active."), + //19 + list("key"=/obj/item/weapon/screwdriver, + "backkey"=/obj/item/weapon/wrench, + "desc"="The hydraulic systems are connected."), + //20 + list("key"=/obj/item/weapon/wrench, + "desc"="The hydraulic systems are disconnected.") + ) + + + action(atom/used_atom,mob/user as mob) + return check_step(used_atom,user) + + custom_action(index, diff, atom/used_atom, mob/user) + if(!..()) + return 0 + //TODO: better messages. + switch(index) + if(20) + user.visible_message("[user] connects [holder] hydraulic systems", "You connect [holder] hydraulic systems.") + holder.icon_state = "weasel1" + if(19) + if(diff==FORWARD) + user.visible_message("[user] activates [holder] hydraulic systems.", "You activate [holder] hydraulic systems.") + holder.icon_state = "weasel2" + else + user.visible_message("[user] disconnects [holder] hydraulic systems", "You disconnect [holder] hydraulic systems.") + holder.icon_state = "weasel0" + if(18) + if(diff==FORWARD) + user.visible_message("[user] adds the wiring to [holder].", "You add the wiring to [holder].") + holder.icon_state = "weasel3" + else + user.visible_message("[user] deactivates [holder] hydraulic systems.", "You deactivate [holder] hydraulic systems.") + holder.icon_state = "weasel1" + if(17) + if(diff==FORWARD) + user.visible_message("[user] adjusts the wiring of [holder].", "You adjust the wiring of [holder].") + holder.icon_state = "weasel4" + else + user.visible_message("[user] removes the wiring from [holder].", "You remove the wiring from [holder].") + var/obj/item/stack/cable_coil/coil = new /obj/item/stack/cable_coil(get_turf(holder)) + coil.amount = 4 + holder.icon_state = "weasel2" + if(16) + if(diff==FORWARD) + user.visible_message("[user] installs the central control module into [holder].", "You install the central computer mainboard into [holder].") + qdel(used_atom) + holder.icon_state = "weasel5" + else + user.visible_message("[user] disconnects the wiring of [holder].", "You disconnect the wiring of [holder].") + holder.icon_state = "weasel3" + if(15) + if(diff==FORWARD) + user.visible_message("[user] secures the mainboard.", "You secure the mainboard.") + holder.icon_state = "weasel6" + else + user.visible_message("[user] removes the central control module from [holder].", "You remove the central computer mainboard from [holder].") + new /obj/item/weapon/circuitboard/mecha/weasel/main(get_turf(holder)) + holder.icon_state = "weasel4" + if(14) + if(diff==FORWARD) + user.visible_message("[user] installs the peripherals control module into [holder].", "You install the peripherals control module into [holder].") + qdel(used_atom) + holder.icon_state = "weasel7" + else + user.visible_message("[user] unfastens the mainboard.", "You unfasten the mainboard.") + holder.icon_state = "weasel5" + if(13) + if(diff==FORWARD) + user.visible_message("[user] secures the peripherals control module.", "You secure the peripherals control module.") + holder.icon_state = "weasel8" + else + user.visible_message("[user] removes the peripherals control module from [holder].", "You remove the peripherals control module from [holder].") + new /obj/item/weapon/circuitboard/mecha/weasel/peripherals(get_turf(holder)) + holder.icon_state = "weasel6" + if(12) + if(diff==FORWARD) + user.visible_message("[user] installs the weapon control module into [holder].", "You install the weapon control module into [holder].") + qdel(used_atom) + holder.icon_state = "weasel9" + else + user.visible_message("[user] unfastens the peripherals control module.", "You unfasten the peripherals control module.") + holder.icon_state = "weasel7" + if(11) + if(diff==FORWARD) + user.visible_message("[user] secures the weapon control module.", "You secure the weapon control module.") + holder.icon_state = "weasel10" + else + user.visible_message("[user] removes the weapon control module from [holder].", "You remove the weapon control module from [holder].") + new /obj/item/weapon/circuitboard/mecha/weasel/targeting(get_turf(holder)) + holder.icon_state = "weasel8" + if(10) + if(diff==FORWARD) + user.visible_message("[user] installs advanced scanner module to [holder].", "You install advanced scanner module to [holder].") + qdel(used_atom) + holder.icon_state = "weasel11" + else + user.visible_message("[user] unfastens the weapon control module.", "You unfasten the weapon control module.") + holder.icon_state = "weasel9" + if(9) + if(diff==FORWARD) + user.visible_message("[user] secures the advanced scanner module.", "You secure the advanced scanner module.") + holder.icon_state = "weasel12" + else + user.visible_message("[user] removes the advanced scanner module from [holder].", "You remove the advanced scanner module from [holder].") + new /obj/item/weapon/stock_parts/scanning_module/adv(get_turf(holder)) + holder.icon_state = "weasel10" + if(8) + if(diff==FORWARD) + user.visible_message("[user] installs advanced capacitor to [holder].", "You install advanced capacitor to [holder].") + qdel(used_atom) + holder.icon_state = "weasel13" + else + user.visible_message("[user] unfastens the advanced scanner module.", "You unfasten the advanced scanner module.") + holder.icon_state = "weasel11" + if(7) + if(diff==FORWARD) + user.visible_message("[user] secures the advanced capacitor.", "You secure the advanced capacitor.") + holder.icon_state = "weasel14" + else + user.visible_message("[user] removes the advanced capacitor from [holder].", "You remove the advanced capacitor from [holder].") + new /obj/item/weapon/stock_parts/capacitor/adv(get_turf(holder)) + holder.icon_state = "weasel12" + if(6) + if(diff==FORWARD) + user.visible_message("[user] installs internal armor layer to [holder].", "You install internal armor layer to [holder].") + holder.icon_state = "weasel15" + else + user.visible_message("[user] unfastens the advanced capacitor.", "You unfasten the advanced capacitor.") + holder.icon_state = "weasel13" + if(5) + if(diff==FORWARD) + user.visible_message("[user] secures internal armor layer.", "You secure internal armor layer.") + holder.icon_state = "weasel16" + else + user.visible_message("[user] pries internal armor layer from [holder].", "You prie internal armor layer from [holder].") + var/obj/item/stack/material/steel/MS = new /obj/item/stack/material/steel(get_turf(holder)) + MS.amount = 3 + holder.icon_state = "weasel14" + if(4) + if(diff==FORWARD) + user.visible_message("[user] welds internal armor layer to [holder].", "You weld the internal armor layer to [holder].") + holder.icon_state = "weasel17" + else + user.visible_message("[user] unfastens the internal armor layer.", "You unfasten the internal armor layer.") + holder.icon_state = "weasel15" + if(3) + if(diff==FORWARD) + user.visible_message("[user] installs external reinforced armor layer to [holder].", "You install external reinforced armor layer to [holder].") + holder.icon_state = "weasel18" + else + user.visible_message("[user] cuts internal armor layer from [holder].", "You cut the internal armor layer from [holder].") + holder.icon_state = "weasel16" + if(2) + if(diff==FORWARD) + user.visible_message("[user] secures external armor layer.", "You secure external reinforced armor layer.") + holder.icon_state = "weasel19" + else + user.visible_message("[user] pries external armor layer from [holder].", "You prie external armor layer from [holder].") + var/obj/item/stack/material/plasteel/MS = new /obj/item/stack/material/plasteel(get_turf(holder)) + MS.amount = 3 + holder.icon_state = "weasel17" + if(1) + if(diff==FORWARD) + user.visible_message("[user] welds external armor layer to [holder].", "You weld external armor layer to [holder].") + else + user.visible_message("[user] unfastens the external armor layer.", "You unfasten the external armor layer.") + holder.icon_state = "weasel18" + return 1 + + spawn_result() + ..() + feedback_inc("mecha_weasel_created",1) + return diff --git a/code/game/mecha/micro/mecha_parts_vr.dm b/code/game/mecha/micro/mecha_parts_vr.dm new file mode 100644 index 0000000000..f16442abf7 --- /dev/null +++ b/code/game/mecha/micro/mecha_parts_vr.dm @@ -0,0 +1,141 @@ +//new micro parts define + +/obj/item/mecha_parts/micro + name = "mecha part" + icon = 'icons/mecha/mech_construct_vr.dmi' + icon_state = "blank" + w_class = ITEMSIZE_NORMAL + + +/obj/item/mecha_parts/micro/chassis/ + name="Mecha Chassis" + icon_state = "backbone" + var/datum/construction/construct + flags = CONDUCT + + attackby(obj/item/W as obj, mob/user as mob) + if(!construct || !construct.action(W, user)) + ..() + return + + attack_hand() + return +//Gopher +/obj/item/mecha_parts/micro/chassis/gopher + name = "Gopher Chassis" + icon_state = "gopher-chassis" + + New() + ..() + construct = new /datum/construction/mecha/gopher_chassis(src) + +/obj/item/mecha_parts/micro/part/gopher_torso + name="Gopher Torso" + desc="A torso part of Gopher. Contains power unit, processing core and life support systems." + icon_state = "gopher-torso" + origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 2, TECH_BIO = 2, TECH_ENGINEERING = 2) + +/obj/item/mecha_parts/micro/part/gopher_left_arm + name="Gopher Left Arm" + desc="A Gopher left arm. Data and power sockets are compatible with most exosuit tools." + icon_state = "gopher-arm-left" + origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 2, TECH_ENGINEERING = 2) + +/obj/item/mecha_parts/micro/part/gopher_right_arm + name="Gopher Right Arm" + desc="A Gopher right arm. Data and power sockets are compatible with most exosuit tools." + icon_state = "gopher-arm-right" + origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 2, TECH_ENGINEERING = 2) + +/obj/item/mecha_parts/micro/part/gopher_left_leg + name="Gopher Left Leg" + desc="A Gopher left leg. Contains somewhat complex servodrives and balance maintaining systems." + icon_state = "gopher-leg-left" + origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 2, TECH_ENGINEERING = 2) + +/obj/item/mecha_parts/micro/part/gopher_right_leg + name="Gopher Right Leg" + desc="A Gopher right leg. Contains somewhat complex servodrives and balance maintaining systems." + icon_state = "gopher-leg-right" + origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 2, TECH_ENGINEERING = 2) + +//polecat +/obj/item/mecha_parts/micro/chassis/polecat + name = "Polecat Chassis" + icon_state = "polecat-chassis" + New() + ..() + construct = new /datum/construction/mecha/polecat_chassis(src) + +/obj/item/mecha_parts/micro/part/polecat_torso + name="Polecat Torso" + icon_state = "polecat-torso" + origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 3, TECH_BIO = 3, TECH_ENGINEERING = 3) + +/obj/item/mecha_parts/micro/part/polecat_left_arm + name="Polecat Left Arm" + icon_state = "polecat-arm-left" + origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 3, TECH_ENGINEERING = 3) + +/obj/item/mecha_parts/micro/part/polecat_right_arm + name="Polecat Right Arm" + icon_state = "polecat-arm-right" + origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 3, TECH_ENGINEERING = 3) + +/obj/item/mecha_parts/micro/part/polecat_left_leg + name="Polecat Left Leg" + icon_state = "polecat-leg-left" + origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 3, TECH_ENGINEERING = 3) + +/obj/item/mecha_parts/micro/part/polecat_right_leg + name="Polecat Right Leg" + icon_state = "polecat-leg-right" + origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 3, TECH_ENGINEERING = 3) + +/obj/item/mecha_parts/micro/part/polecat_armour + name="Polecat Armour Plates" + icon_state = "polecat-armor" + origin_tech = list(TECH_MATERIAL = 5, TECH_COMBAT = 4, TECH_ENGINEERING = 5) + +//weasel +/obj/item/mecha_parts/micro/chassis/weasel + name = "Weasel Chassis" + icon_state = "weasel-chassis" + New() + ..() + construct = new /datum/construction/mecha/weasel_chassis(src) + +/obj/item/mecha_parts/micro/part/weasel_torso + name="Weasel Torso" + icon_state = "weasel-torso" + origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 3, TECH_BIO = 3, TECH_ENGINEERING = 3) + +/obj/item/mecha_parts/micro/part/weasel_head + name="Weasel Head" + icon_state = "weasel-head" + origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 3, TECH_MAGNET = 3, TECH_ENGINEERING = 3) + +/obj/item/mecha_parts/micro/part/weasel_left_arm + name="Weasel Left Arm" + icon_state = "weasel-arm-left" + origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 3, TECH_ENGINEERING = 3) + +/obj/item/mecha_parts/micro/part/weasel_right_arm + name="Weasel Right Arm" + icon_state = "weasel-arm-right" + origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 3, TECH_ENGINEERING = 3) + +/*/obj/item/mecha_parts/micro/part/weasel_left_leg + name="Weasel Left Leg" + icon_state = "weasel-leg-left" + origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 3, TECH_ENGINEERING = 3) + +/obj/item/mecha_parts/micro/part/weasel_right_leg + name="Weasel Right Leg" + icon_state = "weasel-leg-right" + origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 3, TECH_ENGINEERING = 3)*/ + +/obj/item/mecha_parts/micro/part/weasel_tri_leg + name="Weasel Legs" + icon_state = "weasel-leg-all" + origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 3, TECH_ENGINEERING = 3) \ No newline at end of file diff --git a/code/game/mecha/micro/mecha_vr.dm b/code/game/mecha/micro/mecha_vr.dm new file mode 100644 index 0000000000..fee3afb2a6 --- /dev/null +++ b/code/game/mecha/micro/mecha_vr.dm @@ -0,0 +1,47 @@ +#ifdef T_BOARD_MICRO_MECHA +#error T_BOARD_MICRO_MECHA already defined elsewhere, we can't use it. +#endif +#define T_BOARD_MICRO_MECHA(name) "exosuit module circuit board (" + (name) + ")" + +/obj/item/weapon/circuitboard/mecha/gopher + origin_tech = list(TECH_DATA = 3) + +/obj/item/weapon/circuitboard/mecha/gopher/peripherals + name = T_BOARD_MICRO_MECHA("Gopher peripherals control") + icon_state = "mcontroller" + +/obj/item/weapon/circuitboard/mecha/gopher/main + name = T_BOARD_MICRO_MECHA("Gopher central control") + icon_state = "mainboard" + +/obj/item/weapon/circuitboard/mecha/polecat + origin_tech = list(TECH_DATA = 4) + +/obj/item/weapon/circuitboard/mecha/polecat/peripherals + name = T_BOARD_MICRO_MECHA("Polecat peripherals control") + icon_state = "mcontroller" + +/obj/item/weapon/circuitboard/mecha/polecat/targeting + name = T_BOARD_MICRO_MECHA("Polecat weapon control and targeting") + icon_state = "mcontroller" + origin_tech = list(TECH_DATA = 4, TECH_COMBAT = 4) + +/obj/item/weapon/circuitboard/mecha/polecat/main + name = T_BOARD_MICRO_MECHA("Weasel central control") + icon_state = "mainboard" + +/obj/item/weapon/circuitboard/mecha/weasel + origin_tech = list(TECH_DATA = 4) + +/obj/item/weapon/circuitboard/mecha/weasel/peripherals + name = T_BOARD_MICRO_MECHA("Weasel peripherals control") + icon_state = "mcontroller" + +/obj/item/weapon/circuitboard/mecha/weasel/targeting + name = T_BOARD_MICRO_MECHA("Weasel weapon control and targeting") + icon_state = "mcontroller" + origin_tech = list(TECH_DATA = 4, TECH_COMBAT = 4) + +/obj/item/weapon/circuitboard/mecha/weasel/main + name = T_BOARD_MICRO_MECHA("Weasel central control") + icon_state = "mainboard" diff --git a/code/game/mecha/micro/mechfab_designs_vr.dm b/code/game/mecha/micro/mechfab_designs_vr.dm new file mode 100644 index 0000000000..940d7607e3 --- /dev/null +++ b/code/game/mecha/micro/mechfab_designs_vr.dm @@ -0,0 +1,187 @@ +/datum/design/item/mechfab/gopher + category = "Gopher" + time = 5 + +/datum/design/item/mechfab/gopher/chassis + name = "Gopher Chassis" + id = "gopher_chassis" + build_path = /obj/item/mecha_parts/micro/chassis/gopher + time = 3 + materials = list(DEFAULT_WALL_MATERIAL = 7000) + +/datum/design/item/mechfab/gopher/torso + name = "Gopher Torso" + id = "gopher_torso" + build_path = /obj/item/mecha_parts/micro/part/gopher_torso + materials = list(DEFAULT_WALL_MATERIAL = 15000, "glass" = 5250) + +/datum/design/item/mechfab/gopher/left_arm + name = "Gopher Left Arm" + id = "gopher_left_arm" + build_path = /obj/item/mecha_parts/micro/part/gopher_left_arm + materials = list(DEFAULT_WALL_MATERIAL = 8750) + +/datum/design/item/mechfab/gopher/right_arm + name = "Gopher Right Arm" + id = "gopher_right_arm" + build_path = /obj/item/mecha_parts/micro/part/gopher_right_arm + + materials = list(DEFAULT_WALL_MATERIAL = 8750) + +/datum/design/item/mechfab/gopher/left_leg + name = "Gopher Left Leg" + id = "gopher_left_leg" + build_path = /obj/item/mecha_parts/micro/part/gopher_left_leg + materials = list(DEFAULT_WALL_MATERIAL = 12500) + +/datum/design/item/mechfab/gopher/right_leg + name = "Gopher Right Leg" + id = "gopher_right_leg" + build_path = /obj/item/mecha_parts/micro/part/gopher_right_leg + materials = list(DEFAULT_WALL_MATERIAL = 12500) + +/datum/design/item/mecha/drill/micro + name = "Miniature Drill" + id = "micro_drill" + build_path = /obj/item/mecha_parts/mecha_equipment/tool/drill/micro + time = 5 + materials = list(DEFAULT_WALL_MATERIAL = 2500) + +/datum/design/item/mecha/hydraulic_clamp/micro + name = "Mounted ore box" + id = "ore_scoop" + build_path = /obj/item/mecha_parts/mecha_equipment/tool/micro/orescoop + time = 5 + materials = list(DEFAULT_WALL_MATERIAL = 2500) + +/datum/design/item/mechfab/polecat + category = "Polecat" + time = 10 + +/datum/design/item/mechfab/polecat/chassis + name = "Polecat Chassis" + id = "polecat_chassis" + build_path = /obj/item/mecha_parts/micro/chassis/polecat + time = 3 + materials = list(DEFAULT_WALL_MATERIAL = 7000) + +/datum/design/item/mechfab/polecat/torso + name = "Polecat Torso" + id = "polecat_torso" + build_path = /obj/item/mecha_parts/micro/part/polecat_torso + materials = list(DEFAULT_WALL_MATERIAL = 15000, "glass" = 5250) + +/datum/design/item/mechfab/polecat/left_arm + name = "Polecat Left Arm" + id = "polecat_left_arm" + build_path = /obj/item/mecha_parts/micro/part/polecat_left_arm + materials = list(DEFAULT_WALL_MATERIAL = 8750) + +/datum/design/item/mechfab/polecat/right_arm + name = "Polecat Right Arm" + id = "polecat_right_arm" + build_path = /obj/item/mecha_parts/micro/part/polecat_right_arm + materials = list(DEFAULT_WALL_MATERIAL = 8750) + +/datum/design/item/mechfab/polecat/left_leg + name = "Polecat Left Leg" + id = "polecat_left_leg" + build_path = /obj/item/mecha_parts/micro/part/polecat_left_leg + materials = list(DEFAULT_WALL_MATERIAL = 12500) + +/datum/design/item/mechfab/polecat/right_leg + name = "Polecat Right Leg" + id = "polecat_right_leg" + build_path = /obj/item/mecha_parts/micro/part/polecat_right_leg + materials = list(DEFAULT_WALL_MATERIAL = 12500) + +/datum/design/item/mechfab/polecat/armour + name = "Polecat Armour Plates" + id = "polecat_armour" + build_path = /obj/item/mecha_parts/micro/part/polecat_armour + time = 25 + materials = list(DEFAULT_WALL_MATERIAL = 12500, "plastic" = 7500) + +/datum/design/item/mecha/taser/micro + name = "\improper TS-12 \"Suppressor\" integrated taser" + id = "micro_taser" + build_path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/microtaser + +/datum/design/item/mecha/weapon/laser/micro + name = "\improper WS-19 \"Torch\" laser carbine" + id = "micro_laser" +// req_tech = list(TECH_COMBAT = 3, TECH_MAGNET = 3) + build_path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/microlaser + +/datum/design/item/mecha/weapon/laser_heavy/micro + name = "\improper PC-20 \"Lance\" light laser cannon" + id = "micro_laser_heavy" + req_tech = list(TECH_COMBAT = 4, TECH_MATERIAL = 3, TECH_POWER = 3) + materials = list(DEFAULT_WALL_MATERIAL = 10000, "glass" = 1000, "diamond" = 2000) + build_path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/laser/microheavy + +/datum/design/item/mecha/weapon/grenade_launcher/micro + name = "\improper FP-20 mounted grenade launcher" + id = "micro_flashbang_launcher" +// req_tech = list(TECH_COMBAT = 3) + build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/flashbang/microflashbang + +/datum/design/item/mecha/weapon/scattershot/micro + name = "\improper Remington C-12 \"Boomstick\"" + desc = "A mounted combat shotgun with integrated ammo-lathe." + id = "micro_scattershot" +// req_tech = list(TECH_COMBAT = 4) + build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/microshotgun + +/datum/design/item/mechfab/weasel + category = "Weasel" + time = 5 + +/datum/design/item/mechfab/weasel/chassis + name = "Weasel Chassis" + id = "weasel_chassis" + build_path = /obj/item/mecha_parts/micro/chassis/weasel + time = 3 + materials = list(DEFAULT_WALL_MATERIAL = 7000) + +/datum/design/item/mechfab/weasel/torso + name = "Weasel Torso" + id = "weasel_torso" + build_path = /obj/item/mecha_parts/micro/part/weasel_torso + materials = list(DEFAULT_WALL_MATERIAL = 15000, "glass" = 5250) + +/datum/design/item/mechfab/weasel/left_arm + name = "Weasel Left Arm" + id = "weasel_left_arm" + build_path = /obj/item/mecha_parts/micro/part/weasel_left_arm + materials = list(DEFAULT_WALL_MATERIAL = 8750) + +/datum/design/item/mechfab/weasel/right_arm + name = "Weasel Right Arm" + id = "weasel_right_arm" + build_path = /obj/item/mecha_parts/micro/part/weasel_right_arm + materials = list(DEFAULT_WALL_MATERIAL = 8750) + +/*/datum/design/item/mechfab/weasel/left_leg + name = "Weasel Left Leg" + id = "weasel_left_leg" + build_path = /obj/item/mecha_parts/micro/part/weasel_left_leg + materials = list(DEFAULT_WALL_MATERIAL = 12500) + +/datum/design/item/mechfab/weasel/right_leg + name = "Weasel Right Leg" + id = "weasel_right_leg" + build_path = /obj/item/mecha_parts/micro/part/weasel_right_leg + materials = list(DEFAULT_WALL_MATERIAL = 12500)*/ + +/datum/design/item/mechfab/weasel/tri_leg + name = "Weasel Tri Leg" + id = "weasel_right_leg" + build_path = /obj/item/mecha_parts/micro/part/weasel_tri_leg + materials = list(DEFAULT_WALL_MATERIAL = 27500) + +/datum/design/item/mechfab/weasel/head + name = "Weasel Head" + id = "weasel_head" + build_path = /obj/item/mecha_parts/micro/part/weasel_head + materials = list(DEFAULT_WALL_MATERIAL = 7000, "glass" = 2500) diff --git a/code/game/objects/items/devices/radio/intercom.dm b/code/game/objects/items/devices/radio/intercom.dm index eb3ac7cb12..5bc75ca2a0 100644 --- a/code/game/objects/items/devices/radio/intercom.dm +++ b/code/game/objects/items/devices/radio/intercom.dm @@ -3,6 +3,8 @@ desc = "Talk through this." icon = 'icons/obj/radio_vr.dmi' //VOREStation Edit - New Icon icon_state = "intercom" + plane = TURF_PLANE + layer = ABOVE_TURF_LAYER anchored = 1 w_class = ITEMSIZE_LARGE canhear_range = 2 diff --git a/code/game/objects/items/devices/whistle.dm b/code/game/objects/items/devices/whistle.dm index 4a67bffe56..7a7828ef95 100644 --- a/code/game/objects/items/devices/whistle.dm +++ b/code/game/objects/items/devices/whistle.dm @@ -27,8 +27,8 @@ use_message = capitalize(copytext(sanitize(new_message), 1, MAX_MESSAGE_LEN)) usr << "You configure the hailer to shout \"[use_message]\"." -/ -obj/item/device/hailer/attack_self(mob/living/carbon/user as mob) + +/obj/item/device/hailer/attack_self(mob/living/carbon/user as mob) if (spamcheck) return diff --git a/code/game/objects/items/weapons/material/misc.dm b/code/game/objects/items/weapons/material/misc.dm index bbb8171b10..7248950a0f 100644 --- a/code/game/objects/items/weapons/material/misc.dm +++ b/code/game/objects/items/weapons/material/misc.dm @@ -29,7 +29,7 @@ icon_state = "unathiknife" attack_verb = list("ripped", "torn", "cut") can_cleave = FALSE - var hits = 0 + var/hits = 0 /obj/item/weapon/material/knife/machete/hatchet/unathiknife/attack(mob/M as mob, mob/user as mob) if(hits > 0) diff --git a/code/game/objects/items/weapons/storage/boxes.dm b/code/game/objects/items/weapons/storage/boxes.dm index 1bc9fa761d..0a1f358eb4 100644 --- a/code/game/objects/items/weapons/storage/boxes.dm +++ b/code/game/objects/items/weapons/storage/boxes.dm @@ -450,7 +450,7 @@ item_state_slots = list(slot_r_hand_str = "medicalpack", slot_l_hand_str = "medicalpack") foldable = null max_w_class = ITEMSIZE_NORMAL - can_hold = list(/obj/item/organ, /obj/item/weapon/reagent_containers/food, /obj/item/weapon/reagent_containers/glass) + can_hold = list(/obj/item/organ) max_storage_space = ITEMSIZE_COST_NORMAL * 5 // Formally 21. Odd numbers are bad. use_to_pickup = 1 // for picking up broken bulbs, not that most people will try diff --git a/code/game/objects/random/guns_and_ammo.dm b/code/game/objects/random/guns_and_ammo.dm index a910881a76..62dde5a3df 100644 --- a/code/game/objects/random/guns_and_ammo.dm +++ b/code/game/objects/random/guns_and_ammo.dm @@ -1,6 +1,16 @@ +/obj/random/gun/random + name = "Random Weapon" + desc = "This is a random energy or ballistic weapon." + icon = 'icons/obj/gun.dmi' + icon_state = "energystun100" + +/obj/random/gun/random/item_to_spawn() + return pick(prob(5);/obj/random/energy, + prob(5);/obj/random/projectile/random) + /obj/random/energy name = "Random Energy Weapon" - desc = "This is a random security weapon." + desc = "This is a random weapon." icon = 'icons/obj/gun.dmi' icon_state = "energykill100" @@ -83,6 +93,18 @@ prob(2);/obj/item/weapon/gun/projectile/automatic/wt550, prob(1);/obj/item/weapon/gun/projectile/shotgun/pump/combat) +/obj/random/projectile/shotgun + name = "Random Projectile Weapon" + desc = "This is a random projectile weapon." + icon = 'icons/obj/gun.dmi' + icon_state = "shotgun" + +/obj/random/projectile/item_to_spawn() + return pick(prob(4);/obj/item/weapon/gun/projectile/shotgun/doublebarrel, + prob(3);/obj/item/weapon/gun/projectile/shotgun/doublebarrel/sawn, + prob(3);/obj/item/weapon/gun/projectile/shotgun/pump, + prob(1);/obj/item/weapon/gun/projectile/shotgun/pump/combat) + /obj/random/handgun name = "Random Handgun" desc = "This is a random sidearm." @@ -126,4 +148,256 @@ prob(4);/obj/item/ammo_magazine/m45/rubber, prob(4);/obj/item/ammo_magazine/m45/flash, prob(2);/obj/item/ammo_magazine/m9mmt, - prob(6);/obj/item/ammo_magazine/m9mmt/rubber) \ No newline at end of file + prob(6);/obj/item/ammo_magazine/m9mmt/rubber) + +/obj/random/projectile/random + name = "Random Projectile Weapon" + desc = "This is a random weapon." + icon = 'icons/obj/gun.dmi' + icon_state = "revolver" + +/obj/random/projectile/random/item_to_spawn() + return pick(prob(3);/obj/random/multiple/gun/projectile/handgun, + prob(2);/obj/random/multiple/gun/projectile/smg, + prob(2);/obj/random/multiple/gun/projectile/shotgun, + prob(1);/obj/random/multiple/gun/projectile/rifle) + +/obj/random/multiple/gun/projectile/smg + name = "random smg projectile gun" + desc = "Loot for PoIs." + icon = 'icons/obj/gun.dmi' + icon_state = "saber" + +/obj/random/multiple/gun/projectile/smg/item_to_spawn() + return pick( + prob(3);list( + /obj/item/weapon/gun/projectile/automatic/wt550, + /obj/item/ammo_magazine/m9mmt, + /obj/item/ammo_magazine/m9mmt + ), + prob(3);list( + /obj/item/weapon/gun/projectile/automatic/mini_uzi, + /obj/item/ammo_magazine/m45uzi, + /obj/item/ammo_magazine/m45uzi + ), + prob(3);list( + /obj/item/weapon/gun/projectile/automatic/tommygun, + /obj/item/ammo_magazine/m45tommy, + /obj/item/ammo_magazine/m45tommy + ), + prob(2);list( + /obj/item/weapon/gun/projectile/automatic/c20r, + /obj/item/ammo_magazine/m10mm, + /obj/item/ammo_magazine/m10mm + ), + prob(1);list( + /obj/item/weapon/gun/projectile/automatic/p90, + /obj/item/ammo_magazine/m9mmp90 + ) + ) + +/obj/random/multiple/gun/projectile/rifle + name = "random rifle projectile gun" + desc = "Loot for PoIs." + icon = 'icons/obj/gun.dmi' + icon_state = "carbine" + +//Concerns about the bullpup, but currently seems to be only a slightly stronger z8. But we shall see. + +/obj/random/multiple/gun/projectile/rifle/item_to_spawn() + return pick( + prob(2);list( + /obj/item/weapon/gun/projectile/automatic/sts35, + /obj/item/ammo_magazine/m545, + /obj/item/ammo_magazine/m545 + ), + prob(2);list( + /obj/item/weapon/gun/projectile/automatic/z8, + /obj/item/ammo_magazine/m762, + /obj/item/ammo_magazine/m762 + ), + prob(4);list( + /obj/item/weapon/gun/projectile/shotgun/pump/rifle, + /obj/item/ammo_magazine/clip/c762, + /obj/item/ammo_magazine/clip/c762 + ), + prob(3);list( + /obj/item/weapon/gun/projectile/shotgun/pump/rifle/lever, + /obj/item/ammo_magazine/clip/c762, + /obj/item/ammo_magazine/clip/c762 + ), + prob(1);list( + /obj/item/weapon/gun/projectile/garand, + /obj/item/ammo_magazine/m762garand, + /obj/item/ammo_magazine/m762garand + ), + prob(1);list( + /obj/item/weapon/gun/projectile/automatic/bullpup, + /obj/item/ammo_magazine/m762, + /obj/item/ammo_magazine/m762 + ) + ) + +/obj/random/multiple/gun/projectile/handgun + name = "random handgun projectile gun" + desc = "Loot for PoIs." + icon = 'icons/obj/gun.dmi' + icon_state = "revolver" + +/obj/random/multiple/gun/projectile/handgun/item_to_spawn() + return pick( + prob(5);list( + /obj/item/weapon/gun/projectile/colt, + /obj/item/ammo_magazine/m45, + /obj/item/ammo_magazine/m45 + ), + prob(4);list( + /obj/item/weapon/gun/projectile/contender, + /obj/item/ammo_magazine/s357, + /obj/item/ammo_magazine/s357 + ), + prob(3);list( + /obj/item/weapon/gun/projectile/contender/tacticool, + /obj/item/ammo_magazine/s357, + /obj/item/ammo_magazine/s357 + ), + prob(2);list( + /obj/item/weapon/gun/projectile/deagle, + /obj/item/ammo_magazine/m44, + /obj/item/ammo_magazine/m44 + ), + prob(1);list( + /obj/item/weapon/gun/projectile/deagle/camo, + /obj/item/ammo_magazine/m44, + /obj/item/ammo_magazine/m44 + ), + prob(1);list( + /obj/item/weapon/gun/projectile/deagle/gold, + /obj/item/ammo_magazine/m44, + /obj/item/ammo_magazine/m44 + ), + prob(4);list( + /obj/item/weapon/gun/projectile/derringer, + /obj/item/ammo_magazine/s357, + /obj/item/ammo_magazine/s357 + ), + prob(5);list( + /obj/item/weapon/gun/projectile/luger, + /obj/item/ammo_magazine/m9mm/compact, + /obj/item/ammo_magazine/m9mm/compact + ), + prob(4);list( + /obj/item/weapon/gun/projectile/luger/brown, + /obj/item/ammo_magazine/m9mm/compact, + /obj/item/ammo_magazine/m9mm/compact + ), + prob(5);list( + /obj/item/weapon/gun/projectile/sec, + /obj/item/ammo_magazine/m45, + /obj/item/ammo_magazine/m45 + ), + prob(4);list( + /obj/item/weapon/gun/projectile/sec/wood, + /obj/item/ammo_magazine/m45, + /obj/item/ammo_magazine/m45 + ), + prob(5);list( + /obj/item/weapon/gun/projectile/p92x, + /obj/item/ammo_magazine/m9mm, + /obj/item/ammo_magazine/m9mm + ), + prob(4);list( + /obj/item/weapon/gun/projectile/p92x/brown, + /obj/item/ammo_magazine/m9mm, + /obj/item/ammo_magazine/m9mm + ), + prob(2);list( + /obj/item/weapon/gun/projectile/p92x/large, + /obj/item/ammo_magazine/m9mm/large, + /obj/item/ammo_magazine/m9mm/large + ), + prob(5);list( + /obj/item/weapon/gun/projectile/pistol, + /obj/item/ammo_magazine/m9mm/compact, + /obj/item/ammo_magazine/m9mm/compact + ), + prob(2);list( + /obj/item/weapon/gun/projectile/silenced, + /obj/item/ammo_magazine/m45, + /obj/item/ammo_magazine/m45 + ), + prob(2);list( + /obj/item/weapon/gun/projectile/revolver, + /obj/item/ammo_magazine/s357, + /obj/item/ammo_magazine/s357 + ), + prob(4);list( + /obj/item/weapon/gun/projectile/revolver/deckard, + /obj/item/ammo_magazine/s38, + /obj/item/ammo_magazine/s38 + ), + prob(4);list( + /obj/item/weapon/gun/projectile/revolver/detective, + /obj/item/ammo_magazine/s38, + /obj/item/ammo_magazine/s38 + ), + prob(2);list( + /obj/item/weapon/gun/projectile/revolver/judge, + /obj/item/ammo_magazine/clip/c12g, + /obj/item/ammo_magazine/clip/c12g, + /obj/item/ammo_magazine/clip/c12g + ), + prob(2);list( + /obj/item/weapon/gun/projectile/revolver/lemat, + /obj/item/ammo_magazine/s38, + /obj/item/ammo_magazine/s38, + /obj/item/ammo_magazine/clip/c12g + ), + prob(2);list( + /obj/item/weapon/gun/projectile/revolver/mateba, + /obj/item/ammo_magazine/s357, + /obj/item/ammo_magazine/s357 + ), + prob(2);list( + /obj/item/weapon/gun/projectile/revolver/webley, + /obj/item/ammo_magazine/s44, + /obj/item/ammo_magazine/s44 + ), + prob(1);list( + /obj/item/weapon/gun/projectile/revolver/webley/auto, + /obj/item/ammo_magazine/s44, + /obj/item/ammo_magazine/s44 + ) + ) + +/obj/random/multiple/gun/projectile/shotgun + name = "random shotgun projectile gun" + desc = "Loot for PoIs." + icon = 'icons/obj/gun.dmi' + icon_state = "shotgun" + +/obj/random/multiple/gun/projectile/shotgun/item_to_spawn() + return pick( + prob(4);list( + /obj/item/weapon/gun/projectile/shotgun/doublebarrel/pellet, + /obj/item/ammo_magazine/clip/c12g/pellet, + /obj/item/ammo_magazine/clip/c12g/pellet, + /obj/item/ammo_magazine/clip/c12g/pellet, + /obj/item/ammo_magazine/clip/c12g/pellet + ), + prob(3);list( + /obj/item/weapon/gun/projectile/shotgun/doublebarrel/sawn, + /obj/item/ammo_magazine/clip/c12g/pellet, + /obj/item/ammo_magazine/clip/c12g/pellet, + /obj/item/ammo_magazine/clip/c12g/pellet, + /obj/item/ammo_magazine/clip/c12g/pellet + ), + prob(3);list( + /obj/item/weapon/gun/projectile/shotgun/pump/slug, + /obj/item/weapon/storage/box/shotgunammo + ), + prob(1);list( + /obj/item/weapon/gun/projectile/shotgun/pump/combat, + /obj/item/weapon/storage/box/shotgunammo + ) + ) \ No newline at end of file diff --git a/code/game/objects/random/mapping.dm b/code/game/objects/random/mapping.dm index 57ff7acdcd..aba62d0806 100644 --- a/code/game/objects/random/mapping.dm +++ b/code/game/objects/random/mapping.dm @@ -92,8 +92,8 @@ /obj/random/multiple/minevault name = "random vault loot" desc = "Loot for mine vaults." - icon = 'icons/misc/mark.dmi' - icon_state = "rup" + icon = 'icons/obj/storage.dmi' + icon_state = "crate" /obj/random/multiple/minevault/item_to_spawn() return pick( diff --git a/code/game/objects/random/misc.dm b/code/game/objects/random/misc.dm index 29b597d460..c918425221 100644 --- a/code/game/objects/random/misc.dm +++ b/code/game/objects/random/misc.dm @@ -159,8 +159,8 @@ /obj/random/medical name = "Random Medicine" desc = "This is a random medical item." - icon = 'icons/obj/items.dmi' - icon_state = "advfirstaid" + icon = 'icons/obj/stacks.dmi' + icon_state = "traumakit" /obj/random/medical/item_to_spawn() return pick(prob(21);/obj/random/medical/lite, diff --git a/code/game/objects/random/mob.dm b/code/game/objects/random/mob.dm index 2043ef0240..3aefa9a84c 100644 --- a/code/game/objects/random/mob.dm +++ b/code/game/objects/random/mob.dm @@ -74,6 +74,23 @@ prob(1);/mob/living/simple_animal/hostile/goose, prob(20);/mob/living/simple_animal/giant_crab) + +/obj/random/mob/sif/peaceful + name = "Random Peaceful Sif Animal" + desc = "This is a random peaceful cold weather animal." + icon_state = "penguin" + + mob_returns_home = 1 + mob_wander_distance = 12 + +/obj/random/mob/sif/peaceful/item_to_spawn() + return pick(prob(30);/mob/living/simple_animal/retaliate/diyaab, + prob(15);/mob/living/simple_animal/crab, + prob(15);/mob/living/simple_animal/penguin, + prob(15);/mob/living/simple_animal/mouse, + prob(15);/mob/living/simple_animal/corgi/tamaskan, + prob(20);/mob/living/simple_animal/giant_crab) + /obj/random/mob/sif/hostile name = "Random Hostile Sif Animal" desc = "This is a random hostile cold weather animal." @@ -97,6 +114,18 @@ prob(33);/mob/living/simple_animal/hostile/giant_spider/hunter, prob(45);/mob/living/simple_animal/hostile/giant_spider) +/obj/random/mob/spider/nurse + name = "Random Nurse Spider" + desc = "This is a random nurse spider." + icon_state = "nurse" + + mob_returns_home = 1 + mob_wander_distance = 4 + +/obj/random/mob/spider/nurse/item_to_spawn() + return pick(prob(22);/mob/living/simple_animal/hostile/giant_spider/nurse/hat, + prob(45);/mob/living/simple_animal/hostile/giant_spider/nurse) + /obj/random/mob/spider/mutant name = "Random Mutant Spider" desc = "This is a random mutated spider." diff --git a/code/game/objects/random/spacesuits.dm b/code/game/objects/random/spacesuits.dm index cb4ec6d4e9..29bd799c5c 100644 --- a/code/game/objects/random/spacesuits.dm +++ b/code/game/objects/random/spacesuits.dm @@ -97,6 +97,31 @@ ) ) +/obj/random/multiple/voidsuit/medical + name = "Random Mining Voidsuit" + desc = "This is a random mining voidsuit." + icon = 'icons/obj/clothing/suits.dmi' + icon_state = "rig-mining" + +/obj/random/multiple/voidsuit/medical/item_to_spawn() + return pick( + prob(5);list( + /obj/item/clothing/suit/space/void/medical, + /obj/item/clothing/head/helmet/space/void/medical + ), + prob(1);list( + /obj/item/clothing/suit/space/void/medical/alt, + /obj/item/clothing/head/helmet/space/void/medical/alt + ), + prob(3);list( + /obj/item/clothing/suit/space/void/medical/bio, + /obj/item/clothing/head/helmet/space/void/medical/bio + ), + prob(4);list( + /obj/item/clothing/suit/space/void/medical/emt, + /obj/item/clothing/head/helmet/space/void/medical/emt + ) + ) /obj/random/rigsuit name = "Random rigsuit" diff --git a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm index 96a1b39477..66732a8209 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm @@ -313,6 +313,8 @@ icon_opened = "medical_wall_open" icon_broken = "medical_wall_spark" icon_off = "medical_wall_off" + plane = TURF_PLANE + layer = ABOVE_TURF_LAYER anchored = 1 density = 0 wall_mounted = 1 diff --git a/code/game/objects/structures/crates_lockers/closets/utility_closets.dm b/code/game/objects/structures/crates_lockers/closets/utility_closets.dm index 62db60456e..c2b8ff731a 100644 --- a/code/game/objects/structures/crates_lockers/closets/utility_closets.dm +++ b/code/game/objects/structures/crates_lockers/closets/utility_closets.dm @@ -215,6 +215,8 @@ icon_state = "hydrant" icon_closed = "hydrant" icon_opened = "hydrant_open" + plane = TURF_PLANE + layer = ABOVE_TURF_LAYER anchored = 1 density = 0 wall_mounted = 1 diff --git a/code/game/objects/structures/curtains.dm b/code/game/objects/structures/curtains.dm index af129800b7..39c2dc43fd 100644 --- a/code/game/objects/structures/curtains.dm +++ b/code/game/objects/structures/curtains.dm @@ -2,13 +2,15 @@ name = "curtain" icon = 'icons/obj/curtain.dmi' icon_state = "closed" - layer = SHOWER_OPEN_LAYER + plane = MOB_PLANE + layer = ABOVE_MOB_LAYER opacity = 1 density = 0 /obj/structure/curtain/open icon_state = "open" - layer = SHOWER_CLOSED_LAYER + plane = OBJ_PLANE + layer = OBJ_LAYER opacity = 0 /obj/structure/curtain/bullet_act(obj/item/projectile/P, def_zone) @@ -27,10 +29,12 @@ set_opacity(!opacity) if(opacity) icon_state = "closed" - layer = SHOWER_CLOSED_LAYER + plane = MOB_PLANE + layer = ABOVE_MOB_LAYER else icon_state = "open" - layer = SHOWER_OPEN_LAYER + plane = OBJ_PLANE + layer = OBJ_LAYER /obj/structure/curtain/attackby(obj/item/P, mob/user) if(istype(P, /obj/item/weapon/wirecutters)) @@ -76,6 +80,3 @@ /obj/structure/curtain/open/shower/security color = "#AA0000" - -#undef SHOWER_OPEN_LAYER -#undef SHOWER_CLOSED_LAYER diff --git a/code/game/objects/structures/extinguisher.dm b/code/game/objects/structures/extinguisher.dm index bfbc34dcee..e93afd18f3 100644 --- a/code/game/objects/structures/extinguisher.dm +++ b/code/game/objects/structures/extinguisher.dm @@ -3,6 +3,8 @@ desc = "A small wall mounted cabinet designed to hold a fire extinguisher." icon = 'icons/obj/closet.dmi' icon_state = "extinguisher_closed" + plane = TURF_PLANE + layer = ABOVE_TURF_LAYER anchored = 1 density = 0 var/obj/item/weapon/extinguisher/has_extinguisher diff --git a/code/game/objects/structures/loot_piles.dm b/code/game/objects/structures/loot_piles.dm index 353dbe31a7..96416e0229 100644 --- a/code/game/objects/structures/loot_piles.dm +++ b/code/game/objects/structures/loot_piles.dm @@ -830,3 +830,42 @@ Loot piles can be depleted, if loot_depleted is turned on. Note that players wh /obj/item/mecha_parts/mecha_equipment/repair_droid, /obj/item/mecha_parts/mecha_equipment/teleporter ) + +/obj/structure/loot_pile/surface/drone + name = "drone wreckage" + desc = "The ruins of some unfortunate drone. Perhaps something is salvageable." + icon = 'icons/mob/animal.dmi' + icon_state = "drone_dead" + +// Since the actual drone loot is a bit stupid in how it is handled, this is a sparse and empty list with items I don't exactly want in it. But until we can get the proper items in . . . + + common_loot = list( + /obj/random/tool, + /obj/item/stack/cable_coil/random, + /obj/random/tank, + /obj/random/tech_supply/component, + /obj/item/stack/material/steel{amount = 25}, + /obj/item/stack/material/glass{amount = 10}, + /obj/item/stack/material/plasteel{amount = 5}, + /obj/item/weapon/cell, + /obj/item/weapon/material/shard + ) + + uncommon_loot = list( + /obj/item/weapon/cell/high, + /obj/item/robot_parts/robot_component/actuator, + /obj/item/robot_parts/robot_component/armour, + /obj/item/robot_parts/robot_component/binary_communication_device, + /obj/item/robot_parts/robot_component/camera, + /obj/item/robot_parts/robot_component/diagnosis_unit, + /obj/item/robot_parts/robot_component/radio + ) + + rare_loot = list( + /obj/item/weapon/cell/super, + /obj/item/borg/upgrade/restart, + /obj/item/borg/upgrade/jetpack, + /obj/item/borg/upgrade/tasercooler, + /obj/item/borg/upgrade/syndicate, + /obj/item/borg/upgrade/vtec + ) \ No newline at end of file diff --git a/code/game/objects/structures/signs.dm b/code/game/objects/structures/signs.dm index d94da02813..c1b0b6b0c5 100644 --- a/code/game/objects/structures/signs.dm +++ b/code/game/objects/structures/signs.dm @@ -3,7 +3,8 @@ anchored = 1 opacity = 0 density = 0 - layer = ABOVE_JUNK_LAYER + plane = TURF_PLANE + layer = ABOVE_TURF_LAYER w_class = ITEMSIZE_NORMAL /obj/structure/sign/ex_act(severity) diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm index 9882ca4507..98e0f1a41e 100644 --- a/code/game/objects/structures/watercloset.dm +++ b/code/game/objects/structures/watercloset.dm @@ -142,7 +142,8 @@ name = "mist" icon = 'icons/obj/watercloset.dmi' icon_state = "mist" - layer = MOB_LAYER + 1 + plane = MOB_PLANE + layer = ABOVE_MOB_LAYER anchored = 1 mouse_opacity = 0 diff --git a/code/game/turfs/simulated/dungeon/wall.dm b/code/game/turfs/simulated/dungeon/wall.dm index 156fddac6a..176c10142c 100644 --- a/code/game/turfs/simulated/dungeon/wall.dm +++ b/code/game/turfs/simulated/dungeon/wall.dm @@ -13,6 +13,9 @@ return /turf/simulated/wall/solidrock //for more stylish anti-cheese. + name = "solid rock" + desc = "This rock seems dense, impossible to drill." + description_info = "Probably not going to be able to drill or bomb your way through this, best to try and find a way around." icon_state = "bedrock" var/base_state = "bedrock" block_tele = TRUE diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 7a38d339f0..6014320798 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -137,6 +137,8 @@ turf/attackby(obj/item/weapon/W as obj, mob/user as mob) animate(O, transform = turn(O.transform, -40), time = 4) sleep(4) animate(O, transform = turn(O.transform, 20), time = 2) + sleep(2) + O.update_transform() /turf/Enter(atom/movable/mover as mob|obj, atom/forget as mob|obj|turf|area) if(movement_disabled && usr.ckey != movement_disabled_exception) diff --git a/code/modules/admin/admin_secrets.dm b/code/modules/admin/admin_secrets.dm index 473770ac2b..5f04582ace 100644 --- a/code/modules/admin/admin_secrets.dm +++ b/code/modules/admin/admin_secrets.dm @@ -31,7 +31,6 @@ var/datum/admin_secrets/admin_secrets = new() var/list/datum/admin_secret_item/items /datum/admin_secret_category - ..() items = list() /datum/admin_secret_category/proc/can_view(var/mob/user) diff --git a/code/modules/client/preference_setup/global/setting_datums.dm b/code/modules/client/preference_setup/global/setting_datums.dm index 5260193848..393ac5841c 100644 --- a/code/modules/client/preference_setup/global/setting_datums.dm +++ b/code/modules/client/preference_setup/global/setting_datums.dm @@ -193,6 +193,20 @@ var/list/_client_preferences_by_type enabled_description = "Fancy" disabled_description = "Plain" +/datum/client_preference/ambient_occlusion + description = "Fake Ambient Occlusion" + key = "AMBIENT_OCCLUSION_PREF" + enabled_by_default = FALSE + enabled_description = "On" + disabled_description = "Off" + +/datum/client_preference/ambient_occlusion/toggled(var/mob/preference_mob, var/enabled) + . = ..() + if(preference_mob && preference_mob.plane_holder) + var/datum/plane_holder/PH = preference_mob.plane_holder + PH.set_ao(VIS_OBJS, enabled) + PH.set_ao(VIS_MOBS, enabled) + /******************** * Staff Preferences * ********************/ diff --git a/code/modules/client/preference_setup/loadout/loadout_suit.dm b/code/modules/client/preference_setup/loadout/loadout_suit.dm index 6b32034b31..9276384602 100644 --- a/code/modules/client/preference_setup/loadout/loadout_suit.dm +++ b/code/modules/client/preference_setup/loadout/loadout_suit.dm @@ -455,4 +455,4 @@ datum/gear/suit/duster /datum/gear/suit/snowsuit/cargo display_name = "snowsuit, supply" path = /obj/item/clothing/suit/storage/snowsuit/cargo - allowed_roles = list("Quartermaster","shaft Miner","Cargo Technician","Head of Personnel") \ No newline at end of file + allowed_roles = list("Quartermaster","Shaft Miner","Cargo Technician","Head of Personnel") \ No newline at end of file diff --git a/code/modules/clothing/head/misc_special.dm b/code/modules/clothing/head/misc_special.dm index ac82df4ddc..9a2d3868dd 100644 --- a/code/modules/clothing/head/misc_special.dm +++ b/code/modules/clothing/head/misc_special.dm @@ -99,7 +99,7 @@ slot_l_hand_str = "engiewelding", slot_r_hand_str = "engiewelding", ) -. + /* * Cakehat @@ -272,4 +272,4 @@ /obj/item/clothing/head/psy_crown/wrath/activate_ability(var/mob/living/wearer) ..() - wearer.add_modifier(/datum/modifier/berserk, 30 SECONDS) \ No newline at end of file + wearer.add_modifier(/datum/modifier/berserk, 30 SECONDS) diff --git a/code/modules/clothing/spacesuits/rig/suits/light.dm b/code/modules/clothing/spacesuits/rig/suits/light.dm index 0dd98de966..85c2004058 100644 --- a/code/modules/clothing/spacesuits/rig/suits/light.dm +++ b/code/modules/clothing/spacesuits/rig/suits/light.dm @@ -103,7 +103,6 @@ /obj/item/rig_module/self_destruct ) - ..() /obj/item/clothing/gloves/gauntlets/rig/light/ninja name = "insulated gloves" diff --git a/code/modules/clothing/spacesuits/void/void_vr.dm b/code/modules/clothing/spacesuits/void/void_vr.dm index 616bef8c33..b0842df24f 100644 --- a/code/modules/clothing/spacesuits/void/void_vr.dm +++ b/code/modules/clothing/spacesuits/void/void_vr.dm @@ -73,3 +73,51 @@ // This variable is normally used to set the icon_override when the suit is refitted, // however the species spritesheet now means we no longer need that anyway! sprite_sheets_refit = list() + +/obj/item/clothing/suit/space/void/explorer + desc = "A classy red voidsuit for the needs of any semi-retro-futuristic spaceperson! This one is rather loose fitting." + species_restricted = list( + SPECIES_HUMAN, + SPECIES_SKRELL, + SPECIES_UNATHI, + SPECIES_TAJ, + SPECIES_TESHARI, + SPECIES_AKULA, + SPECIES_ALRAUNE, + SPECIES_NEVREAN, + SPECIES_RAPALA, + SPECIES_SERGAL, + SPECIES_VASILISSAN, + SPECIES_VULPKANIN, + SPECIES_XENOCHIMERA, + SPECIES_XENOHYBRID, + SPECIES_ZORREN_FLAT, + SPECIES_ZORREN_HIGH + ) +/obj/item/clothing/suit/space/void/explorer/initialize() + . = ..() + sprite_sheets += sprite_sheets_refit + +/obj/item/clothing/head/helmet/space/void/explorer + desc = "A helmet that matches a red voidsuit! So classy." + species_restricted = list( + SPECIES_HUMAN, + SPECIES_SKRELL, + SPECIES_UNATHI, + SPECIES_TAJ, + SPECIES_TESHARI, + SPECIES_AKULA, + SPECIES_ALRAUNE, + SPECIES_NEVREAN, + SPECIES_RAPALA, + SPECIES_SERGAL, + SPECIES_VASILISSAN, + SPECIES_VULPKANIN, + SPECIES_XENOCHIMERA, + SPECIES_XENOHYBRID, + SPECIES_ZORREN_FLAT, + SPECIES_ZORREN_HIGH + ) +/obj/item/clothing/head/helmet/space/void/explorer/initialize() + . = ..() + sprite_sheets += sprite_sheets_refit diff --git a/code/modules/economy/cash_register.dm b/code/modules/economy/cash_register.dm index c9332fb72f..febb412879 100644 --- a/code/modules/economy/cash_register.dm +++ b/code/modules/economy/cash_register.dm @@ -519,28 +519,21 @@ /obj/machinery/cash_register/command account_to_connect = "Command" - ..() /obj/machinery/cash_register/medical account_to_connect = "Medical" - ..() /obj/machinery/cash_register/engineering account_to_connect = "Engineering" - ..() /obj/machinery/cash_register/science account_to_connect = "Science" - ..() /obj/machinery/cash_register/security account_to_connect = "Security" - ..() /obj/machinery/cash_register/cargo account_to_connect = "Cargo" - ..() /obj/machinery/cash_register/civilian account_to_connect = "Civilian" - ..() \ No newline at end of file diff --git a/code/modules/economy/retail_scanner.dm b/code/modules/economy/retail_scanner.dm index 7117172af8..af1d87177a 100644 --- a/code/modules/economy/retail_scanner.dm +++ b/code/modules/economy/retail_scanner.dm @@ -401,28 +401,21 @@ /obj/item/device/retail_scanner/command account_to_connect = "Command" - ..() /obj/item/device/retail_scanner/medical account_to_connect = "Medical" - ..() /obj/item/device/retail_scanner/engineering account_to_connect = "Engineering" - ..() /obj/item/device/retail_scanner/science account_to_connect = "Science" - ..() /obj/item/device/retail_scanner/security account_to_connect = "Security" - ..() /obj/item/device/retail_scanner/cargo account_to_connect = "Cargo" - ..() /obj/item/device/retail_scanner/civilian account_to_connect = "Civilian" - ..() \ No newline at end of file diff --git a/code/modules/events/event_container.dm b/code/modules/events/event_container.dm index d48cda9dca..5768ed6fe6 100644 --- a/code/modules/events/event_container.dm +++ b/code/modules/events/event_container.dm @@ -60,7 +60,7 @@ var/global/list/severity_to_string = list(EVENT_LEVEL_MUNDANE = "Mundane", EVENT var/list/possible_events = list() for(var/datum/event_meta/EM in available_events) var/event_weight = get_weight(EM, active_with_role) - if(event_weight) + if(event_weight > 0) possible_events[EM] = event_weight if(possible_events.len == 0) diff --git a/code/modules/holomap/station_holomap.dm b/code/modules/holomap/station_holomap.dm index eb2ea9d53f..b704872abb 100644 --- a/code/modules/holomap/station_holomap.dm +++ b/code/modules/holomap/station_holomap.dm @@ -19,7 +19,8 @@ var/light_range_on = 2 light_color = "#64C864" - layer = ABOVE_WINDOW_LAYER + plane = TURF_PLANE + layer = ABOVE_TURF_LAYER var/mob/watching_mob = null var/image/small_station_map = null diff --git a/code/modules/mining/shelter_atoms.dm b/code/modules/mining/shelter_atoms.dm index 3fefac54ab..8f6f43319f 100644 --- a/code/modules/mining/shelter_atoms.dm +++ b/code/modules/mining/shelter_atoms.dm @@ -15,12 +15,14 @@ w_class = ITEMSIZE_TINY var/template_id = "shelter_alpha" var/datum/map_template/shelter/template + var/datum/map_template/shelter/template_roof var/used = FALSE /obj/item/device/survivalcapsule/proc/get_template() if(template) return template = SSmapping.shelter_templates[template_id] + template_roof = SSmapping.shelter_templates[template.roof] if(!template) throw EXCEPTION("Shelter template ([template_id]) not found!") qdel(src) @@ -41,19 +43,26 @@ if(!used) loc.visible_message("\The [src] begins to shake. Stand back!") used = TRUE - + sleep(5 SECONDS) - + var/turf/deploy_location = get_turf(src) var/status = template.check_deploy(deploy_location) + var/turf/above_location = GetAbove(deploy_location) + if(above_location && status == SHELTER_DEPLOY_ALLOWED) + status = template.check_deploy(above_location) + switch(status) + //Not allowed due to /area technical reasons if(SHELTER_DEPLOY_BAD_AREA) src.loc.visible_message("\The [src] will not function in this area.") + + //Anchored objects or no space if(SHELTER_DEPLOY_BAD_TURFS, SHELTER_DEPLOY_ANCHORED_OBJECTS) var/width = template.width var/height = template.height src.loc.visible_message("\The [src] doesn't have room to deploy! You need to clear a [width]x[height] area!") - + if(status != SHELTER_DEPLOY_ALLOWED) used = FALSE return @@ -68,6 +77,8 @@ playsound(get_turf(src), 'sound/effects/phasein.ogg', 100, 1) log_and_message_admins("[key_name_admin(usr)] activated a bluespace capsule at [get_area(T)]!") + if(above_location && template_roof) + template_roof.load(above_location, centered = TRUE) template.load(deploy_location, centered = TRUE) qdel(src) @@ -87,6 +98,23 @@ name = "survival airlock" block_air_zones = 1 +//Door access setter button +/obj/machinery/button/remote/airlock/survival_pod + name = "shelter privacy control" + desc = "You can secure yourself inside the shelter here." + specialfunctions = 4 // 4 is bolts + id = "placeholder_id_do_not_use" //This has to be this way, otherwise it will control ALL doors if left blank. + var/obj/machinery/door/airlock/voidcraft/survival_pod/door + +/obj/machinery/button/remote/airlock/survival_pod/attack_hand(obj/item/weapon/W, mob/user as mob) + if(..()) return 1 //1 is failure on machines (for whatever reason) + if(!door) + var/turf/dT = get_step(src,dir) + door = locate() in dT + if(door) + door.glass = !door.glass + door.opacity = !door.opacity + //Windows /obj/structure/window/reinforced/survival_pod name = "pod window" @@ -112,10 +140,22 @@ name = "table" icon = 'icons/obj/survival_pod.dmi' icon_state = "table" + can_reinforce = FALSE + can_plate = FALSE /obj/structure/table/survival_pod/update_icon() icon_state = "table" +/obj/structure/table/survival_pod/New() + material = get_material_by_name(DEFAULT_WALL_MATERIAL) + verbs -= /obj/structure/table/verb/do_flip + verbs -= /obj/structure/table/proc/do_put + ..() + +/obj/structure/table/survival_pod/dismantle(obj/item/weapon/wrench/W, mob/user) + to_chat(user, "You cannot dismantle \the [src].") + return + //Sleeper /obj/machinery/sleeper/survival_pod desc = "A limited functionality sleeper, all it can do is put patients into stasis. It lacks the medication and configuration of the larger units." @@ -179,6 +219,9 @@ for(var/i in 1 to 5) var/obj/item/weapon/reagent_containers/food/snacks/liquidfood/W = new(src) stock(W) + for(var/i in 1 to 2) + var/obj/item/device/fbp_backup_cell/W = new(src) + stock(W) if(prob(50)) var/obj/item/weapon/storage/pill_bottle/dice/D = new(src) stock(D) diff --git a/code/modules/mining/shelters.dm b/code/modules/mining/shelters.dm index 19ad55f966..5ac1a7f6cd 100644 --- a/code/modules/mining/shelters.dm +++ b/code/modules/mining/shelters.dm @@ -5,6 +5,7 @@ var/whitelisted_turfs var/banned_areas var/banned_objects + var/roof /datum/map_template/shelter/New() . = ..() @@ -38,6 +39,11 @@ sleeping area! Order now, and we'll throw in a TINY FAN, \ absolutely free!" mappath = "maps/submaps/shelters/shelter_1.dmm" + roof = "roof_alpha" + +/datum/map_template/shelter/alpha_roof + shelter_id = "roof_alpha" + mappath = "maps/submaps/shelters/shelter_1_roof.dmm" /datum/map_template/shelter/alpha/New() . = ..() @@ -53,8 +59,14 @@ and a deluxe companion to keep you from getting lonely during \ an ash storm." mappath = "maps/submaps/shelters/shelter_2.dmm" + roof = "roof_beta" + +/datum/map_template/shelter/beta_roof + shelter_id = "roof_beta" + mappath = "maps/submaps/shelters/shelter_2_roof.dmm" /datum/map_template/shelter/beta/New() . = ..() whitelisted_turfs = typecacheof(/turf/simulated/mineral) banned_objects = list() + diff --git a/code/modules/mob/emote.dm b/code/modules/mob/emote.dm index f1ccde0a17..0ecdb2fc20 100644 --- a/code/modules/mob/emote.dm +++ b/code/modules/mob/emote.dm @@ -11,7 +11,7 @@ var/input if(!message) - input = sanitize(input(src,"Choose an emote to display.") as text|null) + input = sanitize_or_reflect(input(src,"Choose an emote to display.") as text|null, src) //VOREStation Edit - Reflect too long messages, within reason else input = message if(input) @@ -70,7 +70,7 @@ var/input if(!message) - input = sanitize(input(src, "Choose an emote to display.") as text|null) + input = sanitize_or_reflect(input(src, "Choose an emote to display.") as text|null, src) //VOREStation Edit - Reflect too long messages, within reason else input = message diff --git a/code/modules/mob/living/carbon/human/say.dm b/code/modules/mob/living/carbon/human/say.dm index a0276a15ac..d42c26880b 100644 --- a/code/modules/mob/living/carbon/human/say.dm +++ b/code/modules/mob/living/carbon/human/say.dm @@ -3,7 +3,7 @@ if(name != GetVoice()) alt_name = "(as [get_id_name("Unknown")])" - message = sanitize(message) + message = sanitize_or_reflect(message,src) //VOREStation Edit - Reflect too-long messages, within reason ..(message, alt_name = alt_name, whispering = whispering) /mob/living/carbon/human/proc/forcesay(list/append) diff --git a/code/modules/mob/living/carbon/human/species/species_vr.dm b/code/modules/mob/living/carbon/human/species/species_vr.dm index c6a69369fa..fa3bb9762d 100644 --- a/code/modules/mob/living/carbon/human/species/species_vr.dm +++ b/code/modules/mob/living/carbon/human/species/species_vr.dm @@ -33,9 +33,10 @@ var/type = H.nif.type var/durability = H.nif.durability var/list/nifsofts = H.nif.nifsofts + var/list/nif_savedata = H.nif.save_data.Copy() ..() - var/obj/item/device/nif/nif = new type(H,durability) + var/obj/item/device/nif/nif = new type(H,durability,nif_savedata) nif.nifsofts = nifsofts else ..() diff --git a/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm b/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm index db790db8b0..090818f3f2 100644 --- a/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm +++ b/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm @@ -23,6 +23,8 @@ var/startdrain = 500 var/max_item_count = 1 var/gulpsound = 'sound/vore/gulp.ogg' + var/digest_brute = 2 + var/digest_burn = 3 /obj/item/device/dogborg/sleeper/New() ..() @@ -504,9 +506,14 @@ if((T.status_flags & GODMODE) || !T.digestable) items_preserved += T else - T.adjustBruteLoss(2) - T.adjustFireLoss(3) - drain(-100) //20*total loss as with voreorgan stats. + var/old_brute = T.getBruteLoss() + var/old_burn = T.getFireLoss() + T.adjustBruteLoss(digest_brute) + T.adjustFireLoss(digest_burn) + var/actual_brute = T.getBruteLoss() - old_brute + var/actual_burn = T.getFireLoss() - old_burn + var/damage_gain = actual_brute + actual_burn + drain(-25 * damage_gain) //25*total loss as with voreorgan stats. update_patient() //Pick a random item to deal with (if there are any) diff --git a/code/modules/mob/living/simple_animal/aliens/mimic.dm b/code/modules/mob/living/simple_animal/aliens/mimic.dm index c13e1721ce..fff75ecbe7 100644 --- a/code/modules/mob/living/simple_animal/aliens/mimic.dm +++ b/code/modules/mob/living/simple_animal/aliens/mimic.dm @@ -49,10 +49,7 @@ qdel(src) /mob/living/simple_animal/hostile/mimic/MouseEntered(location, control, params) - ..() - closeToolTip(usr) - // ideally, we'd remove the code in ..() that opens the tooltip, - // but then we'd need to duplicate all the other code in ..() + return // Do not call parent: Mimics shouldn't have tooltips! // // Crate Mimic diff --git a/code/modules/mob/living/simple_animal/animals/giant_spider.dm b/code/modules/mob/living/simple_animal/animals/giant_spider.dm index defdfb9644..50b6300c7b 100644 --- a/code/modules/mob/living/simple_animal/animals/giant_spider.dm +++ b/code/modules/mob/living/simple_animal/animals/giant_spider.dm @@ -84,13 +84,16 @@ Nurse Family var/atom/cocoon_target var/egg_inject_chance = 5 -// VOREStation Edit - Keep Nurse Hat Spiders -/mob/living/simple_animal/hostile/giant_spider/nurse/medical +/mob/living/simple_animal/hostile/giant_spider/nurse/hat desc = "Furry and beige, it makes you shudder to look at it. This one has brilliant green eyes and a tiny nurse hat." icon_state = "nursemed" icon_living = "nursemed" icon_dead = "nursemed_dead" + maxHealth = 50 + health = 50 + +// VOREStation Edit melee_damage_lower = 8 melee_damage_upper = 16 poison_type = "tramadol" diff --git a/code/modules/mob/login.dm b/code/modules/mob/login.dm index 098a88ab42..8471dd8307 100644 --- a/code/modules/mob/login.dm +++ b/code/modules/mob/login.dm @@ -61,6 +61,11 @@ client.screen += plane_holder.plane_masters recalculate_vis() + // AO support + var/ao_enabled = client.is_preference_enabled(/datum/client_preference/ambient_occlusion) + plane_holder.set_ao(VIS_OBJS, ao_enabled) + plane_holder.set_ao(VIS_MOBS, ao_enabled) + //set macro to normal incase it was overriden (like cyborg currently does) client.set_hotkeys_macro("macro", "hotkeymode") diff --git a/code/modules/mob/mob_planes.dm b/code/modules/mob/mob_planes.dm index 9d252f762a..7534ca176c 100644 --- a/code/modules/mob/mob_planes.dm +++ b/code/modules/mob/mob_planes.dm @@ -11,6 +11,8 @@ my_mob = this_guy //It'd be nice to lazy init these but some of them are important to just EXIST. Like without ghost planemaster, you can see ghosts. Go figure. + + // 'Utility' planes plane_masters[VIS_FULLBRIGHT] = new /obj/screen/plane_master/fullbright //Lighting system (lighting_overlay objects) plane_masters[VIS_LIGHTING] = new /obj/screen/plane_master/lighting //Lighting system (but different!) plane_masters[VIS_GHOSTS] = new /obj/screen/plane_master/ghosts //Ghosts! @@ -33,6 +35,11 @@ plane_masters[VIS_MESONS] = new /obj/screen/plane_master{plane = PLANE_MESONS} //Meson-specific things like open ceilings. + // Real tangible stuff planes + plane_masters[VIS_TURFS] = new /obj/screen/plane_master/main{plane = TURF_PLANE} + plane_masters[VIS_OBJS] = new /obj/screen/plane_master/main{plane = OBJ_PLANE} + plane_masters[VIS_MOBS] = new /obj/screen/plane_master/main{plane = MOB_PLANE} + ..() /datum/plane_holder/Destroy() @@ -67,6 +74,17 @@ for(var/SP in subplanes) set_vis(which = SP, new_alpha = new_alpha) +/datum/plane_holder/proc/set_ao(var/which = null, var/enabled = FALSE) + ASSERT(which) + var/obj/screen/plane_master/PM = plane_masters[which] + if(!PM) + crash_with("Tried to set_ao [which] in plane_holder on [my_mob]!") + PM.set_ambient_occlusion(enabled) + if(PM.sub_planes) + var/list/subplanes = PM.sub_planes + for(var/SP in subplanes) + set_ao(SP, enabled) + /datum/plane_holder/proc/alter_values(var/which = null, var/list/values = null) ASSERT(which) var/obj/screen/plane_master/PM = plane_masters[which] @@ -121,6 +139,11 @@ new_alpha = sanitize_integer(new_alpha, 0, 255, 255) alpha = new_alpha +/obj/screen/plane_master/proc/set_ambient_occlusion(var/enabled = FALSE) + filters -= AMBIENT_OCCLUSION + if(enabled) + filters += AMBIENT_OCCLUSION + /obj/screen/plane_master/proc/alter_plane_values() return //Stub @@ -148,3 +171,9 @@ /obj/screen/plane_master/ghosts plane = PLANE_GHOSTS desired_alpha = 127 //When enabled, they're like half-transparent + +///////////////// +//The main game planes start normal and visible +/obj/screen/plane_master/main + alpha = 255 + mouse_opacity = 1 diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm index 665f95f694..5691cf3ebc 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -2,9 +2,10 @@ /mob/new_player var/ready = 0 - var/spawning = 0//Referenced when you want to delete the new_player later on in the code. - var/totalPlayers = 0 //Player counts for the Lobby tab + var/spawning = 0 //Referenced when you want to delete the new_player later on in the code. + var/totalPlayers = 0 //Player counts for the Lobby tab var/totalPlayersReady = 0 + var/show_hidden_jobs = 0 //Show jobs that are set to "Never" in preferences var/datum/browser/panel universal_speak = 1 @@ -115,7 +116,7 @@ if(alert(src,"Are you sure you wish to observe? You will have to wait 1 minute before being able to respawn!","Player Setup","Yes","No") == "Yes") if(!client) return 1 - + //Make a new mannequin quickly, and allow the observer to take the appearance var/mob/living/carbon/human/dummy/mannequin = new() client.prefs.dress_preview_mob(mannequin) @@ -291,6 +292,10 @@ handle_server_news() return + if(href_list["hidden_jobs"]) + show_hidden_jobs = !show_hidden_jobs + LateChoices() + /mob/new_player/proc/handle_server_news() if(!client) return @@ -421,10 +426,18 @@ dat += "The station is currently undergoing crew transfer procedures.
" dat += "Choose from the following open/valid positions:
" + dat += "[show_hidden_jobs ? "Hide":"Show"] Hidden Jobs.
" for(var/datum/job/job in job_master.occupations) if(job && IsJobAvailable(job.title)) + // Checks for jobs with minimum age requirements if(job.minimum_character_age && (client.prefs.age < job.minimum_character_age)) continue + // Checks for jobs set to "Never" in preferences //TODO: Figure out a better way to check for this + if(!(client.prefs.GetJobDepartment(job, 1) & job.flag)) + if(!(client.prefs.GetJobDepartment(job, 2) & job.flag)) + if(!(client.prefs.GetJobDepartment(job, 3) & job.flag)) + if(!show_hidden_jobs && job.title != "Assistant") // Assistant is always an option + continue var/active = 0 // Only players with the job assigned and AFK for less than 10 minutes count as active for(var/mob/M in player_list) if(M.mind && M.client && M.mind.assigned_role == job.title && M.client.inactivity <= 10 * 60 * 10) diff --git a/code/modules/mob/say.dm b/code/modules/mob/say.dm index 206450c909..0b20c6cb7f 100644 --- a/code/modules/mob/say.dm +++ b/code/modules/mob/say.dm @@ -21,8 +21,8 @@ if(say_disabled) //This is here to try to identify lag problems usr << "Speech is currently admin-disabled." return - - message = sanitize(message) + + message = sanitize_or_reflect(message,src) //VOREStation Edit - Reflect too-long messages (within reason) set_typing_indicator(FALSE) if(use_me) diff --git a/code/modules/mob/say_vr.dm b/code/modules/mob/say_vr.dm index 0608b26cce..fbf9a9febb 100644 --- a/code/modules/mob/say_vr.dm +++ b/code/modules/mob/say_vr.dm @@ -11,7 +11,7 @@ usr << "Speech is currently admin-disabled." return - message = sanitize(message) + message = sanitize_or_reflect(message,src) //VOREStation Edit - Reflect too-long messages (within reason) if(!message) return @@ -31,7 +31,7 @@ var/input if(!message) - input = sanitize(input(src,"Choose an emote to display.") as text|null) + input = sanitize_or_reflect(input(src,"Choose an emote to display.") as text|null, src) else input = message @@ -61,3 +61,31 @@ /mob/proc/emote_vr(var/act, var/type, var/message) //This would normally go in say.dm if(act == "me") return custom_emote_vr(type, message) + +#define MAX_HUGE_MESSAGE_LEN 8192 +#define POST_DELIMITER_STR "\<\>" +/proc/sanitize_or_reflect(message,user) + //Way too long to send + if(length(message) > MAX_HUGE_MESSAGE_LEN) + fail_to_chat(user) + return + + message = sanitize(message, max_length = MAX_HUGE_MESSAGE_LEN) + + //Came back still too long to send + if(length(message) > MAX_MESSAGE_LEN) + fail_to_chat(user,message) + return null + else + return message + +/proc/fail_to_chat(user,message) + if(!message) + to_chat(user,"Your message was NOT SENT, either because it was FAR too long, or sanitized to nothing at all.") + return + + var/length = length(message) + var/posts = Ceiling(length/MAX_MESSAGE_LEN) + to_chat(user,message) + to_chat(user,"^ This message was NOT SENT ^ -- It was [length] characters, and the limit is [MAX_MESSAGE_LEN]. It would fit in [posts] separate messages.") +#undef MAX_HUGE_MESSAGE_LEN diff --git a/code/modules/nifsoft/software/13_soulcatcher.dm b/code/modules/nifsoft/software/13_soulcatcher.dm index 9d2be6bdd2..4399a31f3a 100644 --- a/code/modules/nifsoft/software/13_soulcatcher.dm +++ b/code/modules/nifsoft/software/13_soulcatcher.dm @@ -230,6 +230,7 @@ if(ishuman(M)) var/mob/living/carbon/human/H = M brainmob.dna = H.dna + brainmob.ooc_notes = H.ooc_notes brainmob.timeofhostdeath = H.timeofdeath SStranscore.m_backup(brainmob.mind,0) //It does ONE, so medical will hear about it. diff --git a/code/modules/paperwork/carbonpaper.dm b/code/modules/paperwork/carbonpaper.dm index 32242e9669..7eb9843cc3 100644 --- a/code/modules/paperwork/carbonpaper.dm +++ b/code/modules/paperwork/carbonpaper.dm @@ -2,8 +2,8 @@ name = "paper" icon_state = "paper_stack" item_state = "paper" - var copied = 0 - var iscopy = 0 + var/copied = 0 + var/iscopy = 0 /obj/item/weapon/paper/carbon/update_icon() @@ -48,4 +48,4 @@ copy.update_icon() c.update_icon() else - usr << "There are no more carbon copies attached to this paper!" \ No newline at end of file + usr << "There are no more carbon copies attached to this paper!" diff --git a/code/modules/paperwork/photography.dm b/code/modules/paperwork/photography.dm index 4c0f6bed0e..488bb7c8b6 100644 --- a/code/modules/paperwork/photography.dm +++ b/code/modules/paperwork/photography.dm @@ -131,7 +131,7 @@ var/global/photo_count = 0 var/icon_on = "camera" var/icon_off = "camera_off" var/size = 3 - var/picture_planes = list(PLANE_WORLD) + var/picture_planes = list() /obj/item/device/camera/verb/change_size() set name = "Set Photo Focus" @@ -182,7 +182,7 @@ var/global/photo_count = 0 // As well as anything that isn't invisible. for(var/atom/A in the_turf) if(A.invisibility) continue - if(!(A.plane in picture_planes)) continue + if(A.plane > 0 && !(A.plane in picture_planes)) continue atoms.Add(A) // Sort the atoms into their layers diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index 2de88c942d..8478aac50c 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -64,6 +64,8 @@ desc = "A control terminal for the area electrical systems." icon = 'icons/obj/power_vr.dmi' //VOREStation Edit - New Icon icon_state = "apc0" + plane = TURF_PLANE + layer = ABOVE_TURF_LAYER anchored = 1 use_power = 0 req_access = list(access_engine_equip) diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm index 5a7d8b363b..72ff6333a0 100644 --- a/code/modules/power/lighting.dm +++ b/code/modules/power/lighting.dm @@ -161,7 +161,7 @@ layer = ABOVE_MOB_LAYER use_power = 2 idle_power_usage = 2 - active_power_usage = 20 + active_power_usage = 20 // VOREStation Edit - Keep lights at 20 power power_channel = LIGHT //Lights are calc'd via area so they dont need to be in the machine list var/on = 0 // 1 if on, 0 if off var/brightness_range = 10 // luminosity when on, also used in power calculation // VOREStation Edit - Put light range back how it was for now. diff --git a/code/modules/power/singularity/collector.dm b/code/modules/power/singularity/collector.dm index 9dbec38fe9..7354faea9e 100644 --- a/code/modules/power/singularity/collector.dm +++ b/code/modules/power/singularity/collector.dm @@ -56,7 +56,6 @@ var/global/list/rad_collectors = list() else user << "The controls are locked!" return -..() /obj/machinery/power/rad_collector/attackby(obj/item/W, mob/user) diff --git a/code/modules/projectiles/ammunition/magazines.dm b/code/modules/projectiles/ammunition/magazines.dm index 94cf0ab21e..0c3c76caaf 100644 --- a/code/modules/projectiles/ammunition/magazines.dm +++ b/code/modules/projectiles/ammunition/magazines.dm @@ -472,7 +472,7 @@ /obj/item/ammo_magazine/m44 name = "magazine (.44)" - icon_state = "44" + icon_state = "m44" origin_tech = list(TECH_COMBAT = 2) mag_type = MAGAZINE caliber = ".44" diff --git a/code/modules/projectiles/guns/projectile/shotgun.dm b/code/modules/projectiles/guns/projectile/shotgun.dm index 087543091d..183ead39d1 100644 --- a/code/modules/projectiles/guns/projectile/shotgun.dm +++ b/code/modules/projectiles/guns/projectile/shotgun.dm @@ -41,6 +41,9 @@ update_icon() +/obj/item/weapon/gun/projectile/shotgun/pump/slug + ammo_type = /obj/item/ammo_casing/a12g + /obj/item/weapon/gun/projectile/shotgun/pump/combat name = "combat shotgun" desc = "Built for close quarters combat, the Hephaestus Industries KS-40 is widely regarded as a weapon of choice for repelling boarders. Uses 12g rounds." diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm index 5ec7aae23a..45af53eb87 100644 --- a/code/modules/reagents/reagent_dispenser.dm +++ b/code/modules/reagents/reagent_dispenser.dm @@ -5,6 +5,8 @@ desc = "..." icon = 'icons/obj/objects.dmi' icon_state = "watertank" + plane = TURF_PLANE + layer = ABOVE_TURF_LAYER density = 1 anchored = 0 pressure_resistance = 2*ONE_ATMOSPHERE diff --git a/code/modules/research/designs_vr.dm b/code/modules/research/designs_vr.dm index 02b71645da..e074323cbd 100644 --- a/code/modules/research/designs_vr.dm +++ b/code/modules/research/designs_vr.dm @@ -180,6 +180,61 @@ build_path = /obj/item/weapon/circuitboard/quantumpad sort_string = "HABAH" +//////Micro mech stuff +/datum/design/circuit/mecha/gopher_main + name = "'Gopher' central control" + id = "gopher_main" + build_path = /obj/item/weapon/circuitboard/mecha/gopher/main + sort_string = "NAAEA" + +/datum/design/circuit/mecha/gopher_peri + name = "'Gopher' peripherals control" + id = "gopher_peri" + build_path = /obj/item/weapon/circuitboard/mecha/gopher/peripherals + sort_string = "NAAEB" + +/datum/design/circuit/mecha/polecat_main + name = "'Polecat' central control" + id = "polecat_main" + req_tech = list(TECH_DATA = 4) + build_path = /obj/item/weapon/circuitboard/mecha/polecat/main + sort_string = "NAAFA" + +/datum/design/circuit/mecha/polecat_peri + name = "'Polecat' peripherals control" + id = "polecat_peri" + req_tech = list(TECH_DATA = 4) + build_path = /obj/item/weapon/circuitboard/mecha/polecat/peripherals + sort_string = "NAAFB" + +/datum/design/circuit/mecha/polecat_targ + name = "'Polecat' weapon control and targeting" + id = "polecat_targ" + req_tech = list(TECH_DATA = 4, TECH_COMBAT = 2) + build_path = /obj/item/weapon/circuitboard/mecha/polecat/targeting + sort_string = "NAAFC" + +/datum/design/circuit/mecha/weasel_main + name = "'Weasel' central control" + id = "weasel_main" + req_tech = list(TECH_DATA = 4) + build_path = /obj/item/weapon/circuitboard/mecha/weasel/main + sort_string = "NAAGA" + +/datum/design/circuit/mecha/weasel_peri + name = "'Weasel' peripherals control" + id = "weasel_peri" + req_tech = list(TECH_DATA = 4) + build_path = /obj/item/weapon/circuitboard/mecha/weasel/peripherals + sort_string = "NAAGB" + +/datum/design/circuit/mecha/weasel_targ + name = "'Weasel' weapon control and targeting" + id = "weasel_targ" + req_tech = list(TECH_DATA = 4, TECH_COMBAT = 2) + build_path = /obj/item/weapon/circuitboard/mecha/weasel/targeting + sort_string = "NAAGC" + ////// RIGSuit Stuff /* /datum/design/item/rig diff --git a/code/modules/resleeving/infocore_records.dm b/code/modules/resleeving/infocore_records.dm index db9bbfa8ea..834b067e9d 100644 --- a/code/modules/resleeving/infocore_records.dm +++ b/code/modules/resleeving/infocore_records.dm @@ -26,6 +26,7 @@ var/nif_path var/nif_durability var/list/nif_software + var/list/nif_savedata = list() var/one_time = FALSE @@ -42,7 +43,7 @@ cryo_at = 0 //Mental stuff the game doesn't keep mentally - if(istype(M)) + if(istype(M) || istype(M,/mob/living/carbon/brain/caught_soul)) id_gender = M.identifying_gender languages = M.languages.Copy() mind_oocnotes = M.ooc_notes @@ -55,6 +56,7 @@ var/datum/nifsoft/nifsoft = N nifsofts += nifsoft.type nif_software = nifsofts + nif_savedata = M.nif.save_data.Copy() last_update = world.time diff --git a/code/modules/resleeving/machines.dm b/code/modules/resleeving/machines.dm index ced1dcc634..4cb6793734 100644 --- a/code/modules/resleeving/machines.dm +++ b/code/modules/resleeving/machines.dm @@ -526,9 +526,10 @@ //Re-supply a NIF if one was backed up with them. if(MR.nif_path) - var/obj/item/device/nif/nif = new MR.nif_path(occupant,MR.nif_durability) + var/obj/item/device/nif/nif = new MR.nif_path(occupant,null,MR.nif_savedata) for(var/path in MR.nif_software) new path(nif) + nif.durability = MR.nif_durability //Restore backed up durability after restoring the softs. // If it was a custom sleeve (not owned by anyone), update namification sequences if(!occupant.original_player) diff --git a/code/modules/shieldgen/shield_diffuser.dm b/code/modules/shieldgen/shield_diffuser.dm index 1d2edb43cb..c30f8a7351 100644 --- a/code/modules/shieldgen/shield_diffuser.dm +++ b/code/modules/shieldgen/shield_diffuser.dm @@ -5,8 +5,8 @@ icon = 'icons/obj/machines/shielding.dmi' icon_state = "fdiffuser_on" use_power = 2 - idle_power_usage = 100 - active_power_usage = 2000 + idle_power_usage = 25 // Previously 100. + active_power_usage = 500 // Previously 2000 anchored = 1 density = 0 level = 1 diff --git a/code/modules/telesci/construction.dm b/code/modules/telesci/construction.dm index 5143733a47..9fc487f058 100644 --- a/code/modules/telesci/construction.dm +++ b/code/modules/telesci/construction.dm @@ -47,7 +47,7 @@ req_tech = list(TECH_DATA = 4, TECH_ENGINEERING = 4, TECH_PHORON = 4, TECH_BLUESPACE = 5) build_path = /obj/item/weapon/circuitboard/telesci_pad sort_string = "HAAEB" - +/* Normal GPS has all the fancy features now /datum/design/item/telesci_gps name = "GPS device" id = "telesci_gps" @@ -55,7 +55,7 @@ materials = list(DEFAULT_WALL_MATERIAL = 500, "glass" = 1000) build_path = /obj/item/device/gps/advanced sort_string = "HAAEB" - +*/ /datum/design/circuit/quantum_pad name = "Quantum Pad" id = "quantum_pad" diff --git a/code/modules/telesci/gps_advanced.dm b/code/modules/telesci/gps_advanced.dm index fb1d8e16b6..59711deced 100644 --- a/code/modules/telesci/gps_advanced.dm +++ b/code/modules/telesci/gps_advanced.dm @@ -1,3 +1,6 @@ + +// DEPRECATED - The normal GPS has the advanced features, now. This is obsolete. + // These are distinguished from the ordinary "Relay Position Devices" that just print your location // In that they are also all networked with each other to show each other's locations. /obj/item/device/gps/advanced diff --git a/code/modules/vore/appearance/sprite_accessories_taur_vr.dm b/code/modules/vore/appearance/sprite_accessories_taur_vr.dm index 0b2487a2a7..eec5c192b7 100644 --- a/code/modules/vore/appearance/sprite_accessories_taur_vr.dm +++ b/code/modules/vore/appearance/sprite_accessories_taur_vr.dm @@ -28,9 +28,9 @@ /datum/riding/taur/get_offsets(pass_index) // list(dir = x, y, layer) var/mob/living/L = ridden var/scale = L.size_multiplier - + var/list/values = list( - "[NORTH]" = list(0, 8*scale, ABOVE_MOB_LAYER), + "[NORTH]" = list(0, 8*scale, ABOVE_MOB_LAYER), "[SOUTH]" = list(0, 8*scale, BELOW_MOB_LAYER), "[EAST]" = list(-10*scale, 8*scale, BELOW_MOB_LAYER), "[WEST]" = list(10*scale, 8*scale, BELOW_MOB_LAYER)) @@ -53,6 +53,10 @@ return ..() // Skip our checks if(!isTaurTail(tail_style)) return FALSE + else + var/datum/sprite_accessory/tail/taur/taurtype = tail_style + if(!taurtype.can_ride) + return FALSE if(lying) return FALSE if(!ishuman(M)) @@ -60,13 +64,13 @@ if(M.size_multiplier > size_multiplier) to_chat(M,"This isn't a pony show! They need to be bigger to ride.") return FALSE - + var/mob/living/carbon/human/H = M if(isTaurTail(H.tail_style)) to_chat(H,"Too many legs. TOO MANY LEGS!!") return FALSE - + . = ..() if(.) buckled_mobs[M] = "riding" @@ -107,6 +111,7 @@ var/icon/suit_sprites = null //File for suit sprites, if any. + var/can_ride = 1 //whether we're real rideable taur or just in that category //Could do nested lists but it started becoming a nightmare. It'd be more fun for lookups of a_intent and m_intent, but then subtypes need to //duplicate all the messages, and it starts getting awkward. These are singletons, anyway! @@ -295,6 +300,7 @@ /datum/sprite_accessory/tail/taur/tents name = "Tentacles (Taur)" icon_state = "tent_s" + can_ride = 0 msg_prey_stepunder = "You run between %prey's tentacles." msg_owner_stepunder = "%owner runs between your tentacles." @@ -417,18 +423,26 @@ ani_state = "alraune_closed_s" ckeys_allowed = list("natje") do_colouration = 0 + can_ride = 0 - msg_owner_disarm_run = "You quickly push %prey to the ground with your leg!" - msg_prey_disarm_run = "%owner pushes you down to the ground with their leg!" - msg_owner_disarm_walk = "You firmly push your leg down on %prey, painfully but harmlessly pinning them to the ground!" - msg_prey_disarm_walk = "%owner firmly pushes their leg down on you, quite painfully but harmlessly pinning you to the ground!" + msg_prey_stepunder = "You run between %prey's vines." + msg_owner_stepunder = "%owner runs between your vines." - msg_owner_harm_walk = "You methodically place your leg down upon %prey's body, slowly applying pressure, crushing them against the floor below!" - msg_prey_harm_walk = "%owner methodically places their leg upon your body, slowly applying pressure, crushing you against the floor below!" + msg_owner_disarm_run = "You quickly push %prey to the ground with some of your vines!" + msg_prey_disarm_run = "%owner pushes you down to the ground with some of their vines!" - msg_owner_grab_success = "You pin %prey down on the ground with your front leg before using your other leg to pick them up, trapping them between two of your front legs!" - msg_prey_grab_success = "%owner pins you down on the ground with their front leg before using their other leg to pick you up, trapping you between two of their front legs!" + msg_owner_disarm_walk = "You push down on %prey with some of your vines, pinning them down firmly under you!" + msg_prey_disarm_walk = "%owner pushes down on you with some of their vines, pinning you down firmly below them!" - msg_owner_grab_fail = "You step down onto %prey, squishing them and forcing them down to the ground!" - msg_prey_grab_fail = "%owner steps down and squishes you with their leg, forcing you down to the ground!" + msg_owner_harm_run = "Your vines carelessly slide past %prey, crushing them!" + msg_prey_harm_run = "%owner quickly goes over your body, carelessly crushing you with their vines!" + + msg_owner_harm_walk = "Your vines methodically apply pressure on %prey's body, crushing them against the floor below!" + msg_prey_harm_walk = "%owner's thick vines methodically apply pressure on your body, crushing you into the floor below!" + + msg_owner_grab_success = "You slide over %prey with your vines, smushing them against the ground before wrapping one up around them, trapping them within the tight confines of your vines!" + msg_prey_grab_success = "%owner slides over you with their vines, smushing you against the ground before wrapping one up around you, trapping you within the tight confines of their vines!" + + msg_owner_grab_fail = "You step down onto %prey with one of your vines, forcing them onto the ground!" + msg_prey_grab_fail = "%owner steps down onto you with one of their vines, squishing you and forcing you onto the ground!" diff --git a/code/modules/vore/appearance/sprite_accessories_vr.dm b/code/modules/vore/appearance/sprite_accessories_vr.dm index 5ea245462c..13c2f7b2da 100644 --- a/code/modules/vore/appearance/sprite_accessories_vr.dm +++ b/code/modules/vore/appearance/sprite_accessories_vr.dm @@ -1,6 +1,6 @@ /* Hello and welcome to VOREStation sprite_accessories: For a more general overview - please read sprite_accessories.dm. This file is for ears, tails, and taur bodies! + please read sprite_accessories.dm. This file is for ears and tails. This is intended to be friendly for people with little to no actual coding experience. !!WARNING!!: changing existing accessory information can be VERY hazardous to savefiles, to the point where you may completely corrupt a server's savefiles. Please refrain @@ -815,6 +815,13 @@ icon_state = "tigresstail" ckeys_allowed = list("hoodoo") +/datum/sprite_accessory/tail/satyr + name = "goat legs, colorable" + desc = "" + icon_state = "satyr" + color_blend_mode = ICON_MULTIPLY + do_colouration = 1 + /datum/sprite_accessory/tail/tailmaw name = "tailmaw, colorable" desc = "" diff --git a/code/modules/vore/eating/bellymodes_vr.dm b/code/modules/vore/eating/bellymodes_vr.dm index 39219aa1ad..62fc770e49 100644 --- a/code/modules/vore/eating/bellymodes_vr.dm +++ b/code/modules/vore/eating/bellymodes_vr.dm @@ -126,18 +126,23 @@ continue // Deal digestion damage (and feed the pred) + var/old_brute = M.getBruteLoss() + var/old_burn = M.getFireLoss() M.adjustBruteLoss(digest_brute) M.adjustFireLoss(digest_burn) + var/actual_brute = M.getBruteLoss() - old_brute + var/actual_burn = M.getFireLoss() - old_burn + var/damage_gain = actual_brute + actual_burn var/offset = (1 + ((M.weight - 137) / 137)) // 130 pounds = .95 140 pounds = 1.02 var/difference = owner.size_multiplier / M.size_multiplier if(isrobot(owner)) var/mob/living/silicon/robot/R = owner - R.cell.charge += 25*(digest_brute+digest_burn) + R.cell.charge += 25*damage_gain if(offset) // If any different than default weight, multiply the % of offset. - owner.nutrition += offset*(4.5*(digest_brute+digest_burn)/difference) //4.5 nutrition points per health point. Normal same size 100+100 health prey with average weight would give 900 points if the digestion was instant. With all the size/weight offset taxes plus over time oxyloss+hunger taxes deducted with non-instant digestion, this should be enough to not leave the pred starved. + owner.nutrition += offset*(4.5*(damage_gain)/difference) //4.5 nutrition points per health point. Normal same size 100+100 health prey with average weight would give 900 points if the digestion was instant. With all the size/weight offset taxes plus over time oxyloss+hunger taxes deducted with non-instant digestion, this should be enough to not leave the pred starved. else - owner.nutrition += 4.5*(digest_brute+digest_burn)/difference + owner.nutrition += 4.5*(damage_gain)/difference //////////////////////////// DM_ABSORB //////////////////////////// diff --git a/code/modules/vore/eating/contaminate_vr.dm b/code/modules/vore/eating/contaminate_vr.dm index 92964b519b..e1d6a0f6c1 100644 --- a/code/modules/vore/eating/contaminate_vr.dm +++ b/code/modules/vore/eating/contaminate_vr.dm @@ -103,8 +103,10 @@ var/image/gurgled_overlay = image('icons/effects/sludgeoverlay_vr.dmi') return TRUE /obj/item/weapon/holder/gurgle_contaminate(var/atom/movable/item_storage = null) - digest_act(item_storage) - return TRUE + if(isbelly(loc)) + digest_act(item_storage) + return TRUE + return FALSE /obj/item/organ/gurgle_contaminate(var/atom/movable/item_storage = null) digest_act(item_storage) diff --git a/code/modules/vore/eating/vore_vr.dm b/code/modules/vore/eating/vore_vr.dm index 2205e54432..d6939e9c95 100644 --- a/code/modules/vore/eating/vore_vr.dm +++ b/code/modules/vore/eating/vore_vr.dm @@ -111,7 +111,7 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE allowmobvore = json_from_file["allowmobvore"] vore_taste = json_from_file["vore_taste"] can_be_drop_prey = json_from_file["can_be_drop_prey"] - can_be_drop_prey = json_from_file["can_be_drop_pred"] + can_be_drop_pred = json_from_file["can_be_drop_pred"] belly_prefs = json_from_file["belly_prefs"] //Quick sanitize diff --git a/code/modules/vore/resizing/resize_vr.dm b/code/modules/vore/resizing/resize_vr.dm index 9e957955b8..23987a3fed 100644 --- a/code/modules/vore/resizing/resize_vr.dm +++ b/code/modules/vore/resizing/resize_vr.dm @@ -242,14 +242,14 @@ var/const/RESIZE_A_SMALLTINY = (RESIZE_SMALL + RESIZE_TINY) / 2 //Not a human, or not a taur, generic message only if(!H || !isTaurTail(H.tail_style)) - to_chat(src,"You quickly push [tmob] to the ground with your foot!") - to_chat(tmob,"[src] pushes you down to the ground with their foot!") + to_chat(src,"You quickly push [tmob] to the ground with your foot!") + to_chat(tmob,"[src] pushes you down to the ground with their foot!") //Human with taur tail, special messages are sent else var/datum/sprite_accessory/tail/taur/tail = H.tail_style - to_chat(src,STEP_TEXT_OWNER(tail.msg_owner_disarm_run)) - to_chat(tmob,STEP_TEXT_PREY(tail.msg_prey_disarm_run)) + to_chat(src,STEP_TEXT_OWNER("[tail.msg_owner_disarm_run]")) + to_chat(tmob,STEP_TEXT_PREY("[tail.msg_prey_disarm_run]")) //Walking on I_DISARM else @@ -264,14 +264,14 @@ var/const/RESIZE_A_SMALLTINY = (RESIZE_SMALL + RESIZE_TINY) / 2 //Not a human, or not a taur, generic message only if(!H || !isTaurTail(H.tail_style)) - to_chat(src,"You firmly push your foot down on [tmob], painfully but harmlessly pinning them to the ground!") - to_chat(tmob,"[src] firmly pushes their foot down on you, quite painfully but harmlessly pinning you to the ground!") + to_chat(src,"You firmly push your foot down on [tmob], painfully but harmlessly pinning them to the ground!") + to_chat(tmob,"[src] firmly pushes their foot down on you, quite painfully but harmlessly pinning you to the ground!") //Human with taur tail, special messages are sent else var/datum/sprite_accessory/tail/taur/tail = H.tail_style - to_chat(src,STEP_TEXT_OWNER(tail.msg_owner_disarm_walk)) - to_chat(tmob,STEP_TEXT_PREY(tail.msg_prey_disarm_walk)) + to_chat(src,STEP_TEXT_OWNER("[tail.msg_owner_disarm_walk]")) + to_chat(tmob,STEP_TEXT_PREY("[tail.msg_prey_disarm_walk]")) //Return true, the sizediff was enough that we handled it. return TRUE @@ -297,14 +297,14 @@ var/const/RESIZE_A_SMALLTINY = (RESIZE_SMALL + RESIZE_TINY) / 2 //Not a human, or not a taur, generic message only if(!H || !isTaurTail(H.tail_style)) - to_chat(src,"You carelessly step down onto [tmob], crushing them!") - to_chat(tmob,"[src] steps carelessly on your body, crushing you!") + to_chat(src,"You carelessly step down onto [tmob], crushing them!") + to_chat(tmob,"[src] steps carelessly on your body, crushing you!") //Human with taur tail, special messages are sent else var/datum/sprite_accessory/tail/taur/tail = H.tail_style - to_chat(src,STEP_TEXT_OWNER(tail.msg_owner_harm_run)) - to_chat(tmob,STEP_TEXT_PREY(tail.msg_prey_harm_run)) + to_chat(src,STEP_TEXT_OWNER("[tail.msg_owner_harm_run]")) + to_chat(tmob,STEP_TEXT_PREY("[tail.msg_prey_harm_run]")) //If they are a human, do damage (doesn't hurt other mobs...?) if(Ht) @@ -327,14 +327,14 @@ var/const/RESIZE_A_SMALLTINY = (RESIZE_SMALL + RESIZE_TINY) / 2 //Not a human, or not a taur, generic message only if(!H || !isTaurTail(H.tail_style)) - to_chat(src,"You methodically place your foot down upon [tmob]'s body, slowly applying pressure, crushing them against the floor below!") - to_chat(tmob,"[src] methodically places their foot upon your body, slowly applying pressure, crushing you against the floor below!") + to_chat(src,"You methodically place your foot down upon [tmob]'s body, slowly applying pressure, crushing them against the floor below!") + to_chat(tmob,"[src] methodically places their foot upon your body, slowly applying pressure, crushing you against the floor below!") //Human with taur tail, special messages are sent else var/datum/sprite_accessory/tail/taur/tail = H.tail_style - to_chat(src,STEP_TEXT_OWNER(tail.msg_owner_harm_walk)) - to_chat(tmob,STEP_TEXT_PREY(tail.msg_prey_harm_walk)) + to_chat(src,STEP_TEXT_OWNER("[tail.msg_owner_harm_walk]")) + to_chat(tmob,STEP_TEXT_PREY("[tail.msg_prey_harm_walk]")) //Return true, the sizediff was enough that we handled it. return TRUE @@ -353,29 +353,29 @@ var/const/RESIZE_A_SMALLTINY = (RESIZE_SMALL + RESIZE_TINY) / 2 //Not a human, or not a taur while wearing shoes = no grab if(!H || (!isTaurTail(H.tail_style) && H.shoes)) - to_chat(src,"You step down onto [tmob], squishing them and forcing them down to the ground!") - to_chat(tmob,"[src] steps down and squishes you with their foot, forcing you down to the ground!") + to_chat(src,"You step down onto [tmob], squishing them and forcing them down to the ground!") + to_chat(tmob,"[src] steps down and squishes you with their foot, forcing you down to the ground!") add_attack_logs(src,tmob,"Grabbed underfoot (nontaur, shoes)") //Human, not a taur, but not wearing shoes = yes grab else if(H && (!isTaurTail(H.tail_style) && !H.shoes)) - to_chat(src,"You pin [tmob] down onto the floor with your foot and curl your toes up around their body, trapping them inbetween them!") - to_chat(tmob,"[src] pins you down to the floor with their foot and curls their toes up around your body, trapping you inbetween them!") + to_chat(src,"You pin [tmob] down onto the floor with your foot and curl your toes up around their body, trapping them inbetween them!") + to_chat(tmob,"[src] pins you down to the floor with their foot and curls their toes up around your body, trapping you inbetween them!") equip_to_slot_if_possible(tmob.get_scooped(H), slot_shoes, 0, 1) add_attack_logs(src,tmob,"Grabbed underfoot (nontaur, no shoes)") //Human, taur, shoes = no grab, special message else if(H.shoes) var/datum/sprite_accessory/tail/taur/tail = H.tail_style - to_chat(src,STEP_TEXT_OWNER(tail.msg_owner_grab_fail)) - to_chat(tmob,STEP_TEXT_PREY(tail.msg_prey_grab_fail)) + to_chat(src,STEP_TEXT_OWNER("[tail.msg_owner_grab_fail]")) + to_chat(tmob,STEP_TEXT_PREY("[tail.msg_prey_grab_fail]")) add_attack_logs(src,tmob,"Grabbed underfoot (taur, shoes)") //Human, taur, no shoes = yes grab, special message else var/datum/sprite_accessory/tail/taur/tail = H.tail_style - to_chat(src,STEP_TEXT_OWNER(tail.msg_owner_grab_success)) - to_chat(tmob,STEP_TEXT_PREY(tail.msg_prey_grab_success)) + to_chat(src,STEP_TEXT_OWNER("[tail.msg_owner_grab_success]")) + to_chat(tmob,STEP_TEXT_PREY("[tail.msg_prey_grab_success]")) equip_to_slot_if_possible(tmob.get_scooped(H), slot_shoes, 0, 1) add_attack_logs(src,tmob,"Grabbed underfoot (taur, no shoes)") diff --git a/code/modules/xenoarcheaology/finds/misc.dm b/code/modules/xenoarcheaology/finds/misc.dm index 129033bf6e..cc02a7f41b 100644 --- a/code/modules/xenoarcheaology/finds/misc.dm +++ b/code/modules/xenoarcheaology/finds/misc.dm @@ -19,6 +19,20 @@ else set_light(3, 3, "#33CC33") +/obj/machinery/crystal/alt + name = "Crystal" + icon = 'icons/obj/mining.dmi' + icon_state = "crystal" + density = TRUE + anchored = TRUE + +/obj/machinery/crystal/alt/New() + if(prob(50)) + icon_state = "crystal2" + set_light(3, 3, "#CC00CC") + else + set_light(3, 3, "#33CC33") + /obj/machinery/crystal/ice //slightly more thematic crystals name = "ice crystal" desc = "A large crystalline ice formation." diff --git a/config/alienwhitelist.txt b/config/alienwhitelist.txt index 2b6dad6982..18604aaf62 100644 --- a/config/alienwhitelist.txt +++ b/config/alienwhitelist.txt @@ -9,6 +9,7 @@ funnyman2003 - Xenochimera hawkerthegreat - Vox inuzari - Diona jemli - Gutter +ktccd - Diona mewchild - Diona mewchild - Vox natje - Xenochimera diff --git a/html/changelog.html b/html/changelog.html index 6f16ef8461..ae3d6222bd 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -53,6 +53,31 @@ -->
+

28 April 2018

+

Anewbe updated:

+ +

Arokha updated:

+ +

Atermonera updated:

+ +

Cerebulon updated:

+ +

schnayy updated:

+ +

19 April 2018

Anewbe updated: