diff --git a/_maps/map_files/cyberiad/cyberiad.dmm b/_maps/map_files/cyberiad/cyberiad.dmm index 02bd3ad1e7c..b83e173d404 100644 --- a/_maps/map_files/cyberiad/cyberiad.dmm +++ b/_maps/map_files/cyberiad/cyberiad.dmm @@ -5205,10 +5205,7 @@ pixel_x = 0; pixel_y = 10 }, -/obj/item/stock_parts/cell/high{ - charge = 100; - maxcharge = 15000 - }, +/obj/item/stock_parts/cell/high/plus, /obj/effect/decal/warning_stripes/east, /obj/item/clothing/glasses/welding, /obj/item/radio/intercom/department/security{ @@ -24484,14 +24481,8 @@ "aRZ" = ( /obj/structure/table, /obj/machinery/cell_charger, -/obj/item/stock_parts/cell/high{ - charge = 100; - maxcharge = 15000 - }, -/obj/item/stock_parts/cell/high{ - charge = 100; - maxcharge = 15000 - }, +/obj/item/stock_parts/cell/high/plus, +/obj/item/stock_parts/cell/high/plus, /turf/simulated/floor/plating, /area/maintenance/electrical) "aSa" = ( @@ -49466,10 +49457,7 @@ "bNN" = ( /obj/structure/table, /obj/machinery/cell_charger, -/obj/item/stock_parts/cell/high{ - charge = 100; - maxcharge = 15000 - }, +/obj/item/stock_parts/cell/high/plus, /obj/item/radio/intercom{ frequency = 1459; name = "station intercom (General)"; @@ -50524,13 +50512,8 @@ pixel_x = -8; pixel_y = 4 }, -/obj/item/stock_parts/cell/high{ - charge = 100; - maxcharge = 15000 - }, -/obj/item/stock_parts/cell/high{ - charge = 100; - maxcharge = 15000; +/obj/item/stock_parts/cell/high/plus, +/obj/item/stock_parts/cell/high/plus{ pixel_x = 5; pixel_y = -5 }, @@ -53785,10 +53768,7 @@ "bUQ" = ( /obj/structure/table, /obj/machinery/cell_charger, -/obj/item/stock_parts/cell/high{ - charge = 100; - maxcharge = 15000 - }, +/obj/item/stock_parts/cell/high/plus, /turf/simulated/floor/plasteel{ icon_state = "white" }, @@ -70403,10 +70383,7 @@ "cvA" = ( /obj/structure/table, /obj/item/plant_analyzer, -/obj/item/stock_parts/cell/high{ - charge = 100; - maxcharge = 15000 - }, +/obj/item/stock_parts/cell/high/plus, /turf/simulated/floor/plating, /area/storage/tech) "cvB" = ( @@ -74447,10 +74424,7 @@ pixel_y = 3 }, /obj/item/stack/cable_coil, -/obj/item/stock_parts/cell/high{ - charge = 100; - maxcharge = 15000 - }, +/obj/item/stock_parts/cell/high/plus, /turf/simulated/floor/plating, /area/storage/tech) "cCP" = ( @@ -84452,14 +84426,8 @@ /obj/item/rcd_ammo, /obj/item/rcd_ammo, /obj/item/rcd_ammo, -/obj/item/stock_parts/cell/high{ - charge = 100; - maxcharge = 15000 - }, -/obj/item/stock_parts/cell/high{ - charge = 100; - maxcharge = 15000 - }, +/obj/item/stock_parts/cell/high/plus, +/obj/item/stock_parts/cell/high/plus, /obj/item/clothing/glasses/meson{ pixel_y = 4 }, @@ -85173,10 +85141,7 @@ }, /obj/item/airlock_electronics, /obj/item/airlock_electronics, -/obj/item/stock_parts/cell/high{ - charge = 100; - maxcharge = 15000 - }, +/obj/item/stock_parts/cell/high/plus, /obj/effect/decal/warning_stripes/west, /turf/simulated/floor/plating, /area/storage/secure) @@ -88466,14 +88431,8 @@ "dbO" = ( /obj/structure/table/reinforced, /obj/machinery/cell_charger, -/obj/item/stock_parts/cell/high{ - charge = 100; - maxcharge = 15000 - }, -/obj/item/stock_parts/cell/high{ - charge = 100; - maxcharge = 15000 - }, +/obj/item/stock_parts/cell/high/plus, +/obj/item/stock_parts/cell/high/plus, /obj/item/stack/cable_coil{ pixel_x = 3; pixel_y = -7 diff --git a/code/datums/supplypacks.dm b/code/datums/supplypacks.dm index 100f7f645ec..8e20ebb7a93 100644 --- a/code/datums/supplypacks.dm +++ b/code/datums/supplypacks.dm @@ -1422,7 +1422,7 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine name = "Shaft Miner Starter Kit" cost = 30 access = access_qm - contains = list(/obj/item/storage/backpack/duffel/mining_conscript/noid) + contains = list(/obj/item/storage/backpack/duffel/mining_conscript) containertype = /obj/structure/closet/crate/secure containername = "shaft miner starter kit" @@ -1951,4 +1951,4 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine name = "Chinese Supply Crate" contains = list(/obj/item/vending_refill/chinese) cost = 15 - containername = "chinese supply crate" \ No newline at end of file + containername = "chinese supply crate" diff --git a/code/game/gamemodes/changeling/powers/revive.dm b/code/game/gamemodes/changeling/powers/revive.dm index 740d9fb25dc..dc07ec9b369 100644 --- a/code/game/gamemodes/changeling/powers/revive.dm +++ b/code/game/gamemodes/changeling/powers/revive.dm @@ -57,6 +57,7 @@ user.update_blind_effects() user.update_blurry_effects() user.mind.changeling.regenerating = FALSE + user.UpdateAppearance() //Ensures that the user's appearance matches their DNA. to_chat(user, "We have regenerated.") diff --git a/code/game/gamemodes/miniantags/abduction/abduction_surgery.dm b/code/game/gamemodes/miniantags/abduction/abduction_surgery.dm index d4d791c5b19..5b7aa52a6f6 100644 --- a/code/game/gamemodes/miniantags/abduction/abduction_surgery.dm +++ b/code/game/gamemodes/miniantags/abduction/abduction_surgery.dm @@ -1,5 +1,5 @@ /datum/surgery/organ_extraction - name = "experimental dissection" + name = "Experimental Dissection" steps = list(/datum/surgery_step/generic/cut_open, /datum/surgery_step/generic/clamp_bleeders, /datum/surgery_step/generic/retract_skin, /datum/surgery_step/open_encased/saw, /datum/surgery_step/open_encased/retract, /datum/surgery_step/internal/extract_organ, /datum/surgery_step/internal/gland_insert, /datum/surgery_step/generic/cauterize) possible_locs = list("chest") @@ -19,17 +19,16 @@ return TRUE return FALSE - /datum/surgery_step/internal/extract_organ name = "remove heart" accept_hand = 1 time = 32 var/obj/item/organ/internal/IC = null - var/list/organ_types = list(/obj/item/organ/internal/heart) /datum/surgery_step/internal/extract_organ/begin_step(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) for(var/obj/item/I in target.internal_organs) - if(I.type in organ_types) + // Allows for multiple subtypes of heart. + if(istype(I, /obj/item/organ/internal/heart)) IC = I break user.visible_message("[user] starts to remove [target]'s organs.", "You start to remove [target]'s organs...") @@ -37,14 +36,14 @@ /datum/surgery_step/internal/extract_organ/end_step(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) var/mob/living/carbon/human/AB = target - if(NO_INTORGANS in AB.dna.species.species_traits) - user.visible_message("[user] prepares [target]'s [target_zone] for further dissection!", "You prepare [target]'s [target_zone] for further dissection.") - return TRUE if(IC) user.visible_message("[user] pulls [IC] out of [target]'s [target_zone]!", "You pull [IC] out of [target]'s [target_zone].") user.put_in_hands(IC) IC.remove(target, special = 1) return TRUE + if(NO_INTORGANS in AB.dna.species.species_traits) + user.visible_message("[user] prepares [target]'s [target_zone] for further dissection!", "You prepare [target]'s [target_zone] for further dissection.") + return TRUE else to_chat(user, "You don't find anything in [target]'s [target_zone]!") return TRUE @@ -76,7 +75,7 @@ //IPC Gland Surgery// /datum/surgery/organ_extraction/synth - name = "experimental robotic dissection" + name = "Experimental Robotic Dissection" steps = list(/datum/surgery_step/robotics/external/unscrew_hatch,/datum/surgery_step/robotics/external/open_hatch,/datum/surgery_step/internal/extract_organ/synth,/datum/surgery_step/internal/gland_insert,/datum/surgery_step/robotics/external/close_hatch) possible_locs = list("chest") requires_organic_bodypart = 0 @@ -99,4 +98,3 @@ /datum/surgery_step/internal/extract_organ/synth name = "remove cell" - organ_types = list(/obj/item/organ/internal/cell) diff --git a/code/game/gamemodes/miniantags/abduction/gland.dm b/code/game/gamemodes/miniantags/abduction/gland.dm index 2378ab1f789..419b53d50a3 100644 --- a/code/game/gamemodes/miniantags/abduction/gland.dm +++ b/code/game/gamemodes/miniantags/abduction/gland.dm @@ -3,6 +3,7 @@ desc = "A nausea-inducing hunk of twisting flesh and metal." icon = 'icons/obj/abductor.dmi' icon_state = "gland" + dead_icon = null status = ORGAN_ROBOT origin_tech = "materials=4;biotech=7;abductor=3" beating = TRUE @@ -18,6 +19,9 @@ var/mind_control_duration = 1800 var/active_mind_control = FALSE +/obj/item/organ/internal/heart/gland/update_icon() + return + /obj/item/organ/internal/heart/gland/proc/ownerCheck() if(ishuman(owner)) return TRUE diff --git a/code/game/machinery/doppler_array.dm b/code/game/machinery/doppler_array.dm index 240cca4bdc7..fef3d7c5e5e 100644 --- a/code/game/machinery/doppler_array.dm +++ b/code/game/machinery/doppler_array.dm @@ -143,7 +143,7 @@ var/list/doppler_arrays = list() var/list/messages = list("Explosive disturbance detected.", \ "Epicenter at: grid ([x0],[y0]). Temporal displacement of tachyons: [took] seconds.", \ - "Factual: Epicenter radius: [devastation_range]. Outer radius: [heavy_impact_range]. Shockwave radius: [light_impact_range].") + "Actual: Epicenter radius: [devastation_range]. Outer radius: [heavy_impact_range]. Shockwave radius: [light_impact_range].") // If the bomb was capped, say its theoretical size. if(devastation_range < orig_dev_range || heavy_impact_range < orig_heavy_range || light_impact_range < orig_light_range) diff --git a/code/game/mecha/equipment/tools/mining_tools.dm b/code/game/mecha/equipment/tools/mining_tools.dm index bc7bf2c8ff4..ae2bf716018 100644 --- a/code/game/mecha/equipment/tools/mining_tools.dm +++ b/code/game/mecha/equipment/tools/mining_tools.dm @@ -81,7 +81,7 @@ drill.move_ores() /obj/item/mecha_parts/mecha_equipment/drill/proc/move_ores() - if(locate(/obj/item/mecha_parts/mecha_equipment/hydraulic_clamp) in chassis.equipment && istype(chassis, /obj/mecha/working/ripley)) + if((locate(/obj/item/mecha_parts/mecha_equipment/hydraulic_clamp) in chassis.equipment) && istype(chassis, /obj/mecha/working/ripley)) var/obj/mecha/working/ripley/R = chassis //we could assume that it's a ripley because it has a clamp, but that's ~unsafe~ and ~bad practice~ R.collect_ore() diff --git a/code/game/objects/effects/spawners/lootdrop.dm b/code/game/objects/effects/spawners/lootdrop.dm index 4dcd2cbdd32..f8abaa7a17e 100644 --- a/code/game/objects/effects/spawners/lootdrop.dm +++ b/code/game/objects/effects/spawners/lootdrop.dm @@ -348,8 +348,8 @@ return var/lootspawn = pickweight(loot) var/obj/vehicle/V = new lootspawn(get_turf(src)) - if(V.keytype) - new V.keytype(get_turf(src)) + if(V.key_type) + new V.key_type(get_turf(src)) qdel(src) diff --git a/code/game/objects/items/devices/camera_bug.dm b/code/game/objects/items/devices/camera_bug.dm index 7bf80244072..3ca37a3f662 100644 --- a/code/game/objects/items/devices/camera_bug.dm +++ b/code/game/objects/items/devices/camera_bug.dm @@ -78,11 +78,9 @@ continue if(length(list("SS13","MINE")&camera.network)) bugged_cameras[camera.c_tag] = camera - sortList(bugged_cameras) + sortTim(bugged_cameras, /proc/cmp_text_asc) return bugged_cameras - - /obj/item/camera_bug/proc/menu(var/list/cameras) if(!cameras || !cameras.len) return "No bugged cameras found." diff --git a/code/game/objects/items/weapons/storage/backpack.dm b/code/game/objects/items/weapons/storage/backpack.dm index 63a19645346..57f4e999ac8 100644 --- a/code/game/objects/items/weapons/storage/backpack.dm +++ b/code/game/objects/items/weapons/storage/backpack.dm @@ -360,11 +360,11 @@ new /obj/item/ammo_box/magazine/m12g/buckshot(src) new /obj/item/ammo_box/magazine/m12g/dragon(src) -/obj/item/storage/backpack/duffel/mining_conscript/noid +/obj/item/storage/backpack/duffel/mining_conscript/ name = "mining conscription kit" desc = "A kit containing everything a crewmember needs to support a shaft miner in the field." -/obj/item/storage/backpack/duffel/mining_conscript/noid/New() +/obj/item/storage/backpack/duffel/mining_conscript/New() ..() new /obj/item/pickaxe(src) new /obj/item/clothing/glasses/meson(src) @@ -372,7 +372,7 @@ new /obj/item/storage/bag/ore(src) new /obj/item/clothing/under/rank/miner/lavaland(src) new /obj/item/encryptionkey/headset_cargo(src) - new /obj/item/clothing/mask/gas(src) + new /obj/item/clothing/mask/gas/explorer(src) /obj/item/storage/backpack/duffel/syndie/ammo/smg diff --git a/code/modules/mining/lavaland/loot/tendril_loot.dm b/code/modules/mining/lavaland/loot/tendril_loot.dm index 7c26b4900c9..3a9d253aa8e 100644 --- a/code/modules/mining/lavaland/loot/tendril_loot.dm +++ b/code/modules/mining/lavaland/loot/tendril_loot.dm @@ -164,7 +164,7 @@ desc = "A boat used for traversing lava." icon_state = "goliath_boat" icon = 'icons/obj/lavaland/dragonboat.dmi' - keytype = /obj/item/oar + held_key_type = /obj/item/oar resistance_flags = LAVA_PROOF | FIRE_PROOF /obj/vehicle/lavaboat/relaymove(mob/user, direction) @@ -175,7 +175,7 @@ ..() else to_chat(user, "Boats don't go on land!") - return 0 + return FALSE /obj/item/oar name = "oar" @@ -218,7 +218,7 @@ /obj/vehicle/lavaboat/dragon name = "mysterious boat" desc = "This boat moves where you will it, without the need for an oar." - keytype = null + held_key_type = null icon_state = "dragon_boat" generic_pixel_y = 2 generic_pixel_x = 1 diff --git a/code/modules/mining/machine_vending.dm b/code/modules/mining/machine_vending.dm index b20bcb347de..b6106499eff 100644 --- a/code/modules/mining/machine_vending.dm +++ b/code/modules/mining/machine_vending.dm @@ -36,7 +36,7 @@ new /datum/data/mining_equipment("Fulton Pack", /obj/item/extraction_pack, 1000), new /datum/data/mining_equipment("Lazarus Injector", /obj/item/lazarus_injector, 1000), new /datum/data/mining_equipment("Silver Pickaxe", /obj/item/pickaxe/silver, 1000), - new /datum/data/mining_equipment("Mining Conscription Kit", /obj/item/storage/backpack/duffel/mining_conscript, 1500), + new /datum/data/mining_equipment("Mining Conscription Kit", /obj/item/storage/backpack/duffel/mining_conscript/full, 1500), new /datum/data/mining_equipment("Jetpack Upgrade", /obj/item/tank/jetpack/suit, 2000), new /datum/data/mining_equipment("Mining Hardsuit", /obj/item/clothing/suit/space/hardsuit/mining, 2000), new /datum/data/mining_equipment("Diamond Pickaxe", /obj/item/pickaxe/diamond, 2000), @@ -235,7 +235,7 @@ new /obj/item/extinguisher/mini(drop_location) new /obj/item/twohanded/kinetic_crusher(drop_location) if("Mining Conscription Kit") - new /obj/item/storage/backpack/duffel/mining_conscript(drop_location) + new /obj/item/storage/backpack/duffel/mining_conscript/full(drop_location) qdel(voucher) @@ -293,19 +293,14 @@ to_chat(user, "You upgrade [I] with mining access.") qdel(src) -/obj/item/storage/backpack/duffel/mining_conscript +/obj/item/storage/backpack/duffel/mining_conscript/full name = "mining conscription kit" desc = "A kit containing everything a crewmember needs to support a shaft miner in the field." -/obj/item/storage/backpack/duffel/mining_conscript/New() +/obj/item/storage/backpack/duffel/mining_conscript/full/New() ..() - new /obj/item/clothing/glasses/meson(src) - new /obj/item/t_scanner/adv_mining_scanner/lesser(src) - new /obj/item/storage/bag/ore(src) new /obj/item/clothing/suit/hooded/explorer(src) - new /obj/item/encryptionkey/headset_cargo(src) - new /obj/item/clothing/mask/gas/explorer(src) new /obj/item/card/id/mining_access_card(src) new /obj/item/gun/energy/kinetic_accelerator(src) new /obj/item/kitchen/knife/combat/survival(src) - new /obj/item/flashlight/seclite(src) \ No newline at end of file + new /obj/item/flashlight/seclite(src) diff --git a/code/modules/mob/living/carbon/human/species/slime.dm b/code/modules/mob/living/carbon/human/species/slime.dm index 76e7ce2afee..42a566e450c 100644 --- a/code/modules/mob/living/carbon/human/species/slime.dm +++ b/code/modules/mob/living/carbon/human/species/slime.dm @@ -20,7 +20,7 @@ cold_level_3 = 200 coldmod = 3 - brain_mod = 2.5 + brain_mod = 1.5 male_cough_sounds = list('sound/effects/slime_squish.ogg') female_cough_sounds = list('sound/effects/slime_squish.ogg') @@ -40,8 +40,8 @@ has_organ = list( "brain" = /obj/item/organ/internal/brain/slime, - "osmatic pressure regulator" = /obj/item/organ/internal/heart/slime, - "gas exchange membrane" = /obj/item/organ/internal/lungs/slime + "heart" = /obj/item/organ/internal/heart/slime, + "lungs" = /obj/item/organ/internal/lungs/slime ) mutantears = null has_limbs = list( diff --git a/code/modules/research/xenobiology/xenobiology.dm b/code/modules/research/xenobiology/xenobiology.dm index c594e08b3b3..c71c3f6f8d8 100644 --- a/code/modules/research/xenobiology/xenobiology.dm +++ b/code/modules/research/xenobiology/xenobiology.dm @@ -354,19 +354,31 @@ icon_state = "bottle3" origin_tech = "biotech=5" -/obj/item/slimepotion/speed/afterattack(obj/item/C, mob/user, proximity_flag) +/obj/item/slimepotion/speed/afterattack(obj/O, mob/user, proximity_flag) if(!proximity_flag) return ..() - if(!istype(C)) - to_chat(user, "The potion can only be used on items!") + if(!istype(O)) + to_chat(user, "The potion can only be used on items or vehicles!") return - if(C.slowdown <= 0) - to_chat(user, "[C] can't be made any faster!") - return..() - to_chat(user, "You slather the red gunk over [C], making it faster.") - C.color = "#FF0000" - C.slowdown = 0 + if(isitem(O)) + var/obj/item/I = O + if(I.slowdown <= 0) + to_chat(user, "[I] can't be made any faster!") + return ..() + I.slowdown = 0 + + if(istype(O, /obj/vehicle)) + var/obj/vehicle/V = O + var/vehicle_speed_mod = config.run_speed + if(V.vehicle_move_delay <= vehicle_speed_mod) + to_chat(user, "[V] can't be made any faster!") + return ..() + V.vehicle_move_delay = vehicle_speed_mod + + to_chat(user, "You slather the red gunk over [O], making it faster.") + O.remove_atom_colour(WASHABLE_COLOUR_PRIORITY) + O.add_atom_colour("#FF0000", FIXED_COLOUR_PRIORITY) qdel(src) /obj/item/slimepotion/speed/MouseDrop(obj/over_object) diff --git a/code/modules/surgery/organs/subtypes/slime.dm b/code/modules/surgery/organs/subtypes/slime.dm index a1c4e5a0bf6..14c89aded63 100644 --- a/code/modules/surgery/organs/subtypes/slime.dm +++ b/code/modules/surgery/organs/subtypes/slime.dm @@ -1,11 +1,15 @@ /obj/item/organ/internal/heart/slime icon = 'icons/obj/species_organs/slime.dmi' - name = "osmotic pressure regulator" + name = "slime heart" icon_state = "heart" - desc = "It appears to be some kind of biological pump that uses osmotic pressure to regulate water flow. It seems to work similar to a heart." + desc = "This is a slime's osmotic pressure regulator, it appears to be some kind of biological pump that uses osmotic pressure to regulate water flow. It seems to work similar to a heart." + dead_icon = null + +/obj/item/organ/internal/heart/slime/update_icon() + return /obj/item/organ/internal/lungs/slime icon = 'icons/obj/species_organs/slime.dmi' - name = "gas exchange membrane" + name = "slime lungs" icon_state = "lungs" - desc = "Membrane used for oxygen intake and gas exchange. These seem to work similar to lungs." \ No newline at end of file + desc = "This is a slime's gas exchange membrane, this membrane used for oxygen intake and gas exchange. These seem to work similar to lungs." \ No newline at end of file diff --git a/code/modules/surgery/organs/subtypes/unbreakable.dm b/code/modules/surgery/organs/subtypes/unbreakable.dm index 327a25de405..245629ba26e 100644 --- a/code/modules/surgery/organs/subtypes/unbreakable.dm +++ b/code/modules/surgery/organs/subtypes/unbreakable.dm @@ -1,5 +1,6 @@ /obj/item/organ/external/chest/unbreakable cannot_break = TRUE + encased = null /obj/item/organ/external/groin/unbreakable cannot_break = TRUE @@ -30,6 +31,7 @@ /obj/item/organ/external/head/unbreakable cannot_break = TRUE + encased = null // Cannot dismember or break /obj/item/organ/external/chest/unbreakable/sturdy diff --git a/code/modules/surgery/robotics.dm b/code/modules/surgery/robotics.dm index 9ab290f5c89..7c388d25899 100644 --- a/code/modules/surgery/robotics.dm +++ b/code/modules/surgery/robotics.dm @@ -545,7 +545,7 @@ /datum/surgery/cybernetic_customization name = "Cybernetic Appearance Customization" steps = list(/datum/surgery_step/robotics/external/unscrew_hatch, /datum/surgery_step/robotics/external/customize_appearance) - possible_locs = list("head", "chest", "l_arm", "r_arm", "r_leg", "l_leg") + possible_locs = list("head", "chest", "l_arm", "l_hand", "r_arm", "r_hand", "r_leg", "r_foot", "l_leg", "l_foot", "groin") requires_organic_bodypart = FALSE /datum/surgery/cybernetic_customization/can_start(mob/user, mob/living/carbon/human/target) diff --git a/code/modules/vehicle/ambulance.dm b/code/modules/vehicle/ambulance.dm index 29fb4e0108f..7b4797c6fe3 100644 --- a/code/modules/vehicle/ambulance.dm +++ b/code/modules/vehicle/ambulance.dm @@ -2,12 +2,12 @@ name = "ambulance" desc = "This is what the paramedic uses to run over people they need to take to medbay." icon_state = "docwagon2" - keytype = /obj/item/key/ambulance + key_type = /obj/item/key/ambulance var/obj/structure/bed/amb_trolley/bed = null var/datum/action/ambulance_alarm/AA var/datum/looping_sound/ambulance_alarm/soundloop -/obj/vehicle/ambulance/New() +/obj/vehicle/ambulance/Initialize(mapload) . = ..() AA = new(src) soundloop = new(list(src), FALSE) diff --git a/code/modules/vehicle/atv.dm b/code/modules/vehicle/atv.dm index 95c5e23dde8..7e0dc88fb23 100644 --- a/code/modules/vehicle/atv.dm +++ b/code/modules/vehicle/atv.dm @@ -2,19 +2,17 @@ name = "all-terrain vehicle" desc = "An all-terrain vehicle built for traversing rough terrain with ease. One of the few old-earth technologies that are still relevant on most planet-bound outposts." icon = 'icons/vehicles/4wheeler.dmi' - icon_state = "fourwheel" + icon_state = "atv" armor = list("melee" = 50, "bullet" = 25, "laser" = 20, "energy" = 0, "bomb" = 50, "bio" = 0, "rad" = 0, "fire" = 60, "acid" = 60) - keytype = /obj/item/key + key_type = /obj/item/key generic_pixel_x = 0 generic_pixel_y = 4 vehicle_move_delay = 1 - var/static/image/atvcover = null + var/static/mutable_appearance/atvcover -/obj/vehicle/atv/New() - ..() - if(!atvcover) - atvcover = image("icons/vehicles/4wheeler.dmi", "4wheeler_north") - atvcover.layer = MOB_LAYER + 0.1 +/obj/vehicle/atv/Initialize(mapload) + . = ..() + atvcover = mutable_appearance(icon, atvcover, ABOVE_MOB_LAYER) /obj/vehicle/atv/post_buckle_mob(mob/living/M) add_overlay(atvcover) @@ -27,7 +25,7 @@ /obj/vehicle/atv/handle_vehicle_layer() if(dir == SOUTH) - layer = MOB_LAYER+0.1 + layer = ABOVE_MOB_LAYER else layer = OBJ_LAYER @@ -41,20 +39,20 @@ emp_vulnerable = 1 density = 0 -/obj/vehicle/atv/turret/New() - ..() +/obj/vehicle/atv/turret/Initialize(mapload) + . = ..() turret = new(loc) //turret.base = src /obj/vehicle/atv/turret/handle_vehicle_layer() if(dir == SOUTH) - layer = MOB_LAYER+0.1 + layer = ABOVE_MOB_LAYER else layer = OBJ_LAYER if(turret) if(dir == NORTH) - turret.layer = MOB_LAYER+0.1 + turret.layer = ABOVE_MOB_LAYER else turret.layer = OBJ_LAYER diff --git a/code/modules/vehicle/janicart.dm b/code/modules/vehicle/janicart.dm index 2445e983fd3..319d2338128 100644 --- a/code/modules/vehicle/janicart.dm +++ b/code/modules/vehicle/janicart.dm @@ -3,10 +3,13 @@ name = "janicart (pimpin' ride)" desc = "A brave janitor cyborg gave its life to produce such an amazing combination of speed and utility." icon_state = "pussywagon" - keytype = /obj/item/key/janitor - var/obj/item/storage/bag/trash/mybag = null - var/floorbuffer = 0 + key_type = /obj/item/key/janitor + var/obj/item/storage/bag/trash/mybag + var/floorbuffer = FALSE +/obj/vehicle/janicart/Destroy() + QDEL_NULL(mybag) + return ..() /obj/vehicle/janicart/handle_vehicle_offsets() ..() @@ -63,35 +66,34 @@ /obj/vehicle/janicart/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/storage/bag/trash)) - if(keytype == /obj/item/key/janitor) - if(!user.drop_item()) - return - to_chat(user, "You hook the trashbag onto \the [name].") - I.loc = src - mybag = I - else if(istype(I, /obj/item/janiupgrade)) - if(keytype == /obj/item/key/janitor) - floorbuffer = 1 - qdel(I) - to_chat(user,"You upgrade \the [name] with the floor buffer.") - update_icon() - - ..() - + if(!user.drop_item()) + return + to_chat(user, "You hook [I] onto [src].") + I.forceMove(src) + mybag = I + update_icon() + return + if(istype(I, /obj/item/janiupgrade)) + floorbuffer = TRUE + qdel(I) + to_chat(user,"You upgrade [src] with [I].") + update_icon() + return + return ..() /obj/vehicle/janicart/update_icon() - overlays.Cut() + cut_overlays() if(mybag) - overlays += "cart_garbage" + add_overlay("cart_garbage") if(floorbuffer) - overlays += "cart_buffer" + add_overlay("cart_buffer") /obj/vehicle/janicart/attack_hand(mob/user) if(..()) - return 1 + return TRUE else if(mybag) - mybag.loc = get_turf(user) + mybag.forceMove(get_turf(user)) user.put_in_hands(mybag) mybag = null update_icon() \ No newline at end of file diff --git a/code/modules/vehicle/motorcycle.dm b/code/modules/vehicle/motorcycle.dm index a79f8e3fa12..ea165c1c8df 100644 --- a/code/modules/vehicle/motorcycle.dm +++ b/code/modules/vehicle/motorcycle.dm @@ -6,15 +6,11 @@ generic_pixel_x = 0 generic_pixel_y = 4 vehicle_move_delay = 1 - var/static/image/bikecover = null - - -/obj/vehicle/motorcycle/New() - ..() - if(!bikecover) - bikecover = image("icons/vehicles/motorcycle.dmi", "motorcycle_overlay_4d") - bikecover.layer = MOB_LAYER + 0.1 + var/mutable_appearance/bikecover +/obj/vehicle/motorcycle/Initialize(mapload) + . = ..() + bikecover = mutable_appearance(icon, "motorcycle_overlay_4d", ABOVE_MOB_LAYER) /obj/vehicle/motorcycle/post_buckle_mob(mob/living/M) add_overlay(bikecover) @@ -28,6 +24,6 @@ /obj/vehicle/motorcycle/handle_vehicle_layer() if(dir == SOUTH) - layer = MOB_LAYER+0.1 + layer = ABOVE_MOB_LAYER else layer = OBJ_LAYER \ No newline at end of file diff --git a/code/modules/vehicle/secway.dm b/code/modules/vehicle/secway.dm index 373b9b41dcf..76748e81a93 100644 --- a/code/modules/vehicle/secway.dm +++ b/code/modules/vehicle/secway.dm @@ -3,9 +3,10 @@ desc = "A brave security cyborg gave its life to help you look like a complete tool." icon_state = "secway" armor = list("melee" = 20, "bullet" = 15, "laser" = 10, "energy" = 0, "bomb" = 30, "bio" = 0, "rad" = 0, "fire" = 60, "acid" = 60) - keytype = /obj/item/key/security + key_type = /obj/item/key/security generic_pixel_x = 0 generic_pixel_y = 4 + vehicle_move_delay = 1 /obj/item/key/security diff --git a/code/modules/vehicle/snowmobile.dm b/code/modules/vehicle/snowmobile.dm index 311eb48c699..c4b8d7aefba 100644 --- a/code/modules/vehicle/snowmobile.dm +++ b/code/modules/vehicle/snowmobile.dm @@ -3,7 +3,7 @@ desc = "Wheeeeeeeeeeee." icon = 'icons/obj/vehicles.dmi' icon_state = "snowmobile" - keytype = /obj/item/key/snowmobile + key_type = /obj/item/key/snowmobile generic_pixel_x = 0 generic_pixel_y = 4 diff --git a/code/modules/vehicle/speedbike.dm b/code/modules/vehicle/speedbike.dm index e1efe63bcbd..75e25c2c5e6 100644 --- a/code/modules/vehicle/speedbike.dm +++ b/code/modules/vehicle/speedbike.dm @@ -3,16 +3,14 @@ icon = 'icons/obj/bike.dmi' icon_state = "speedbike_blue" layer = MOB_LAYER - 0.1 - keytype = null vehicle_move_delay = 0 var/overlay_state = "cover_blue" - var/image/overlay = null + var/mutable_appearance/overlay -/obj/vehicle/space/speedbike/New() - ..() - overlay = image("icons/obj/bike.dmi", overlay_state) - overlay.layer = MOB_LAYER + 0.1 - overlays += overlay +/obj/vehicle/space/speedbike/Initialize(mapload) + . = ..() + overlay = mutable_appearance(icon, overlay_state, ABOVE_MOB_LAYER) + add_overlay(overlay) /obj/vehicle/space/speedbike/Move(newloc,move_dir) if(has_buckled_mobs()) diff --git a/code/modules/vehicle/sportscar.dm b/code/modules/vehicle/sportscar.dm index f52f4b77a92..0f9543d4811 100644 --- a/code/modules/vehicle/sportscar.dm +++ b/code/modules/vehicle/sportscar.dm @@ -6,14 +6,11 @@ generic_pixel_x = 0 generic_pixel_y = 4 vehicle_move_delay = 1 - var/static/image/carcover = null + var/mutable_appearance/carcover - -/obj/vehicle/car/New() - ..() - if(!carcover) - carcover = image("icons/vehicles/sportscar.dmi", "sportscar_cover") - carcover.layer = MOB_LAYER + 0.1 +/obj/vehicle/car/Initialize(mapload) + . = ..() + carcover = mutable_appearance(icon, "sportscar_cover", ABOVE_MOB_LAYER) /obj/vehicle/car/post_buckle_mob(mob/living/M) add_overlay(carcover) @@ -46,6 +43,6 @@ /obj/vehicle/car/handle_vehicle_layer() if(dir == SOUTH) - layer = MOB_LAYER+0.1 + layer = ABOVE_MOB_LAYER else layer = OBJ_LAYER \ No newline at end of file diff --git a/code/modules/vehicle/vehicle.dm b/code/modules/vehicle/vehicle.dm index db2df0df9aa..15ec4019537 100644 --- a/code/modules/vehicle/vehicle.dm +++ b/code/modules/vehicle/vehicle.dm @@ -9,8 +9,12 @@ can_buckle = TRUE buckle_lying = FALSE armor = list("melee" = 30, "bullet" = 30, "laser" = 30, "energy" = 0, "bomb" = 30, "bio" = 0, "rad" = 0, "fire" = 60, "acid" = 60) - var/keytype = null //item typepath, if non-null an item of this type is needed in your hands to drive this vehicle - var/next_vehicle_move = 0 //used for move delays + var/key_type + var/held_key_type //Similar to above, but the vehicle needs the key in hands as opposed to inserted into the ignition + var/obj/item/key/inserted_key + var/key_type_exact = TRUE //can subtypes work + var/last_vehicle_move = 0 //used for move delays + var/last_move_diagonal = FALSE var/vehicle_move_delay = 2 //tick delay between movements, lower = faster, higher = slower var/auto_door_open = TRUE var/needs_gravity = 0 //To allow non-space vehicles to move in no gravity or not, mostly for adminbus @@ -20,10 +24,56 @@ var/spaceworthy = FALSE -/obj/vehicle/New() - ..() +/obj/vehicle/Initialize(mapload) + . = ..() handle_vehicle_layer() +/obj/vehicle/Destroy() + QDEL_NULL(inserted_key) + return ..() + +/obj/vehicle/examine(mob/user) + . = ..() + if(key_type) + if(!inserted_key) + . += "Put a key inside it by clicking it with the key." + else + . += "Alt-click [src] to remove the key." + +/obj/vehicle/attackby(obj/item/I, mob/user, params) + if(key_type && !is_key(inserted_key) && is_key(I)) + if(user.drop_item()) + I.forceMove(src) + to_chat(user, "You insert [I] into [src].") + if(inserted_key) //just in case there's an invalid key + inserted_key.forceMove(drop_location()) + inserted_key = I + else + to_chat(user, "[I] seems to be stuck to your hand!") + return + return ..() + +/obj/vehicle/AltClick(mob/user) + if(inserted_key && user.Adjacent(user)) + if(!(user in buckled_mobs)) + to_chat(user, "You must be riding [src] to remove [src]'s key!") + return + to_chat(user, "You remove [inserted_key] from [src].") + inserted_key.forceMove(drop_location()) + user.put_in_hands(inserted_key) + inserted_key = null + return ..() + +/obj/vehicle/proc/is_key(obj/item/I) + return I ? (key_type_exact ? (I.type == key_type) : istype(I, key_type)) : FALSE + +/obj/vehicle/proc/held_keycheck(mob/user) + if(held_key_type) + if(istype(user.l_hand, held_key_type) || istype(user.r_hand, held_key_type)) + return TRUE + else + return TRUE + return FALSE //APPEARANCE /obj/vehicle/proc/handle_vehicle_layer() @@ -49,15 +99,6 @@ return -//KEYS -/obj/vehicle/proc/keycheck(mob/user) - if(keytype) - if(istype(user.l_hand, keytype) || istype(user.r_hand, keytype)) - return TRUE - else - return TRUE - return FALSE - /obj/item/key name = "key" desc = "A small grey key." @@ -93,25 +134,30 @@ //MOVEMENT /obj/vehicle/relaymove(mob/user, direction) + if(key_type && !is_key(inserted_key)) + to_chat(user, "[src] has no key inserted!") + return + if(user.incapacitated()) unbuckle_mob(user) return - if(world.time < next_vehicle_move) + if(world.time < last_vehicle_move + ((last_move_diagonal? 2 : 1) * (vehicle_move_delay + config.human_delay))) return - next_vehicle_move = world.time + vehicle_move_delay - if(keycheck(user)) + last_vehicle_move = world.time + + if(held_keycheck(user)) + var/turf/next = get_step(src, direction) if(!Process_Spacemove(direction) || !isturf(loc)) return step(src, direction) - if(has_buckled_mobs()) - for(var/m in buckled_mobs) - var/mob/living/buckled_mob = m - if(buckled_mob.loc != loc) - buckled_mob.buckled = null //Temporary, so Move() succeeds. - buckled_mob.buckled = src //Restoring + if((direction & (direction - 1)) && (loc == next)) //moved diagonally + last_move_diagonal = TRUE + else + last_move_diagonal = FALSE + if(has_buckled_mobs()) if(issimulatedturf(loc)) var/turf/simulated/T = loc if(T.wet == TURF_WET_LUBE) //Lube! Fall off! @@ -125,20 +171,15 @@ handle_vehicle_layer() handle_vehicle_offsets() else - to_chat(user, "You'll need the keys in one of your hands to drive \the [name].") + to_chat(user, "You'll need the keys in one of your hands to drive [src].") -/obj/vehicle/Move(NewLoc,Dir=0,step_x=0,step_y=0) +/obj/vehicle/Move(NewLoc, Dir = 0, step_x = 0, step_y = 0) . = ..() handle_vehicle_layer() handle_vehicle_offsets() -/obj/vehicle/attackby(obj/item/I, mob/user, params) - if(keytype && istype(I, keytype)) - to_chat(user, "Hold [I] in one of your hands while you drive \the [name].") - - /obj/vehicle/Bump(atom/movable/M) if(!spaceworthy && isspaceturf(get_turf(src))) return FALSE diff --git a/html/changelog.html b/html/changelog.html index d40cde16a74..28898259a1f 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -56,6 +56,52 @@ -->