From 86effe3429dd39aec103fdf8422bac69e4e8f40e Mon Sep 17 00:00:00 2001 From: "elly1989@rocketmail.com" Date: Wed, 4 Jul 2012 20:53:13 +0000 Subject: [PATCH] ghosts now have stat=DEAD so certain verbs don't break. replaced canweaken and canstun variables with status_flags bitfield. Current flags are CANWEAKEN CANSTUN CANPARALYSE. Although you could add stuff like CANDAMAGE, CANBLIND, CANDEAFEN etc. to add additional flexibility to mob code and reduce on duplication. Added humans_need_surnames as a config option. If when spawning a human has only one name it will give them a random surname. I'd recommend leaving it on so that people can't name themselves "floor" "Unknown" etc. totally removed autolowercasing of names (except for first letter) due to people pestering me. inb4 everyone starts CRUISECONTROLLING. allowed a few characters like @ # etc for when the flag allow_numbers is set. So AIs can use those symbols (numbers and symbols cannot be used as the first character because of syntax. Added alium nests. They're basically beds that only aliums can use. They are made of sticky resin which aliums secure their prey too for sexytimes. Weed nodes are no longer dense. Tidied up some alium verbs so that they are more structured. This will allow me to add Alt-Click neurotoxin shooting for queens and sentinels Queens can secrete resin now to build nests/walls/membranes (doors to come!) Drones that evolve into queens when there is already a live Queen will become princesses instead so the hive can tell them how stupid they are for splitting from the will of the hive. It also gives them a number so they can be differentiated between. Credits to 39kk9t for fixing larva/death.dm, hissing which I forgot to do and some of the alium verbs. You're awesome <3 git-svn-id: http://tgstation13.googlecode.com/svn/trunk@3983 316c924e-a436-60f5-8080-3fe189b3f50e --- code/datums/configuration.dm | 4 + code/defines/mob/dead/observer.dm | 1 + code/defines/mob/living/carbon/alien.dm | 3 +- code/defines/mob/living/carbon/metroid.dm | 3 +- code/defines/mob/living/silicon/ai.dm | 2 +- code/defines/obj.dm | 8 +- code/defines/procs/helpers.dm | 65 +++--- code/game/objects/alien/defines.dm | 2 - code/game/objects/alien/nest.dm | 62 ++++++ code/modules/mob/living/carbon/alien/alien.dm | 11 +- .../carbon/alien/humanoid/alien_powers.dm | 103 ++++++--- .../carbon/alien/humanoid/caste/drone.dm | 22 +- .../carbon/alien/humanoid/caste/hunter.dm | 1 - .../carbon/alien/humanoid/caste/sentinel.dm | 42 +--- .../mob/living/carbon/alien/humanoid/emote.dm | 4 + .../mob/living/carbon/alien/humanoid/queen.dm | 19 +- .../mob/living/carbon/alien/larva/death.dm | 7 +- code/modules/mob/living/damage_procs.dm | 2 +- .../mob/living/simple_animal/behemoth.dm | 3 +- .../mob/living/simple_animal/constructs.dm | 9 +- code/modules/mob/mob.dm | 25 ++- code/modules/mob/mob_defines.dm | 3 +- code/modules/mob/new_player/preferences.dm | 13 +- code/modules/mob/new_player/savefile.dm | 4 +- code/setup.dm | 7 +- config/config.txt | 3 +- html/changelog.html | 11 + icons/mob/alien.dmi | Bin 47037 -> 50319 bytes tgstation.dme | 198 +----------------- 29 files changed, 263 insertions(+), 374 deletions(-) create mode 100644 code/game/objects/alien/nest.dm diff --git a/code/datums/configuration.dm b/code/datums/configuration.dm index cef31a7763..cbfcd3bef1 100644 --- a/code/datums/configuration.dm +++ b/code/datums/configuration.dm @@ -40,6 +40,7 @@ var/list/modes = list() // allowed modes var/list/votable_modes = list() // votable modes var/list/probabilities = list() // relative probability of each mode + var/humans_need_surnames = 0 var/allow_random_events = 0 // enables random events mid-round when set to 1 var/allow_ai = 1 // allow ai job var/hostedby = null @@ -309,6 +310,9 @@ if("tickcomp") Tickcomp = 1 + if("humans_need_surnames") + humans_need_surnames = 1 + else diary << "Unknown setting in configuration: '[name]'" diff --git a/code/defines/mob/dead/observer.dm b/code/defines/mob/dead/observer.dm index f5f395f1f8..3a3af24c7b 100644 --- a/code/defines/mob/dead/observer.dm +++ b/code/defines/mob/dead/observer.dm @@ -4,6 +4,7 @@ icon = 'mob.dmi' icon_state = "ghost" layer = 4 + stat = DEAD density = 0 canmove = 0 blinded = 0 diff --git a/code/defines/mob/living/carbon/alien.dm b/code/defines/mob/living/carbon/alien.dm index cf2fe173f5..1ba8a00883 100644 --- a/code/defines/mob/living/carbon/alien.dm +++ b/code/defines/mob/living/carbon/alien.dm @@ -16,5 +16,4 @@ var/move_delay_add = 0 // movement delay to add - canstun = 0 - canweaken = 0 // aliens cannot be stunned or knocked down. Massive buff! \ No newline at end of file + status_flags = CANPARALYSE \ No newline at end of file diff --git a/code/defines/mob/living/carbon/metroid.dm b/code/defines/mob/living/carbon/metroid.dm index ac6ddf9300..14d93537f9 100644 --- a/code/defines/mob/living/carbon/metroid.dm +++ b/code/defines/mob/living/carbon/metroid.dm @@ -22,8 +22,7 @@ // canstun and canweaken don't affect metroids because they ignore stun and weakened variables // for the sake of cleanliness, though, here they are. - canstun = 0 - canweaken = 0 + status_flags = CANPARALYSE var/amount_grown = 0// controls how long the metroid has been overfed, if 10, grows into an adult // if adult: if 10: reproduces diff --git a/code/defines/mob/living/silicon/ai.dm b/code/defines/mob/living/silicon/ai.dm index aaa0772a11..e9fc9c7550 100644 --- a/code/defines/mob/living/silicon/ai.dm +++ b/code/defines/mob/living/silicon/ai.dm @@ -4,7 +4,7 @@ icon_state = "ai" anchored = 1 // -- TLE density = 1 - canweaken = 0 + status_flags = CANSTUN|CANPARALYSE var/network = "SS13" var/obj/machinery/camera/current = null var/list/connected_robots = list() diff --git a/code/defines/obj.dm b/code/defines/obj.dm index 81eda7d7ae..3feb18c89f 100644 --- a/code/defines/obj.dm +++ b/code/defines/obj.dm @@ -686,10 +686,16 @@ var/mob/living/buckled_mob /obj/structure/stool/bed/alien - name = "Resting contraption" + name = "resting contraption" desc = "This looks similar to contraptions from earth. Could aliens be stealing our technology?" icon_state = "abed" +/obj/structure/stool/bed/nest + name = "alien nest" + desc = "It's a gruesome pile of thick, sticky resin shaped like a nest." + icon = 'alien.dmi' + icon_state = "nest" + var/health = 100 /obj/structure/stool/bed/chair //YES, chairs are a type of bed, which are a type of stool. This works, believe me. -Pete name = "chair" diff --git a/code/defines/procs/helpers.dm b/code/defines/procs/helpers.dm index 7f22e1a5a5..4be223c098 100644 --- a/code/defines/procs/helpers.dm +++ b/code/defines/procs/helpers.dm @@ -146,46 +146,51 @@ //removes doublespaces and double apostrophes //lowercases everything and capitalises the first letter of each word (or characters following an apostrophe) //prevents names which are too short, have too many space, or not enough normal letters -/proc/reject_bad_name(var/t_in, var/minimum_words=2, var/allow_numbers=0, var/max_length=MAX_NAME_LEN) +/proc/reject_bad_name(var/t_in, var/allow_numbers=0, var/max_length=MAX_NAME_LEN) if(length(t_in) > max_length) return //name too long var/number_of_alphanumeric = 0 - var/number_of_spaces = 0 var/last_char_group = 0 var/t_out = "" + for(var/i=1, i<=length(t_in), i++) var/ascii_char = text2ascii(t_in,i) switch(ascii_char) - if(65 to 90) //Uppercase letters allowed + if(65 to 90) //Uppercase Letters + t_out += ascii2text(ascii_char) + number_of_alphanumeric++ + last_char_group = 4 + + if(97 to 122) //Lowercase Letters + if(last_char_group<2) t_out += ascii2text(ascii_char-32) //Force uppercase first character + else t_out += ascii2text(ascii_char) + number_of_alphanumeric++ + last_char_group = 4 + + if(48 to 57) //Numbers + if(!last_char_group) continue //suppress at start of string + if(!allow_numbers) continue + t_out += ascii2text(ascii_char) + number_of_alphanumeric++ + last_char_group = 3 + + if(39,45,46) //Common name punctuation + t_out += ascii2text(ascii_char) + last_char_group = 2 + + if(126,124,64,58,35,36,37,38,42,43) //Other crap that's harmless + if(!last_char_group) continue //suppress at start of string + if(!allow_numbers) continue + t_out += ascii2text(ascii_char) + last_char_group = 2 + + if(32) //Space + if(last_char_group <= 1) continue //suppress double-spaces and spaces at start of string t_out += ascii2text(ascii_char) last_char_group = 1 - number_of_alphanumeric++ - if(97 to 122) //Lowercase letters allowed - switch(last_char_group) - if(3,4,0) t_out += ascii2text(ascii_char-32) //Force uppercase if preceeded by space or ' - else t_out += ascii2text(ascii_char) - last_char_group = 2 - number_of_alphanumeric++ - if(32) //Space - switch(last_char_group) - if(3,0) continue - else t_out += ascii2text(ascii_char) //so we don't get double-spaces - last_char_group = 3 - number_of_spaces++ - if(39,45,46) //Apostrophe for dem Oirish names like "O'Neil", dashes for double-barreled names and periods for "James T. Kirk" and AI's - switch(last_char_group) - if(4,0) continue - else t_out += ascii2text(ascii_char) //so we don't get double apostrophes or whatever - last_char_group = 4 - if(48 to 57) - if(allow_numbers) - t_out += ascii2text(ascii_char) //Allow numbers (i.e. for borgs andd AIs) - number_of_alphanumeric++ - last_char_group = 5 else return - if(last_char_group == 3) number_of_spaces-- - if(number_of_alphanumeric < 4) return //protects against tiny names like "A" and also names like "' ' ' ' ' ' ' '" - if(number_of_spaces > 4 || number_of_spaces < minimum_words-1) return //protects against single-word names like "Unknown" and names like "I ' M A D E R P Spaces Lul" + + if(number_of_alphanumeric < 2) return //protects against tiny names like "A" and also names like "' ' ' ' ' ' ' '" return t_out /proc/strip_html_simple(var/t,var/limit=MAX_MESSAGE_LEN) @@ -739,7 +744,7 @@ Turf and target are seperate in case you want to teleport some distance from a t if(0) if(1 to 5) M << "Invalid name. Your name should be at least 4 alphanumeric characters but under [MAX_NAME_LEN] characters long. It may only contain the characters A-Z, a-z, 0-9, -, ' and ." else break - newname = reject_bad_name(input(M,"You are the AI. Would you like to change your name to something else?", "Name change",randomname),1,1) + newname = reject_bad_name(input(M,"You are the AI. Would you like to change your name to something else?", "Name change",randomname),1) iterations++ if((world.time-time_passed)>300)//If more than 20 game seconds passed. diff --git a/code/game/objects/alien/defines.dm b/code/game/objects/alien/defines.dm index da67cc9cd5..da187f6b6d 100644 --- a/code/game/objects/alien/defines.dm +++ b/code/game/objects/alien/defines.dm @@ -49,8 +49,6 @@ name = "purple sac" desc = "Weird purple octopus-like thing." - density = 1 - /obj/effect/alien/acid name = "acid" desc = "Burbling corrossive stuff. I wouldn't want to touch it." diff --git a/code/game/objects/alien/nest.dm b/code/game/objects/alien/nest.dm new file mode 100644 index 0000000000..a34a9e95ca --- /dev/null +++ b/code/game/objects/alien/nest.dm @@ -0,0 +1,62 @@ +//Alium nests. Essentially beds with an unbuckle delay that only aliums can buckle mobs to. +/obj/structure/stool/bed/nest/manual_unbuckle(mob/user as mob) + if(buckled_mob) + if(buckled_mob.buckled == src) + if(buckled_mob != user) + buckled_mob.visible_message(\ + "[user.name] pulls [buckled_mob.name] free from the sticky nest!",\ + "[user.name] pulls you free from the gelatinous resin.",\ + "You hear squelching...") + unbuckle() + else + buckled_mob.visible_message(\ + "[buckled_mob.name] struggles to break free of the gelatinous resin...",\ + "You struggle to break free from the gelatinous resin...",\ + "You hear squelching...") + spawn(1200) + if(buckled_mob && user.buckled == src) unbuckle() + src.add_fingerprint(user) + return + +/obj/structure/stool/bed/nest/buckle_mob(mob/M as mob, mob/user as mob) + if ( !ismob(M) || (get_dist(src, user) > 1) || (M.loc != src.loc) || user.restrained() || usr.stat || M.buckled || istype(user, /mob/living/silicon/pai) ) + return + + if(istype(M,/mob/living/carbon/alien)) + return + if(!istype(user,/mob/living/carbon/alien/humanoid)) + return + + unbuckle() + + if(M == usr) + return + else + M.visible_message(\ + "[user.name] secretes a thick vile goo, securing [M.name] into [src]!",\ + "[user.name] drenches you in a foul-smelling resin, trapping you in the [src]!",\ + "You hear squelching...") + M.buckled = src + M.loc = src.loc + M.dir = src.dir + M.update_canmove() + src.buckled_mob = M + src.add_fingerprint(user) + return + +/obj/structure/stool/blob_act() + del(src) + +/obj/structure/stool/bed/nest/attackby(obj/item/weapon/W as obj, mob/user as mob) + var/aforce = W.force + health = max(0, health - aforce) + playsound(loc, 'attackblob.ogg', 100, 1) + for(var/mob/M in viewers(src, 7)) + M.show_message("[user] hits [src] with [W]!", 1) + healthcheck() + +/obj/structure/stool/bed/nest/proc/healthcheck() + if(health <=0) + density = 0 + del(src) + return diff --git a/code/modules/mob/living/carbon/alien/alien.dm b/code/modules/mob/living/carbon/alien/alien.dm index 6fc34c1c87..17156558c5 100644 --- a/code/modules/mob/living/carbon/alien/alien.dm +++ b/code/modules/mob/living/carbon/alien/alien.dm @@ -19,4 +19,13 @@ client.images += activeIndicator /mob/living/carbon/alien/IsAdvancedToolUser() - return has_fine_manipulation \ No newline at end of file + return has_fine_manipulation + + +/mob/living/carbon/alien/Stun(amount) + if(status_flags & CANSTUN) + stunned = max(max(stunned,amount),0) //can't go below 0, getting a low amount of stun doesn't lower your current stun + else + // add some movement delay + move_delay_add = min(move_delay_add + round(amount / 2), 10) // a maximum delay of 10 + return \ No newline at end of file diff --git a/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm b/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm index 5b9c7ab803..479e7c1215 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm @@ -82,43 +82,23 @@ I kind of like the right click only--the window version can get a little confusi var/obj/effect/alien/acid/A = new(src.loc) A.target = src for(var/mob/M in viewers(src, null)) - M.show_message(text("\green [user] vomits globs of vile stuff all over [src]!"), 1) + M.show_message(text("\green [user] vomits globs of vile stuff all over [src]. It begins to sizzle and melt under the bubbling mess of acid!"), 1) A.tick() -/mob/living/carbon/alien/humanoid/proc/corrode_target() //Aliens only see items on the list of objects that they can actually spit on./N - set name = "Spit Corrosive Acid (200)" +/mob/living/carbon/alien/humanoid/proc/corrosive_acid(obj/O as obj in oview(1)) //If they right click to corrode, an error will flash if its an invalid target./N + set name = "Corrossive Acid (200)" set desc = "Drench an object in acid, destroying it over time." set category = "Alien" - if(powerc(200))//Check 1. - var/list/xeno_target - xeno_target = list("Abort Command") - for(var/obj/O in view(1)) - if(!O.unacidable) - xeno_target.Add(O) - var/obj/A - A = input("Corrode which target?", "Targets", A) in xeno_target - if(!A == "Abort Command") - if(powerc(200))//Check 2. - if(A in view(1))//Check 3. - adjustToxLoss(-200) - A.acid(src) - else - src << "\green Target is too far away." - return - -/mob/living/carbon/alien/humanoid/verb/corrode(obj/O as anything in oview(1)) //If they right click to corrode, an error will flash if its an invalid target./N - set name = "Corrode with Acid (200)" - set desc = "Drench an object in acid, destroying it over time." - set category = "Alien" - - if(istype(O, /obj)) - if(powerc(200)) - if(!O.unacidable) + if(powerc(200)) + if(O in oview(1)) + if(O.unacidable) //So the aliens don't destroy energy fields/singularies/other aliens/etc with their acid. + src << "\green You cannot dissolve this object." + else adjustToxLoss(-200) - O.acid() - else//So the aliens don't destroy energy fields/singularies/other aliens/etc with their acid. - src << "\green You cannot destroy this object." + O.acid(src) + else + src << "\green Target is too far away." return /mob/living/carbon/alien/humanoid/verb/ventcrawl() // -- TLE @@ -194,4 +174,63 @@ I kind of like the right click only--the window version can get a little confusi src << "\green This vent is not connected to anything." else src << "\green You must be standing on or beside an open air vent to enter it." - return \ No newline at end of file + return + +/mob/living/carbon/alien/humanoid/proc/neurotoxin(mob/target as mob in oview()) + set name = "Spit Neurotoxin (50)" + set desc = "Spits neurotoxin at someone, paralyzing them for a short time." + set category = "Alien" + + if(powerc(50)) + if(isalien(target)) + src << "\green Your allies are not a valid target." + return + adjustToxLoss(-50) + src << "\green You spit neurotoxin at [target]." + for(var/mob/O in oviewers()) + if ((O.client && !( O.blinded ))) + O << "\red [src] spits neurotoxin at [target]!" + //I'm not motivated enough to revise this. Prjectile code in general needs update. + var/turf/T = loc + var/turf/U = (istype(target, /atom/movable) ? target.loc : target) + + if(!U || !T) + return + while(U && !istype(U,/turf)) + U = U.loc + if(!istype(T, /turf)) + return + if (U == T) + usr.bullet_act(src, get_organ_target()) + return + if(!istype(U, /turf)) + return + + var/obj/item/projectile/energy/dart/A = new /obj/item/projectile/energy/dart(usr.loc) + + A.current = U + A.yo = U.y - T.y + A.xo = U.x - T.x + A.process() + return + +/mob/living/carbon/alien/humanoid/proc/resin() // -- TLE + set name = "Secrete Resin (100)" + set desc = "Secrete tough malleable resin." + set category = "Alien" + + if(powerc(100)) + var/choice = input("Choose what you wish to shape.","Resin building") as null|anything in list("resin wall","resin membrane","resin nest") //would do it through typesof but then the player choice would have the type path and we don't want the internal workings to be exposed ICly - Urist + if(!choice || !powerc(100)) return + adjustToxLoss(-100) + src << "\green You shape a [choice]." + for(var/mob/O in viewers(src, null)) + O.show_message(text("\red [src] vomits up a thick purple substance and begins to shape it!"), 1) + switch(choice) + if("resin wall") + new /obj/effect/alien/resin/wall(loc) + if("resin membrane") + new /obj/effect/alien/resin/membrane(loc) + if("resin nest") + new /obj/structure/stool/bed/nest(loc) + return diff --git a/code/modules/mob/living/carbon/alien/humanoid/caste/drone.dm b/code/modules/mob/living/carbon/alien/humanoid/caste/drone.dm index 8311617de7..966bc68815 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/caste/drone.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/caste/drone.dm @@ -5,8 +5,8 @@ if(src.name == "alien drone") src.name = text("alien drone ([rand(1, 1000)])") src.real_name = src.name - src.verbs += /mob/living/carbon/alien/humanoid/proc/corrode_target - src.verbs -= /mob/living/carbon/alien/humanoid/verb/ActivateHuggers + verbs.Add(/mob/living/carbon/alien/humanoid/proc/resin,/mob/living/carbon/alien/humanoid/proc/corrosive_acid) + verbs -= /mob/living/carbon/alien/humanoid/verb/ActivateHuggers //<-- pointless //Drones use the same base as generic humanoids. //Drone verbs @@ -25,22 +25,4 @@ new_xeno.mind_initialize(src, "Queen") new_xeno.key = key del(src) - return - -/mob/living/carbon/alien/humanoid/drone/verb/resinwall() // -- TLE - set name = "Shape Resin (100)" - set desc = "Produce a wall of resin that blocks entry and line of sight" - set category = "Alien" - - if(powerc(100)) - adjustToxLoss(-100) - var/choice = input("Choose what you wish to shape.","Resin building") as anything in list("resin wall","resin membrane") //would do it through typesof but then the player choice would have the type path and we don't want the internal workings to be exposed ICly - Urist - src << "\green You shape a [choice]." - for(var/mob/O in viewers(src, null)) - O.show_message(text("\red [src] vomits up a thick purple substance and begins to shape it!"), 1) - switch(choice) - if("resin wall") - new /obj/effect/alien/resin/wall(loc) - if("resin membrane") - new /obj/effect/alien/resin/membrane(loc) return \ No newline at end of file diff --git a/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm b/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm index 810d4279c9..5274f5c580 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm @@ -5,7 +5,6 @@ if(name == "alien hunter") name = text("alien hunter ([rand(1, 1000)])") real_name = name - verbs -= /mob/living/carbon/alien/humanoid/verb/corrode /mob/living/carbon/alien/humanoid/hunter diff --git a/code/modules/mob/living/carbon/alien/humanoid/caste/sentinel.dm b/code/modules/mob/living/carbon/alien/humanoid/caste/sentinel.dm index 72bad8ad24..cc7e270e3a 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/caste/sentinel.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/caste/sentinel.dm @@ -5,7 +5,7 @@ if(name == "alien sentinel") name = text("alien sentinel ([rand(1, 1000)])") real_name = name - verbs += /mob/living/carbon/alien/humanoid/proc/corrode_target + verbs.Add(/mob/living/carbon/alien/humanoid/proc/corrosive_acid,/mob/living/carbon/alien/humanoid/proc/neurotoxin) /mob/living/carbon/alien/humanoid/sentinel @@ -50,43 +50,3 @@ else adjustBruteLoss(-10) adjustFireLoss(-10) - -//Sentinel verbs - -/mob/living/carbon/alien/humanoid/sentinel/verb/spit(mob/target as mob in oview()) - set name = "Spit Neurotoxin (50)" - set desc = "Spits neurotoxin at someone, paralyzing them for a short time." - set category = "Alien" - - if(powerc(50)) - if(isalien(target)) - src << "\green Your allies are not a valid target." - return - adjustToxLoss(-50) - src << "\green You spit neurotoxin at [target]." - for(var/mob/O in oviewers()) - if ((O.client && !( O.blinded ))) - O << "\red [src] spits neurotoxin at [target]!" - //I'm not motivated enough to revise this. Prjectile code in general needs update. - var/turf/T = loc - var/turf/U = (istype(target, /atom/movable) ? target.loc : target) - - if(!U || !T) - return - while(U && !istype(U,/turf)) - U = U.loc - if(!istype(T, /turf)) - return - if (U == T) - usr.bullet_act(src, get_organ_target()) - return - if(!istype(U, /turf)) - return - - var/obj/item/projectile/energy/dart/A = new /obj/item/projectile/energy/dart(usr.loc) - - A.current = U - A.yo = U.y - T.y - A.xo = U.x - T.x - A.process() - return \ No newline at end of file diff --git a/code/modules/mob/living/carbon/alien/humanoid/emote.dm b/code/modules/mob/living/carbon/alien/humanoid/emote.dm index 0c5b6fc258..ece60729bf 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/emote.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/emote.dm @@ -33,6 +33,10 @@ if (!muzzled) message = "The [src.name] roars." m_type = 2 + if("hiss") + if(!muzzled) + message = "The [src.name] hisses." + m_type = 2 if("tail") message = "The [src.name] waves its tail." m_type = 1 diff --git a/code/modules/mob/living/carbon/alien/humanoid/queen.dm b/code/modules/mob/living/carbon/alien/humanoid/queen.dm index a38e75d47e..d633ddeefe 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/queen.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/queen.dm @@ -2,13 +2,16 @@ var/datum/reagents/R = new/datum/reagents(100) reagents = R R.my_atom = src -//there should only be one queen -// if(src.name == "alien") -// src.name = text("alien ([rand(1, 1000)])") - src.real_name = src.name - src.verbs += /mob/living/carbon/alien/humanoid/proc/corrode_target - src.verbs += /mob/living/carbon/alien/humanoid/sentinel/verb/spit - src.verbs -= /mob/living/carbon/alien/humanoid/verb/ventcrawl + + //there should only be one queen + for(var/mob/living/carbon/alien/humanoid/queen/Q in world) + if(Q.stat != DEAD) + name = "alien princess ([rand(1, 1000)])" //if this is too cutesy feel free to change it/remove it. + break + + real_name = src.name + verbs.Add(/mob/living/carbon/alien/humanoid/proc/corrosive_acid,/mob/living/carbon/alien/humanoid/proc/neurotoxin,/mob/living/carbon/alien/humanoid/proc/resin) + verbs -= /mob/living/carbon/alien/humanoid/verb/ventcrawl /mob/living/carbon/alien/humanoid/queen @@ -59,7 +62,7 @@ /mob/living/carbon/alien/humanoid/queen/verb/lay_egg() set name = "Lay Egg (200)" - set desc = "Plants an egg" + set desc = "Lay an egg to produce huggers to impregnate prey with." set category = "Alien" if(locate(/obj/effect/alien/egg) in get_turf(src)) diff --git a/code/modules/mob/living/carbon/alien/larva/death.dm b/code/modules/mob/living/carbon/alien/larva/death.dm index 0242119ef5..86d3261780 100644 --- a/code/modules/mob/living/carbon/alien/larva/death.dm +++ b/code/modules/mob/living/carbon/alien/larva/death.dm @@ -4,12 +4,7 @@ if(src.healths) src.healths.icon_state = "health6" - /* - if(istype(src,/mob/living/carbon/alien/larva/metroid)) - src.icon_state = "metroid_dead" - */ - else - src.icon_state = "larva_l" + src.icon_state = "larva_l" src.stat = 2 if (!gibbed) diff --git a/code/modules/mob/living/damage_procs.dm b/code/modules/mob/living/damage_procs.dm index 7a9362be21..e0d05b12ef 100644 --- a/code/modules/mob/living/damage_procs.dm +++ b/code/modules/mob/living/damage_procs.dm @@ -53,7 +53,7 @@ if(IRRADIATE) radiation += max((((effect - (effect*(getarmor(null, "rad")/100))))/(blocked+1)),0)//Rads auto check armor if(STUTTER) - if(canstun) // stun is usually associated with stutter + if(status_flags & CANSTUN) // stun is usually associated with stutter stuttering = max(stuttering,(effect/(blocked+1))) if(EYE_BLUR) eye_blurry = max(eye_blurry,(effect/(blocked+1))) diff --git a/code/modules/mob/living/simple_animal/behemoth.dm b/code/modules/mob/living/simple_animal/behemoth.dm index 5d3c6fcd9b..be5a4c6b77 100644 --- a/code/modules/mob/living/simple_animal/behemoth.dm +++ b/code/modules/mob/living/simple_animal/behemoth.dm @@ -28,8 +28,7 @@ nopush = 1 a_intent = "harm" stop_automated_movement = 1 - canstun = 0 - canweaken = 0 + status_flags = CANPARALYSE var/energy = 0 var/max_energy = 1000 diff --git a/code/modules/mob/living/simple_animal/constructs.dm b/code/modules/mob/living/simple_animal/constructs.dm index 9a67ce88f2..f79847f464 100644 --- a/code/modules/mob/living/simple_animal/constructs.dm +++ b/code/modules/mob/living/simple_animal/constructs.dm @@ -31,8 +31,7 @@ nopush = 1 a_intent = "harm" stop_automated_movement = 1 - canstun = 0 - canweaken = 0 + status_flags = CANPARALYSE Life() @@ -168,8 +167,7 @@ speed = -1 a_intent = "harm" stop_automated_movement = 1 - canstun = 0 - canweaken = 0 + status_flags = CANPARALYSE see_in_dark = 7 Life() @@ -301,8 +299,7 @@ nopush = 1 a_intent = "harm" stop_automated_movement = 1 - canstun = 0 - canweaken = 0 + status_flags = CANPARALYSE Life() ..() diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 07733b109b..294e2519f4 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -737,52 +737,51 @@ note dizziness decrements automatically in the mob's Life() proc. /mob/proc/Stun(amount) - if(canstun) + if(status_flags & CANSTUN) stunned = max(max(stunned,amount),0) //can't go below 0, getting a low amount of stun doesn't lower your current stun - else - if(istype(src, /mob/living/carbon/alien)) // add some movement delay - var/mob/living/carbon/alien/Alien = src - Alien.move_delay_add = min(Alien.move_delay_add + round(amount / 2), 10) // a maximum delay of 10 return /mob/proc/SetStunned(amount) //if you REALLY need to set stun to a set amount without the whole "can't go below current stunned" - if(canstun) + if(status_flags & CANSTUN) stunned = max(amount,0) return /mob/proc/AdjustStunned(amount) - if(canstun) + if(status_flags & CANSTUN) stunned = max(stunned + amount,0) return /mob/proc/Weaken(amount) - if(canweaken) + if(status_flags & CANWEAKEN) weakened = max(max(weakened,amount),0) update_canmove() //updates lying, canmove and icons return /mob/proc/SetWeakened(amount) - if(canweaken) + if(status_flags & CANWEAKEN) weakened = max(amount,0) update_canmove() //updates lying, canmove and icons return /mob/proc/AdjustWeakened(amount) - if(canweaken) + if(status_flags & CANWEAKEN) weakened = max(weakened + amount,0) update_canmove() //updates lying, canmove and icons return /mob/proc/Paralyse(amount) - paralysis = max(max(paralysis,amount),0) + if(status_flags & CANPARALYSE) + paralysis = max(max(paralysis,amount),0) return /mob/proc/SetParalysis(amount) - paralysis = max(amount,0) + if(status_flags & CANPARALYSE) + paralysis = max(amount,0) return /mob/proc/AdjustParalysis(amount) - paralysis = max(paralysis + amount,0) + if(status_flags & CANPARALYSE) + paralysis = max(paralysis + amount,0) return /mob/proc/Sleeping(amount) diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index 757d1e8b51..6186a6c949 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -198,8 +198,7 @@ var/UI = 'screen1_Midnight.dmi' // For changing the UI from preferences - var/canstun = 1 // determines if this mob can be stunned by things - var/canweaken = 1 // determines if this mob can be weakened/knocked down by things + var/status_flags = 255 //bitflags defining which status effects can be inflicted (replaces canweaken, canstun, etc) var/nopush = 0 //Can they be shoved? var/area/lastarea = null diff --git a/code/modules/mob/new_player/preferences.dm b/code/modules/mob/new_player/preferences.dm index 3ad87a1dc7..884baca206 100644 --- a/code/modules/mob/new_player/preferences.dm +++ b/code/modules/mob/new_player/preferences.dm @@ -445,7 +445,7 @@ datum/preferences switch(link_tags["real_name"]) if("input") - new_name = reject_bad_name( input(user, "Please select a name:", "Character Generation") as text|null, 2 ) + new_name = reject_bad_name( input(user, "Please select a name:", "Character Generation") as text|null ) if("random") randomize_name() @@ -453,7 +453,7 @@ datum/preferences if(new_name) real_name = new_name else - user << "Invalid name. Your name should be at least 4 letters and two words but it should be under [MAX_NAME_LEN] characters long. It may only contain the characters A-Z, a-z, -, ' and ." + user << "Invalid name. Your name should be at least 2 and at most [MAX_NAME_LEN] characters long. It may only contain the characters A-Z, a-z, -, ' and ." if(link_tags["age"]) switch(link_tags["age"]) @@ -707,6 +707,15 @@ datum/preferences proc/copy_to(mob/living/carbon/human/character, safety = 0) if(be_random_name) randomize_name() + + if(config.humans_need_surnames) + var/firstspace = findtext(real_name, " ") + var/name_length = length(real_name) + if(!firstspace) //we need a surname + real_name += " [pick(last_names)]" + else if(firstspace == name_length) + real_name += "[pick(last_names)]" + character.real_name = real_name character.original_name = real_name //Original name is only used in ghost chat! It is not to be edited by anything! diff --git a/code/modules/mob/new_player/savefile.dm b/code/modules/mob/new_player/savefile.dm index 3a7a1ecb9d..e447928818 100644 --- a/code/modules/mob/new_player/savefile.dm +++ b/code/modules/mob/new_player/savefile.dm @@ -1,5 +1,5 @@ -#define SAVEFILE_VERSION_MIN 5 -#define SAVEFILE_VERSION_MAX 6 +#define SAVEFILE_VERSION_MIN 7 +#define SAVEFILE_VERSION_MAX 7 datum/preferences/proc/savefile_path(mob/user) return "data/player_saves/[copytext(user.ckey, 1, 2)]/[user.ckey]/preferences.sav" diff --git a/code/setup.dm b/code/setup.dm index 716b453c1b..a3428598ea 100644 --- a/code/setup.dm +++ b/code/setup.dm @@ -314,7 +314,7 @@ var/list/global_mutations = list() // list of hidden mutation things //Bluh shields -//Damage things +//Damage things //TODO: merge these down to reduce on defines >_> #define BRUTE "brute" #define BURN "fire" #define TOX "tox" @@ -330,6 +330,11 @@ var/list/global_mutations = list() // list of hidden mutation things #define EYE_BLUR "eye_blur" #define DROWSY "drowsy" +//Bitflags defining which status effects can be inflicted on a mob +#define CANSTUN 1 +#define CANWEAKEN 2 +#define CANPARALYSE 4 + var/static/list/scarySounds = list('thudswoosh.ogg','Taser.ogg','armbomb.ogg','hiss1.ogg','hiss2.ogg','hiss3.ogg','hiss4.ogg','hiss5.ogg','hiss6.ogg','Glassbr1.ogg','Glassbr2.ogg','Glassbr3.ogg','Welder.ogg','Welder2.ogg','airlock.ogg','clownstep1.ogg','clownstep2.ogg') //Security levels diff --git a/config/config.txt b/config/config.txt index 1e8484e0ad..eab32a5494 100644 --- a/config/config.txt +++ b/config/config.txt @@ -160,4 +160,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 - +## if uncommented this adds a random surname to a player's name if they only specify one name +HUMANS_NEED_SURNAMES diff --git a/html/changelog.html b/html/changelog.html index 08743d134a..1995074a4b 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -46,6 +46,17 @@ Stuff which is in development and not yet visible to players or just code relate should be listed in the changelog upon commit tho. Thanks. --> +
+

Wed 4th July 2012

+

39kk9t & Carn updated:

+ +
+

Saturday, June 30th

Icarus updated:

diff --git a/icons/mob/alien.dmi b/icons/mob/alien.dmi index 425528a6f9d4f02ad1f017a81243be10d43a285b..0628210fc763244deb689cdbdf14e90f5222a9a1 100644 GIT binary patch delta 8364 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 XXIi`v{{A>A00000NkvXXu0mjf*5C#k diff --git a/tgstation.dme b/tgstation.dme index c9fa94fead..230f98f824 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -5,203 +5,6 @@ // END_INTERNALS // BEGIN_FILE_DIR #define FILE_DIR . -#define FILE_DIR "code" -#define FILE_DIR "code/ATMOSPHERICS" -#define FILE_DIR "code/ATMOSPHERICS/components" -#define FILE_DIR "code/ATMOSPHERICS/components/binary_devices" -#define FILE_DIR "code/ATMOSPHERICS/components/trinary_devices" -#define FILE_DIR "code/ATMOSPHERICS/components/unary" -#define FILE_DIR "code/datums" -#define FILE_DIR "code/datums/diseases" -#define FILE_DIR "code/datums/helper_datums" -#define FILE_DIR "code/datums/spells" -#define FILE_DIR "code/defines" -#define FILE_DIR "code/defines/area" -#define FILE_DIR "code/defines/mob" -#define FILE_DIR "code/defines/mob/dead" -#define FILE_DIR "code/defines/mob/living" -#define FILE_DIR "code/defines/mob/living/carbon" -#define FILE_DIR "code/defines/mob/living/silicon" -#define FILE_DIR "code/defines/obj" -#define FILE_DIR "code/defines/procs" -#define FILE_DIR "code/defines/tanning" -#define FILE_DIR "code/FEA" -#define FILE_DIR "code/game" -#define FILE_DIR "code/game/area" -#define FILE_DIR "code/game/asteroid" -#define FILE_DIR "code/game/gamemodes" -#define FILE_DIR "code/game/gamemodes/blob" -#define FILE_DIR "code/game/gamemodes/blob/blobs" -#define FILE_DIR "code/game/gamemodes/changeling" -#define FILE_DIR "code/game/gamemodes/cult" -#define FILE_DIR "code/game/gamemodes/events" -#define FILE_DIR "code/game/gamemodes/events/holidays" -#define FILE_DIR "code/game/gamemodes/extended" -#define FILE_DIR "code/game/gamemodes/malfunction" -#define FILE_DIR "code/game/gamemodes/meteor" -#define FILE_DIR "code/game/gamemodes/nuclear" -#define FILE_DIR "code/game/gamemodes/revolution" -#define FILE_DIR "code/game/gamemodes/sandbox" -#define FILE_DIR "code/game/gamemodes/traitor" -#define FILE_DIR "code/game/gamemodes/wizard" -#define FILE_DIR "code/game/jobs" -#define FILE_DIR "code/game/jobs/job" -#define FILE_DIR "code/game/machinery" -#define FILE_DIR "code/game/machinery/atmoalter" -#define FILE_DIR "code/game/machinery/bots" -#define FILE_DIR "code/game/machinery/computer" -#define FILE_DIR "code/game/machinery/doors" -#define FILE_DIR "code/game/machinery/embedded_controller" -#define FILE_DIR "code/game/machinery/kitchen" -#define FILE_DIR "code/game/machinery/pipe" -#define FILE_DIR "code/game/machinery/telecomms" -#define FILE_DIR "code/game/magic" -#define FILE_DIR "code/game/magic/cultist" -#define FILE_DIR "code/game/mecha" -#define FILE_DIR "code/game/mecha/combat" -#define FILE_DIR "code/game/mecha/equipment" -#define FILE_DIR "code/game/mecha/equipment/tools" -#define FILE_DIR "code/game/mecha/equipment/weapons" -#define FILE_DIR "code/game/mecha/medical" -#define FILE_DIR "code/game/mecha/working" -#define FILE_DIR "code/game/objects" -#define FILE_DIR "code/game/objects/alien" -#define FILE_DIR "code/game/objects/closets" -#define FILE_DIR "code/game/objects/closets/secure" -#define FILE_DIR "code/game/objects/devices" -#define FILE_DIR "code/game/objects/devices/PDA" -#define FILE_DIR "code/game/objects/items" -#define FILE_DIR "code/game/objects/items/weapons" -#define FILE_DIR "code/game/objects/items/weapons/implants" -#define FILE_DIR "code/game/objects/radio" -#define FILE_DIR "code/game/objects/secstorage" -#define FILE_DIR "code/game/objects/stacks" -#define FILE_DIR "code/game/objects/storage" -#define FILE_DIR "code/game/objects/tanks" -#define FILE_DIR "code/game/vehicles" -#define FILE_DIR "code/game/vehicles/airtight" -#define FILE_DIR "code/game/verbs" -#define FILE_DIR "code/js" -#define FILE_DIR "code/modules" -#define FILE_DIR "code/modules/admin" -#define FILE_DIR "code/modules/admin/DB ban" -#define FILE_DIR "code/modules/admin/verbs" -#define FILE_DIR "code/modules/assembly" -#define FILE_DIR "code/modules/chemical" -#define FILE_DIR "code/modules/client" -#define FILE_DIR "code/modules/clothing" -#define FILE_DIR "code/modules/clothing/glasses" -#define FILE_DIR "code/modules/clothing/gloves" -#define FILE_DIR "code/modules/clothing/head" -#define FILE_DIR "code/modules/clothing/masks" -#define FILE_DIR "code/modules/clothing/shoes" -#define FILE_DIR "code/modules/clothing/spacesuits" -#define FILE_DIR "code/modules/clothing/suits" -#define FILE_DIR "code/modules/clothing/under" -#define FILE_DIR "code/modules/clothing/uniforms" -#define FILE_DIR "code/modules/critters" -#define FILE_DIR "code/modules/critters/hivebots" -#define FILE_DIR "code/modules/detectivework" -#define FILE_DIR "code/modules/flufftext" -#define FILE_DIR "code/modules/food" -#define FILE_DIR "code/modules/maps" -#define FILE_DIR "code/modules/mining" -#define FILE_DIR "code/modules/mob" -#define FILE_DIR "code/modules/mob/dead" -#define FILE_DIR "code/modules/mob/dead/observer" -#define FILE_DIR "code/modules/mob/living" -#define FILE_DIR "code/modules/mob/living/blob" -#define FILE_DIR "code/modules/mob/living/carbon" -#define FILE_DIR "code/modules/mob/living/carbon/alien" -#define FILE_DIR "code/modules/mob/living/carbon/alien/humanoid" -#define FILE_DIR "code/modules/mob/living/carbon/alien/humanoid/caste" -#define FILE_DIR "code/modules/mob/living/carbon/alien/larva" -#define FILE_DIR "code/modules/mob/living/carbon/brain" -#define FILE_DIR "code/modules/mob/living/carbon/human" -#define FILE_DIR "code/modules/mob/living/carbon/metroid" -#define FILE_DIR "code/modules/mob/living/carbon/monkey" -#define FILE_DIR "code/modules/mob/living/silicon" -#define FILE_DIR "code/modules/mob/living/silicon/ai" -#define FILE_DIR "code/modules/mob/living/silicon/decoy" -#define FILE_DIR "code/modules/mob/living/silicon/pai" -#define FILE_DIR "code/modules/mob/living/silicon/robot" -#define FILE_DIR "code/modules/mob/living/simple_animal" -#define FILE_DIR "code/modules/mob/new_player" -#define FILE_DIR "code/modules/mob/organ" -#define FILE_DIR "code/modules/paperwork" -#define FILE_DIR "code/modules/power" -#define FILE_DIR "code/modules/power/antimatter" -#define FILE_DIR "code/modules/power/singularity" -#define FILE_DIR "code/modules/power/singularity/particle_accelerator" -#define FILE_DIR "code/modules/projectiles" -#define FILE_DIR "code/modules/projectiles/ammunition" -#define FILE_DIR "code/modules/projectiles/guns" -#define FILE_DIR "code/modules/projectiles/guns/energy" -#define FILE_DIR "code/modules/projectiles/guns/projectile" -#define FILE_DIR "code/modules/projectiles/projectile" -#define FILE_DIR "code/modules/recycling" -#define FILE_DIR "code/modules/research" -#define FILE_DIR "code/modules/scripting" -#define FILE_DIR "code/modules/scripting/AST" -#define FILE_DIR "code/modules/scripting/AST/Operators" -#define FILE_DIR "code/modules/scripting/Implementations" -#define FILE_DIR "code/modules/scripting/Interpreter" -#define FILE_DIR "code/modules/scripting/Parser" -#define FILE_DIR "code/modules/scripting/Scanner" -#define FILE_DIR "code/modules/security levels" -#define FILE_DIR "code/unused" -#define FILE_DIR "code/unused/beast" -#define FILE_DIR "code/unused/computer2" -#define FILE_DIR "code/unused/disease2" -#define FILE_DIR "code/unused/gamemodes" -#define FILE_DIR "code/unused/hivebot" -#define FILE_DIR "code/unused/mining" -#define FILE_DIR "code/unused/optics" -#define FILE_DIR "code/unused/pda2" -#define FILE_DIR "code/unused/powerarmor" -#define FILE_DIR "code/unused/spacecraft" -#define FILE_DIR "code/WorkInProgress" -#define FILE_DIR "code/WorkInProgress/carn" -#define FILE_DIR "code/WorkInProgress/mapload" -#define FILE_DIR "code/WorkInProgress/organs" -#define FILE_DIR "code/WorkInProgress/virus2" -#define FILE_DIR "html" -#define FILE_DIR "icons" -#define FILE_DIR "icons/48x48" -#define FILE_DIR "icons/effects" -#define FILE_DIR "icons/mecha" -#define FILE_DIR "icons/misc" -#define FILE_DIR "icons/mob" -#define FILE_DIR "icons/obj" -#define FILE_DIR "icons/obj/assemblies" -#define FILE_DIR "icons/obj/atmospherics" -#define FILE_DIR "icons/obj/clothing" -#define FILE_DIR "icons/obj/doors" -#define FILE_DIR "icons/obj/machines" -#define FILE_DIR "icons/obj/pipes" -#define FILE_DIR "icons/pda_icons" -#define FILE_DIR "icons/spideros_icons" -#define FILE_DIR "icons/Testing" -#define FILE_DIR "icons/turf" -#define FILE_DIR "icons/unused" -#define FILE_DIR "icons/vehicles" -#define FILE_DIR "icons/vending_icons" -#define FILE_DIR "interface" -#define FILE_DIR "maps" -#define FILE_DIR "maps/RandomZLevels" -#define FILE_DIR "Redirector" -#define FILE_DIR "sound" -#define FILE_DIR "sound/AI" -#define FILE_DIR "sound/ambience" -#define FILE_DIR "sound/effects" -#define FILE_DIR "sound/hallucinations" -#define FILE_DIR "sound/items" -#define FILE_DIR "sound/machines" -#define FILE_DIR "sound/mecha" -#define FILE_DIR "sound/misc" -#define FILE_DIR "sound/piano" -#define FILE_DIR "sound/voice" -#define FILE_DIR "sound/weapons" // END_FILE_DIR // BEGIN_PREFERENCES @@ -627,6 +430,7 @@ #include "code\game\objects\alien\defines.dm" #include "code\game\objects\alien\egg.dm" #include "code\game\objects\alien\facehugger.dm" +#include "code\game\objects\alien\nest.dm" #include "code\game\objects\alien\resin.dm" #include "code\game\objects\alien\weeds.dm" #include "code\game\objects\closets\bombsuit.dm"