Merge pull request #15 from Aurorastation/master

updates
This commit is contained in:
Duck-
2015-04-01 10:18:55 -04:00
63 changed files with 1093 additions and 367 deletions
+71 -1
View File
@@ -555,6 +555,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
"blue wizard",
"red wizard",
"marisa wizard",
"protection detail",
"emergency response team",
"ert trooper",
"ert leading trooper",
@@ -565,6 +566,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
"nanotrasen officer",
"nanotrasen captain",
"shadowling"
// "iac_medic"
)
var/dresscode = input("Select dress for [M]", "Robust quick dress shop") as null|anything in dresspacks
if (isnull(dresscode))
@@ -854,6 +856,36 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
W.registered_name = M.real_name
M.equip_if_possible(W, slot_wear_id)
if("protection detail")
var/obj/item/clothing/tie/holster/hold = new(M)
var/obj/item/weapon/gun/energy/gun/pistol/weapon = new(M)
hold.contents += weapon
hold.holstered = weapon
var/obj/item/clothing/under/rank/ert/under = new(M)
under.hastie = hold
hold.has_suit = under
hold.has_suit.overlays += hold.inv_overlay
M.equip_to_slot_or_del(under, slot_w_uniform)
M.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/ert(M), slot_wear_suit)
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/swat(M), slot_shoes)
M.equip_to_slot_or_del(new /obj/item/clothing/gloves/swat(M), slot_gloves)
M.equip_to_slot_or_del(new /obj/item/device/radio/headset/ert(M), slot_l_ear)
M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/gun(M), slot_belt)
M.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses(M), slot_glasses)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(M), slot_back)
var/obj/item/weapon/card/id/W = new(M)
W.name = "[M.real_name]'s ID Card"
W.icon_state = "centcom"
W.access = get_all_accesses()
W.access += get_ert_access()
W.assignment = "ERT Protection Detail"
W.registered_name = M.real_name
M.equip_to_slot_or_del(W, slot_wear_id)
if("emergency response team")
M.equip_to_slot_or_del(new /obj/item/clothing/under/rank/ert(M), slot_w_uniform)
M.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/ert(M), slot_wear_suit)
@@ -868,7 +900,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
W.name = "[M.real_name]'s ID Card"
W.icon_state = "centcom"
W.access = get_all_accesses()
W.access += get_all_centcom_access()
W.access += get_ert_access()
W.assignment = "Emergency Response Team"
W.registered_name = M.real_name
M.equip_to_slot_or_del(W, slot_wear_id)
@@ -1095,7 +1127,45 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
W.assignment = "Field Operator"
W.registered_name = M.real_name
M.equip_to_slot_or_del(W, slot_wear_id)
/* REMOVED BECAUSE STUCK
if("iac_medic")
var/obj/item/clothing/under/rank/medical/iac = new(M)
iac.hastie = new /obj/item/clothing/tie/armband/iac(iac)
M.equip_to_slot_or_del(iac, slot_w_uniform)
M.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/labcoat/iac(M), slot_wear_suit)
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/white(M), slot_shoes)
M.equip_to_slot_or_del(new /obj/item/clothing/gloves/latex(M), slot_gloves)
M.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_med(M), slot_l_ear)
M.equip_to_slot_or_del(new /obj/item/clothing/glasses/hud/health(M), slot_glasses)
M.equip_to_slot_or_del(new /obj/item/clothing/mask/surgical(M), slot_wear_mask)
var/obj/item/weapon/storage/belt/medical/medical = new(M)
medical.contents += new /obj/item/weapon/reagent_containers/hypospray
medical.contents += new /obj/item/weapon/reagent_containers/glass/bottle/antitoxin
medical.contents += new /obj/item/weapon/reagent_containers/glass/bottle/inaprovaline
medical.contents += new /obj/item/weapon/reagent_containers/glass/bottle/bicaridine
medical.contents += new /obj/item/weapon/reagent_containers/glass/bottle/dex_plus
medical.contents += new /obj/item/weapon/reagent_containers/glass/bottle/dermaline
medical.contents += new /obj/item/stack/medical/advanced/bruise_pack
medical.contents += new /obj/item/stack/medical/advanced/ointment
M.equip_to_slot_or_del(medical, slot_belt)
M.equip_to_slot_or_del(new /obj/item/device/healthanalyzer(M), slot_l_store)
M.equip_to_slot_or_del(new /obj/item/device/flash(M), slot_r_store)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/emt(M), slot_back)
M.equip_to_slot_or_del(new /obj/item/device/flashlight/pen(M), slot_s_store)
var/obj/item/weapon/card/id/silver/W = new(src)
W.name = "[M.real_name]'s ID Card"
W.icon_state = "id"
W.access = get_all_accesses()//Full station access because, DOCTOR HAAAAAAAALP MEEEEEE
W.access += list(access_cent_general, access_cent_specops, access_cent_storage)//CC access to the ERT area(s) so they can gear up and get to the station.
W.assignment = "IAC Worker"
W.registered_name = M.real_name
M.equip_to_slot_or_del(W, slot_wear_id)
*/
M.regenerate_icons()
log_admin("[key_name(usr)] changed the equipment of [key_name(M)] to [dresscode].")
+10 -2
View File
@@ -131,6 +131,7 @@ var/list/forbidden_varedit_object_types = list(
if(!istype(L,/list)) src << "Not a List."
var/list/locked = list("vars", "key", "ckey", "client", "firemut", "ishulk", "telekinesis", "xray", "virus", "viruses", "cuffed", "ka", "last_eaten", "urine", "poo", "icon", "icon_state")
var/list/forbidden = list("holder") //Why this way, fuck knows.
var/list/names = sortList(L)
var/variable = input("Which var?","Var") as null|anything in names + "(ADD VAR)"
@@ -149,6 +150,9 @@ var/list/forbidden_varedit_object_types = list(
if(variable in locked)
if(!check_rights(R_DEBUG|R_DEV|R_FUN)) return
if(variable in forbidden)
if(!check_rights(R_SERVER)) return
if(isnull(variable))
usr << "Unable to determine variable type."
@@ -290,8 +294,10 @@ var/list/forbidden_varedit_object_types = list(
src << "A variable with this name ([param_var_name]) doesn't exist in this atom ([O])"
return
if(param_var_name == "holder" || (param_var_name in locked))
if(param_var_name in locked)
if(!check_rights(R_DEBUG|R_DEV|R_FUN)) return
if(param_var_name == "holder")
if(!check_rights(R_SERVER)) return
variable = param_var_name
@@ -348,8 +354,10 @@ var/list/forbidden_varedit_object_types = list(
if(!variable) return
var_value = O.vars[variable]
if(variable == "holder" || (variable in locked))
if(param_var_name in locked)
if(!check_rights(R_DEBUG|R_DEV|R_FUN)) return
if(param_var_name == "holder")
if(!check_rights(R_SERVER)) return
if(!autodetect_class)
+8
View File
@@ -124,6 +124,14 @@
M.equip_if_possible(new /obj/item/weapon/melee/telebaton(M), slot_l_store)
M.equip_if_possible(new /obj/item/device/taperecorder(M), slot_r_store)
var /obj/item/weapon/storage/lockbox/lockbox = new(M)
lockbox.req_access = list(access_cent_captain)
lockbox.name = "A Duty Officer briefcase"
lockbox.desc = "A smart looking briefcase with a NT logo on the side"
lockbox.storage_slots = 8
lockbox.max_combined_w_class = 16
M.equip_if_possible(lockbox, slot_l_hand)
var/obj/item/device/pda/central/pda = new(M)
pda.owner = M.real_name
pda.ownjob = "Central Command Duty Officer"
+12 -1
View File
@@ -20,11 +20,16 @@ datum/sqlnews
var/time //publishtime, time in gametime
var/id //id, primary-key, of the news article that's destined for pulling.
var/running = 1 //whenever no results are found, this ticks over to a 0, and thus, no more updates.
var/fails = 0
datum/sqlnews/proc/process()
if(!running == 1) //No more news, immediate kill and return.
return
if(fails >= 5) //If it sucks at running, we'll off it.
kill()
return
if(!id && !time) //No entry loaded, update and load one.
update()
return
@@ -37,6 +42,7 @@ datum/sqlnews/proc/update() //Updates the stored variables and preppes it for a
establish_db_connection()
if(!dbcon.IsConnected())
error("SQL database connection failed. Attempted to fetch news information.")
fails++
return
var/DBQuery/query = dbcon.NewQuery("SELECT id, publishtime FROM aurora_news WHERE isnull(notpublishing) ORDER BY publishtime ASC LIMIT [count],1")
@@ -59,6 +65,7 @@ datum/sqlnews/proc/publish() //Uses data stored from the update() proc and: pull
establish_db_connection()
if(!dbcon.IsConnected())
error("SQL database connection failed. Attempted to fetch news information.")
fails++
return
var/DBQuery/fetchquery = dbcon.NewQuery("SELECT channel, author, body FROM aurora_news WHERE id=[id]")
@@ -93,4 +100,8 @@ datum/sqlnews/proc/publish() //Uses data stored from the update() proc and: pull
NEWSCASTER.newsAlert("[channel]")
id = null
time = null
time = null
datum/sqlnews/proc/kill()
running = 0
return
+1
View File
@@ -164,6 +164,7 @@
host = key
world.update_status()
admin_memo_player_show()
if(holder)
add_admin_verbs()
admin_memo_show()
+1 -6
View File
@@ -80,12 +80,7 @@
if("labgreen_all")
src.icon_state = "labgreen_open"
usr << "You unbotton the labcoat."
if("fabian_coat_open")
src.icon_state = "fabian_coat_closed"
usr << "You button up the coat's buttons."
if("fabian_coat_closed")
src.icon_state = "fabian_coat_open"
usr << "You unbutton the coat's buttons."
else
usr << "You attempt to button-up the velcro on your [src], before promptly realising how retarded you are."
return
+288 -10
View File
@@ -533,18 +533,42 @@
item_state = "amy_gloves"
clipped = 1
/obj/item/clothing/tie/storage/fluff/cecillia_locket //Old locket - Cecillia Lambert - casperf1 - DONE
/obj/item/clothing/tie/fluff/cecillia_locket //Old locket - Cecillia Lambert - casperf1 - DONE
name = "old locket"
desc = "A dark metal locket, it seems at least sixty years old. The photo that was once inside is gone."
icon = 'icons/obj/custom_items.dmi'
icon_state = "cecillia_locket1" //Keep as one, to indicate glass.
item_state = "cecillia_locket1"
item_color = "cecillia_locket1"
slots = 1
slot_flags = SLOT_MASK
var/pill
attack_self(mob/user as mob)
if(pill)
user.put_in_hands(pill)
user << "\blue You take out the pill that was housed in the [src]."
pill = null
icon_state = "cecillia_locket0"
item_state = icon_state
update_icon()
attackby(obj/item/I, mob/usr)
if(istype(I, /obj/item/weapon/reagent_containers/pill/) && !pill)
usr.u_equip(I)
I.loc = src
pill = I
I.dropped(usr)
I.add_fingerprint(usr)
add_fingerprint(usr)
icon_state = "cecillia_locket1"
item_state = icon_state
usr << "\blue You securely fit the [I] into the [src]."
update_icon()
New()
..()
new /obj/item/weapon/reagent_containers/pill/cecillia_pill(hold)
pill = new /obj/item/weapon/reagent_containers/pill/cecillia_pill()
return
/obj/item/weapon/reagent_containers/pill/cecillia_pill
@@ -732,20 +756,16 @@
src.item_state = "ushanka_avadown"
user << "You lower the ear flaps on the ushanka."
/obj/item/clothing/tie/fluff/hamil_badge // Internal Investigations Badge - Muhammad Hamil - Jackboot - DONE
/obj/item/clothing/tie/holobadge/fluff/hamil_badge // Internal Investigations Badge - Muhammad Hamil - Jackboot - DONE
name = "Internal Investigations Badge"
desc = "An Internal Investigation badge. Used by a special branch of the Elyran police force."
icon = 'icons/obj/custom_items.dmi'
item_state = "hamil_badge"
icon_state = "hamil_badge"
attack_self(mob/user as mob)
if(isliving(user))
user.visible_message("\red [user] flashes their [src].\nIt reads: Muhammad Hamil, Internal Investigations, Persepolis..","\red You display the [src].\nIt reads: Muhammad Hamil, Internal Investigations, Persepolis.")
attack(mob/living/carbon/human/M, mob/living/user)
if(isliving(user))
user.visible_message("\red [user] invades [M]'s personal space, thrusting [src] into their face insistently.","\red You invade [M]'s personal space, thrusting [src] into their face insistently. You are the law.")
/obj/item/clothing/mask/gas/fluff/stefan_mask // Modified Gas Mask - Oliver Stefan - Nbielinski - DONE
desc = "This odd looking gas mask is quite clearly not of NanoTrasen origin as it sports a black metal polish, as well as a reflective face plate that mirrors the view of the mask itself. This particular mask appears to breathe with the user, hissing when they exhale, and whining softly as they inhale."
name = "Modified Gas Mask"
@@ -887,7 +907,8 @@
/obj/item/device/taperecorder/fluff/language_processor //Advanced Language Processing Board - Android - TheCritsyBear
name = "Advanced Language Processing Board"
desc = "A slightly advanced, but not uncommon upgrade module considered to be the cheapest of its kind. It has the markings of an independent retailer- not standard NanoTrasen hardware."
icon_state = "paragon_datachip"
icon = 'icons/obj/module.dmi'
icon_state = "cyborg_upgrade3"
item_state = "dermal"
slot_flags = SLOT_HEAD
@@ -917,3 +938,260 @@
item_state = "dove_necklace"
item_color = "dove_necklace"
slot_flags = SLOT_MASK
/obj/item/weapon/nullrod/fluff/hartam_rod // Faol's resolve - Hartam Bartam
name = "Faol's resolve"
desc = "A symbol forged of steel, tempered in holy water, it has several gold-colored rings on it. Judging by the numerous dents and scratches on this thing, it has seen a lot of years..."
icon = 'icons/obj/custom_items.dmi'
icon_state = "hartam_rod"
/obj/item/device/radio/headset/fluff/sam_implant // Cochlear Implant - Samantha Mason - Bakagaijin
name = "Cochlear Implant"
desc = "A specialized earpiece and headset combination. It appears to help those who are deaf hear."
icon = 'icons/obj/custom_items.dmi'
icon_state = "sam_implant"
/obj/item/weapon/melee/fluff/tina_knife // Consecrated Athame - Tina Kaekel - Tainevva
name = "Consecrated Athame"
desc = "An athame used in occult rituals. The double-edged dagger is dull. The handle is black with a pink/white occult design strewn about it, and 'Tina' is inscribed into it in decorated letters."
icon = 'icons/obj/custom_items.dmi'
icon_state = "tina_knife"
flags = FPRINT | TABLEPASS
slot_flags = SLOT_BELT
w_class = 1
force = 2
/obj/item/clothing/tie/holobadge/fluff/peter_badge // Peter Stone's badge - Peter Stone - Jakers457
name = "Peter Stone's badge"
desc = "An old looking badge that has seen as many ordeals as its owner. It has the name 'Peter Stone' inscribed on it."
icon = 'icons/obj/custom_items.dmi'
icon_state = "peter_badge"
stored_name = "Peter Stone"
/obj/item/clothing/tie/armband/iac_armband // Interstellar Aid Corps armband - Grey Ryan - Jackboot
name = "Interstellar Aid Corps armband"
desc = "An armband denoting its wearer as a medical worker of the Interstellar Aid Corps."
icon = 'icons/obj/custom_items.dmi'
icon_state = "iac_armband"
item_color = "iac"
/obj/item/clothing/gloves/fluff/imraj_kara // kara - Imraj Brar - Canon35
name = "kara"
desc = "A bracelet made of what looks like steel."
icon = 'icons/obj/custom_items.dmi'
icon_state = "imraj_kara"
item_color = "imraj_kara"
/obj/item/weapon/melee/fluff/imraj_kirpan // kirban - Imraj Brar - Canon35
name = "kirpan"
desc = "A knife with a metal grip and blade, has strange characters written on the sides."
icon = 'icons/obj/custom_items.dmi'
icon_state = "imraj_kirpan"
item_state = "imraj_kirpan"
w_class = 2.0
throwforce = 0
throw_speed = 4
throw_range = 20
/obj/item/clothing/head/fluff/imraj_turban // turban - Imraj Brar - Canon35
name = "turban"
desc = "A piece of soft headgear."
icon = 'icons/obj/custom_items.dmi'
icon_state = "imraj_turban"
item_state = "imraj_turban"
armor = list(melee = 20, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
/obj/item/weapon/fluff/imraj_kangha // kangha - Imraj Brar - Canon35
name = "kangha"
desc = "A small wooden comb."
w_class = 1.0
icon = 'icons/obj/custom_items.dmi'
icon_state = "imraj_kangha"
attack_self(mob/user)
if(user.r_hand == src || user.l_hand == src)
var/mobgender
if(user.gender == "male")
mobgender = "guy"
else
mobgender = "gal"
for(var/mob/O in viewers(user, null))
O.show_message(text("\red [] uses [] to comb their hair with incredible style and sophistication. What a [mobgender].", user, src), 1)
return
/obj/item/clothing/suit/fluff/apophis_coat // Thick Jacket - Apophis Quihtzin - Kingmatt9
name = "thick jacket"
desc = "A brown leather trenchcoat-like jacket, it smells of snow."
icon = 'icons/obj/custom_items.dmi'
icon_state = "apophis_jacket"
item_state = "apophis_jacket"
/obj/item/clothing/suit/armor/vest/fluff/sam_armour // Stabproof Vest - Sam Macnaughton - Sgtsammac
name = "stab proof vest"
desc = "It's a red vest, with high visibility strips. You can see the emblem of the NanoTrasen security division on the right breast."
icon = 'icons/obj/custom_items.dmi'
icon_state = "sam_armour"
item_state = "sam_armour"
//////////////////////////////////////////
////////////REDO THIS/////////////
//////////////////////////////////////////
/obj/item/device/radio/fluff/smile_bara // Dr. Smile - Daniela Baranova - Rechkalov
name = "Dr. Smile"
desc = "A black suitcase with a simple yet soothing/supportive smiley-face on them."
icon = 'icons/obj/custom_items.dmi'
icon_state = "smilemotherfucker"
item_state = "smilemotherfucker_m"
/obj/item/weapon/coin/fluff/luna_coin //Purple Coin - Luna Tsuki - Wer6
name = "purple coin"
desc = "An anodized purple titanium coin in a sealed transparent case. The stamped portrait of a woman adorns one side, with the name 'Luna Tsuki' beneath. A hawk symbol rests on the opposing side, with the words 'We will miss you!' stamped beneath."
icon = 'icons/obj/custom_items.dmi'
icon_state = "luna_coin"
attack_self(mob/user as mob)
user << "\blue You find it unwise to flip the encased coin."
return
attackby(obj/item/weapon/W as obj, mob/user as mob)
return
/obj/item/clothing/suit/storage/fluff/varick_coat //Frontier Duffle Coat - Talia Varick - OneOneThreeEight
name = "Frontier duffle coat"
desc = "A lightweight, navy duffle coat. This frontier coat is fashioned with horn-toggles, a golden leopard pin, cuff tassles and even intentional decorative tears in the fabric itself."
icon = 'icons/obj/custom_items.dmi'
icon_state = "varick_coat_open"
item_state = "varick_coat_open"
verb/toggle()
set name = "Toggle horn toggles"
set category = "Object"
set src in usr
if(!usr.canmove || usr.stat || usr.restrained())
return 0
switch(icon_state)
if("varick_coat_open")
src.icon_state = "varick_coat_closed"
usr << "You fasten the coat's horn-toggles."
if("varick_coat_closed")
src.icon_state = "varick_coat_open"
usr << "You unfasten the coat's horn-toggles"
usr.update_inv_wear_suit()
/obj/item/clothing/under/rank/fluff/faust_uniform //Eridani Federal Army uniform - Bryce Faust - Hackie Mhan
name = "Eridani Federal Army uniform"
desc = "This uniform is old, with multiple stitches. Certain parts of the uniform are missing and yet it is still of a distinctly high quality"
icon = 'icons/obj/custom_items.dmi'
icon_state = "faust_uniform"
item_color = "faust_uniform"
item_state = "faust_uniform"
/obj/item/clothing/head/beret/fluff/faust_beret //military beret - Bryce Faust - Hackie Mhan
name = "military beret"
desc = "This beret has the Eridani Federal Army symbol, it's old but still in good shape."
icon = 'icons/obj/custom_items.dmi'
icon_state = "faust_beret"
item_state = "faust_beret"
/obj/item/clothing/head/ushanka/fluff/kuznetsov_ushanka // Ushanka - Dominika Kuznetsov - Kerbal22
name = "ushanka"
desc = "A comfortable fur ushanka with a small red star embroidered on the front."
/obj/item/clothing/mask/cigarette/pipe/fluff/hazeri_pipe //Hazeri's Pipe - Hazeri Saakhat - BlueSp34r
name = "Hazeri's Pipe"
desc = "A worn smoking pipe. It is made out of rare wood only found in Moghes, with little leaves sticking out of it."
icon = 'icons/obj/custom_items.dmi'
icon_state = "hazeri_pipe_off"
item_state = "hazeri_pipe_off"
icon_on = "hazeri_pipe_on"
icon_off = "hazeri_pipe_off"
smoketime = 200
can_hurt_mob = 0
/obj/item/weapon/cane/fluff/hazeri_cane //Hazeri's Cane - Hazeri Saakhat - BlueSp34r
name = "Hazeri's Cane"
desc = "An old warped cane with a flat bottom. It appears leafy; crafted from Moghian wood."
icon = 'icons/obj/custom_items.dmi'
icon_state = "hazeri_cane"
item_state = "hazeri_cane"
/obj/item/clothing/tie/fluff/kane_badge // Detective's Badge - Kane DeWitt - Joe Kane
name = "Detective's Badge"
desc = "A shiny brass detective's badge, backed by brown leather. Inscribed on the front is 'Kane DeWitt, DeWitt Detective Agency'."
icon = 'icons/obj/custom_items.dmi'
icon_state = "kane_badge"
item_color = "kane_badge"
slot_flags = SLOT_BELT
attack_self(mob/user as mob)
if(isliving(user))
user.visible_message("\red [user] flashes their [src].\nIt reads: Kane DeWitt, DeWitt Detective Agency.","\red You display the [src].\nIt reads: Kane DeWitt, DeWitt Detective Agency.")
attack(mob/living/carbon/human/M, mob/living/user)
if(isliving(user))
user.visible_message("\red [user] invades [M]'s personal space, thrusting your [src] into their face insistently.","\red You invade [M]'s personal space, thrusting [src] into their face insistently. You are the law.")
/obj/item/clothing/gloves/fluff/odanu_gloves //Old Unathi Handwraps - Odanu Adanutha - Prospekt1559
name = "old Unathi handwraps"
desc = "Old, stained hand wraps made of cloth. Holds in a miniscule amount of warmth and offers slight protection to one's knuckles."
icon = 'icons/obj/custom_items.dmi'
icon_state = "odanu_gloves"
item_state = "odanu_gloves"
species_restricted = list("Unathi")
clipped = 1
cold_protection = HANDS
min_cold_protection_temperature = GLOVES_MIN_COLD_PROTECTION_TEMPERATURE
/obj/item/fluff/red_gemstone //Red Gemstone - Mister Dosh - Somekindofpony
name = "red gemstone"
desc = "A small red piece of glass, cut into the shape of a gemstone."
icon = 'icons/obj/custom_items.dmi'
icon_state = "red_gemstone"
item_state = ""
w_class = 2.0
force = 1
throwforce = 2
attack_self(mob/user as mob)
if(isliving(user))
user.visible_message("\blue [user] appears to be fondling [src] obsessively.","\blue You obsess over [src], rolling it from hand to hand.")
attack(mob/living/carbon/human/M, mob/living/user)
if(isliving(user))
user.visible_message("\red [user] brushes up against [M], driving [src] into their face intrusively.","\red You brush up against [M], intrusively thrusting [src] into their face.")
/obj/item/clothing/tie/fluff/epsilon_badge // EPSILON PI Badge - EPSiLON - Prospekt1559
name = "EPSiLON private investigator badge"
desc = "A leather badge with gold plating on the front. When looked at closely it can be seen to be engraved with an eyeglass, with the letters 'E' and 'I' underneath."
icon = 'icons/obj/custom_items.dmi'
icon_state = "epsilon_badge"
item_color = "kane_badge"
slot_flags = SLOT_BELT
attack_self(mob/user as mob)
if(isliving(user))
user.visible_message("\red [user] flashes [src].\nIt reads: EPSilLON, Private Investigator.","\red You display [src].\nIt reads: EPSiLON, Private Investigator.")
attack(mob/living/carbon/human/M, mob/living/user)
if(isliving(user))
user.visible_message("\red [user] invades [M]'s personal space, thrusting [src] into their face insistently.","\red You invade [M]'s personal space, thrusting [src] into their face insistently. You are the law.")
/obj/item/clothing/tie/ert_dogtags // D O G T A G Z B O Y Z
name = "ERT dogtags"
desc = "Tpr Doe - Funsquad"
icon_state = "ert_tags"
item_color = "holobadge-cord"
slot_flags = SLOT_MASK
slot_flags = SLOT_BELT
var/rank = "Tpr"
var/surname = "Doe"
var/spec = "Security"
attack_self(mob/user as mob)
if(isliving(user))
user.visible_message("\red [user] raises [src].\nThey read: [rank] [surname] - [spec], Emergency Response Team.","\red You raise [src].\nThey read: [rank] [surname] - [spec], Emergency Response Team.")
+83 -64
View File
@@ -1,8 +1,85 @@
//switch this out to use a database at some point
//list of ckey/ real_name and item paths
//gives item to specific people when they join if it can
//for multiple items just add mutliple entries, unless i change it to be a listlistlist
//yes, it has to be an item, you can't pick up nonitems
/*
*
*New proc, SQL based, for custom item spawning starts here.
*
*/
/proc/EquipCustomItems(mob/living/carbon/human/M)
establish_db_connection()
if(!dbcon.IsConnected())
error("Custom item check failed: unable to connect to database.")
return
var/ckeyl = sanitizeSQL(M.ckey)
var/DBQuery/query = dbcon.NewQuery("SELECT item, job, real_name FROM aurora_customitems WHERE ckey='[ckeyl]'")
query.Execute()
while(query.NextRow())
var/path = query.item[1]
var/jobs = query.item[2]
var/char = query.item[3]
if(char == M.real_name)
path = trim(path)
path = text2path(path)
var/obj/item/Item = new path()
var/ok = 0
//ERT fluff items are speshul, K? K.
//Because they use the jobs var for data carrying, they get to be made before a job check
if(istype(Item,/obj/item/clothing/tie/ert_dogtags))
var/obj/item/clothing/tie/ert_dogtags/I = Item
var/datas = text2list(jobs, ",")
I.rank = datas[1]
I.surname = datas[2]
I.spec = datas[3]
I.desc = "[datas[1]] [datas[2]] - [datas[3]]"
jobs = null
if(istype(Item,/obj/item/clothing/suit/storage/ert))
var/obj/item/clothing/suit/storage/ert/I = Item
var/datas = text2list(jobs, ",")
I.desc = "A militaristic duty jacket worn by members of the NanoTrasen Emergency Response Teams. The nameplate reads: [datas[1]] [datas[2]]."
jobs = null
//Job restriction check.
if(jobs)
jobs = text2list(jobs, ",")
if(!M.mind.role_alt_title in jobs)
del(Item)
ok = 1
continue
//A place, where we have things that control item replacement and so on.
if(istype(Item,/obj/item/device/radio/headset/))
var/obj/item/device/radio/headset/I = Item
for(var/obj/item/device/radio/headset/A in M)
I.keyslot1 = A.keyslot1
I.keyslot2 = A.keyslot2
del(A)
ok = M.equip_if_possible(I, slot_l_ear, 0)
break
I.recalculateChannels()
else if(istype(Item,/obj/item/clothing/glasses/))
var/obj/item/clothing/glasses/I = Item
for(var/obj/item/clothing/glasses/A in M)
del(A)
M.glasses = null
break
ok = M.equip_if_possible(I, slot_glasses, 0)
if(ok == 0)
if(istype(M.back,/obj/item/weapon/storage) && M.back:contents.len < M.back:storage_slots) // Try to place it in something on the mob's back
Item.loc = M.back
ok = 1
continue
else if(ok == 0)
for(var/obj/item/weapon/storage/S in M.contents) // Try to place it in any item that can store stuff, on the mob.
if (S.contents.len < S.storage_slots)
Item.loc = S
ok = 1
continue
else if(ok == 0)// Finally, since everything else failed, place it on the ground
Item.loc = get_turf(M.loc)
/*
*Old procs for custom items start here
@@ -124,62 +201,4 @@ proc/EquipCustomItems(mob/living/carbon/human/M)
skip:
if (ok == 0) // Finally, since everything else failed, place it on the ground
Item.loc = get_turf(M.loc)
*
*
*New proc, SQL based, for custom item spawning starts here.
*
*/
/proc/EquipCustomItems(mob/living/carbon/human/M)
establish_db_connection()
if(!dbcon.IsConnected())
error("Custom item check failed: unable to connect to database.")
return
var/ckeyl = sanitizeSQL(M.ckey)
var/DBQuery/query = dbcon.NewQuery("SELECT item, job, real_name FROM aurora_customitems WHERE ckey='[ckeyl]'")
query.Execute()
while(query.NextRow())
var/path = query.item[1]
var/jobs = query.item[2]
var/char = query.item[3]
//Okay, so we have a query. It will only fill the var/path if the character actually has an item.
//I guess recursive spawn code is a thing to do, creating a list, and running a for() on that list seems excessive
//Getting lazy, alternative would be to use two variables, but this is just self-updating, really
if(char == M.real_name)
path = trim(path)
path = text2path(path)
var/obj/item/Item = new path()
var/ok = 0
if(!jobs)
goto skip
if(jobs)
jobs = text2list(jobs, ",")
if(M.mind.role_alt_title in jobs)
goto skip
else
del(Item)
ok = 1
continue
skip:
if(ok == 0)
if(istype(M.back,/obj/item/weapon/storage) && M.back:contents.len < M.back:storage_slots) // Try to place it in something on the mob's back
Item.loc = M.back
ok = 1
continue
else if(ok == 0)
for(var/obj/item/weapon/storage/S in M.contents) // Try to place it in any item that can store stuff, on the mob.
if (S.contents.len < S.storage_slots)
Item.loc = S
ok = 1
continue
else if(ok == 0)// Finally, since everything else failed, place it on the ground
Item.loc = get_turf(M.loc)
Item.loc = get_turf(M.loc)*/
+57 -45
View File
@@ -9,26 +9,37 @@
//Or someone snoring. So we make it where they won't hear it.
return
//make sure the air can transmit speech - hearer's side
var/turf/T = get_turf(src)
if ((T) && (!(istype(src, /mob/dead/observer)))) //Ghosts can hear even in vacuum.
var/datum/gas_mixture/environment = T.return_air()
var/pressure = (environment)? environment.return_pressure() : 0
if(pressure < SOUND_MINIMUM_PRESSURE && get_dist(speaker, src) > 1)
return
if (pressure < ONE_ATMOSPHERE*0.4) //sound distortion pressure, to help clue people in that the air is thin, even if it isn't a vacuum yet
italics = 1
sound_vol *= 0.5 //muffle the sound a bit, so it's like we're actually talking through contact
if(sleeping || stat == 1)
hear_sleep(message)
return
var/style = "body"
//non-verbal languages are garbled if you can't see the speaker. Yes, this includes if they are inside a closet.
if (language && (language.flags & NONVERBAL))
if (!speaker || (src.sdisabilities & BLIND || src.blinded) || !(speaker in view(src)))
message = stars(message)
if(!say_understands(speaker,language))
if(istype(speaker,/mob/living/simple_animal))
var/mob/living/simple_animal/S = speaker
message = pick(S.speak)
else
message = stars(message)
if(language)
style = language.colour
if(!(language && (language.flags & INNATE))) // skip understanding checks for INNATE languages
if(!say_understands(speaker,language))
if(istype(speaker,/mob/living/simple_animal))
var/mob/living/simple_animal/S = speaker
message = pick(S.speak)
else
if(language)
message = language.scramble(message)
else
message = stars(message)
var/speaker_name = speaker.name
if(istype(speaker, /mob/living/carbon/human))
@@ -41,8 +52,7 @@
var/track = null
if(istype(src, /mob/dead/observer))
if(italics && client.prefs.toggles & CHAT_GHOSTRADIO)
if(!verb == ("whispers" || " quietly" || " softly"))
return
return
if(speaker_name != speaker.real_name && speaker.real_name)
speaker_name = "[speaker.real_name] ([speaker_name])"
track = "(<a href='byond://?src=\ref[src];track=\ref[speaker]'>follow</a>) "
@@ -50,12 +60,16 @@
message = "<b>[message]</b>"
if(sdisabilities & DEAF || ear_deaf)
if(speaker == src)
src << "<span class='warning'>You cannot hear yourself speak!</span>"
else
src << "<span class='name'>[speaker_name]</span>[alt_name] talks but you cannot hear \him."
if(!language || !(language.flags & INNATE)) // INNATE is the flag for audible-emote-language, so we don't want to show an "x talks but you cannot hear them" message if it's set
if(speaker == src)
src << "<span class='warning'>You cannot hear yourself speak!</span>"
else
src << "<span class='name'>[speaker_name]</span>[alt_name] talks but you cannot hear \him."
else
src << "<span class='game say'><span class='name'>[speaker_name]</span>[alt_name] [track][verb], <span class='message'><span class='[style]'>\"[message]\"</span></span></span>"
if(language)
src << "<span class='game say'><span class='name'>[speaker_name]</span>[alt_name] [track][language.format_message(message, verb)]</span>"
else
src << "<span class='game say'><span class='name'>[speaker_name]</span>[alt_name] [track][verb], <span class='message'><span class='body'>\"[message]\"</span></span></span>"
if (speech_sound && (get_dist(speaker, src) <= world.view && src.z == speaker.z))
var/turf/source = speaker? get_turf(speaker) : get_turf(src)
src.playsound_local(source, speech_sound, sound_vol, 1)
@@ -71,40 +85,35 @@
return
var/track = null
var/speaker_name
var/style = "body"
if(!language)
language = new /datum/language/common
// if(!speaker)
//non-verbal languages are garbled if you can't see the speaker. Yes, this includes if they are inside a closet.
if (language && (language.flags & NONVERBAL))
if (!speaker || (src.sdisabilities & BLIND || src.blinded) || !(speaker in view(src)))
message = stars(message)
if(!say_understands(speaker,language))
if(istype(speaker,/mob/living/simple_animal))
var/mob/living/simple_animal/S = speaker
message = pick(S.speak)
else
if(!(language && (language.flags & INNATE))) // skip understanding checks for INNATE languages
if(!say_understands(speaker,language))
if(istype(speaker,/mob/living/simple_animal))
var/mob/living/simple_animal/S = speaker
if(S.speak && S.speak.len)
message = pick(S.speak)
else
return
else
if(language)
message = language.scramble(message)
else
message = stars(message)
if(hard_to_hear)
message = stars(message)
if(language)
verb = language.speech_verb
style = language.colour
if(hard_to_hear)
message = stars(message)
if(speaker)
speaker_name = speaker.name
var/speaker_name = speaker.name
if(vname)
speaker_name = vname
if(speaker && (istype(speaker, /mob/living/carbon/human)))
if(istype(speaker, /mob/living/carbon/human))
var/mob/living/carbon/human/H = speaker
if(H.voice)
speaker_name = H.voice
@@ -118,7 +127,7 @@
var/jobname // the mob's "job"
var/mob/living/carbon/human/impersonating //The crewmember being impersonated, if any.
if (speaker && (ishuman(speaker)))
if (ishuman(speaker))
var/mob/living/carbon/human/H = speaker
if((H.wear_id && istype(H.wear_id,/obj/item/weapon/card/id/syndicate)) && (H.wear_mask && istype(H.wear_mask,/obj/item/clothing/mask/gas/voice)))
@@ -158,13 +167,18 @@
speaker_name = "[speaker.real_name] ([speaker_name])"
track = "[speaker_name] (<a href='byond://?src=\ref[src];track=\ref[speaker]'>follow</a>)"
var/formatted
if(language)
formatted = language.format_message_radio(message, verb)
else
formatted = "[verb], <span class=\"body\">\"[message]\"</span>"
if(sdisabilities & DEAF || ear_deaf)
if(prob(20))
src << "<span class='warning'>You feel your headset vibrate but can hear nothing from it!</span>"
else if(track)
src << "[part_a][track][part_b][verb], <span class=\"[style]\">\"[message]\"</span></span></span>"
src << "[part_a][track][part_b][formatted]</span></span>"
else
src << "[part_a][speaker_name][part_b][verb], <span class=\"[style]\">\"[message]\"</span></span></span>"
src << "[part_a][speaker_name][part_b][formatted]</span></span>"
/mob/proc/hear_signlang(var/message, var/verb = "gestures", var/datum/language/language, var/mob/speaker = null)
if(!client)
@@ -205,8 +219,6 @@
M.show_message(message)
src << message
////////////////////////////////////////////////////////////////////////
/mob/proc/hear_sleep(var/message)
var/heard = ""
if(prob(15))
+215 -61
View File
@@ -1,3 +1,5 @@
#define SCRAMBLE_CACHE_LEN 20
/*
Datum based languages. Easily editable and modular.
*/
@@ -8,29 +10,103 @@
var/speech_verb = "says" // 'says', 'hisses', 'farts'.
var/ask_verb = "asks" // Used when sentence ends in a ?
var/exclaim_verb = "exclaims" // Used when sentence ends in a !
var/whisper_verb // Optional. When not specified speech_verb + quietly/softly is used instead.
var/signlang_verb = list() // list of emotes that might be displayed if this language has NONVERBAL or SIGNLANG flags
var/colour = "body" // CSS style to use for strings in this language.
var/colour = "body" // CSS style to use for strings in this language.
var/key = "x" // Character used to speak in language eg. :o for Unathi.
var/flags = 0 // Various language flags.
var/native // If set, non-native speakers will have trouble speaking.
var/list/syllables // Used when scrambling text for a non-speaker.
var/list/space_chance = 55 // Likelihood of getting a space in the random scramble string.
/datum/language/proc/get_random_name(var/gender, name_count=2, syllable_count=4)
if(!syllables || !syllables.len)
if(gender==FEMALE)
return capitalize(pick(first_names_female)) + " " + capitalize(pick(last_names))
else
return capitalize(pick(first_names_male)) + " " + capitalize(pick(last_names))
var/full_name = ""
var/new_name = ""
for(var/i = 0;i<name_count;i++)
new_name = ""
for(var/x = rand(Floor(syllable_count/2),syllable_count);x>0;x--)
new_name += pick(syllables)
full_name += " [capitalize(lowertext(new_name))]"
return "[trim(full_name)]"
/datum/language
var/list/scramble_cache = list()
/datum/language/proc/scramble(var/input)
if(!syllables || !syllables.len)
return stars(input)
// If the input is cached already, move it to the end of the cache and return it
if(input in scramble_cache)
var/n = scramble_cache[input]
scramble_cache -= input
scramble_cache[input] = n
return n
var/input_size = length(input)
var/scrambled_text = ""
var/capitalize = 1
while(length(scrambled_text) < input_size)
var/next = pick(syllables)
if(capitalize)
next = capitalize(next)
capitalize = 0
scrambled_text += next
var/chance = rand(100)
if(chance <= 5)
scrambled_text += ". "
capitalize = 1
else if(chance > 5 && chance <= space_chance)
scrambled_text += " "
scrambled_text = trim(scrambled_text)
var/ending = copytext(scrambled_text, length(scrambled_text))
if(ending == ".")
scrambled_text = copytext(scrambled_text,1,length(scrambled_text)-1)
var/input_ending = copytext(input, input_size)
if(input_ending in list("!","?","."))
scrambled_text += input_ending
// Add it to cache, cutting old entries if the list is too long
scramble_cache[input] = scrambled_text
if(scramble_cache.len > SCRAMBLE_CACHE_LEN)
scramble_cache.Cut(1, scramble_cache.len-SCRAMBLE_CACHE_LEN-1)
return scrambled_text
/datum/language/proc/format_message(message, verb)
return "[verb], <span class='message'><span class='[colour]'>\"[capitalize(message)]\"</span></span>"
/datum/language/proc/format_message_plain(message, verb)
return "[verb], \"[capitalize(message)]\""
/datum/language/proc/format_message_radio(message, verb)
return "[verb], <span class='[colour]'>\"[capitalize(message)]\"</span>"
/datum/language/proc/get_talkinto_msg_range(message)
// if you yell, you'll be heard from two tiles over instead of one
return (copytext(message, length(message)) == "!") ? 2 : 1
/datum/language/proc/broadcast(var/mob/living/speaker,var/message,var/speaker_mask)
log_say("[key_name(speaker)] : ([name]) [message]")
if(!speaker_mask) speaker_mask = speaker.name
var/msg = "<i><span class='game say'>[name], <span class='name'>[speaker_mask]</span> [format_message(message, get_spoken_verb(message))]</span></i>"
for(var/mob/player in player_list)
var/understood = 0
if(istype(player,/mob/dead))
understood = 1
else if((src in player.languages) && check_special_condition(player))
understood = 1
if(understood)
if(!speaker_mask) speaker_mask = speaker.name
var/msg = "<i><span class='game say'>[name], <span class='name'>[speaker_mask]</span> <span class='message'>[speech_verb], \"<span class='[colour]'>[message]</span><span class='message'>\"</span></span></i>"
player << "[msg]"
if(istype(player,/mob/dead) || ((src in player.languages) && check_special_condition(player)))
player << msg
/datum/language/proc/check_special_condition(var/mob/other)
return 1
@@ -43,6 +119,26 @@
return ask_verb
return speech_verb
// Noise "language", for audible emotes.
/datum/language/noise
name = "Noise"
desc = "Noises"
key = ""
flags = RESTRICTED|NONGLOBAL|INNATE|NO_TALK_MSG|NO_STUTTER
/datum/language/noise/format_message(message, verb)
return "<span class='message'><span class='[colour]'>[message]</span></span>"
/datum/language/noise/format_message_plain(message, verb)
return message
/datum/language/noise/format_message_radio(message, verb)
return "<span class='[colour]'>[message]</span>"
/datum/language/noise/get_talkinto_msg_range(message)
// if you make a loud noise (screams etc), you'll be heard from 4 tiles over instead of two
return (copytext(message, length(message)) == "!") ? 4 : 2
/datum/language/unathi
name = "Sinta'unathi"
desc = "The common language of Moghes, composed of sibilant hisses and rattles. Spoken natively by Unathi."
@@ -52,16 +148,37 @@
colour = "soghun"
key = "o"
flags = WHITELISTED
syllables = list("ss","ss","ss","ss","skak","seeki","resh","las","esi","kor","sh")
/datum/language/unathi/get_random_name()
var/new_name = ..()
while(findtextEx(new_name,"sss",1,null))
new_name = replacetext(new_name, "sss", "ss")
return capitalize(new_name)
/datum/language/tajaran
name = "Siik'Maas"
desc = "An expressive language that combines yowls and chirps with posture, tail and ears. Native to the Tajaran."
desc = "The traditionally employed tongue of Ahdomai, composed of expressive yowls and chirps. Native to the Tajaran."
speech_verb = "mrowls"
ask_verb = "mrowls"
exclaim_verb = "yowls"
colour = "tajaran"
key = "j"
flags = WHITELISTED
syllables = list("rr","rr","tajr","kir","raj","kii","mir","kra","ahk","nal","vah","khaz","jri","ran","darr", \
"mi","jri","dynh","manq","rhe","zar","rrhaz","kal","chur","eech","thaa","dra","jurl","mah","sanu","dra","ii'r", \
"ka","aasi","far","wa","baq","ara","qara","zir","sam","mak","hrar","nja","rir","khan","jun","dar","rik","kah", \
"hal","ket","jurl","mah","tul","cresh","azu","ragh")
/datum/language/tajaran/get_random_name(var/gender)
var/new_name = ..(gender,1)
if(prob(80))
new_name += " [pick(list("Hadii","Kaytam","Zhan-Khazan","Hharar","Njarir'Akhan"))]"
else
new_name += ..(gender,1)
return new_name
/datum/language/skrell
name = "Skrellian"
@@ -72,6 +189,35 @@
colour = "skrell"
key = "k"
flags = WHITELISTED
syllables = list("qr","qrr","xuq","qil","quum","xuqm","vol","xrim","zaoo","qu-uu","qix","qoo","zix","*","!")
/datum/language/sign
name = "Sign language"
desc = "A mixture of manual communication and body-languaged, used to communication with those who have impaired hearing."
speech_verb = "signs"
signlang_verb = list("signs")
key = "4"
flags = SIGNLANG
/datum/language/sini
name = "Sini"
desc = "Kocasslani traditional language"
speech_verb = "sings"
colour = "skrell"
key = "z"
flags = WHITELISTED
syllables = list("qr","qrr","xuq","qil","quum","xuqm","vol","xrim","zaoo","qu-uu","qix","qoo","zix","*","!")
/datum/language/vaurcese
name = "Vaurcese"
desc = "Vaurca native language made of clicks and sputters, \"It's a bugs life.\""
speech_verb = "clicks"
colour = "vaurca"
key = "p"
flags = WHITELISTED
syllables = list("kic","klic","\'tic","kit","lit","xic","vil","xrit","tshh","qix","qlit","zix","\'","!")
/datum/language/vox
name = "Vox-pidgin"
@@ -81,7 +227,12 @@
exclaim_verb = "SHRIEKS"
colour = "vox"
key = "v"
flags = RESTRICTED
flags = WHITELISTED
syllables = list("ti","ti","ti","hi","hi","ki","ki","ki","ki","ya","ta","ha","ka","ya","chi","cha","kah", \
"SKRE","AHK","EHK","RAWK","KRA","AAA","EEE","KI","II","KRI","KA")
/datum/language/vox/get_random_name()
return ..(FEMALE,1,6)
/datum/language/diona
name = "Rootspeak"
@@ -92,14 +243,23 @@
colour = "soghun"
key = "q"
flags = RESTRICTED
syllables = list("hs","zt","kr","st","sh")
/datum/language/diona/get_random_name()
var/new_name = "[pick(list("To Sleep Beneath","Wind Over","Embrace of","Dreams of","Witnessing","To Walk Beneath","Approaching the"))]"
new_name += " [pick(list("the Void","the Sky","Encroaching Night","Planetsong","Starsong","the Wandering Star","the Empty Day","Daybreak","Nightfall","the Rain"))]"
return new_name
/datum/language/common
name = "Ceti Basic"
desc = "The common galactic tongue."
speech_verb = "says"
whisper_verb = "whispers"
key = "0"
flags = RESTRICTED
syllables = list("blah","blah","blah","bleh","meh","neh","nah","wah")
//TODO flag certain languages to use the mob-type specific say_quote and then get rid of these.
/datum/language/common/get_spoken_verb(var/msg_end)
switch(msg_end)
if("!")
@@ -111,9 +271,20 @@
/datum/language/human
name = "Sol Common"
desc = "A bastardized hybrid of informal English and elements of Mandarin Chinese; the common language of the Sol system."
colour = "rough"
speech_verb = "says"
whisper_verb = "whispers"
colour = "solcom"
key = "1"
flags = RESTRICTED
syllables = list("tao","shi","tzu","yi","com","be","is","i","op","vi","ed","lec","mo","cle","te","dis","e")
/datum/language/human/get_spoken_verb(var/msg_end)
switch(msg_end)
if("!")
return pick("exclaims","shouts","yells") //TODO: make the basic proc handle lists of verbs.
if("?")
return ask_verb
return speech_verb
// Galactic common languages (systemwide accepted standards).
/datum/language/trader
@@ -122,6 +293,15 @@
speech_verb = "enunciates"
colour = "say_quote"
key = "2"
space_chance = 100
syllables = list("lorem", "ipsum", "dolor", "sit", "amet", "consectetur", "adipiscing", "elit",
"sed", "do", "eiusmod", "tempor", "incididunt", "ut", "labore", "et", "dolore",
"magna", "aliqua", "ut", "enim", "ad", "minim", "veniam", "quis", "nostrud",
"exercitation", "ullamco", "laboris", "nisi", "ut", "aliquip", "ex", "ea", "commodo",
"consequat", "duis", "aute", "irure", "dolor", "in", "reprehenderit", "in",
"voluptate", "velit", "esse", "cillum", "dolore", "eu", "fugiat", "nulla",
"pariatur", "excepteur", "sint", "occaecat", "cupidatat", "non", "proident", "sunt",
"in", "culpa", "qui", "officia", "deserunt", "mollit", "anim", "id", "est", "laborum")
/datum/language/gutter
name = "Gutter"
@@ -129,34 +309,8 @@
speech_verb = "growls"
colour = "rough"
key = "3"
syllables = list ("gra","ba","ba","breh","bra","rah","dur","ra","ro","gro","go","ber","bar","geh","heh", "gra")
/datum/language/sini
name = "Sini"
desc = "Kocasslani traditional language"
speech_verb = "sings"
colour = "skrell"
key = "z"
flags = WHITELISTED
/datum/language/sign
name = "Sign language"
desc = "A mixture of manual communication and body-languaged, used to communication with those who have impaired hearing."
speech_verb = "signs"
signlang_verb = list("signs")
key = "4"
flags = SIGNLANG
/datum/language/vaurcese
name = "Vaurcese"
desc = "Vaurca native language made of clicks and sputters, \"It's a bugs life.\""
speech_verb = "clicks"
colour = "vaurca"
key = "p"
flags = WHITELISTED
////////////////////////////////////
//Not sure if stuff but yeah
////////////////////////////////////
/datum/language/xenocommon
name = "Xenomorph"
colour = "alien"
@@ -166,6 +320,7 @@
exclaim_verb = "hisses"
key = "5"
flags = RESTRICTED
syllables = list("sss","sSs","SSS")
/datum/language/xenos
name = "Hivemind"
@@ -257,7 +412,7 @@
if(drone_only && !istype(S,/mob/living/silicon/robot/drone))
continue
else if(istype(S , /mob/living/silicon/ai))
message_start = "<i><span class='game say'>[name], <a href='byond://?src=\ref[S];track2=\ref[S];track=\ref[src];trackname=[html_encode(speaker.name)]'><span class='name'>[speaker.name]</span></a>"
message_start = "<i><span class='game say'>[name], <a href='byond://?src=\ref[S];track2=\ref[S];track=\ref[speaker];trackname=[html_encode(speaker.name)]'><span class='name'>[speaker.name]</span></a>"
else if (!S.binarycheck())
continue
@@ -270,13 +425,13 @@
if(istype(M, /mob/living/silicon) || M.binarycheck())
continue
M.show_message("<i><span class='game say'><span class='name'>synthesised voice</span> <span class='message'>beeps, \"beep beep beep\"</span></span></i>",2)
/*
//robot binary xmitter component power usage
if (isrobot(speaker))
var/mob/living/silicon/robot/R = speaker
var/datum/robot_component/C = R.components["comms"]
R.cell_use_power(C.active_usage)
*/
// if (isrobot(speaker))
// var/mob/living/silicon/robot/R = speaker
// var/datum/robot_component/C = R.components["comms"]
// R.cell_use_power(C.active_usage)
/datum/language/binary/drone
name = "Drone Talk"
desc = "A heavily encoded damage control coordination stream."
@@ -287,9 +442,6 @@
key = "d"
flags = RESTRICTED | HIVEMIND
drone_only = 1
///////////////////////////////////////
//Yeah but stuff if sure not
///////////////////////////////////////
// Language handling.
/mob/proc/add_language(var/language)
@@ -303,15 +455,14 @@
return 1
/mob/proc/remove_language(var/rem_language)
languages.Remove(all_languages[rem_language])
return 0
var/datum/language/L = all_languages[rem_language]
. = (L in languages)
languages.Remove(L)
// Can we speak this language, as opposed to just understanding it?
/mob/proc/can_speak(datum/language/speaking)
return (universal_speak || speaking in src.languages)
return (universal_speak || (speaking && speaking.flags & INNATE) || speaking in src.languages)
//TBD
/mob/verb/check_languages()
@@ -322,7 +473,10 @@
var/dat = "<b><font size = 5>Known Languages</font></b><br/><br/>"
for(var/datum/language/L in languages)
dat += "<b>[L.name] (:[L.key])</b><br/>[L.desc]<br/><br/>"
if(!(L.flags & NONGLOBAL))
dat += "<b>[L.name] (:[L.key])</b><br/>[L.desc]<br/><br/>"
src << browse(dat, "window=checklanguage")
return
return
#undef SCRAMBLE_CACHE_LEN
+9 -2
View File
@@ -1344,7 +1344,14 @@
if(!druggy) see_invisible = SEE_INVISIBLE_LEVEL_TWO
if(healths) healths.icon_state = "health7" //DEAD healthmeter
if(client)
if(client.view != world.view)if(client.view != world.view) // If mob moves while zoomed in with device, unzoom them.
if(client.view != world.view) // If mob moves while zoomed in with device, unzoom them.
for(var/obj/item/item in contents)
if(item.zoom)
item.zoom()
break
/*
if(locate(/obj/item/weapon/gun/energy/rifle/sniperrifle, contents))
var/obj/item/weapon/gun/energy/rifle/sniperrifle/s = locate() in src
if(s.zoom)
@@ -1353,7 +1360,7 @@
var/obj/item/weapon/gun/energy/laser/modular/s = locate() in src
if(s.zoom)
s.zoom()
*/
else
sight &= ~(SEE_TURFS|SEE_MOBS|SEE_OBJS)
see_in_dark = species.darksight
+60 -61
View File
@@ -1,4 +1,6 @@
/mob/living/carbon/human/say(var/message, var/verb = "says")
/mob/living/carbon/human/say(var/message)
var/verb = "says"
var/alt_name = ""
var/message_range = world.view
var/italics = 0
@@ -8,16 +10,19 @@
src << "\red You cannot speak in IC (Muted)."
return
message = trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN))
message = trim_strip_html_properly(message)
if(stat == 2)
return say_dead(message)
if(stat)
if(stat == 2)
return say_dead(message)
return
if (istype(src.wear_mask, /obj/item/clothing/mask/muzzle))
src << "<span class='danger'>You're muzzled and cannot speak!</span>"
return
var/message_mode = parse_message_mode(message, "headset")
// if (istype(wear_mask, /obj/item/clothing/mask/muzzle) && message_mode != "changeling") //Todo: Add this to speech_problem_flag checks.
// return
//
if(copytext(message,1,2) == "*")
return emote(copytext(message,2))
@@ -31,6 +36,8 @@
else
message = copytext(message,3)
message = trim_left(message)
//parse the language code and consume it
var/datum/language/speaking = parse_language(message)
if(speaking)
@@ -66,7 +73,6 @@
if(!message || stat)
return
if(speaking && speaking.flags & SIGNLANG)
message_mode = null
..(message, speaking, verb, alt_name, italics, message_range)
@@ -123,27 +129,14 @@
if("whisper")
whisper_say(message, speaking, alt_name)
return
/* if("binary")
if(robot_talk_understand || binarycheck())
robot_talk(message)
return
if("changeling")
if(mind && mind.changeling)
for(var/mob/Changeling in mob_list)
if((Changeling.mind && Changeling.mind.changeling) || istype(Changeling, /mob/dead/observer))
Changeling << "<i><font color=#800080><b>[mind.changeling.changelingID]:</b> [message]</font></i>"
return
*/
else
if(!(stunned >= 4))
if(message_mode)
if(message_mode in (radiochannels | "department" | "special"))
if(l_ear && istype(l_ear,/obj/item/device/radio))
l_ear.talk_into(src,message, message_mode, verb, speaking)
used_radios += l_ear
else if(r_ear && istype(r_ear,/obj/item/device/radio))
r_ear.talk_into(src,message, message_mode, verb, speaking)
used_radios += r_ear
if(message_mode)
if(l_ear && istype(l_ear,/obj/item/device/radio))
l_ear.talk_into(src,message, message_mode, verb, speaking)
used_radios += l_ear
else if(r_ear && istype(r_ear,/obj/item/device/radio))
r_ear.talk_into(src,message, message_mode, verb, speaking)
used_radios += r_ear
var/sound/speech_sound
var/sound_vol
@@ -155,10 +148,14 @@
if(used_radios.len)
italics = 1
message_range = 1
if(speaking)
message_range = speaking.get_talkinto_msg_range(message)
var/msg
if(!speaking || !(speaking.flags & NO_TALK_MSG))
msg = "<span class='notice'>\The [src] talks into \the [used_radios[1]]</span>"
for(var/mob/living/M in hearers(5, src))
if(M != src)
M.show_message("<span class='notice'>[src] talks into [used_radios.len ? used_radios[1] : "the radio."]</span>")
if((M != src) && msg)
M.show_message(msg)
if (speech_sound)
sound_vol *= 0.5
@@ -237,6 +234,7 @@
return GetSpecialVoice()
return real_name
/mob/living/carbon/human/proc/SetSpecialVoice(var/new_voice)
if(new_voice)
special_voice = new_voice
@@ -274,45 +272,46 @@
return verb
/mob/living/carbon/human/proc/handle_speech_problems(var/message)
var/list/returns[3]
var/verb = "says"
var/handled = 0
if(silent)
if(silent || (sdisabilities & MUTE))
message = ""
handled = 1
if(sdisabilities & MUTE)
message = ""
handled = 1
if(wear_mask)
if(istype(wear_mask, /obj/item/clothing/mask/horsehead))
var/obj/item/clothing/mask/horsehead/hoers = wear_mask
if(hoers.voicechange)
if(mind && mind.changeling && department_radio_keys[copytext(message, 1, 3)] != "changeling")
message = pick("NEEIIGGGHHHH!", "NEEEIIIIGHH!", "NEIIIGGHH!", "HAAWWWWW!", "HAAAWWW!")
verb = pick("whinnies","neighs", "says")
handled = 1
if(istype(wear_mask, /obj/item/clothing/mask/horsehead))
var/obj/item/clothing/mask/horsehead/hoers = wear_mask
if(hoers.voicechange)
if(mind && mind.changeling && department_radio_keys[copytext(message, 1, 3)] != "changeling")
message = pick("NEEIIGGGHHHH!", "NEEEIIIIGHH!", "NEIIIGGHH!", "HAAWWWWW!", "HAAAWWW!")
verb = pick("whinnies","neighs", "says")
handled = 1
if((HULK in mutations) && health >= 25 && length(message))
// message = "[uppertext(message)]!!!" //No!
verb = pick("yells","roars","hollers")
handled = 1
if(slurring)
message = slur(message)
verb = pick("stammers","stutters")
handled = 1
var/braindam = getBrainLoss()
if(braindam >= 60)
handled = 1
if(prob(braindam/4))
if(message != "")
if((HULK in mutations) && health >= 25 && length(message))
message = "[uppertext(message)]!!!"
verb = pick("yells","roars","hollers")
handled = 1
if(slurring)
message = slur(message)
verb = pick("slobbers","slurs")
handled = 1
if(stuttering)
message = stutter(message)
verb = pick("stammers", "stutters")
if(prob(braindam))
message = uppertext(message)
verb = pick("yells like an idiot","says rather loudly")
verb = pick("stammers","stutters")
handled = 1
var/braindam = getBrainLoss()
if(braindam >= 60)
handled = 1
if(prob(braindam/4))
message = stutter(message)
verb = pick("stammers", "stutters")
if(prob(braindam))
message = uppertext(message)
verb = "yells loudly"
returns[1] = message
returns[2] = verb
returns[3] = handled
return returns
@@ -1,9 +1,10 @@
/mob/living/simple_animal/mushroom
name = "walking mushroom"
desc = "It's a massive mushroom... with legs?"
icon_state = "mushroom"
icon_living = "mushroom"
icon_dead = "mushroom_dead"
icon = 'icons/mob/livestock.dmi'
icon_state = "walkingmushroom"
icon_living = "walkingmushroom"
icon_dead = "walkingmushroom_d"
small = 1
speak_chance = 0
turns_per_move = 1
@@ -243,6 +243,12 @@
if ((O.client && !( O.blinded )))
O.show_message("\blue [M] [response_help] [src]")
if("disarm")
if (health > 0)
for(var/mob/O in viewers(src, null))
if ((O.client && !( O.blinded )))
O.show_message("\blue [M] [response_disarm] [src]")
if("grab")
if (M == src)
return
@@ -262,7 +268,7 @@
if ((O.client && !( O.blinded )))
O.show_message(text("\red [] has grabbed [] passively!", M, src), 1)
if("hurt", "disarm")
if("hurt")
adjustBruteLoss(harm_intent_damage)
for(var/mob/O in viewers(src, null))
if ((O.client && !( O.blinded )))
+7
View File
@@ -190,6 +190,12 @@
return
if(mob.client)
if(mob.client.view != world.view)
for(var/obj/item/item in mob.contents)
if(item.zoom)
item.zoom()
break
/*
if(locate(/obj/item/weapon/gun/energy/rifle/sniperrifle, mob.contents)) // If mob moves while zoomed in with sniper rifle, unzoom them.
var/obj/item/weapon/gun/energy/rifle/sniperrifle/s = locate() in mob
if(s.zoom)
@@ -198,6 +204,7 @@
var/obj/item/weapon/gun/energy/laser/modular/s = locate() in mob
if(s.zoom)
s.zoom()
*/
if(Process_Grab()) return
+24 -3
View File
@@ -12,6 +12,21 @@
if(say_disabled) //This is here to try to identify lag problems
usr << "\red Speech is currently admin-disabled."
return
//Let's try to make users fix their errors - we try to detect single, out-of-place letters and 'unintended' words
/*
var/first_letter = copytext(message,1,2)
if((copytext(message,2,3) == " " && first_letter != "I" && first_letter != "A" && first_letter != ";") || cmptext(copytext(message,1,5), "say ") || cmptext(copytext(message,1,4), "me ") || cmptext(copytext(message,1,6), "looc ") || cmptext(copytext(message,1,5), "ooc ") || cmptext(copytext(message,2,6), "say "))
var/response = alert(usr, "Do you really want to say this using the *say* verb?\n\n[message]\n", "Confirm your message", "Yes", "Edit message", "No")
if(response == "Edit message")
message = input(usr, "Please edit your message carefully:", "Edit message", message)
if(!message)
return
else if(response == "No")
return
*/
//We do not have typing indicator code yet - Waiting for the okay from Skull before considering adding - Jamini
// set_typing_indicator(0)
usr.say(message)
/mob/verb/me_verb(message as text)
@@ -22,8 +37,9 @@
usr << "\red Speech is currently admin-disabled."
return
message = trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN))
message = strip_html_properly(message)
//We do not have typing indicator code yet - Waiting for the okay from Skull before considering adding - Jamini
// set_typing_indicator(0)
if(use_me)
usr.emote("me",usr.emote_type,message)
else
@@ -68,7 +84,6 @@
return
/mob/proc/say_understands(var/mob/other,var/datum/language/speaking = null)
if (src.stat == 2) //Dead
@@ -90,6 +105,9 @@
return 1
return 0
if(speaking.flags & INNATE)
return 1
//Language check.
for(var/datum/language/L in src.languages)
if(speaking.name == L.name)
@@ -153,6 +171,9 @@
//parses the language code (e.g. :j) from text, such as that supplied to say.
//returns the language object only if the code corresponds to a language that src can speak, otherwise null.
/mob/proc/parse_language(var/message)
if(length(message) >= 1 && copytext(message,1,2) == "!")
return all_languages["Noise"]
if(length(message) >= 2)
var/language_prefix = lowertext(copytext(message, 1 ,3))
var/datum/language/L = language_keys[language_prefix]
+1 -1
View File
@@ -37,7 +37,7 @@
spawn(5)
if(!powernet)
connect_to_network()
dir_loop:
for(var/d in cardinal)
var/turf/T = get_step(src, d)
+5
View File
@@ -249,6 +249,11 @@
mouthshoot = 0
return
if(istype(in_chamber, /obj/item/projectile/beam/practice))
user.show_message("<span class = 'warning'>You feel rather silly, trying to commit suicide with a practice gun.</span>")
mouthshoot = 0
return
in_chamber.on_hit(M)
if (in_chamber.damage_type != HALLOSS)
user.apply_damage(in_chamber.damage*2.5, in_chamber.damage_type, "head", used_weapon = "Point blank shot in the mouth with \a [in_chamber]", sharp=1)
@@ -133,61 +133,17 @@ Commenting out right now, due to a lack of sprites existing. I hate on-mob weapo
w_class = 4.0
fire_delay_wielded = 35 //35 is normal fire_delay -- this is going to suck. Yiss, what we want!
fire_delay_unwielded = 105 //3x difference, let's be an arse about this, and push the issue
var/zoom = 0
zoomdevicename = "sniper scope"
accuracy = -110
rangedrop = -5 // fully accurate up to first 10 tiles. the last 4 zoomed tiles you are on your
rangedrop = -2 // fully accurate up to first 10 tiles. the last 4 zoomed tiles you are on your
/obj/item/weapon/gun/energy/rifle/sniperrifle/dropped(mob/user)
user.client.view = world.view
..()
/obj/item/weapon/gun/energy/rifle/sniperrifle/ready_to_fire()
if(!zoom)
return 0
if(world.time >= last_fired + fire_delay)
last_fired = world.time
return 1
else
return 0
///obj/item/weapon/gun/energy/rifle/sniperrifle/update_icon() //Currently only here to fuck with the on-mob icons.
// icon_state = "sniper[wielded]"
// return
/*
This is called from
modules/mob/mob_movement.dm if you move you will be zoomed out
modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out.
*/
/obj/item/weapon/gun/energy/rifle/sniperrifle/verb/zoom()
/obj/item/weapon/gun/energy/rifle/sniperrifle/verb/scope()
set category = "Object"
set name = "Use Sniper Scope"
set popup_menu = 0
if(usr.stat || !(istype(usr,/mob/living/carbon/human)))
usr << "You are unable to focus down the scope of the rifle."
return
if(!zoom && global_hud.darkMask[1] in usr.client.screen)
usr << "Your welding equipment gets in the way of you looking down the scope"
return
if(!zoom && usr.get_active_hand() != src)
usr << "You are too distracted to look down the scope, perhaps if it was in your active hand this might work better"
return
set name = "Use Scope"
set popup_menu = 1
if(usr.client.view == world.view)
if(!usr.hud_used.hud_shown)
usr.button_pressed_F12(1) // If the user has already limited their HUD this avoids them having a HUD when they zoom in
usr.button_pressed_F12(1)
usr.client.view = 12
zoom = 1
else
usr.client.view = world.view
if(!usr.hud_used.hud_shown)
usr.button_pressed_F12(1)
zoom = 0
usr << "<font color='[zoom?"blue":"red"]'>Zoom mode [zoom?"en":"dis"]abled.</font>"
return
zoom()
///////////LASER CANNON//////////////
@@ -13,7 +13,7 @@
cell_type = "/obj/item/weapon/cell"
var/canzoom = 0
var/zoom = 0
zoomdevicename = "scan screen"
var/open = 0
var/upgradepointtotal = 16 //KNOWN BUG: Crashes if you try to VV it with a lot of stuff inside. By a lot, I mean 'everything.' At least in all my tests.
@@ -358,34 +358,9 @@
/obj/item/weapon/gun/energy/laser/modular/dropped(mob/user)
user.client.view = world.view
/obj/item/weapon/gun/energy/laser/modular/verb/zoom()
/obj/item/weapon/gun/energy/laser/modular/verb/scope()
set category = "Object"
set name = "Use Scan-Screen"
set popup_menu = 0
set popup_menu = 1
if(usr.stat || !(istype(usr,/mob/living/carbon/human)))
usr << "You are unable to focus on the screen."
return
if(!zoom && global_hud.darkMask[1] in usr.client.screen)
usr << "Your welding equipment makes it hard to see the screen."
return
if(!zoom && usr.get_active_hand() != src)
usr << "You are too distracted to watch the screen, perhaps if it was in your active hand this might work better"
return
if((hasscreen == 0) || (canzoom == 0))
usr << "This gun lacks the parts for components for zooming."
return
if(usr.client.view == world.view)
if(!usr.hud_used.hud_shown)
usr.button_pressed_F12(1) // If the user has already limited their HUD this avoids them having a HUD when they zoom in
usr.button_pressed_F12(1)
usr.client.view = 12
zoom = 1
else
usr.client.view = world.view
if(!usr.hud_used.hud_shown)
usr.button_pressed_F12(1)
zoom = 0
usr << "<font color='[zoom?"blue":"red"]'>Zoom mode [zoom?"en":"dis"]abled.</font>"
return
zoom()
+4
View File
@@ -95,6 +95,10 @@
miss_modifier += -30
def_zone = get_zone_with_miss_chance(def_zone, M, miss_modifier + 15*distance + daddy.accuracy + daddy.rangedrop) // add +daddy.missmod vars to gun and this. snowflake accuracy
//moving def_zone to be a child of the daddyblock because i need the daddy. all projectiles should be fired from guns anyway
if (istype(shot_from,/obj/item/mecha_parts/mecha_equipment/weapon)) //If you shoot with a mecha weapon instead, check accuracy without a steady variable
def_zone = get_zone_with_miss_chance(def_zone, M, miss_modifier + 10*distance)
if(!def_zone)
visible_message("\blue \The [src] misses [M] narrowly!")
forcedodge = -1