diff --git a/code/defines/obj/weapon.dm b/code/defines/obj/weapon.dm index 4140aae003..9510661f30 100644 --- a/code/defines/obj/weapon.dm +++ b/code/defines/obj/weapon.dm @@ -542,7 +542,7 @@ throw_range = 10 /obj/item/weapon/chemsprayer - desc = "Chem Sprayer" + desc = "A utility used to spray large amounts of reagent in a given area." icon = 'gun.dmi' name = "chem sprayer" icon_state = "chemsprayer" diff --git a/code/game/atom_procs.dm b/code/game/atom_procs.dm index b4a3d03bae..8181e67e50 100644 --- a/code/game/atom_procs.dm +++ b/code/game/atom_procs.dm @@ -364,6 +364,75 @@ W.afterattack(src, usr, (t5 ? 1 : 0)) else if (istype(usr, /mob/living/carbon/human)) + if (usr:a_intent == "help") + if(istype(src, /mob/living/carbon)) + var/mob/living/carbon/C = src + if(usr:mutations & HEAL) + + if(C.stat != 2) + var/t_him = "it" + if (src.gender == MALE) + t_him = "him" + else if (src.gender == FEMALE) + t_him = "her" + var/u_him = "it" + if (usr.gender == MALE) + t_him = "him" + else if (usr.gender == FEMALE) + t_him = "her" + + if(src != usr) + usr.visible_message( \ + "\blue [usr] places [u_him] palms on [src], healing [t_him]!", \ + "\blue You place your palms on [src] and heal [t_him].", \ + ) + else + usr.visible_message( \ + "\blue [usr] places [u_him] palms on [u_him]self and heals.", \ + "\blue You place your palms on yourself and heal.", \ + ) + + C.oxyloss = max(0, C.oxyloss-25) + C.toxloss = max(0, C.toxloss-25) + + if (istype(C, /mob/living/carbon/human)) + var/mob/living/carbon/human/H = C + var/datum/organ/external/affecting = H.organs["chest"] + + var/t = usr:zone_sel:selecting + + if (t in list("eyes", "mouth")) + t = "head" + + if (H.organs[t]) + affecting = H.organs[t] + + if (affecting.heal_damage(25, 25)) + H.UpdateDamageIcon() + else + H.UpdateDamage() + C.updatehealth() + else + C.heal_organ_damage(25, 25) + + C.cloneloss = max(0, C.cloneloss-25) + + C.stunned = max(0, C.stunned-5) + C.paralysis = max(0, C.paralysis-5) + C.stuttering = max(0, C.stuttering-5) + C.drowsyness = max(0, C.drowsyness-5) + C.weakened = max(0, C.weakened-5) + + if(C.client) + C.updatehealth() + C:handle_regular_hud_updates() + usr:nutrition -= rand(1,10) + usr:handle_regular_hud_updates() + usr.next_move = world.time + 6 + else + usr << "\red [src] is dead and can't be healed." + return + src.attack_hand(usr, usr.hand) else if (istype(usr, /mob/living/carbon/monkey)) @@ -422,6 +491,34 @@ else if (istype(usr, /mob/living/carbon/alien/humanoid)) src.hand_al(usr, usr.hand) + else + if(usr:mutations & LASER && usr:a_intent == "hurt" && world.time >= usr.next_move) + var/turf/oloc + var/turf/T = get_turf(usr) + var/turf/U = get_turf(src) + if(istype(src, /turf)) oloc = src + else + oloc = loc + + if(istype(usr, /mob/living/carbon/human)) + usr:nutrition -= rand(1,5) + usr:handle_regular_hud_updates() + + var/obj/item/projectile/beam/A = new /obj/item/projectile/beam( usr.loc ) + A.icon = 'genetics.dmi' + A.icon_state = "eyelasers" + playsound(usr.loc, 'taser2.ogg', 75, 1) + + A.firer = usr + A.def_zone = usr:get_organ_target() + A.original = oloc + A.current = T + A.yo = U.y - T.y + A.xo = U.x - T.x + spawn( 1 ) + A.process() + + usr.next_move = world.time + 6 return diff --git a/code/game/dna.dm b/code/game/dna.dm index b904223dba..13f41a0f24 100644 --- a/code/game/dna.dm +++ b/code/game/dna.dm @@ -98,6 +98,13 @@ result = copytext(input ,(blocksize*blocknumber)-(blocksize-1),(blocksize*blocknumber)+1) return result +/proc/getblockbuffer(input,blocknumber,blocksize) + var/result[3] + var/block = copytext(input ,(blocksize*blocknumber)-(blocksize-1),(blocksize*blocknumber)+1) + for(var/i = 1, i <= 3, i++) + result[i] = copytext(block, i, i+1) + return result + /proc/setblock(istring, blocknumber, replacement, blocksize) var/result result = getleftblocks(istring, blocknumber, blocksize) + replacement + getrightblocks(istring, blocknumber, blocksize) @@ -344,6 +351,12 @@ M.ear_deaf = 1 M << "\red You can't seem to hear anything..." + /* If you want the new mutations to work, UNCOMMENT THIS. + if(istype(M, /mob/living/carbon)) + for (var/datum/mutations/mut in global_mutations) + mut.check_mutation(M) + */ + //////////////////////////////////////////////////////////// Monkey Block if (isblockon(getblock(M.dna.struc_enzymes, 14,3),14) && istype(M, /mob/living/carbon/human)) // human > monkey diff --git a/code/game/dna_mutations.dm b/code/game/dna_mutations.dm new file mode 100644 index 0000000000..e51ae5926e --- /dev/null +++ b/code/game/dna_mutations.dm @@ -0,0 +1,101 @@ + + +/* NOTES: + +This system could be expanded to migrate all of our current mutations to. Maybe. + + +*/ + + +/* /datum/mutations : + * + * A /datum representation of "hidden" mutations. + * + */ +/datum/mutations + + var/list/requirements = list() // list of randomly-genned requirements + var/required = 1 // the number of requirements to generate + + var/list/races = list("human") // list of races the mutation effects + + proc/get_mutation(var/mob/living/carbon/M) // Called when check_mutation() is successful + ..() + + proc/check_mutation(var/mob/living/carbon/M) // Called in dna.dm, when a target's SE is modified + + if(! ("all" in races)) // "all" means it affects everyone! + if(istype(M, /mob/living/carbon/human)) + if(! ("human" in races)) + return + if(istype(M, /mob/living/carbon/monkey)) + if(! ("monkey" in races)) + return + // TODO: add more races maybe?? + + + var/passes = 0 + for(var/datum/mutationreq/require in requirements) + + var/se_block[] = getblockbuffer(M.dna.struc_enzymes, require.block, 3) // focus onto the block + if(se_block.len == 3) // we want to make sure there are exactly 3 entries + + if(se_block[require.subblock] == require.reqID) + + passes++ + + if(passes == required) // all requirements met + get_mutation(M) + + + Lasereyes + /* + Lets you shoot laser beams through your eyes. Fancy! + */ + required = 2 + + get_mutation(var/mob/living/carbon/M) + M << "\blue You feel a searing heat inside your eyes!" + M.mutations |= LASER + + Healing + /* + Lets you heal other people, and yourself. But it doesn't let you heal dead people. + */ + required = 2 + + get_mutation(var/mob/living/carbon/M) + M << "\blue You a pleasant warmth pulse throughout your body..." + M.mutations |= HEAL + +/* /datum/mutationreq : + * + * A /datum representation of a requirement in order for a mutation to happen. + * + */ + +/datum/mutationreq + var/block // The block to read + var/subblock // The sub-block to read + var/reqID // The required hexadecimal identifier to be equal to the sub-block being read. + + + + +/* +HEY: If you want to be able to get superpowers easily just uncomment this shit. +mob/verb/checkmuts() + for(var/datum/mutations/mut in global_mutations) + + for(var/datum/mutationreq/R in mut.requirements) + src << "Block: [R.block]" + src << "Sub-Block: [R.subblock]" + src << "Required ID: [R.reqID]" + src << "" + +mob/verb/editSE(t as text) + src:dna:struc_enzymes = t + domutcheck(src) + +*/ diff --git a/code/game/gamemodes/setupgame.dm b/code/game/gamemodes/setupgame.dm index 03a70840e0..78c7ac4327 100644 --- a/code/game/gamemodes/setupgame.dm +++ b/code/game/gamemodes/setupgame.dm @@ -42,6 +42,31 @@ avnums.Remove(tempnum) BLINDBLOCK = tempnum + + // HIDDEN MUTATIONS / SUPERPOWERS INITIALIZTION + + for(var/x in typesof(/datum/mutations) - /datum/mutations) + var/datum/mutations/mut = new x + + for(var/i = 1, i <= mut.required, i++) + var/datum/mutationreq/require = new/datum/mutationreq + require.block = rand(1, 13) + require.subblock = rand(1, 3) + + // Create random requirement identification + require.reqID = pick("0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", \ + "B", "C", "D", "E", "F") + + mut.requirements += require + + + global_mutations += mut// add to global mutations list! + + + + + + /* This was used for something before, I think, but is not worth the effort to process now. /proc/setupcorpses() for (var/obj/landmark/A in world) @@ -140,4 +165,3 @@ del(A) continue */ - diff --git a/code/game/machinery/biogenerator.dm b/code/game/machinery/biogenerator.dm index f5c8dbe808..1bf9675773 100644 --- a/code/game/machinery/biogenerator.dm +++ b/code/game/machinery/biogenerator.dm @@ -34,7 +34,7 @@ /obj/machinery/biogenerator/attackby(var/obj/item/O as obj, var/mob/user as mob) if(istype(O, /obj/item/weapon/reagent_containers/glass)) if(beaker) - user << "\red Biogenerator already occuped." + user << "\red The biogenerator already occuped." else user.before_take_item(O) O.loc = src @@ -43,13 +43,13 @@ else if(!istype(O, /obj/item/weapon/reagent_containers/food/snacks/grown)) user << "\red You cannot put this in [src.name]" else if(processing) - user << "\red Biogenerator is processing." + user << "\red The biogenerator is currently processing." else var/i = 0 for(var/obj/item/weapon/reagent_containers/food/snacks/grown/G in contents) i++ if(i >= 10) - user << "\red Biogenerator is fulled! Activate it." + user << "\red The biogenerator is full! Activate it." else user.before_take_item(O) O.loc = src diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index c38034c3e5..948a74b8b8 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -2299,6 +2299,7 @@ var/showadminmessages = 1 message_admins("\blue [key_name_admin(usr)] toggled guests game entering [guests_allowed?"":"dis"]allowed.", 1) + /obj/admins/proc/view_txt_log() set category = "Admin" set desc="Shows todays server log in new window" diff --git a/code/modules/chemical/Chemistry-Recipes.dm b/code/modules/chemical/Chemistry-Recipes.dm index c5b0af08d8..789100780f 100644 --- a/code/modules/chemical/Chemistry-Recipes.dm +++ b/code/modules/chemical/Chemistry-Recipes.dm @@ -543,9 +543,6 @@ datum new /obj/item/weapon/syntiflesh(location) return - - - metroidenzyme name = "Metroid Enzyme" id = "m_enzyme" @@ -602,8 +599,6 @@ datum S.start() return - - metroidchloral name = "Metroid Chloral" id = "m_bunch" diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 7d9cd1c440..b19392dfd8 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -1015,6 +1015,9 @@ if (mutations & PORTALS) overlays += image("icon" = 'genetics.dmi', "icon_state" = "telekinesishead[fat][!lying ? "_s" : "_l"]") + if (mutations & LASER) + overlays += image("icon" = 'genetics.dmi', "icon_state" = "lasereyes[!lying ? "_s" : "_l"]") + if (mutantrace) switch(mutantrace) if("lizard","golem","metroid") diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index d0e4eff1f8..f1b88db155 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -93,7 +93,7 @@ if(organStructure && organStructure.chest) health = organStructure.chest.maxHealth - oxyloss - toxloss - fireloss - bruteloss else - src.health = 100 - src.oxyloss - src.toxloss - src.fireloss - src.bruteloss + src.health = 100 - src.oxyloss - src.toxloss - src.fireloss - src.bruteloss - src.cloneloss else src.health = 100 src.stat = 0 diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm index 2f9276bd9a..e2113f1762 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -287,7 +287,6 @@ mob/new_player else//Adds late joiners to minds so they can be linked to objectives. ticker.minds += character.mind//Cyborgs and AIs handle this in the transform proc. - data_core.manifest_inject(character) // add all the necessary stuff into the manifest del(src) else diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm index 20e97eec20..b84f50aab1 100644 --- a/code/modules/research/designs.dm +++ b/code/modules/research/designs.dm @@ -1071,7 +1071,7 @@ datum id = "largecrossbow" req_tech = list("combat" = 4, "materials" = 5, "engineering" = 3, "biotech" = 4, "syndicate" = 3) build_type = PROTOLATHE - materials = list("$metal" = 5000, "$glass" = 1000) + materials = list("$metal" = 5000, "$glass" = 1000, "$uranium" = 1000, "$silver" = 1000) build_path = "/obj/item/weapon/gun/energy/largecrossbow" freeze_gun diff --git a/code/setup.dm b/code/setup.dm index 0a359ff7c5..03c2c84ae0 100644 --- a/code/setup.dm +++ b/code/setup.dm @@ -146,6 +146,8 @@ #define CLOWN 16 #define FAT 32 #define HUSK 64 //changeling-drained +#define LASER 128 +#define HEAL 256 // channel numbers for power @@ -191,3 +193,6 @@ var/const var/list/accessable_z_levels = list("1" = 10, "3" = 15, "4" = 60, "5" = 15) //This list contains the z-level numbers which can be accessed via space travel and the percentual chances to get there. (Exceptions: extended, sandbox and nuke) -Errorage #define IS_MODE_COMPILED(MODE) (ispath(text2path("/datum/game_mode/"+(MODE)))) + + +var/list/global_mutations = list() // list of hidden mutation things diff --git a/tgstation.dme b/tgstation.dme index db9bae97c0..8a379ee320 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -307,6 +307,7 @@ #include "code\game\chemistry.dm" #include "code\game\communications.dm" #include "code\game\dna.dm" +#include "code\game\dna_mutations.dm" #include "code\game\hud.dm" #include "code\game\landmarks.dm" #include "code\game\master_controller.dm"