From 8ea6618f5dc70f30e4379f76daddb3f5e45ef549 Mon Sep 17 00:00:00 2001 From: Fermi <> Date: Sun, 24 Nov 2019 03:01:59 +0000 Subject: [PATCH] Revert "ARGH" This reverts commit f0f52ce3f8855ffaa78bdd8a4761f63bbb653547. --- code/__DEFINES/inventory.dm | 6 +- code/controllers/subsystem/persistence.dm | 24 ------ code/controllers/subsystem/vote.dm | 10 +-- code/game/gamemodes/dynamic/dynamic.dm | 8 +- code/game/objects/items/storage/backpack.dm | 2 +- code/game/objects/items/weaponry.dm | 6 +- .../clock_structures/traps/brass_skewer.dm | 2 +- .../mining/equipment/regenerative_core.dm | 16 ---- .../carbon/human/species_types/bugmen.dm | 71 +++++++++++------- .../mob/living/simple_animal/bot/bot.dm | 5 +- .../mob/living/simple_animal/bot/honkbot.dm | 1 - .../icons/mob/mutant_bodyparts.dmi | Bin 7023 -> 6734 bytes 12 files changed, 60 insertions(+), 91 deletions(-) diff --git a/code/__DEFINES/inventory.dm b/code/__DEFINES/inventory.dm index f5ea8d835f..632e4adef9 100644 --- a/code/__DEFINES/inventory.dm +++ b/code/__DEFINES/inventory.dm @@ -4,9 +4,9 @@ #define WEIGHT_CLASS_TINY 1 //Usually items smaller then a human hand, ex: Playing Cards, Lighter, Scalpel, Coins/Money #define WEIGHT_CLASS_SMALL 2 //Pockets can hold small and tiny items, ex: Flashlight, Multitool, Grenades, GPS Device #define WEIGHT_CLASS_NORMAL 3 //Standard backpacks can carry tiny, small & normal items, ex: Fire extinguisher, Stunbaton, Gas Mask, Metal Sheets -#define WEIGHT_CLASS_BULKY 4 //Items that can be weilded or equipped but not stored in a normal bag, ex: Defibrillator, Backpack, Space Suits -#define WEIGHT_CLASS_HUGE 5 //Usually represents objects that require two hands to operate, ex: Shotgun, Two Handed Melee Weapons - Can not fit in Boh -#define WEIGHT_CLASS_GIGANTIC 6 //Essentially means it cannot be picked up or placed in an inventory, ex: Mech Parts, Safe - Can not fit in Boh +#define WEIGHT_CLASS_BULKY 4 //Items that can be weilded or equipped but not stored in an inventory, ex: Defibrillator, Backpack, Space Suits +#define WEIGHT_CLASS_HUGE 5 //Usually represents objects that require two hands to operate, ex: Shotgun, Two Handed Melee Weapons +#define WEIGHT_CLASS_GIGANTIC 6 //Essentially means it cannot be picked up or placed in an inventory, ex: Mech Parts, Safe //Inventory depth: limits how many nested storage items you can access directly. //1: stuff in mob, 2: stuff in backpack, 3: stuff in box in backpack, etc diff --git a/code/controllers/subsystem/persistence.dm b/code/controllers/subsystem/persistence.dm index c3db8552c6..1b7cade71f 100644 --- a/code/controllers/subsystem/persistence.dm +++ b/code/controllers/subsystem/persistence.dm @@ -12,7 +12,6 @@ SUBSYSTEM_DEF(persistence) var/list/obj/structure/chisel_message/chisel_messages = list() var/list/saved_messages = list() var/list/saved_modes = list(1,2,3) - var/list/saved_threat_levels = list(1,1,1) var/list/saved_maps var/list/saved_trophies = list() var/list/spawned_objects = list() @@ -28,7 +27,6 @@ SUBSYSTEM_DEF(persistence) LoadChiselMessages() LoadTrophies() LoadRecentModes() - LoadRecentThreats() LoadRecentMaps() LoadPhotoPersistence() if(CONFIG_GET(flag/use_antag_rep)) @@ -168,15 +166,6 @@ SUBSYSTEM_DEF(persistence) return saved_modes = json["data"] -/datum/controller/subsystem/persistence/proc/LoadRecentThreats() - var/json_file = file("data/RecentThreatLevels.json") - if(!fexists(json_file)) - return - var/list/json = json_decode(file2text(json_file)) - if(!json) - return - saved_threat_levels = json["data"] - /datum/controller/subsystem/persistence/proc/LoadRecentMaps() var/json_file = file("data/RecentMaps.json") if(!fexists(json_file)) @@ -227,7 +216,6 @@ SUBSYSTEM_DEF(persistence) CollectSecretSatchels() CollectTrophies() CollectRoundtype() - CollectThreatLevel() RecordMaps() SavePhotoPersistence() //THIS IS PERSISTENCE, NOT THE LOGGING PORTION. if(CONFIG_GET(flag/use_antag_rep)) @@ -384,18 +372,6 @@ SUBSYSTEM_DEF(persistence) fdel(json_file) WRITE_FILE(json_file, json_encode(file_data)) -/datum/controller/subsystem/persistence/proc/CollectThreatLevel() - if(istype(SSticker.mode, /datum/game_mode/dynamic)) - var/datum/game_mode/dynamic/mode = SSticker.mode - saved_threat_levels[3] = saved_threat_levels[2] - saved_threat_levels[2] = saved_threat_levels [1] - saved_threat_levels[1] = mode.threat_level - var/json_file = file("data/RecentThreatLevels.json") - var/list/file_data = list() - file_data["data"] = saved_threat_levels - fdel(json_file) - WRITE_FILE(json_file, json_encode(file_data)) - /datum/controller/subsystem/persistence/proc/RecordMaps() saved_maps = saved_maps?.len ? list("[SSmapping.config.map_name]") | saved_maps : list("[SSmapping.config.map_name]") var/json_file = file("data/RecentMaps.json") diff --git a/code/controllers/subsystem/vote.dm b/code/controllers/subsystem/vote.dm index dee10e4998..50be61f91d 100644 --- a/code/controllers/subsystem/vote.dm +++ b/code/controllers/subsystem/vote.dm @@ -153,10 +153,6 @@ SUBSYSTEM_DEF(vote) if(SSticker.current_state > GAME_STATE_PREGAME)//Don't change the mode if the round already started. return message_admins("A vote has tried to change the gamemode, but the game has already started. Aborting.") GLOB.master_mode = "dynamic" - if("extended" in choices) - if(. == "extended") - GLOB.dynamic_forced_extended = TRUE // we still do the rest of the stuff - choices[PEACE] += choices["extended"] var/mean = 0 var/voters = 0 for(var/client/c in GLOB.clients) @@ -257,11 +253,7 @@ SUBSYSTEM_DEF(vote) if("roundtype") //CIT CHANGE - adds the roundstart secret/extended vote choices.Add("secret", "extended") if("dynamic") - var/saved_threats = SSpersistence.saved_threat_levels - if((saved_threats[1]+saved_threats[2]+saved_threats[3])>150) - choices.Add("extended",PEACE,CHAOS) - else - choices.Add(PEACE,CHAOS) + choices.Add(PEACE,CHAOS) if("custom") question = stripped_input(usr,"What is the vote for?") if(!question) diff --git a/code/game/gamemodes/dynamic/dynamic.dm b/code/game/gamemodes/dynamic/dynamic.dm index 25edd0c68b..83a3debfdc 100644 --- a/code/game/gamemodes/dynamic/dynamic.dm +++ b/code/game/gamemodes/dynamic/dynamic.dm @@ -409,7 +409,7 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1) message_admins("Drafting players for forced ruleset [rule.name].") log_game("DYNAMIC: Drafting players for forced ruleset [rule.name].") rule.mode = src - rule.acceptable(roundstart_pop_ready, threat_level) // Assigns some vars in the modes, running it here for consistency + rule.acceptable(GLOB.player_list.len, threat_level) // Assigns some vars in the modes, running it here for consistency rule.candidates = candidates.Copy() rule.trim_candidates() if (rule.ready(TRUE)) @@ -421,7 +421,7 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1) return TRUE var/list/drafted_rules = list() for (var/datum/dynamic_ruleset/roundstart/rule in roundstart_rules) - if (rule.acceptable(roundstart_pop_ready, threat_level) && threat >= rule.cost) // If we got the population and threat required + if (rule.acceptable(GLOB.player_list.len, threat_level) && threat >= rule.cost) // If we got the population and threat required rule.candidates = candidates.Copy() rule.trim_candidates() if (rule.ready() && rule.candidates.len > 0) @@ -429,12 +429,12 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1) if(!drafted_rules.len) message_admins("Not enough threat level for roundstart antags!") log_game("DYNAMIC: Not enough threat level for roundstart antags!") - var/indice_pop = min(10,round(roundstart_pop_ready/pop_per_requirement)+1) + var/indice_pop = min(10,round(GLOB.player_list.len/pop_per_requirement)+1) extra_rulesets_amount = 0 if (GLOB.dynamic_classic_secret) extra_rulesets_amount = 0 else - if (roundstart_pop_ready > GLOB.dynamic_high_pop_limit) + if (GLOB.player_list.len > GLOB.dynamic_high_pop_limit) message_admins("High Population Override is in effect! Threat Level will have more impact on which roles will appear, and player population less.") log_game("DYNAMIC: High Population Override is in effect! Threat Level will have more impact on which roles will appear, and player population less.") if (threat_level > high_pop_second_rule_req) diff --git a/code/game/objects/items/storage/backpack.dm b/code/game/objects/items/storage/backpack.dm index f6e169a4d5..a79eb299da 100644 --- a/code/game/objects/items/storage/backpack.dm +++ b/code/game/objects/items/storage/backpack.dm @@ -60,7 +60,7 @@ . = ..() var/datum/component/storage/STR = GetComponent(/datum/component/storage) STR.allow_big_nesting = TRUE - STR.max_w_class = WEIGHT_CLASS_BULKY + STR.max_w_class = WEIGHT_CLASS_GIGANTIC STR.max_combined_w_class = 35 /obj/item/storage/backpack/holding/suicide_act(mob/living/user) diff --git a/code/game/objects/items/weaponry.dm b/code/game/objects/items/weaponry.dm index d16453e02f..fec17cfa69 100644 --- a/code/game/objects/items/weaponry.dm +++ b/code/game/objects/items/weaponry.dm @@ -216,7 +216,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 slot_flags = ITEM_SLOT_BELT | ITEM_SLOT_BACK force = 40 throwforce = 10 - w_class = WEIGHT_CLASS_BULKY + w_class = WEIGHT_CLASS_HUGE hitsound = 'sound/weapons/bladeslice.ogg' attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") block_chance = 50 @@ -427,7 +427,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 lefthand_file = 'icons/mob/inhands/weapons/chainsaw_lefthand.dmi' righthand_file = 'icons/mob/inhands/weapons/chainsaw_righthand.dmi' item_flags = ABSTRACT | DROPDEL - w_class = WEIGHT_CLASS_BULKY + w_class = WEIGHT_CLASS_HUGE force = 24 throwforce = 0 throw_range = 0 @@ -512,7 +512,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 force = 10 throwforce = 12 attack_verb = list("beat", "smacked") - w_class = WEIGHT_CLASS_BULKY + w_class = WEIGHT_CLASS_HUGE var/homerun_ready = 0 var/homerun_able = 0 total_mass = 2.7 //a regular wooden major league baseball bat weighs somewhere between 2 to 3.4 pounds, according to google diff --git a/code/modules/antagonists/clockcult/clock_structures/traps/brass_skewer.dm b/code/modules/antagonists/clockcult/clock_structures/traps/brass_skewer.dm index 2f0db73bfc..ebfb219c9a 100644 --- a/code/modules/antagonists/clockcult/clock_structures/traps/brass_skewer.dm +++ b/code/modules/antagonists/clockcult/clock_structures/traps/brass_skewer.dm @@ -113,7 +113,7 @@ "You start tenderly lifting [skewee] off of [src]...") if(!do_after(user, 60, target = skewee)) skewee.visible_message("[skewee] painfully slides back down [src].") - skewee.say("Oof, ouch owwie!!", forced = "fail brass skewer removal") + skewee.emote("moan") return skewee.visible_message("[skewee] comes free of [src] with a squelching pop!", \ "You come free of [src]!") diff --git a/code/modules/mining/equipment/regenerative_core.dm b/code/modules/mining/equipment/regenerative_core.dm index 4429c8426f..d6e99f7361 100644 --- a/code/modules/mining/equipment/regenerative_core.dm +++ b/code/modules/mining/equipment/regenerative_core.dm @@ -59,7 +59,6 @@ to_chat(owner, "[src] breaks down as it tries to activate.") else owner.revive(full_heal = 1) - owner.log_message("[owner] used an implanted [src] to heal themselves! Keep fighting, it's just a flesh wound!", LOG_ATTACK, color="green") //Logging for implanted legion core use qdel(src) /obj/item/organ/regenerative_core/on_life() @@ -86,21 +85,6 @@ SSblackbox.record_feedback("nested tally", "hivelord_core", 1, list("[type]", "used", "self")) H.revive(full_heal = 1) qdel(src) - user.log_message("[user] used [src] to heal [H]! Wake the fuck up, Samurai!", LOG_ATTACK, color="green") //Logging for 'old' style legion core use, when clicking on a sprite of yourself or another. - -/obj/item/organ/regenerative_core/attack_self(mob/user) //Knouli's first hack! Allows for the use of the core in hand rather than needing to click on the target, yourself, to selfheal. Its a rip of the proc just above - but skips on distance check and only uses 'user' rather than 'target' - if(ishuman(user)) //Check if user is human, no need for distance check as it's self heal - var/mob/living/carbon/human/H = user //Set H to user rather than target - if(inert) //Inert cores are useless - to_chat(user, "[src] has decayed and can no longer be used to heal.") - return - else //Skip on check if the target to be healed is dead as, if you are dead, you're not going to be able to use it on yourself! - to_chat(user, "You start to smear [src] on yourself. It feels and smells disgusting, but you feel amazingly refreshed in mere moments.") - SSblackbox.record_feedback("nested tally", "hivelord_core", 1, list("[type]", "used", "self")) - H.revive(full_heal = 1) - qdel(src) - H.log_message("[H] used [src] to heal themselves! Making use of Knouli's sexy and intelligent use-in-hand proc!", LOG_ATTACK, color="green") //Logging for 'new' style legion core use, when using the core in-hand. - /obj/item/organ/regenerative_core/Insert(mob/living/carbon/M, special = 0, drop_if_replaced = TRUE) . = ..() diff --git a/code/modules/mob/living/carbon/human/species_types/bugmen.dm b/code/modules/mob/living/carbon/human/species_types/bugmen.dm index 02163eaaed..d264f11b73 100644 --- a/code/modules/mob/living/carbon/human/species_types/bugmen.dm +++ b/code/modules/mob/living/carbon/human/species_types/bugmen.dm @@ -1,8 +1,9 @@ /datum/species/insect name = "Anthromorphic Insect" id = "insect" + say_mod = "flutters" default_color = "00FF00" - species_traits = list(LIPS,EYECOLOR,HAIR,FACEHAIR,MUTCOLORS,HORNCOLOR,WINGCOLOR) + species_traits = list(LIPS,NOEYES,HAIR,FACEHAIR,MUTCOLORS,HORNCOLOR,WINGCOLOR) inherent_biotypes = list(MOB_ORGANIC, MOB_HUMANOID, MOB_BUG) mutant_bodyparts = list("mam_ears", "mam_snout", "mam_tail", "taur", "insect_wings", "mam_snouts", "insect_fluff","horns") default_features = list("mcolor" = "FFF","mcolor2" = "FFF","mcolor3" = "FFF", "mam_tail" = "None", "mam_ears" = "None", @@ -11,36 +12,54 @@ attack_sound = 'sound/weapons/slash.ogg' miss_sound = 'sound/weapons/slashmiss.ogg' meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/insect - liked_food = MEAT | FRUIT - disliked_food = TOXIC + liked_food = VEGETABLES | DAIRY + disliked_food = FRUIT | GROSS + toxic_food = MEAT | RAW + mutanteyes = /obj/item/organ/eyes/insect should_draw_citadel = TRUE + exotic_bloodtype = "BUG" -/datum/species/insect/spec_death(gibbed, mob/living/carbon/human/H) - if(H) - stop_wagging_tail(H) - -/datum/species/insect/spec_stun(mob/living/carbon/human/H,amount) - if(H) - stop_wagging_tail(H) +/datum/species/insect/on_species_gain(mob/living/carbon/C) . = ..() + if(ishuman(C)) + var/mob/living/carbon/human/H = C + if(!H.dna.features["insect_wings"]) + H.dna.features["insect_wings"] = "[(H.client && H.client.prefs && LAZYLEN(H.client.prefs.features) && H.client.prefs.features["insect_wings"]) ? H.client.prefs.features["insect_wings"] : "None"]" + handle_mutant_bodyparts(H) -/datum/species/insect/can_wag_tail(mob/living/carbon/human/H) - return ("mam_tail" in mutant_bodyparts) || ("mam_waggingtail" in mutant_bodyparts) +/datum/species/insect/random_name(gender,unique,lastname) + if(unique) + return random_unique_moth_name() -/datum/species/insect/is_wagging_tail(mob/living/carbon/human/H) - return ("mam_waggingtail" in mutant_bodyparts) + var/randname = moth_name() -/datum/species/insect/start_wagging_tail(mob/living/carbon/human/H) - if("mam_tail" in mutant_bodyparts) - mutant_bodyparts -= "mam_tail" - mutant_bodyparts |= "mam_waggingtail" - H.update_body() + if(lastname) + randname += " [lastname]" -/datum/species/insect/stop_wagging_tail(mob/living/carbon/human/H) - if("mam_waggingtail" in mutant_bodyparts) - mutant_bodyparts -= "mam_waggingtail" - mutant_bodyparts |= "mam_tail" - H.update_body() + return randname -/datum/species/insect/qualifies_for_rank(rank, list/features) - return TRUE \ No newline at end of file +/datum/species/insect/handle_fire(mob/living/carbon/human/H, no_protection = FALSE) + ..() + if(H.dna.features["insect_wings"] != "Burnt Off" && H.dna.features["insect_wings"] != "None" && H.bodytemperature >= 800 && H.fire_stacks > 0) //do not go into the extremely hot light. you will not survive + to_chat(H, "Your precious wings burn to a crisp!") + if(H.dna.features["insect_wings"] != "None") + H.dna.features["insect_wings"] = "Burnt Off" + handle_mutant_bodyparts(H) + +/datum/species/insect/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H) + . = ..() + if(chem.id == "pestkiller") + H.adjustToxLoss(3) + H.reagents.remove_reagent(chem.id, REAGENTS_METABOLISM) + +/datum/species/insect/check_weakness(obj/item/weapon, mob/living/attacker) + if(istype(weapon, /obj/item/melee/flyswatter)) + return 9 //flyswatters deal 10x damage to insects + return 0 + +/datum/species/insect/space_move(mob/living/carbon/human/H) + . = ..() + if(H.loc && !isspaceturf(H.loc) && (H.dna.features["insect_wings"] != "Burnt Off" && H.dna.features["insect_wings"] != "None")) + var/datum/gas_mixture/current = H.loc.return_air() + if(current && (current.return_pressure() >= ONE_ATMOSPHERE*0.85)) //as long as there's reasonable pressure and no gravity, flight is possible + return TRUE diff --git a/code/modules/mob/living/simple_animal/bot/bot.dm b/code/modules/mob/living/simple_animal/bot/bot.dm index 4f12250ef0..a5943aa0e6 100644 --- a/code/modules/mob/living/simple_animal/bot/bot.dm +++ b/code/modules/mob/living/simple_animal/bot/bot.dm @@ -37,7 +37,6 @@ var/obj/item/paicard/paicard // Inserted pai card. var/allow_pai = 1 // Are we even allowed to insert a pai card. var/bot_name - var/oil_spill_type = /obj/effect/decal/cleanable/oil var/list/player_access = list() //Additonal access the bots gets when player controlled var/emagged = FALSE @@ -217,9 +216,9 @@ to_chat(user, "[src] is in pristine condition.") /mob/living/simple_animal/bot/adjustHealth(amount, updating_health = TRUE, forced = FALSE) + if(amount>0 && prob(10)) + new /obj/effect/decal/cleanable/oil(loc) . = ..() - if(. && prob(10)) - new oil_spill_type(loc) /mob/living/simple_animal/bot/updatehealth() ..() diff --git a/code/modules/mob/living/simple_animal/bot/honkbot.dm b/code/modules/mob/living/simple_animal/bot/honkbot.dm index 724abea214..1c19cd82a1 100644 --- a/code/modules/mob/living/simple_animal/bot/honkbot.dm +++ b/code/modules/mob/living/simple_animal/bot/honkbot.dm @@ -16,7 +16,6 @@ bot_core_type = /obj/machinery/bot_core/honkbot window_id = "autohonk" window_name = "Honkomatic Bike Horn Unit v1.0.7" - oil_spill_type = /obj/effect/decal/cleanable/oil/slippery //slip and slide fun for the whole family data_hud_type = DATA_HUD_SECURITY_BASIC // show jobs path_image_color = "#FF69B4" diff --git a/modular_citadel/icons/mob/mutant_bodyparts.dmi b/modular_citadel/icons/mob/mutant_bodyparts.dmi index 8ff4a3ddb57bd498850bbdabcaea94bd2770e557..a66895f8641032f781378b05fbdae8c4832b3fbf 100644 GIT binary patch delta 6372 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