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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