Merge branch 'master' of https://github.com/PolarisSS13/Polaris into cosmetic_things

# Conflicts:
#	icons/mob/back.dmi
#	icons/mob/items/lefthand.dmi
#	icons/mob/items/righthand.dmi
This commit is contained in:
Anewbe
2017-04-07 16:11:50 -05:00
104 changed files with 1700 additions and 923 deletions

View File

@@ -17,7 +17,8 @@ var/list/adminhelp_ignored_words = list("unknown","the","a","an","of","monkey","
adminhelped = 1 //Determines if they get the message to reply by clicking the name.
handle_spam_prevention(MUTE_ADMINHELP)
if(msg)
handle_spam_prevention(MUTE_ADMINHELP)
//clean the input msg
if(!msg)

View File

@@ -565,7 +565,7 @@
M.equip_to_slot_or_del(new /obj/item/clothing/head/welding(M), slot_head)
M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_l_ear)
M.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/plain/monocle(M), slot_glasses)
M.equip_to_slot_or_del(new /obj/item/clothing/suit/apron(M), slot_wear_suit)
M.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/apron(M), slot_wear_suit)
M.equip_to_slot_or_del(new /obj/item/weapon/material/knife(M), slot_l_store)
M.equip_to_slot_or_del(new /obj/item/weapon/surgical/scalpel(M), slot_r_store)

View File

@@ -10,10 +10,11 @@
if(!msg) return
if(usr.client)
client.handle_spam_prevention(MUTE_PRAY)
if(usr.client.prefs.muted & MUTE_PRAY)
usr << "\red You cannot pray (muted)."
return
if(msg)
client.handle_spam_prevention(MUTE_PRAY)
if(usr.client.prefs.muted & MUTE_PRAY)
usr << "\red You cannot pray (muted)."
return
var/image/cross = image('icons/obj/storage.dmi',"bible")
msg = "\blue \icon[cross] <b><font color=purple>PRAY: </font>[key_name(src, 1)] (<A HREF='?_src_=holder;adminmoreinfo=\ref[src]'>?</A>) (<A HREF='?_src_=holder;adminplayeropts=\ref[src]'>PP</A>) (<A HREF='?_src_=vars;Vars=\ref[src]'>VV</A>) (<A HREF='?_src_=holder;subtlemessage=\ref[src]'>SM</A>) ([admin_jump_link(src, src)]) (<A HREF='?_src_=holder;secretsadmin=check_antagonist'>CA</A>) (<A HREF='?_src_=holder;adminspawncookie=\ref[src]'>SC</a>):</b> [msg]"

View File

@@ -32,7 +32,7 @@ datum/preferences/proc/set_biological_gender(var/gender)
pref.age = sanitize_integer(pref.age, get_min_age(), get_max_age(), initial(pref.age))
pref.biological_gender = sanitize_inlist(pref.biological_gender, get_genders(), pick(get_genders()))
pref.identifying_gender = (pref.identifying_gender in all_genders_define_list) ? pref.identifying_gender : pref.biological_gender
pref.real_name = sanitize_name(pref.real_name, pref.species)
pref.real_name = sanitize_name(pref.real_name, pref.species, is_FBP())
if(!pref.real_name)
pref.real_name = random_name(pref.identifying_gender, pref.species)
pref.spawnpoint = sanitize_inlist(pref.spawnpoint, spawntypes, initial(pref.spawnpoint))
@@ -76,7 +76,7 @@ datum/preferences/proc/set_biological_gender(var/gender)
if(href_list["rename"])
var/raw_name = input(user, "Choose your character's name:", "Character Name") as text|null
if (!isnull(raw_name) && CanUseTopic(user))
var/new_name = sanitize_name(raw_name, pref.species)
var/new_name = sanitize_name(raw_name, pref.species, is_FBP())
if(new_name)
pref.real_name = new_name
return TOPIC_REFRESH

View File

@@ -218,7 +218,11 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
++ind
if(ind > 1)
. += ", "
. += "\tSynthetic [organ_name]"
switch(organ_name)
if ("brain")
. += "\tPositronic [organ_name]"
else
. += "\tSynthetic [organ_name]"
else if(status == "digital")
++ind
if(ind > 1)
@@ -607,15 +611,23 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
organ = O_LUNGS
if("Brain")
if(pref.organ_data[BP_HEAD] != "cyborg")
user << "<span class='warning'>You may only select an assisted or synthetic brain if you have a full prosthetic body.</span>"
user << "<span class='warning'>You may only select a cybernetic or synthetic brain if you have a full prosthetic body.</span>"
return
organ = "brain"
var/list/organ_choices = list("Normal","Assisted","Mechanical")
var/list/organ_choices = list("Normal")
if(pref.organ_data[BP_TORSO] == "cyborg")
organ_choices -= "Normal"
if(organ_name == "Brain")
organ_choices += "Digital"
organ_choices += "Cybernetic"
organ_choices += "Positronic"
organ_choices += "Drone"
else
organ_choices += "Assisted"
organ_choices += "Mechanical"
else
organ_choices += "Assisted"
organ_choices += "Mechanical"
var/new_state = input(user, "What state do you wish the organ to be in?") as null|anything in organ_choices
if(!new_state) return
@@ -625,10 +637,15 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
pref.organ_data[organ] = null
if("Assisted")
pref.organ_data[organ] = "assisted"
if("Mechanical")
if("Cybernetic")
pref.organ_data[organ] = "assisted"
if ("Mechanical")
pref.organ_data[organ] = "mechanical"
if("Digital")
if("Drone")
pref.organ_data[organ] = "digital"
if("Positronic")
pref.organ_data[organ] = "mechanical"
return TOPIC_REFRESH
else if(href_list["disabilities"])
@@ -654,6 +671,11 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
while(null in pref.rlimb_data)
pref.rlimb_data -= null
// Sanitize the name so that there aren't any numbers sticking around.
pref.real_name = sanitize_name(pref.real_name, pref.species)
if(!pref.real_name)
pref.real_name = random_name(pref.identifying_gender, pref.species)
/datum/category_item/player_setup_item/general/body/proc/SetSpecies(mob/user)
if(!pref.species_preview || !(pref.species_preview in all_species))
pref.species_preview = "Human"

View File

@@ -1,7 +1,7 @@
// Suit slot
/datum/gear/suit
display_name = "apron, blue"
path = /obj/item/clothing/suit/apron
path = /obj/item/clothing/suit/storage/apron
slot = slot_wear_suit
sort_category = "Suits and Overwear"
cost = 2
@@ -158,7 +158,7 @@
/datum/gear/suit/overalls
display_name = "overalls"
path = /obj/item/clothing/suit/apron/overalls
path = /obj/item/clothing/suit/storage/apron/overalls
cost = 1
/datum/gear/suit/poncho

View File

@@ -0,0 +1,56 @@
/obj/item/clothing/head/woodcirclet
name = "wood circlet"
desc = "A small wood circlet for making a flower crown."
icon_state = "woodcirclet"
w_class = ITEMSIZE_SMALL
body_parts_covered = 0
/obj/item/clothing/head/woodcirclet/attackby(obj/item/W as obj, mob/user as mob)
var/obj/item/complete
if(istype(W,/obj/item/seeds/poppyseed))
user << "You attach the poppy to the circlet and create a beautiful flower crown."
complete = new /obj/item/clothing/head/poppy_crown(get_turf(user))
user.drop_from_inventory(W)
user.drop_from_inventory(src)
qdel(W)
qdel(src)
user.put_in_hands(complete)
return
else if(istype(W,/obj/item/seeds/sunflowerseed))
user << "You attach the sunflower to the circlet and create a beautiful flower crown."
complete = new /obj/item/clothing/head/sunflower_crown(get_turf(user))
user.drop_from_inventory(W)
user.drop_from_inventory(src)
qdel(W)
qdel(src)
user.put_in_hands(complete)
return
else if(istype(W,/obj/item/seeds/lavenderseed))
user << "You attach the lavender to the circlet and create a beautiful flower crown."
complete = new /obj/item/clothing/head/lavender_crown(get_turf(user))
user.drop_from_inventory(W)
user.drop_from_inventory(src)
qdel(W)
qdel(src)
user.put_in_hands(complete)
return
//Flower crowns
/obj/item/clothing/head/sunflower_crown
name = "sunflower crown"
desc = "A flower crown weaved with sunflowers."
icon_state = "sunflower_crown"
body_parts_covered = 0
/obj/item/clothing/head/lavender_crown
name = "lavender crown"
desc = "A flower crown weaved with lavender."
icon_state = "lavender_crown"
body_parts_covered = 0
/obj/item/clothing/head/poppy_crown
name = "poppy crown"
desc = "A flower crown weaved with poppies."
icon_state = "poppy_crown"
body_parts_covered = 0

View File

@@ -346,25 +346,4 @@
name = "sombrero"
desc = "A wide-brimmed hat popularly worn in Mexico."
icon_state = "sombrero"
body_parts_covered = 0
//Flower crowns
/obj/item/clothing/head/sunflower_crown
name = "sunflower crown"
desc = "A flower crown weaved with sunflowers."
icon_state = "sunflower_crown"
body_parts_covered = 0
/obj/item/clothing/head/lavender_crown
name = "lavender crown"
desc = "A flower crown weaved with lavender."
icon_state = "lavender_crown"
body_parts_covered = 0
/obj/item/clothing/head/poppy_crown
name = "poppy crown"
desc = "A flower crown weaved with poppies."
icon_state = "poppy_crown"
body_parts_covered = 0

View File

@@ -3,7 +3,7 @@
*/
//Botanist
/obj/item/clothing/suit/apron
/obj/item/clothing/suit/storage/apron
name = "apron"
desc = "A basic blue apron."
icon_state = "apron"

View File

@@ -120,7 +120,7 @@
name = "red sweatervest"
icon_state = "sweatervest_red"
*/
/obj/item/clothing/suit/apron/overalls
/obj/item/clothing/suit/storage/apron/overalls
name = "coveralls"
desc = "A set of denim overalls."
icon_state = "overalls"

View File

@@ -120,7 +120,7 @@
/material/wood/generate_recipes()
..()
recipes += new/datum/stack_recipe("wooden sandals", /obj/item/clothing/shoes/sandal, 1)
recipes += new/datum/stack_recipe("wood circlet", /obj/item/woodcirclet, 1)
recipes += new/datum/stack_recipe("wood circlet", /obj/item/clothing/head/woodcirclet, 1)
recipes += new/datum/stack_recipe("clipboard", /obj/item/weapon/clipboard, 1)
recipes += new/datum/stack_recipe("wood floor tile", /obj/item/stack/tile/wood, 1, 4, 20)
recipes += new/datum/stack_recipe("wooden chair", /obj/structure/bed/chair/wood, 3, time = 10, one_per_turf = 1, on_floor = 1)

View File

@@ -7,10 +7,11 @@
log_say("Ghost/[src.key] : [message]")
if (src.client)
client.handle_spam_prevention(MUTE_DEADCHAT)
if(src.client.prefs.muted & MUTE_DEADCHAT)
src << "\red You cannot talk in deadchat (muted)."
return
if(message)
client.handle_spam_prevention(MUTE_DEADCHAT)
if(src.client.prefs.muted & MUTE_DEADCHAT)
src << "\red You cannot talk in deadchat (muted)."
return
. = src.say_dead(message)
@@ -27,10 +28,11 @@
log_emote("Ghost/[src.key] : [message]")
if(src.client)
client.handle_spam_prevention(MUTE_DEADCHAT)
if(src.client.prefs.muted & MUTE_DEADCHAT)
src << "\red You cannot emote in deadchat (muted)."
return
if(message)
client.handle_spam_prevention(MUTE_DEADCHAT)
if(src.client.prefs.muted & MUTE_DEADCHAT)
src << "\red You cannot emote in deadchat (muted)."
return
. = src.emote_dead(message)

View File

@@ -5,18 +5,70 @@
ask_verb = "chimpers"
exclaim_verb = "screeches"
key = "6"
machine_understands = 0
/datum/language/skrell/monkey
name = "Neaera"
desc = "Squik squik squik."
key = "8"
machine_understands = 0
/datum/language/unathi/monkey
name = "Stok"
desc = "Hiss hiss hiss."
key = "7"
machine_understands = 0
/datum/language/tajaran/monkey
name = "Farwa"
desc = "Meow meow meow."
key = "9"
machine_understands = 0
/datum/language/corgi
name = "Dog"
desc = "Woof woof woof."
speech_verb = "barks"
ask_verb = "woofs"
exclaim_verb = "howls"
key = "n"
flags = RESTRICTED
machine_understands = 0
space_chance = 100
syllables = list("bark", "woof", "bowwow", "yap", "arf")
/datum/language/cat
name = "Cat"
desc = "Meow meow meow."
speech_verb = "meows"
ask_verb = "mrowls"
exclaim_verb = "yowls"
key = "c"
flags = RESTRICTED
machine_understands = 0
space_chance = 100
syllables = list("meow", "mrowl", "purr", "meow", "meow", "meow")
/datum/language/mouse
name = "Mouse"
desc = "Squeak squeak. *Nibbles on cheese*"
speech_verb = "squeaks"
ask_verb = "squeaks"
exclaim_verb = "squeaks"
key = "m"
flags = RESTRICTED
machine_understands = 0
space_chance = 100
syllables = list("squeak") // , "gripes", "oi", "meow")
/datum/language/bird
name = "Bird"
desc = "Chirp chirp, give me food"
speech_verb = "chirps"
ask_verb = "tweets"
exclaim_verb = "squawks"
key = "m"
flags = RESTRICTED
machine_understands = 0
space_chance = 100
syllables = list("chirp", "squawk", "tweet")

View File

@@ -4,6 +4,7 @@
speech_verb = "says"
colour = "changeling"
key = "g"
machine_understands = 0
flags = RESTRICTED | HIVEMIND
/datum/language/ling/broadcast(var/mob/living/speaker,var/message,var/speaker_mask)
@@ -21,6 +22,7 @@
exclaim_verb = "sings"
colour = "alien"
key = "x"
machine_understands = 0
flags = RESTRICTED | HIVEMIND
/datum/language/corticalborer/broadcast(var/mob/living/speaker,var/message,var/speaker_mask)
@@ -80,4 +82,5 @@
exclaim_verb = "chants"
colour = "cult"
key = "y"
machine_understands = 0
flags = RESTRICTED | HIVEMIND

View File

@@ -6,6 +6,7 @@
exclaim_verb = "rustles"
colour = "soghun"
key = "q"
machine_understands = 0
flags = RESTRICTED
syllables = list("hs","zt","kr","st","sh")
@@ -18,6 +19,7 @@
name = LANGUAGE_ROOTGLOBAL
desc = "A complex language known instinctively by Dionaea, 'spoken' by emitting modulated radio waves. This version uses low frequency waves for slow communication at long ranges."
key = "w"
machine_understands = 0
flags = RESTRICTED | HIVEMIND
/datum/language/unathi

View File

@@ -6,6 +6,7 @@
ask_verb = "queries"
exclaim_verb = "declares"
key = "b"
machine_understands = 0
flags = RESTRICTED | HIVEMIND
var/drone_only
@@ -64,5 +65,6 @@
exclaim_verb = "transmits"
colour = "say_quote"
key = "d"
machine_understands = 0
flags = RESTRICTED | HIVEMIND
drone_only = 1

View File

@@ -22,7 +22,7 @@
// Should this all be in Touch()?
if(istype(H))
if(get_accuracy_penalty(H)) //Should only trigger if they're not aiming well
if(get_accuracy_penalty(H) && H != src) //Should only trigger if they're not aiming well
var/hit_zone = get_zone_with_miss_chance(H.zone_sel.selecting, src, get_accuracy_penalty(H))
if(!hit_zone)
H.do_attack_animation(src)

View File

@@ -2,6 +2,8 @@
var/tally = 0
var/item_tally = 0
if(species.slowdown)
tally = species.slowdown
@@ -33,7 +35,7 @@
tally += 1.5
else
if(shoes)
tally += shoes.slowdown
item_tally += shoes.slowdown
for(var/organ_name in list(BP_L_LEG, BP_R_LEG, BP_L_FOOT, BP_R_FOOT))
var/obj/item/organ/external/E = get_organ(organ_name)
@@ -50,36 +52,40 @@
if(FAT in src.mutations)
tally += 1.5
if (bodytemperature < 283.222)
tally += (283.222 - bodytemperature) / 10 * 1.75
if (bodytemperature < species.cold_level_1)
tally += (species.cold_level_1 - bodytemperature) / 10 * 1.75
tally += max(2 * stance_damage, 0) //damaged/missing feet or legs is slow
if(mRun in mutations)
tally = 0
if(species.slowdown_fixed)
return (tally+config.human_delay)
// Loop through some slots, and add up their slowdowns. Shoes are handled below, unfortunately.
// Includes slots which can provide armor, the back slot, and suit storage.
for(var/obj/item/I in list(wear_suit, w_uniform, back, gloves, head, s_store) )
tally += I.slowdown
for(var/obj/item/I in list(wear_suit, w_uniform, back, gloves, head, s_store))
item_tally += I.slowdown
// Hands are also included, to make the 'take off your armor instantly and carry it with you to go faster' trick no longer viable.
// This is done seperately to disallow negative numbers.
for(var/obj/item/I in list(r_hand, l_hand) )
tally += max(I.slowdown, 0)
item_tally += max(I.slowdown, 0)
// Dragging heavy objects will also slow you down, similar to above.
if(pulling && istype(pulling, /obj/item))
var/obj/item/pulled = pulling
tally += max(pulled.slowdown, 0)
item_tally += max(pulled.slowdown, 0)
var/turf/T = get_turf(src)
if(T && T.movement_cost)
tally += T.movement_cost
if(species.item_slowdown_halved)
if(item_tally > 0)
item_tally *= 0.5
tally += item_tally
if(CE_SPEEDBOOST in chem_effects)
if (tally >= 0) // cut any penalties in half
tally = tally/2

View File

@@ -352,13 +352,6 @@
if(!L.is_bruised() && prob(8))
rupture_lung()
if(should_have_organ("brain"))
var/brainOxPercent = 0.02 //Default2% of your current oxyloss is applied as brain damage, 50 oxyloss is 1 brain damage
if(CE_STABLE in chem_effects)
brainOxPercent = 0.01 //Halved in effect
if(prob(5))
adjustBrainLoss(brainOxPercent * oxyloss)
oxygen_alert = max(oxygen_alert, 1)
return 0
@@ -377,8 +370,9 @@
safe_pressure_min *= 1.25
else if(breath)
if(breath.total_moles < BREATH_MOLES / 10 || breath.total_moles > BREATH_MOLES * 5)
if (prob(8))
rupture_lung()
if(is_below_sound_pressure(get_turf(src))) //No more popped lungs from choking/drowning
if (prob(8))
rupture_lung()
var/safe_exhaled_max = 10
var/safe_toxins_max = 0.2
@@ -925,6 +919,14 @@
for(var/atom/a in hallucinations)
qdel(a)
//Brain damage from Oxyloss
if(should_have_organ("brain"))
var/brainOxPercent = 0.02 //Default2% of your current oxyloss is applied as brain damage, 50 oxyloss is 1 brain damage
if(CE_STABLE in chem_effects)
brainOxPercent = 0.01 //Halved in effect
if(oxyloss >= 20 && prob(5))
adjustBrainLoss(brainOxPercent * oxyloss)
if(halloss >= species.total_health)
src << "<span class='notice'>You're in too much pain to keep going...</span>"
src.visible_message("<B>[src]</B> slumps to the ground, too weak to continue fighting.")

View File

@@ -133,7 +133,7 @@
var/appearance_flags = 0 // Appearance/display related features.
var/spawn_flags = 0 // Flags that specify who can spawn as this species
var/slowdown = 0 // Passive movement speed malus (or boost, if negative)
var/slowdown_fixed = 0 // If this is on, they're not affected by object related slowdown (positive or negative)
var/item_slowdown_halved = 0 // If this is on, they're not as affected by item weights for slowdown
var/primitive_form // Lesser form, if any (ie. monkey for humans)
var/greater_form // Greater form, if any, ie. human for monkeys.
var/holder_type
@@ -194,8 +194,8 @@
inherent_verbs = list()
inherent_verbs |= /mob/living/carbon/human/proc/regurgitate
/datum/species/proc/sanitize_name(var/name)
return sanitizeName(name)
/datum/species/proc/sanitize_name(var/name, var/robot = 0)
return sanitizeName(name, MAX_NAME_LEN, robot)
/datum/species/proc/equip_survival_gear(var/mob/living/carbon/human/H,var/extendedtank = 1)
var/boxtype = /obj/item/weapon/storage/box/survival //Default survival box

View File

@@ -770,11 +770,6 @@ default behaviour is:
if(buckled.buckle_movable)
anchored = 0
canmove = 1
else if(captured)
anchored = 1
canmove = 0
lying = 0
else
lying = incapacitated(INCAPACITATION_KNOCKDOWN)
canmove = !incapacitated(INCAPACITATION_DISABLED)

View File

@@ -133,10 +133,11 @@ proc/get_radio_key_from_channel(var/channel)
/mob/living/say(var/message, var/datum/language/speaking = null, var/verb="says", var/alt_name="", var/whispering = 0)
//If you're muted for IC chat
if(client)
client.handle_spam_prevention(MUTE_IC)
if((client.prefs.muted & MUTE_IC) || say_disabled)
src << "<span class='warning'>You cannot speak in IC (Muted).</span>"
return
if(message)
client.handle_spam_prevention(MUTE_IC)
if((client.prefs.muted & MUTE_IC) || say_disabled)
src << "<span class='warning'>You cannot speak in IC (Muted).</span>"
return
//Redirect to say_dead if talker is dead
if(stat)

View File

@@ -114,7 +114,7 @@
return
var/deathtime = world.time - src.timeofdeath
var/deathtimeminutes = round(deathtime / 300)
var/deathtimeminutes = round(deathtime / 600)
var/pluralcheck = "minute"
if(deathtimeminutes == 0)
pluralcheck = ""
@@ -122,11 +122,11 @@
pluralcheck = " [deathtimeminutes] minute and"
else if(deathtimeminutes > 1)
pluralcheck = " [deathtimeminutes] minutes and"
var/deathtimeseconds = round((deathtime - deathtimeminutes * 300) / 10,1)
var/deathtimeseconds = round((deathtime - deathtimeminutes * 600) / 10,1)
if (deathtime < 3000)
if (deathtime < 6000)
usr << "You have been dead for[pluralcheck] [deathtimeseconds] seconds."
usr << "You must wait 5 minutes to respawn as a drone!"
usr << "You must wait 10 minutes to respawn as a drone!"
return
var/list/all_fabricators = list()

View File

@@ -18,7 +18,7 @@ var/global/list/robot_modules = list(
icon = 'icons/obj/module.dmi'
icon_state = "std_module"
w_class = ITEMSIZE_NO_CONTAINER
item_state = "electronic"
item_state = "std_mod"
flags = CONDUCT
var/hide_on_manifest = 0
var/channels = list()

View File

@@ -36,6 +36,8 @@
max_n2 = 0
minbodytemp = 0
has_langs = list("Mouse")
meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat
var/mob/living/owner

View File

@@ -27,6 +27,7 @@
holder_type = /obj/item/weapon/holder/cat
mob_size = MOB_SMALL
has_langs = list("Cat")
speak_chance = 1
speak = list("Meow!","Esp!","Purr!","HSSSSS")
speak_emote = list("purrs", "meows")

View File

@@ -17,6 +17,7 @@
see_in_dark = 5
mob_size = 8
has_langs = list("Dog")
speak_chance = 1
speak = list("YAP", "Woof!", "Bark!", "AUUUUUU")
speak_emote = list("barks", "woofs")

View File

@@ -167,6 +167,7 @@
response_harm = "kicks"
attacktext = "kicked"
has_langs = list("Bird")
speak_chance = 2
speak = list("Cherp.","Cherp?","Chirrup.","Cheep!")
speak_emote = list("cheeps")
@@ -213,6 +214,7 @@ var/global/chicken_count = 0
response_harm = "kicks"
attacktext = "kicked"
has_langs = list("Bird")
speak_chance = 2
speak = list("Cluck!","BWAAAAARK BWAK BWAK BWAK!","Bwaak bwak.")
speak_emote = list("clucks","croons")

View File

@@ -3,7 +3,7 @@
name = "fish"
desc = "Its a fishy. No touchy fishy."
icon = 'icons/mob/fish.dmi'
meat_type = /obj/item/weapon/reagent_containers/food/snacks
meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat
// By defautl they can be in any water turf. Subtypes might restrict to deep/shallow etc
var/global/list/suitable_turf_types = list(

View File

@@ -35,6 +35,7 @@
max_n2 = 0
minbodytemp = 0
has_langs = list("Bird")
speak_chance = 10
speak = list("HONK!")
emote_hear = list("honks loudly!")

View File

@@ -29,6 +29,7 @@
minbodytemp = 223 //Below -50 Degrees Celcius
maxbodytemp = 323 //Above 50 Degrees Celcius
has_langs = list("Mouse")
speak_chance = 1
speak = list("Squeek!","SQUEEK!","Squeek?")
speak_emote = list("squeeks","squeeks","squiks")

View File

@@ -46,6 +46,7 @@
stop_automated_movement = 1
universal_speak = 1
has_langs = list("Bird")
speak_chance = 2
speak = list("Hi","Hello!","Cracker?","BAWWWWK george mellons griffing me")
speak_emote = list("squawks","says","yells")

View File

@@ -20,6 +20,7 @@
melee_damage_upper = 15
attacktext = "pecked"
has_langs = list("Bird")
speak_chance = 0
meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat

View File

@@ -271,21 +271,31 @@
update_icon()
ai_log("Life() - stance=[stance] ai_inactive=[ai_inactive]", 4)
//Movement
if(!ai_inactive && !stop_automated_movement && wander && !anchored) //Allowed to move?
handle_wander_movement()
//Speaking
if(!ai_inactive && speak_chance && stance == STANCE_IDLE) // Allowed to chatter?
handle_idle_speaking()
//Stanceyness
//AI Actions
if(!ai_inactive)
//Stanceyness
handle_stance()
//Resisting out of things
if(!ai_inactive && incapacitated(INCAPACITATION_DEFAULT) && stance != STANCE_IDLE)
resist()
//Movement
if(!stop_automated_movement && wander && !anchored) //Allowed to move?
handle_wander_movement()
//Speaking
if(speak_chance && stance == STANCE_IDLE) // Allowed to chatter?
handle_idle_speaking()
//Resisting out buckles
if(stance != STANCE_IDLE && incapacitated(INCAPACITATION_BUCKLED_PARTIALLY))
resist()
//Resisting out of closets
if(istype(loc,/obj/structure/closet))
var/obj/structure/closet/C = loc
if(C.welded)
resist()
else
C.open()
return 1
@@ -807,12 +817,17 @@
//Someone wants help?
/mob/living/simple_animal/proc/HelpRequested(var/mob/living/simple_animal/F)
if(!(stance == STANCE_IDLE) || stat)
if(target_mob || stat)
ai_log("HelpRequested() by [F] but we're busy/dead",2)
return
if(get_dist(src,F) <= follow_dist)
ai_log("HelpRequested() by [F] but we're already here",2)
return
if(get_dist(src,F) <= view_range)
ai_log("HelpRequested() by [F] and within targetshare range",2)
if(F.target_mob && set_target(F.target_mob))
handle_stance(STANCE_ATTACK)
return
if(set_follow(F, 10 SECONDS))
handle_stance(STANCE_FOLLOW)

View File

@@ -362,7 +362,7 @@
var/deathtimeseconds = round((deathtime - deathtimeminutes * 600) / 10,1)
usr << "You have been dead for[pluralcheck] [deathtimeseconds] seconds."
if (deathtime < (5 * 600))
if ((deathtime < (5 * 600)) && (ticker && ticker.current_state > GAME_STATE_PREGAME))
usr << "You must wait 5 minutes to respawn!"
return
else

View File

@@ -153,7 +153,6 @@
var/voice_name = "unidentifiable voice"
var/faction = "neutral" //Used for checking whether hostile simple animals will attack you, possibly more stuff later
var/captured = 0 //Functionally, should give the same effect as being buckled into a chair when true. Only used by energy nets, TODO replace with buckling
//Generic list for proc holders. Only way I can see to enable certain verbs/procs. Should be modified if needed.
var/proc_holder_list[] = list()//Right now unused.

View File

@@ -322,7 +322,7 @@
if(hit_zone == O_EYES)
attack_eye(affecting, assailant)
else if(hit_zone == BP_HEAD)
headbut(affecting, assailant)
headbutt(affecting, assailant)
else
dislocate(affecting, assailant, hit_zone)

View File

@@ -88,7 +88,7 @@
attack.handle_eye_attack(attacker, target)
/obj/item/weapon/grab/proc/headbut(mob/living/carbon/human/target, mob/living/carbon/human/attacker)
/obj/item/weapon/grab/proc/headbutt(mob/living/carbon/human/target, mob/living/carbon/human/attacker)
if(!istype(attacker))
return
if(target.lying)

View File

@@ -1025,9 +1025,13 @@
icon_state = "tat_campbell"
body_parts = list(BP_R_ARM)
left
name = "Tattoo (Campbell, L.Arm)"
body_parts = list(BP_L_ARM)
tat_tiger
name = "Tattoo (Tiger Stripes, Body)"
icon_state = "tat_campbell"
icon_state = "tat_tiger"
body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_TORSO,BP_GROIN)
taj_paw_socks

View File

@@ -1127,7 +1127,7 @@ Note that amputating the affected organ does in fact remove the infection from t
return !(status & (ORGAN_MUTATED|ORGAN_DEAD))
/obj/item/organ/external/proc/is_malfunctioning()
return ((robotic >= ORGAN_ROBOT) && (brute_dam + burn_dam) >= 10 && prob(brute_dam + burn_dam))
return ((robotic >= ORGAN_ROBOT) && (brute_dam + burn_dam) >= 25 && prob(brute_dam + burn_dam))
/obj/item/organ/external/proc/embed(var/obj/item/weapon/W, var/silent = 0)
if(!owner || loc != owner)

View File

@@ -5,9 +5,6 @@
/obj/item/weapon/cell/New()
..()
charge = maxcharge
/obj/item/weapon/cell/initialize()
..()
update_icon()
/obj/item/weapon/cell/drain_power(var/drain_check, var/surge, var/power = 0)

View File

@@ -31,6 +31,10 @@
projectile_type = /obj/item/projectile/ion/small
matter = list(DEFAULT_WALL_MATERIAL = 130, "uranium" = 100)
/*
* 9mm
*/
/obj/item/ammo_casing/c9mm
desc = "A 9mm bullet casing."
caliber = "9mm"
@@ -65,6 +69,10 @@
projectile_type = /obj/item/projectile/bullet/pistol/ap
*/
/*
* 45 ammo
*/
/obj/item/ammo_casing/c45
desc = "A .45 bullet casing."
caliber = ".45"
@@ -101,6 +109,15 @@
icon_state = "empcasing"
matter = list(DEFAULT_WALL_MATERIAL = 130, "uranium" = 100)
/obj/item/ammo_casing/c45/hp
desc = "A .45 hollow-point bullet casing."
projectile_type = /obj/item/projectile/bullet/pistol/medium/hollow
/*
* 10mm
*/
/obj/item/ammo_casing/a10mm
desc = "A 10mm bullet casing."
caliber = "10mm"
@@ -113,6 +130,10 @@
icon_state = "empcasing"
matter = list(DEFAULT_WALL_MATERIAL = 130, "uranium" = 100)
/*
* Shotguns
*/
/obj/item/ammo_casing/shotgun
name = "shotgun slug"
desc = "A 12 gauge slug."
@@ -178,6 +199,10 @@
// projectile_type = /obj/item/projectile/bullet/shotgun/ion
matter = list(DEFAULT_WALL_MATERIAL = 360, "uranium" = 240)
/*
* 762mm
*/
/obj/item/ammo_casing/a762
desc = "A 7.62mm bullet casing."
caliber = "a762"
@@ -199,6 +224,12 @@
projectile_type = /obj/item/projectile/bullet/blank
matter = list(DEFAULT_WALL_MATERIAL = 90)
/obj/item/ammo_casing/a762/hp
desc = "A 7.62mm hollow-point bullet casing."
projectile_type = /obj/item/projectile/bullet/rifle/a762/hollow
//145mm
/obj/item/ammo_casing/a145
desc = "A 14.5mm shell."
icon_state = "lcasing"
@@ -206,6 +237,10 @@
projectile_type = /obj/item/projectile/bullet/rifle/a145
matter = list(DEFAULT_WALL_MATERIAL = 1250)
/*
* 556mm
*/
/obj/item/ammo_casing/a556
desc = "A 5.56mm bullet casing."
caliber = "a556"
@@ -222,6 +257,14 @@
icon_state = "rifle-casing" // Need to make an icon for these
projectile_type = /obj/item/projectile/bullet/rifle/practice
/obj/item/ammo_casing/a556/hp
desc = "A 5.56mm hollow-point bullet casing."
projectile_type = /obj/item/projectile/bullet/rifle/a556/hollow
/*
* Misc
*/
/obj/item/ammo_casing/rocket
name = "rocket shell"
desc = "A high explosive designed to be fired from a launcher."

View File

@@ -225,9 +225,32 @@
light_power = 0.5
light_color = "#00C6FF"
//----------------------------
// Dark matter stun
//----------------------------
/obj/effect/projectile/darkmatterstun/tracer
icon_state = "darkt"
light_range = 2
light_power = 0.5
light_color = "#8837A3"
/obj/effect/projectile/darkmatterstun/muzzle
icon_state = "muzzle_darkt"
light_range = 2
light_power = 0.5
light_color = "#8837A3"
/obj/effect/projectile/darkmatterstun/impact
icon_state = "impact_darkt"
light_range = 2
light_power = 0.5
light_color = "#8837A3"
//----------------------------
// Dark matter
//----------------------------
/obj/effect/projectile/darkmatter/tracer
icon_state = "darkb"
light_range = 2

View File

@@ -114,4 +114,93 @@
recoil = 2 // ow my fucking hand
accuracy = -1 // smooth bore + short barrel = shit accuracy
ammo_type = /obj/item/ammo_casing/shotgun
// ToDo: Remove accuracy debuf in exchange for slightly injuring your hand every time you fire it.
// ToDo: Remove accuracy debuf in exchange for slightly injuring your hand every time you fire it.
/obj/item/weapon/gun/projectile/revolver/lemat
name = "LeMat Revolver"
desc = "The LeMat Revolver is a 9 shot revolver with a secondary firing barrel loading shotgun shells. For when you really need something dead."
icon_state = "lemat"
item_state = "revolver"
origin_tech = list(TECH_COMBAT = 2, TECH_MATERIAL = 2)
handle_casings = CYCLE_CASINGS
max_shells = 9
caliber = "38"
ammo_type = /obj/item/ammo_casing/c38
var/secondary_max_shells = 1
var/secondary_caliber = "shotgun"
var/secondary_ammo_type = /obj/item/ammo_casing/shotgun
var/flipped_firing = 0
var/list/secondary_loaded = list()
var/list/tertiary_loaded = list()
/obj/item/weapon/gun/projectile/revolver/lemat/New()
for(var/i in 1 to secondary_max_shells)
secondary_loaded += new secondary_ammo_type(src)
..()
/obj/item/weapon/gun/projectile/revolver/lemat/verb/swap_firingmode()
set name = "Swap Firing Mode"
set category = "Object"
set desc = "Click to swap from one method of firing to another."
var/mob/living/carbon/human/M = usr
if(!M.mind)
return 0
to_chat(M, "<span class='notice'>You change the firing mode on \the [src].</span>")
if(!flipped_firing)
if(max_shells && secondary_max_shells)
max_shells = secondary_max_shells
if(caliber && secondary_caliber)
caliber = secondary_caliber
if(ammo_type && secondary_ammo_type)
ammo_type = secondary_ammo_type
if(secondary_loaded)
tertiary_loaded = loaded.Copy()
loaded = secondary_loaded
flipped_firing = 1
else
if(max_shells)
max_shells = initial(max_shells)
if(caliber && secondary_caliber)
caliber = initial(caliber)
if(ammo_type && secondary_ammo_type)
ammo_type = initial(ammo_type)
if(tertiary_loaded)
secondary_loaded = loaded.Copy()
loaded = tertiary_loaded
flipped_firing = 0
/obj/item/weapon/gun/projectile/revolver/lemat/spin_cylinder()
set name = "Spin cylinder"
set desc = "Fun when you're bored out of your skull."
set category = "Object"
chamber_offset = 0
visible_message("<span class='warning'>\The [usr] spins the cylinder of \the [src]!</span>", \
"<span class='notice'>You hear something metallic spin and click.</span>")
playsound(src.loc, 'sound/weapons/revolver_spin.ogg', 100, 1)
if(!flipped_firing)
loaded = shuffle(loaded)
if(rand(1,max_shells) > loaded.len)
chamber_offset = rand(0,max_shells - loaded.len)
/obj/item/weapon/gun/projectile/revolver/lemat/examine(mob/user)
..()
if(secondary_loaded)
var/to_print
for(var/round in secondary_loaded)
to_print += round
to_chat(user, "\The [src] has a secondary barrel loaded with \a [to_print]")
else
to_chat(user, "\The [src] has a secondary barrel that is empty.")

View File

@@ -58,16 +58,30 @@
item_state = "darkcannon"
fire_sound = 'sound/weapons/eLuger.ogg'
w_class = ITEMSIZE_HUGE
charge_cost = 600
projectile_type = /obj/item/projectile/beam/darkmatter
charge_cost = 300
projectile_type = /obj/item/projectile/beam/stun/darkmatter
self_recharge = 1
accuracy = 2
firemodes = list(
list(mode_name="stunning", burst=1, fire_delay=null, move_delay=null, burst_accuracy=list(2), dispersion=null, projectile_type=/obj/item/projectile/beam/stun/darkmatter, charge_cost = 300),
list(mode_name="focused", burst=1, fire_delay=null, move_delay=null, burst_accuracy=list(2), dispersion=null, projectile_type=/obj/item/projectile/beam/darkmatter, charge_cost = 600),
list(mode_name="scatter burst", burst=8, fire_delay=null, move_delay=4, burst_accuracy=list(0, 0, 0, 0, 0, 0, 0, 0), dispersion=list(3, 3, 3, 3, 3, 3, 3, 3, 3), projectile_type=/obj/item/projectile/energy/darkmatter, charge_cost = 300),
)
/obj/item/projectile/beam/stun/darkmatter
name = "dark matter wave"
icon_state = "darkt"
nodamage = 1
taser_effect = 1
agony = 55
damage_type = HALLOSS
light_color = "#8837A3"
muzzle_type = /obj/effect/projectile/darkmatterstun/muzzle
tracer_type = /obj/effect/projectile/darkmatterstun/tracer
impact_type = /obj/effect/projectile/darkmatterstun/impact
/obj/item/projectile/beam/darkmatter
name = "dark matter bolt"
icon_state = "darkb"
@@ -107,33 +121,29 @@
self_recharge = 1
charge_cost = 600
projectile_type=/obj/item/projectile/sonic/strong
projectile_type=/obj/item/projectile/sonic/weak
firemodes = list(
list(mode_name="suppressive", projectile_type=/obj/item/projectile/sonic/weak, charge_cost = 200),
list(mode_name="normal", projectile_type=/obj/item/projectile/sonic/strong, charge_cost = 600),
list(mode_name="suppressive", projectile_type=/obj/item/projectile/sonic/weak, charge_cost = 300),
)
/obj/item/projectile/sonic
name = "sonic pulse"
icon_state = "sound"
damage = 15
damage = 5
armor_penetration = 30
damage_type = BRUTE
check_armour = "melee"
embed_chance = 0
vacuum_traversal = 0
// var/amplitude = 10 //Roughly how loud it is, changes the way damage will work, and such
/obj/item/projectile/sonic/weak
agony = 30
agony = 50
/obj/item/projectile/sonic/strong
damage = 45
//Already have thoughts on how to improve this, will take a day or two after initial testing. - Anewbe
/obj/item/projectile/sonic/strong/on_hit(var/atom/movable/target, var/blocked = 0)
if(ismob(target))
var/throwdir = get_dir(firer,target)

View File

@@ -137,6 +137,10 @@
damage = 20
armor_penetration = 15
/obj/item/projectile/bullet/pistol/medium/hollow
damage = 30
armor_penetration = -50
/obj/item/projectile/bullet/pistol/strong //revolvers and matebas
damage = 60
@@ -200,6 +204,11 @@
damage = 20
armor_penetration = 50 // At 40 or more armor, this will do more damage than standard rounds.
/obj/item/projectile/bullet/rifle/a762/hollow
damage = 35
armor_penetration = -50
penetrating = 0
/obj/item/projectile/bullet/rifle/a556
damage = 35
@@ -207,6 +216,11 @@
damage = 30
armor_penetration = 50 // At 30 or more armor, this will do more damage than standard rounds.
/obj/item/projectile/bullet/rifle/a556/hollow
damage = 40
armor_penetration = -50
penetrating = 0
/obj/item/projectile/bullet/rifle/a145
damage = 80
stun = 3

View File

@@ -164,7 +164,7 @@
name = "Carthatoline"
id = "carthatoline"
result = "carthatoline"
required_reagents = list("dylovene" = 1, "carbon" = 2, "phoron" = 0.1)
required_reagents = list("anti_toxin" = 1, "carbon" = 2, "phoron" = 0.1)
catalysts = list("phoron" = 1)
result_amount = 2
@@ -1840,4 +1840,4 @@
id = "berrytea"
result = "berrytea"
required_reagents = list("tea" = 5, "berryjuice" = 1)
result_amount = 6
result_amount = 6