diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index 04030093..628e7cd1 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -38,6 +38,8 @@ var/list/unattached_flesh var/flesh_number = 0 + var/size = 1 + /obj/machinery/clonepod/Initialize() . = ..() @@ -61,7 +63,7 @@ QDEL_LIST(unattached_flesh) . = ..() -/obj/machinery/clonepod/RefreshParts() +/obj/machinery/clonepod/RefreshParts() speed_coeff = 0 efficiency = 0 for(var/obj/item/stock_parts/scanning_module/S in component_parts) @@ -126,34 +128,40 @@ return examine(user) //Start growing a human clone in the pod! -/obj/machinery/clonepod/proc/growclone(ckey, clonename, ui, mutation_index, mindref, datum/species/mrace, list/features, factions, list/quirks) +/obj/machinery/clonepod/proc/growclone(ckey, clonename, ui, mutation_index, mindref, datum/species/mrace, list/features, factions, list/quirks, experimental = FALSE) if(panel_open) return FALSE if(mess || attempting) return FALSE - clonemind = locate(mindref) in SSticker.minds - if(!istype(clonemind)) //not a mind - return FALSE - if(!QDELETED(clonemind.current)) - if(clonemind.current.stat != DEAD) //mind is associated with a non-dead body + + //runtime error protection + if(mindref) + clonemind = locate(mindref) in SSticker.minds + + //only exit out of cloning with no mind if cloning is not experimental. + if(!experimental) + if(!istype(clonemind)) //not a mind return FALSE - if(clonemind.current.suiciding) // Mind is associated with a body that is suiciding. + if(!QDELETED(clonemind.current)) + if(clonemind.current.stat != DEAD) //mind is associated with a non-dead body + return FALSE + if(clonemind.current.suiciding) // Mind is associated with a body that is suiciding. + return FALSE + if(clonemind.active) //somebody is using that mind + if( ckey(clonemind.key)!=ckey ) + return FALSE + else + // get_ghost() will fail if they're unable to reenter their body + var/mob/dead/observer/G = clonemind.get_ghost() + if(!G) + return FALSE + if(G.suiciding) // The ghost came from a body that is suiciding. + return FALSE + if(clonemind.damnation_type) //Can't clone the damned. + INVOKE_ASYNC(src, .proc/horrifyingsound) + mess = TRUE + update_icon() return FALSE - if(clonemind.active) //somebody is using that mind - if( ckey(clonemind.key)!=ckey ) - return FALSE - else - // get_ghost() will fail if they're unable to reenter their body - var/mob/dead/observer/G = clonemind.get_ghost() - if(!G) - return FALSE - if(G.suiciding) // The ghost came from a body that is suiciding. - return FALSE - if(clonemind.damnation_type) //Can't clone the damned. - INVOKE_ASYNC(src, .proc/horrifyingsound) - mess = TRUE - update_icon() - return FALSE attempting = TRUE //One at a time!! countdown.start() @@ -180,7 +188,14 @@ ADD_TRAIT(H, TRAIT_NOCRITDAMAGE, CLONING_POD_TRAIT) H.Unconscious(80) - clonemind.transfer_to(H) + //only transfer consciousness if the clone isn't experimental + if(experimental) + var/list/candidates = pollCandidatesForMob("Do you want to play as [clonename]'s defective clone?", null, null, null, 100, H) + if(LAZYLEN(candidates)) + var/mob/dead/observer/C = pick(candidates) + H.key = C.key + else + clonemind.transfer_to(H) if(grab_ghost_when == CLONER_FRESH_CLONE) H.grab_ghost() @@ -203,6 +218,12 @@ H.suiciding = FALSE attempting = FALSE + //sizecode stuff, check size of scanned individual to then pass in later. someone should turn size into a dna trait tbh + if(istype(clonemind)) + var/mob/living/current = clonemind.current //gets body of current mind + if(!isnull(current)) + size = current.size_multiplier * 100 + return TRUE //Grow clones to maturity then kick them out. FREELOADERS @@ -381,7 +402,7 @@ //Do the resize on ejection. The clone pod seems to do a lot of matrix transforms the way size code does, so we will handle our resize after. mob_occupant.previous_size = 1 //Set the previous size to default so the resize properly set health and speed. - mob_occupant.custom_body_size = mob_occupant.client.prefs.body_size + mob_occupant.custom_body_size = size //mob_occupant.client.prefs.body_size mob_occupant.resize(mob_occupant.custom_body_size * 0.01) occupant = null diff --git a/code/game/machinery/exp_cloner.dm b/code/game/machinery/exp_cloner.dm index db60a1a4..c5b40a46 100644 --- a/code/game/machinery/exp_cloner.dm +++ b/code/game/machinery/exp_cloner.dm @@ -8,7 +8,8 @@ circuit = /obj/item/circuitboard/machine/clonepod/experimental internal_radio = FALSE -//Start growing a human clone in the pod! +//Start growing a human clone in the pod! Depreciated and replaced with parent object's growclone method. +/* /obj/machinery/clonepod/experimental/growclone(ckey, clonename, ui, se, datum/species/mrace, list/features, factions) if(panel_open) return FALSE @@ -71,7 +72,7 @@ H.suiciding = FALSE attempting = FALSE return TRUE - +*/ //Prototype cloning console, much more rudimental and lacks modern functions such as saving records, autocloning, or safety checks. /obj/machinery/computer/prototype_cloning @@ -293,7 +294,26 @@ temp = "Cloning cycle already in progress." playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0) else - pod.growclone(null, mob_occupant.real_name, dna.uni_identity, dna.mutation_index, clone_species, dna.features, mob_occupant.faction) + + //put here for ease of use / ability to change, rather than in the method call to growclone + var/name = mob_occupant.real_name + var/mind = null + var/UI = dna.uni_identity + var/SE = dna.mutation_index + var/features = dna.features + var/factions = mob_occupant.faction + var/list/quirks = list() + + if (!isnull(mob_occupant.mind)) //Save that mind so traitors can continue traitoring after cloning. + mind = "[REF(mob_occupant.mind)]" + + for(var/V in mob_occupant.roundstart_quirks) + var/datum/quirk/T = V + quirks[T.type] = T.clone_data() + + //grows the clone, format; + // ckey, clonename, ui, mutation_index, mindref, datum/species/mrace, list/features, factions, list/quirks, experimental = FALSE + pod.growclone(null, name, UI, SE, mind, clone_species, features, factions, quirks, TRUE) temp = "[mob_occupant.real_name] => Cloning data sent to pod." playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0) diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm index 2f98a4b4..ef1c0cf4 100644 --- a/code/modules/clothing/suits/miscellaneous.dm +++ b/code/modules/clothing/suits/miscellaneous.dm @@ -28,6 +28,46 @@ allowed = list (/obj/item/gun/energy/laser/redtag) resistance_flags = NONE +/* + * Posshim's Corpus atire + */ +/obj/item/clothing/suit/hooded/corpus/ + name = "Standard Voidsuit" + desc = "Standard issue voidsuit in the name of Grofit!" + icon_state = "corpus" + item_state = "armor" + body_parts_covered = CHEST|GROIN|LEGS|ARMS|FEET|HANDS + hoodtype = /obj/item/clothing/head/hooded/corpus + flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT //"Hide shoes" but digi shoes dont get hidden, too bad! + min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT + mutantrace_variation = NO_MUTANTRACE_VARIATION //There is no need for a digi variant, it's a costume + +/obj/item/clothing/suit/hooded/corpus/s //sec + name = "Enforcer Voidsuit" + desc = "Delux issue grofit voidsuit. Let the middle class know You're in charge." + icon_state = "corpuss" + hoodtype = /obj/item/clothing/head/hooded/corpus/s //Enjoy this nice red outfit Kinaris! There is NO NEED for a pink one! xoxo -VivI Fanteriso + +/obj/item/clothing/suit/hooded/corpus/c //command + name = "Commander Voidsuit" + desc = "Premium issue correctional worker attire. Grease the gears of production." + icon_state = "corpusc" + hoodtype = /obj/item/clothing/head/hooded/corpus/c + +/obj/item/clothing/head/hooded/corpus + name = "Voidsuit helmet" + desc = "galvanized reinforced helm to protect against the elements" + icon_state = "corpus" + body_parts_covered = HEAD + flags_inv = HIDEHAIR|HIDEEARS|HIDEFACIALHAIR|HIDEFACE|HIDEMASK|HIDESNOUT|HIDENECK //hide your ugly face with this one simple trick! + min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT + +/obj/item/clothing/head/hooded/corpus/s //sec + icon_state = "corpuss" + +/obj/item/clothing/head/hooded/corpus/c //command + icon_state = "corpusc" + /* * Costume */ diff --git a/code/modules/food_and_drinks/food/snacks_salad.dm b/code/modules/food_and_drinks/food/snacks_salad.dm index 318d1edc..055999f7 100644 --- a/code/modules/food_and_drinks/food/snacks_salad.dm +++ b/code/modules/food_and_drinks/food/snacks_salad.dm @@ -124,4 +124,4 @@ trash = /obj/item/reagent_containers/glass/bowl/mushroom_bowl bonus_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/nutriment/vitamin = 4) tastes = list("fruity cactus" = 5, "ash" = 1, "tough meat" = 3, "your eternal damnation" = 1) - foodtype = FRUIT | MEAT | VEGETABLES //MUSHROOM = VEGETABLE -VladinXXV 2021 + foodtype = FRUIT | MEAT | VEGETABLES //MUSHROOM = VEGETABLE -VivI Fanteriso: 2021. Totally didnt steal this comment form vladin. diff --git a/code/modules/mining/ores_coins.dm b/code/modules/mining/ores_coins.dm index 2363e6a3..67e1d769 100644 --- a/code/modules/mining/ores_coins.dm +++ b/code/modules/mining/ores_coins.dm @@ -438,6 +438,15 @@ GLOBAL_LIST_INIT(sand_recipes, list(\ value = 0 grind_results = list(/datum/reagent/consumable/sodiumchloride = 4) +/obj/item/coin/vivitoken + name = ".... token?" + icon_state = "coin_vivi_wizard" + cmineral = "vivi" + desc = "This shouldnt be here....." + sideslist = list("wizard", "engie") + value = 0 + grind_results = list(/datum/reagent/medicine/copium = 10) + /obj/item/coin/attackby(obj/item/W, mob/user, params) if(istype(W, /obj/item/stack/cable_coil)) var/obj/item/stack/cable_coil/CC = W diff --git a/code/modules/vending/autodrobe.dm b/code/modules/vending/autodrobe.dm index 3941974c..e53d8a47 100644 --- a/code/modules/vending/autodrobe.dm +++ b/code/modules/vending/autodrobe.dm @@ -8,6 +8,8 @@ vend_reply = "Thank you for using AutoDrobe!" products = list(/obj/item/clothing/suit/chickensuit = 1, /obj/item/clothing/head/chicken = 1, + /obj/item/clothing/suit/hooded/corpus = 1, + /obj/item/clothing/suit/hooded/corpus/c = 1, /obj/item/clothing/under/gladiator = 1, /obj/item/clothing/head/helmet/gladiator = 1, /obj/item/clothing/under/gimmick/rank/captain/suit = 1, diff --git a/code/modules/vending/wardrobes.dm b/code/modules/vending/wardrobes.dm index 96d9ec1d..0d1e1f3d 100644 --- a/code/modules/vending/wardrobes.dm +++ b/code/modules/vending/wardrobes.dm @@ -18,7 +18,8 @@ /obj/item/clothing/mask/bandana/red = 5, /obj/item/clothing/under/rank/security/skirt = 5, /obj/item/clothing/under/rank/security/grey = 5, - /obj/item/clothing/under/pants/khaki = 5) + /obj/item/clothing/under/pants/khaki = 5, + /obj/item/clothing/suit/hooded/corpus/s = 5) premium = list(/obj/item/clothing/under/rank/security/navyblue = 5, /obj/item/clothing/suit/security/officer = 5, /obj/item/clothing/head/beret/sec/navyofficer = 5, diff --git a/hyperstation/code/obj/plushes.dm b/hyperstation/code/obj/plushes.dm index d744793d..58de2e35 100644 --- a/hyperstation/code/obj/plushes.dm +++ b/hyperstation/code/obj/plushes.dm @@ -64,19 +64,6 @@ light_range = 1.4 attack_verb = list("bapped", "slapped", "bonked") -//Vladplush containment starts here -/obj/item/toy/plush/nukeplushie/vladin - name = "elite operative plushie" - desc = "A stuffed toy that resembles an elite syndicate nuclear operative. He has a little wedding band!" - gender = MALE //he's a boy, there is no doubt here - young = TRUE //he's not actually young, but i refuse to have a plush that is not loyal to his partner. this is the only way i could figure out. - icon = 'hyperstation/icons/obj/plushes.dmi' - icon_state = "vladin" - item_state = "vladin" - attack_verb = list("nuked", "detonated", "CQC'd", "robusted") - squeak_override = list('sound/effects/hit_punch.ogg' = 1, 'sound/effects/hit_kick.ogg' = 1, 'sound/weapons/cqchit1.ogg' = 1, 'sound/weapons/cqchit2.ogg' = 1) -//I can't figure out how to make him loyal to a specific type of plush. If anyone figures that out, there will be more. Until then, this is the end of the vladplush. - //Enzo_Leon patron stuff /obj/item/toy/plush/mammal/enzo_leon name = "rat plushie" @@ -87,4 +74,4 @@ item_state = "enzor" attack_verb = list("tail bapped", "whomped", "squeaked") squeak_override = list('sound/effects/mousesqueek.ogg'= 1) -//End \ No newline at end of file +//End diff --git a/hyperstation/icons/obj/plushes.dmi b/hyperstation/icons/obj/plushes.dmi index e0496bfb..0438ab7d 100644 Binary files a/hyperstation/icons/obj/plushes.dmi and b/hyperstation/icons/obj/plushes.dmi differ diff --git a/icons/mob/head.dmi b/icons/mob/head.dmi index de97e09f..b21c68bc 100644 Binary files a/icons/mob/head.dmi and b/icons/mob/head.dmi differ diff --git a/icons/mob/suit.dmi b/icons/mob/suit.dmi index d93dda66..2f8f0e51 100644 Binary files a/icons/mob/suit.dmi and b/icons/mob/suit.dmi differ diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi index 028962e3..33db51e1 100644 Binary files a/icons/obj/clothing/hats.dmi and b/icons/obj/clothing/hats.dmi differ diff --git a/icons/obj/clothing/suits.dmi b/icons/obj/clothing/suits.dmi index 003ff83f..95d36176 100644 Binary files a/icons/obj/clothing/suits.dmi and b/icons/obj/clothing/suits.dmi differ diff --git a/icons/obj/economy.dmi b/icons/obj/economy.dmi index fef7637b..c281432d 100644 Binary files a/icons/obj/economy.dmi and b/icons/obj/economy.dmi differ