diff --git a/code/controllers/subsystems/ticker.dm b/code/controllers/subsystems/ticker.dm index 4c6c5e44265..629ec4b79dc 100644 --- a/code/controllers/subsystems/ticker.dm +++ b/code/controllers/subsystems/ticker.dm @@ -440,6 +440,14 @@ var/global/datum/controller/subsystem/ticker/ticker UpdateFactionList(player) //equip_custom_items(player) //VOREStation Removal //player.apply_traits() //VOREStation Removal + //VOREStation Addition Start + if(player.client) + if(player.client.prefs.auto_backup_implant) + var/obj/item/weapon/implant/backup/imp = new(src) + + if(imp.handle_implant(player,player.zone_sel.selecting)) + imp.post_implant(player) + //VOREStation Addition End if(captainless) for(var/mob/M in player_list) if(!istype(M,/mob/new_player)) diff --git a/code/datums/mind.dm b/code/datums/mind.dm index a80af293bd4..bc87275800b 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -291,7 +291,7 @@ if (!steal.select_target()) return - if("download","capture","absorb") + if("download","capture","absorb", "vore") var/def_num if(objective&&objective.type==text2path("/datum/objective/[new_obj_type]")) def_num = objective.target_amount @@ -310,6 +310,9 @@ if("absorb") new_objective = new /datum/objective/absorb new_objective.explanation_text = "Absorb [target_number] compatible genomes." + if("vore") + new_objective = new /datum/objective/vore + new_objective.explanation_text = "Devour [target_number] [target_number == 1 ? "person" : "people"]. What happens to them after you do that is irrelevant." new_objective.owner = src new_objective.target_amount = target_number diff --git a/code/datums/mind_vr.dm b/code/datums/mind_vr.dm index d2ae478410f..a6758ca229c 100644 --- a/code/datums/mind_vr.dm +++ b/code/datums/mind_vr.dm @@ -4,6 +4,7 @@ var/directory_tag var/directory_erptag var/directory_ad + var/vore_prey_eaten = 0 /mob/living/mind_initialize() . = ..() diff --git a/code/game/antagonist/antagonist_print.dm b/code/game/antagonist/antagonist_print.dm index 99216b9ef55..16fa6176dfd 100644 --- a/code/game/antagonist/antagonist_print.dm +++ b/code/game/antagonist/antagonist_print.dm @@ -23,10 +23,10 @@ feedback_add_details(feedback_tag,"[O.type]|FAIL") failed = TRUE num++ - if(failed) - text += "
The [role_text] has failed." - else - text += "
The [role_text] was successful!" + if(failed) + text += "
The [role_text] has failed." + else + text += "
The [role_text] was successful!" if(global_objectives && global_objectives.len) text += "
Their objectives were:" diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm index 2818e3e7b4d..53e6c61304b 100644 --- a/code/game/gamemodes/objective.dm +++ b/code/game/gamemodes/objective.dm @@ -627,6 +627,12 @@ var/global/list/all_objectives = list() else return 0 +/datum/objective/vore/check_completion() + if(owner && owner.vore_prey_eaten >= target_amount) + return 1 + else + return 0 + // Heist objectives. /datum/objective/heist/proc/choose_target() return diff --git a/code/game/objects/random/mob_vr.dm b/code/game/objects/random/mob_vr.dm index b153ce360b3..d32f365dc85 100644 --- a/code/game/objects/random/mob_vr.dm +++ b/code/game/objects/random/mob_vr.dm @@ -249,4 +249,58 @@ prob(2);/obj/random/multiple/minevault, prob(1);/obj/random/coin, prob(1);/obj/random/drinkbottle, - prob(1);/obj/random/tool/alien) \ No newline at end of file + prob(1);/obj/random/tool/alien) + +//Scug spawner for the picnic! +/obj/random/mob/wildscugs + name = "Random catslug spawner" + desc = "Spawns catslugs with random colours!" + icon_state = "vore" + mob_faction = "vore" + spawn_nothing_percentage = 25 + mob_wander_distance = 4 + mob_wander = 1 + mob_returns_home = 1 + var/newname = null + var/newdesc = null + + +/obj/random/mob/wildscugs/item_to_spawn() + return pick(prob(99); /mob/living/simple_mob/vore/alienanimals/catslug, + prob(1); /mob/living/simple_mob/vore/alienanimals/catslug/suslug/color) //A super rare surprise + +/obj/random/mob/wildscugs/spawn_item() + var/build_path = item_to_spawn() + + var/mob/living/simple_mob/M = new build_path(src.loc) + if(!istype(M)) + return + if(M.has_AI()) + var/datum/ai_holder/AI = M.ai_holder + AI.go_sleep() //Don't fight eachother while we're still setting up! + AI.returns_home = mob_returns_home + AI.wander = mob_wander + AI.max_home_distance = mob_wander_distance + if(overwrite_hostility) + AI.hostile = mob_hostile + AI.retaliate = mob_retaliate + AI.go_wake() //Now you can kill eachother if your faction didn't override. + + if(pixel_x || pixel_y) + M.pixel_x = pixel_x + M.pixel_y = pixel_y + + if(mob_faction) + M.faction = mob_faction + + M.color = pick(COLOR_WHITE, COLOR_RED, COLOR_PURPLE, COLOR_YELLOW, COLOR_CYAN_BLUE, COLOR_RED_GRAY, COLOR_BEIGE, COLOR_PINK, COLOR_BLACK) + if(newname) + if(islist(newname)) + M.name = pick(newname) + else + M.name = newname + if(newdesc) + if(islist(newdesc)) + M.desc = pick(newdesc) + else + M.desc = newdesc diff --git a/code/modules/client/preference_setup/vore/09_misc.dm b/code/modules/client/preference_setup/vore/09_misc.dm index d83063d6657..19fd61011ad 100644 --- a/code/modules/client/preference_setup/vore/09_misc.dm +++ b/code/modules/client/preference_setup/vore/09_misc.dm @@ -9,6 +9,7 @@ S["directory_ad"] >> pref.directory_ad S["sensorpref"] >> pref.sensorpref S["capture_crystal"] >> pref.capture_crystal + S["auto_backup_implant"] >> pref.auto_backup_implant /datum/category_item/player_setup_item/vore/misc/save_character(var/savefile/S) S["show_in_directory"] << pref.show_in_directory @@ -17,7 +18,7 @@ S["directory_ad"] << pref.directory_ad S["sensorpref"] << pref.sensorpref S["capture_crystal"] << pref.capture_crystal - + S["auto_backup_implant"] << pref.auto_backup_implant /datum/category_item/player_setup_item/vore/misc/copy_to_mob(var/mob/living/carbon/human/character) if(pref.sensorpref > 5 || pref.sensorpref < 1) @@ -31,6 +32,7 @@ pref.directory_erptag = sanitize_inlist(pref.directory_erptag, GLOB.char_directory_erptags, initial(pref.directory_erptag)) pref.sensorpref = sanitize_integer(pref.sensorpref, 1, sensorpreflist.len, initial(pref.sensorpref)) pref.capture_crystal = sanitize_integer(pref.capture_crystal, 0, 1, initial(pref.capture_crystal)) + pref.auto_backup_implant = sanitize_integer(pref.auto_backup_implant, 0, 1, initial(pref.auto_backup_implant)) /datum/category_item/player_setup_item/vore/misc/content(var/mob/user) . += "
" @@ -39,7 +41,8 @@ . += "Character Directory ERP Tag: [pref.directory_erptag]
" . += "Character Directory Advertisement: Set Directory Ad
" . += "Suit Sensors Preference: [sensorpreflist[pref.sensorpref]]
" - . += "Capture Crystal Preference [pref.capture_crystal ? "Yes" : "No"]
" + . += "Capture Crystal Preference: [pref.capture_crystal ? "Yes" : "No"]
" + . += "Spawn With Backup Implant: [pref.auto_backup_implant ? "Yes" : "No"]
" /datum/category_item/player_setup_item/vore/misc/OnTopic(var/href, var/list/href_list, var/mob/user) if(href_list["toggle_show_in_directory"]) @@ -71,5 +74,7 @@ else if(href_list["toggle_capture_crystal"]) pref.capture_crystal = pref.capture_crystal ? 0 : 1; return TOPIC_REFRESH - + else if(href_list["toggle_implant"]) + pref.auto_backup_implant = pref.auto_backup_implant ? 0 : 1; + return TOPIC_REFRESH return ..(); diff --git a/code/modules/client/preferences_vr.dm b/code/modules/client/preferences_vr.dm index 77656ebff37..5de49fd1c15 100644 --- a/code/modules/client/preferences_vr.dm +++ b/code/modules/client/preferences_vr.dm @@ -5,6 +5,7 @@ var/directory_ad = "" //Advertisement stuff to show in character directory. var/sensorpref = 5 //Set character's suit sensor level var/capture_crystal = 1 //Whether or not someone is able to be caught with capture crystals + var/auto_backup_implant = FALSE //Whether someone starts with a backup implant or not. var/job_talon_high = 0 var/job_talon_med = 0 diff --git a/code/modules/materials/materials/metals/steel.dm b/code/modules/materials/materials/metals/steel.dm index 2a65386c606..ff21681b72b 100644 --- a/code/modules/materials/materials/metals/steel.dm +++ b/code/modules/materials/materials/metals/steel.dm @@ -80,6 +80,53 @@ new /datum/stack_recipe("canister", /obj/machinery/portable_atmospherics/canister, 10, time = 15, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), new /datum/stack_recipe("cannon frame", /obj/item/weapon/cannonframe, 10, time = 15, one_per_turf = 0, on_floor = 0, recycle_material = "[name]"), new /datum/stack_recipe("regular floor tile", /obj/item/stack/tile/floor, 1, 4, 20, recycle_material = "[name]"), + //Eris Floor tiles- Normal + new /datum/stack_recipe_list("eris floors-normal", list( + new /datum/stack_recipe("floor tile", /obj/item/stack/tile/floor/eris/steel, 1, 4, 20, recycle_material = "[name]"), + new /datum/stack_recipe("panel tile", /obj/item/stack/tile/floor/eris/steel/panels, 1, 4, 20, recycle_material = "[name]"), + new /datum/stack_recipe("techfloor tile", /obj/item/stack/tile/floor/eris/steel/techfloor, 1, 4, 20, recycle_material = "[name]"), + new /datum/stack_recipe("techfloor tile with vents", /obj/item/stack/tile/floor/eris/steel/techfloor_grid, 1, 4, 20, recycle_material = "[name]"), + new /datum/stack_recipe("brown perforated tile", /obj/item/stack/tile/floor/eris/steel/brown_perforated, 1, 4, 20, recycle_material = "[name]"), + new /datum/stack_recipe("gray perforated tile", /obj/item/stack/tile/floor/eris/steel/gray_perforated, 1, 4, 20, recycle_material = "[name]"), + new /datum/stack_recipe("cargo tile", /obj/item/stack/tile/floor/eris/steel/cargo, 1, 4, 20, recycle_material = "[name]"), + new /datum/stack_recipe("brown platform tile", /obj/item/stack/tile/floor/eris/steel/brown_platform, 1, 4, 20, recycle_material = "[name]"), + new /datum/stack_recipe("gray platform tile", /obj/item/stack/tile/floor/eris/steel/gray_platform, 1, 4, 20, recycle_material = "[name]"), + new /datum/stack_recipe("danger tile", /obj/item/stack/tile/floor/eris/steel/danger, 1, 4, 20, recycle_material = "[name]"), + new /datum/stack_recipe("golden tile", /obj/item/stack/tile/floor/eris/steel/golden, 1, 4, 20, recycle_material = "[name]"), + new /datum/stack_recipe("monofloor tile", /obj/item/stack/tile/floor/eris/steel/monofloor, 1, 4, 20, recycle_material = "[name]"), + new /datum/stack_recipe("bar flat tile", /obj/item/stack/tile/floor/eris/steel/bar_flat, 1, 4, 20, recycle_material = "[name]"), + new /datum/stack_recipe("bar dance tile", /obj/item/stack/tile/floor/eris/steel/bar_dance, 1, 4, 20, recycle_material = "[name]"), + new /datum/stack_recipe("bar light tile", /obj/item/stack/tile/floor/eris/steel/bar_light, 1, 4, 20, recycle_material = "[name]"), + new /datum/stack_recipe_list("corner tiles", list( + new /datum/stack_recipe("blue corner tile", /obj/item/stack/tile/floor/eris/steel/bluecorner, 1, 4, 20, recycle_material = "[name]"), + new /datum/stack_recipe("orange corner tile", /obj/item/stack/tile/floor/eris/steel/orangecorner, 1, 4, 20, recycle_material = "[name]"), + new /datum/stack_recipe("cyan corner tile", /obj/item/stack/tile/floor/eris/steel/cyancorner, 1, 4, 20, recycle_material = "[name]"), + new /datum/stack_recipe("violet corner tile", /obj/item/stack/tile/floor/eris/steel/violetcorener, 1, 4, 20, recycle_material = "[name]"), + )), + + )), + //Eris Floor tiles- Dark + new /datum/stack_recipe_list("eris floors-dark", list( + new /datum/stack_recipe("dark floor tile", /obj/item/stack/tile/floor/eris/dark, 1, 4, 20, recycle_material = "[name]"), + new /datum/stack_recipe("dark panel tile", /obj/item/stack/tile/floor/eris/dark/panels, 1, 4, 20, recycle_material = "[name]"), + new /datum/stack_recipe("dark techfloor tile", /obj/item/stack/tile/floor/eris/dark/techfloor, 1, 4, 20, recycle_material = "[name]"), + new /datum/stack_recipe("dark techfloor tile with vents", /obj/item/stack/tile/floor/eris/dark/techfloor_grid, 1, 4, 20, recycle_material = "[name]"), + new /datum/stack_recipe("dark brown perforated tile", /obj/item/stack/tile/floor/eris/dark/brown_perforated, 1, 4, 20, recycle_material = "[name]"), + new /datum/stack_recipe("dark gray perforated tile", /obj/item/stack/tile/floor/eris/dark/gray_perforated, 1, 4, 20, recycle_material = "[name]"), + new /datum/stack_recipe("dark cargo tile", /obj/item/stack/tile/floor/eris/dark/cargo, 1, 4, 20, recycle_material = "[name]"), + new /datum/stack_recipe("dark brown platform tile", /obj/item/stack/tile/floor/eris/dark/brown_platform, 1, 4, 20, recycle_material = "[name]"), + new /datum/stack_recipe("dark gray platform tile", /obj/item/stack/tile/floor/eris/dark/gray_platform, 1, 4, 20, recycle_material = "[name]"), + new /datum/stack_recipe("dark danger tile", /obj/item/stack/tile/floor/eris/dark/danger, 1, 4, 20, recycle_material = "[name]"), + new /datum/stack_recipe("dark golden tile", /obj/item/stack/tile/floor/eris/dark/golden, 1, 4, 20, recycle_material = "[name]"), + new /datum/stack_recipe("dark monofloor tile", /obj/item/stack/tile/floor/eris/dark/monofloor, 1, 4, 20, recycle_material = "[name]"), + new /datum/stack_recipe_list("dark corner tiles", list( + new /datum/stack_recipe("dark blue corner tile", /obj/item/stack/tile/floor/eris/dark/bluecorner, 1, 4, 20, recycle_material = "[name]"), + new /datum/stack_recipe("dark orange corner tile", /obj/item/stack/tile/floor/eris/dark/orangecorner, 1, 4, 20, recycle_material = "[name]"), + new /datum/stack_recipe("dark cyan corner tile", /obj/item/stack/tile/floor/eris/dark/cyancorner, 1, 4, 20, recycle_material = "[name]"), + new /datum/stack_recipe("dark violet corner tile", /obj/item/stack/tile/floor/eris/dark/violetcorener, 1, 4, 20, recycle_material = "[name]"), + )), + )), + new /datum/stack_recipe("roofing tile", /obj/item/stack/tile/roofing, 3, 4, 20, recycle_material = "[name]"), new /datum/stack_recipe("metal rod", /obj/item/stack/rods, 1, 2, 60, recycle_material = "[name]"), new /datum/stack_recipe("frame parts", /obj/item/frame, 5, time = 25, on_floor = 1, recycle_material = "[name]"), diff --git a/code/modules/materials/materials/plastic.dm b/code/modules/materials/materials/plastic.dm index 6cf45fe677e..d10e5153f6b 100644 --- a/code/modules/materials/materials/plastic.dm +++ b/code/modules/materials/materials/plastic.dm @@ -24,6 +24,29 @@ new /datum/stack_recipe("reagent dispenser cartridge (small)", /obj/item/weapon/reagent_containers/chem_disp_cartridge/small, 1, on_floor=0, pass_stack_color = TRUE, recycle_material = "[name]"), // 100u new /datum/stack_recipe("white floor tile", /obj/item/stack/tile/floor/white, 1, 4, 20, pass_stack_color = TRUE, recycle_material = "[name]"), new /datum/stack_recipe("freezer floor tile", /obj/item/stack/tile/floor/freezer, 1, 4, 20, pass_stack_color = TRUE, recycle_material = "[name]"), + + //Eris Floor tiles- white + new /datum/stack_recipe_list("eris floors-white", list( + new /datum/stack_recipe("white floor tile", /obj/item/stack/tile/floor/eris/white, 1, 4, 20, recycle_material = "[name]"), + new /datum/stack_recipe("white panel tile", /obj/item/stack/tile/floor/eris/white/panels, 1, 4, 20, recycle_material = "[name]"), + new /datum/stack_recipe("white techfloor tile", /obj/item/stack/tile/floor/eris/white/techfloor, 1, 4, 20, recycle_material = "[name]"), + new /datum/stack_recipe("white techfloor tile with vents", /obj/item/stack/tile/floor/eris/white/techfloor_grid, 1, 4, 20, recycle_material = "[name]"), + new /datum/stack_recipe("white brown perforated tile", /obj/item/stack/tile/floor/eris/white/brown_perforated, 1, 4, 20, recycle_material = "[name]"), + new /datum/stack_recipe("white gray perforated tile", /obj/item/stack/tile/floor/eris/white/gray_perforated, 1, 4, 20, recycle_material = "[name]"), + new /datum/stack_recipe("white cargo tile", /obj/item/stack/tile/floor/eris/white/cargo, 1, 4, 20, recycle_material = "[name]"), + new /datum/stack_recipe("white brown platform tile", /obj/item/stack/tile/floor/eris/white/brown_platform, 1, 4, 20, recycle_material = "[name]"), + new /datum/stack_recipe("white gray platform tile", /obj/item/stack/tile/floor/eris/white/gray_platform, 1, 4, 20, recycle_material = "[name]"), + new /datum/stack_recipe("white danger tile", /obj/item/stack/tile/floor/eris/white/danger, 1, 4, 20, recycle_material = "[name]"), + new /datum/stack_recipe("white golden tile", /obj/item/stack/tile/floor/eris/white/golden, 1, 4, 20, recycle_material = "[name]"), + new /datum/stack_recipe("white monofloor tile", /obj/item/stack/tile/floor/eris/white/monofloor, 1, 4, 20, recycle_material = "[name]"), + new /datum/stack_recipe_list("white corner tiles", list( + new /datum/stack_recipe("white blue corner tile", /obj/item/stack/tile/floor/eris/white/bluecorner, 1, 4, 20, recycle_material = "[name]"), + new /datum/stack_recipe("white orange corner tile", /obj/item/stack/tile/floor/eris/white/orangecorner, 1, 4, 20, recycle_material = "[name]"), + new /datum/stack_recipe("white cyan corner tile", /obj/item/stack/tile/floor/eris/white/cyancorner, 1, 4, 20, recycle_material = "[name]"), + new /datum/stack_recipe("white violet corner tile", /obj/item/stack/tile/floor/eris/white/violetcorener, 1, 4, 20, recycle_material = "[name]"), + )), + )), + new /datum/stack_recipe("shower curtain", /obj/structure/curtain, 4, time = 15, one_per_turf = 1, on_floor = 1, pass_stack_color = TRUE, recycle_material = "[name]"), new /datum/stack_recipe("plastic flaps", /obj/structure/plasticflaps, 4, time = 25, one_per_turf = 1, on_floor = 1, pass_stack_color = TRUE, recycle_material = "[name]"), new /datum/stack_recipe("water-cooler", /obj/structure/reagent_dispensers/water_cooler, 4, time = 10, one_per_turf = 1, on_floor = 1, pass_stack_color = TRUE, recycle_material = "[name]"), diff --git a/code/modules/mob/living/carbon/brain/brain.dm b/code/modules/mob/living/carbon/brain/brain.dm index d4c40c6179c..8743d0b7e46 100644 --- a/code/modules/mob/living/carbon/brain/brain.dm +++ b/code/modules/mob/living/carbon/brain/brain.dm @@ -66,11 +66,15 @@ init_typing_indicator("[cur_bubble_appearance]_typing") if(state && !typing) - loc.add_overlay(typing_indicator, TRUE) + add_overlay(typing_indicator, TRUE) typing = TRUE + typing_indicator_active = typing_indicator else if(typing) - loc.cut_overlay(typing_indicator, TRUE) + cut_overlay(typing_indicator_active, TRUE) typing = FALSE + if(typing_indicator_active != typing_indicator) + qdel(typing_indicator_active) + typing_indicator_active = null return state diff --git a/code/modules/mob/living/simple_mob/subtypes/mechanical/drones/mining_drone.dm b/code/modules/mob/living/simple_mob/subtypes/mechanical/drones/mining_drone.dm index 22af8baaa4f..1bd3b9279ad 100644 --- a/code/modules/mob/living/simple_mob/subtypes/mechanical/drones/mining_drone.dm +++ b/code/modules/mob/living/simple_mob/subtypes/mechanical/drones/mining_drone.dm @@ -43,7 +43,7 @@ organ_names = /decl/mob_organ_names/miningdrone ai_holder_type = /datum/ai_holder/simple_mob/ranged/kiting/threatening - say_list_type = /datum/say_list/malf_drone + say_list_type = /datum/say_list/malf_drone/mining tame_items = list( /obj/item/weapon/ore/verdantium = 90, @@ -66,6 +66,8 @@ var/last_search = 0 var/search_cooldown = 5 SECONDS + var/ignoreunarmed = TRUE + var/allowedtools = list(/obj/item/weapon/pickaxe, /obj/item/weapon/gun/energy/kinetic_accelerator, /obj/item/weapon/gun/magnetic/matfed/phoronbore, /obj/item/weapon/kinetic_crusher) /mob/living/simple_mob/mechanical/mining_drone/Initialize() ion_trail = new @@ -99,12 +101,52 @@ return . if(!.) + if(ai_holder.check_attacker(H)) //it doesn't care how nicely you're geared if you've attacked it + return FALSE + var/has_tool = FALSE var/obj/item/I = H.get_active_hand() - if(istype(I,/obj/item/weapon/pickaxe)) - has_tool = TRUE + if(!istype(I,/obj/item/weapon)) + if(ignoreunarmed) + return TRUE + else //just so they don't attack "miners" for having their mining gear in their offhand + var/obj/item/OH = H.get_inactive_hand() + if(OH) + for (var/path in allowedtools) + if(istype(OH,path)) + has_tool = TRUE + break + else + for (var/path in allowedtools) + if(istype(I,path)) + has_tool = TRUE + break + if(!has_tool) //if a valid tool not found in main hand, check offhand + var/obj/item/OH = H.get_inactive_hand() + if(OH) + for (var/path in allowedtools) + if(istype(OH,path)) + has_tool = TRUE + break return has_tool +// extra IFF aside from the above - will detect and react to the following attacks from allies (necessary as IIsAlly prevents retaliation if true) +/mob/living/simple_mob/mechanical/mining_drone/attack_hand(mob/living/L) + ..() + if(istype(L) && L.a_intent != I_HELP) + if(ai_holder) + ai_holder.add_attacker(L) + +/mob/living/simple_mob/mechanical/mining_drone/bullet_act(var/obj/item/projectile/P, var/def_zone) + ..() + if(ai_holder && P.firer) + ai_holder.add_attacker(P.firer) + +/mob/living/simple_mob/mechanical/mining_drone/hit_with_weapon(obj/item/I, mob/living/user, var/effective_force, var/hit_zone) + ..() + if(ai_holder) + ai_holder.add_attacker(user) + /mob/living/simple_mob/mechanical/mining_drone/handle_special() if(my_storage && (get_AI_stance() in list(STANCE_APPROACH, STANCE_IDLE, STANCE_FOLLOW)) && !is_AI_busy() && isturf(loc) && (world.time > last_search + search_cooldown) && (my_storage.contents.len < my_storage.max_storage_space)) last_search = world.time @@ -128,4 +170,13 @@ my_storage.remove_from_storage(I, OB) /decl/mob_organ_names/miningdrone - hit_zones = list("chassis", "comms array", "sensor suite", "left excavator module", "right excavator module", "maneuvering thruster") \ No newline at end of file + hit_zones = list("chassis", "comms array", "sensor suite", "left excavator module", "right excavator module", "maneuvering thruster") + +/datum/say_list/malf_drone/mining + say_threaten = list("Armed intruder detected.", "Lay down your weapons.", "Mining personnel only.", "Threat detected.", "Mining gear check: negative.") + +/mob/living/simple_mob/mechanical/mining_drone/scavenger //more aggro version for the debris field, with a weaker weapon + name = "scavenger drone" + ignoreunarmed = FALSE + allowedtools = list(/obj/item/weapon/pickaxe) + projectiletype = /obj/item/projectile/energy/excavate/weak \ No newline at end of file diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index 2529936a7ae..f729cb8c7ec 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -218,6 +218,7 @@ var/typing var/obj/effect/decal/typing_indicator + var/obj/effect/decal/typing_indicator_active var/cur_typing_indicator var/custom_speech_bubble = "default" diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm index 3d9cd13a511..51fb6645535 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -486,6 +486,12 @@ AnnounceArrival(character, rank, join_message, announce_channel, character.z) data_core.manifest_inject(character) ticker.minds += character.mind//Cyborgs and AIs handle this in the transform proc. //TODO!!!!! ~Carn + if(ishuman(character)) + if(character.client.prefs.auto_backup_implant) + var/obj/item/weapon/implant/backup/imp = new(src) + + if(imp.handle_implant(character,character.zone_sel.selecting)) + imp.post_implant(character) qdel(src) // Delete new_player mob diff --git a/code/modules/mob/new_player/sprite_accessories_ear_vr.dm b/code/modules/mob/new_player/sprite_accessories_ear_vr.dm index 2a4750f2ee7..f4000dd1732 100644 --- a/code/modules/mob/new_player/sprite_accessories_ear_vr.dm +++ b/code/modules/mob/new_player/sprite_accessories_ear_vr.dm @@ -900,4 +900,12 @@ /datum/sprite_accessory/ears/syrishroom name = "Orange Mushroom Cap" icon = 'icons/mob/vore/ears_vr.dmi' - icon_state = "syrishroom" \ No newline at end of file + icon_state = "syrishroom" + +/datum/sprite_accessory/ears/singlesidehorn + name = "Single Side Horn" + desc = "" + icon = 'icons/mob/vore/ears_vr.dmi' + icon_state = "single-side-horn" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY \ No newline at end of file diff --git a/code/modules/mob/new_player/sprite_accessories_extra_vr.dm b/code/modules/mob/new_player/sprite_accessories_extra_vr.dm index 942f49087da..ab2f41cef4e 100644 --- a/code/modules/mob/new_player/sprite_accessories_extra_vr.dm +++ b/code/modules/mob/new_player/sprite_accessories_extra_vr.dm @@ -886,3 +886,19 @@ body_parts = list(BP_L_FOOT,BP_R_FOOT) hide_body_parts = list(BP_L_FOOT,BP_R_FOOT) organ_override = TRUE + +/datum/sprite_accessory/marking/vr_unathi_blocky_head + name = "Unathi alt head (Blocky)" + icon = 'icons/mob/human_races/markings_vr.dmi' + icon_state = "unathi_blocky_head" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + hide_body_parts = list(BP_HEAD) + organ_override = TRUE + +/datum/sprite_accessory/marking/vr_unathi_blocky_head_eyes + name = "Unathi alt head eyes (Blocky)" + icon = 'icons/mob/human_races/markings_vr.dmi' + icon_state = "unathi_blocky_head_eyes" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) \ No newline at end of file diff --git a/code/modules/mob/new_player/sprite_accessories_tail_vr.dm b/code/modules/mob/new_player/sprite_accessories_tail_vr.dm index 8c5483c7d1a..33dab914477 100644 --- a/code/modules/mob/new_player/sprite_accessories_tail_vr.dm +++ b/code/modules/mob/new_player/sprite_accessories_tail_vr.dm @@ -1321,6 +1321,13 @@ clip_mask_icon = 'icons/mob/vore/taurs_vr.dmi' clip_mask_state = "taur_clip_mask_def" //Used to clip off the lower part of suits & uniforms. +/datum/sprite_accessory/tail/blade_like_tail + name = "Blade-like Tail" + icon = 'icons/mob/vore/tails_vr.dmi' + icon_state = "blade-like-tail" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + //LONG TAILS ARE NOT TAUR BUTTS >:O /datum/sprite_accessory/tail/longtail name = "You should not see this..." diff --git a/code/modules/mob/new_player/sprite_accessories_vr.dm b/code/modules/mob/new_player/sprite_accessories_vr.dm index 8b113b84b96..8a4111c064c 100644 --- a/code/modules/mob/new_player/sprite_accessories_vr.dm +++ b/code/modules/mob/new_player/sprite_accessories_vr.dm @@ -158,6 +158,13 @@ icon_state = "soghun_dubhorns" species_allowed = list(SPECIES_UNATHI, SPECIES_XENOCHIMERA, SPECIES_PROTEAN) +/datum/sprite_accessory/hair/una_quinthorns + name = "Quintiple Unathi Horns" + icon = 'icons/mob/human_face_vr.dmi' + icon_add = 'icons/mob/human_face_vr_add.dmi' + icon_state = "unathi_quintiple_horns" + species_allowed = list(SPECIES_UNATHI, SPECIES_XENOCHIMERA, SPECIES_PROTEAN) + /datum/sprite_accessory/hair/taj_ears name = "Tajaran Ears" icon_state = "ears_plain" diff --git a/code/modules/mob/new_player/sprite_accessories_wing_vr.dm b/code/modules/mob/new_player/sprite_accessories_wing_vr.dm index de1a18aeebe..c484d041c79 100644 --- a/code/modules/mob/new_player/sprite_accessories_wing_vr.dm +++ b/code/modules/mob/new_player/sprite_accessories_wing_vr.dm @@ -296,3 +296,11 @@ desc = "" icon = 'icons/mob/vore/wings_vr.dmi' icon_state = "dragonfly_tesh" + +/datum/sprite_accessory/wing/snail_shell + name = "snail shell, colorable" + desc = "" + icon_state = "snail_shell" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "snail_shell_markings" diff --git a/code/modules/mob/typing_indicator.dm b/code/modules/mob/typing_indicator.dm index f6db4f5fc29..8684c3463cb 100644 --- a/code/modules/mob/typing_indicator.dm +++ b/code/modules/mob/typing_indicator.dm @@ -35,9 +35,13 @@ if(state && !typing) add_overlay(typing_indicator, TRUE) typing = TRUE + typing_indicator_active = typing_indicator else if(typing) - cut_overlay(typing_indicator, TRUE) + cut_overlay(typing_indicator_active, TRUE) typing = FALSE + if(typing_indicator_active != typing_indicator) + qdel(typing_indicator_active) + typing_indicator_active = null return state diff --git a/code/modules/organs/organ_icon.dm b/code/modules/organs/organ_icon.dm index a7386bdbe6b..e67cc567c4b 100644 --- a/code/modules/organs/organ_icon.dm +++ b/code/modules/organs/organ_icon.dm @@ -89,6 +89,15 @@ var/global/list/limb_icon_cache = list() mark_s.Blend(markings[M]["color"], mark.color_blend_mode) // VOREStation edit mob_icon.Blend(mark_s, ICON_OVERLAY) //So when it's on your body, it has icons icon_cache_key = "[M][markings[M]["color"]]" + for(var/MM in markings) + var/datum/sprite_accessory/marking/mark_style = markings[MM]["datum"] + if(mark_style.organ_override) + continue + var/icon/mark_s_s = new/icon("icon" = mark_style.icon, "icon_state" = "[mark_style.icon_state]-[organ_tag]") + mark_s.Blend(markings[MM]["color"], mark_style.color_blend_mode) // VOREStation edit + add_overlay(mark_s_s) //So when it's not on your body, it has icons + mob_icon.Blend(mark_s_s, ICON_OVERLAY) //So when it's on your body, it has icons + icon_cache_key += "[MM][markings[MM]["color"]]" dir = EAST icon = mob_icon diff --git a/code/modules/player_tips_vr/player_tips_list_vr.dm b/code/modules/player_tips_vr/player_tips_list_vr.dm index ede4646f3f5..e9b4752f457 100644 --- a/code/modules/player_tips_vr/player_tips_list_vr.dm +++ b/code/modules/player_tips_vr/player_tips_list_vr.dm @@ -45,7 +45,7 @@ When editing the list, please try and keep similar probabilities near each other prob(50); "[info] Lost on the map? You can find In-Character help by speaking on the Common Radio. You can do this by pressing F3 and typing ' ; ' before your message. Your fellow co-workers will likely help. If OOC help is preferred, press F1 for mentorhelp. ", prob(50); "[info] You may set your suit sensors by clicking on the icon in the bottom left corner, then right click the clothes that appear right above it. It is recommended to turn on suit sensors to 'TRACKING' before doing anything dangerous like mining, and to turn them off before digestion scenes as prey.", prob(35); "[info] You can insert your I.D into your PDA. This frees up your belt from having to carry your PDA. Furthermore, by clicking and dragging the PDA to game screen, you can use it without holding it!", - prob(35); "[info] It is never a bad idea to visit the medbay if you get injured - small burns and cuts can get infected and become harder to treat! If there is no medical staff, bathrooms and the bar often has a NanoMed on the wall - with ointments to disinfect cuts and burns, bandages to treat bruises and encourage healing.", + prob(35); "[info] It is never a bad idea to visit the medbay if you get injured - small burns and cuts can get infected and become harder to treat! Alternatively, bathrooms and the bar often has a NanoMed on the wall - with ointments to disinfect cuts and burns, bandages to treat bruises and encourage healing.", prob(35); "[info] Your vore-bellies have multiple add-ons! Muffling is excellent to ensure your prey does not accidentally inform everyone about their predicament, and jam suit sensors is a great courtesy to avoid medical being worried about your prey!", prob(25); "[info] Two control modes exist for SS13 - hotkey ON and hotkey OFF. You can swap between the two modes by pressing TAB. In hotkey mode, to chat you need to press T to say anything which creates a small talking bubble. You can consult our list of hotkeys at https://wiki.vore-station.net/Keyboard_Shortcuts", prob(25); "[info] Do you want to shift your character around, for instance to appear as if leaning on the wall? Press CTRL + SHIFT + arrow keys to do so! Moving resets this.", @@ -59,6 +59,7 @@ When editing the list, please try and keep similar probabilities near each other var/info = "The following is a roleplay-focused tip to playing on VOREStation \n" return pick( prob(45); "[info] Our server has a strong 'Bystander Consent' policy, meaning that scenes are expected to be mindful of the preferences of those around them in public, not just their partners. When in doubt, keep it subtle, and communicate via looc!", + prob(40); "[info] Sometimes, players may possess creatures that look like monsters or wild animals (e.g: defanged xenomorphs). These are called 'maint preds' and if you encounter them - you should avoid drawing attention to their existence over the radio! They're here to create unique vore scenarios, not to be treated as antags.", prob(40); "[info] Please avoid a character that knows everything. Having only a small set of jobs you are capable of doing can help flesh out your character! It's OK for things to break and fail if nobody is around to fix it - you do not need to do others' jobs.", prob(40); "[info] Just because you see something doesn't mean your character has to. A courtesy 'missing' of contraband or scene details can go a long way towards preserving everyone's fun!", prob(40); "[info] Embrace the limits of your character's skillsets! Seeking out other players to help you with a more challenging task might build friendships, or even lead to a scene!", diff --git a/code/modules/projectiles/projectile/energy.dm b/code/modules/projectiles/projectile/energy.dm index 29e082d6721..5e5d7f5c4ea 100644 --- a/code/modules/projectiles/projectile/energy.dm +++ b/code/modules/projectiles/projectile/energy.dm @@ -131,6 +131,10 @@ combustion = FALSE hud_state = "plasma_blast" +/obj/item/projectile/energy/excavate/weak + damage = 15 + excavation_amount = 100 + /obj/item/projectile/energy/dart name = "dart" icon_state = "toxin" diff --git a/code/modules/vore/eating/belly_obj_vr.dm b/code/modules/vore/eating/belly_obj_vr.dm index 060ac056541..2ae59893136 100644 --- a/code/modules/vore/eating/belly_obj_vr.dm +++ b/code/modules/vore/eating/belly_obj_vr.dm @@ -498,6 +498,8 @@ if(prey.ckey) GLOB.prey_eaten_roundstat++ + if(owner.mind) + owner.mind.vore_prey_eaten++ // Get the line that should show up in Examine message if the owner of this belly // is examined. By making this a proc, we not only take advantage of polymorphism, diff --git a/code/modules/xenobio/items/slimepotions_vr.dm b/code/modules/xenobio/items/slimepotions_vr.dm index 540a6100560..0bd4db66f7e 100644 --- a/code/modules/xenobio/items/slimepotions_vr.dm +++ b/code/modules/xenobio/items/slimepotions_vr.dm @@ -47,7 +47,7 @@ to_chat(user, "The slime cannot get any more fertile!") return ..() - to_chat(user, "You feed the slime the infertility agent. It will now have less offspring.") + to_chat(user, "You feed the slime the fertility agent. It will now have more offspring.") M.split_amount = between(2, M.split_amount + 2, 6) playsound(src, 'sound/effects/bubbles.ogg', 50, 1) qdel(src) @@ -192,4 +192,4 @@ if(istype(AI) && justified) AI.obedience = 10 playsound(src, 'sound/effects/bubbles.ogg', 50, 1) - qdel(src) \ No newline at end of file + qdel(src) diff --git a/config/alienwhitelist.txt b/config/alienwhitelist.txt index 7d65606c78d..b60fdcb5a03 100644 --- a/config/alienwhitelist.txt +++ b/config/alienwhitelist.txt @@ -131,6 +131,7 @@ silvertalismen - Vox silvertalismen - Xenochimera sirlionfur - Black-Eyed Shadekin skylarks - Black-Eyed Shadekin +slovakiani - Black-Eyed Shadekin slysilentclaw - Black-Eyed Shadekin smdytb1 - Black-Eyed Shadekin spirit1299 - Black-Eyed Shadekin diff --git a/icons/mob/human_face_vr.dmi b/icons/mob/human_face_vr.dmi index 1c00c166ceb..89a7a4612a8 100644 Binary files a/icons/mob/human_face_vr.dmi and b/icons/mob/human_face_vr.dmi differ diff --git a/icons/mob/human_face_vr_add.dmi b/icons/mob/human_face_vr_add.dmi index d99aec14970..f1f3009e9f3 100644 Binary files a/icons/mob/human_face_vr_add.dmi and b/icons/mob/human_face_vr_add.dmi differ diff --git a/icons/mob/human_races/markings_vr.dmi b/icons/mob/human_races/markings_vr.dmi index 0b92c0db207..29442bf908f 100644 Binary files a/icons/mob/human_races/markings_vr.dmi and b/icons/mob/human_races/markings_vr.dmi differ diff --git a/icons/mob/vore/ears_vr.dmi b/icons/mob/vore/ears_vr.dmi index 035eeb4e86a..095b9d4b569 100644 Binary files a/icons/mob/vore/ears_vr.dmi and b/icons/mob/vore/ears_vr.dmi differ diff --git a/icons/mob/vore/tails_vr.dmi b/icons/mob/vore/tails_vr.dmi index 2b72c13a36a..c9b29156513 100644 Binary files a/icons/mob/vore/tails_vr.dmi and b/icons/mob/vore/tails_vr.dmi differ diff --git a/icons/mob/vore/wings_vr.dmi b/icons/mob/vore/wings_vr.dmi index 089f436c9dd..5d62b7bcd8e 100644 Binary files a/icons/mob/vore/wings_vr.dmi and b/icons/mob/vore/wings_vr.dmi differ diff --git a/maps/groundbase/groundbase_poi_stuff.dm b/maps/groundbase/groundbase_poi_stuff.dm index 161472287d8..2089827d31f 100644 --- a/maps/groundbase/groundbase_poi_stuff.dm +++ b/maps/groundbase/groundbase_poi_stuff.dm @@ -13,6 +13,7 @@ #include "pois/outdoors12.dmm" #include "pois/outdoors13.dmm" #include "pois/outdoors14.dmm" +#include "pois/outdoors16.dmm" #include "pois/cave1.dmm" #include "pois/cave2.dmm" @@ -220,6 +221,7 @@ mappath = 'pois/outdoors1.dmm' cost = 10 allow_duplicates = TRUE + /datum/map_template/groundbase/outdoor/thing2 name = "Outdoors2" mappath = 'pois/outdoors2.dmm' @@ -267,6 +269,10 @@ name = "Outdoors15" mappath = 'pois/outdoors15.dmm' allow_duplicates = FALSE +/datum/map_template/groundbase/outdoor/thing16 + name = "Outdoors16" + mappath = 'pois/outdoors16.dmm' + allow_duplicates = FALSE /datum/map_template/groundbase/maintcaves/cave name = "Cave 1" diff --git a/maps/groundbase/pois/outdoors16.dmm b/maps/groundbase/pois/outdoors16.dmm new file mode 100644 index 00000000000..ee0a8b6e28b --- /dev/null +++ b/maps/groundbase/pois/outdoors16.dmm @@ -0,0 +1,221 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/obj/item/weapon/reagent_containers/food/snacks/chip/nacho/cheese, +/turf/simulated/floor/outdoors/grass/seasonal/nomobs, +/area/template_noop) +"b" = ( +/obj/item/weapon/reagent_containers/food/snacks/chip/nacho/salsa, +/turf/simulated/floor/outdoors/grass/seasonal/nomobs, +/area/template_noop) +"c" = ( +/obj/random/drinkbottle, +/turf/simulated/floor/outdoors/grass/seasonal/nomobs, +/area/template_noop) +"d" = ( +/obj/structure/table/wooden_reinforced, +/obj/item/weapon/storage/toolbox/lunchbox/cat/filled{ + pixel_y = 8 + }, +/obj/item/weapon/storage/toolbox/lunchbox/nymph/filled, +/obj/item/clothing/suit/leathercoat{ + desc = "Who would use a leather coat as a tablecloth?!"; + name = "Tablecloth?!"; + pixel_x = 5 + }, +/obj/item/clothing/suit/greatcoat{ + desc = "This great coat appears covered in food! Did... it get stolen and reused as ... ?!"; + name = "Tablecloth?"; + pixel_x = -9 + }, +/turf/simulated/floor/outdoors/grass/seasonal/notrees_nomobs_nosnow, +/area/template_noop) +"g" = ( +/obj/effect/decal/cleanable/fruit_smudge, +/obj/item/weapon/storage/mre/random, +/turf/simulated/floor/outdoors/grass/seasonal/notrees_nomobs_lowsnow, +/area/template_noop) +"h" = ( +/obj/structure/table/bench/wooden, +/obj/effect/decal/cleanable/filth, +/obj/random/mob/wildscugs{ + newdesc = "A wild catslug enjoying the simpler things in life: a picnic!"; + newname = list("happy catslug", "rotund catslug", "anxious catslug", "angry Catslug", "content Catslug", "sad catslug") + }, +/turf/simulated/floor/outdoors/grass/seasonal/notrees_nomobs_nosnow, +/area/template_noop) +"i" = ( +/obj/structure/table/wooden_reinforced, +/obj/random/pizzabox, +/obj/item/weapon/storage/toolbox/lunchbox/mars/filled{ + pixel_x = -10; + pixel_y = 11 + }, +/obj/item/weapon/bedsheet/rd{ + desc = "Is this Nubbins' doing?!"; + name = "Strange tablecloth"; + pixel_x = 11; + pixel_y = 12 + }, +/obj/random/mug, +/turf/simulated/floor/outdoors/grass/seasonal/notrees_nomobs_nosnow, +/area/template_noop) +"k" = ( +/obj/random/drinkbottle, +/turf/simulated/floor/outdoors/grass/seasonal/notrees_nomobs_lowsnow, +/area/template_noop) +"m" = ( +/obj/random/coin, +/turf/simulated/floor/outdoors/grass/seasonal/nomobs, +/area/template_noop) +"n" = ( +/obj/effect/decal/cleanable/filth, +/turf/simulated/floor/outdoors/grass/seasonal/notrees_nomobs_lowsnow, +/area/template_noop) +"p" = ( +/obj/random/junk, +/turf/simulated/floor/outdoors/grass/seasonal/nomobs, +/area/template_noop) +"s" = ( +/obj/structure/table/bench/wooden, +/obj/random/mob/wildscugs{ + newdesc = "A wild catslug enjoying the simpler things in life: a picnic!"; + newname = list("happy catslug", "rotund catslug", "anxious catslug", "angry Catslug", "content Catslug", "sad catslug") + }, +/obj/item/weapon/ore/diamond{ + name = "porl" + }, +/turf/simulated/floor/outdoors/grass/seasonal/notrees_nomobs_nosnow, +/area/template_noop) +"t" = ( +/obj/item/pizzavoucher, +/turf/simulated/floor/outdoors/grass/seasonal/nomobs, +/area/template_noop) +"w" = ( +/obj/item/trash/chipbasket, +/turf/simulated/floor/outdoors/grass/seasonal/nomobs, +/area/template_noop) +"z" = ( +/obj/random/drinksoft, +/turf/simulated/floor/outdoors/grass/seasonal/notrees_nomobs_lowsnow, +/area/template_noop) +"A" = ( +/turf/simulated/floor/outdoors/grass/seasonal/nomobs, +/area/template_noop) +"F" = ( +/obj/structure/table/bench/wooden, +/obj/random/mob/wildscugs{ + newdesc = "A wild catslug enjoying the simpler things in life: a picnic!"; + newname = list("happy catslug", "rotund catslug", "anxious catslug", "angry Catslug", "content Catslug", "sad catslug") + }, +/obj/item/weapon/material/twohanded/spear/foam{ + desc = "The only way you can hunt things with this is by tickling them to death."; + name = "squishy foam spear" + }, +/turf/simulated/floor/outdoors/grass/seasonal/notrees_nomobs_nosnow, +/area/template_noop) +"J" = ( +/obj/structure/table/bench/wooden, +/obj/random/mob/wildscugs{ + newdesc = "A wild catslug enjoying the simpler things in life: a picnic!"; + newname = list("happy catslug", "rotund catslug", "anxious catslug", "angry Catslug", "content Catslug", "sad catslug") + }, +/turf/simulated/floor/outdoors/grass/seasonal/notrees_nomobs_nosnow, +/area/template_noop) +"L" = ( +/obj/effect/decal/remains/lizard, +/turf/simulated/floor/outdoors/grass/seasonal/nomobs, +/area/template_noop) +"N" = ( +/obj/structure/table/wooden_reinforced, +/obj/item/weapon/bedsheet/hosdouble{ + desc = "Odd, this tablecloth looks... suspiciously like the bedsheets NanoTrasen security staff use!"; + name = "Picnic Blanket" + }, +/obj/item/weapon/bedsheet/hosdouble{ + desc = "Odd, this tablecloth looks... suspiciously like the bedsheets NanoTrasen security staff use!"; + name = "Picnic Blanket"; + pixel_x = 11 + }, +/obj/item/weapon/storage/toolbox/lunchbox/heart/filled, +/turf/simulated/floor/outdoors/grass/seasonal/notrees_nomobs_nosnow, +/area/template_noop) +"O" = ( +/obj/structure/table/bench/wooden, +/obj/random/mob/wildscugs{ + newdesc = "A wild catslug enjoying the simpler things in life: a picnic!"; + newname = list("happy catslug", "rotund catslug", "anxious catslug", "angry Catslug", "content Catslug", "sad catslug") + }, +/obj/random/mug, +/turf/simulated/floor/outdoors/grass/seasonal/notrees_nomobs_nosnow, +/area/template_noop) +"Q" = ( +/obj/random/cigarettes, +/turf/simulated/floor/outdoors/grass/seasonal/nomobs, +/area/template_noop) +"S" = ( +/obj/structure/table/bench/wooden, +/obj/item/weapon/towel/random, +/obj/random/mob/wildscugs{ + newdesc = "A wild catslug enjoying the simpler things in life: a picnic!"; + newname = list("happy catslug", "rotund catslug", "anxious catslug", "angry Catslug", "content Catslug", "sad catslug") + }, +/turf/simulated/floor/outdoors/grass/seasonal/notrees_nomobs_nosnow, +/area/template_noop) +"T" = ( +/obj/effect/decal/cleanable/tomato_smudge, +/turf/simulated/floor/outdoors/grass/seasonal/notrees_nomobs_lowsnow, +/area/template_noop) +"Y" = ( +/obj/random/drinksoft, +/turf/simulated/floor/outdoors/grass/seasonal/nomobs, +/area/template_noop) + +(1,1,1) = {" +c +A +A +A +A +"} +(2,1,1) = {" +a +T +n +n +Y +"} +(3,1,1) = {" +Q +s +h +J +w +"} +(4,1,1) = {" +L +N +d +i +b +"} +(5,1,1) = {" +t +F +O +S +m +"} +(6,1,1) = {" +L +z +g +k +A +"} +(7,1,1) = {" +A +A +A +A +p +"} diff --git a/vorestation.dme b/vorestation.dme index 7dfd2fa65af..a045d90495b 100644 --- a/vorestation.dme +++ b/vorestation.dme @@ -4190,7 +4190,6 @@ #include "maps\expedition_vr\beach\submaps\mountains.dm" #include "maps\expedition_vr\beach\submaps\mountains_areas.dm" #include "maps\gateway_archive_vr\blackmarketpackers.dm" -#include "maps\groundbase\groundbase.dm" #include "maps\southern_cross\items\clothing\sc_accessory.dm" #include "maps\southern_cross\items\clothing\sc_suit.dm" #include "maps\southern_cross\items\clothing\sc_under.dm" @@ -4206,5 +4205,6 @@ #include "maps\submaps\space_submaps\debrisfield\debrisfield.dm" #include "maps\submaps\surface_submaps\wilderness\wilderness.dm" #include "maps\submaps\surface_submaps\wilderness\wilderness_areas.dm" +#include "maps\tether\tether.dm" #include "maps\~map_system\maps.dm" // END_INCLUDE