diff --git a/code/modules/clothing/spacesuits/rig/rig.dm b/code/modules/clothing/spacesuits/rig/rig.dm index 9606205cc4..1b649ff8fe 100644 --- a/code/modules/clothing/spacesuits/rig/rig.dm +++ b/code/modules/clothing/spacesuits/rig/rig.dm @@ -44,6 +44,8 @@ var/glove_type = /obj/item/clothing/gloves/gauntlets/rig var/cell_type = /obj/item/weapon/cell/high var/air_type = /obj/item/weapon/tank/oxygen + var/unremovable_cell = FALSE //CHOMP Edit - an addition for protean living hardsuit. + //Component/device holders. var/obj/item/weapon/tank/air_supply // Air tank, if any. @@ -899,14 +901,19 @@ wearer.lay_down() to_chat(user, "\The [wearer] is now [wearer.resting ? "resting" : "getting up"].") -/obj/item/weapon/rig/proc/forced_move(var/direction, var/mob/user) +/obj/item/weapon/rig/proc/forced_move(var/direction, var/mob/user, var/ai_moving = TRUE) // Why is all this shit in client/Move()? Who knows? if(world.time < wearer_move_delay) return - if(!wearer || !wearer.loc || !ai_can_move_suit(user, check_user_module = 1)) + if(!wearer || !wearer.loc) //CHOMP Edit - Removed some stuff for protean living hardsuit return + +//CHOMP Addition - Added this for protean living hardsuit + if(ai_moving) + if(!ai_can_move_suit(user, check_user_module = 1)) + return //This is sota the goto stop mobs from moving var if(wearer.transforming || !wearer.canmove) @@ -965,7 +972,10 @@ wearer_move_delay += 2 return wearer.buckled.relaymove(wearer,direction) - cell.use(200) //Arbitrary, TODO + var/power_cost = 200 + if(!ai_moving) + power_cost = 20 + cell.use(power_cost) //Arbitrary, TODO wearer.Move(get_step(get_turf(wearer),direction),direction) // This returns the rig if you are contained inside one, but not if you are wearing it diff --git a/code/modules/clothing/spacesuits/rig/rig_attackby.dm b/code/modules/clothing/spacesuits/rig/rig_attackby.dm index 67080dd1e0..656f2d19da 100644 --- a/code/modules/clothing/spacesuits/rig/rig_attackby.dm +++ b/code/modules/clothing/spacesuits/rig/rig_attackby.dm @@ -136,7 +136,7 @@ if("cell") - if(cell) + if(cell && !unremovable_cell) //CHOMP Edit - addition for living protean hardsuit to_chat(user, "You detach \the [cell] from \the [src]'s battery mount.") for(var/obj/item/rig_module/module in installed_modules) module.deactivate() diff --git a/code/modules/clothing/spacesuits/rig/suits/alien_ch.dm b/code/modules/clothing/spacesuits/rig/suits/alien_ch.dm new file mode 100644 index 0000000000..d93cfb06e5 --- /dev/null +++ b/code/modules/clothing/spacesuits/rig/suits/alien_ch.dm @@ -0,0 +1,213 @@ +/* + proteans +*/ +/obj/item/weapon/rig/protean + name = "nanosuit control cluster" + suit_type = "nanomachine" + icon = 'icons/obj/rig_modules_ch.dmi' + icon_state = "nanomachine_rig" + armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 100, rad = 90) + siemens_coefficient= 0.5 + slowdown = 0 + offline_slowdown = 0 + seal_delay = 1 + var/mob/living/carbon/human/myprotean + initial_modules = list(/obj/item/rig_module/power_sink) + + helm_type = /obj/item/clothing/head/helmet/space/rig/protean //These are important for sprite pointers + boot_type = /obj/item/clothing/shoes/magboots/rig/protean + chest_type = /obj/item/clothing/suit/space/rig/protean + glove_type = /obj/item/clothing/gloves/gauntlets/rig/protean + +//I doooon't think I can get rig_back.dmi as a _ch file. That is part of /obj/item/weapon/rig/update_icon(var/update_mob_icon). + +/obj/item/weapon/rig/protean/relaymove(mob/user, var/direction) + if(user.stat || user.stunned) + return + forced_move(direction, user, FALSE) + +/obj/item/clothing/head/helmet/space/rig/protean + name = "mass" + desc = "A helmet-shaped clump of nanomachines." + siemens_coefficient= 0 + light_overlay = "should not use a light overlay" + species_restricted = list(SPECIES_HUMAN, SPECIES_PROMETHEAN, SPECIES_VASILISSAN, SPECIES_ALRAUNE) //anything that's roughly humanoid ie uses human spritesheets + +/obj/item/clothing/gloves/gauntlets/rig/protean + name = "mass" + desc = "Glove-shaped clusters of nanomachines." + siemens_coefficient= 0 + species_restricted = list(SPECIES_HUMAN, SPECIES_PROMETHEAN, SPECIES_VASILISSAN, SPECIES_ALRAUNE) //anything that's roughly humanoid. + +/obj/item/clothing/shoes/magboots/rig/protean + name = "mass" + desc = "Boot-shaped clusters of nanomachines." + siemens_coefficient= 0 + species_restricted = list(SPECIES_HUMAN, SPECIES_PROMETHEAN, SPECIES_VASILISSAN, SPECIES_ALRAUNE) //anything that's roughly humanoid. + +/obj/item/clothing/suit/space/rig/protean + name = "mass" + desc = "A body-hugging mass of nanomachines." + siemens_coefficient= 0 + can_breach = 0 + species_restricted = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_TAJ, SPECIES_UNATHI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_PROMETHEAN, SPECIES_XENOHYBRID, SPECIES_VOX, SPECIES_TESHARI, SPECIES_VASILISSAN) + allowed = list( + /obj/item/weapon/gun, + /obj/item/device/flashlight, + /obj/item/weapon/tank, + /obj/item/device/suit_cooling_unit, + /obj/item/weapon/melee/baton, + /obj/item/weapon/storage/backpack, + ) //Subspace radio is in for the citadel version. IDK if we have that and I don't think we need it so I removed it from this list. + + + + +//Backend stuff to make the sprites work. Copied and pasted from rig_pieces_vr.dm, but added ch to everything. Only reason for this to be touched is to add or remove species. This might just need to go in a new file named rig_pieces_ch.dm. +/obj/item/clothing/head/helmet/space/rig/protean + sprite_sheets = list( + SPECIES_HUMAN = 'icons/mob/head_ch.dmi', + SPECIES_TAJ = 'icons/mob/species/tajaran/helmet_ch.dmi', + SPECIES_SKRELL = 'icons/mob/species/skrell/helmet_ch.dmi', + SPECIES_UNATHI = 'icons/mob/species/unathi/helmet_ch.dmi', + SPECIES_XENOHYBRID = 'icons/mob/species/unathi/helmet_ch.dmi', + SPECIES_AKULA = 'icons/mob/species/akula/helmet_ch.dmi', + SPECIES_SERGAL = 'icons/mob/species/sergal/helmet_ch.dmi', + SPECIES_NEVREAN = 'icons/mob/species/sergal/helmet_ch.dmi', + SPECIES_VULPKANIN = 'icons/mob/species/vulpkanin/helmet_ch.dmi', + SPECIES_ZORREN_HIGH = 'icons/mob/species/fox/helmet_ch.dmi', + SPECIES_FENNEC = 'icons/mob/species/vulpkanin/helmet_ch.dmi', + SPECIES_PROMETHEAN = 'icons/mob/species/skrell/helmet_ch.dmi', + SPECIES_TESHARI = 'icons/mob/species/seromi/head_ch.dmi', + SPECIES_VASILISSAN = 'icons/mob/species/skrell/helmet_ch.dmi', + SPECIES_VOX = 'icons/mob/species/vox/head_ch.dmi' + ) + + sprite_sheets_obj = list( + SPECIES_HUMAN = 'icons/obj/clothing/hats_ch.dmi', + SPECIES_TAJ = 'icons/obj/clothing/hats_ch.dmi', + SPECIES_SKRELL = 'icons/obj/clothing/hats_ch.dmi', + SPECIES_UNATHI = 'icons/obj/clothing/hats_ch.dmi', + SPECIES_XENOHYBRID = 'icons/obj/clothing/hats_ch.dmi', + SPECIES_AKULA = 'icons/obj/clothing/hats_ch.dmi', + SPECIES_SERGAL = 'icons/obj/clothing/hats_ch.dmi', + SPECIES_NEVREAN = 'icons/obj/clothing/hats_ch.dmi', + SPECIES_VULPKANIN = 'icons/obj/clothing/hats_ch.dmi', + SPECIES_ZORREN_HIGH = 'icons/obj/clothing/hats_ch.dmi', + SPECIES_FENNEC = 'icons/obj/clothing/hats_ch.dmi', + SPECIES_PROMETHEAN = 'icons/obj/clothing/hats_ch.dmi', + SPECIES_TESHARI = 'icons/obj/clothing/hats_ch.dmi', + SPECIES_VASILISSAN = 'icons/obj/clothing/hats_ch.dmi', + SPECIES_VOX = 'icons/obj/clothing/hats_ch.dmi' + ) + +/obj/item/clothing/suit/space/rig/protean + sprite_sheets = list( + SPECIES_HUMAN = 'icons/mob/spacesuit_ch.dmi', + SPECIES_TAJ = 'icons/mob/species/tajaran/suit_ch.dmi', + SPECIES_SKRELL = 'icons/mob/species/skrell/suit_ch.dmi', + SPECIES_UNATHI = 'icons/mob/species/unathi/suit_ch.dmi', + SPECIES_XENOHYBRID = 'icons/mob/species/unathi/suit_ch.dmi', + SPECIES_AKULA = 'icons/mob/species/akula/suit_ch.dmi', + SPECIES_SERGAL = 'icons/mob/species/sergal/suit_ch.dmi', + SPECIES_NEVREAN = 'icons/mob/species/sergal/suit_ch.dmi', + SPECIES_VULPKANIN = 'icons/mob/species/vulpkanin/suit_ch.dmi', + SPECIES_ZORREN_HIGH = 'icons/mob/species/fox/suit_ch.dmi', + SPECIES_FENNEC = 'icons/mob/species/vulpkanin/suit_ch.dmi', + SPECIES_PROMETHEAN = 'icons/mob/species/skrell/suit_ch.dmi', + SPECIES_TESHARI = 'icons/mob/species/seromi/suit_ch.dmi', + SPECIES_VASILISSAN = 'icons/mob/species/skrell/suit_ch.dmi', + SPECIES_VOX = 'icons/mob/species/vox/suit_ch.dmi' + ) + + sprite_sheets_obj = list( + SPECIES_HUMAN = 'icons/obj/clothing/spacesuits_ch.dmi', + SPECIES_TAJ = 'icons/obj/clothing/spacesuits_ch.dmi', + SPECIES_SKRELL = 'icons/obj/clothing/spacesuits_ch.dmi', + SPECIES_UNATHI = 'icons/obj/clothing/spacesuits_ch.dmi', + SPECIES_XENOHYBRID = 'icons/obj/clothing/spacesuits_ch.dmi', + SPECIES_AKULA = 'icons/obj/clothing/spacesuits_ch.dmi', + SPECIES_SERGAL = 'icons/obj/clothing/spacesuits_ch.dmi', + SPECIES_NEVREAN = 'icons/obj/clothing/spacesuits_ch.dmi', + SPECIES_VULPKANIN = 'icons/obj/clothing/spacesuits_ch.dmi', + SPECIES_ZORREN_HIGH = 'icons/obj/clothing/spacesuits_ch.dmi', + SPECIES_FENNEC = 'icons/obj/clothing/spacesuits_ch.dmi', + SPECIES_PROMETHEAN = 'icons/obj/clothing/spacesuits_ch.dmi', + SPECIES_TESHARI = 'icons/obj/clothing/spacesuits_ch.dmi', + SPECIES_VASILISSAN = 'icons/obj/clothing/spacesuits_ch.dmi', + SPECIES_VOX = 'icons/obj/clothing/spacesuits_ch.dmi' + ) + +/obj/item/clothing/gloves/gauntlets/rig/protean + sprite_sheets = list( + SPECIES_HUMAN = 'icons/mob/hands_ch.dmi', + SPECIES_TAJ = 'icons/mob/hands_ch.dmi', + SPECIES_SKRELL = 'icons/mob/hands_ch.dmi', + SPECIES_UNATHI = 'icons/mob/hands_ch.dmi', + SPECIES_XENOHYBRID = 'icons/mob/hands_ch.dmi', + SPECIES_AKULA = 'icons/mob/hands_ch.dmi', + SPECIES_SERGAL = 'icons/mob/hands_ch.dmi', + SPECIES_NEVREAN = 'icons/mob/hands_ch.dmi', + SPECIES_VULPKANIN = 'icons/mob/hands_ch.dmi', + SPECIES_ZORREN_HIGH = 'icons/mob/hands_ch.dmi', + SPECIES_FENNEC = 'icons/mob/hands_ch.dmi', + SPECIES_PROMETHEAN = 'icons/mob/hands_ch.dmi', + SPECIES_TESHARI = 'icons/mob/hands_ch.dmi', + SPECIES_VASILISSAN = 'icons/mob/hands_ch.dmi', + SPECIES_VOX = 'icons/mob/species/vox/gloves_ch.dmi' + ) + + sprite_sheets_obj = list( + SPECIES_HUMAN = 'icons/obj/clothing/gloves_ch.dmi', + SPECIES_TAJ = 'icons/obj/clothing/gloves_ch.dmi', + SPECIES_SKRELL = 'icons/obj/clothing/gloves_ch.dmi', + SPECIES_UNATHI = 'icons/obj/clothing/gloves_ch.dmi', + SPECIES_XENOHYBRID = 'icons/obj/clothing/gloves_ch.dmi', + SPECIES_AKULA = 'icons/obj/clothing/gloves_ch.dmi', + SPECIES_SERGAL = 'icons/obj/clothing/gloves_ch.dmi', + SPECIES_NEVREAN = 'icons/obj/clothing/gloves_ch.dmi', + SPECIES_VULPKANIN = 'icons/obj/clothing/gloves_ch.dmi', + SPECIES_ZORREN_HIGH = 'icons/obj/clothing/gloves_ch.dmi', + SPECIES_FENNEC = 'icons/obj/clothing/gloves_ch.dmi', + SPECIES_PROMETHEAN = 'icons/obj/clothing/gloves_ch.dmi', + SPECIES_TESHARI = 'icons/obj/clothing/gloves_ch.dmi', + SPECIES_VASILISSAN = 'icons/obj/clothing/gloves_ch.dmi', + SPECIES_VOX = 'icons/obj/clothing/gloves_ch.dmi' + ) + +/obj/item/clothing/shoes/magboots/rig/protean + sprite_sheets = list( + SPECIES_HUMAN = 'icons/mob/feet_ch.dmi', + SPECIES_TAJ = 'icons/mob/feet_ch.dmi', + SPECIES_SKRELL = 'icons/mob/feet_ch.dmi', + SPECIES_UNATHI = 'icons/mob/feet_ch.dmi', + SPECIES_XENOHYBRID = 'icons/mob/feet_ch.dmi', + SPECIES_AKULA = 'icons/mob/feet_ch.dmi', + SPECIES_SERGAL = 'icons/mob/feet_ch.dmi', + SPECIES_NEVREAN = 'icons/mob/feet_ch.dmi', + SPECIES_VULPKANIN = 'icons/mob/feet_ch.dmi', + SPECIES_ZORREN_HIGH = 'icons/mob/feet_ch.dmi', + SPECIES_FENNEC = 'icons/mob/feet_ch.dmi', + SPECIES_PROMETHEAN = 'icons/mob/feet_ch.dmi', + SPECIES_TESHARI = 'icons/mob/feet_ch.dmi', + SPECIES_VASILISSAN = 'icons/mob/feet_ch.dmi', + SPECIES_VOX = 'icons/mob/species/vox/shoes_ch.dmi' + ) + + sprite_sheets_obj = list( + SPECIES_HUMAN = 'icons/obj/clothing/shoes_ch.dmi', + SPECIES_TAJ = 'icons/obj/clothing/shoes_ch.dmi', + SPECIES_SKRELL = 'icons/obj/clothing/shoes_ch.dmi', + SPECIES_UNATHI = 'icons/obj/clothing/shoes_ch.dmi', + SPECIES_XENOHYBRID = 'icons/obj/clothing/shoes_ch.dmi', + SPECIES_AKULA = 'icons/obj/clothing/shoes_ch.dmi', + SPECIES_SERGAL = 'icons/obj/clothing/shoes_ch.dmi', + SPECIES_NEVREAN = 'icons/obj/clothing/shoes_ch.dmi', + SPECIES_VULPKANIN = 'icons/obj/clothing/shoes_ch.dmi', + SPECIES_ZORREN_HIGH = 'icons/obj/clothing/shoes_ch.dmi', + SPECIES_FENNEC = 'icons/obj/clothing/shoes_ch.dmi', + SPECIES_PROMETHEAN = 'icons/obj/clothing/shoes_ch.dmi', + SPECIES_TESHARI = 'icons/obj/clothing/shoes_ch.dmi', + SPECIES_VASILISSAN = 'icons/obj/clothing/shoes_ch.dmi', + SPECIES_VOX = 'icons/obj/clothing/shoes_ch.dmi' + ) 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 253f3d2f59..c15b14686b 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 @@ -17,13 +17,13 @@ // ai_inactive = TRUE //Always off //VORESTATION AI TEMPORARY REMOVAL show_stat_health = FALSE //We will do it ourselves - response_help = "pets" - response_disarm = "gently pushes aside" - response_harm = "hits" + response_help = "pets the" //CHOMP Edit + response_disarm = "gently pushes aside the " //CHOMP Edit + response_harm = "hits the" //CHOMP Edit - harm_intent_damage = 2 - melee_damage_lower = 10 - melee_damage_upper = 10 + harm_intent_damage = 3 + melee_damage_lower = 5 //CHOMP Edit + melee_damage_upper = 5 //CHOMP Edit attacktext = list("slashed") min_oxy = 0 @@ -36,7 +36,7 @@ max_n2 = 0 minbodytemp = 0 maxbodytemp = 900 - movement_cooldown = 3 + movement_cooldown = 2 //CHOMP Edit var/mob/living/carbon/human/humanform var/obj/item/organ/internal/nano/refactory/refactory @@ -48,7 +48,7 @@ var/human_brute = 0 var/human_burn = 0 - player_msg = "In this form, you can move a little faster, your health will regenerate as long as you have metal in you, and you can ventcrawl!" + player_msg = "In this form, your health will regenerate as long as you have metal in you." //CHOMP Edit removed ventcrawl can_buckle = TRUE //Blobsurfing @@ -64,8 +64,10 @@ humanform = H updatehealth() refactory = locate() in humanform.internal_organs - verbs |= /mob/living/proc/ventcrawl +// verbs |= /mob/living/proc/ventcrawl //CHOMP Removal verbs |= /mob/living/proc/hide + verbs |= /mob/living/simple_mob/protean_blob/proc/rig_transform //CHOMP Addition + verbs |= /mob/living/proc/usehardsuit //CHOMP Addition else update_icon() @@ -267,14 +269,31 @@ if(refactory && istype(A,/obj/item/stack/material)) var/obj/item/stack/material/S = A var/substance = S.material.name - var/list/edible_materials = list("steel", "plasteel", "diamond", "mhydrogen") //Can't eat all materials, just useful ones. - var allowed = FALSE + var/list/edible_materials = list(MAT_STEEL) //Can't eat all materials, just useful ones. + var/allowed = FALSE //CHOMP Edit for(var/material in edible_materials) - if(material == substance) allowed = TRUE + if(material == substance) + allowed = TRUE if(!allowed) return if(refactory.add_stored_material(S.material.name,1*S.perunit) && S.use(1)) visible_message("[name] gloms over some of \the [S], absorbing it.") + else if(isitem(A) && a_intent == "grab") //CHOMP Add all this block, down to I.forceMove. + var/obj/item/I = A + if(!vore_selected) + to_chat(src,"You either don't have a belly selected, or don't have a belly!") + return FALSE + if(is_type_in_list(I,item_vore_blacklist) || I.anchored) + to_chat(src, "You can't eat this.") + return + + if(is_type_in_list(I,edible_trash) | adminbus_trash) + if(I.hidden_uplink) + to_chat(src, "You really should not be eating this.") + message_admins("[key_name(src)] has attempted to ingest an uplink item. ([src ? "JMP" : "null"])") + return + visible_message("[name] stretches itself over the [I], engulfing it whole!") + I.forceMove(vore_selected) else return ..() @@ -283,7 +302,7 @@ 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 allowed = FALSE + var/allowed = FALSE //CHOMP Edit for(var/material in edible_materials) if(material == substance) allowed = TRUE if(!allowed) @@ -292,7 +311,20 @@ visible_message("[name] gloms over some of \the [S], absorbing it.") else return ..() - + +/mob/living/simple_mob/protean_blob/attack_hand(mob/living/L) //CHOMP Add this whole block. + if(L.get_effective_size() >= (src.get_effective_size() + 0.5) ) + src.get_scooped(L) + else + ..() + +/mob/living/simple_mob/protean_blob/MouseDrop(var/atom/over_object) //CHOMP Add this whole block. + if(ishuman(over_object) && usr == src && src.Adjacent(over_object)) + var/mob/living/carbon/human/H = over_object + get_scooped(H, TRUE) + else + return ..() + /mob/living/simple_mob/protean_blob/MouseEntered(location,control,params) if(resting) return @@ -306,6 +338,8 @@ var/global/list/disallowed_protean_accessories = list( // Helpers - Unsafe, WILL perform change. /mob/living/carbon/human/proc/nano_intoblob() + if(loc == /obj/item/weapon/rig/protean) + return var/panel_was_up = FALSE if(client?.statpanel == "Protean") panel_was_up = TRUE @@ -341,6 +375,8 @@ var/global/list/disallowed_protean_accessories = list( things_to_drop -= things_to_not_drop //Crunch the lists things_to_drop -= organs //Mah armbs things_to_drop -= internal_organs //Mah sqeedily spooch + for(var/obj/item/weapon/rig/protean/O in things_to_drop) //CHOMP Add + things_to_drop -= O //CHOMP Add for(var/obj/item/I in things_to_drop) //rip hoarders drop_from_inventory(I) @@ -397,10 +433,44 @@ var/global/list/disallowed_protean_accessories = list( remove_micros(I, root) //Recursion. I'm honestly depending on there being no containment loop, but at the cost of performance that can be fixed too. if(istype(I, /obj/item/weapon/holder)) root.remove_from_mob(I) + +//CHOMP Add start +/mob/living/simple_mob/protean_blob/proc/rig_transform() //CHOMP Add this whole block. + set name = "Modify Form - Hardsuit" + set desc = "Allows a protean blob to solidify its form into one extremely similar to a hardsuit." + set category = "Abilities" + + if(istype(loc, /obj/item/weapon/rig/protean)) + var/obj/item/weapon/rig/protean/prig = loc + src.forceMove(get_turf(prig)) + qdel(prig) + return + + if(isturf(loc)) + var/obj/item/weapon/rig/protean/prig = new(loc) + if(prig) + prig.forceMove(get_turf(src)) + src.forceMove(prig) + return + +/mob/living/proc/usehardsuit() + set name = "Utilize Hardsuit Interface" + set desc = "Allows a protean blob to open hardsuit interface." + set category = "Abilities" + + if(istype(loc, /obj/item/weapon/rig/protean)) + var/obj/item/weapon/rig/protean/prig = loc + to_chat(src, "You attempt to interface with the [prig].") + prig.ui_interact(src, nano_state = interactive_state) + else + to_chat(src, "You are not in RIG form.") +//CHOMP Add end /mob/living/carbon/human/proc/nano_outofblob(var/mob/living/simple_mob/protean_blob/blob) if(!istype(blob)) return + if(blob.loc == /obj/item/weapon/rig/protean) + return var/panel_was_up = FALSE if(client?.statpanel == "Protean") 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 8a84a15331..0580096bc7 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 @@ -1,3 +1,4 @@ +//TODO: Replace ventcrawl with morphing. /mob/living/simple_mob/vore/hostile/morph #define PER_LIMB_STEEL_COST SHEET_MATERIAL_AMOUNT //// // One-part Refactor @@ -18,7 +19,6 @@ to_chat(src,"You don't have a working refactory module!") return - var/choice = input(src,"Pick the bodypart to change:", "Refactor - One Bodypart") as null|anything in species.has_limbs if(!choice) return @@ -81,12 +81,108 @@ //// // Full Refactor //// +/* +/mob/living/carbon/human/proc/nano_regenerate() + set name = "Regenerate" + set desc = "Allows you to regrow limbs and replace organs." + set category = "Abilities" + set hidden = TRUE + + if(nutrition < 250) + to_chat(src, "You lack the energy to begin regeneration!") + return + + if(active_regen) + to_chat(src, "You are already regenerating!") + return + else + active_regen = TRUE + src.visible_message("[src]'s nanites begin to regenerate...") + + + var/mob/living/simple_mob/protean_blob/blob = nano_intoblob() + var/delay_length = round(active_regen_delay * species.active_regen_mult) + if(do_after(blob, delay_length, null, 0)) + if(stat != DEAD) + adjust_nutrition(-200) + species.create_organs(src) + var/obj/item/organ/external/torso = organs_by_name[BP_TORSO] + torso.robotize() //synthetic wasn't defined here. + LAZYCLEARLIST(blood_DNA) + LAZYCLEARLIST(feet_blood_DNA) + blood_color = null + feet_blood_color = null + regenerate_icons() //Probably worth it, yeah. + to_chat(src, "Your regeneration is complete.") //Guarantees the message shows no matter how bad the timing. + to_chat(blob, "Your regeneration is complete!") + else + to_chat(src, "Your regeneration has failed.") + to_chat(blob, "Your regeneration has failed!") + else + to_chat(src, "Your regeneration is interrupted.") + to_chat(blob, "Your regeneration is interrupted!") + active_regen = FALSE + nano_outofblob(blob) + + + + var/delay_length = round(active_regen_delay * species.active_regen_mult) + if(do_after(src,delay_length)) + adjust_nutrition(-200) + + for(var/obj/item/organ/I in internal_organs) + if(I.robotic >= ORGAN_ROBOT) // No free robofix. + continue + if(I.damage > 0) + I.damage = max(I.damage - 30, 0) //Repair functionally half of a dead internal organ. + I.status = 0 // Wipe status, as it's being regenerated from possibly dead. + to_chat(src, "You feel a soothing sensation within your [I.name]...") + + // Replace completely missing limbs. + for(var/limb_type in src.species.has_limbs) + var/obj/item/organ/external/E = src.organs_by_name[limb_type] + + if(E && E.disfigured) + E.disfigured = 0 + if(E && (E.is_stump() || (E.status & (ORGAN_DESTROYED|ORGAN_DEAD|ORGAN_MUTATED)))) + E.removed() + qdel(E) + E = null + if(!E) + var/list/organ_data = src.species.has_limbs[limb_type] + var/limb_path = organ_data["path"] + var/obj/item/organ/O = new limb_path(src) + organ_data["descriptor"] = O.name + to_chat(src, "You feel a slithering sensation as your [O.name] reform.") + + var/agony_to_apply = round(0.66 * O.max_damage) // 66% of the limb's health is converted into pain. + src.apply_damage(agony_to_apply, HALLOSS) + + for(var/organtype in species.has_organ) // Replace completely missing internal organs. -After- external ones, so they all should exist. + if(!src.internal_organs_by_name[organtype]) + var/organpath = species.has_organ[organtype] + var/obj/item/organ/Int = new organpath(src, TRUE) + + Int.rejuvenate(TRUE) + + handle_organs() // Update everything + + update_icons_body() + active_regen = FALSE + else + to_chat(src, "Your regeneration is interrupted!") + adjust_nutrition(-75) + active_regen = FALSE +*/ + /mob/living/carbon/human/proc/nano_regenerate() //fixed the proc, it used to leave active_regen true. set name = "Ref - Whole Body" set desc = "Allows you to regrow limbs and replace organs, given you have enough materials." set category = "Abilities" set hidden = TRUE + + if(stat) to_chat(src,"You must be awake and standing to perform this action!") return @@ -178,7 +274,6 @@ active_regen = FALSE nano_outofblob(blob) - //// // Storing metal //// @@ -223,7 +318,7 @@ visible_message("[src] devours some of the [substance] right off the stack!") else to_chat(src,"You're completely capped out on [substance]!") - + //// // Blob Form //// @@ -269,6 +364,7 @@ //// // Change size //// +/*CHOMP Removal start - I am replacing this with the OG set size. No more metal requirement. /mob/living/carbon/human/proc/nano_set_size() set name = "Adjust Volume" set category = "Abilities" @@ -312,6 +408,7 @@ to_chat(user,"Unfortunately, [cost-actually_added] steel was lost due to lack of storage space.") user.visible_message("Black mist swirls around [user] as they change size.") +CHOMP Removal end*/ /// /// /// A helper to reuse /mob/living/proc/nano_get_refactory(obj/item/organ/internal/nano/refactory/R) @@ -369,11 +466,13 @@ icon_state = "blob" to_call = /mob/living/carbon/human/proc/nano_blobform -/obj/effect/protean_ability/change_volume +/*CHOMP removal start - This doesn't do anything at all now. Normal resize proc is being used instead. +/obj/effect/protean_ability/change_volume //CHOMP Edit ability_name = "Change Volume" - desc = "Alter your size by consuming steel to produce additional nanites, or regain steel by reducing your size and reclaiming them." + desc = "Alter your size between 25% and 200%." //CHOMP Edit - Removed talk about requiring metal icon_state = "volume" to_call = /mob/living/carbon/human/proc/nano_set_size +CHOMP removal end*/ /obj/effect/protean_ability/reform_limb ability_name = "Ref - Single Limb" @@ -386,11 +485,11 @@ desc = "Rebuild your entire body into whatever design you want, assuming you have 10,000 metal." icon_state = "body" to_call = /mob/living/carbon/human/proc/nano_regenerate - + /obj/effect/protean_ability/metal_nom ability_name = "Ref - Store Metals" desc = "Store the metal you're holding. Your refactory can only store steel, and all other metals will be converted into nanites ASAP for various effects." icon_state = "metal" to_call = /mob/living/carbon/human/proc/nano_metalnom -#undef PER_LIMB_STEEL_COST +#undef PER_LIMB_STEEL_COST \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_species.dm b/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_species.dm index 62fe3761db..202ca5da07 100755 --- a/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_species.dm +++ b/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_species.dm @@ -17,7 +17,7 @@ flags = NO_SCAN | NO_SLIP | NO_MINOR_CUT | NO_HALLUCINATION | NO_INFECT | NO_PAIN appearance_flags = HAS_SKIN_COLOR | HAS_EYE_COLOR | HAS_HAIR_COLOR | HAS_UNDERWEAR | HAS_LIPS - spawn_flags = SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED | SPECIES_WHITELIST_SELECTABLE + spawn_flags = SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED | SPECIES_WHITELIST_SELECTABLE health_hud_intensity = 2 num_alternate_languages = 3 assisted_langs = list(LANGUAGE_ROOTLOCAL, LANGUAGE_ROOTGLOBAL, LANGUAGE_VOX) @@ -67,7 +67,7 @@ has_organ = list( O_BRAIN = /obj/item/organ/internal/mmi_holder/posibrain/nano, O_ORCH = /obj/item/organ/internal/nano/orchestrator, - O_FACT = /obj/item/organ/internal/nano/refactory + O_FACT = /obj/item/organ/internal/nano/refactory, ) has_limbs = list( BP_TORSO = list("path" = /obj/item/organ/external/chest/unbreakable/nano), @@ -91,8 +91,8 @@ /mob/living/carbon/human/proc/nano_regenerate, //These verbs are hidden so you can macro them, /mob/living/carbon/human/proc/nano_partswap, /mob/living/carbon/human/proc/nano_metalnom, - /mob/living/carbon/human/proc/nano_blobform, - /mob/living/carbon/human/proc/nano_set_size, + /mob/living/carbon/human/proc/nano_blobform, + /mob/living/proc/set_size, /mob/living/carbon/human/proc/nano_change_fitting, //These verbs are displayed normally, /mob/living/carbon/human/proc/shapeshifter_select_hair, /mob/living/carbon/human/proc/shapeshifter_select_hair_colors, @@ -101,9 +101,14 @@ /mob/living/carbon/human/proc/shapeshifter_select_gender, /mob/living/carbon/human/proc/shapeshifter_select_wings, /mob/living/carbon/human/proc/shapeshifter_select_tail, - /mob/living/carbon/human/proc/shapeshifter_select_ears - ) - + /mob/living/carbon/human/proc/shapeshifter_select_ears, + /mob/living/carbon/human/proc/succubus_drain, + /mob/living/carbon/human/proc/slime_feed, + /mob/living/carbon/human/proc/succubus_drain_finalize, + /mob/living/carbon/human/proc/succubus_drain_lethal, + /mob/living/proc/eat_trash + ) //CHOMP Edit - Added succ stuff that promies have too. Also changed nano_set_size to standard set_size so there is no metal cost. + var/global/list/abilities = list() var/monochromatic = FALSE //IGNORE ME @@ -135,8 +140,8 @@ /datum/species/protean/equip_survival_gear(var/mob/living/carbon/human/H) var/obj/item/stack/material/steel/metal_stack = new() - metal_stack.amount = 3 - + metal_stack.amount = 5 //CHOMP Edit + var/obj/item/clothing/accessory/permit/nanotech/permit = new() permit.set_name(H.real_name) @@ -155,6 +160,9 @@ new_nif.quick_implant(H) else H.nif.durability = rand(21,25) + + var/obj/item/weapon/rig/protean/prig = new /obj/item/weapon/rig/protean(H) + prig.myprotean = H /datum/species/protean/hug(var/mob/living/carbon/human/H, var/mob/living/target) return ..() //Wut @@ -174,7 +182,7 @@ H.ckey = H.temporary_form.ckey QDEL_NULL(H.temporary_form) - to_chat(H, "You died as a Protean. Please sit out of the round for at least 60 minutes before respawning, to represent the time it would take to ship a new-you to the station.") + to_chat(H, "You died as a Protean. Please sit out of the round for at least 5 or 10 minutes before respawning, to represent the time it would take to ship a new-you to the station, depending on how you died.") for(var/obj/item/organ/I in H.internal_organs) I.removed() @@ -189,6 +197,7 @@ H.nano_intoblob() return ..() //Any instakill shot runtimes since there are no organs after this. No point to not skip these checks, going to nullspace anyway. +/*CHOMP Station removal start var/obj/item/organ/internal/nano/refactory/refactory = locate() in H.internal_organs if(refactory && !(refactory.status & ORGAN_DEAD)) @@ -209,6 +218,7 @@ H.add_modifier(/datum/modifier/protean/silver, origin = refactory) return ..() +CHOMP Station removal end*/ /datum/species/protean/get_additional_examine_text(var/mob/living/carbon/human/H) return ..() //Hmm, what could be done here? @@ -230,7 +240,7 @@ for(var/ability in abilities) var/obj/effect/protean_ability/A = ability stat("[A.ability_name]",A.atom_button_text()) - + // Various modifiers /datum/modifier/protean stacks = MODIFIER_STACK_FORBID @@ -261,6 +271,7 @@ if(!refactory.use_stored_material(material_name,material_use)) expire() +/*CHOMP Removal start /datum/modifier/protean/mhydrogen name = "Protean Effect - M.Hydrogen" desc = "You're affected by the presence of metallic hydrogen." @@ -305,6 +316,7 @@ accuracy = 30 evasion = 30 +CHOMP Removal end*/ /datum/modifier/protean/steel name = "Protean Effect - Steel" @@ -328,6 +340,7 @@ else if(O.status & ORGAN_DEAD) O.status &= ~ORGAN_DEAD //Unset dead if we repaired it entirely + // PAN Card /obj/item/clothing/accessory/permit/nanotech name = "\improper P.A.N. card" @@ -349,6 +362,28 @@ . = ..() . += validstring . += registring + +//CHOMP Add start +/mob/living/carbon/human/proc/rig_transform() + set name = "Modify Form - Hardsuit" + set desc = "Allows a protean to solidify its form into one extremely similar to a hardsuit." + set category = "Abilities" + if(istype(loc, /obj/item/weapon/rig/protean)) + var/obj/item/weapon/rig/protean/prig = loc + src.forceMove(get_turf(prig)) + prig.forceMove(src) + return + + if(isturf(loc)) + var/obj/item/weapon/rig/protean/prig + for(var/obj/item/weapon/rig/protean/O in contents) + prig = O + break + if(prig) + prig.forceMove(get_turf(src)) + src.forceMove(prig) + return +//CHOMP Add end #undef DAM_SCALE_FACTOR -#undef METAL_PER_TICK +#undef METAL_PER_TICK \ No newline at end of file diff --git a/icons/mob/feet_ch.dmi b/icons/mob/feet_ch.dmi index 27a4757a62..a098b2a027 100644 Binary files a/icons/mob/feet_ch.dmi and b/icons/mob/feet_ch.dmi differ diff --git a/icons/mob/hands_ch.dmi b/icons/mob/hands_ch.dmi new file mode 100644 index 0000000000..13cccb3df0 Binary files /dev/null and b/icons/mob/hands_ch.dmi differ diff --git a/icons/mob/head_ch.dmi b/icons/mob/head_ch.dmi index fa54729c83..854f1d2676 100644 Binary files a/icons/mob/head_ch.dmi and b/icons/mob/head_ch.dmi differ diff --git a/icons/mob/rig_back.dmi b/icons/mob/rig_back.dmi index dfeea2ece0..826dfdb447 100644 Binary files a/icons/mob/rig_back.dmi and b/icons/mob/rig_back.dmi differ diff --git a/icons/mob/spacesuit_ch.dmi b/icons/mob/spacesuit_ch.dmi new file mode 100644 index 0000000000..c1cd4ba515 Binary files /dev/null and b/icons/mob/spacesuit_ch.dmi differ diff --git a/icons/mob/species/akula/helmet_ch.dmi b/icons/mob/species/akula/helmet_ch.dmi index 24f1ff4a07..14238cb455 100644 Binary files a/icons/mob/species/akula/helmet_ch.dmi and b/icons/mob/species/akula/helmet_ch.dmi differ diff --git a/icons/mob/species/akula/suit_ch.dmi b/icons/mob/species/akula/suit_ch.dmi index ce52ab935e..6ca4733a32 100644 Binary files a/icons/mob/species/akula/suit_ch.dmi and b/icons/mob/species/akula/suit_ch.dmi differ diff --git a/icons/mob/species/fennec/helmet_ch.dmi b/icons/mob/species/fennec/helmet_ch.dmi index 24f1ff4a07..57c666415a 100644 Binary files a/icons/mob/species/fennec/helmet_ch.dmi and b/icons/mob/species/fennec/helmet_ch.dmi differ diff --git a/icons/mob/species/fennec/suit_ch.dmi b/icons/mob/species/fennec/suit_ch.dmi index 6f886d2baf..71d96142e5 100644 Binary files a/icons/mob/species/fennec/suit_ch.dmi and b/icons/mob/species/fennec/suit_ch.dmi differ diff --git a/icons/mob/species/fox/helmet_ch.dmi b/icons/mob/species/fox/helmet_ch.dmi index 24f1ff4a07..57c666415a 100644 Binary files a/icons/mob/species/fox/helmet_ch.dmi and b/icons/mob/species/fox/helmet_ch.dmi differ diff --git a/icons/mob/species/fox/suit_ch.dmi b/icons/mob/species/fox/suit_ch.dmi index 6f886d2baf..71d96142e5 100644 Binary files a/icons/mob/species/fox/suit_ch.dmi and b/icons/mob/species/fox/suit_ch.dmi differ diff --git a/icons/mob/species/sergal/helmet_ch.dmi b/icons/mob/species/sergal/helmet_ch.dmi index 24f1ff4a07..14238cb455 100644 Binary files a/icons/mob/species/sergal/helmet_ch.dmi and b/icons/mob/species/sergal/helmet_ch.dmi differ diff --git a/icons/mob/species/sergal/suit_ch.dmi b/icons/mob/species/sergal/suit_ch.dmi index ce98c97dde..6b7cf3eb75 100644 Binary files a/icons/mob/species/sergal/suit_ch.dmi and b/icons/mob/species/sergal/suit_ch.dmi differ diff --git a/icons/mob/species/skrell/helmet_ch.dmi b/icons/mob/species/skrell/helmet_ch.dmi index 68f6e0951b..3c9ce45d37 100644 Binary files a/icons/mob/species/skrell/helmet_ch.dmi and b/icons/mob/species/skrell/helmet_ch.dmi differ diff --git a/icons/mob/species/skrell/suit_ch.dmi b/icons/mob/species/skrell/suit_ch.dmi index d8ef9a52fe..cc07b90015 100644 Binary files a/icons/mob/species/skrell/suit_ch.dmi and b/icons/mob/species/skrell/suit_ch.dmi differ diff --git a/icons/mob/species/tajaran/helmet_ch.dmi b/icons/mob/species/tajaran/helmet_ch.dmi index f6b7eed222..828823a868 100644 Binary files a/icons/mob/species/tajaran/helmet_ch.dmi and b/icons/mob/species/tajaran/helmet_ch.dmi differ diff --git a/icons/mob/species/tajaran/suit_ch.dmi b/icons/mob/species/tajaran/suit_ch.dmi index d8ef9a52fe..da5aa22ae5 100644 Binary files a/icons/mob/species/tajaran/suit_ch.dmi and b/icons/mob/species/tajaran/suit_ch.dmi differ diff --git a/icons/mob/species/unathi/helmet_ch.dmi b/icons/mob/species/unathi/helmet_ch.dmi index 1d6bec5d6f..f877e2f35b 100644 Binary files a/icons/mob/species/unathi/helmet_ch.dmi and b/icons/mob/species/unathi/helmet_ch.dmi differ diff --git a/icons/mob/species/unathi/suit_ch.dmi b/icons/mob/species/unathi/suit_ch.dmi index 1ce6ef1379..527a45918d 100644 Binary files a/icons/mob/species/unathi/suit_ch.dmi and b/icons/mob/species/unathi/suit_ch.dmi differ diff --git a/icons/mob/species/vox/gloves_ch.dmi b/icons/mob/species/vox/gloves_ch.dmi new file mode 100644 index 0000000000..043d409ab4 Binary files /dev/null and b/icons/mob/species/vox/gloves_ch.dmi differ diff --git a/icons/mob/species/vox/head_ch.dmi b/icons/mob/species/vox/head_ch.dmi new file mode 100644 index 0000000000..5bfd81ffea Binary files /dev/null and b/icons/mob/species/vox/head_ch.dmi differ diff --git a/icons/mob/species/vox/shoes_ch.dmi b/icons/mob/species/vox/shoes_ch.dmi new file mode 100644 index 0000000000..14a1c8ff2e Binary files /dev/null and b/icons/mob/species/vox/shoes_ch.dmi differ diff --git a/icons/mob/species/vox/suit_ch.dmi b/icons/mob/species/vox/suit_ch.dmi new file mode 100644 index 0000000000..58ecc85ca4 Binary files /dev/null and b/icons/mob/species/vox/suit_ch.dmi differ diff --git a/icons/mob/species/vulpkanin/helmet_ch.dmi b/icons/mob/species/vulpkanin/helmet_ch.dmi index c01233fd1b..6eb6c34963 100644 Binary files a/icons/mob/species/vulpkanin/helmet_ch.dmi and b/icons/mob/species/vulpkanin/helmet_ch.dmi differ diff --git a/icons/mob/species/vulpkanin/suit_ch.dmi b/icons/mob/species/vulpkanin/suit_ch.dmi index b32ec0f8bc..a53ab8ceb1 100644 Binary files a/icons/mob/species/vulpkanin/suit_ch.dmi and b/icons/mob/species/vulpkanin/suit_ch.dmi differ diff --git a/icons/obj/clothing/gloves_ch.dmi b/icons/obj/clothing/gloves_ch.dmi new file mode 100644 index 0000000000..f7b14b7a6c Binary files /dev/null and b/icons/obj/clothing/gloves_ch.dmi differ diff --git a/icons/obj/clothing/hats_ch.dmi b/icons/obj/clothing/hats_ch.dmi index c79fdb08b3..3c869c5949 100644 Binary files a/icons/obj/clothing/hats_ch.dmi and b/icons/obj/clothing/hats_ch.dmi differ diff --git a/icons/obj/clothing/shoes_ch.dmi b/icons/obj/clothing/shoes_ch.dmi new file mode 100644 index 0000000000..457561366c Binary files /dev/null and b/icons/obj/clothing/shoes_ch.dmi differ diff --git a/icons/obj/clothing/spacesuits_ch.dmi b/icons/obj/clothing/spacesuits_ch.dmi new file mode 100644 index 0000000000..5f41ee8c75 Binary files /dev/null and b/icons/obj/clothing/spacesuits_ch.dmi differ diff --git a/icons/obj/rig_modules_ch.dmi b/icons/obj/rig_modules_ch.dmi new file mode 100644 index 0000000000..24de8390d9 Binary files /dev/null and b/icons/obj/rig_modules_ch.dmi differ diff --git a/vorestation.dme b/vorestation.dme index 6699f59ee6..e46c73b175 100644 --- a/vorestation.dme +++ b/vorestation.dme @@ -2073,6 +2073,7 @@ #include "code\modules\clothing\spacesuits\rig\modules\specific\vision.dm" #include "code\modules\clothing\spacesuits\rig\modules\specific\voice.dm" #include "code\modules\clothing\spacesuits\rig\suits\alien.dm" +#include "code\modules\clothing\spacesuits\rig\suits\alien_ch.dm" #include "code\modules\clothing\spacesuits\rig\suits\combat.dm" #include "code\modules\clothing\spacesuits\rig\suits\ert.dm" #include "code\modules\clothing\spacesuits\rig\suits\ert_vr.dm"