diff --git a/.gitconfig b/.gitconfig index de5ff6f254..cd4cf17954 100644 --- a/.gitconfig +++ b/.gitconfig @@ -2,4 +2,3 @@ name = mapmerge driver driver = ./mapmerge.sh %O %A %B recursive = text - diff --git a/code/__defines/mobs.dm b/code/__defines/mobs.dm index 425b6e7f76..19e5615291 100644 --- a/code/__defines/mobs.dm +++ b/code/__defines/mobs.dm @@ -152,7 +152,7 @@ #define MODIFIER_STACK_EXTEND 2 // Disallows a second instance, but will extend the first instance if possible. #define MODIFIER_STACK_ALLOWED 3 // Multiple instances are allowed. -#define MODIFIER_GENETIC 0 // Modifiers with this flag will be copied to mobs who get cloned. +#define MODIFIER_GENETIC 1 // Modifiers with this flag will be copied to mobs who get cloned. // Bodyparts and organs. #define O_MOUTH "mouth" diff --git a/code/__defines/species_languages.dm b/code/__defines/species_languages.dm index 7ad84b4a79..88f4309e36 100644 --- a/code/__defines/species_languages.dm +++ b/code/__defines/species_languages.dm @@ -6,6 +6,7 @@ #define NO_SLIP 0x10 // Cannot fall over. #define NO_POISON 0x20 // Cannot not suffer toxloss. #define NO_EMBED 0x40 // Can step on broken glass with no ill-effects and cannot have shrapnel embedded in it. +#define NO_HALLUCINATION 0x80 // Don't hallucinate, ever // unused: 0x8000 - higher than this will overflow // Species spawn flags diff --git a/code/controllers/Processes/planet.dm b/code/controllers/Processes/planet.dm index 7b446b4d2d..063d6d3fb9 100644 --- a/code/controllers/Processes/planet.dm +++ b/code/controllers/Processes/planet.dm @@ -20,14 +20,14 @@ var/datum/controller/process/planet/planet_controller = null for(var/turf/simulated/OT in outdoor_turfs) for(var/datum/planet/P in planets) if(OT.z in P.expected_z_levels) - P.planet_floors += OT + P.planet_floors |= OT break outdoor_turfs.Cut() //Why were you in there INCORRECTLY? for(var/turf/unsimulated/wall/planetary/PW in planetary_walls) for(var/datum/planet/P in planets) if(PW.type == P.planetary_wall_type) - P.planet_walls += PW + P.planet_walls |= PW break planetary_walls.Cut() diff --git a/code/game/dna/dna_modifier.dm b/code/game/dna/dna_modifier.dm index af0eccf93c..e728ab8e50 100644 --- a/code/game/dna/dna_modifier.dm +++ b/code/game/dna/dna_modifier.dm @@ -18,6 +18,7 @@ var/mind=null var/languages=null var/list/flavor=null + var/list/genetic_modifiers = list() // Modifiers with the MODIFIER_GENETIC flag are saved. Note that only the type is saved, not an instance. /datum/dna2/record/proc/GetData() var/list/ser=list("data" = null, "owner" = null, "label" = null, "type" = null, "ue" = 0) diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index cf06523f6e..b6945b2c07 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -139,6 +139,25 @@ H.set_cloned_appearance() update_icon() + // A modifier is added which makes the new clone be unrobust. + var/modifier_lower_bound = 25 MINUTES + var/modifier_upper_bound = 40 MINUTES + + // Upgraded cloners can reduce the time of the modifier, up to 80% + var/clone_sickness_length = abs(((heal_level - 20) / 100 ) - 1) + clone_sickness_length = between(0.2, clone_sickness_length, 1.0) // Caps it off just incase. + modifier_lower_bound = round(modifier_lower_bound * clone_sickness_length, 1) + modifier_upper_bound = round(modifier_upper_bound * clone_sickness_length, 1) + + H.add_modifier(/datum/modifier/recently_cloned, rand(modifier_lower_bound, modifier_upper_bound)) + + // Modifier that doesn't do anything. + H.add_modifier(/datum/modifier/cloned) + + // This is really stupid. + for(var/modifier_type in R.genetic_modifiers) + H.add_modifier(modifier_type) + for(var/datum/language/L in R.languages) H.add_language(L.name) H.flavor_texts = R.flavor.Copy() @@ -498,3 +517,31 @@ if(istype(A, /obj/machinery/clonepod)) A:malfunction() */ + +/* + * Modifier applied to newly cloned people. + */ + +// Gives rather nasty downsides for awhile, making them less robust. +/datum/modifier/recently_cloned + name = "recently cloned" + desc = "You feel rather weak, having been cloned awhile ago." + + on_created_text = "You feel really weak." + on_expired_text = "You feel your strength returning to you." + + max_health_percent = 0.6 // -40% max health. + incoming_damage_percent = 1.1 // 10% more incoming damage. + outgoing_melee_damage_percent = 0.7 // 30% less melee damage. + disable_duration_percent = 1.25 // Stuns last 25% longer. + slowdown = 1 // Slower. + evasion = -1 // 15% easier to hit. + +// Does nothing. +/datum/modifier/cloned + name = "cloned" + desc = "You died and were cloned, and you can never forget that." + + flags = MODIFIER_GENETIC // So it gets copied if they die and get cloned again. + stacks = MODIFIER_STACK_ALLOWED // Two deaths means two instances of this. + diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm index db932f8cd0..668520eee5 100644 --- a/code/game/machinery/computer/cloning.dm +++ b/code/game/machinery/computer/cloning.dm @@ -330,6 +330,9 @@ R.types = DNA2_BUF_UI|DNA2_BUF_UE|DNA2_BUF_SE R.languages = subject.languages R.flavor = subject.flavor_texts.Copy() + for(var/datum/modifier/mod in subject.modifiers) + if(mod.flags & MODIFIER_GENETIC) + R.genetic_modifiers.Add(mod.type) //Add an implant if needed var/obj/item/weapon/implant/health/imp = locate(/obj/item/weapon/implant/health, subject) diff --git a/code/game/machinery/spaceheater.dm b/code/game/machinery/spaceheater.dm index 830c5f8d6d..ec0af28d58 100644 --- a/code/game/machinery/spaceheater.dm +++ b/code/game/machinery/spaceheater.dm @@ -22,6 +22,10 @@ icon_state = "sheater[on]" if(panel_open) overlays += "sheater-open" + if(on) + set_light(3, 3, "#FFCC00") + else + set_light(0) /obj/machinery/space_heater/examine(mob/user) ..(user) diff --git a/code/game/objects/items/devices/flash.dm b/code/game/objects/items/devices/flash.dm index 62d7e7b311..8eec816a50 100644 --- a/code/game/objects/items/devices/flash.dm +++ b/code/game/objects/items/devices/flash.dm @@ -102,7 +102,16 @@ flashfail = 1 else if(issilicon(M)) - M.Weaken(rand(5,10)) + flashfail = 0 + var/mob/living/silicon/S = M + if(isrobot(S)) + var/mob/living/silicon/robot/R = S + if(R.has_active_type(/obj/item/borg/combat/shield)) + var/obj/item/borg/combat/shield/shield = locate() in R + if(shield) + if(shield.active) + shield.adjust_flash_count(R, 1) + flashfail = 1 else flashfail = 1 @@ -125,6 +134,7 @@ else user.visible_message("[user] overloads [M]'s sensors with the flash!") + M.Weaken(rand(5,10)) else user.visible_message("[user] fails to blind [M] with the flash!") diff --git a/code/game/objects/items/devices/radio/encryptionkey.dm b/code/game/objects/items/devices/radio/encryptionkey.dm index e26b75486e..0d81f8559e 100644 --- a/code/game/objects/items/devices/radio/encryptionkey.dm +++ b/code/game/objects/items/devices/radio/encryptionkey.dm @@ -125,3 +125,6 @@ name = "\improper ERT radio encryption key" icon_state = "cent_cypherkey" channels = list("Response Team" = 1, "Science" = 1, "Command" = 1, "Medical" = 1, "Engineering" = 1, "Security" = 1, "Supply" = 1, "Service" = 1) + +/obj/item/device/encryptionkey/omni //Literally only for the admin intercoms + channels = list("Mercenary" = 1, "Raider" = 1, "Response Team" = 1, "Science" = 1, "Command" = 1, "Medical" = 1, "Engineering" = 1, "Security" = 1, "Supply" = 1, "Service" = 1) \ No newline at end of file diff --git a/code/game/objects/items/devices/radio/headset.dm b/code/game/objects/items/devices/radio/headset.dm index 5a8a73ee72..ba5d338a0d 100644 --- a/code/game/objects/items/devices/radio/headset.dm +++ b/code/game/objects/items/devices/radio/headset.dm @@ -310,6 +310,9 @@ // freerange = 1 ks2type = /obj/item/device/encryptionkey/ert +/obj/item/device/radio/headset/omni //Only for the admin intercoms + ks2type = /obj/item/device/encryptionkey/omni + /obj/item/device/radio/headset/ia name = "internal affair's headset" desc = "The headset of your worst enemy." diff --git a/code/game/objects/items/weapons/cards_ids_syndicate.dm b/code/game/objects/items/weapons/cards_ids_syndicate.dm index 300926d08e..b5c874868e 100644 --- a/code/game/objects/items/weapons/cards_ids_syndicate.dm +++ b/code/game/objects/items/weapons/cards_ids_syndicate.dm @@ -1,28 +1,21 @@ -var/list/syndicate_ids = list() - /obj/item/weapon/card/id/syndicate name = "agent card" icon_state = "syndicate" assignment = "Agent" origin_tech = list(TECH_ILLEGAL = 3) var/electronic_warfare = 1 - var/registered_user = null + var/mob/registered_user = null /obj/item/weapon/card/id/syndicate/New(mob/user as mob) ..() - syndicate_ids += src access = syndicate_access.Copy() -/obj/item/weapon/card/id/syndicate/Destroy() - syndicate_ids -= src - registered_user = null - return ..() +/obj/item/weapon/card/id/syndicate/station_access/New() + ..() // Same as the normal Syndicate id, only already has all station access + access |= get_all_station_access() -// On mob destruction, ensure any references are cleared -/mob/Destroy() - for(var/obj/item/weapon/card/id/syndicate/SID in syndicate_ids) - if(SID.registered_user == src) - SID.registered_user = null +/obj/item/weapon/card/id/syndicate/Destroy() + unset_registered_user(registered_user) return ..() /obj/item/weapon/card/id/syndicate/prevent_tracking() @@ -37,9 +30,8 @@ var/list/syndicate_ids = list() user << "The microscanner activates as you pass it over the ID, copying its access." /obj/item/weapon/card/id/syndicate/attack_self(mob/user as mob) - if(!registered_user) - registered_user = user - user.set_id_info(src) + // We use the fact that registered_name is not unset should the owner be vaporized, to ensure the id doesn't magically become unlocked. + if(!registered_user && register_user(user)) user << "The microscanner marks you as its owner, preventing others from accessing its internals." if(registered_user == user) switch(alert("Would you like edit the ID, or show it?","Show or Edit?", "Edit","Show")) @@ -72,6 +64,21 @@ var/list/syndicate_ids = list() ui.set_initial_data(data) ui.open() +/obj/item/weapon/card/id/syndicate/proc/register_user(var/mob/user) + if(!istype(user) || user == registered_user) + return FALSE + unset_registered_user() + registered_user = user + user.set_id_info(src) + user.register(OBSERVER_EVENT_DESTROY, src, /obj/item/weapon/card/id/syndicate/proc/unset_registered_user) + return TRUE + +/obj/item/weapon/card/id/syndicate/proc/unset_registered_user(var/mob/user) + if(!registered_user || (user && user != registered_user)) + return + registered_user.unregister(OBSERVER_EVENT_DESTROY, src) + registered_user = null + /obj/item/weapon/card/id/syndicate/CanUseTopic(mob/user) if(user != registered_user) return STATUS_CLOSE @@ -172,7 +179,7 @@ var/list/syndicate_ids = list() icon_state = initial(icon_state) name = initial(name) registered_name = initial(registered_name) - registered_user = null + unset_registered_user() sex = initial(sex) user << "All information has been deleted from \the [src]." . = 1 diff --git a/code/game/objects/items/weapons/handcuffs.dm b/code/game/objects/items/weapons/handcuffs.dm index 17bb6b84be..0b4700ca6a 100644 --- a/code/game/objects/items/weapons/handcuffs.dm +++ b/code/game/objects/items/weapons/handcuffs.dm @@ -25,7 +25,7 @@ return if ((CLUMSY in user.mutations) && prob(50)) - user << "Uh ... how do those things work?!" + to_chat(user, "Uh ... how do those things work?!") place_handcuffs(user, user) return @@ -38,7 +38,7 @@ if(can_place(C, user)) place_handcuffs(C, user) else - user << "You need to have a firm grip on [C] before you can put \the [src] on!" + to_chat(user, "You need to have a firm grip on [C] before you can put \the [src] on!") /obj/item/weapon/handcuffs/proc/can_place(var/mob/target, var/mob/user) if(user == target) @@ -60,11 +60,11 @@ return 0 if (!H.has_organ_for_slot(slot_handcuffed)) - user << "\The [H] needs at least two wrists before you can cuff them together!" + to_chat(user, "\The [H] needs at least two wrists before you can cuff them together!") return 0 if(istype(H.gloves,/obj/item/clothing/gloves/gauntlets/rig) && !elastic) // Can't cuff someone who's in a deployed hardsuit. - user << "\The [src] won't fit around \the [H.gloves]!" + to_chat(user, "\The [src] won't fit around \the [H.gloves]!") return 0 user.visible_message("\The [user] is attempting to put [cuff_type] on \the [H]!") @@ -166,7 +166,7 @@ var/last_chew = 0 if (R.use(1)) var/obj/item/weapon/material/wirerod/W = new(get_turf(user)) user.put_in_hands(W) - user << "You wrap the cable restraint around the top of the rod." + to_chat(user, "You wrap the cable restraint around the top of the rod.") qdel(src) update_icon(user) @@ -188,7 +188,7 @@ var/last_chew = 0 desc = "Use this to keep prisoners in line." gender = PLURAL icon = 'icons/obj/items.dmi' - icon_state = "handcuff" + icon_state = "legcuff" flags = CONDUCT throwforce = 0 w_class = ITEMSIZE_NORMAL @@ -204,7 +204,7 @@ var/last_chew = 0 return if ((CLUMSY in user.mutations) && prob(50)) - user << "Uh ... how do those things work?!" + to_chat(user, "Uh ... how do those things work?!") place_legcuffs(user, user) return @@ -217,7 +217,7 @@ var/last_chew = 0 if(can_place(C, user)) place_legcuffs(C, user) else - user << "You need to have a firm grip on [C] before you can put \the [src] on!" + to_chat(user, "You need to have a firm grip on [C] before you can put \the [src] on!") /obj/item/weapon/handcuffs/legcuffs/proc/place_legcuffs(var/mob/living/carbon/target, var/mob/user) playsound(src.loc, cuff_sound, 30, 1, -2) @@ -227,11 +227,11 @@ var/last_chew = 0 return 0 if (!H.has_organ_for_slot(slot_legcuffed)) - user << "\The [H] needs at least two ankles before you can cuff them together!" + to_chat(user, "\The [H] needs at least two ankles before you can cuff them together!") return 0 if(istype(H.shoes,/obj/item/clothing/shoes/magboots/rig) && !elastic) // Can't cuff someone who's in a deployed hardsuit. - user << "\The [src] won't fit around \the [H.shoes]!" + to_chat(user, "\The [src] won't fit around \the [H.shoes]!") return 0 user.visible_message("\The [user] is attempting to put [cuff_type] on \the [H]!") diff --git a/code/game/objects/items/weapons/storage/belt.dm b/code/game/objects/items/weapons/storage/belt.dm index 0dec82fe17..38130f2739 100644 --- a/code/game/objects/items/weapons/storage/belt.dm +++ b/code/game/objects/items/weapons/storage/belt.dm @@ -241,6 +241,50 @@ new /obj/item/device/multitool/alien(src) new /obj/item/stack/cable_coil/alien(src) +/obj/item/weapon/storage/belt/medical/alien + name = "alien belt" + desc = "A belt(?) that can hold things." + icon = 'icons/obj/abductor.dmi' + icon_state = "belt" + item_state = "security" + can_hold = list( + /obj/item/device/healthanalyzer, + /obj/item/weapon/dnainjector, + /obj/item/weapon/reagent_containers/dropper, + /obj/item/weapon/reagent_containers/glass/beaker, + /obj/item/weapon/reagent_containers/glass/bottle, + /obj/item/weapon/reagent_containers/pill, + /obj/item/weapon/reagent_containers/syringe, + /obj/item/weapon/flame/lighter/zippo, + /obj/item/weapon/storage/fancy/cigarettes, + /obj/item/weapon/storage/pill_bottle, + /obj/item/stack/medical, + /obj/item/device/radio/headset, + /obj/item/device/pda, + /obj/item/taperoll, + /obj/item/device/megaphone, + /obj/item/clothing/mask/surgical, + /obj/item/clothing/head/surgery, + /obj/item/clothing/gloves, + /obj/item/weapon/reagent_containers/hypospray, + /obj/item/clothing/glasses, + /obj/item/weapon/crowbar, + /obj/item/device/flashlight, + /obj/item/weapon/cell/device, + /obj/item/weapon/extinguisher/mini, + /obj/item/weapon/surgical + ) + +/obj/item/weapon/storage/belt/medical/alien/New() + ..() + new /obj/item/weapon/surgical/scalpel/alien(src) + new /obj/item/weapon/surgical/hemostat/alien(src) + new /obj/item/weapon/surgical/retractor/alien(src) + new /obj/item/weapon/surgical/circular_saw/alien(src) + new /obj/item/weapon/surgical/FixOVein/alien(src) + new /obj/item/weapon/surgical/bone_clamp/alien(src) + new /obj/item/weapon/surgical/cautery/alien(src) + /obj/item/weapon/storage/belt/champion name = "championship belt" desc = "Proves to the world that you are the strongest!" diff --git a/code/game/objects/items/weapons/surgery_tools.dm b/code/game/objects/items/weapons/surgery_tools.dm index 58c5d18ea0..96f5e30f69 100644 --- a/code/game/objects/items/weapons/surgery_tools.dm +++ b/code/game/objects/items/weapons/surgery_tools.dm @@ -166,13 +166,22 @@ /obj/item/weapon/surgical/bonesetter name = "bone setter" desc = "Put them in their place." - icon_state = "bone setter" + icon_state = "bone_setter" force = 8.0 throwforce = 9.0 throw_speed = 3 throw_range = 5 attack_verb = list("attacked", "hit", "bludgeoned") +/obj/item/weapon/surgical/bone_clamp + name = "bone clamp" + desc = "The best way to get a bone fixed fast." + icon_state = "bone_clamp" + force = 8 + throwforce = 9 + throw_speed = 3 + throw_range = 5 + attack_verb = list("attacked", "hit", "bludgeoned") // Cyborg Tools @@ -201,4 +210,38 @@ toolspeed = 0.5 /obj/item/weapon/surgical/bonesetter/cyborg - toolspeed = 0.5 \ No newline at end of file + toolspeed = 0.5 + + +// Alien Tools +/obj/item/weapon/surgical/retractor/alien + icon = 'icons/obj/abductor.dmi' + toolspeed = 0.25 + +/obj/item/weapon/surgical/hemostat/alien + icon = 'icons/obj/abductor.dmi' + toolspeed = 0.25 + +/obj/item/weapon/surgical/cautery/alien + icon = 'icons/obj/abductor.dmi' + toolspeed = 0.25 + +/obj/item/weapon/surgical/surgicaldrill/alien + icon = 'icons/obj/abductor.dmi' + toolspeed = 0.25 + +/obj/item/weapon/surgical/scalpel/alien + icon = 'icons/obj/abductor.dmi' + toolspeed = 0.25 + +/obj/item/weapon/surgical/circular_saw/alien + icon = 'icons/obj/abductor.dmi' + toolspeed = 0.25 + +/obj/item/weapon/surgical/FixOVein/alien + icon = 'icons/obj/abductor.dmi' + toolspeed = 0.25 + +/obj/item/weapon/surgical/bone_clamp/alien + icon = 'icons/obj/abductor.dmi' + toolspeed = 0.75 \ No newline at end of file diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm index 5d371b4555..2f0a032f21 100644 --- a/code/game/objects/structures/grille.dm +++ b/code/game/objects/structures/grille.dm @@ -239,3 +239,14 @@ if(air_group) return 0 //Make sure air doesn't drain ..() + +/obj/structure/grille/broken/cult + icon_state = "grillecult-b" + +/obj/structure/grille/rustic + name = "rustic grille" + desc = "A lattice of metal, arranged in an old, rustic fashion." + icon_state = "grillerustic" + +/obj/structure/grille/broken/rustic + icon_state = "grillerustic-b" diff --git a/code/game/objects/structures/simple_doors.dm b/code/game/objects/structures/simple_doors.dm index 4e302e0e31..7312c1ebf9 100644 --- a/code/game/objects/structures/simple_doors.dm +++ b/code/game/objects/structures/simple_doors.dm @@ -42,7 +42,7 @@ /obj/structure/simple_door/Destroy() processing_objects -= src update_nearby_tiles() - ..() + return ..() /obj/structure/simple_door/get_material() return material @@ -194,5 +194,8 @@ /obj/structure/simple_door/wood/New(var/newloc,var/material_name) ..(newloc, "wood") +/obj/structure/simple_door/sifwood/New(var/newloc,var/material_name) + ..(newloc, "alien wood") + /obj/structure/simple_door/resin/New(var/newloc,var/material_name) ..(newloc, "resin") \ No newline at end of file diff --git a/code/game/turfs/simulated/outdoors/outdoors.dm b/code/game/turfs/simulated/outdoors/outdoors.dm index 75c7e68083..e5c6465329 100644 --- a/code/game/turfs/simulated/outdoors/outdoors.dm +++ b/code/game/turfs/simulated/outdoors/outdoors.dm @@ -34,6 +34,26 @@ var/list/outdoor_turfs = list() planet_controller.unallocateTurf(src) ..() +/turf/simulated/proc/make_outdoors() + outdoors = TRUE + outdoor_turfs.Add(src) + +/turf/simulated/proc/make_indoors() + outdoors = FALSE + planet_controller.unallocateTurf(src) + qdel(weather_overlay) + update_icon() + +/turf/simulated/post_change() + ..() + // If it was outdoors and still is, it will not get added twice when the planet controller gets around to putting it in. + if(outdoors) + make_outdoors() + // outdoor_turfs += src + else + make_indoors() + // planet_controller.unallocateTurf(src) + /turf/simulated/proc/update_icon_edge() if(edge_blending_priority) for(var/checkdir in cardinal) @@ -55,7 +75,7 @@ var/list/outdoor_turfs = list() ..() /turf/simulated/floor/outdoors/mud - name = "grass" + name = "mud" icon_state = "mud_dark" edge_blending_priority = 3 diff --git a/code/game/turfs/simulated/water.dm b/code/game/turfs/simulated/water.dm index 781ddeeb7f..8e32a004d9 100644 --- a/code/game/turfs/simulated/water.dm +++ b/code/game/turfs/simulated/water.dm @@ -15,8 +15,12 @@ update_icon() ..() +/turf/simulated/floor/water/initialize() + update_icon() + /turf/simulated/floor/water/update_icon() ..() // To get the edges. This also gets rid of other overlays so it needs to go first. + overlays.Cut() icon_state = water_state var/image/floorbed_sprite = image(icon = 'icons/turf/outdoors.dmi', icon_state = under_state) underlays.Add(floorbed_sprite) diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index 2f2f17dd1d..9e4a5a6344 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -675,7 +675,7 @@ proc/admin_notice(var/message, var/rights) if(!check_rights(0)) return //This is basically how death alarms do it - var/obj/item/device/radio/headset/a = new /obj/item/device/radio/headset/ert(null) + var/obj/item/device/radio/headset/a = new /obj/item/device/radio/headset/omni(null) var/channel = input("Channel for message:","Channel", null) as null|anything in (list("Common") + a.keyslot2.channels) // + a.keyslot1.channels diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index fa0f355bc9..bb2768d69d 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -209,7 +209,8 @@ var/list/admin_verbs_debug = list( /datum/admins/proc/view_runtimes, /client/proc/show_gm_status, /datum/admins/proc/change_weather, - /datum/admins/proc/change_time + /datum/admins/proc/change_time, + /client/proc/admin_give_modifier ) var/list/admin_verbs_paranoid_debug = list( @@ -658,6 +659,29 @@ var/list/admin_verbs_mentor = list( log_admin("[key_name(usr)] gave [key_name(T)] a [greater] disease2 with infection chance [D.infectionchance].") message_admins("[key_name_admin(usr)] gave [key_name(T)] a [greater] disease2 with infection chance [D.infectionchance].", 1) +/client/proc/admin_give_modifier(var/mob/living/L) + set category = "Debug" + set name = "Give Modifier" + set desc = "Makes a mob weaker or stronger by adding a specific modifier to them." + + if(!L) + to_chat(usr, "Looks like you didn't select a mob.") + return + + var/list/possible_modifiers = typesof(/datum/modifier) - /datum/modifier + + var/new_modifier_type = input("What modifier should we add to [L]?", "Modifier Type") as null|anything in possible_modifiers + if(!new_modifier_type) + return + var/duration = input("How long should the new modifier last, in seconds. To make it last forever, write '0'.", "Modifier Duration") as num + if(duration == 0) + duration = null + else + duration = duration SECONDS + + L.add_modifier(new_modifier_type, duration) + log_and_message_admins("has given [key_name(L)] the modifer [new_modifier_type], with a duration of [duration ? "[duration / 600] minutes" : "forever"].") + /client/proc/make_sound(var/obj/O in world) // -- TLE set category = "Special Verbs" set name = "Make Sound" diff --git a/code/modules/admin/view_variables/helpers.dm b/code/modules/admin/view_variables/helpers.dm index c00e598cb3..1e160d253c 100644 --- a/code/modules/admin/view_variables/helpers.dm +++ b/code/modules/admin/view_variables/helpers.dm @@ -34,6 +34,7 @@ return ..() + {" + diff --git a/code/modules/admin/view_variables/topic.dm b/code/modules/admin/view_variables/topic.dm index 7d0966dc59..7c68737490 100644 --- a/code/modules/admin/view_variables/topic.dm +++ b/code/modules/admin/view_variables/topic.dm @@ -74,6 +74,18 @@ src.give_spell(M) href_list["datumrefresh"] = href_list["give_spell"] + else if(href_list["give_modifier"]) + if(!check_rights(R_ADMIN|R_FUN|R_DEBUG)) + return + + var/mob/living/M = locate(href_list["give_modifier"]) + if(!istype(M)) + usr << "This can only be used on instances of type /mob/living" + return + + src.admin_give_modifier(M) + href_list["datumrefresh"] = href_list["give_modifier"] + else if(href_list["give_disease2"]) if(!check_rights(R_ADMIN|R_FUN)) return diff --git a/code/modules/hydroponics/trays/tray.dm b/code/modules/hydroponics/trays/tray.dm index 4b26011f6d..4eee4ee91b 100644 --- a/code/modules/hydroponics/trays/tray.dm +++ b/code/modules/hydroponics/trays/tray.dm @@ -174,6 +174,25 @@ connect() update_icon() +/obj/machinery/portable_atmospherics/hydroponics/initialize() + var/obj/item/seeds/S = locate() in loc + if(S) + plant_seeds(S) + +/obj/machinery/portable_atmospherics/hydroponics/proc/plant_seeds(var/obj/item/seeds/S) + lastproduce = 0 + seed = S.seed //Grab the seed datum. + dead = 0 + age = 1 + //Snowflakey, maybe move this to the seed datum + health = (istype(S, /obj/item/seeds/cutting) ? round(seed.get_trait(TRAIT_ENDURANCE)/rand(2,5)) : seed.get_trait(TRAIT_ENDURANCE)) + lastcycle = world.time + + qdel(S) + + check_health() + update_icon() + /obj/machinery/portable_atmospherics/hydroponics/bullet_act(var/obj/item/projectile/Proj) //Don't act on seeds like dionaea that shouldn't change. @@ -490,18 +509,7 @@ return user << "You plant the [S.seed.seed_name] [S.seed.seed_noun]." - lastproduce = 0 - seed = S.seed //Grab the seed datum. - dead = 0 - age = 1 - //Snowflakey, maybe move this to the seed datum - health = (istype(S, /obj/item/seeds/cutting) ? round(seed.get_trait(TRAIT_ENDURANCE)/rand(2,5)) : seed.get_trait(TRAIT_ENDURANCE)) - lastcycle = world.time - - qdel(O) - - check_health() - update_icon() + plant_seeds(S) else user << "\The [src] already has seeds in it!" diff --git a/code/modules/maps/tg/map_template.dm b/code/modules/maps/tg/map_template.dm index ae8031638f..3aaf324463 100644 --- a/code/modules/maps/tg/map_template.dm +++ b/code/modules/maps/tg/map_template.dm @@ -24,7 +24,8 @@ var/list/global/map_templates = list() if(path) mappath = path if(mappath) - preload_size(mappath) + spawn(1) + preload_size(mappath) if(rename) name = rename diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 3fb8fe8ac9..194864b7de 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -258,7 +258,17 @@ "You shake [src] trying to wake [t_him] up!") else var/mob/living/carbon/human/hugger = M - if(istype(hugger)) + if(M.resting == 1) //Are they resting on the ground? + M.visible_message("[M] grabs onto [src] and pulls \himself up", \ + "You grip onto [src] and pull yourself up off the ground!") //AHHH gender checks are hard, but this should work + if(M.fire_stacks >= (src.fire_stacks + 3)) //Fire checks. + src.adjust_fire_stacks(1) + M.adjust_fire_stacks(-1) + if(M.on_fire) + src.IgniteMob() + if(do_after(M, 0.5 SECONDS)) //.5 second delay. Makes it a bit stronger than just typing rest. + M.resting = 0 //Hoist yourself up up off the ground. No para/stunned/weakened removal. + else if(istype(hugger)) hugger.species.hug(hugger,src) else M.visible_message("[M] hugs [src] to make [t_him] feel better!", \ diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index ad05894be0..96f5dddc42 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -233,7 +233,7 @@ set_light(0) else if(species.appearance_flags & RADIATION_GLOWS) - set_light(max(1,min(10,radiation/10)), max(1,min(20,radiation/20)), species.get_flesh_colour(src)) + set_light(max(1,min(5,radiation/15)), max(1,min(10,radiation/25)), species.get_flesh_colour(src)) // END DOGSHIT SNOWFLAKE var/obj/item/organ/internal/diona/nutrients/rad_organ = locate() in internal_organs @@ -248,6 +248,10 @@ updatehealth() return + var/obj/item/organ/internal/brain/slime/core = locate() in internal_organs + if(core) + return + var/damage = 0 radiation -= 1 * RADIATION_SPEED_COEFFICIENT if(prob(25)) @@ -359,7 +363,7 @@ return 0 - var/safe_pressure_min = 16 // Minimum safe partial pressure of breathable gas in kPa + var/safe_pressure_min = species.minimum_breath_pressure // Minimum safe partial pressure of breathable gas in kPa // Lung damage increases the minimum safe pressure. @@ -903,7 +907,7 @@ Paralyse(3) if(hallucination) - if(hallucination >= 20 && !(species.flags & (NO_POISON|IS_PLANT)) ) + if(hallucination >= 20 && !(species.flags & (NO_POISON|IS_PLANT|NO_HALLUCINATION)) ) if(prob(3)) fake_attack(src) if(!handling_hal) diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm index ea4b993645..3eea8754c1 100644 --- a/code/modules/mob/living/carbon/human/species/species.dm +++ b/code/modules/mob/living/carbon/human/species/species.dm @@ -104,8 +104,8 @@ var/warning_low_pressure = WARNING_LOW_PRESSURE // Low pressure warning. var/hazard_low_pressure = HAZARD_LOW_PRESSURE // Dangerously low pressure. var/light_dam // If set, mob will be damaged in light over this value and heal in light below its negative. - var/body_temperature = 310.15 // Species will try to stabilize at this temperature. - // (also affects temperature processing) + var/body_temperature = 310.15 // Species will try to stabilize at this temperature. (also affects temperature processing) + var/minimum_breath_pressure = 16 // Minimum required pressure for breath, in kPa var/heat_discomfort_level = 315 // Aesthetic messages about feeling warm. var/cold_discomfort_level = 285 // Aesthetic messages about feeling chilly. diff --git a/code/modules/mob/living/carbon/human/species/station/prometheans.dm b/code/modules/mob/living/carbon/human/species/station/prometheans.dm index 11384984d4..cc656dccba 100644 --- a/code/modules/mob/living/carbon/human/species/station/prometheans.dm +++ b/code/modules/mob/living/carbon/human/species/station/prometheans.dm @@ -20,7 +20,7 @@ var/datum/species/shapeshifter/promethean/prometheans bump_flag = SLIME swap_flags = MONKEY|SLIME|SIMPLE_ANIMAL push_flags = MONKEY|SLIME|SIMPLE_ANIMAL - flags = NO_SCAN | NO_SLIP | NO_MINOR_CUT + flags = NO_SCAN | NO_SLIP | NO_MINOR_CUT | NO_HALLUCINATION appearance_flags = HAS_SKIN_COLOR | HAS_EYE_COLOR | HAS_HAIR_COLOR | RADIATION_GLOWS | HAS_UNDERWEAR spawn_flags = SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED health_hud_intensity = 2 diff --git a/code/modules/mob/living/carbon/human/species/station/seromi.dm b/code/modules/mob/living/carbon/human/species/station/seromi.dm index 372b52d607..2d64d22fac 100644 --- a/code/modules/mob/living/carbon/human/species/station/seromi.dm +++ b/code/modules/mob/living/carbon/human/species/station/seromi.dm @@ -67,6 +67,8 @@ ) cold_discomfort_level = 180 + minimum_breath_pressure = 12 //Smaller, so needs less air + has_limbs = list( BP_TORSO = list("path" = /obj/item/organ/external/chest), BP_GROIN = list("path" = /obj/item/organ/external/groin), diff --git a/code/modules/mob/living/carbon/human/species/station/station.dm b/code/modules/mob/living/carbon/human/species/station/station.dm index 92fae53d3c..d7073b3529 100644 --- a/code/modules/mob/living/carbon/human/species/station/station.dm +++ b/code/modules/mob/living/carbon/human/species/station/station.dm @@ -60,6 +60,8 @@ heat_level_2 = 480 //Default 400 heat_level_3 = 1100 //Default 1000 + minimum_breath_pressure = 18 //Bigger, means they need more air + spawn_flags = SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED appearance_flags = HAS_HAIR_COLOR | HAS_LIPS | HAS_UNDERWEAR | HAS_SKIN_COLOR | HAS_EYE_COLOR diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index 8ae2ed52bf..ad3a41fbc8 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -151,15 +151,15 @@ var/list/ai_verbs_hidden = list( // For why this exists, refer to https://xkcd.c //Languages add_language("Robot Talk", 1) add_language(LANGUAGE_GALCOM, 1) - add_language(LANGUAGE_SOL_COMMON, 0) - add_language(LANGUAGE_UNATHI, 0) - add_language(LANGUAGE_SIIK, 0) - add_language(LANGUAGE_SKRELLIAN, 0) + add_language(LANGUAGE_SOL_COMMON, 1) + add_language(LANGUAGE_UNATHI, 1) + add_language(LANGUAGE_SIIK, 1) + add_language(LANGUAGE_SKRELLIAN, 1) add_language(LANGUAGE_TRADEBAND, 1) - add_language(LANGUAGE_GUTTER, 0) + add_language(LANGUAGE_GUTTER, 1) add_language(LANGUAGE_EAL, 1) - add_language(LANGUAGE_SCHECHI, 0) - add_language(LANGUAGE_SIGN, 0) + add_language(LANGUAGE_SCHECHI, 1) + add_language(LANGUAGE_SIGN, 1) if(!safety)//Only used by AIize() to successfully spawn an AI. if (!B)//If there is no player/brain inside. diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 190649129f..f516486f02 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -715,7 +715,9 @@ overlays += "[panelprefix]-openpanel -c" if(has_active_type(/obj/item/borg/combat/shield)) - overlays += "[module_sprites[icontype]]-shield" + var/obj/item/borg/combat/shield/shield = locate() in src + if(shield && shield.active) + overlays += "[module_sprites[icontype]]-shield" if(modtype == "Combat") if(module_active && istype(module_active,/obj/item/borg/combat/mobility)) diff --git a/code/modules/mob/living/silicon/robot/robot_damage.dm b/code/modules/mob/living/silicon/robot/robot_damage.dm index fd446ef3ec..b1436f423e 100644 --- a/code/modules/mob/living/silicon/robot/robot_damage.dm +++ b/code/modules/mob/living/silicon/robot/robot_damage.dm @@ -70,7 +70,7 @@ //Combat shielding absorbs a percentage of damage directly into the cell. if(has_active_type(/obj/item/borg/combat/shield)) var/obj/item/borg/combat/shield/shield = locate() in src - if(shield) + if(shield && shield.active) //Shields absorb a certain percentage of damage based on their power setting. var/absorb_brute = brute*shield.shield_level var/absorb_burn = burn*shield.shield_level diff --git a/code/modules/mob/living/silicon/robot/robot_items.dm b/code/modules/mob/living/silicon/robot/robot_items.dm index 4a68510aed..953010c33e 100644 --- a/code/modules/mob/living/silicon/robot/robot_items.dm +++ b/code/modules/mob/living/silicon/robot/robot_items.dm @@ -298,11 +298,54 @@ desc = "A powerful experimental module that turns aside or absorbs incoming attacks at the cost of charge." icon = 'icons/obj/decals.dmi' icon_state = "shock" - var/shield_level = 0.5 //Percentage of damage absorbed by the shield. + var/shield_level = 0.5 //Percentage of damage absorbed by the shield. + var/active = 1 //If the shield is on + var/flash_count = 0 //Counter for how many times the shield has been flashed + var/overload_threshold = 3 //Number of flashes it takes to overload the shield + var/shield_refresh = 15 SECONDS //Time it takes for the shield to reboot after destabilizing + var/overload_time = 0 //Stores the time of overload + var/last_flash = 0 //Stores the time of last flash + +/obj/item/borg/combat/shield/New() + processing_objects.Add(src) + ..() + +/obj/item/borg/combat/shield/Destroy() + processing_objects.Remove(src) + ..() /obj/item/borg/combat/shield/attack_self(var/mob/living/user) set_shield_level() +/obj/item/borg/combat/shield/process() + if(active) + if(flash_count && (last_flash + shield_refresh < world.time)) + flash_count = 0 + last_flash = 0 + else if(overload_time + shield_refresh < world.time) + active = 1 + flash_count = 0 + overload_time = 0 + + var/mob/living/user = src.loc + user.visible_message("[user]'s shield reactivates!", "Your shield reactivates!.") + user.update_icon() + +/obj/item/borg/combat/shield/proc/adjust_flash_count(var/mob/living/user, amount) + if(active) //Can't destabilize a shield that's not on + flash_count += amount + + if(amount > 0) + last_flash = world.time + if(flash_count >= overload_threshold) + overload(user) + +/obj/item/borg/combat/shield/proc/overload(var/mob/living/user) + active = 0 + user.visible_message("[user]'s shield destabilizes!", "Your shield destabilizes!.") + user.update_icon() + overload_time = world.time + /obj/item/borg/combat/shield/verb/set_shield_level() set name = "Set shield level" set category = "Object" diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm index bd12661437..9d30ef7244 100644 --- a/code/modules/mob/transform_procs.dm +++ b/code/modules/mob/transform_procs.dm @@ -77,10 +77,26 @@ else O.key = key + //Languages + add_language("Robot Talk", 1) + add_language(LANGUAGE_GALCOM, 1) + add_language(LANGUAGE_SOL_COMMON, 1) + add_language(LANGUAGE_UNATHI, 1) + add_language(LANGUAGE_SIIK, 1) + add_language(LANGUAGE_SKRELLIAN, 1) + add_language(LANGUAGE_TRADEBAND, 1) + add_language(LANGUAGE_GUTTER, 1) + add_language(LANGUAGE_EAL, 1) + add_language(LANGUAGE_SCHECHI, 1) + add_language(LANGUAGE_SIGN, 1) + + // Lorefolks say it may be so. if(O.client && O.client.prefs) var/datum/preferences/B = O.client.prefs - for(var/language in B.alternate_languages) - O.add_language(language) + if(LANGUAGE_ROOTGLOBAL in B.alternate_languages) + O.add_language(LANGUAGE_ROOTGLOBAL, 1) + if(LANGUAGE_ROOTLOCAL in B.alternate_languages) + O.add_language(LANGUAGE_ROOTLOCAL, 1) if(move) var/obj/loc_landmark diff --git a/code/modules/organs/internal/brain.dm b/code/modules/organs/internal/brain.dm index 77ead516c3..0a99fb37f3 100644 --- a/code/modules/organs/internal/brain.dm +++ b/code/modules/organs/internal/brain.dm @@ -127,6 +127,7 @@ desc = "A complex, organic knot of jelly and crystalline particles." icon = 'icons/mob/slimes.dmi' icon_state = "green slime extract" + parent_organ = BP_TORSO /obj/item/organ/internal/brain/golem name = "chem" diff --git a/code/modules/organs/internal/liver.dm b/code/modules/organs/internal/liver.dm index 6b7459500b..3b20f30214 100644 --- a/code/modules/organs/internal/liver.dm +++ b/code/modules/organs/internal/liver.dm @@ -39,10 +39,11 @@ // Do some reagent processing. if(owner.chem_effects[CE_ALCOHOL_TOXIC]) + take_damage(owner.chem_effects[CE_ALCOHOL_TOXIC] * 0.1 * PROCESS_ACCURACY, prob(1)) // Chance to warn them + if(filter_effect < 2) //Liver is badly damaged, you're drinking yourself to death + owner.adjustToxLoss(owner.chem_effects[CE_ALCOHOL_TOXIC] * 0.2 * PROCESS_ACCURACY) if(filter_effect < 3) owner.adjustToxLoss(owner.chem_effects[CE_ALCOHOL_TOXIC] * 0.1 * PROCESS_ACCURACY) - else - take_damage(owner.chem_effects[CE_ALCOHOL_TOXIC] * 0.1 * PROCESS_ACCURACY, prob(1)) // Chance to warn them /obj/item/organ/internal/liver/handle_germ_effects() . = ..() //Up should return an infection level as an integer diff --git a/code/modules/organs/subtypes/slime.dm b/code/modules/organs/subtypes/slime.dm new file mode 100644 index 0000000000..1c9c11d75b --- /dev/null +++ b/code/modules/organs/subtypes/slime.dm @@ -0,0 +1,47 @@ +/obj/item/organ/external/chest/unbreakable/slime + nonsolid = 1 + max_damage = 50 + encased = 0 + +/obj/item/organ/external/groin/unbreakable/slime + nonsolid = 1 + max_damage = 30 + +/obj/item/organ/external/arm/unbreakable/slime + nonsolid = 1 + max_damage = 5 + +/obj/item/organ/external/arm/right/unbreakable/slime + nonsolid = 1 + max_damage = 5 + +/obj/item/organ/external/leg/unbreakable/slime + nonsolid = 1 + max_damage = 5 + +/obj/item/organ/external/leg/right/unbreakable/slime + nonsolid = 1 + max_damage = 5 + +/obj/item/organ/external/foot/unbreakable/slime + nonsolid = 1 + max_damage = 5 + +/obj/item/organ/external/foot/right/unbreakable/slime + nonsolid = 1 + max_damage = 5 + +/obj/item/organ/external/hand/unbreakable/slime + nonsolid = 1 + max_damage = 5 + +/obj/item/organ/external/hand/right/unbreakable/slime + nonsolid = 1 + max_damage = 5 + +/obj/item/organ/external/head/unbreakable/slime //They don't need this anymore. + nonsolid = 1 + cannot_gib = 0 + vital = 0 + max_damage = 5 + encased = 0 \ No newline at end of file diff --git a/code/modules/organs/subtypes/unbreakable.dm b/code/modules/organs/subtypes/unbreakable.dm index fcd819029e..61126769cd 100644 --- a/code/modules/organs/subtypes/unbreakable.dm +++ b/code/modules/organs/subtypes/unbreakable.dm @@ -40,49 +40,4 @@ /obj/item/organ/external/head/unbreakable cannot_break = 1 - dislocated = -1 - -// Slime limbs. -/obj/item/organ/external/chest/unbreakable/slime - nonsolid = 1 - max_damage = 50 - -/obj/item/organ/external/groin/unbreakable/slime - nonsolid = 1 - max_damage = 30 - -/obj/item/organ/external/arm/unbreakable/slime - nonsolid = 1 - max_damage = 5 - -/obj/item/organ/external/arm/right/unbreakable/slime - nonsolid = 1 - max_damage = 5 - -/obj/item/organ/external/leg/unbreakable/slime - nonsolid = 1 - max_damage = 5 - -/obj/item/organ/external/leg/right/unbreakable/slime - nonsolid = 1 - max_damage = 5 - -/obj/item/organ/external/foot/unbreakable/slime - nonsolid = 1 - max_damage = 5 - -/obj/item/organ/external/foot/right/unbreakable/slime - nonsolid = 1 - max_damage = 5 - -/obj/item/organ/external/hand/unbreakable/slime - nonsolid = 1 - max_damage = 5 - -/obj/item/organ/external/hand/right/unbreakable/slime - nonsolid = 1 - max_damage = 5 - -/obj/item/organ/external/head/unbreakable/slime - nonsolid = 1 - max_damage = 5 + dislocated = -1 \ No newline at end of file diff --git a/code/modules/projectiles/ammunition/magazines.dm b/code/modules/projectiles/ammunition/magazines.dm index 82a6aa74e4..342e10db84 100644 --- a/code/modules/projectiles/ammunition/magazines.dm +++ b/code/modules/projectiles/ammunition/magazines.dm @@ -443,6 +443,23 @@ /obj/item/ammo_magazine/m762m/empty initial_ammo = 0 +/obj/item/ammo_magazine/m762garand + name = "garand clip (7.62mm)" // The clip goes into the magazine, hence the name. I'm very sure this is correct. + icon_state = "gclip" + mag_type = MAGAZINE + caliber = "7.62mm" + matter = list(DEFAULT_WALL_MATERIAL = 1600) + ammo_type = /obj/item/ammo_casing/a762 + max_ammo = 8 + multiple_sprites = 1 + +/obj/item/ammo_magazine/m762garand/ap + name = "garand clip (7.62mm armor-piercing)" + ammo_type = /obj/item/ammo_casing/a762/ap + +/obj/item/ammo_magazine/m762/empty + initial_ammo = 0 + /obj/item/ammo_magazine/clip/c762 name = "ammo clip (7.62mm)" icon_state = "clip_rifle" diff --git a/code/modules/projectiles/guns/projectile/semiauto.dm b/code/modules/projectiles/guns/projectile/semiauto.dm new file mode 100644 index 0000000000..d4cd616188 --- /dev/null +++ b/code/modules/projectiles/guns/projectile/semiauto.dm @@ -0,0 +1,21 @@ +/obj/item/weapon/gun/projectile/garand + name = "\improper M1 Garand" + desc = "This is the vintage semi-automatic rifle that famously helped win the second World War. What the hell it's doing aboard a space station in the 26th century, you can only imagine. Uses 7.62mm rounds." + icon_state = "garand" + item_state = "boltaction" + w_class = ITEMSIZE_LARGE + caliber = "7.62mm" + origin_tech = list(TECH_COMBAT = 2, TECH_MATERIAL = 2) + slot_flags = SLOT_BACK + fire_sound = 'sound/weapons/rifleshot.ogg' + load_method = MAGAZINE // ToDo: Make it so MAGAZINE, SPEEDLOADER and SINGLE_CASING can all be used on the same gun. + magazine_type = /obj/item/ammo_magazine/m762garand + allowed_magazines = list(/obj/item/ammo_magazine/m762garand) + auto_eject = 1 + auto_eject_sound = 'sound/weapons/garand_ping.ogg' + +/obj/item/weapon/gun/projectile/garand/update_icon() + if(ammo_magazine) + icon_state = initial(icon_state) + else + icon_state = "[initial(icon_state)]-e" diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm index 536a069474..35deb6935f 100644 --- a/code/modules/reagents/reagent_containers/syringes.dm +++ b/code/modules/reagents/reagent_containers/syringes.dm @@ -58,7 +58,7 @@ return if(mode == SYRINGE_BROKEN) - user << "This syringe is broken!" + to_chat(user, "This syringe is broken!") return if(user.a_intent == I_HURT && ismob(target)) @@ -70,26 +70,31 @@ switch(mode) if(SYRINGE_DRAW) if(!reagents.get_free_space()) - user << "The syringe is full." + to_chat(user, "The syringe is full.") mode = SYRINGE_INJECT return if(ismob(target))//Blood! if(reagents.has_reagent("blood")) - user << "There is already a blood sample in this syringe." + to_chat(user, "There is already a blood sample in this syringe.") return + if(istype(target, /mob/living/carbon)) var/amount = reagents.get_free_space() var/mob/living/carbon/T = target if(!T.dna) - user << "You are unable to locate any blood. (To be specific, your target seems to be missing their DNA datum)." + to_chat(user, "You are unable to locate any blood. (To be specific, your target seems to be missing their DNA datum).") return if(NOCLONE in T.mutations) //target done been et, no more blood in him - user << "You are unable to locate any blood." + to_chat(user, "You are unable to locate any blood.") + return + + if(T.isSynthetic()) + to_chat(user, "You can't draw blood from a synthetic!") return if(drawing) - user << "You are already drawing blood from [T.name]." + to_chat(user, "You are already drawing blood from [T.name].") return var/datum/reagent/B @@ -117,50 +122,51 @@ reagents.update_total() on_reagent_change() reagents.handle_reactions() - user << "You take a blood sample from [target]." + to_chat(user, "You take a blood sample from [target].") for(var/mob/O in viewers(4, user)) O.show_message("[user] takes a blood sample from [target].", 1) else //if not mob if(!target.reagents.total_volume) - user << "[target] is empty." + to_chat(user, "[target] is empty.") return if(!target.is_open_container() && !istype(target, /obj/structure/reagent_dispensers) && !istype(target, /obj/item/slime_extract) && !istype(target, /obj/item/weapon/reagent_containers/food)) - user << "You cannot directly remove reagents from this object." + to_chat(user, "You cannot directly remove reagents from this object.") return var/trans = target.reagents.trans_to_obj(src, amount_per_transfer_from_this) - user << "You fill the syringe with [trans] units of the solution." + to_chat(user, "You fill the syringe with [trans] units of the solution.") update_icon() + if(!reagents.get_free_space()) mode = SYRINGE_INJECT update_icon() if(SYRINGE_INJECT) if(!reagents.total_volume) - user << "The syringe is empty." + to_chat(user, "The syringe is empty.") mode = SYRINGE_DRAW return if(istype(target, /obj/item/weapon/implantcase/chem)) return if(!target.is_open_container() && !ismob(target) && !istype(target, /obj/item/weapon/reagent_containers/food) && !istype(target, /obj/item/slime_extract) && !istype(target, /obj/item/clothing/mask/smokable/cigarette) && !istype(target, /obj/item/weapon/storage/fancy/cigarettes)) - user << "You cannot directly fill this object." + to_chat(user, "You cannot directly fill this object.") return if(!target.reagents.get_free_space()) - user << "[target] is full." + to_chat(user, "[target] is full.") return var/mob/living/carbon/human/H = target if(istype(H)) var/obj/item/organ/external/affected = H.get_organ(user.zone_sel.selecting) if(!affected) - user << "\The [H] is missing that limb!" + to_chat(user, "\The [H] is missing that limb!") return else if(affected.robotic >= ORGAN_ROBOT) - user << "You cannot inject a robotic limb." + to_chat(user, "You cannot inject a robotic limb.") return if(ismob(target) && target != user) @@ -200,9 +206,9 @@ else trans = reagents.trans_to_obj(target, amount_per_transfer_from_this) if(trans) - user << "You inject [trans] units of the solution. The syringe now contains [src.reagents.total_volume] units." + to_chat(user, "You inject [trans] units of the solution. The syringe now contains [src.reagents.total_volume] units.") else - user << "The syringe is empty." + to_chat(user, "The syringe is empty.") if (reagents.total_volume <= 0 && mode == SYRINGE_INJECT) mode = SYRINGE_DRAW update_icon() @@ -245,7 +251,7 @@ var/obj/item/organ/external/affecting = H.get_organ(target_zone) if (!affecting || affecting.is_stump()) - user << "They are missing that limb!" + to_chat(user, "They are missing that limb!") return var/hit_area = affecting.name @@ -302,10 +308,10 @@ /obj/item/weapon/reagent_containers/syringe/ld50_syringe/afterattack(obj/target, mob/user, flag) if(mode == SYRINGE_DRAW && ismob(target)) // No drawing 50 units of blood at once - user << "This needle isn't designed for drawing blood." + to_chat(user, "This needle isn't designed for drawing blood.") return if(user.a_intent == "hurt" && ismob(target)) // No instant injecting - user << "This syringe is too big to stab someone with it." + to_chat(user, "This syringe is too big to stab someone with it.") ..() //////////////////////////////////////////////////////////////////////////////// diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm index b99b9a7dde..a6e6a94850 100644 --- a/code/modules/research/designs.dm +++ b/code/modules/research/designs.dm @@ -473,6 +473,15 @@ other types of metals and chemistry for reagents). build_path = /obj/item/weapon/surgical/scalpel/manager sort_string = "MBBAD" +/datum/design/item/bone_clamp + name = "Bone Clamp" + desc = "A miracle of modern science, this tool rapidly knits together bone, without the need for bone gel." + id = "bone_clamp" + req_tech = list(TECH_BIO = 4, TECH_MATERIAL = 5, TECH_MAGNET = 4, TECH_DATA = 4) + materials = list (DEFAULT_WALL_MATERIAL = 12500, "glass" = 7500, "silver" = 2500) + build_path = /obj/item/weapon/surgical/bone_clamp + sort_string = "MBBAE" + /datum/design/item/implant materials = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50) diff --git a/code/modules/surgery/bones.dm b/code/modules/surgery/bones.dm index 6a5a39df73..e1086dbdca 100644 --- a/code/modules/surgery/bones.dm +++ b/code/modules/surgery/bones.dm @@ -145,4 +145,42 @@ fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/obj/item/organ/external/affected = target.get_organ(target_zone) user.visible_message("[user]'s hand slips, smearing [tool] in the incision in [target]'s [affected.name]!" , \ - "Your hand slips, smearing [tool] in the incision in [target]'s [affected.name]!") \ No newline at end of file + "Your hand slips, smearing [tool] in the incision in [target]'s [affected.name]!") + + + +/datum/surgery_step/clamp_bone + allowed_tools = list( + /obj/item/weapon/surgical/bone_clamp = 100 + ) + can_infect = 1 + blood_level = 1 + + min_duration = 70 + max_duration = 90 + + can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + if (!hasorgans(target)) + return 0 + var/obj/item/organ/external/affected = target.get_organ(target_zone) + return affected && (affected.robotic < ORGAN_ROBOT) && affected.open >= 2 && affected.stage == 0 + + begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/organ/external/affected = target.get_organ(target_zone) + if (affected.stage == 0) + user.visible_message("[user] starts repairing the damaged bones in [target]'s [affected.name] with \the [tool]." , \ + "You starts repairing the damaged bones in [target]'s [affected.name] with \the [tool].") + target.custom_pain("Something in your [affected.name] is causing you a lot of pain!", 50) + ..() + + end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/organ/external/affected = target.get_organ(target_zone) + user.visible_message("[user] sets the bone in [target]'s [affected.name] with \the [tool].", \ + "You sets [target]'s bone in [affected.name] with \the [tool].") + affected.status &= ~ORGAN_BROKEN + + fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/organ/external/affected = target.get_organ(target_zone) + user.visible_message("[user]'s hand slips, damaging the bone in [target]'s [affected.name] with \the [tool]!" , \ + "Your hand slips, damaging the bone in [target]'s [affected.name] with \the [tool]!") + affected.createwound(BRUISE, 5) \ No newline at end of file diff --git a/code/modules/surgery/robotics.dm b/code/modules/surgery/robotics.dm index 09db2e3146..660cc6e05b 100644 --- a/code/modules/surgery/robotics.dm +++ b/code/modules/surgery/robotics.dm @@ -168,10 +168,16 @@ var/obj/item/organ/external/affected = target.get_organ(target_zone) if(istype(tool,/obj/item/stack/cable_coil/)) var/obj/item/stack/cable_coil/C = tool - if(!C.can_use(5)) - user << "You need ten or more cable pieces to repair this damage." //usage amount made more consistent with regular cable repair + if(affected.burn_dam == 0) + to_chat(user, "There are no burnt wires here!") return SURGERY_FAILURE - C.use(5) + else + if(!C.can_use(5)) + to_chat(user, "You need at least five cable pieces to repair this part.") //usage amount made more consistent with regular cable repair + return SURGERY_FAILURE + else + C.use(5) + return affected && affected.open == 3 && (affected.disfigured || affected.burn_dam > 0) && target_zone != O_MOUTH begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) diff --git a/html/changelogs/Woodrat-SyndIDs.yml b/html/changelogs/Woodrat-SyndIDs.yml new file mode 100644 index 0000000000..fba90ab1fd --- /dev/null +++ b/html/changelogs/Woodrat-SyndIDs.yml @@ -0,0 +1,37 @@ +################################ +# Example Changelog File +# +# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. +# +# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) +# When it is, any changes listed below will disappear. +# +# Valid Prefixes: +# bugfix +# wip (For works in progress) +# tweak +# soundadd +# sounddel +# rscadd (general adding of nice things) +# rscdel (general deleting of nice things) +# imageadd +# imagedel +# maptweak +# spellcheck (typo fixes) +# experiment +################################# + +# Your name. +author: Woodrat + +# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. +delete-after: True + +# Any changes you've made. See valid prefix list above. +# INDENT WITH TWO SPACES. NOT TABS. SPACES. +# SCREW THIS UP AND IT WON'T WORK. +# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries. +# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog. +changes: + - rscadd: "Added a Syndicate ID with all access (admin spawn only)." + - tweak: "Port of 'Syndicate id cards now listen for owner destruction' from Bay." diff --git a/icons/mob/belt.dmi b/icons/mob/belt.dmi index 7ff90a6741..00e10be77a 100644 Binary files a/icons/mob/belt.dmi and b/icons/mob/belt.dmi differ diff --git a/icons/mob/belt_mirror.dmi b/icons/mob/belt_mirror.dmi index eefa872e82..859701435f 100644 Binary files a/icons/mob/belt_mirror.dmi and b/icons/mob/belt_mirror.dmi differ diff --git a/icons/mob/mob.dmi b/icons/mob/mob.dmi index 94028db1fa..ec0e70ccdc 100644 Binary files a/icons/mob/mob.dmi and b/icons/mob/mob.dmi differ diff --git a/icons/obj/ammo.dmi b/icons/obj/ammo.dmi index 6613998f40..27744ed62e 100644 Binary files a/icons/obj/ammo.dmi and b/icons/obj/ammo.dmi differ diff --git a/icons/obj/gun.dmi b/icons/obj/gun.dmi index a42094e296..1550d6bf4b 100644 Binary files a/icons/obj/gun.dmi and b/icons/obj/gun.dmi differ diff --git a/icons/obj/items.dmi b/icons/obj/items.dmi index 58b33a65af..6465ec3319 100644 Binary files a/icons/obj/items.dmi and b/icons/obj/items.dmi differ diff --git a/icons/obj/structures.dmi b/icons/obj/structures.dmi index 341f5a33c0..f51de6956b 100644 Binary files a/icons/obj/structures.dmi and b/icons/obj/structures.dmi differ diff --git a/icons/obj/surgery.dmi b/icons/obj/surgery.dmi index 15ef72276f..c08940b530 100644 Binary files a/icons/obj/surgery.dmi and b/icons/obj/surgery.dmi differ diff --git a/icons/turf/areas.dmi b/icons/turf/areas.dmi index d1bfcbfb01..8ad45585ab 100755 Binary files a/icons/turf/areas.dmi and b/icons/turf/areas.dmi differ diff --git a/maps/_map_system_readme.dm b/maps/_map_system_readme.dm new file mode 100644 index 0000000000..95e996907b --- /dev/null +++ b/maps/_map_system_readme.dm @@ -0,0 +1,18 @@ +/* +This system is in place to make it easier to seperate data specific to a certain map. + +Each map should have their own folder, and contain both the actual map files, and the code files defining their unique +things, such as areas, elevators, or shuttles. Generally, the layout is that your map folder has, + +[map_name] folder + [map_name].dm - Containing a lot of #define directives, and is used to automatically load the other files you need. + [map_name_defines].dm - This contains the code for the map datum. For more details, read the comments inside ~map_system folder. + (optional) [map_name]_areas/structures/whatever.dm - Files for unique things to that map. + [map_name]-1.dmm - Your actual map files. Z-levels should be ordered correctly if you seperate your z-levels across map files. + +-HOW TO LOAD A SPECIFIC MAP- +Say you want to load southern_cross, +First, uncheck your current loaded map, presumably northern_star. Uncheck northern_star.dm inside northern_star folder. +Then go open southern_cross folder, and check southern_cross.dm, don't check any other folders below, and compile. +When you finish compiling, you should be able to open the map files for southern_cross. +*/ \ No newline at end of file diff --git a/maps/northern_star/polaris-1.dmm b/maps/northern_star/polaris-1.dmm index b60a19ee63..5ad8351211 100644 --- a/maps/northern_star/polaris-1.dmm +++ b/maps/northern_star/polaris-1.dmm @@ -4682,7 +4682,7 @@ "bMb" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/effect/floor_decal/industrial/warning{dir = 1},/turf/simulated/floor/tiled,/area/assembly/robotics) "bMc" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/floor_decal/industrial/warning{dir = 1},/obj/machinery/mecha_part_fabricator,/turf/simulated/floor/tiled,/area/assembly/robotics) "bMd" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/floor_decal/industrial/warning{dir = 1},/obj/machinery/pros_fabricator,/turf/simulated/floor/tiled,/area/assembly/robotics) -"bMe" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/floor_decal/industrial/warning{dir = 1},/obj/structure/table/standard,/obj/item/device/robotanalyzer,/obj/item/device/robotanalyzer,/obj/item/device/mmi/digital/posibrain,/turf/simulated/floor/tiled,/area/assembly/robotics) +"bMe" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/floor_decal/industrial/warning{dir = 1},/obj/structure/table/standard,/obj/item/device/robotanalyzer,/obj/item/device/robotanalyzer,/obj/item/device/mmi/digital/robot,/turf/simulated/floor/tiled,/area/assembly/robotics) "bMf" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/floor_decal/industrial/warning{dir = 1},/turf/simulated/floor/tiled,/area/assembly/robotics) "bMg" = (/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/effect/floor_decal/industrial/warning{dir = 1},/turf/simulated/floor/tiled,/area/assembly/robotics) "bMh" = (/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/item/weapon/storage/toolbox/mechanical,/obj/item/weapon/storage/toolbox/mechanical{pixel_x = -2; pixel_y = -1},/obj/effect/floor_decal/corner/pink{dir = 6},/obj/item/weapon/storage/toolbox/mechanical,/obj/item/device/multitool{pixel_x = 3},/obj/item/device/multitool{pixel_x = 3},/obj/item/weapon/crowbar,/obj/item/weapon/crowbar,/obj/item/weapon/storage/belt/utility,/obj/item/weapon/storage/belt/utility,/obj/item/weapon/storage/toolbox/electrical{pixel_x = 1; pixel_y = 6},/obj/effect/floor_decal/industrial/warning{dir = 1},/obj/item/weapon/storage/toolbox/electrical{pixel_x = 1; pixel_y = 6},/turf/simulated/floor/tiled,/area/assembly/robotics) diff --git a/maps/plane/plane-1.dmm b/maps/plane/plane-1.dmm new file mode 100644 index 0000000000..8017636b44 --- /dev/null +++ b/maps/plane/plane-1.dmm @@ -0,0 +1,71 @@ +"a" = (/turf/unsimulated/wall/planetary/sif,/area/plane_ground) +"b" = (/turf/simulated/floor/outdoors/dirt,/area/plane_ground) +"c" = (/obj/effect/landmark/start,/turf/simulated/floor/outdoors/dirt,/area/plane_ground) +"d" = (/obj/effect/landmark{name = "JoinLate"},/turf/simulated/floor/outdoors/dirt,/area/plane_ground) + +(1,1,1) = {" +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba +abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba +abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba +abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba +abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba +abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba +abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba +abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba +abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba +abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba +abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba +abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba +abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba +abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba +abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba +abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba +abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba +abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba +abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba +abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba +abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba +abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba +abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba +abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba +abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba +abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba +abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba +abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba +abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba +abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba +abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba +abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbcbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba +abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba +abbbbbbbbbbbbbbbbbbbbbbbbbbbbbdddbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba +abbbbbbbbbbbbbbbbbbbbbbbbbbbbbdddbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba +abbbbbbbbbbbbbbbbbbbbbbbbbbbbbdddbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba +abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba +abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba +abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba +abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba +abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba +abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba +abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba +abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba +abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba +abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba +abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba +abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba +abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba +abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba +abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba +abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba +abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba +abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba +abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba +abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba +abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba +abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba +abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba +abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba +abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba +abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +"} diff --git a/maps/plane/plane-2.dmm b/maps/plane/plane-2.dmm new file mode 100644 index 0000000000..06144256e9 --- /dev/null +++ b/maps/plane/plane-2.dmm @@ -0,0 +1,70 @@ +"a" = (/turf/unsimulated/wall/planetary/sif,/area/plane_sky) +"b" = (/turf/simulated/open,/area/plane_sky) +"c" = (/obj/effect/landmark/map_data{height = 2},/turf/simulated/open,/area/plane_sky) + +(1,1,1) = {" +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba +abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba +abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba +abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba +abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba +abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba +abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba +abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba +abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba +abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba +abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba +abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba +abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba +abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba +abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba +abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba +abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba +abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba +abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba +abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba +abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba +abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba +abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba +abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba +abbbbbbbbbbbbbbbbbbbbbcbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba +abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba +abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba +abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba +abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba +abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba +abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba +abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba +abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba +abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba +abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba +abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba +abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba +abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba +abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba +abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba +abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba +abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba +abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba +abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba +abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba +abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba +abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba +abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba +abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba +abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba +abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba +abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba +abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba +abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba +abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba +abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba +abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba +abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba +abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba +abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba +abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba +abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +"} diff --git a/maps/plane/plane.dm b/maps/plane/plane.dm new file mode 100644 index 0000000000..71ba0072af --- /dev/null +++ b/maps/plane/plane.dm @@ -0,0 +1,16 @@ +#if !defined(USING_MAP_DATUM) + + #include "plane-1.dmm" + #include "plane-2.dmm" + + #include "plane_defines.dm" + #include "plane_areas.dm" + + + #define USING_MAP_DATUM /datum/map/plane + +#elif !defined(MAP_OVERRIDE) + + #warn A map has already been included, ignoring Plane + +#endif \ No newline at end of file diff --git a/maps/plane/plane_areas.dm b/maps/plane/plane_areas.dm new file mode 100644 index 0000000000..2df2eb91d7 --- /dev/null +++ b/maps/plane/plane_areas.dm @@ -0,0 +1,5 @@ +/area/plane_ground + name = "flat plane" + +/area/plane_sky + name = "open sky" \ No newline at end of file diff --git a/maps/plane/plane_defines.dm b/maps/plane/plane_defines.dm new file mode 100644 index 0000000000..8d1e48a5ec --- /dev/null +++ b/maps/plane/plane_defines.dm @@ -0,0 +1,41 @@ +#define Z_LEVEL_FIRST_PLANE 1 +#define Z_LEVEL_SECOND_PLANE 2 + +/datum/map/plane + name = "Another Test Map" + full_name = "The Flat Test Map" + path = "plane" + + lobby_icon = 'icons/misc/title.dmi' + lobby_screens = list("mockingjay00") + + zlevel_datum_type = /datum/map_z_level/plane + + station_name = "The Plain Plane for Air Planes" + station_short = "The Plane" + dock_name = "the Maximum Fun Chamber" + boss_name = "Mister Fun" + boss_short = "Mr. Fun" + company_name = "Fun Inc." + company_short = "FI" + starsys_name = "Not Vir" + +/datum/map_z_level/plane/first + z = Z_LEVEL_FIRST_PLANE + name = "The Ground" + flags = MAP_LEVEL_STATION|MAP_LEVEL_CONTACT|MAP_LEVEL_PLAYER + transit_chance = 50 + base_turf = /turf/simulated/floor/outdoors/rocks + +/datum/map_z_level/plane/second + z = Z_LEVEL_SECOND_PLANE + name = "The Sky" + flags = MAP_LEVEL_STATION|MAP_LEVEL_CONTACT|MAP_LEVEL_PLAYER + transit_chance = 50 + base_turf = /turf/simulated/open + +/datum/planet/sif + expected_z_levels = list( + Z_LEVEL_FIRST_PLANE, + Z_LEVEL_SECOND_PLANE + ) \ No newline at end of file diff --git a/maps/southern_cross/southern_cross-1.dmm b/maps/southern_cross/southern_cross-1.dmm index 387e39f2a2..7ddf50a7c0 100644 --- a/maps/southern_cross/southern_cross-1.dmm +++ b/maps/southern_cross/southern_cross-1.dmm @@ -4960,7 +4960,7 @@ "bRt" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/research{id_tag = "researchdoor"; name = "Research Division Access"; req_access = list(47)},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled/dark,/area/rnd/research) "bRu" = (/obj/effect/floor_decal/industrial/warning{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/obj/machinery/light_switch{pixel_x = -36},/obj/structure/cable/green,/turf/simulated/floor/tiled/white,/area/assembly/robotics) "bRv" = (/obj/machinery/mecha_part_fabricator,/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/assembly/robotics) -"bRw" = (/obj/effect/floor_decal/industrial/outline/yellow,/obj/structure/table/steel_reinforced,/obj/item/device/robotanalyzer,/obj/item/device/robotanalyzer,/obj/item/device/mmi/digital/posibrain,/turf/simulated/floor/tiled,/area/assembly/robotics) +"bRw" = (/obj/effect/floor_decal/industrial/outline/yellow,/obj/structure/table/steel_reinforced,/obj/item/device/robotanalyzer,/obj/item/device/robotanalyzer,/obj/item/device/mmi/digital/robot,/turf/simulated/floor/tiled,/area/assembly/robotics) "bRx" = (/obj/machinery/pros_fabricator,/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/assembly/robotics) "bRy" = (/obj/machinery/camera/network/research{c_tag = "SCI - Robotics"; dir = 1},/turf/simulated/floor/tiled/white,/area/assembly/robotics) "bRz" = (/obj/effect/floor_decal/industrial/warning{dir = 8},/obj/machinery/firealarm{dir = 1; pixel_x = 0; pixel_y = -24},/turf/simulated/floor/tiled,/area/assembly/robotics) diff --git a/maps/submaps/surface_submaps/farm1.dmm b/maps/submaps/surface_submaps/farm1.dmm new file mode 100644 index 0000000000..a89d481737 --- /dev/null +++ b/maps/submaps/surface_submaps/farm1.dmm @@ -0,0 +1,78 @@ +"a" = (/turf/template_noop,/area/template_noop) +"b" = (/turf/simulated/floor/outdoors/dirt,/area/submap/farm1) +"c" = (/obj/structure/railing,/turf/simulated/floor/outdoors/dirt,/area/submap/farm1) +"d" = (/obj/structure/railing{tag = "icon-railing0 (EAST)"; icon_state = "railing0"; dir = 4},/turf/simulated/floor/outdoors/dirt,/area/submap/farm1) +"e" = (/turf/simulated/floor/outdoors/grass/sif,/area/submap/farm1) +"f" = (/obj/structure/railing{tag = "icon-railing0 (WEST)"; icon_state = "railing0"; dir = 8},/turf/simulated/floor/outdoors/dirt,/area/submap/farm1) +"g" = (/turf/simulated/wall/wood,/area/submap/farm1) +"h" = (/obj/structure/grille/rustic,/obj/structure/window/reinforced/full,/turf/simulated/floor/plating,/area/submap/farm1) +"i" = (/obj/structure/closet/secure_closet/freezer/fridge,/turf/simulated/floor/wood,/area/submap/farm1) +"j" = (/turf/simulated/floor/wood,/area/submap/farm1) +"k" = (/obj/structure/table/marble,/turf/simulated/floor/wood,/area/submap/farm1) +"l" = (/obj/structure/table/marble,/obj/item/weapon/material/kitchen/rollingpin,/turf/simulated/floor/wood,/area/submap/farm1) +"m" = (/obj/machinery/portable_atmospherics/hydroponics/soil,/obj/item/seeds/cornseed,/turf/simulated/floor/outdoors/dirt,/area/submap/farm1) +"n" = (/obj/item/weapon/material/minihoe,/turf/simulated/floor/outdoors/dirt,/area/submap/farm1) +"o" = (/obj/structure/table/marble,/obj/item/weapon/material/kitchen/utensil/knife,/turf/simulated/floor/wood,/area/submap/farm1) +"p" = (/obj/machinery/portable_atmospherics/hydroponics/soil,/obj/item/seeds/bluetomatoseed,/turf/simulated/floor/outdoors/dirt,/area/submap/farm1) +"q" = (/turf/simulated/floor/outdoors/mud,/area/submap/farm1) +"r" = (/obj/machinery/portable_atmospherics/hydroponics/soil,/obj/item/seeds/icepepperseed,/turf/simulated/floor/outdoors/dirt,/area/submap/farm1) +"s" = (/obj/structure/simple_door/wood,/turf/simulated/floor/wood,/area/submap/farm1) +"t" = (/mob/living/bot/farmbot,/turf/simulated/floor/outdoors/dirt,/area/submap/farm1) +"u" = (/obj/structure/sink/puddle,/turf/simulated/floor/outdoors/mud,/area/submap/farm1) +"v" = (/obj/item/weapon/material/hatchet,/turf/simulated/floor/outdoors/mud,/area/submap/farm1) +"w" = (/obj/structure/table/woodentable,/obj/item/weapon/storage/box/matches,/obj/item/weapon/flame/match,/turf/simulated/floor/wood,/area/submap/farm1) +"x" = (/obj/structure/table/woodentable,/turf/simulated/floor/wood,/area/submap/farm1) +"y" = (/obj/item/clothing/shoes/boots/winter/hydro,/obj/item/clothing/suit/storage/hooded/wintercoat/hydro,/turf/simulated/floor/wood,/area/submap/farm1) +"z" = (/obj/structure/bed/chair/wood{tag = "icon-wooden_chair (WEST)"; icon_state = "wooden_chair"; dir = 8},/turf/simulated/floor/wood,/area/submap/farm1) +"A" = (/obj/item/weapon/reagent_containers/glass/bucket,/turf/simulated/floor/outdoors/dirt,/area/submap/farm1) +"B" = (/obj/structure/table/woodentable,/obj/item/weapon/storage/fancy/candle_box,/turf/simulated/floor/wood,/area/submap/farm1) +"C" = (/obj/machinery/portable_atmospherics/hydroponics/soil,/obj/item/seeds/wheatseed,/turf/simulated/floor/outdoors/dirt,/area/submap/farm1) +"D" = (/obj/structure/closet/crate/bin,/turf/simulated/floor/wood,/area/submap/farm1) +"E" = (/obj/machinery/space_heater,/turf/simulated/floor/wood,/area/submap/farm1) +"F" = (/obj/structure/bookcase,/obj/item/weapon/book/manual/hydroponics_pod_people,/turf/simulated/floor/wood,/area/submap/farm1) +"G" = (/obj/structure/bed/padded,/obj/item/weapon/bedsheet/blue,/turf/simulated/floor/wood,/area/submap/farm1) +"H" = (/obj/structure/table/woodentable,/obj/item/trash/candle,/turf/simulated/floor/wood,/area/submap/farm1) +"I" = (/turf/simulated/floor/outdoors/rocks,/area/submap/farm1) +"J" = (/turf/simulated/floor/plating,/area/submap/farm1) +"K" = (/turf/simulated/floor/water,/area/submap/farm1) +"L" = (/obj/structure/loot_pile/maint/technical,/turf/simulated/floor/plating,/area/submap/farm1) +"M" = (/obj/machinery/power/port_gen/pacman,/turf/simulated/floor/plating,/area/submap/farm1) +"N" = (/obj/structure/closet/crate/hydroponics/prespawned,/turf/simulated/floor/plating,/area/submap/farm1) +"O" = (/obj/structure/table/steel,/obj/machinery/cell_charger,/turf/simulated/floor/plating,/area/submap/farm1) +"P" = (/obj/structure/table/steel,/turf/simulated/floor/plating,/area/submap/farm1) +"Q" = (/obj/structure/railing{tag = "icon-railing0 (NORTH)"; icon_state = "railing0"; dir = 1},/turf/simulated/floor/outdoors/dirt,/area/submap/farm1) + +(1,1,1) = {" +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +abccccccccccccccccccccccccbaaaaa +adeeeeeeeeeeeeeeeeeeeeeeeefaaaaa +adeeeeeeeeeeeeeeeeeeeeeeeefaaaaa +adeegghhggeeeeeeeeeeeeeeeefaaaaa +adeegijklgeeeeemmmmmmmmmeefaaaaa +adeegjjjkheeeeebnbbbbbbbeefaaaaa +adeegjjjogebbeepppqqqrrreefaaaaa +adegggsgggebbbbtbbquvbbbeefaaaaa +adegwxjygeeebbepppqqqrrreefaaaaa +adehxzjjgggebeebbAbbbbbbeefaaaaa +adehBjjjsjsbbeeCCCCCCCCCeefaaaaa +adegDjjEgggebeeeeeeeeeeeeefaaaaa +adeggsgggeeebeeeeeeeeeeeeefaaaaa +adegFjjGgeebbbeeeeebbbbbbbbbbbba +adegEjjHgeebbbbbbbbbbbbbbbbbbbba +adeggggggeebeeeeeeebbbbbbbbbbbba +adeebbbbbbbbeeeeeeebbbeeeefaaaaa +adebbIIIIIIbbeeegggJJJgggefaaaaa +adebIIKKKKIIbbeegLJJJJJLgefaaaaa +adebIKKKKKKIIbbehMJJJJJJhefaaaaa +adebIIKKKKKKIIbehLJJJJJLhefaaaaa +adebbIIKKKKKKIbehNJJJJJJhefaaaaa +adeebbIIKKKKIIbegLJOPPJLgefaaaaa +adeeebbIIIIIIbbegggggggggefaaaaa +adeeeebbbbbbbbeeeeeeeeeeeefaaaaa +adeeeeeeeeeeeeeeeeeeeeeeeefaaaaa +abQQQQQQQQQQQQQQQQQQQQQQQQbaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +"} diff --git a/maps/submaps/surface_submaps/forest.dm b/maps/submaps/surface_submaps/forest.dm index dd02c1b204..be13e4f947 100644 --- a/maps/submaps/surface_submaps/forest.dm +++ b/maps/submaps/surface_submaps/forest.dm @@ -2,4 +2,9 @@ name = "Surface Content" desc = "Used to make the surface by 17% less boring." -// To be added: Templates for surface exploration when they are made. \ No newline at end of file +// To be added: Templates for surface exploration when they are made. + +/datum/map_template/surface/farm1 + name = "Farm 1" + desc = "A small farm tended by a farmbot." + mappath = 'maps/submaps/surface_submaps/farm1.dmm' \ No newline at end of file diff --git a/maps/submaps/surface_submaps/forest_areas.dm b/maps/submaps/surface_submaps/forest_areas.dm new file mode 100644 index 0000000000..f8fe110cb0 --- /dev/null +++ b/maps/submaps/surface_submaps/forest_areas.dm @@ -0,0 +1,6 @@ +/area/submap + name = "Submap Area" + icon_state = "submap" + +/area/submap/farm1 + name = "farm" \ No newline at end of file diff --git a/polaris.dme b/polaris.dme index 495438c25a..3cec695f70 100644 --- a/polaris.dme +++ b/polaris.dme @@ -1840,6 +1840,7 @@ #include "code\modules\organs\subtypes\diona.dm" #include "code\modules\organs\subtypes\machine.dm" #include "code\modules\organs\subtypes\seromi.dm" +#include "code\modules\organs\subtypes\slime.dm" #include "code\modules\organs\subtypes\standard.dm" #include "code\modules\organs\subtypes\unathi.dm" #include "code\modules\organs\subtypes\unbreakable.dm" @@ -1957,6 +1958,7 @@ #include "code\modules\projectiles\guns\projectile\dartgun.dm" #include "code\modules\projectiles\guns\projectile\pistol.dm" #include "code\modules\projectiles\guns\projectile\revolver.dm" +#include "code\modules\projectiles\guns\projectile\semiauto.dm" #include "code\modules\projectiles\guns\projectile\shotgun.dm" #include "code\modules\projectiles\guns\projectile\sniper.dm" #include "code\modules\projectiles\guns\projectile\sniper\collapsible_sniper.dm" @@ -2269,5 +2271,6 @@ #include "maps\submaps\cave_submaps\cave.dm" #include "maps\submaps\space_submaps\space.dm" #include "maps\submaps\surface_submaps\forest.dm" +#include "maps\submaps\surface_submaps\forest_areas.dm" #include "maps\~map_system\maps.dm" // END_INCLUDE diff --git a/sound/weapons/garand_ping.ogg b/sound/weapons/garand_ping.ogg new file mode 100644 index 0000000000..187495def0 Binary files /dev/null and b/sound/weapons/garand_ping.ogg differ