diff --git a/code/game/mecha/working/ripley.dm b/code/game/mecha/working/ripley.dm index 629de2f697..4d2e113749 100644 --- a/code/game/mecha/working/ripley.dm +++ b/code/game/mecha/working/ripley.dm @@ -2,14 +2,14 @@ desc = "Autonomous Power Loader Unit. This newer model is refitted with powerful armour against the dangers of planetary mining." name = "\improper APLU \"Ripley\"" icon_state = "ripley" - step_in = 4 //Move speed, lower is faster. - var/fast_pressure_step_in = 2 //step_in while in normal pressure conditions - var/slow_pressure_step_in = 4 //step_in while in better pressure conditions + step_in = 3 //Move speed, lower is faster. + var/fast_pressure_step_in = 2 + var/slow_pressure_step_in = 3 max_temperature = 20000 max_integrity = 200 - lights_power = 7 + lights_power = 8 deflect_chance = 15 - armor = list("melee" = 40, "bullet" = 20, "laser" = 10, "energy" = 20, "bomb" = 40, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100) + armor = list("melee" = 30, "bullet" = 15, "laser" = 10, "energy" = 20, "bomb" = 40, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100) max_equip = 6 wreckage = /obj/structure/mecha_wreckage/ripley var/list/cargo = new @@ -64,6 +64,9 @@ desc = "Autonomous Power Loader Unit. This model is refitted with additional thermal protection." name = "\improper APLU \"Firefighter\"" icon_state = "firefighter" + step_in = 4 + fast_pressure_step_in = 2 + slow_pressure_step_in = 4 max_temperature = 65000 max_integrity = 250 resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF @@ -191,4 +194,4 @@ cargo -= O else if(user.loc == src) //so we don't get the message if we resisted multiple times and succeeded. - to_chat(user, "You fail to push [O] out of [src]!") + to_chat(user, "You fail to push [O] out of [src]!") \ No newline at end of file diff --git a/code/game/objects/items/defib.dm b/code/game/objects/items/defib.dm index ba0aa36634..034363be7d 100644 --- a/code/game/objects/items/defib.dm +++ b/code/game/objects/items/defib.dm @@ -411,6 +411,8 @@ to_chat(user, "[src] are recharging!") return + user.stop_pulling() //User has hands full, and we don't care about anyone else pulling on it, their problem. CLEAR!! + if(user.a_intent == INTENT_DISARM) do_disarm(M, user) return diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 05167ca40c..bb3a4442b3 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -127,6 +127,11 @@ GLOBAL_LIST_EMPTY(preferences_datums) var/action_buttons_screen_locs = list() + //backgrounds + var/mutable_appearance/character_background + var/icon/bgstate = "steel" + var/list/bgstate_options = list("000", "midgrey", "FFF", "white", "steel", "techmaint", "dark", "plating", "reinforced") + /datum/preferences/New(client/C) parent = C @@ -266,6 +271,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += "Species:[pref_species.id]
" dat += "Random Body
" dat += "Always Random Body:[be_random_body ? "Yes" : "No"]
" + dat += "
Cycle background:[bgstate]
" var/use_skintones = pref_species.use_skintones if(use_skintones) @@ -1412,6 +1418,9 @@ GLOBAL_LIST_EMPTY(preferences_datums) if("previous_facehair_style") facial_hair_style = previous_list_item(facial_hair_style, GLOB.facial_hair_styles_list) + if("cycle_bg") + bgstate = next_list_item(bgstate, bgstate_options) + if("underwear") var/new_underwear if(gender == MALE) @@ -1455,10 +1464,6 @@ GLOBAL_LIST_EMPTY(preferences_datums) features["mam_body_markings"] = "Plain" if("tail_lizard" in pref_species.default_features) features["tail_lizard"] = "Smooth" - if("mam_tail" in pref_species.default_features) - features["mam_tail"] = "None" - if("mam_ears" in pref_species.default_features) - features["mam_ears"] = "None" if(pref_species.id == "felinid") features["mam_tail"] = "Cat" features["mam_ears"] = "Cat" diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index 9e19ab65a2..b6210d94b8 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -260,12 +260,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car S["feature_lizard_body_markings"] >> features["body_markings"] S["feature_lizard_legs"] >> features["legs"] S["feature_moth_wings"] >> features["moth_wings"] - if(!CONFIG_GET(flag/join_with_mutant_humans)) - features["tail_human"] = "none" - features["ears"] = "none" - else - S["feature_human_tail"] >> features["tail_human"] - S["feature_human_ears"] >> features["ears"] + S["feature_human_tail"] >> features["tail_human"] + S["feature_human_ears"] >> features["ears"] //Custom names for(var/custom_name_id in GLOB.preferences_custom_names) @@ -388,15 +384,15 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car uplink_spawn_loc = sanitize_inlist(uplink_spawn_loc, GLOB.uplink_spawn_loc_list, initial(uplink_spawn_loc)) features["mcolor"] = sanitize_hexcolor(features["mcolor"], 3, 0) features["tail_lizard"] = sanitize_inlist(features["tail_lizard"], GLOB.tails_list_lizard) - features["tail_human"] = sanitize_inlist(features["tail_human"], GLOB.tails_list_human, "None") + features["tail_human"] = sanitize_inlist(features["tail_human"], GLOB.tails_list_human) features["snout"] = sanitize_inlist(features["snout"], GLOB.snouts_list) features["horns"] = sanitize_inlist(features["horns"], GLOB.horns_list) - features["ears"] = sanitize_inlist(features["ears"], GLOB.ears_list, "None") + features["ears"] = sanitize_inlist(features["ears"], GLOB.ears_list) features["frills"] = sanitize_inlist(features["frills"], GLOB.frills_list) features["spines"] = sanitize_inlist(features["spines"], GLOB.spines_list) features["body_markings"] = sanitize_inlist(features["body_markings"], GLOB.body_markings_list) - features["feature_lizard_legs"] = sanitize_inlist(features["legs"], GLOB.legs_list, "Normal Legs") - features["moth_wings"] = sanitize_inlist(features["moth_wings"], GLOB.moth_wings_list, "Plain") + features["feature_lizard_legs"] = sanitize_inlist(features["legs"], GLOB.legs_list) + features["moth_wings"] = sanitize_inlist(features["moth_wings"], GLOB.moth_wings_list) joblessrole = sanitize_integer(joblessrole, 1, 3, initial(joblessrole)) job_civilian_high = sanitize_integer(job_civilian_high, 0, 65535, initial(job_civilian_high)) diff --git a/code/modules/clothing/suits/labcoat.dm b/code/modules/clothing/suits/labcoat.dm index a598bd0959..6576f0e55b 100644 --- a/code/modules/clothing/suits/labcoat.dm +++ b/code/modules/clothing/suits/labcoat.dm @@ -5,7 +5,28 @@ item_state = "labcoat" blood_overlay_type = "coat" body_parts_covered = CHEST|ARMS - allowed = list(/obj/item/analyzer, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer, /obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/pill, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic, /obj/item/soap, /obj/item/sensor_device, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman) + allowed = list( + /obj/item/analyzer, + /obj/item/stack/medical, + /obj/item/dnainjector, + /obj/item/reagent_containers/dropper, + /obj/item/reagent_containers/syringe, + /obj/item/reagent_containers/hypospray, + /obj/item/hypospray/mkii, + /obj/item/healthanalyzer, + /obj/item/flashlight/pen, + /obj/item/reagent_containers/glass/bottle, + /obj/item/reagent_containers/glass/beaker, + /obj/item/reagent_containers/pill, + /obj/item/storage/pill_bottle, + /obj/item/paper, + /obj/item/melee/classic_baton/telescopic, + /obj/item/soap, + /obj/item/sensor_device, + /obj/item/tank/internals/emergency_oxygen, + /obj/item/tank/internals/plasmaman + ) + armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 50, "rad" = 0, "fire" = 50, "acid" = 50) togglename = "buttons" species_exception = list(/datum/species/golem) diff --git a/code/modules/mob/dead/new_player/preferences_setup.dm b/code/modules/mob/dead/new_player/preferences_setup.dm index 6b67ada775..fc879ed7a8 100644 --- a/code/modules/mob/dead/new_player/preferences_setup.dm +++ b/code/modules/mob/dead/new_player/preferences_setup.dm @@ -25,7 +25,6 @@ // var/wide_icon = FALSE //CITDEL THINGS // if(features["taur"] != "None") // wide_icon = TRUE - if(job_engsec_high) switch(job_engsec_high) if(AI_JF) @@ -37,6 +36,8 @@ // Set up the dummy for its photoshoot var/mob/living/carbon/human/dummy/mannequin = generate_or_wait_for_human_dummy(DUMMY_HUMAN_SLOT_PREFERENCES) + mannequin.cut_overlays() + mannequin.add_overlay(mutable_appearance('modular_citadel/icons/ui/backgrounds.dmi', bgstate, layer = SPACE_LAYER)) copy_to(mannequin) // Determine what job is marked as 'High' priority, and dress them up as such. diff --git a/code/modules/mob/living/carbon/human/dummy.dm b/code/modules/mob/living/carbon/human/dummy.dm index beb183e842..3406d29b3a 100644 --- a/code/modules/mob/living/carbon/human/dummy.dm +++ b/code/modules/mob/living/carbon/human/dummy.dm @@ -2,6 +2,7 @@ /mob/living/carbon/human/dummy real_name = "Test Dummy" status_flags = GODMODE|CANPUSH + mouse_drag_pointer = MOUSE_INACTIVE_POINTER var/in_use = FALSE INITIALIZE_IMMEDIATE(/mob/living/carbon/human/dummy) diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 3a0cfcacf5..c145053990 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -1164,16 +1164,6 @@ GLOBAL_LIST_EMPTY(roundstart_races) H.update_inv_w_uniform() H.update_inv_wear_suit() - /* - if(H.noisy && H.nutrition <= NUTRITION_LEVEL_STARVING) - if(prob(10)) - playsound(get_turf(H),"hunger_sounds",35,0,-5,1,ignore_walls = FALSE,channel=CHANNEL_PRED) - - else if(H.noisy && H.nutrition <= NUTRITION_LEVEL_HUNGRY) - if(prob(10)) - playsound(get_turf(H),"hunger_sounds",15,0,-5,1,ignore_walls = FALSE,channel=CHANNEL_PRED) - */ - // nutrition decrease and satiety if (H.nutrition > 0 && H.stat != DEAD && !H.has_trait(TRAIT_NOHUNGER)) // THEY HUNGER diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm index 941ba0ec69..ec858fdff5 100644 --- a/code/modules/mob/living/simple_animal/hostile/hostile.dm +++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm @@ -345,7 +345,15 @@ /mob/living/simple_animal/hostile/proc/AttackingTarget() in_melee = TRUE - return target.attack_animal(src) + if(isliving(target)) + var/mob/living/L = target + if(L.Adjacent(src) && vore_active && L.devourable) // aggressive check to ensure vore attacks can be made + if(prob(voracious_chance)) + vore_attack(src,L,src) + else + return L.attack_animal(src) + else + return target.attack_animal(src) /mob/living/simple_animal/hostile/proc/Aggro() vision_range = aggro_vision_range diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/dragon_vore.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/dragon_vore.dm index 7e69298b69..26f146b952 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/dragon_vore.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/dragon_vore.dm @@ -8,8 +8,6 @@ var/obj/belly/megafauna/dragon/maw/maw = new(src) var/obj/belly/megafauna/dragon/gullet/gullet = new(src) var/obj/belly/megafauna/dragon/gut/gut = new(src) -// for(var/obj/belly/X in list(maw, gullet, gut)) -// vore_organs[X.name] = X // Connect 'stomachs' together maw.transferlocation = gullet gullet.transferlocation = gut @@ -49,6 +47,6 @@ vore_sound = "Tauric Swallow" desc = "With a rush of burning ichor greeting you, you're introduced to the Drake's stomach. Wrinkled walls greedily grind against you, acidic slimes working into your body as you become fuel and nutriton for a superior predator. All that's left is your body's willingness to resist your destiny." digest_mode = DM_DRAGON - digest_burn = 5 + digest_burn = 2 swallow_time = 100 // costs extra time to eat directly to here escapechance = 0 diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm index 92ac07b1a0..a07e46a289 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm @@ -85,7 +85,7 @@ OpenFire() if(L.Adjacent(src) && (L.stat != CONSCIOUS)) if(vore_active && L.devourable == TRUE) - dragon_feeding(src,L) + vore_attack(src,L,src) LoseTarget() else devour(L) diff --git a/code/modules/mob/living/simple_animal/simple_animal_vr.dm b/code/modules/mob/living/simple_animal/simple_animal_vr.dm index 41c7971533..afb1b88d3b 100644 --- a/code/modules/mob/living/simple_animal/simple_animal_vr.dm +++ b/code/modules/mob/living/simple_animal/simple_animal_vr.dm @@ -1,21 +1,29 @@ +#define VORACIOUS_CHANCE 40 +#define VORE_SWALLOW_TIME 50 + /mob/living/simple_animal - // List of targets excluded (for now) from being eaten by this mob. - var/list/prey_exclusions = list() - devourable = FALSE //insurance because who knows. - digestable = TRUE //I mean, if it's devourable it should also be digestible - var/vore_active = FALSE // If vore behavior is enabled for this mob + //Specific vore behaviors + var/vore_active = FALSE // If vore behavior is enabled for this mob + var/isPredator = FALSE //Are they capable of performing and pre-defined vore actions for their species? + var/swallowTime = VORE_SWALLOW_TIME //How long it takes to eat Human and other Simple_animal prey in 1/10 of a second. The default is 5 seconds. + var/list/prey_excludes = list() //For excluding people from being eaten. + var/voracious_chance = VORACIOUS_CHANCE //Mob AI Engagement probability when rolling between regular melee strike and a vore attempt, default 40% - var/vore_default_mode = DM_DIGEST // Default bellymode (DM_DIGEST, DM_HOLD, DM_ABSORB) - var/vore_digest_chance = 25 // Chance to switch to digest mode if resisted - var/vore_escape_chance = 25 // Chance of resisting out of mob - var/vore_absorb_chance = 0 // chance of absorbtion by mob + // Vore belly interactions + // Most mobs are only going to have the one gut. Multi-gut set ups should refer to Ash Drake's dragon_vore.dm for set up. - var/vore_stomach_name // The name for the first belly if not "stomach" - var/vore_stomach_flavor // The flavortext for the first belly if not the default - - var/vore_fullness = 0 // How "full" the belly is (controls icons) - var/list/living_mobs = list() + var/vore_default_sound = "Gulp" // Default vore sound + var/vore_default_release = "Splatter" // Default release sound + var/vore_wetness = TRUE // Default for a wet belly + var/vore_default_mode = DM_DIGEST // Default bellymode (DM_DIGEST, DM_HOLD, DM_ABSORB) + var/vore_digest_chance = VORACIOUS_CHANCE // Chance to switch to digest mode if resisted, default 40% + var/vore_escape_chance = VORACIOUS_CHANCE // Chance of resisting out of mob, default 40% + var/vore_absorb_chance = 0 // chance of absorbtion by mob, default 0% + var/vore_stomach_name // The name for the first belly if not "stomach" + var/vore_stomach_flavor // The flavortext for the first belly if not the default + //Icon Memes + var/vore_fullness = 0 // How "full" the belly is (controls icons) // Release belly contents before being gc'd! /mob/living/simple_animal/Destroy() @@ -34,35 +42,19 @@ vore_fullness = new_fullness -/* -/mob/living/simple_animal/proc/swallow_check() - for(var/I in vore_organs) - var/obj/belly/B = vore_organs[I] - if(vore_active) - update_fullness() - if(!vore_fullness) - // Nothing - return - else - addtimer(CALLBACK(src, .proc/swallow_mob), B.swallow_time) - -/mob/living/simple_animal/proc/swallow_mob() - for(var/I in vore_organs) - var/obj/belly/B = vore_organs[I] - for(var/mob/living/M in B.contents) - B.transfer_contents(M, transferlocation) -*/ - /mob/living/simple_animal/death() release_vore_contents(silent = TRUE) . = ..() // Simple animals have only one belly. This creates it (if it isn't already set up) -/mob/living/simple_animal/proc/init_belly() +/mob/living/simple_animal/init_vore() + vore_init = TRUE if(vore_organs.len) return if(no_vore) //If it can't vore, let's not give it a stomach. return + if(vore_active && !IsAdvancedToolUser()) //vore active, but doesn't have thumbs to grab people with. + verbs |= /mob/living/simple_animal/proc/animal_nom var/obj/belly/B = new /obj/belly(src) vore_selected = B @@ -70,6 +62,9 @@ B.name = vore_stomach_name ? vore_stomach_name : "stomach" B.desc = vore_stomach_flavor ? vore_stomach_flavor : "Your surroundings are warm, soft, and slimy. Makes sense, considering you're inside \the [name]." B.digest_mode = vore_default_mode + B.vore_sound = vore_default_sound + B.release_sound = vore_default_release + B.is_wet = vore_wetness B.escapable = vore_escape_chance > 0 B.escapechance = vore_escape_chance B.digestchance = vore_digest_chance @@ -97,21 +92,42 @@ "The juices pooling beneath you sizzle against your sore skin.", "The churning walls slowly pulverize you into meaty nutrients.", "The stomach glorps and gurgles as it tries to work you into slop.") -/* B.emote_lists[DM_ITEMWEAK] = list( - "The burning acids eat away at your form.", - "The muscular stomach flesh grinds harshly against you.", - "The caustic air stings your chest when you try to breathe.", - "The slimy guts squeeze inward to help the digestive juices soften you up.", - "The onslaught against your body doesn't seem to be letting up; you're food now.", - "The predator's body ripples and crushes against you as digestive enzymes pull you apart.", - "The juices pooling beneath you sizzle against your sore skin.", - "The churning walls slowly pulverize you into meaty nutrients.", - "The stomach glorps and gurgles as it tries to work you into slop.")*/ -//Grab = Nomf -/* -/mob/living/simple_animal/UnarmedAttack(var/atom/A, var/proximity) - . = ..() +// +// Simple proc for animals to have their digestion toggled on/off externally +// +/mob/living/simple_animal/verb/toggle_digestion() + set name = "Toggle Animal's Digestion" + set desc = "Enables digestion on this mob for 20 minutes." + set category = "Object" + set src in oview(1) - if(a_intent == I_GRAB && isliving(A) && !has_hands) - animal_nom(A)*/ \ No newline at end of file + var/datum/belly/B = vore_organs[vore_selected] + if(faction != usr.faction) + to_chat(usr,"This predator isn't friendly, and doesn't give a shit about your opinions of it digesting you.") + return + if(B.digest_mode == "Hold") + var/confirm = alert(usr, "Enabling digestion on [name] will cause it to digest all stomach contents. Using this to break OOC prefs is against the rules. Digestion will disable itself after 20 minutes.", "Enabling [name]'s Digestion", "Enable", "Cancel") + if(confirm == "Enable") + B.digest_mode = "Digest" + sleep(20 MINUTES) //12000=20 minutes + B.digest_mode = "Hold" + else + var/confirm = alert(usr, "This mob is currently set to digest all stomach contents. Do you want to disable this?", "Disabling [name]'s Digestion", "Disable", "Cancel") + if(confirm == "Disable") + B.digest_mode = "Hold" + +// +// Simple nom proc for if you get ckey'd into a simple_animal mob! Avoids grabs. +// +/mob/living/simple_animal/proc/animal_nom(var/mob/living/T in oview(1)) + set name = "Animal Nom" + set category = "Vore" + set desc = "Since you can't grab, you get a verb!" + + if (stat != CONSCIOUS) + return + if (T.devourable == FALSE) + to_chat(usr, "You can't eat this!") + return + return vore_attack(usr,T,usr) diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index b1f001222b..d6d0a3dc4f 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -134,7 +134,7 @@ var/locid = 0 var/laststart = 1 var/textindex = 1 - while(1) //I know this can cause infinite loops and fuck up the whole server, but the if(istart==0) should be safe as fuck + while(locid < 15) //hey whoever decided a while(1) was a good idea here, i hate you var/istart = 0 if(links) istart = findtext(info_links, "", laststart) @@ -198,7 +198,7 @@ // Count the fields var/laststart = 1 - while(1) + while(fields < 15) var/i = findtext(t, "", laststart) if(i == 0) break @@ -210,7 +210,7 @@ /obj/item/paper/proc/reload_fields() // Useful if you made the paper programicly and want to include fields. Also runs updateinfolinks() for you. fields = 0 var/laststart = 1 - while(1) + while(fields < 15) var/i = findtext(info, "", laststart) if(i == 0) break diff --git a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm index 7339f850d8..10282e5e0a 100644 --- a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm +++ b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm @@ -62,7 +62,6 @@ ) var/list/upgrade_reagents3 = list( - "glycerol", "mine_salve", "toxin" ) diff --git a/html/changelogs/AutoChangeLog-pr-8228.yml b/html/changelogs/AutoChangeLog-pr-8228.yml new file mode 100644 index 0000000000..bcfae35a3c --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8228.yml @@ -0,0 +1,4 @@ +author: "Coolgat3" +delete-after: True +changes: + - tweak: "Raised the ripley's movement speed and lights range by 1, also lowered its armor to compensate." diff --git a/html/changelogs/AutoChangeLog-pr-8229.yml b/html/changelogs/AutoChangeLog-pr-8229.yml new file mode 100644 index 0000000000..c22f1dab3d --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8229.yml @@ -0,0 +1,4 @@ +author: "deathride58" +delete-after: True +changes: + - bugfix: "Hopefully fixed paper crash 2: electric boogaloo" diff --git a/html/changelogs/AutoChangeLog-pr-8231.yml b/html/changelogs/AutoChangeLog-pr-8231.yml new file mode 100644 index 0000000000..f71ec3fd52 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8231.yml @@ -0,0 +1,5 @@ +author: "Poojawa" +delete-after: True +changes: + - tweak: "hypospray kits hold 12 now, but only vials and sprays themselves" + - bugfix: "labcoats can carry MK II hyposprays on them now." diff --git a/html/changelogs/AutoChangeLog-pr-8232.yml b/html/changelogs/AutoChangeLog-pr-8232.yml new file mode 100644 index 0000000000..00d319dfe5 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8232.yml @@ -0,0 +1,6 @@ +author: "Poojawa" +delete-after: True +changes: + - rscadd: "Vore Mobs are a thing now, not just ash drakes" + - rscdel: "Removed hunger sound stuff. never taking requests from Coolgat3 ever again. +refractor: Simple Mobs use the same system regular human mobs do, itjustworks.png" diff --git a/html/changelogs/AutoChangeLog-pr-8233.yml b/html/changelogs/AutoChangeLog-pr-8233.yml new file mode 100644 index 0000000000..d9d827df4b --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8233.yml @@ -0,0 +1,5 @@ +author: "Poojawa" +delete-after: True +changes: + - tweak: "Character Window settings unsnowflaked and normalized. I have no fucking clue how to make them work with taurs still tho, sorry." + - imageadd: "added rotating background images for better clarity and contrast than just SOLID FUCKING BLACK. Images from Virgo/Polaris/Eris" diff --git a/html/changelogs/AutoChangeLog-pr-8235.yml b/html/changelogs/AutoChangeLog-pr-8235.yml new file mode 100644 index 0000000000..ab5aef0b8d --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8235.yml @@ -0,0 +1,4 @@ +author: "Poojawa" +delete-after: True +changes: + - balance: "Defib users automatically stop pulling when they attempt to perform a defib shock" diff --git a/interface/skin.dmf b/interface/skin.dmf index 65f4a22664..5f8e1ad125 100644 --- a/interface/skin.dmf +++ b/interface/skin.dmf @@ -272,7 +272,7 @@ window "statwindow" elem "preferences_window" type = MAIN pos = 372,0 - size = 1120x1000 + size = 1280x1000 anchor1 = none anchor2 = none background-color = none @@ -281,17 +281,17 @@ window "statwindow" statusbar = false elem "preferences_browser" type = BROWSER - pos = -8,-8 - size = 896x1008 + pos = 0,0 + size = 960x1000 anchor1 = 0,0 - anchor2 = 90,100 + anchor2 = 75,100 background-color = none saved-params = "" elem "character_preview_map" type = MAP - pos = 887,0 - size = 313x1000 - anchor1 = 90,0 + pos = 960,0 + size = 320x1000 + anchor1 = 75,0 anchor2 = 100,100 right-click = true saved-params = "zoom;letterbox;zoom-mode" diff --git a/modular_citadel/code/game/objects/items/storage/firstaid.dm b/modular_citadel/code/game/objects/items/storage/firstaid.dm index 6ddf3963dd..6ff1bfbe2c 100755 --- a/modular_citadel/code/game/objects/items/storage/firstaid.dm +++ b/modular_citadel/code/game/objects/items/storage/firstaid.dm @@ -23,14 +23,14 @@ /obj/item/storage/firstaid/o2 icon_state = "oxy" - + /obj/item/storage/firstaid/radbgone icon_state = "rad" - + /obj/item/storage/firstaid/radbgone/Initialize(mapload) . = ..() icon_state = pick("[initial(icon_state)]","[initial(icon_state)]2","[initial(icon_state)]3","[initial(icon_state)]4") - + /obj/item/storage/firstaid/tactical icon_state = "tactical" @@ -50,10 +50,10 @@ /obj/item/storage/hypospraykit/ComponentInitialize() . = ..() GET_COMPONENT(STR, /datum/component/storage) - STR.max_w_class = WEIGHT_CLASS_SMALL - STR.max_combined_w_class = 5 - STR.max_items = 5 - STR.cant_hold = typecacheof(list(/obj/item/disk/nuclear)) + STR.max_items = 12 + STR.can_hold = typecacheof(list( + /obj/item/hypospray/mkii, + /obj/item/reagent_containers/glass/bottle/vial)) /obj/item/storage/hypospraykit/regular icon_state = "firstaid-mini" @@ -136,10 +136,10 @@ /obj/item/storage/hypospraykit/cmo/ComponentInitialize() . = ..() GET_COMPONENT(STR, /datum/component/storage) - STR.max_w_class = WEIGHT_CLASS_SMALL - STR.max_combined_w_class = 6 STR.max_items = 6 - STR.cant_hold = typecacheof(list(/obj/item/disk/nuclear)) + STR.can_hold = typecacheof(list( + /obj/item/hypospray/mkii, + /obj/item/reagent_containers/glass/bottle/vial)) /obj/item/storage/hypospraykit/cmo/PopulateContents() if(empty) diff --git a/modular_citadel/code/modules/mob/living/simple_animal/simplemob_vore_values.dm b/modular_citadel/code/modules/mob/living/simple_animal/simplemob_vore_values.dm index ed1268a354..0daf68f6c1 100644 --- a/modular_citadel/code/modules/mob/living/simple_animal/simplemob_vore_values.dm +++ b/modular_citadel/code/modules/mob/living/simple_animal/simplemob_vore_values.dm @@ -1,85 +1,141 @@ -/mob/living/simple_animal/pet/cat - devourable = TRUE - no_vore = FALSE - -/mob/living/simple_animal/crab - devourable = TRUE - -/mob/living/simple_animal/pet/dog - devourable = TRUE - no_vore = FALSE - -/mob/living/simple_animal/hostile/retaliate/goat - devourable = TRUE - no_vore = FALSE - -/mob/living/simple_animal/cow - devourable = TRUE - no_vore = FALSE - -/mob/living/simple_animal/chick - devourable = TRUE - -/mob/living/simple_animal/chicken - devourable = TRUE - no_vore = FALSE - -/mob/living/simple_animal/pet/fox - devourable = TRUE - no_vore = FALSE - -/mob/living/simple_animal/hostile/lizard - devourable = TRUE - -/mob/living/simple_animal/mouse - devourable = TRUE - -/mob/living/simple_animal/pet/penguin - no_vore = TRUE - -/mob/living/simple_animal/pet - devourable = TRUE - -/mob/living/simple_animal/sloth - devourable = TRUE - -/mob/living/simple_animal/hostile/alien - devourable = TRUE - no_vore = FALSE - -/mob/living/simple_animal/hostile/bear - devourable = TRUE - no_vore = FALSE - -/mob/living/simple_animal/hostile/poison/giant_spider - devourable = TRUE - -/mob/living/simple_animal/hostile/retaliate/poison/snake - devourable = TRUE - no_vore = FALSE //oh yes my pretty. - -/mob/living/simple_animal/hostile/gorilla - devourable = TRUE - no_vore = FALSE - -/mob/living/simple_animal/hostile/megafauna/dragon - no_vore = FALSE - -/mob/living/simple_animal/hostile/asteroid/goliath - no_vore = FALSE - -/mob/living/simple_animal/parrot - devourable = TRUE - no_vore = FALSE - -/mob/living/simple_animal - no_vore = TRUE - +//CARBON MOBS /mob/living/carbon/alien devourable = TRUE + digestable = TRUE + feeding = TRUE /mob/living/carbon/monkey devourable = TRUE - + digestable = TRUE + feeding = TRUE + + +/* + REFER TO code/modules/mob/living/simple_animal/simple_animal_vr.dm for Var information! +*/ + + +//NUETRAL MOBS +/mob/living/simple_animal/crab + devourable = TRUE + digestable = TRUE + feeding = TRUE + +/mob/living/simple_animal/cow + devourable = TRUE + digestable = TRUE + feeding = TRUE + vore_active = TRUE + isPredator = TRUE + vore_default_mode = DM_HOLD + +/mob/living/simple_animal/chick + devourable = TRUE + digestable = TRUE + +/mob/living/simple_animal/chicken + devourable = TRUE + digestable = TRUE + +/mob/living/simple_animal/mouse + devourable = TRUE + digestable = TRUE + +//STATION PETS +/mob/living/simple_animal/pet + devourable = TRUE + digestable = TRUE + feeding = TRUE + +/mob/living/simple_animal/pet/fox + vore_active = TRUE + isPredator = TRUE + vore_default_mode = DM_HOLD + +/mob/living/simple_animal/pet/cat + vore_active = TRUE + isPredator = TRUE + vore_default_mode = DM_HOLD + +/mob/living/simple_animal/pet/dog + vore_active = TRUE + isPredator = TRUE + vore_default_mode = DM_HOLD + +/mob/living/simple_animal/sloth + devourable = TRUE + digestable = TRUE + feeding = TRUE + +/mob/living/simple_animal/parrot + devourable = TRUE + digestable = TRUE + +//HOSTILE MOBS +/mob/living/simple_animal/hostile/retaliate/goat + devourable = TRUE + digestable = TRUE + feeding = TRUE + vore_active = TRUE + isPredator = TRUE + vore_stomach_flavor = "You find yourself squeezed into the hollow of the goat, the smell of oats and hay thick in the tight space, all of which grinds in on you. Harmless for now..." + vore_default_mode = DM_HOLD + +/mob/living/simple_animal/hostile/lizard + devourable = TRUE + digestable = TRUE + +/mob/living/simple_animal/hostile/alien + devourable = TRUE + digestable = TRUE + feeding = TRUE + vore_active = TRUE + isPredator = TRUE + vore_default_mode = DM_HOLD + +/mob/living/simple_animal/hostile/bear + devourable = TRUE + digestable = TRUE + feeding = TRUE + vore_active = TRUE + isPredator = TRUE + vore_default_mode = DM_HOLD + +/mob/living/simple_animal/hostile/poison/giant_spider + devourable = TRUE + digestable = TRUE + feeding = TRUE + vore_active = TRUE + vore_default_mode = DM_HOLD + +/mob/living/simple_animal/hostile/retaliate/poison/snake + devourable = TRUE + digestable = TRUE + feeding = TRUE + vore_active = TRUE + isPredator = TRUE + vore_default_mode = DM_HOLD + +/mob/living/simple_animal/hostile/gorilla + devourable = TRUE + digestable = TRUE + feeding = TRUE + vore_active = TRUE + isPredator = TRUE + vore_default_mode = DM_HOLD + +/mob/living/simple_animal/hostile/asteroid/goliath + devourable = TRUE + digestable = TRUE + feeding = TRUE + vore_active = TRUE + isPredator = TRUE + vore_default_mode = DM_HOLD + /mob/living/simple_animal/hostile/carp devourable = TRUE + digestable = TRUE + feeding = TRUE + vore_active = TRUE + isPredator = TRUE + vore_default_mode = DM_HOLD diff --git a/modular_citadel/code/modules/reagents/reagents/cit_reagents.dm b/modular_citadel/code/modules/reagents/reagents/cit_reagents.dm index ae77fbcfc0..e46174b5a9 100644 --- a/modular_citadel/code/modules/reagents/reagents/cit_reagents.dm +++ b/modular_citadel/code/modules/reagents/reagents/cit_reagents.dm @@ -36,6 +36,10 @@ /obj/effect/decal/cleanable/semen/New() ..() dir = pick(1,2,4,8) + add_blood_DNA(list("Non-human DNA" = "A+")) + +/obj/effect/decal/cleanable/semen/replace_decal(obj/effect/decal/cleanable/semen/S) + S.add_blood_DNA(return_blood_DNA()) /datum/reagent/consumable/femcum name = "Female Ejaculate" diff --git a/modular_citadel/code/modules/vore/eating/living_vr.dm b/modular_citadel/code/modules/vore/eating/living_vr.dm index cb194ddc65..b1d2a46ff2 100644 --- a/modular_citadel/code/modules/vore/eating/living_vr.dm +++ b/modular_citadel/code/modules/vore/eating/living_vr.dm @@ -9,7 +9,6 @@ var/vore_taste = null // What the character tastes like var/no_vore = FALSE // If the character/mob can vore. var/openpanel = 0 // Is the vore panel open? - var/noisy = FALSE // tummies are rumbly? var/absorbed = FALSE //are we absorbed? var/next_preyloop var/vore_init = FALSE //Has this mob's vore been initialized yet? @@ -140,51 +139,6 @@ var/belly = input("Choose Belly") in pred.vore_organs return perform_the_nom(user, prey, pred, belly) -//Dragon noms need to be faster -/mob/living/proc/dragon_feeding(var/mob/living/user, var/mob/living/prey) - var/belly = user.vore_selected - return perform_dragon(user, prey, user, belly) - -/mob/living/proc/perform_dragon(var/mob/living/user, var/mob/living/prey, var/mob/living/pred, var/obj/belly/belly, swallow_time = 20) - //Sanity - if(!user || !prey || !pred || !istype(belly) || !(belly in pred.vore_organs)) - testing("[user] attempted to feed [prey] to [pred], via [lowertext(belly.name)] but it went wrong.") - return FALSE - - if(istype(pred, /mob/living/simple_animal/hostile/megafauna/dragon)) - if(isliving(prey) && !prey.Adjacent(pred)) - return FALSE - - // The belly selected at the time of noms - var/attempt_msg = "ERROR: Vore message couldn't be created. Notify a dev. (at)" - var/success_msg = "ERROR: Vore message couldn't be created. Notify a dev. (sc)" - - // Prepare messages - if(user == pred) //Feeding someone to yourself - attempt_msg = text("[] starts to [] [] into their []!",pred,lowertext(belly.vore_verb),prey,lowertext(belly.name)) - success_msg = text("[] manages to [] [] into their []!",pred,lowertext(belly.vore_verb),prey,lowertext(belly.name)) - - if(!prey.Adjacent(user)) // let's doublecheck for sanity's sake. - return FALSE - - // Announce that we start the attempt! - user.visible_message(attempt_msg) - - if(!do_mob(src, user, swallow_time)) - return FALSE // Prey escaped (or user disabled) before timer expired. - - // If we got this far, nom successful! Announce it! - user.visible_message(success_msg) - playsound(get_turf(user), "[belly.vore_sound]",75,0,-6,0) - - // Actually shove prey into the belly. - belly.nom_mob(prey, user) - if (pred == user) - message_admins("[key_name(pred)] ate [key_name(prey)].") - pred.log_message("[key_name(pred)] ate [key_name(prey)].", LOG_ATTACK) - prey.log_message("[key_name(prey)] was eaten by [key_name(pred)].", LOG_ATTACK) - return TRUE - // // Master vore proc that actually does vore procedures // @@ -391,7 +345,6 @@ P.digestable = src.digestable P.devourable = src.devourable P.feeding = src.feeding - P.noisy = src.noisy P.vore_taste = src.vore_taste var/list/serialized = list() @@ -417,7 +370,6 @@ digestable = P.digestable devourable = P.devourable feeding = P.feeding - noisy = P.noisy vore_taste = P.vore_taste release_vore_contents(silent = TRUE) diff --git a/modular_citadel/code/modules/vore/eating/simple_animal_vr.dm b/modular_citadel/code/modules/vore/eating/simple_animal_vr.dm deleted file mode 100644 index a93eb2fcf4..0000000000 --- a/modular_citadel/code/modules/vore/eating/simple_animal_vr.dm +++ /dev/null @@ -1,44 +0,0 @@ -///////////////////// Simple Animal ///////////////////// -/mob/living/simple_animal - var/isPredator = FALSE //Are they capable of performing and pre-defined vore actions for their species? - var/swallowTime = 5 SECONDS //How long it takes to eat its prey in 1/10 of a second. The default is 5 seconds. - var/list/prey_excludes = list() //For excluding people from being eaten. - -// -// Simple proc for animals to have their digestion toggled on/off externally -// -/mob/living/simple_animal/verb/toggle_digestion() - set name = "Toggle Animal's Digestion" - set desc = "Enables digestion on this mob for 20 minutes." - set category = "Object" - set src in oview(1) - - var/datum/belly/B = vore_organs[vore_selected] - if(faction != usr.faction) - to_chat(usr,"This predator isn't friendly, and doesn't give a shit about your opinions of it digesting you.") - return - if(B.digest_mode == "Hold") - var/confirm = alert(usr, "Enabling digestion on [name] will cause it to digest all stomach contents. Using this to break OOC prefs is against the rules. Digestion will disable itself after 20 minutes.", "Enabling [name]'s Digestion", "Enable", "Cancel") - if(confirm == "Enable") - B.digest_mode = "Digest" - sleep(20 MINUTES) //12000=20 minutes - B.digest_mode = "Hold" - else - var/confirm = alert(usr, "This mob is currently set to digest all stomach contents. Do you want to disable this?", "Disabling [name]'s Digestion", "Disable", "Cancel") - if(confirm == "Disable") - B.digest_mode = "Hold" - -// -// Simple nom proc for if you get ckey'd into a simple_animal mob! Avoids grabs. -// -/mob/living/simple_animal/proc/animal_nom(var/mob/living/T in oview(1)) - set name = "Animal Nom" - set category = "Vore" - set desc = "Since you can't grab, you get a verb!" - - if (stat != CONSCIOUS) - return - if (T.devourable == FALSE) - to_chat(usr, "You can't eat this!") - return - return feed_grabbed_to_self(src,T) \ No newline at end of file diff --git a/modular_citadel/code/modules/vore/eating/vore_vr.dm b/modular_citadel/code/modules/vore/eating/vore_vr.dm index 64435619ae..dc813d70aa 100644 --- a/modular_citadel/code/modules/vore/eating/vore_vr.dm +++ b/modular_citadel/code/modules/vore/eating/vore_vr.dm @@ -28,7 +28,7 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE // The datum type bolted onto normal preferences datums for storing Vore stuff // -#define VORE_VERSION 3 +#define VORE_VERSION 4 GLOBAL_LIST_EMPTY(vore_preferences_datums) @@ -41,7 +41,6 @@ GLOBAL_LIST_EMPTY(vore_preferences_datums) var/devourable = FALSE var/feeding = FALSE // var/allowmobvore = TRUE - var/noisy = FALSE var/list/belly_prefs = list() var/vore_taste = "nothing in particular" // var/can_be_drop_prey = FALSE @@ -108,7 +107,6 @@ GLOBAL_LIST_EMPTY(vore_preferences_datums) digestable = json_from_file["digestable"] devourable = json_from_file["devourable"] feeding = json_from_file["feeding"] - noisy = json_from_file["noisy"] vore_taste = json_from_file["vore_taste"] belly_prefs = json_from_file["belly_prefs"] @@ -119,8 +117,6 @@ GLOBAL_LIST_EMPTY(vore_preferences_datums) devourable = FALSE if(isnull(feeding)) feeding = FALSE - if(isnull(noisy)) - noisy = FALSE if(isnull(belly_prefs)) belly_prefs = list() @@ -136,7 +132,6 @@ GLOBAL_LIST_EMPTY(vore_preferences_datums) "digestable" = digestable, "devourable" = devourable, "feeding" = feeding, - "noisy" = noisy, "vore_taste" = vore_taste, "belly_prefs" = belly_prefs, ) diff --git a/modular_citadel/code/modules/vore/eating/vorepanel_vr.dm b/modular_citadel/code/modules/vore/eating/vorepanel_vr.dm index 4238ae4a7b..2ac2628d1f 100644 --- a/modular_citadel/code/modules/vore/eating/vorepanel_vr.dm +++ b/modular_citadel/code/modules/vore/eating/vorepanel_vr.dm @@ -229,7 +229,6 @@ dat += "
Delete Belly" dat += "Set Flavor" - dat += "Toggle Hunger Noises" dat += "
" @@ -730,15 +729,5 @@ if(user.client.prefs_vr) user.client.prefs_vr.feeding = user.feeding - if(href_list["togglenoisy"]) - var/choice = alert(user, "Toggle audible hunger noises. Currently: [user.noisy ? "Enabled" : "Disabled"]", "", "Enable audible hunger", "Cancel", "Disable audible hunger") - switch(choice) - if("Cancel") - return 0 - if("Enable audible hunger") - user.noisy = TRUE - if("Disable audible hunger") - user.noisy = FALSE - //Refresh when interacted with, returning 1 makes vore_look.Topic update return 1 \ No newline at end of file diff --git a/modular_citadel/icons/ui/backgrounds.dmi b/modular_citadel/icons/ui/backgrounds.dmi new file mode 100644 index 0000000000..7e061d6ba0 Binary files /dev/null and b/modular_citadel/icons/ui/backgrounds.dmi differ diff --git a/modular_citadel/interface/skin.dmf b/modular_citadel/interface/skin.dmf index 39626ef912..e4531a24ea 100644 --- a/modular_citadel/interface/skin.dmf +++ b/modular_citadel/interface/skin.dmf @@ -291,7 +291,7 @@ window "preferences_window" elem "preferences_window" type = MAIN pos = 372,0 - size = 1120x1000 + size = 1280x1000 anchor1 = none anchor2 = none background-color = none @@ -300,17 +300,18 @@ window "preferences_window" statusbar = false elem "preferences_browser" type = BROWSER - pos = -8,-8 - size = 896x1008 + pos = 0,0 + size = 960x1000 anchor1 = 0,0 - anchor2 = 90,100 + anchor2 = 75,100 background-color = none saved-params = "" elem "character_preview_map" type = MAP - pos = 887,0 - size = 313x1000 - anchor1 = 90,0 + pos = 960,0 + size = 320x1000 + anchor1 = 75,0 anchor2 = 100,100 right-click = true - saved-params = "zoom;letterbox;zoom-mode" \ No newline at end of file + saved-params = "zoom;letterbox;zoom-mode" + diff --git a/tgstation.dme b/tgstation.dme index 1cdc8cb21a..5b4c4eabe5 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -2986,7 +2986,6 @@ #include "modular_citadel\code\modules\vore\eating\bellymodes_vr.dm" #include "modular_citadel\code\modules\vore\eating\digest_act_vr.dm" #include "modular_citadel\code\modules\vore\eating\living_vr.dm" -#include "modular_citadel\code\modules\vore\eating\simple_animal_vr.dm" #include "modular_citadel\code\modules\vore\eating\vore_vr.dm" #include "modular_citadel\code\modules\vore\eating\voreitems.dm" #include "modular_citadel\code\modules\vore\eating\vorepanel_vr.dm"