diff --git a/baystation12.dme b/baystation12.dme index d4b89dd5549..8e69350ebe7 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -166,7 +166,6 @@ #define FILE_DIR "code/WorkInProgress/Apples" #define FILE_DIR "code/WorkInProgress/Cael_Aislinn" #define FILE_DIR "code/WorkInProgress/Cael_Aislinn/BirdMan" -#define FILE_DIR "code/WorkInProgress/Cael_Aislinn/Jumper" #define FILE_DIR "code/WorkInProgress/Cael_Aislinn/Rust" #define FILE_DIR "code/WorkInProgress/Cael_Aislinn/Supermatter" #define FILE_DIR "code/WorkInProgress/Cael_Aislinn/Tajara" @@ -617,7 +616,6 @@ #include "code\game\mecha\working\firefighter.dm" #include "code\game\mecha\working\ripley.dm" #include "code\game\mecha\working\working.dm" -#include "code\game\objects\biomass.dm" #include "code\game\objects\blood.dm" #include "code\game\objects\bodybag.dm" #include "code\game\objects\bombspawner.dm" @@ -1211,5 +1209,5 @@ #include "code\WorkInProgress\Wrongnumber\weldbackpack.dm" #include "interface\interface.dm" #include "interface\skin.dmf" -#include "maps\Antiqua.dmm" +#include "maps\tgstation.2.0.8.dmm" // END_INCLUDE diff --git a/code/ATMOSPHERICS/components/trinary_devices/filter.dm b/code/ATMOSPHERICS/components/trinary_devices/filter.dm index 624a731e3e1..0c8c8f41345 100755 --- a/code/ATMOSPHERICS/components/trinary_devices/filter.dm +++ b/code/ATMOSPHERICS/components/trinary_devices/filter.dm @@ -108,8 +108,8 @@ Filter types: else filtered_out = null - - filtered_out.update_values() + if(filtered_out) + filtered_out.update_values() air2.merge(filtered_out) air3.merge(removed) diff --git a/code/FEA/FEA_gas_mixture.dm b/code/FEA/FEA_gas_mixture.dm index 18191295325..8edefe79d7b 100644 --- a/code/FEA/FEA_gas_mixture.dm +++ b/code/FEA/FEA_gas_mixture.dm @@ -466,6 +466,8 @@ datum //Outputs: 0 if the self-check failed (local airgroup breaks?) // then -1 if sharer-check failed (sharing airgroup breaks?) // then 1 if both checks pass (share succesful?) + if(!istype(sharer)) + return var/delta_oxygen = QUANTIZE(oxygen_archived - sharer.oxygen_archived)/TRANSFER_FRACTION var/delta_carbon_dioxide = QUANTIZE(carbon_dioxide_archived - sharer.carbon_dioxide_archived)/TRANSFER_FRACTION @@ -552,6 +554,10 @@ datum //Inputs: Air datum to share with //Outputs: Amount of gas exchanged (Negative if lost air, positive if gained.) + + if(!istype(sharer)) + return + var/delta_oxygen = QUANTIZE(oxygen_archived - sharer.oxygen_archived)/TRANSFER_FRACTION var/delta_carbon_dioxide = QUANTIZE(carbon_dioxide_archived - sharer.carbon_dioxide_archived)/TRANSFER_FRACTION var/delta_nitrogen = QUANTIZE(nitrogen_archived - sharer.nitrogen_archived)/TRANSFER_FRACTION diff --git a/code/FEA/FEA_turf_tile.dm b/code/FEA/FEA_turf_tile.dm index fa4081b8afe..38083f52ce0 100644 --- a/code/FEA/FEA_turf_tile.dm +++ b/code/FEA/FEA_turf_tile.dm @@ -378,25 +378,24 @@ turf enemy_tile.consider_pressure_difference(connection_difference, direction) else air_master.active_singletons -= src //not active if not processing! + if(air) + air.react() - air.react() + if(active_hotspot) + if (!active_hotspot.process(possible_fire_spreads)) + return 0 - if(active_hotspot) - if (!active_hotspot.process(possible_fire_spreads)) - return 0 + if(air.temperature > MINIMUM_TEMPERATURE_START_SUPERCONDUCTION) + consider_superconductivity(starting = 1) - if(air.temperature > MINIMUM_TEMPERATURE_START_SUPERCONDUCTION) - consider_superconductivity(starting = 1) + if(air.check_tile_graphic()) + update_visuals(air) - if(air.check_tile_graphic()) - update_visuals(air) - - if(air.temperature > FIRE_MINIMUM_TEMPERATURE_TO_EXIST) -// reset_delay() //hotspots always process quickly - hotspot_expose(air.temperature, CELL_VOLUME) - for(var/atom/movable/item in src) - item.temperature_expose(air, air.temperature, CELL_VOLUME) - temperature_expose(air, air.temperature, CELL_VOLUME) + if(air.temperature > FIRE_MINIMUM_TEMPERATURE_TO_EXIST) + hotspot_expose(air.temperature, CELL_VOLUME) + for(var/atom/movable/item in src) + item.temperature_expose(air, air.temperature, CELL_VOLUME) + temperature_expose(air, air.temperature, CELL_VOLUME) return 1 diff --git a/code/WorkInProgress/Cael_Aislinn/Tajara/tajara_transformation.dm b/code/WorkInProgress/Cael_Aislinn/Tajara/tajara_transformation.dm index e195bd30bb3..c8906cf31df 100644 --- a/code/WorkInProgress/Cael_Aislinn/Tajara/tajara_transformation.dm +++ b/code/WorkInProgress/Cael_Aislinn/Tajara/tajara_transformation.dm @@ -1,30 +1,35 @@ /mob/living/carbon/human/proc/Tajaraize() if (monkeyizing) return - for(var/obj/item/W in src) - drop_from_slot(W) - update_clothing() monkeyizing = 1 canmove = 0 icon = null invisibility = 101 + overlays = list() var/atom/movable/overlay/animation = new /atom/movable/overlay( loc ) animation.icon_state = "blank" animation.icon = 'mob.dmi' animation.master = src flick("h2monkey", animation) - sleep(48) + sleep(18) //animation = null var/mob/living/carbon/human/tajaran/O = new /mob/living/carbon/human/tajaran( loc ) del(animation) del(O.organs) O.organs = organs - for(var/name in O.organs) + for(var/name in O.organs) //Ensuring organ trasnfer var/datum/organ/external/organ = O.organs[name] organ.owner = O for(var/obj/item/weapon/implant/implant in organ.implant) implant.imp_in = O + for(var/obj/hud/H in contents) //Lets not get a duplicate hud + del(H) + for(var/named in vars) //Making them keep their crap. + if(istype(vars[named], /obj/item)) + O.vars[named] = vars[named] + else if (named == "contents") + O.vars[named] = vars[named] O.real_name = real_name O.name = name @@ -32,6 +37,7 @@ updateappearance(O,O.dna.uni_identity) O.loc = loc O.viruses = viruses + O.s_tone = s_tone viruses = list() for(var/datum/disease/D in O.viruses) D.affected_mob = O @@ -42,9 +48,14 @@ client.mob = O if(mind) mind.transfer_to(O) + + del(O.stand_icon) //Force it to update. + del(O.lying_icon) + O.update_body() O.update_face() - O.update_clothing() + spawn(1) + O.update_clothing() O << "You are now a Tajara." spawn(0)//To prevent the proc from returning null. del(src) diff --git a/code/WorkInProgress/Cael_Aislinn/Tajara/tajaran.dm b/code/WorkInProgress/Cael_Aislinn/Tajara/tajaran.dm index de50debbcf0..29f4cc2b95d 100644 --- a/code/WorkInProgress/Cael_Aislinn/Tajara/tajaran.dm +++ b/code/WorkInProgress/Cael_Aislinn/Tajara/tajaran.dm @@ -9,7 +9,7 @@ universal_speak = 1 //hacky fix until someone can figure out how to make them only understand humans taj_talk_understand = 1 voice_message = "mrowls" - examine_text = "one of the cat-like Tajarans." + examine_text = "one of the cat-like Tajarans" /mob/living/carbon/human/tajaran/New() var/g = "m" @@ -28,7 +28,7 @@ ..() /mob/living/carbon/human/tajaran/update_clothing() - ..() +// ..() if (monkeyizing) return @@ -303,7 +303,12 @@ if ( istype(wear_suit, /obj/item/clothing/suit/bio_suit) || istype(wear_suit, /obj/item/clothing/suit/bomb_suit) || istype(wear_suit, /obj/item/clothing/suit/space) ) tail_shown = 0 if(tail_shown) - overlays += image("icon" = icon('tajaran.dmi', "tail_[gender==FEMALE ? "f" : "m"]_[lying ? "l" : "s"]"), "layer" = MOB_LAYER) + var/icon/tail_icon = image("icon" = icon('tajaran.dmi', "tail_[gender==FEMALE ? "f" : "m"]_[lying ? "l" : "s"]"), "layer" = MOB_LAYER) + if (s_tone >= 0) + tail_icon.Blend(rgb(s_tone, s_tone, s_tone), ICON_ADD) + else + tail_icon.Blend(rgb(-s_tone, -s_tone, -s_tone), ICON_SUBTRACT) + overlays += tail_icon if (lying) if (face_lying) @@ -339,7 +344,12 @@ var/datum/organ/external/head = organs["head"] if(!head.destroyed) //if not wearing anything on the head, show the ears - overlays += image("icon" = icon('tajaran.dmi', "ears_[gender==FEMALE ? "f" : "m"]_[lying ? "l" : "s"]"), "layer" = MOB_LAYER) + var/icon/ears_icon = image("icon" = icon('tajaran.dmi', "ears_[gender==FEMALE ? "f" : "m"]_[lying ? "l" : "s"]"), "layer" = MOB_LAYER) + if (s_tone >= 0) + ears_icon.Blend(rgb(s_tone, s_tone, s_tone), ICON_ADD) + else + ears_icon.Blend(rgb(-s_tone, -s_tone, -s_tone), ICON_SUBTRACT) + overlays += ears_icon // Belt if (belt) @@ -589,94 +599,3 @@ /mob/living/carbon/human/tajaran/co2overloadtime = null /mob/living/carbon/human/tajaran/temperature_resistance = T0C+70 - - -/* //This is silly. -- Erthilo -/mob/living/carbon/human/tajaran/Emissary/ - unacidable = 1 - var/aegis = 1 - -/mob/living/carbon/human/tajaran/Emissary/New() - - ..() - - reagents.add_reagent("hyperzine", 5000) //From the dark, to the light, it's a supersonic flight! - // Gotta keep it going! - if (!(mutations & HULK)) - mutations |= HULK - - if (!(mutations & LASER)) - mutations |= LASER - - if (!(mutations & XRAY)) - mutations |= XRAY - sight |= (SEE_MOBS|SEE_OBJS|SEE_TURFS) - see_in_dark = 8 - see_invisible = 2 - - if (!(mutations & COLD_RESISTANCE)) - mutations |= COLD_RESISTANCE - - if (!(mutations & TK)) - mutations |= TK - - if(!(mutations & HEAL)) - mutations |= HEAL - - spawn(0) - while(src) - adjustBruteLoss(-10) - adjustToxLoss(-10) - adjustOxyLoss(-10) - adjustFireLoss(-10) - sleep(10) - - -/mob/living/carbon/human/tajaran/Emissary/ex_act() - return - -/mob/living/carbon/human/tajaran/Emissary/afterattack(atom/target as mob|obj|turf|area, mob/living/user as mob|obj, inrange, params) - if(istype(target , /obj/machinery/door/airlock)) - if(target:locked) - target:locked = 0 - if(!target:density) - return 1 - if(target:operating > 0) - return - if(!ticker) - return 0 - if(!target:operating) - target:operating = 1 - - target:animate("opening") - target:sd_SetOpacity(0) - sleep(10) - target:layer = 2.7 - target:density = 0 - target:update_icon() - target:sd_SetOpacity(0) - target:update_nearby_tiles() - - target:operating = -1 - - user << "You force the door open, shearing the bolts and burning out the motor." - - if(target:operating) - target:operating = -1 - else if(istype(target , /obj/machinery/door/firedoor)) - target:open() - -/mob/living/carbon/human/tajaran/Emissary/Life() - - ..() - - if (!(mutations & HULK)) - mutations |= HULK - - - if((stat == 2) && aegis) - src.show_message("\red [src]'s eyes open suddenlly.", 3, "\red \"I gave a solemn vow to never die for long.\"", 2) - src.heal_overall_damage(9001,9001) - src.stat = 0 - aegis = 0 -*/ \ No newline at end of file diff --git a/code/WorkInProgress/Cael_Aislinn/Tajara/tajaran.dmi b/code/WorkInProgress/Cael_Aislinn/Tajara/tajaran.dmi index 5cb5c4b5c03..6e69669647f 100644 Binary files a/code/WorkInProgress/Cael_Aislinn/Tajara/tajaran.dmi and b/code/WorkInProgress/Cael_Aislinn/Tajara/tajaran.dmi differ diff --git a/code/datums/configuration.dm b/code/datums/configuration.dm index fd0bdb9d05a..e2a03978603 100644 --- a/code/datums/configuration.dm +++ b/code/datums/configuration.dm @@ -47,6 +47,7 @@ var/usewhitelist = 0 var/kick_inactive = 0 //force disconnect for inactive players var/load_jobs_from_txt = 0 + var/usealienwhitelist = 0 var/server var/banappeals @@ -233,6 +234,9 @@ if ("usewhitelist") config.usewhitelist = 1 + if ("usealienwhitelist") + config.usealienwhitelist = 1 + if ("feature_object_spell_system") config.feature_object_spell_system = 1 diff --git a/code/defines/global.dm b/code/defines/global.dm index 963e7b058b5..eea4addf107 100644 --- a/code/defines/global.dm +++ b/code/defines/global.dm @@ -94,6 +94,7 @@ var list/lastsignalers = list( ) //keeps last 100 signals here in format: "[src] used \ref[src] @ location [src.loc]: [freq]/[code]" list/lawchanges = list( ) //Stores who uploaded laws to which silicon-based lifeform, and what the law was list/admins = list( ) + list/alien_whitelist = list( ) list/shuttles = list( ) list/reg_dna = list( ) // list/traitobj = list( ) diff --git a/code/defines/obj/hydro.dm b/code/defines/obj/hydro.dm index 8aaa42b3a2c..c1ad8303a42 100644 --- a/code/defines/obj/hydro.dm +++ b/code/defines/obj/hydro.dm @@ -1044,11 +1044,12 @@ potency = 40 On_Consume() if(!reagents.total_volume) - var/mob/M = usr - var/obj/item/weapon/corncob/W = new /obj/item/weapon/corncob( M ) - M << "You chew on the corn, leaving nothing behind but a cob." - M.put_in_hand(W) - W.add_fingerprint(M) + var/mob/living/M = usr + if(M) + var/obj/item/weapon/corncob/W = new /obj/item/weapon/corncob( M ) + M << "You chew on the corn, leaving nothing behind but a cob." + M.put_in_hand(W) + W.add_fingerprint(M) New() ..() reagents.add_reagent("nutriment", 1+round((potency / 10), 1)) diff --git a/code/game/atom_procs.dm b/code/game/atom_procs.dm index 7174a696249..14096425500 100644 --- a/code/game/atom_procs.dm +++ b/code/game/atom_procs.dm @@ -213,7 +213,8 @@ for(var/obj/effect/decal/cleanable/blood/B in T.contents) if(!B.blood_DNA[M.dna.unique_enzymes]) B.blood_DNA[M.dna.unique_enzymes] = M.dna.b_type - B.virus2 += M.virus2 + if(!B.virus2) + B.virus2 = M.virus2 for(var/datum/disease/D in M.viruses) var/datum/disease/newDisease = new D.type B.viruses += newDisease diff --git a/code/game/cellautomata.dm b/code/game/cellautomata.dm index a862f4cc681..71b46fe5bf5 100644 --- a/code/game/cellautomata.dm +++ b/code/game/cellautomata.dm @@ -85,6 +85,8 @@ src.load_motd() src.load_rules() src.load_admins() + if (config.usealienwhitelist) + load_alienwhitelist() if (config.usewhitelist) load_whitelist() LoadBansjob() diff --git a/code/game/gamemodes/meme/meme.dm b/code/game/gamemodes/meme/meme.dm index 4db573a6293..c362caf4d43 100644 --- a/code/game/gamemodes/meme/meme.dm +++ b/code/game/gamemodes/meme/meme.dm @@ -6,6 +6,7 @@ required_players = 6 restricted_jobs = list("AI", "Cyborg") recommended_enemies = 2 // need at least a meme and a host + votable = 0 // temporarily disable this mode for voting var diff --git a/code/game/jobs/whitelist.dm b/code/game/jobs/whitelist.dm index e81d925bb0c..69fc1b833c9 100644 --- a/code/game/jobs/whitelist.dm +++ b/code/game/jobs/whitelist.dm @@ -13,4 +13,20 @@ var/list/whitelist return 0 return ("[M.ckey]" in whitelist) -#undef WHITELISTFILE \ No newline at end of file +#undef WHITELISTFILE + +proc/load_alienwhitelist() + var/text = file2text("config/alienwhitelist.txt") + if (!text) + diary << "Failed to load config/alienwhitelist.txt\n" + else + alien_whitelist = dd_text2list(text, "\n") + +/proc/is_alien_whitelisted(mob/M, var/species) + if(!alien_whitelist) + return + if(M && species) + for (var/s in alien_whitelist) + if(findtext(s,"[M.ckey] - [species]")) + return 1 + return 0 diff --git a/code/game/machinery/camera.dm b/code/game/machinery/camera.dm index 7b89fe28e6c..7c49605480c 100644 --- a/code/game/machinery/camera.dm +++ b/code/game/machinery/camera.dm @@ -159,7 +159,7 @@ //check other cameras var/obj/machinery/camera/closest = C for(var/obj/machinery/camera/C2 in world) - if (C2.network == src.networks) + if (C2.network in src.networks) if (C2.z == target.z) zmatched = 1 if (C2.status) diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index 2816b3d0998..6b4b2ea12f0 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -193,17 +193,19 @@ del(ghost) //Don't leave ghosts everywhere!! if(!src.occupant.dna) - src.occupant.dna = new /datum/dna( ) + src.occupant.dna = new /datum/dna() if(ui) src.occupant.dna.uni_identity = ui updateappearance(src.occupant, ui) if(se) src.occupant.dna.struc_enzymes = se - randmutb(src.occupant) //Sometimes the clones come out wrong. + for(var/i = 0 to 5) + randmutb(src.occupant) //Sometimes the clones come out wrong. src.occupant:update_face() src.occupant:update_body() src.occupant:mutantrace = mrace src.occupant:suiciding = 0 + occupant.brainloss = 100 src.attempting = 0 return 1 diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm index 84a9ed1356a..2e8b706008b 100644 --- a/code/game/machinery/computer/cloning.dm +++ b/code/game/machinery/computer/cloning.dm @@ -217,8 +217,9 @@ if(2) dat += "

Current records

" dat += "Back

" - for(var/datum/data/record/R in geneticsrecords) - dat += "[R.fields["id"]]-[R.fields["name"]]
" + for(var/id in geneticsrecords) + var/datum/data/record/R = geneticsrecords[id] + dat += "[R.fields["id"]]-[R.fields["name"]]
" if(3) dat += "

Selected Record

" @@ -250,7 +251,7 @@ dat += {"UI: [src.active_record.fields["UI"]]
SE: [src.active_record.fields["SE"]]

"} if(wantspod) - dat += "Clone
" + dat += "Clone
" if(4) if (!src.active_record) @@ -281,7 +282,7 @@ src.scanner.locked = 0 else if (href_list["view_rec"]) - src.active_record = locate(href_list["view_rec"]) + src.active_record = geneticsrecords[href_list["view_rec"]] if ((isnull(src.active_record.fields["ckey"])) || (src.active_record.fields["ckey"] == "")) del(src.active_record) src.temp = "ERROR: Record Corrupt" @@ -299,7 +300,7 @@ var/obj/item/weapon/card/id/C = usr.equipped() if (istype(C)||istype(C, /obj/item/device/pda)) if(src.check_access(C)) - geneticsrecords.Remove(src.active_record) + geneticsrecords.Remove(active_record["id"]) del(src.active_record) src.temp = "Record deleted." src.menu = 2 @@ -359,10 +360,11 @@ src.updateUsrDialog() else if (href_list["clone"]) - var/datum/data/record/C = locate(href_list["clone"]) + var/datum/data/record/C = geneticsrecords[href_list["clone"]] //Look for that player! They better be dead! if(C) var/mob/selected = find_dead_player("[C.fields["ckey"]]") + selected << 'chime.ogg' //probably not the best sound but I think it's reasonable var/answer = alert(selected,"Do you want to return to life?","Cloning","Yes","No") if(answer == "No") selected = null @@ -371,7 +373,7 @@ src.temp = "Unable to initiate cloning cycle." // most helpful error message in THE HISTORY OF THE WORLD else if (src.pod1.growclone(selected, C.fields["name"], C.fields["UI"], C.fields["SE"], C.fields["mind"], C.fields["mrace"], C.fields["interface"],C.fields["changeling"],C.fields["original"])) src.temp = "Cloning cycle activated." - geneticsrecords.Remove(C) + geneticsrecords.Remove(C.fields["id"]) del(C) src.menu = 1 @@ -438,7 +440,7 @@ if (!isnull(subject.mind)) //Save that mind so traitors can continue traitoring after cloning. R.fields["mind"] = "\ref[subject.mind]" - geneticsrecords += R //Save it to the global scan list. + geneticsrecords["[copytext(md5(subject.real_name), 2, 6)]"] = R //Save it to the global scan list. src.temp = "Subject successfully scanned." //Find a specific record by key. diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 144e3d8ce93..b998a79aa9e 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -1612,7 +1612,7 @@ About the new airlock wires panel: name = "CentCom Secure Airlock" desc = "I hope you have insulated gloves...." icon = 'Doorhatchele.dmi' - var/list/mob/morons + var/list/mob/morons = list() pulse(var/wireColor) if(prob(25)) diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm index d286943583d..ffe411981ed 100644 --- a/code/game/machinery/hologram.dm +++ b/code/game/machinery/hologram.dm @@ -31,8 +31,8 @@ Possible to do for anyone motivated enough: /*There are pretty much only three ways to interact here. I don't need to check for client since they're clicking on an object. This may change in the future but for now will suffice.*/ - if(user.client.eye!=src)//Set client eye on the object if it's not already. - user.current = src + if(user.eyeobj.loc!=src.loc)//Set client eye on the object if it's not already. + user.eyeobj.loc = src.loc user.reset_view(src) else if(!hologram)//If there is no hologram, possibly make one. activate_holo(user) @@ -41,7 +41,7 @@ Possible to do for anyone motivated enough: return /obj/machinery/hologram/holopad/proc/activate_holo(mob/living/silicon/ai/user) - if(!(stat & NOPOWER)&&user.client.eye==src)//If the projector has power and client eye is on it. + if(!(stat & NOPOWER)&&user.eyeobj.loc==src.loc)//If the projector has power and client eye is on it. if(!hologram)//If there is not already a hologram. create_holo(user)//Create one. for(var/mob/M in viewers()) @@ -91,7 +91,7 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/ /obj/machinery/hologram/holopad/process() if(hologram)//If there is a hologram. - if(master&&!master.stat&&master.client&&master.client.eye==src)//If there is an AI attached, it's not incapacitated, it has a client, and the client eye is centered on the projector. + if(master&&!master.stat&&master.client&&master.eyeobj.loc==src.loc)//If there is an AI attached, it's not incapacitated, it has a client, and the client eye is centered on the projector. if( !(get_dist(src,hologram.loc)>3||stat & NOPOWER) )//If the hologram is not out of bounds and the machine has power. return 1 clear_holo()//If not, we want to get rid of the hologram. diff --git a/code/game/magic/cultist/ritual.dm b/code/game/magic/cultist/ritual.dm index 2c834a06ea7..5b4cb7f5c88 100644 --- a/code/game/magic/cultist/ritual.dm +++ b/code/game/magic/cultist/ritual.dm @@ -562,6 +562,8 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology", R.word2 = w2 R.word3 = w3 R.check_icon() + if(!R.blood_DNA) + R.blood_DNA = list() R.blood_DNA[H.dna.unique_enzymes] = H.dna.b_type return else diff --git a/code/game/objects/biomass.dm b/code/game/objects/biomass.dm index 1bfca36eef7..f9a52da417e 100644 --- a/code/game/objects/biomass.dm +++ b/code/game/objects/biomass.dm @@ -1,3 +1,5 @@ +//UNTICKED DUE TO BUGGY SHIT + /obj/effect/biomass icon = 'biomass.dmi' icon_state = "stage1" diff --git a/code/game/objects/devices/PDA/cart.dm b/code/game/objects/devices/PDA/cart.dm index 1cbde9ffcef..0c750fed264 100644 --- a/code/game/objects/devices/PDA/cart.dm +++ b/code/game/objects/devices/PDA/cart.dm @@ -466,7 +466,7 @@ Code: else for(var/obj/machinery/bot/mulebot/B in QC.botlist) - menu += "[B] at [B.loc.loc]
" + menu += "[B] at [get_area(B)]
" menu += "
Scan for active bots
" diff --git a/code/game/objects/items/item.dm b/code/game/objects/items/item.dm index 09f51e302bc..7e269078e85 100755 --- a/code/game/objects/items/item.dm +++ b/code/game/objects/items/item.dm @@ -78,21 +78,24 @@ obj/item/verb/pick_up() if(!(usr)) return - if((!istype(usr, /mob/living/carbon)) || (istype(usr, /mob/living/carbon/brain))) + if((!istype(usr, /mob/living/carbon)) || (istype(usr, /mob/living/carbon/brain)))//Is humanoid, and is not a brain usr << "\red You can't pick things up!" return - if(!istype(src.loc, /turf) || usr.stat || usr.restrained() ) + if( usr.stat || usr.restrained() )//Is not asleep/dead and is not restrained usr << "\red You can't pick things up!" return - if(src.anchored) + if(src.anchored) //Object isn't anchored usr << "\red You can't pick that up!" return - if(!usr.hand && usr.r_hand) + if(!usr.hand && usr.r_hand) //Right hand is not full usr << "\red Your right hand is full." return - if(usr.hand && usr.l_hand) + if(usr.hand && usr.l_hand) //Left hand is not full usr << "\red Your left hand is full." return + if(!istype(src.loc, /turf)) //Object is on a turf + usr << "\red You can't pick that up!" + return //All checks are done, time to pick it up! if(istype(usr, /mob/living/carbon/human)) src.attack_hand(usr) diff --git a/code/game/objects/radio/radio.dm b/code/game/objects/radio/radio.dm index e68dc18c11a..5a6a212d4f7 100644 --- a/code/game/objects/radio/radio.dm +++ b/code/game/objects/radio/radio.dm @@ -729,10 +729,12 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use ..() /obj/item/device/radio/proc/config(op) - for (var/ch_name in channels) - radio_controller.remove_object(src, radiochannels[ch_name]) + if(radio_controller) + for (var/ch_name in channels) + radio_controller.remove_object(src, radiochannels[ch_name]) secure_radio_connections = new channels = op - for (var/ch_name in op) - secure_radio_connections[ch_name] = radio_controller.add_object(src, radiochannels[ch_name], RADIO_CHAT) + if(radio_controller) + for (var/ch_name in op) + secure_radio_connections[ch_name] = radio_controller.add_object(src, radiochannels[ch_name], RADIO_CHAT) return diff --git a/code/game/objects/stool.dm b/code/game/objects/stool.dm index 26882cfba12..00849d24d2c 100644 --- a/code/game/objects/stool.dm +++ b/code/game/objects/stool.dm @@ -71,7 +71,7 @@ "You hear metal clanking") else buckled_mob.visible_message(\ - "\blue [buckled_mob.name] unbuckled himself!",\ + "\blue [buckled_mob.name] unbuckles!",\ "You unbuckle yourself from [src].",\ "You hear metal clanking") unbuckle() diff --git a/code/game/verbs/ooc.dm b/code/game/verbs/ooc.dm index 74be8571d0f..4b4d39d32b3 100644 --- a/code/game/verbs/ooc.dm +++ b/code/game/verbs/ooc.dm @@ -1,5 +1,5 @@ /mob/verb/listen_ooc() - set name = "Un/Mute OOC" + set name = "Hear/Stop Hearing OOC" set category = "OOC" if (src.client) diff --git a/code/modules/DetectiveWork/detective_work.dm b/code/modules/DetectiveWork/detective_work.dm index deaa37ee5a2..807fd6296ef 100644 --- a/code/modules/DetectiveWork/detective_work.dm +++ b/code/modules/DetectiveWork/detective_work.dm @@ -238,9 +238,8 @@ obj/machinery/computer/forensic_scanning var/list/blood = outputs[3] if(blood && blood.len) temp += " Blood:
" - for(var/j = 1, j <= blood.len, j++) - var/list/templist2 = blood[j] - temp += "      Type: [templist2[2]], DNA: [templist2[1]]
" + for(var/named in blood) + temp += "      Type: [blood[named]], DNA: [named]
" temp += "
{Delete this Dossier}" temp += "
{Print}" else diff --git a/code/modules/chemical/Chemistry-Reagents.dm b/code/modules/chemical/Chemistry-Reagents.dm index aa59d4153d5..4ac979182f3 100644 --- a/code/modules/chemical/Chemistry-Reagents.dm +++ b/code/modules/chemical/Chemistry-Reagents.dm @@ -104,7 +104,7 @@ datum on_mob_life(var/mob/living/M) if(!data || !data["blood_type"]) ..() - else if(istype(M, /mob/living/carbon/human) && blood_incompatible(data["blood_type"],M.dna.b_type)) + else if(istype(M, /mob/living/carbon/human) && blood_incompatible(data["blood_type"],M.dna.b_type) && !M.changeling) M.adjustToxLoss(rand(0.5,1.5)) M.adjustOxyLoss(rand(1,1.5)) ..() @@ -1862,7 +1862,7 @@ datum on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom - if(prob(50)) M:heal_organ_damage(1,0) + if(prob(1)) M:heal_organ_damage(0.5,0) //This should stop being able to heal out of crit from eating a donut M:nutrition += nutriment_factor // For hunger and fatness /* // If overeaten - vomit and fall down diff --git a/code/modules/chemical/Chemistry-Tools.dm b/code/modules/chemical/Chemistry-Tools.dm index 77735e6ccc9..ac56d023d08 100644 --- a/code/modules/chemical/Chemistry-Tools.dm +++ b/code/modules/chemical/Chemistry-Tools.dm @@ -185,9 +185,10 @@ if(W:amount >= 1) playsound(src.loc, 'Deconstruct.ogg', 50, 1) if(do_after(user, 20)) - W:use(1) - user << "\blue You put in the glass lens." - src.state = 5 + if(W) + W:use(1) + user << "\blue You put in the glass lens." + src.state = 5 if(5) if(istype(W, /obj/item/weapon/crowbar)) playsound(src.loc, 'Crowbar.ogg', 50, 1) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 0c0cf53e91a..b73ded273d0 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -20,6 +20,7 @@ var/g_eyes = 0.0 var/b_eyes = 0.0 var/s_tone = 0.0 + var/species = "Human" age = 30.0 var/used_skillpoints = 0 var/skill_specialization = null diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 48f22381d62..ffb3d985a1b 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -872,7 +872,7 @@ if(E.name == "l_hand" || E.name == "l_arm") if(hand && equipped()) drop_item() - emote("custom v drops what they were holding, their limb malfunctioning!") + emote("custom v drops what they were holding, their [E] malfunctioning!") var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread() spark_system.set_up(5, 0, src) spark_system.attach(src) @@ -882,7 +882,7 @@ else if(E.name == "r_hand" || E.name == "r_arm") if(!hand && equipped()) drop_item() - emote("custom v drops what they were holding, their limb malfunctioning!") + emote("custom v drops what they were holding, their [E] malfunctioning!") var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread() spark_system.set_up(5, 0, src) spark_system.attach(src) @@ -915,6 +915,15 @@ var/blood_volume = round(vessel.get_reagent_amount("blood")) if(bloodloss) drip(bloodloss) + else if(blood_volume < 560 && blood_volume) + var/datum/reagent/blood/B = locate() in vessel //Grab some blood + if(!B.data["donor"] == src) //If it's not theirs, then we look for theirs + for(var/datum/reagent/blood/D in vessel) + if(D.data["donor"] == src) + B = D + break + //At this point, we dun care which blood we are adding to, as long as they get more blood. + B.volume = max(min(B.volume + 560/blood_volume,560), 0) //Less blood = More blood generated per tick if(!blood_volume) bloodloss = 0 else if(blood_volume > 448) diff --git a/code/modules/mob/living/silicon/ai/move.dm b/code/modules/mob/living/silicon/ai/move.dm index 511b1985f0c..bcc83fe137a 100644 --- a/code/modules/mob/living/silicon/ai/move.dm +++ b/code/modules/mob/living/silicon/ai/move.dm @@ -20,7 +20,7 @@ return//Whatever the case, return since you can't move anyway. if(user.client)//To make AI holograms work. They will relay directions as long as they are centered on the object. - var/obj/machinery/hologram/holopad/T = user.client.eye//Client eye centers on an object. + var/obj/machinery/hologram/holopad/T = user.current//Client eye centers on an object. if(istype(T)&&T.hologram&&T.master==user)//If there is a hologram and its master is the user. T.hologram.loc = get_step(T.hologram, direct) T.hologram.dir = direct diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm index dc3f193c4de..193dc7729ad 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -392,7 +392,11 @@ proc/create_character() spawning = 1 - var/mob/living/carbon/human/new_character = new(loc) + var/mob/living/carbon/human/new_character // var/path/to/object/varname + if(preferences.species == "Tajaran") + new_character = new /mob/living/carbon/human/tajaran(loc) // varname = new /path/to/object(location_to_spawn_at) + else + new_character = new /mob/living/carbon/human(loc) new_character.lastarea = get_area(loc) close_spawn_windows() @@ -403,8 +407,9 @@ preferences.randomize_appearance_for(new_character) else preferences.copy_to(new_character) - - src << sound(null, repeat = 0, wait = 0, volume = 85, channel = 1) // MAD JAMS cant last forever yo + if(preferences.species == "Soghun") //This probably shouldn't be here, but I can't think of any other way + new_character.mutantrace = "lizard" + src << sound(null, repeat = 0, wait = 0, volume = 85, channel = 1) new_character.dna.ready_dna(new_character) preferences.copydisabilities(new_character) diff --git a/code/modules/mob/new_player/preferences.dm b/code/modules/mob/new_player/preferences.dm index 548c7817b86..0e26e085157 100644 --- a/code/modules/mob/new_player/preferences.dm +++ b/code/modules/mob/new_player/preferences.dm @@ -90,6 +90,9 @@ datum/preferences g_facial = 0 b_facial = 0 + //Species + species = "Human" + //Skin color s_tone = 0 @@ -281,6 +284,7 @@ datum/preferences dat += "
Body " dat += "(®)" // Random look dat += "
" + dat += "Species: [species]
" dat += "Blood Type: [b_type]
" dat += "Skin Tone: [-s_tone + 35]/220
" @@ -696,6 +700,23 @@ datum/preferences if("random") b_type = pickweight ( list ("A+" = 31, "A-" = 7, "B+" = 8, "B-" = 2, "AB+" = 2, "AB-" = 1, "O+" = 40, "O-" = 9)) + if(link_tags["species"]) + switch(link_tags["species"]) + if("input") + var/list/new_species = list("Human") + if(config.usealienwhitelist) //If we're using the whitelist, make sure to check it! + if((is_alien_whitelisted(user, "Soghun")) || ((user.client) && (user.client.holder) && (user.client.holder.level) && (user.client.holder.level >= 5))) //Check for Soghun and admins + new_species += "Soghun" + if((is_alien_whitelisted(user, "Tajaran")) || ((user.client) && (user.client.holder) && (user.client.holder.level) && (user.client.holder.level >= 5))) //Check for Tajaran + new_species += "Tajaran" + else //Not using the whitelist? Aliens for everyone! + new_species += "Tajaran" + new_species += "Soghun" + species = input("Please select a species", "Character Generation", null) in new_species + h_style = "Bald" //Try not to carry face/head hair over. + f_style = "Shaved" + hair_style = new/datum/sprite_accessory/hair/bald + facial_hair_style = new/datum/sprite_accessory/facial_hair/shaved if(link_tags["hair"]) switch(link_tags["hair"]) @@ -735,14 +756,18 @@ datum/preferences if("random") randomize_skin_tone() if("input") - var/new_tone = input(user, "Please select skin tone level: 1-220 (1=albino, 35=caucasian, 150=black, 220='very' black)", "Character Generation") as text + var/new_tone = input(user, "Please select skin tone level: 1-220 (1=albino, 35=caucasian, 150=black, 220='very' black) or 20-70 for Tajarans", "Character Generation") as text if(new_tone) - s_tone = max(min(round(text2num(new_tone)), 220), 1) + if(species == "Tajaran") + s_tone = max(min(round(text2num(new_tone)), 70), 20) + else + s_tone = max(min(round(text2num(new_tone)), 220), 1) s_tone = -s_tone + 35 if(link_tags["h_style"]) + if(species != "Human") + return switch(link_tags["h_style"]) - // New and improved hair selection code, by Doohl if("random") // random hair selection @@ -785,6 +810,8 @@ datum/preferences src.ooccolor = ooccolor if(link_tags["f_style"]) + if(species != "Human") //Tajarans and Soghuns don't have hair stuff yet. + return switch(link_tags["f_style"]) // see above for commentation. This is just a slight modification of the hair code for facial hairs diff --git a/code/modules/mob/new_player/preferences_setup.dm b/code/modules/mob/new_player/preferences_setup.dm index 1fc8921a9f8..49be3db4503 100644 --- a/code/modules/mob/new_player/preferences_setup.dm +++ b/code/modules/mob/new_player/preferences_setup.dm @@ -209,7 +209,15 @@ datum/preferences else if (gender == FEMALE) g = "f" - preview_icon = new /icon('human.dmi', "body_[g]_s", "dir" = preview_dir) + if(species == "Tajaran") + preview_icon = new /icon('tajaran.dmi', "body_[g]_s", "dir" = preview_dir) + else if(species == "Soghun") + if(g == "m") + preview_icon = new /icon('genetics.dmi', "lizard_male_s", "dir" = preview_dir) + else if(g == "f") + preview_icon = new /icon('genetics.dmi', "lizard_female_s", "dir" = preview_dir) + else + preview_icon = new /icon('human.dmi', "body_[g]_s", "dir" = preview_dir) // Skin tone if (s_tone >= 0) diff --git a/code/modules/mob/new_player/savefile.dm b/code/modules/mob/new_player/savefile.dm index 48f44415f76..177248d4ab8 100644 --- a/code/modules/mob/new_player/savefile.dm +++ b/code/modules/mob/new_player/savefile.dm @@ -131,6 +131,7 @@ datum/preferences/proc/savefile_save(mob/user, slot) F["eyes_green"] << src.g_eyes F["eyes_blue"] << src.b_eyes F["blood_type"] << src.b_type + F["species"] << src.species F["underwear"] << src.underwear F["backbag"] << src.backbag F["backbag"] << src.backbag @@ -206,6 +207,8 @@ datum/preferences/proc/savefile_load(mob/user, slot) F["eyes_green"] >> src.g_eyes F["eyes_blue"] >> src.b_eyes F["blood_type"] >> src.b_type + F["species"] >> src.species + if(isnull(species)) species = "Human" F["underwear"] >> src.underwear if(underwear == 0) underwear = 6 //For old players who have 0 in their savefile F["backbag"] >> src.backbag diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm index e9a9486442d..d5575e28ae5 100644 --- a/code/modules/mob/transform_procs.dm +++ b/code/modules/mob/transform_procs.dm @@ -23,7 +23,7 @@ del(O.organs) O.organs = organs for(var/name in O.organs) - var/datum/organ/external/organ = O[name] + var/datum/organ/external/organ = O.organs[name] organ.owner = O for(var/obj/item/weapon/implant/implant in organ.implant) implant.imp_in = O @@ -390,18 +390,8 @@ O << "4.) Your laws are not in preference, laws do not take preference over one another unless specifically stated in the law." O << "
We want everyone to have a good time, so we, the admins, will try to correct you if you stray from these rules. Just try to keep it sensible." -//If you add a verb here, make sure to add it to silicon\ai\ai.dm too. - O.verbs += /mob/living/silicon/ai/proc/ai_call_shuttle - O.verbs += /mob/living/silicon/ai/proc/show_laws_verb - O.verbs += /mob/living/silicon/ai/proc/ai_camera_track - O.verbs += /mob/living/silicon/ai/proc/ai_alerts - O.verbs += /mob/living/silicon/ai/proc/ai_camera_list - O.verbs += /mob/living/silicon/ai/proc/ai_network_change - O.verbs += /mob/living/silicon/ai/proc/ai_statuschange - O.verbs += /mob/living/silicon/ai/proc/ai_hologram_change - O.verbs += /mob/living/silicon/ai/proc/ai_roster + O.verbs += AI_VERB_LIST -// O.verbs += /mob/living/silicon/ai/proc/ai_cancel_call O.job = "AI" spawn(0) diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index 7f25de3258d..d83533c369d 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -150,23 +150,23 @@ if(usr /*&& !usr.stat*/) usr << "A control terminal for the area electrical systems." if(stat & BROKEN) - usr << "Looks broken." + usr << "It looks broken." return if(opened) if(has_electronics && terminal) usr << "The cover is [opened==2?"removed":"open"] and the power cell is [ cell ? "installed" : "missing"]." else if (!has_electronics && terminal) - usr << "There are some wires but no any electronics." + usr << "There are some wires but no electronics." else if (has_electronics && !terminal) - usr << "Electronics installed but not wired." + usr << "There are electronics installed but they're not wired." else /* if (!has_electronics && !terminal) */ - usr << "There is no electronics nor connected wires." + usr << "There are no electronics or any connected wires." else if (stat & MAINT) - usr << "The cover is closed. Something is wrong with it, it doesn't work." + usr << "The cover is closed. It looks like it 's not working." else if (malfhack) - usr << "The cover is broken. It may be hard to force it open." + usr << "The cover is broken. It looks like it'll be hard to force open." else usr << "The cover is closed." @@ -213,7 +213,7 @@ if (istype(W, /obj/item/weapon/crowbar) && opened) if (has_electronics==1) if (terminal) - user << "\red Disconnect wires first." + user << "\red You need to cut the wires first." return playsound(src.loc, 'Crowbar.ogg', 50, 1) user << "You try to remove the power control board..." @@ -222,7 +222,7 @@ if ((stat & BROKEN) || malfhack) user.visible_message(\ "\red [user.name] has broken the power control board inside [src.name]!",\ - "You broke the charred power control board and remove the remains.", + "You break the charred power control board and remove the remains.", "You hear a crack!") //ticker.mode:apcs-- //XSI said no and I agreed. -rastaf0 else @@ -238,7 +238,7 @@ user.visible_message("\red [user] starts removing the broken APC cover with \the [W]!", \ "\red You start removing the broken APC cover!") if(do_after(user, 50)) - user.visible_message("\red The broken APC cover was removed with \the [W] by [user.name]!", \ + user.visible_message("\red [user.name] removes the broken APC cover with \the [W]!", \ "\red You remove the broken APC cover with your [W.name]!") opened = 2 cover_unscrewed = 0 @@ -254,24 +254,24 @@ updateicon() else if (istype(W, /obj/item/weapon/cell) && opened) // trying to put a cell inside if(cell) - user << "There is a power cell already installed." + user << "There's a power cell installed already." return else if (stat & MAINT) - user << "\red There is no any connector for your power cell." + user << "\red There aren't any connectors for the power cell." return user.drop_item() W.loc = src cell = W user.visible_message(\ - "\red [user.name] has inserted the power cell to [src.name]!",\ + "\red [user.name] has inserted the power cell into [src.name]!",\ "You insert the power cell.") chargecount = 0 updateicon() else if (istype(W, /obj/item/weapon/screwdriver)) // haxing if(opened) if (cell) - user << "\red Remove the power cell first." //FUCK YOU, USEFUL MESSAGES ARE GOOD + user << "\red You need to remove the power cell first." //FUCK YOU, USEFUL MESSAGES ARE GOOD return else if (has_electronics==1 && terminal) @@ -285,7 +285,7 @@ playsound(src.loc, 'Screwdriver.ogg', 50, 1) user << "You unfasten the electronics." else /* has_electronics==0 */ - user << "\red There is nothing to secure." + user << "\red There's nothing to secure here." return updateicon() else if((stat & BROKEN) || malfhack) @@ -293,12 +293,12 @@ user.visible_message("\red [user] starts unscrewing the broken APC cover with \the [W]!", \ "\red You start unscrewing the broken APC cover!") if(do_after(user, 50)) - user.visible_message("\red The broken APC cover was unscrewed with \the [W] by [user.name]!", \ + user.visible_message("\red [user.name] unscrews the broken APC cover with \the [W]!", \ "\red You unscrew the broken APC cover with your [W.name]!") cover_unscrewed = 1 updateicon() else if(emagged) - user << "The interface is broken." + user << "The interface seems broken." else wiresexposed = !wiresexposed user << "The wires have been [wiresexposed ? "exposed" : "unexposed"]" @@ -306,11 +306,11 @@ else if (istype(W, /obj/item/weapon/card/id)||istype(W, /obj/item/device/pda)) // trying to unlock the interface with an ID card if(emagged) - user << "The interface is broken." + user << "The interface seems broken." else if(opened) - user << "You must close the cover to swipe an ID card." + user << "You have to close the cover to swipe an ID card." else if(wiresexposed) - user << "You must close the panel" + user << "You have to close the panel." else if(stat & (BROKEN|MAINT)) user << "Nothing happens." else @@ -328,9 +328,9 @@ else return if(opened) - user << "You must close the cover to swipe an ID card." + user << "You have to close the cover to swipe an ID card." else if(wiresexposed) - user << "You must close the panel first" + user << "You have to close the panel first" else if(stat & (BROKEN|MAINT)) user << "Nothing happens." else @@ -345,7 +345,7 @@ user << "You fail to [ locked ? "unlock" : "lock"] the APC interface." else if (istype(W, /obj/item/weapon/cable_coil) && !terminal && opened && has_electronics!=2) if (src.loc:intact) - user << "\red There is no floor with the plating revealed in front of the APC." + user << "\red You have to remove the floor plating in front of the APC first." return var/obj/item/weapon/cable_coil/C = W if(C.amount < 10) @@ -369,7 +369,7 @@ terminal.connect_to_network() else if (istype(W, /obj/item/weapon/wirecutters) && terminal && opened && has_electronics!=2) if (src.loc:intact) - user << "\red You must remove the floor plating in front of the APC first." + user << "\red You have to remove the floor plating in front of the APC first." return user << "You begin to cut cables..." playsound(src.loc, 'Deconstruct.ogg', 50, 1) @@ -381,11 +381,11 @@ return new /obj/item/weapon/cable_coil(loc,10) user.visible_message(\ - "\red [user.name] cut cables and dismantled the power terminal.",\ - "You cut cables and dismantle the power terminal.") + "\red [user.name] cuts the cables and dismantles the power terminal.",\ + "You cut the cable and dismantle the power terminal.") del(terminal) else if (istype(W, /obj/item/weapon/module/power_control) && opened && has_electronics==0 && !((stat & BROKEN) || malfhack)) - user << "You try to insert the power control board into the frame..." + user << "You start to insert the power control board into the frame..." playsound(src.loc, 'Deconstruct.ogg', 50, 1) if(do_after(user, 10)) has_electronics = 1 @@ -396,7 +396,7 @@ return else if (istype(W, /obj/item/weapon/weldingtool) && W:welding && opened && has_electronics==0 && !terminal) if (W:get_fuel() < 3) - user << "\blue You need more welding fuel to complete this task." + user << "\blue You need more welding fuel to do this." return user << "You start welding APC frame..." if(W:remove_fuel(0,user)) @@ -407,13 +407,13 @@ if (emagged || malfhack || (stat & BROKEN) || opened==2) new /obj/item/stack/sheet/metal(loc) user.visible_message(\ - "\red [src] has been cut apart by [user.name] with the weldingtool.",\ - "You disassembled the broken APC frame.",\ + "\red \The [src] has been cut apart by [user.name] with the welding tool.",\ + "You disassemble the broken APC frame.",\ "\red You hear welding.") else new /obj/item/apc_frame(loc) user.visible_message(\ - "\red [src] has been cut from the wall by [user.name] with the weldingtool.",\ + "\red \The [src] has been cut from the wall by [user.name] with the welding tool.",\ "You cut APC frame from the wall.",\ "\red You hear welding.") W:welding = 1 @@ -424,19 +424,19 @@ if (opened==2) opened = 1 user.visible_message(\ - "\red [user.name] has replaced the damaged APC frontal panel with a new one.",\ - "You replace the damaged APC frontal panel with a new one.") + "\red [user.name] replaces the damaged APC panel with a new one.",\ + "You replace the damaged APC panel with a new one.") del(W) updateicon() else if (istype(W, /obj/item/apc_frame) && opened && ((stat & BROKEN) || malfhack)) if (has_electronics) - user << "You cannot repair this APC until you remove the electronics still inside." + user << "You cannot repair this APC until you remove the electronics inside." return user << "You begin to replace the damaged APC frame..." if(do_after(user, 50)) user.visible_message(\ - "\red [user.name] has replaced the damaged APC frame with new one.",\ - "You replace the damaged APC frame with new one.") + "\red [user.name] has replaced the damaged APC frame with a new one.",\ + "You replace the damaged APC frame with a new one.") del(W) stat &= ~BROKEN malfai = null @@ -452,8 +452,8 @@ && W.w_class >= 3.0 \ && prob(20) ) opened = 2 - user.visible_message("\red The APC cover was knocked down with the [W.name] by [user.name]!", \ - "\red You knock down the APC cover with your [W.name]!", \ + user.visible_message("\red The APC cover has been knocked down with \the [W.name] by [user.name]!", \ + "\red You knock down the APC cover with \the [W.name]!", \ "You hear a loud bang!") updateicon() else @@ -463,9 +463,9 @@ (istype(W, /obj/item/device/multitool) || \ istype(W, /obj/item/weapon/wirecutters))) return src.attack_hand(user) - user.visible_message("\red The [src.name] has been hit with the [W.name] by [user.name]!", \ - "\red You hit the [src.name] with your [W.name]!", \ - "You hear bang") + user.visible_message("\red The [src.name] has been hit with \the [W.name] by [user.name]!", \ + "\red You hit the [src.name] with \the [W.name]!", \ + "You hear a banging sound.") // attack with hand - remove cell (if cover open) or interact with the APC @@ -769,7 +769,7 @@ (istype(robot) && (robot in malfai.connected_robots)) \ ) \ ) - user << "\red \The [src] have AI control disabled!" + user << "\red \The [src] has it's AI control disabled!" user << browse(null, "window=apc") user.machine = null return 0 @@ -782,10 +782,10 @@ if (istype(H)) if(H.getBrainLoss() >= 60) for(var/mob/M in viewers(src, null)) - M << "\red [H] stares cluelessly at [src] and drools." + M << "\red [H] stares cluelessly at \the [src] and drools." return 0 else if(prob(H.getBrainLoss())) - user << "\red You momentarily forget how to use [src]." + user << "\red You momentarily forget how to use \the [src]." return 0 return 1 @@ -873,7 +873,7 @@ if (malfai.malfhacking) malfai << "You are already hacking an APC." return - malfai << "Beginning override of APC systems. This takes some time, and you cannot perform other actions during the process." + malfai << "Beginning override of APC systems. This will take some time, and you cannot perform other actions during the process." malfai.malfhack = src malfai.malfhacking = 1 sleep(600) @@ -932,7 +932,7 @@ del(src.occupant) else - src.occupant << "\red Primary core damaged, unable to return core processes." + src.occupant << "\red Primary core damaged, unable to return to core processes." if(forced) src.occupant.loc = src.loc src.occupant.death() @@ -958,7 +958,7 @@ s.set_up(3, 1, src) s.start() for(var/mob/M in viewers(src)) - M.show_message("\red The [src.name] suddenly lets out a blast of smoke and some sparks!", 3, "\red You hear sizzling electronics.", 2) + M.show_message("\red The [src.name] suddenly lets out a blast of smoke and sparks!", 3, "\red You hear sizzling electronics.", 2) /obj/machinery/power/apc/surplus() diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm index 3ad116b455a..6a0a57fa38c 100644 --- a/code/modules/power/cell.dm +++ b/code/modules/power/cell.dm @@ -30,7 +30,9 @@ overlays += image('power.dmi', "cell-o1") /obj/item/weapon/cell/proc/percent() // return % charge of cell - return 100.0*charge/maxcharge + if(maxcharge) + return 100.0*charge/maxcharge + return 0 // use power from a cell /obj/item/weapon/cell/proc/use(var/amount) diff --git a/config/alienwhitelist.txt b/config/alienwhitelist.txt new file mode 100644 index 00000000000..e69de29bb2d diff --git a/config/config.txt b/config/config.txt index 41d3ceba1ba..b0446745487 100644 --- a/config/config.txt +++ b/config/config.txt @@ -164,4 +164,5 @@ TICKLAG 0.9 ## Defines if Tick Compensation is used. It results in a minor slowdown of movement of all mobs, but attempts to result in a level movement speed across all ticks. Recommended if tickrate is lowered. TICKCOMP 0 - +## Uncomment to restrict non-admins using humanoid alien races +USEALIENWHITELIST diff --git a/icons/mob/uniform.dmi b/icons/mob/uniform.dmi index 8eb5ac5b6fd..3bb0f47fe5c 100644 Binary files a/icons/mob/uniform.dmi and b/icons/mob/uniform.dmi differ