diff --git a/code/__defines/species_languages.dm b/code/__defines/species_languages.dm index 3239e8fa1a..bdfbebb1bc 100644 --- a/code/__defines/species_languages.dm +++ b/code/__defines/species_languages.dm @@ -49,11 +49,13 @@ #define AG_SLEEPY 0x40 // fatigue/exhaustion // Species spawn flags -#define SPECIES_IS_WHITELISTED 0x1 // Must be whitelisted to play. -#define SPECIES_IS_RESTRICTED 0x2 // Is not a core/normally playable species. (castes, mutantraces) -#define SPECIES_CAN_JOIN 0x4 // Species is selectable in chargen. -#define SPECIES_NO_FBP_CONSTRUCTION 0x8 // FBP of this species can't be made in-game. -#define SPECIES_NO_FBP_CHARGEN 0x10 // FBP of this species can't be selected at chargen. +#define SPECIES_IS_WHITELISTED 0x1 // Must be whitelisted to play. +#define SPECIES_IS_RESTRICTED 0x2 // Is not a core/normally playable species. (castes, mutantraces) +#define SPECIES_CAN_JOIN 0x4 // Species is selectable in chargen. +#define SPECIES_NO_FBP_CONSTRUCTION 0x8 // FBP of this species can't be made in-game. +#define SPECIES_NO_FBP_CHARGEN 0x10 // FBP of this species can't be selected at chargen. +#define SPECIES_NO_POSIBRAIN 0x20 // FBP of this species cannot have a positronic brain. +#define SPECIES_NO_DRONEBRAIN 0x40 // FBP of this species cannot have a drone intelligence. // Species appearance flags #define HAS_SKIN_TONE 0x1 // Skin tone selectable in chargen. (0-255) diff --git a/code/game/machinery/portable_turret.dm b/code/game/machinery/portable_turret.dm index 01a890bd79..84dcf0c7c5 100644 --- a/code/game/machinery/portable_turret.dm +++ b/code/game/machinery/portable_turret.dm @@ -172,7 +172,7 @@ desc = "This variant appears to be much more rugged." req_one_access = list(access_heads) icon_state = "turret_cover_industrial" - installation = /obj/item/weapon/gun/energy/phasegun + installation = /obj/item/weapon/gun/energy/locked/phasegun/unlocked health = 200 maxhealth = 200 turret_type = "industrial" @@ -354,7 +354,7 @@ lethal_shot_sound = 'sound/weapons/Laser.ogg' shot_delay = 1 SECOND - if(/obj/item/weapon/gun/energy/phasegun) + if(/obj/item/weapon/gun/energy/locked/phasegun/unlocked) icon_color = "orange" lethal_icon_color = "orange" lethal_projectile = /obj/item/projectile/energy/phase/heavy diff --git a/code/game/machinery/washing_machine.dm b/code/game/machinery/washing_machine.dm index c48f98fc33..eff908c898 100644 --- a/code/game/machinery/washing_machine.dm +++ b/code/game/machinery/washing_machine.dm @@ -67,9 +67,8 @@ //Tanning! for(var/obj/item/stack/hairlesshide/HH in washing) - var/obj/item/stack/WL = new HH.wet_type(src) - if(istype(WL)) - WL.amount = HH.amount + var/obj/item/stack/wetleather/WL = new(src) + WL.amount = HH.amount washing -= HH HH.forceMove(get_turf(src)) HH.use(HH.amount) diff --git a/code/game/objects/items/stacks/sheets/leather.dm b/code/game/objects/items/stacks/sheets/leather.dm index 3076d2dfb8..c48f57e693 100644 --- a/code/game/objects/items/stacks/sheets/leather.dm +++ b/code/game/objects/items/stacks/sheets/leather.dm @@ -1,14 +1,18 @@ /obj/item/stack/animalhide name = "hide" desc = "The hide of some creature." + description_info = "Use something sharp, like a knife, to scrape the hairs/feathers/etc off this hide to prepare it for tanning." icon_state = "sheet-hide" drop_sound = 'sound/items/drop/cloth.ogg' pickup_sound = 'sound/items/pickup/cloth.ogg' amount = 1 + max_amount = 20 stacktype = "hide" no_variants = TRUE - - var/process_type = /obj/item/stack/hairlesshide +// This needs to be very clearly documented for players. Whether it should stay in the main description is up for debate. +/obj/item/stack/animalhide/examine(var/mob/user) + . = ..() + . += description_info /obj/item/stack/animalhide/human name = "skin" @@ -18,7 +22,6 @@ no_variants = FALSE drop_sound = 'sound/items/drop/leather.ogg' pickup_sound = 'sound/items/pickup/leather.ogg' - amount = 1 stacktype = "hide-human" /obj/item/stack/animalhide/corgi @@ -26,7 +29,6 @@ desc = "The by-product of corgi farming." singular_name = "corgi hide piece" icon_state = "sheet-corgi" - amount = 1 stacktype = "hide-corgi" /obj/item/stack/animalhide/cat @@ -34,7 +36,6 @@ desc = "The by-product of cat farming." singular_name = "cat hide piece" icon_state = "sheet-cat" - amount = 1 stacktype = "hide-cat" /obj/item/stack/animalhide/monkey @@ -42,7 +43,6 @@ desc = "The by-product of monkey farming." singular_name = "monkey hide piece" icon_state = "sheet-monkey" - amount = 1 stacktype = "hide-monkey" /obj/item/stack/animalhide/lizard @@ -50,7 +50,6 @@ desc = "Sssssss..." singular_name = "lizard skin piece" icon_state = "sheet-lizard" - amount = 1 stacktype = "hide-lizard" /obj/item/stack/animalhide/xeno @@ -58,7 +57,6 @@ desc = "The skin of a terrible creature." singular_name = "alien hide piece" icon_state = "sheet-xeno" - amount = 1 stacktype = "hide-xeno" //don't see anywhere else to put these, maybe together they could be used to make the xenos suit? @@ -68,7 +66,6 @@ singular_name = "alien chitin piece" icon = 'icons/mob/alien.dmi' icon_state = "chitin" - amount = 1 stacktype = "hide-chitin" /obj/item/xenos_claw @@ -88,19 +85,28 @@ if(has_edge(W) || is_sharp(W)) //visible message on mobs is defined as visible_message(var/message, var/self_message, var/blind_message) user.visible_message("\The [user] starts cutting hair off \the [src]", "You start cutting the hair off \the [src]", "You hear the sound of a knife rubbing against flesh") - if(do_after(user,50)) - to_chat(user, "You cut the hair from this [src.singular_name]") + var/scraped = 0 + while(amount > 0 && do_after(user, 2.5 SECONDS)) // 2.5s per hide //Try locating an exisitng stack on the tile and add to there if possible - for(var/obj/item/stack/hairlesshide/HS in user.loc) - if(HS.amount < 50 && istype(HS, process_type)) - HS.amount++ - src.use(1) - return - //If it gets to here it means it did not find a suitable stack on the tile. - var/obj/item/stack/HS = new process_type(usr.loc) - if(istype(HS)) - HS.amount = 1 + var/obj/item/stack/hairlesshide/H = null + for(var/obj/item/stack/hairlesshide/HS in user.loc) // Could be scraping something inside a locker, hence the .loc, not get_turf + if(HS.amount < HS.max_amount) + H = HS + break + + // Either we found a valid stack, in which case increment amount, + // Or we need to make a new stack + if(istype(H)) + H.amount++ + else + H = new /obj/item/stack/hairlesshide(user.loc) + + // Increment the amount src.use(1) + scraped++ + + if(scraped) + to_chat(user, SPAN_NOTICE("You scrape the hair off [scraped] hide\s.")) else ..() @@ -110,31 +116,43 @@ /obj/item/stack/hairlesshide name = "hairless hide" desc = "This hide was stripped of it's hair, but still needs tanning." + description_info = "Get it wet to continue tanning this into leather.
\ + You could set it in a river, wash it with a sink, or just splash water on it with a bucket." singular_name = "hairless hide piece" icon_state = "sheet-hairlesshide" no_variants = FALSE - amount = 1 + max_amount = 20 stacktype = "hairlesshide" - var/cleaning = FALSE // Can we be water_acted, or are we busy? To prevent accidental hide duplication and the collapse of causality. - var/wet_type = /obj/item/stack/wetleather +/obj/item/stack/hairlesshide/examine(var/mob/user) + . = ..() + . += description_info /obj/item/stack/hairlesshide/water_act(var/wateramount) - ..() - cleaning = TRUE - while(amount > 0 && wateramount > 0) - use(1) - wateramount-- - new wet_type(get_turf(src)) - cleaning = FALSE + . = ..() + wateramount = min(amount, round(wateramount)) + for(var/i in 1 to wateramount) + var/obj/item/stack/wetleather/H = null + for(var/obj/item/stack/wetleather/HS in get_turf(src)) // Doesn't have a user, can't just use their loc + if(HS.amount < HS.max_amount) + H = HS + break + + // Either we found a valid stack, in which case increment amount, + // Or we need to make a new stack + if(istype(H)) + H.amount++ + else + H = new /obj/item/stack/wetleather(get_turf(src)) - return + // Increment the amount + src.use(1) /obj/item/stack/hairlesshide/proc/rapidcure(var/stacknum = 1) stacknum = min(stacknum, amount) while(stacknum) - var/obj/item/stack/wetleather/I = new wet_type(get_turf(src)) + var/obj/item/stack/wetleather/I = new /obj/item/stack/wetleather(get_turf(src)) if(istype(I)) I.dry() @@ -146,16 +164,34 @@ /obj/item/stack/wetleather name = "wet leather" desc = "This leather has been cleaned but still needs to be dried." + description_info = "To finish tanning the leather, you need to dry it. \ + You could place it under a fire, \ + put it in a drying rack, \ + or build a tanning rack from steel or wooden boards." singular_name = "wet leather piece" icon_state = "sheet-wetleather" var/wetness = 30 //Reduced when exposed to high temperautres var/drying_threshold_temperature = 500 //Kelvin to start drying no_variants = FALSE - amount = 1 + max_amount = 20 stacktype = "wetleather" var/dry_type = /obj/item/stack/material/leather +/obj/item/stack/wetleather/examine(var/mob/user) + . = ..() + . += description_info + . += "\The [src] is [get_dryness_text()]." + +/obj/item/stack/wetleather/proc/get_dryness_text() + if(wetness > 20) + return "wet" + if(wetness > 10) + return "damp" + if(wetness) + return "almost dry" + return "dry" + /obj/item/stack/wetleather/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) ..() if(exposed_temperature >= drying_threshold_temperature) @@ -164,17 +200,87 @@ dry() /obj/item/stack/wetleather/proc/dry() - //Try locating an exisitng stack on the tile and add to there if possible - for(var/obj/item/stack/material/leather/HS in src.loc) - if(HS.amount < 50) - HS.amount++ - wetness = initial(wetness) - src.use(1) - return - //If it gets to here it means it did not find a suitable stack on the tile. - var/obj/item/stack/HS = new dry_type(src.loc) + var/obj/item/stack/material/leather/L = new(src.loc) + L.amount = amount + use(amount) + return L - if(istype(HS)) - HS.amount = 1 - wetness = initial(wetness) - src.use(1) +/obj/item/stack/wetleather/transfer_to(obj/item/stack/S, var/tamount=null, var/type_verified) + . = ..() + if(.) // If it transfers any, do a weighted average of the wetness + var/obj/item/stack/wetleather/W = S + var/oldamt = W.amount - . + W.wetness = round(((oldamt * W.wetness) + (. * wetness)) / W.amount) + + + +/obj/structure/tanning_rack + name = "tanning rack" + desc = "A rack used to stretch leather out and hold it taut during the tanning process." + icon = 'icons/obj/kitchen.dmi' + icon_state = "spike" + + var/obj/item/stack/wetleather/drying = null + +/obj/structure/tanning_rack/Initialize() + . = ..() + START_PROCESSING(SSobj, src) // SSObj fires ~every 2s , starting from wetness 30 takes ~1m + +/obj/structure/tanning_rack/Destroy() + STOP_PROCESSING(SSobj, src) + return ..() + +/obj/structure/tanning_rack/process() + if(drying && drying.wetness) + drying.wetness = max(drying.wetness - 1, 0) + if(!drying.wetness) + visible_message("The [drying] is dry!") + update_icon() + +/obj/structure/tanning_rack/examine(var/mob/user) + . = ..() + if(drying) + . += "\The [drying] is [drying.get_dryness_text()]." + +/obj/structure/tanning_rack/update_icon() + overlays.Cut() + if(drying) + var/image/I + if(drying.wetness) + I = image(icon, "leather_wet") + else + I = image(icon, "leather_dry") + add_overlay(I) + +/obj/structure/tanning_rack/attackby(var/atom/A, var/mob/user) + if(istype(A, /obj/item/stack/wetleather)) + if(!drying) // If not drying anything, start drying the thing + if(user.unEquip(A, target = src)) + drying = A + else // Drying something, add if possible + var/obj/item/stack/wetleather/W = A + W.transfer_to(drying, W.amount, TRUE) + update_icon() + return TRUE + return ..() + +/obj/structure/tanning_rack/attack_hand(var/mob/user) + if(drying) + var/obj/item/stack/S = drying + if(!drying.wetness) // If it's dry, make a stack of dry leather and prepare to put that in their hands + var/obj/item/stack/material/leather/L = new(src) + L.amount = drying.amount + drying.use(drying.amount) + S = L + + if(ishuman(user)) + var/mob/living/carbon/human/H = user + if(!H.put_in_any_hand_if_possible(S)) + S.forceMove(get_turf(src)) + else + S.forceMove(get_turf(src)) + drying = null + update_icon() + +/obj/structure/tanning_rack/attack_robot(var/mob/user) + attack_hand(user) // That has checks to \ No newline at end of file diff --git a/code/game/objects/structures/crates_lockers/closets/misc_vr.dm b/code/game/objects/structures/crates_lockers/closets/misc_vr.dm index 73f69ba4a5..2111bd6667 100644 --- a/code/game/objects/structures/crates_lockers/closets/misc_vr.dm +++ b/code/game/objects/structures/crates_lockers/closets/misc_vr.dm @@ -28,8 +28,8 @@ req_one_access = list(access_explorer,access_brig) starts_with = list( - /obj/item/weapon/gun/energy/phasegun = 2, - /obj/item/weapon/gun/energy/phasegun/pistol, + /obj/item/weapon/gun/energy/locked/phasegun = 2, + /obj/item/weapon/gun/energy/locked/phasegun/pistol, /obj/item/weapon/cell/device/weapon = 2, /obj/item/clothing/accessory/permit/gun/planetside) diff --git a/code/modules/ai/interfaces.dm b/code/modules/ai/interfaces.dm index 74ad2eb1a4..9fb58dbb88 100644 --- a/code/modules/ai/interfaces.dm +++ b/code/modules/ai/interfaces.dm @@ -52,7 +52,7 @@ return say(message) /mob/living/proc/IIsAlly(mob/living/L) - return src.faction == L.faction + return istype(L) && src.faction == L.faction /mob/living/simple_mob/IIsAlly(mob/living/L) . = ..() diff --git a/code/modules/client/preference_setup/general/03_body.dm b/code/modules/client/preference_setup/general/03_body.dm index 30df7ec640..2ebdb98719 100644 --- a/code/modules/client/preference_setup/general/03_body.dm +++ b/code/modules/client/preference_setup/general/03_body.dm @@ -1073,13 +1073,16 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O return organ = "brain" + var/datum/species/current_species = GLOB.all_species[pref.species] var/list/organ_choices = list("Normal") if(pref.organ_data[BP_TORSO] == "cyborg") organ_choices -= "Normal" if(organ_name == "Brain") organ_choices += "Cybernetic" - organ_choices += "Positronic" - organ_choices += "Drone" + if(!(current_species.spawn_flags & SPECIES_NO_POSIBRAIN)) + organ_choices += "Positronic" + if(!(current_species.spawn_flags & SPECIES_NO_DRONEBRAIN)) + organ_choices += "Drone" else organ_choices += "Assisted" organ_choices += "Mechanical" @@ -1097,7 +1100,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O pref.organ_data[organ] = "assisted" if("Cybernetic") pref.organ_data[organ] = "assisted" - if ("Mechanical") + if("Mechanical") pref.organ_data[organ] = "mechanical" if("Drone") pref.organ_data[organ] = "digital" diff --git a/code/modules/food/kitchen/smartfridge.dm b/code/modules/food/kitchen/smartfridge.dm index d776e45296..a6def6bd2b 100644 --- a/code/modules/food/kitchen/smartfridge.dm +++ b/code/modules/food/kitchen/smartfridge.dm @@ -187,10 +187,10 @@ for(var/obj/item/stack/wetleather/WL in I.instances) if(!WL.wetness) - if(WL.amount == 1) + if(WL.amount) WL.forceMove(get_turf(src)) + WL.dry() I.instances -= WL - WL.dry() break WL.wetness = max(0, WL.wetness - rand(1, 3)) diff --git a/code/modules/gamemaster/event2/events/security/prison_break.dm b/code/modules/gamemaster/event2/events/security/prison_break.dm index 52f7e6d242..e7daadb9f0 100644 --- a/code/modules/gamemaster/event2/events/security/prison_break.dm +++ b/code/modules/gamemaster/event2/events/security/prison_break.dm @@ -211,7 +211,7 @@ /datum/event2/event/prison_break/proc/flicker_area() for(var/area/A in areas_to_break) var/obj/machinery/power/apc/apc = A.get_apc() - if(apc.operating) //If the apc's off, it's a little hard to overload the lights. + if(istype(apc) && apc.operating) //If the apc's off, it's a little hard to overload the lights. for(var/obj/machinery/light/L in A) L.flicker(10) diff --git a/code/modules/materials/material_recipes.dm b/code/modules/materials/material_recipes.dm index bc6b382ae2..8b71551656 100644 --- a/code/modules/materials/material_recipes.dm +++ b/code/modules/materials/material_recipes.dm @@ -106,6 +106,7 @@ new/datum/stack_recipe("chest drawer", /obj/structure/filingcabinet/chestdrawer, 4, time = 20, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \ )) recipes += new/datum/stack_recipe("desk bell", /obj/item/weapon/deskbell, 1, on_floor = 1, supplied_material = "[name]") + recipes += new/datum/stack_recipe("tanning rack", /obj/structure/tanning_rack, 3, one_per_turf = TRUE, time = 20, on_floor = TRUE, supplied_material = "[name]") /datum/material/plasteel/generate_recipes() ..() @@ -144,7 +145,6 @@ recipes += new/datum/stack_recipe("reagent tubing", /obj/item/stack/hose, 1, 4, 20, pass_stack_color = TRUE, recycle_material = "[name]") recipes += new/datum/stack_recipe("Feeder", /obj/machinery/feeder, 4, time = 20, one_per_turf = 1, on_floor = 1, recycle_material = "[name]") //CHOMP Addition - /datum/material/wood/generate_recipes() ..() recipes += new/datum/stack_recipe("oar", /obj/item/weapon/oar, 2, time = 30, supplied_material = "[name]", pass_stack_color = TRUE) @@ -166,6 +166,7 @@ recipes += new/datum/stack_recipe("crude fishing rod", /obj/item/weapon/material/fishing_rod/built, 8, time = 10 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]") recipes += new/datum/stack_recipe("wooden standup figure", /obj/structure/barricade/cutout, 5, time = 10 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]") //VOREStation Add recipes += new/datum/stack_recipe("noticeboard", /obj/structure/noticeboard, 1, recycle_material = "[name]") + recipes += new/datum/stack_recipe("tanning rack", /obj/structure/tanning_rack, 3, one_per_turf = TRUE, time = 20, on_floor = TRUE, supplied_material = "[name]") /datum/material/wood/log/generate_recipes() recipes = list() diff --git a/code/modules/mining/shelter_atoms_vr.dm b/code/modules/mining/shelter_atoms_vr.dm index 119c6509ac..9b15b95733 100644 --- a/code/modules/mining/shelter_atoms_vr.dm +++ b/code/modules/mining/shelter_atoms_vr.dm @@ -294,6 +294,7 @@ GLOBAL_LIST_EMPTY(unique_deployable) var/buildstacktype = /obj/item/stack/material/steel var/buildstackamount = 5 +/* /obj/structure/fans/proc/deconstruct() new buildstacktype(loc,buildstackamount) qdel(src) @@ -307,7 +308,7 @@ GLOBAL_LIST_EMPTY(unique_deployable) return TRUE return TRUE - +*/ /obj/structure/fans/tiny name = "tiny fan" desc = "A tiny fan, releasing a thin gust of air." diff --git a/code/modules/mob/freelook/chunk.dm b/code/modules/mob/freelook/chunk.dm index 5f59d2e737..da2d84701c 100644 --- a/code/modules/mob/freelook/chunk.dm +++ b/code/modules/mob/freelook/chunk.dm @@ -88,7 +88,7 @@ for(var/turf in visAdded) var/turf/t = turf - if(t.obfuscations[obfuscation.type]) + if(LAZYLEN(t.obfuscations) && t.obfuscations[obfuscation.type]) obscured -= t.obfuscations[obfuscation.type] for(var/eye in seenby) var/mob/observer/eye/m = eye diff --git a/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_blob.dm b/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_blob.dm index c15b14686b..07d6d070f4 100644 --- a/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_blob.dm +++ b/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_blob.dm @@ -301,7 +301,7 @@ if(refactory && istype(O,/obj/item/stack/material)) var/obj/item/stack/material/S = O var/substance = S.material.name - var/list/edible_materials = list("steel", "plasteel", "diamond", "mhydrogen") //Can't eat all materials, just useful ones. + var/list/edible_materials = list("steel") //Can't eat all materials, just useful ones. CHOMP EDIT: Only steel var/allowed = FALSE //CHOMP Edit for(var/material in edible_materials) if(material == substance) allowed = TRUE diff --git a/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_powers.dm b/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_powers.dm index 0580096bc7..4efff07b39 100644 --- a/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_powers.dm +++ b/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_powers.dm @@ -296,7 +296,7 @@ var/obj/item/stack/material/matstack = held var/substance = matstack.material.name - var/list/edible_materials = list(MAT_STEEL, MAT_SILVER, MAT_GOLD, MAT_URANIUM, MAT_METALHYDROGEN) //Can't eat all materials, just useful ones. + var/list/edible_materials = list(MAT_STEEL) //Can't eat all materials, just useful ones. CHOMP EDIT: Only steel var allowed = FALSE for(var/material in edible_materials) if(material == substance) allowed = TRUE @@ -492,4 +492,4 @@ CHOMP removal end*/ icon_state = "metal" to_call = /mob/living/carbon/human/proc/nano_metalnom -#undef PER_LIMB_STEEL_COST \ No newline at end of file +#undef PER_LIMB_STEEL_COST diff --git a/code/modules/mob/living/carbon/human/species/station/teshari.dm b/code/modules/mob/living/carbon/human/species/station/teshari.dm index 878eabd798..856030cd39 100644 --- a/code/modules/mob/living/carbon/human/species/station/teshari.dm +++ b/code/modules/mob/living/carbon/human/species/station/teshari.dm @@ -1,7 +1,3 @@ -//CHOMPStation Removal Start - TFF 24/12/19 - Bruh. This ain't a fun thing. -///mob/living/carbon/var/loneliness_stage = 0 -///mob/living/carbon/var/next_loneliness_time = 0 -//CHOMPStation Removal End /datum/species/teshari name = SPECIES_TESHARI name_plural = "Tesharii" @@ -27,6 +23,7 @@ female_cough_sounds = list('sound/effects/mob_effects/tesharicougha.ogg','sound/effects/mob_effects/tesharicoughb.ogg') male_sneeze_sound = 'sound/effects/mob_effects/tesharisneeze.ogg' female_sneeze_sound = 'sound/effects/mob_effects/tesharisneeze.ogg' + //CHOMPStation Add. Y'know I should probably just put this upstream. male_scream_sound = 'sound/effects/mob_effects/teshariscream.ogg' female_scream_sound = 'sound/effects/mob_effects/teshariscream.ogg' @@ -66,7 +63,7 @@ ambiguous_genders = TRUE - spawn_flags = SPECIES_CAN_JOIN + spawn_flags = SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED | SPECIES_NO_POSIBRAIN //CHOMPedit: This is overriden by teshari_vr.dm. Noting here for future reference. appearance_flags = HAS_HAIR_COLOR | HAS_SKIN_COLOR | HAS_EYE_COLOR bump_flag = MONKEY swap_flags = MONKEY|SLIME|SIMPLE_ANIMAL @@ -201,4 +198,4 @@ landing.visible_message(SPAN_NOTICE("\The [H] glides down from above, landing safely.")) H.Stun(1) playsound(H, "rustle", 25, 1) - return TRUE + return TRUE \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index 66ebedbb2c..057d17f7dd 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -114,24 +114,15 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() //Do any species specific layering updates, such as when hiding. update_icon_special() -/mob/living/carbon/human/update_icons_layers() - crash_with("CANARY: Old human update_icons_layers was called.") - -/mob/living/carbon/human/update_icons_all() - crash_with("CANARY: Old human update_icons_all was called.") - -/mob/living/carbon/human/update_icons_huds() - crash_with("CANARY: Old human update_icons_huds was called.") - /mob/living/carbon/human/update_transform() /* VOREStation Edit START // First, get the correct size. var/desired_scale_x = icon_scale_x var/desired_scale_y = icon_scale_y - + desired_scale_x *= species.icon_scale_x desired_scale_y *= species.icon_scale_y - + for(var/datum/modifier/M in modifiers) if(!isnull(M.icon_scale_x_percent)) desired_scale_x *= M.icon_scale_x_percent diff --git a/code/modules/mob/living/silicon/robot/subtypes/thinktank/thinktank_module.dm b/code/modules/mob/living/silicon/robot/subtypes/thinktank/thinktank_module.dm index 2a8ffcb3e1..fb4cee24c2 100644 --- a/code/modules/mob/living/silicon/robot/subtypes/thinktank/thinktank_module.dm +++ b/code/modules/mob/living/silicon/robot/subtypes/thinktank/thinktank_module.dm @@ -64,7 +64,7 @@ modules += bandaid synths += medicine - var/obj/item/weapon/gun/energy/phasegun/mounted/cyborg/phasegun = new(src) + var/obj/item/weapon/gun/energy/locked/phasegun/unlocked/mounted/cyborg/phasegun = new(src) modules += phasegun emag = new /obj/item/weapon/chainsaw(src) diff --git a/code/modules/mob/update_icons.dm b/code/modules/mob/update_icons.dm index 7b9bb15baa..352221f66f 100644 --- a/code/modules/mob/update_icons.dm +++ b/code/modules/mob/update_icons.dm @@ -9,17 +9,8 @@ return // Obsolete -/mob/proc/update_icons_layers() - return - -/mob/proc/update_icons_huds() - return - /mob/proc/update_icons_body() return - -/mob/proc/update_icons_all() - return // End obsolete /mob/proc/update_hud() diff --git a/code/modules/projectiles/guns/energy/phase.dm b/code/modules/projectiles/guns/energy/phase.dm index 2498aba776..76ab1689fb 100644 --- a/code/modules/projectiles/guns/energy/phase.dm +++ b/code/modules/projectiles/guns/energy/phase.dm @@ -1,8 +1,9 @@ // Phase weapons go here +//CHOMP Edit: Each phase gun now has the same safety lock as frontier phasers. Every pathname now has "locked" and "unlocked", basically. This code comes from /code/modules/projectiles/guns/energy/laser_vr.dm. -/obj/item/weapon/gun/energy/phasegun +/obj/item/weapon/gun/energy/locked/phasegun name = "phase carbine" - desc = "The RayZar EW26 Artemis is a downsized energy weapon, specifically designed for use against wildlife." + desc = "The RayZar EW26 Artemis is a downsized energy weapon, specifically designed for use against wildlife. This one has a safety interlock that prevents firing while in proximity to the facility." description_fluff = "RayZar is Ward-Takahashi’s main consumer weapons brand, known for producing and licensing a wide variety of specialist energy weapons of various types and quality primarily for the civilian market." icon_state = "phasecarbine" item_state = "phasecarbine" @@ -13,18 +14,24 @@ one_handed_penalty = 15 recoil_mode = 0 //CHOMP Addition: Removes recoil for micros. -/obj/item/weapon/gun/energy/phasegun/mounted +/obj/item/weapon/gun/energy/locked/phasegun/unlocked + desc = "The RayZar EW26 Artemis is a downsized energy weapon, specifically designed for use against wildlife." + req_access = newlist() //for toggling safety + locked = 0 + lockable = 0 + +/obj/item/weapon/gun/energy/locked/phasegun/unlocked/mounted self_recharge = 1 use_external_power = 1 one_handed_penalty = 0 -/obj/item/weapon/gun/energy/phasegun/mounted/cyborg +/obj/item/weapon/gun/energy/locked/phasegun/unlocked/mounted/cyborg charge_cost = 400 recharge_time = 7 -/obj/item/weapon/gun/energy/phasegun/pistol +/obj/item/weapon/gun/energy/locked/phasegun/pistol name = "phase pistol" - desc = "The RayZar EW15 Apollo is an energy handgun, specifically designed for self-defense against aggressive wildlife." + desc = "The RayZar EW15 Apollo is an energy handgun, specifically designed for self-defense against aggressive wildlife. This one has a safety interlock that prevents firing while in proximity to the facility." icon_state = "phase" item_state = "taser" //I don't have an in-hand sprite, taser will be fine w_class = ITEMSIZE_NORMAL @@ -33,18 +40,24 @@ projectile_type = /obj/item/projectile/energy/phase/light one_handed_penalty = 0 -/obj/item/weapon/gun/energy/phasegun/pistol/mounted +/obj/item/weapon/gun/energy/locked/phasegun/pistol/unlocked + desc = "The RayZar EW15 Apollo is an energy handgun, specifically designed for self-defense against aggressive wildlife." + req_access = newlist() //for toggling safety + locked = 0 + lockable = 0 + +/obj/item/weapon/gun/energy/locked/phasegun/pistol/unlocked/mounted name = "mounted phase pistol" self_recharge = 1 use_external_power = 1 -/obj/item/weapon/gun/energy/phasegun/pistol/mounted/cyborg +/obj/item/weapon/gun/energy/locked/phasegun/pistol/unlocked/mounted/cyborg charge_cost = 400 recharge_time = 7 -obj/item/weapon/gun/energy/phasegun/rifle +obj/item/weapon/gun/energy/locked/phasegun/rifle name = "phase rifle" - desc = "The RayZar EW31 Orion is a specialist energy weapon, intended for use against hostile wildlife." + desc = "The RayZar EW31 Orion is a specialist energy weapon, intended for use against hostile wildlife. This one has a safety interlock that prevents firing while in proximity to the facility." icon_state = "phaserifle" item_state = "phaserifle" wielded_item_state = "phaserifle-wielded" @@ -55,9 +68,15 @@ obj/item/weapon/gun/energy/phasegun/rifle accuracy = 15 one_handed_penalty = 30 -/obj/item/weapon/gun/energy/phasegun/cannon +obj/item/weapon/gun/energy/locked/phasegun/rifle/unlocked + desc = "The RayZar EW31 Orion is a specialist energy weapon, intended for use against hostile wildlife." + req_access = newlist() //for toggling safety + locked = 0 + lockable = 0 + +/obj/item/weapon/gun/energy/locked/phasegun/cannon name = "phase cannon" - desc = "The RayZar EW50 Gaia is a massive energy weapon, purpose-built for clearing land. You feel dirty just looking at it." + desc = "The RayZar EW50 Gaia is a massive energy weapon, purpose-built for clearing land. You feel dirty just looking at it. This one has a safety interlock that prevents firing while in proximity to the facility." icon_state = "phasecannon" item_state = "phasecannon" wielded_item_state = "phasecannon-wielded" //TODO: New Sprites @@ -67,3 +86,9 @@ obj/item/weapon/gun/energy/phasegun/rifle projectile_type = /obj/item/projectile/energy/phase/heavy/cannon accuracy = 15 one_handed_penalty = 65 + +/obj/item/weapon/gun/energy/locked/phasegun/cannon/unlocked + desc = "The RayZar EW50 Gaia is a massive energy weapon, purpose-built for clearing land. You feel dirty just looking at it." + req_access = newlist() //for toggling safety + locked = 0 + lockable = 0 diff --git a/code/modules/reagents/Chemistry-Holder.dm b/code/modules/reagents/Chemistry-Holder.dm index 797ffc4371..b987f608b5 100644 --- a/code/modules/reagents/Chemistry-Holder.dm +++ b/code/modules/reagents/Chemistry-Holder.dm @@ -314,7 +314,8 @@ if(spill) splash(target.loc, spill, multiplier, copy, min_spill, max_spill) - trans_to(target, amount, multiplier, copy) + if(!trans_to(target, amount, multiplier, copy)) + touch(target, amount) /datum/reagents/proc/trans_type_to(var/target, var/rtype, var/amount = 1) if (!target) diff --git a/code/modules/research/designs/weapons.dm b/code/modules/research/designs/weapons.dm index 117f5620b3..ed9cea0a1c 100644 --- a/code/modules/research/designs/weapons.dm +++ b/code/modules/research/designs/weapons.dm @@ -132,7 +132,7 @@ ..() name = "Phase weapon prototype ([item_name])" -/**/ //VOREStation Removal Start // Chomp Edit : uncomment those weapons +/* //VOREStation Removal Start // Chomp Edit : uncomment those weapons //CHOMP Edit: Comment again, move to weapons_ch because they have weapons locks now. /datum/design/item/weapon/phase/phase_pistol id = "phasepistol" req_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 2, TECH_POWER = 2) @@ -160,7 +160,7 @@ materials = list(DEFAULT_WALL_MATERIAL = 10000, "glass" = 2000, "silver" = 1000, "diamond" = 750) build_path = /obj/item/weapon/gun/energy/phasegun/cannon sort_string = "MACAD" -/**/ //VOREStation Removal End // Chomp Edit : uncomment those weapons +*/ //VOREStation Removal End // Chomp Edit : uncomment those weapons // Other weapons diff --git a/code/modules/research/designs/weapons_ch.dm b/code/modules/research/designs/weapons_ch.dm index 6461d319fb..d035cbadc5 100644 --- a/code/modules/research/designs/weapons_ch.dm +++ b/code/modules/research/designs/weapons_ch.dm @@ -5,4 +5,33 @@ req_tech = list(TECH_COMBAT = 2, TECH_MATERIAL = 2) materials = list(DEFAULT_WALL_MATERIAL = 3000, "glass" = 3000) build_path = /obj/item/weapon/gun/launcher/confetti_cannon - sort_string = "MAAVD" \ No newline at end of file + sort_string = "MAAVD" + +//Phase weapon with lock safeties. +/datum/design/item/weapon/phase/phase_pistol + id = "phasepistol" + req_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 2, TECH_POWER = 2) + materials = list(DEFAULT_WALL_MATERIAL = 4000, MAT_COPPER = 30) + build_path = /obj/item/weapon/gun/energy/locked/phasegun/pistol + sort_string = "MACAA" + +/datum/design/item/weapon/phase/phase_carbine + id = "phasecarbine" + req_tech = list(TECH_COMBAT = 4, TECH_MATERIAL = 2, TECH_POWER = 2) + materials = list(DEFAULT_WALL_MATERIAL = 6000, "glass" = 1500, MAT_COPPER = 40) + build_path = /obj/item/weapon/gun/energy/locked/phasegun + sort_string = "MACAB" + +/datum/design/item/weapon/phase/phase_rifle + id = "phaserifle" + req_tech = list(TECH_COMBAT = 4, TECH_MATERIAL = 3, TECH_POWER = 3) + materials = list(DEFAULT_WALL_MATERIAL = 7000, "glass" = 2000, "silver" = 500) + build_path = /obj/item/weapon/gun/energy/locked/phasegun/rifle + sort_string = "MACAC" + +/datum/design/item/weapon/phase/phase_cannon + id = "phasecannon" + req_tech = list(TECH_COMBAT = 4, TECH_MATERIAL = 4, TECH_POWER = 4) + materials = list(DEFAULT_WALL_MATERIAL = 10000, "glass" = 2000, "silver" = 1000, "diamond" = 750) + build_path = /obj/item/weapon/gun/energy/locked/phasegun/cannon + sort_string = "MACAD" \ No newline at end of file diff --git a/code/modules/vore/eating/living_vr.dm b/code/modules/vore/eating/living_vr.dm index 0429d5bb4a..719aba151d 100644 --- a/code/modules/vore/eating/living_vr.dm +++ b/code/modules/vore/eating/living_vr.dm @@ -42,6 +42,7 @@ M.verbs += /mob/living/proc/lick M.verbs += /mob/living/proc/smell M.verbs += /mob/living/proc/switch_scaling + M.verbs += /mob/living/proc/vorebelly_printout if(M.no_vore) //If the mob isn't supposed to have a stomach, let's not give it an insidepanel so it can make one for itself, or a stomach. return TRUE M.vorePanel = new(M) @@ -899,3 +900,35 @@ /obj/screen/fullscreen/belly icon = 'icons/mob/screen_full_vore.dmi' icon_state = "" + +/mob/living/proc/vorebelly_printout() //Spew the vorepanel belly messages into chat window for copypasting. + set name = "Print Vorebelly Settings" + set category = "Preferences" + set desc = "Print out your vorebelly messages into chat for copypasting." + + for(var/belly in vore_organs) + if(isbelly(belly)) + var/obj/belly/B = belly + to_chat(src, "Belly name: [B.name]") + to_chat(src, "Belly desc: [B.desc]") + to_chat(src, "Vore verb: [B.vore_verb]") + to_chat(src, "Struggle messages (outside):") + for(var/msg in B.struggle_messages_outside) + to_chat(src, "[msg]") + to_chat(src, "Struggle messages (inside):") + for(var/msg in B.struggle_messages_inside) + to_chat(src, "[msg]") + to_chat(src, "Digest messages (owner):") + for(var/msg in B.digest_messages_owner) + to_chat(src, "[msg]") + to_chat(src, "Digest messages (prey):") + for(var/msg in B.digest_messages_prey) + to_chat(src, "[msg]") + to_chat(src, "Examine messages:") + for(var/msg in B.examine_messages) + to_chat(src, "[msg]") + to_chat(src, "Emote lists:") + for(var/EL in B.emote_lists) + to_chat(src, "[EL]:") + for(var/msg in B.emote_lists[EL]) + to_chat(src, "[msg]") \ No newline at end of file diff --git a/html/changelog.html b/html/changelog.html index f5813382aa..7c616b54ba 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -40,6 +40,12 @@ -->
+

03 April 2021

+

Woodrat updated:

+ +

25 March 2021

Fenodyree updated: