Merge pull request #4725 from Baystation12/dev

Dev-Freeze staging (0.1.11) [4/11/14]
This commit is contained in:
DJSnapshot
2014-04-11 11:57:00 -07:00
145 changed files with 3671 additions and 2884 deletions
+1
View File
@@ -4,3 +4,4 @@
*.rsc
*.dmb
*.lk
data/
+7
View File
@@ -17,6 +17,13 @@ The more complicated and easier to update method is using git. You'll need to d
This will take a while to download, but it provides an easier method for updating.
Once the repository is in place, run this command:
```bash
cd Baystation12
git update-index --assume-unchanged baystation12.int
```
Now git will ignore changes to the file baystation12.int.
### INSTALLATION
First-time installation should be fairly straightforward. First, you'll need BYOND installed. You can get it from [here](http://www.byond.com/).
+3
View File
@@ -581,6 +581,7 @@
#include "code\game\objects\structures\flora.dm"
#include "code\game\objects\structures\girders.dm"
#include "code\game\objects\structures\grille.dm"
#include "code\game\objects\structures\inflatable.dm"
#include "code\game\objects\structures\janicart.dm"
#include "code\game\objects\structures\kitchen_spike.dm"
#include "code\game\objects\structures\ladders.dm"
@@ -847,6 +848,7 @@
#include "code\modules\mob\abilities.dm"
#include "code\modules\mob\death.dm"
#include "code\modules\mob\emote.dm"
#include "code\modules\mob\hear_say.dm"
#include "code\modules\mob\inventory.dm"
#include "code\modules\mob\language.dm"
#include "code\modules\mob\login.dm"
@@ -1047,6 +1049,7 @@
#include "code\modules\organs\organ_internal.dm"
#include "code\modules\organs\pain.dm"
#include "code\modules\organs\wound.dm"
#include "code\modules\paperwork\carbonpaper.dm"
#include "code\modules\paperwork\clipboard.dm"
#include "code\modules\paperwork\filingcabinet.dm"
#include "code\modules\paperwork\folders.dm"
+1 -1
View File
@@ -4,7 +4,7 @@
icon = 'icons/policetape.dmi'
icon_state = "rollstart"
flags = FPRINT
w_class = 1.0
w_class = 2.0
var/turf/start
var/turf/end
var/tape_type = /obj/item/tape
+1 -1
View File
@@ -8,7 +8,7 @@
icon = 'icons/obj/autopsy_scanner.dmi'
icon_state = ""
flags = FPRINT | TABLEPASS | CONDUCT
w_class = 1.0
w_class = 2.0
origin_tech = "materials=1;biotech=1"
var/list/datum/autopsy_data_scanner/wdata = list()
var/list/datum/autopsy_data_scanner/chemtraces = list()
+2
View File
@@ -39,6 +39,8 @@ var/global/list/skin_styles_female_list = list() //unused
//Underwear
var/global/list/underwear_m = list("White", "Grey", "Green", "Blue", "Black", "Mankini", "None") //Curse whoever made male/female underwear diffrent colours
var/global/list/underwear_f = list("Red", "White", "Yellow", "Blue", "Black", "Thong", "None")
//undershirt
var/global/list/undershirt_t = list("Black Tank top", "White Tank top", "Black shirt", "White shirt", "None")
//Backpacks
var/global/list/backbaglist = list("Nothing", "Backpack", "Satchel", "Satchel Alt")
+22 -10
View File
@@ -31,10 +31,12 @@ datum/controller/game_controller
var/last_thing_processed
var/mob/list/expensive_mobs = list()
var/rebuild_active_areas = 0
datum/controller/game_controller/New()
//There can be only one master_controller. Out with the old and in with the new.
if(master_controller != src)
log_debug("Rebuilding Master Controller")
if(istype(master_controller))
Recover()
del(master_controller)
@@ -259,27 +261,37 @@ datum/controller/game_controller/proc/process_machines()
last_thing_processed = Machine.type
if(Machine.process() != PROCESS_KILL)
if(Machine)
// if(Machine.use_power)
// Machine.auto_use_power()
i++
continue
machines.Cut(i,i+1)
i=1
while(i<=active_areas.len)
var/area/A = active_areas[i]
if(A.powerupdate)
if(A.powerupdate && A.master == A)
A.powerupdate -= 1
for(var/obj/machinery/M in A)
if(M)
if(M.use_power)
M.auto_use_power()
for(var/area/SubArea in A.related)
for(var/obj/machinery/M in SubArea)
if(M)
if(M.use_power)
M.auto_use_power()
if(A.apc.len)
if(A.apc.len && A.master == A)
i++
continue
A.powerupdate = 0
active_areas.Cut(i,i+1)
if(controller_iteration % 150 == 0 || rebuild_active_areas) //Every 300 seconds we retest every area/machine
for(var/area/A in all_areas)
if(A == A.master)
A.powerupdate += 1
active_areas |= A
rebuild_active_areas = 0
datum/controller/game_controller/proc/process_objects()
+48 -9
View File
@@ -52,6 +52,10 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee
/obj/item/weapon/reagent_containers/food/drinks/milk,
/obj/item/weapon/reagent_containers/food/drinks/milk,
/obj/item/weapon/storage/fancy/egg_box,
/obj/item/weapon/reagent_containers/food/snacks/tofu,
/obj/item/weapon/reagent_containers/food/snacks/tofu,
/obj/item/weapon/reagent_containers/food/snacks/meat,
/obj/item/weapon/reagent_containers/food/snacks/meat,
/obj/item/weapon/reagent_containers/food/snacks/grown/banana,
/obj/item/weapon/reagent_containers/food/snacks/grown/banana)
cost = 10
@@ -125,6 +129,7 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee
name = "Party equipment"
contains = list(/obj/item/weapon/storage/box/drinkingglasses,
/obj/item/weapon/reagent_containers/food/drinks/shaker,
/obj/item/weapon/reagent_containers/food/drinks/flask/barflask,
/obj/item/weapon/reagent_containers/food/drinks/bottle/patron,
/obj/item/weapon/reagent_containers/food/drinks/bottle/goldschlager,
/obj/item/weapon/storage/fancy/cigarettes/dromedaryco,
@@ -174,6 +179,16 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee
containername = "Emergency Crate"
group = "Engineering"
/datum/supply_packs/evacuation
name = "Inflatable barriers"
contains = list(/obj/item/weapon/storage/briefcase/inflatable,
/obj/item/weapon/storage/briefcase/inflatable,
/obj/item/weapon/storage/briefcase/inflatable)
cost = 20
containertype = /obj/structure/closet/crate
containername = "Inflatable Barrier Crate"
group = "Engineering"
/datum/supply_packs/janitor
name = "Janitorial supplies"
contains = list(/obj/item/weapon/reagent_containers/glass/bucket,
@@ -288,9 +303,14 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee
/obj/item/seeds/cornseed,
/obj/item/seeds/eggplantseed,
/obj/item/seeds/tomatoseed,
/obj/item/seeds/appleseed,
/obj/item/seeds/soyaseed,
/obj/item/seeds/wheatseed,
/obj/item/seeds/carrotseed,
/obj/item/seeds/harebell,
/obj/item/seeds/lemonseed,
/obj/item/seeds/orangeseed,
/obj/item/seeds/grassseed,
/obj/item/seeds/sunflowerseed,
/obj/item/seeds/chantermycelium,
/obj/item/seeds/potatoseed,
@@ -324,6 +344,10 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee
/obj/item/seeds/amanitamycelium,
/obj/item/seeds/reishimycelium,
/obj/item/seeds/bananaseed,
/obj/item/seeds/riceseed,
/obj/item/seeds/eggplantseed,
/obj/item/seeds/limeseed,
/obj/item/seeds/grapeseed,
/obj/item/seeds/eggyseed)
cost = 15
containertype = /obj/structure/closet/crate/hydroponics
@@ -763,7 +787,7 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee
group = "Security"
/datum/supply_packs/randomised
var/num_contained = 3 //number of items picked to be contained in a randomised crate
var/num_contained = 4 //number of items picked to be contained in a randomised crate
contains = list(/obj/item/clothing/head/collectable/chef,
/obj/item/clothing/head/collectable/paper,
/obj/item/clothing/head/collectable/tophat,
@@ -895,22 +919,36 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee
/datum/supply_packs/randomised/costume
num_contained = 2
contains = list(/obj/item/clothing/suit/pirate,
/obj/item/clothing/suit/johnny_coat,
/obj/item/clothing/suit/judgerobe,
/obj/item/clothing/suit/wcoat,
/obj/item/clothing/suit/hastur,
/obj/item/clothing/suit/holidaypriest,
/obj/item/clothing/suit/nun,
/obj/item/clothing/suit/imperium_monk,
/obj/item/clothing/suit/ianshirt,
/obj/item/clothing/under/gimmick/rank/captain/suit,
/obj/item/clothing/under/gimmick/rank/head_of_personnel/suit,
/obj/item/clothing/under/lawyer/purpsuit,
/obj/item/clothing/under/rank/mailman,
/obj/item/clothing/under/dress/dress_saloon,
/obj/item/clothing/suit/suspenders,
/obj/item/clothing/suit/storage/labcoat/mad,
/obj/item/clothing/suit/bio_suit/plaguedoctorsuit)
name = "Standard Costume crate"
/obj/item/clothing/suit/bio_suit/plaguedoctorsuit,
/obj/item/clothing/under/schoolgirl,
/obj/item/clothing/under/owl,
/obj/item/clothing/under/waiter,
/obj/item/clothing/under/gladiator,
/obj/item/clothing/under/soviet,
/obj/item/clothing/under/scratch,
/obj/item/clothing/under/wedding/bride_white,
/obj/item/clothing/suit/chef,
/obj/item/clothing/suit/apron/overalls,
/obj/item/clothing/under/redcoat,
/obj/item/clothing/under/kilt)
name = "Costumes crate"
cost = 10
containertype = /obj/structure/closet/crate/secure
containername = "Standard Costumes"
containername = "Actor Costumes"
access = access_theatre
group = "Operations"
@@ -923,8 +961,11 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee
/obj/item/clothing/under/suit_jacket/female,
/obj/item/clothing/under/suit_jacket/really_black,
/obj/item/clothing/under/suit_jacket/red,
/obj/item/clothing/under/lawyer/bluesuit,
/obj/item/clothing/under/lawyer/purpsuit,
/obj/item/clothing/shoes/black,
/obj/item/clothing/shoes/black,
/obj/item/clothing/shoes/leather,
/obj/item/clothing/suit/wcoat)
name = "Formalwear closet"
cost = 30
@@ -1052,13 +1093,11 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee
/datum/supply_packs/bee_keeper
name = "Beekeeping Crate"
contains = list(/obj/item/beezeez,
/obj/item/beezeez,
/obj/item/weapon/bee_net,
/obj/item/apiary,
/obj/item/queen_bee,
/obj/item/queen_bee,
/obj/item/queen_bee)
cost = 20
cost = 40
contraband = 1
containertype = /obj/structure/closet/crate/hydroponics
containername = "Beekeeping crate"
access = access_hydroponics
+1 -1
View File
@@ -297,7 +297,7 @@ var/global/list/PDA_Manifest = list()
item_state = "beachball"
density = 0
anchored = 0
w_class = 1.0
w_class = 2.0
force = 0.0
throwforce = 0.0
throw_speed = 1
+5 -5
View File
@@ -18,7 +18,7 @@
icon = 'icons/obj/seeds.dmi'
icon_state = "seed" // unknown plant seed - these shouldn't exist in-game
flags = FPRINT | TABLEPASS
w_class = 1.0 // Makes them pocketable
w_class = 2.0 // Makes them pocketable
var/mypath = "/obj/item/seeds"
var/plantname = "Plants"
var/productname = ""
@@ -1205,7 +1205,7 @@
force = 0
flags = TABLEPASS
throwforce = 1
w_class = 1.0
w_class = 2.0
throw_speed = 1
throw_range = 3
plant_type = 1
@@ -1229,7 +1229,7 @@
force = 15
flags = TABLEPASS
throwforce = 1
w_class = 1.0
w_class = 2.0
throw_speed = 1
throw_range = 3
plant_type = 1
@@ -1251,7 +1251,7 @@
force = 30
flags = TABLEPASS
throwforce = 1
w_class = 1.0
w_class = 2.0
throw_speed = 1
throw_range = 3
plant_type = 1
@@ -1417,7 +1417,7 @@
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle16"
flags = FPRINT | TABLEPASS
w_class = 1.0
w_class = 2.0
var/mutmod = 0
var/yieldmod = 0
New()
+9 -9
View File
@@ -31,7 +31,7 @@
icon = 'icons/obj/items.dmi'
icon_state = "banana_peel"
item_state = "banana_peel"
w_class = 1.0
w_class = 2.0
throwforce = 0
throw_speed = 4
throw_range = 20
@@ -42,7 +42,7 @@
icon = 'icons/obj/harvest.dmi'
icon_state = "corncob"
item_state = "corncob"
w_class = 1.0
w_class = 2.0
throwforce = 0
throw_speed = 4
throw_range = 20
@@ -53,7 +53,7 @@
gender = PLURAL
icon = 'icons/obj/items.dmi'
icon_state = "soap"
w_class = 1.0
w_class = 2.0
throwforce = 0
throw_speed = 4
throw_range = 20
@@ -90,7 +90,7 @@
icon = 'icons/obj/items.dmi'
icon_state = "c_tube"
throwforce = 1
w_class = 1.0
w_class = 2.0
throw_speed = 4
throw_range = 5
@@ -117,7 +117,7 @@
desc = "Better keep this safe."
icon_state = "nucleardisk"
item_state = "card-id"
w_class = 1.0
w_class = 2.0
/*
/obj/item/weapon/game_kit
@@ -229,7 +229,7 @@
icon_state = "large"
sharp = 1
desc = "Could probably be used as ... a throwing weapon?"
w_class = 1.0
w_class = 2.0
force = 5.0
throwforce = 8.0
item_state = "shard-glass"
@@ -400,8 +400,8 @@
/obj/item/weapon/module/power_control
name = "power control module"
icon_state = "power_mod"
desc = "Heavy-duty switching circuits for power control."
m_amt = 50
desc = "Heavy-duty switching circuits for power control."
m_amt = 50
g_amt = 50
/obj/item/weapon/module/id_auth
@@ -461,7 +461,7 @@
icon = 'icons/obj/food.dmi'
icon_state = "meat"
flags = FPRINT | TABLEPASS | CONDUCT
w_class = 1.0
w_class = 2.0
origin_tech = "biotech=2"
/obj/item/weapon/hatchet
+9
View File
@@ -977,6 +977,10 @@ var/list/ghostteleportlocs = list()
name = "\improper Engineering Hallway"
icon_state = "engine_hallway"
engine_eva
name = "\improper Engine EVA"
icon_state = "engine_eva"
workshop
name = "\improper Engineering Workshop"
icon_state = "engine_storage"
@@ -1238,6 +1242,11 @@ var/list/ghostteleportlocs = list()
name = "\improper Firing Range"
icon_state = "firingrange"
/area/security/tactical
name = "\improper Tactical Equipment"
icon_state = "Tactical"
/*
New()
..()
-1
View File
@@ -244,7 +244,6 @@
return used
/area/proc/clear_usage()
master.used_equip = 0
master.used_light = 0
master.used_environ = 0
@@ -53,7 +53,7 @@ var/list/datum/power/changeling/powerinstances = list()
/datum/power/changeling/lesser_form
name = "Lesser Form"
desc = "We debase ourselves and become lesser. We become a monkey."
genomecost = 1
genomecost = 4
verbpath = /mob/proc/changeling_lesser_form
/datum/power/changeling/deaf_sting
@@ -74,7 +74,7 @@ var/list/datum/power/changeling/powerinstances = list()
name = "Silence Sting"
desc = "We silently sting a human, completely silencing them for a short time."
helptext = "Does not provide a warning to a victim that they have been stung, until they try to speak and cannot."
genomecost = 2
genomecost = 3
allowduringlesserform = 1
verbpath = /mob/proc/changeling_silence_sting
@@ -82,14 +82,14 @@ var/list/datum/power/changeling/powerinstances = list()
name = "Mimic Voice"
desc = "We shape our vocal glands to sound like a desired voice."
helptext = "Will turn your voice into the name that you enter. We must constantly expend chemicals to maintain our form like this"
genomecost = 3
genomecost = 1
verbpath = /mob/proc/changeling_mimicvoice
/datum/power/changeling/extractdna
name = "Extract DNA"
desc = "We stealthily sting a target and extract the DNA from them."
helptext = "Will give you the DNA of your target, allowing you to transform into them. Does not count towards absorb objectives."
genomecost = 4
genomecost = 2
allowduringlesserform = 1
verbpath = /mob/proc/changeling_extract_dna_sting
@@ -103,7 +103,7 @@ var/list/datum/power/changeling/powerinstances = list()
/datum/power/changeling/paralysis_sting
name = "Paralysis Sting"
desc = "We silently sting a human, paralyzing them for a short time."
genomecost = 3
genomecost = 8
verbpath = /mob/proc/changeling_paralysis_sting
/datum/power/changeling/LSDSting
@@ -136,7 +136,7 @@ var/list/datum/power/changeling/powerinstances = list()
name = "Epinephrine sacs"
desc = "We evolve additional sacs of adrenaline throughout our body."
helptext = "Gives the ability to instantly recover from stuns. High chemical cost."
genomecost = 4
genomecost = 3
verbpath = /mob/proc/changeling_unstun
/datum/power/changeling/ChemicalSynth
@@ -167,7 +167,7 @@ var/list/datum/power/changeling/powerinstances = list()
name = "Digital Camoflauge"
desc = "We evolve the ability to distort our form and proprtions, defeating common altgorthms used to detect lifeforms on cameras."
helptext = "We cannot be tracked by camera while using this skill. However, humans looking at us will find us.. uncanny. We must constantly expend chemicals to maintain our form like this."
genomecost = 3
genomecost = 1
allowduringlesserform = 1
verbpath = /mob/proc/changeling_digitalcamo
@@ -175,7 +175,7 @@ var/list/datum/power/changeling/powerinstances = list()
name = "Rapid Regeneration"
desc = "We evolve the ability to rapidly regenerate, negating the need for stasis."
helptext = "Heals a moderate amount of damage every tick."
genomecost = 8
genomecost = 7
verbpath = /mob/proc/changeling_rapidregen
+1 -1
View File
@@ -44,7 +44,7 @@ Stealthy and Inconspicuous Weapons;
/obj/item/weapon/cartridge/syndicate:3:Detomatix PDA Cartridge;
Whitespace:Seperator;
Stealth and Camouflage Items;
/obj/item/clothing/under/chameleon:3:Chameleon Jumpsuit;
/obj/item/weapon/storage/box/syndie_kit/chameleon:3:Chameleon Kit;
/obj/item/clothing/shoes/syndigaloshes:2:No-Slip Syndicate Shoes;
/obj/item/weapon/card/id/syndicate:2:Agent ID card;
/obj/item/clothing/mask/gas/voice:4:Voice Changer;
@@ -30,7 +30,7 @@
/datum/game_mode/malfunction/pre_setup()
for(var/mob/new_player/player in player_list)
if(player.mind && player.mind.assigned_role == "AI")
if(player.mind && player.mind.assigned_role == "AI" && (player.client.prefs.be_special & BE_MALF))
malf_ai+=player.mind
if(malf_ai.len)
return 1
+1 -1
View File
@@ -5,7 +5,7 @@
icon_state ="book"
throw_speed = 1
throw_range = 5
w_class = 1.0
w_class = 2.0
flags = FPRINT | TABLEPASS
var/uses = 5
var/temp = null
+2 -2
View File
@@ -133,8 +133,8 @@
flag = GENETICIST
department_flag = MEDSCI
faction = "Station"
total_positions = 2
spawn_positions = 2
total_positions = 0
spawn_positions = 0
supervisors = "the chief medical officer and research director"
selection_color = "#ffeef0"
access = list(access_medical, access_morgue, access_surgery, access_chemistry, access_virology, access_genetics, access_research)
+1 -5
View File
@@ -231,8 +231,6 @@ Auto Patrol: []"},
continue
if (istype(C, /mob/living/carbon/human))
threatlevel = src.assess_perp(C)
else if ((istype(C, /mob/living/carbon/monkey)) && (C.client) && (ticker.mode.name == "monkey"))
threatlevel = 4
//src.speak(C.real_name + text(": threat: []", threatlevel))
if (threatlevel < 4 )
continue
@@ -637,8 +635,6 @@ Auto Patrol: []"},
if (istype(C, /mob/living/carbon/human))
src.threatlevel = src.assess_perp(C)
else if ((istype(C, /mob/living/carbon/monkey)) && (C.client) && (ticker.mode.name == "monkey"))
src.threatlevel = 4
if (!src.threatlevel)
continue
@@ -821,7 +817,7 @@ Auto Patrol: []"},
if (src.emagged == 2)
projectile = /obj/item/projectile/beam
else
projectile = /obj/item/projectile/energy/electrode
projectile = /obj/item/projectile/beam/stun
else if(lasercolor == "b")
if (src.emagged == 2)
projectile = /obj/item/projectile/beam/lastertag/omni
+1 -1
View File
@@ -29,7 +29,7 @@
icon = 'icons/obj/cloning.dmi'
icon_state = "datadisk0" //Gosh I hope syndies don't mistake them for the nuke disk.
item_state = "card-id"
w_class = 1.0
w_class = 2.0
var/datum/dna2/record/buf=null
var/read_only = 0 //Well,it's still a floppy disk
+1 -3
View File
@@ -14,8 +14,6 @@
return src.attack_hand(user)
/obj/machinery/igniter/attack_paw(mob/user as mob)
if ((ticker && ticker.mode.name == "monkey"))
return src.attack_hand(user)
return
/obj/machinery/igniter/attack_hand(mob/user as mob)
@@ -156,4 +154,4 @@
icon_state = "launcherbtt"
active = 0
return
return
+1 -3
View File
@@ -1,4 +1,3 @@
/obj/machinery/processor
name = "Food Processor"
icon = 'icons/obj/kitchen.dmi'
@@ -43,7 +42,7 @@
*/
potato
input = /obj/item/weapon/reagent_containers/food/snacks/grown/potato
output = /obj/item/weapon/reagent_containers/food/snacks/fries
output = /obj/item/weapon/reagent_containers/food/snacks/rawsticks
carrot
input = /obj/item/weapon/reagent_containers/food/snacks/grown/carrot
@@ -159,4 +158,3 @@
src.visible_message("\blue \the [src] finished processing.", \
"You hear the food processor stopping/")
+141 -175
View File
@@ -130,12 +130,25 @@
if(!isbroken)
icon_state = icon_off
/*******************
* Item Adding
********************/
/obj/machinery/smartfridge/attackby(var/obj/item/O as obj, var/mob/user as mob)
if(istype(O, /obj/item/weapon/screwdriver))
panel_open = !panel_open
user << "You [panel_open ? "open" : "close"] the maintenance panel."
overlays.Cut()
if(panel_open)
overlays += image(icon, icon_panel)
nanomanager.update_uis(src)
return
if(istype(O, /obj/item/device/multitool)||istype(O, /obj/item/weapon/wirecutters))
if(panel_open)
attack_hand(user)
return
if(!src.ispowered)
user << "<span class='notice'>\The [src] is unpowered and useless.</span>"
return
@@ -154,6 +167,8 @@
user.visible_message("<span class='notice'>[user] has added \the [O] to \the [src].", \
"<span class='notice'>You add \the [O] to \the [src].")
nanomanager.update_uis(src)
else if(istype(O, /obj/item/weapon/storage/bag/plants))
var/obj/item/weapon/storage/bag/plants/P = O
var/plants_loaded = 0
@@ -171,147 +186,155 @@
plants_loaded++
if(plants_loaded)
user.visible_message("<span class='notice'>[user] loads \the [src] with \the [P].</span>", \
"<span class='notice'>You load \the [src] with \the [P].</span>")
user.visible_message( \
"<span class='notice'>[user] loads \the [src] with \the [P].</span>", \
"<span class='notice'>You load \the [src] with \the [P].</span>")
if(P.contents.len > 0)
user << "<span class='notice'>Some items are refused.</span>"
nanomanager.update_uis(src)
else
user << "<span class='notice'>\The [src] smartly refuses [O].</span>"
return 1
updateUsrDialog()
/obj/machinery/smartfridge/secure/attackby(var/obj/item/O as obj, var/mob/user as mob)
if (istype(O, /obj/item/weapon/card/emag))
src.emagged = 1
user << "You short out the product lock on [src]"
return
else if(istype(O, /obj/item/weapon/screwdriver))
src.panel_open = !src.panel_open
user << "You [src.panel_open ? "open" : "close"] the maintenance panel."
src.overlays.Cut()
if(src.panel_open)
src.overlays += image(src.icon, src.icon_panel)
src.updateUsrDialog()
return
else if(istype(O, /obj/item/device/multitool)||istype(O, /obj/item/weapon/wirecutters))
if(src.panel_open)
attack_hand(user)
emagged = 1
locked = -1
user << "You short out the product lock on [src]."
return
..()
return
/obj/machinery/smartfridge/attack_paw(mob/user as mob)
return src.attack_hand(user)
return attack_hand(user)
/obj/machinery/smartfridge/attack_ai(mob/user as mob)
return 0
/obj/machinery/smartfridge/attack_hand(mob/user as mob)
user.set_machine(src)
if(src.seconds_electrified != 0)
if(src.shock(user, 100))
if(!ispowered) return
if(seconds_electrified != 0)
if(shock(user, 100))
return
interact(user)
ui_interact(user)
/*******************
* SmartFridge Menu
********************/
/obj/machinery/smartfridge/interact(mob/user as mob)
if(!src.ispowered)
return
/obj/machinery/smartfridge/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null)
user.set_machine(src)
var/dat = "<TT><b>Select an item:</b><br>"
var/is_secure = istype(src,/obj/machinery/smartfridge/secure)
if (contents.len == 0)
dat += "<font color = 'red'>No product loaded!</font>"
var/data[0]
data["contents"] = null
data["wires"] = null
data["panel_open"] = panel_open
data["electrified"] = seconds_electrified > 0
data["shoot_inventory"] = shoot_inventory
data["locked"] = locked
data["secure"] = is_secure
var/list/items[0]
for (var/i=1 to length(item_quants))
var/K = item_quants[i]
var/count = item_quants[K]
if (count > 0)
items.Add(list(list("display_name" = html_encode(capitalize(K)), "vend" = i, "quantity" = count)))
if (items.len > 0)
data["contents"] = items
var/list/vendwires = null
if (is_secure)
vendwires = list(
"Violet" = 1,
"Orange" = 2,
"Green" = 3)
else
for (var/O in item_quants)
if(item_quants[O] > 0)
var/N = item_quants[O]
dat += "<FONT color = 'blue'><B>[capitalize(O)]</B>:"
dat += " [N] </font>"
dat += "<a href='byond://?src=\ref[src];vend=[O];amount=1'>Vend</A> "
if(N > 5)
dat += "(<a href='byond://?src=\ref[src];vend=[O];amount=5'>x5</A>)"
if(N > 10)
dat += "(<a href='byond://?src=\ref[src];vend=[O];amount=10'>x10</A>)"
if(N > 25)
dat += "(<a href='byond://?src=\ref[src];vend=[O];amount=25'>x25</A>)"
if(N > 1)
dat += "(<a href='?src=\ref[src];vend=[O];amount=[N]'>All</A>)"
dat += "<br>"
dat += "</TT>"
if(panel_open)
//One of the wires does absolutely nothing.
var/list/vendwires = list(
vendwires = list(
"Blue" = 1,
"Red" = 2,
"Black" = 3
)
dat += "<br><hr><br><B>Access Panel</B><br>"
for(var/wiredesc in vendwires)
var/is_uncut = src.wires & APCWireColorToFlag[vendwires[wiredesc]]
dat += "[wiredesc] wire: "
if(!is_uncut)
dat += "<a href='?src=\ref[src];cutwire=[vendwires[wiredesc]]'>Mend</a>"
else
dat += "<a href='?src=\ref[src];cutwire=[vendwires[wiredesc]]'>Cut</a> "
dat += "<a href='?src=\ref[src];pulsewire=[vendwires[wiredesc]]'>Pulse</a> "
dat += "<br>"
"Black" = 3)
dat += "<br>"
dat += "The orange light is [(src.seconds_electrified == 0) ? "off" : "on"].<BR>"
dat += "The red light is [src.shoot_inventory ? "off" : "blinking"].<BR>"
user << browse("<HEAD><TITLE>[src] Supplies</TITLE></HEAD><TT>[dat]</TT>", "window=smartfridge")
return
var/list/vendor_wires[0]
for (var/wire in vendwires)
var is_uncut = wires & APCWireColorToFlag[vendwires[wire]]
vendor_wires.Add(list(list("wire" = wire, "cut" = !is_uncut, "index" = vendwires[wire])))
if (vendor_wires.len > 0)
data["wires"] = vendor_wires
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data)
if (!ui)
ui = new(user, src, ui_key, "smartfridge.tmpl", src.name, 400, 500)
ui.set_initial_data(data)
ui.open()
/obj/machinery/smartfridge/Topic(href, href_list)
if(..())
return
usr.set_machine(src)
if (..()) return 0
if ((href_list["cutwire"]) && (src.panel_open))
var/twire = text2num(href_list["cutwire"])
if (!( istype(usr.get_active_hand(), /obj/item/weapon/wirecutters) ))
usr << "You need wirecutters!"
return
if (src.isWireColorCut(twire))
src.mend(twire)
else
src.cut(twire)
else if ((href_list["pulsewire"]) && (src.panel_open))
var/twire = text2num(href_list["pulsewire"])
if (!istype(usr.get_active_hand(), /obj/item/device/multitool))
usr << "You need a multitool!"
return
if (src.isWireColorCut(twire))
usr << "You can't pulse a cut wire."
return
else
src.pulse(twire)
else if (href_list["vend"])
var/N = href_list["vend"]
var/mob/user = usr
var/datum/nanoui/ui = nanomanager.get_open_ui(user, src, "main")
src.add_fingerprint(user)
if (href_list["close"])
user.unset_machine()
ui.close()
return 0
if (href_list["vend"])
var/index = text2num(href_list["vend"])
var/amount = text2num(href_list["amount"])
var/K = item_quants[index]
var/count = item_quants[K]
if(item_quants[N] <= 0) // Sanity check, there are probably ways to press the button when it shouldn't be possible.
return
// Sanity check, there are probably ways to press the button when it shouldn't be possible.
if(count > 0)
item_quants[K] = max(count - amount, 0)
item_quants[N] = max(item_quants[N] - amount, 0)
var/i = amount
for(var/obj/O in contents)
if (O.name == K)
O.loc = loc
i--
if (i <= 0)
return 1
var/i = amount
for(var/obj/O in contents)
if(O.name == N)
O.loc = src.loc
i--
if(i <= 0)
break
src.add_fingerprint(usr)
src.updateUsrDialog()
return
return 1
if (panel_open)
if (href_list["cutwire"])
if (!( istype(usr.get_active_hand(), /obj/item/weapon/wirecutters) ))
user << "You need wirecutters!"
return 1
var/wire_index = text2num(href_list["cutwire"])
if (isWireColorCut(wire_index))
mend(wire_index)
else
cut(wire_index)
return 1
if (href_list["pulsewire"])
if (!istype(usr.get_active_hand(), /obj/item/device/multitool))
usr << "You need a multitool!"
return 1
var/wire_index = text2num(href_list["pulsewire"])
if (isWireColorCut(wire_index))
usr << "You can't pulse a cut wire."
return 1
pulse(wire_index)
return 1
return 0
/*************
* Hacking
@@ -332,7 +355,7 @@
/obj/machinery/smartfridge/proc/mend(var/wireColor)
var/wireFlag = APCWireColorToFlag[wireColor]
var/wireIndex = APCWireColorToIndex[wireColor] //not used in this function
var/wireIndex = APCWireColorToIndex[wireColor]
src.wires |= wireFlag
switch(wireIndex)
if(WIRE_SHOCK)
@@ -347,7 +370,7 @@
switch(wireIndex)
if(WIRE_SHOCK)
src.seconds_electrified = 30
if (WIRE_SHOOTINV)
if(WIRE_SHOOTINV)
src.shoot_inventory = !src.shoot_inventory
if(WIRE_SCANID)
src.locked = -1
@@ -385,80 +408,23 @@
return 1
/obj/machinery/smartfridge/proc/shock(mob/user, prb)
if(!src.ispowered) // unpowered, no shock
return 0
if(!prob(prb))
return 0
if(!ispowered) return 0
if(!prob(prb)) return 0
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
s.set_up(5, 1, src)
s.start()
if (electrocute_mob(user, get_area(src), src, 0.7))
return 1
else
return 0
return electrocute_mob(user, get_area(src), src, 0.7)
/************************
* Secure SmartFridges
*************************/
/obj/machinery/smartfridge/secure/Topic(href, href_list)
usr.set_machine(src)
if ((usr.contents.Find(src) || (in_range(src, usr) && istype(src.loc, /turf))))
if ((!src.allowed(usr)) && (!src.emagged) && (src.locked != -1) && href_list["vend"]) //For SECURE VENDING MACHINES YEAH
usr << "\red Access denied." //Unless emagged of course
return
..()
return
/obj/machinery/smartfridge/secure/interact(mob/user as mob)
if(!src.ispowered)
return
var/dat = "<TT><b>Select an item:</b><br>"
if (contents.len == 0)
dat += "<font color = 'red'>No product loaded!</font>"
else
for (var/O in item_quants)
if(item_quants[O] > 0)
var/N = item_quants[O]
dat += "<FONT color = 'blue'><B>[capitalize(O)]</B>:"
dat += " [N] </font>"
dat += "<a href='byond://?src=\ref[src];vend=[O];amount=1'>Vend</A> "
if(N > 5)
dat += "(<a href='byond://?src=\ref[src];vend=[O];amount=5'>x5</A>)"
if(N > 10)
dat += "(<a href='byond://?src=\ref[src];vend=[O];amount=10'>x10</A>)"
if(N > 25)
dat += "(<a href='byond://?src=\ref[src];vend=[O];amount=25'>x25</A>)"
if(N > 1)
dat += "(<a href='?src=\ref[src];vend=[O];amount=[N]'>All</A>)"
dat += "<br>"
dat += "</TT>"
if(panel_open)
var/list/vendwires = list(
"Violet" = 1,
"Orange" = 2,
"Green" = 3
)
dat += "<br><hr><br><B>Access Panel</B><br>"
for(var/wiredesc in vendwires)
var/is_uncut = src.wires & APCWireColorToFlag[vendwires[wiredesc]]
dat += "[wiredesc] wire: "
if(!is_uncut)
dat += "<a href='?src=\ref[src];cutwire=[vendwires[wiredesc]]'>Mend</a>"
else
dat += "<a href='?src=\ref[src];cutwire=[vendwires[wiredesc]]'>Cut</a> "
dat += "<a href='?src=\ref[src];pulsewire=[vendwires[wiredesc]]'>Pulse</a> "
dat += "<br>"
dat += "<br>"
dat += "The orange light is [(src.seconds_electrified == 0) ? "off" : "on"].<BR>"
//dat += "The red light is [src.shoot_inventory ? "off" : "blinking"].<BR>"
dat += "The green light is [src.locked == 1 ? "off" : "[src.locked == -1 ? "blinking" : "on"]"].<BR>"
user << browse("<HEAD><TITLE>[src] Supplies</TITLE></HEAD><TT>[dat]</TT>", "window=smartfridge")
return
//TODO: Make smartfridges hackable. - JoeyJo0
if(!ispowered) return 0
if (usr.contents.Find(src) || (in_range(src, usr) && istype(loc, /turf)))
if (!allowed(usr) && !emagged && locked != -1 && href_list["vend"])
usr << "\red Access denied."
return 0
return ..()
+14 -4
View File
@@ -174,7 +174,7 @@ Class Procs:
return 1
if ( ! (istype(usr, /mob/living/carbon/human) || \
istype(usr, /mob/living/silicon) || \
istype(usr, /mob/living/carbon/monkey) && ticker && ticker.mode.name == "monkey") )
istype(usr, /mob/living/carbon/monkey)) )
usr << "\red You don't have the dexterity to do this!"
return 1
@@ -193,7 +193,7 @@ Class Procs:
src.add_fingerprint(usr)
var/area/A = get_area(src)
A.powerupdate = 1
A.master.powerupdate = 1
return 0
@@ -216,7 +216,7 @@ Class Procs:
return 1
if ( ! (istype(usr, /mob/living/carbon/human) || \
istype(usr, /mob/living/silicon) || \
istype(usr, /mob/living/carbon/monkey) && ticker && ticker.mode.name == "monkey") )
istype(usr, /mob/living/carbon/monkey)) )
usr << "\red You don't have the dexterity to do this!"
return 1
/*
@@ -236,7 +236,7 @@ Class Procs:
src.add_fingerprint(user)
var/area/A = get_area(src)
A.powerupdate = 1
A.master.powerupdate = 1
return 0
@@ -248,3 +248,13 @@ Class Procs:
uid = gl_uid
gl_uid++
/obj/machinery/proc/state(var/msg)
for(var/mob/O in hearers(src, null))
O.show_message("\icon[src] <span class = 'notice'>[msg]</span>", 2)
/obj/machinery/proc/ping(text=null)
if (!text)
text = "\The [src] pings."
state(text, "blue")
playsound(src.loc, 'sound/machines/ping.ogg', 50, 0)
+3 -3
View File
@@ -66,7 +66,7 @@
spark_system.attach(src)
sleep(10)
if(!installation)// if for some reason the turret has no gun (ie, admin spawned) it resorts to basic taser shots
projectile = /obj/item/projectile/energy/electrode//holder for the projectile, here it is being set
projectile = /obj/item/projectile/beam/stun//holder for the projectile, here it is being set
eprojectile = /obj/item/projectile/beam//holder for the projectile when emagged, if it is different
reqpower = 200
sound = 1
@@ -128,7 +128,7 @@
reqpower = 700
if(/obj/item/weapon/gun/energy/taser)
projectile = /obj/item/projectile/energy/electrode
projectile = /obj/item/projectile/beam/stun
eprojectile = projectile
iconholder = 1
reqpower = 200
@@ -170,7 +170,7 @@
reqpower = 500
else // Energy gun shots
projectile = /obj/item/projectile/energy/electrode// if it hasn't been emagged, it uses normal taser shots
projectile = /obj/item/projectile/beam/stun// if it hasn't been emagged, it uses normal taser shots
eprojectile = /obj/item/projectile/beam//If it has, going to kill mode
iconholder = 1
egun = 1
+22 -73
View File
@@ -59,7 +59,9 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
signal.data["vmask"], signal.data["vmessage"],
signal.data["radio"], signal.data["message"],
signal.data["name"], signal.data["job"],
signal.data["realname"], signal.data["vname"],, signal.data["compression"], signal.data["level"], signal.frequency)
signal.data["realname"], signal.data["vname"],,
signal.data["compression"], signal.data["level"], signal.frequency,
signal.data["verb"], signal.data["language"] )
/** #### - Simple Broadcast - #### **/
@@ -84,7 +86,8 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
signal.data["vmask"], signal.data["vmessage"],
signal.data["radio"], signal.data["message"],
signal.data["name"], signal.data["job"],
signal.data["realname"], signal.data["vname"], 4, signal.data["compression"], signal.data["level"], signal.frequency)
signal.data["realname"], signal.data["vname"], 4, signal.data["compression"], signal.data["level"], signal.frequency,
signal.data["verb"], signal.data["language"])
if(!message_delay)
message_delay = 1
@@ -147,14 +150,16 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
signal.data["vmask"], signal.data["vmessage"],
signal.data["radio"], signal.data["message"],
signal.data["name"], signal.data["job"],
signal.data["realname"], signal.data["vname"],, signal.data["compression"], list(0), connection.frequency)
signal.data["realname"], signal.data["vname"],, signal.data["compression"], list(0), connection.frequency,
signal.data["verb"], signal.data["language"])
else
if(intercept)
Broadcast_Message(signal.data["connection"], signal.data["mob"],
signal.data["vmask"], signal.data["vmessage"],
signal.data["radio"], signal.data["message"],
signal.data["name"], signal.data["job"],
signal.data["realname"], signal.data["vname"], 3, signal.data["compression"], list(0), connection.frequency)
signal.data["realname"], signal.data["vname"], 3, signal.data["compression"], list(0), connection.frequency,
signal.data["verb"], signal.data["language"])
@@ -218,7 +223,8 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
/proc/Broadcast_Message(var/datum/radio_frequency/connection, var/mob/M,
var/vmask, var/vmessage, var/obj/item/device/radio/radio,
var/message, var/name, var/job, var/realname, var/vname,
var/data, var/compression, var/list/level, var/freq)
var/data, var/compression, var/list/level, var/freq, var/verbage = "says", var/datum/language/speaking = null)
/* ###### Prepare the radio connection ###### */
@@ -350,6 +356,8 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
freq_text = "Special Ops"
if(1345)
freq_text = "Response Team"
if(1447)
freq_text = "AI Private"
//There's probably a way to use the list var of channels in code\game\communications.dm to make the dept channels non-hardcoded, but I wasn't in an experimentive mood. --NEO
@@ -369,7 +377,6 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
// syndies!
if (display_freq == SYND_FREQ)
part_a = "<span class='syndradio'><span class='name'>"
// centcomm channels (deathsquid and ert)
else if (display_freq in CENT_FREQS)
part_a = "<span class='centradio'><span class='name'>"
@@ -378,6 +385,10 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
else if (display_freq == COMM_FREQ)
part_a = "<span class='comradio'><span class='name'>"
// AI private channel
else if (display_freq == 1447)
part_a = "<span class='airadio'><span class='name'>"
// department radio formatting (poorly optimized, ugh)
else if (display_freq == SEC_FREQ)
part_a = "<span class='secradio'><span class='name'>"
@@ -439,102 +450,40 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
//End of research and feedback code.
var/aitrack = ""
/* ###### Send the message ###### */
/* --- Process all the mobs that heard a masked voice (understood) --- */
if (length(heard_masked))
var/N = name
var/J = job
var/rendered = "[part_a][N][part_b][quotedmsg][part_c]"
for (var/mob/R in heard_masked)
aitrack = "<a href='byond://?src=\ref[radio];track2=\ref[R];track=\ref[M]'>"
if(data == 4)
aitrack = "<a href='byond://?src=\ref[radio];track2=\ref[R];faketrack=\ref[M]'>"
if(istype(R, /mob/living/silicon/ai))
R.show_message("[part_a][aitrack][N] ([J]) </a>[part_b][quotedmsg][part_c]", 2)
else
R.show_message(rendered, 2)
R.hear_radio(message,verbage, speaking, part_a, part_b, M)
/* --- Process all the mobs that heard the voice normally (understood) --- */
if (length(heard_normal))
var/rendered = "[part_a][realname][part_b][quotedmsg][part_c]"
for (var/mob/R in heard_normal)
aitrack = "<a href='byond://?src=\ref[radio];track2=\ref[R];track=\ref[M]'>"
if(data == 4)
aitrack = "<a href='byond://?src=\ref[radio];track2=\ref[R];faketrack=\ref[M]'>"
if(istype(R, /mob/living/silicon/ai))
R.show_message("[part_a][aitrack][realname] ([job]) </a>[part_b][quotedmsg][part_c]", 2)
else
R.show_message(rendered, 2)
R.hear_radio(message, verbage, speaking, part_a, part_b, M)
/* --- Process all the mobs that heard the voice normally (did not understand) --- */
if (length(heard_voice))
var/rendered = "[part_a][vname][part_b][vmessage][part_c]"
for (var/mob/R in heard_voice)
aitrack = "<a href='byond://?src=\ref[radio];track2=\ref[R];track=\ref[M]'>"
if(data == 4)
aitrack = "<a href='byond://?src=\ref[radio];track2=\ref[R];faketrack=\ref[M]'>"
if(istype(R, /mob/living/silicon/ai))
R.show_message("[part_a][aitrack][vname] ([job]) </a>[part_b][vmessage]][part_c]", 2)
else
R.show_message(rendered, 2)
R.hear_radio(message,verbage, speaking, part_a, part_b, M)
/* --- Process all the mobs that heard a garbled voice (did not understand) --- */
// Displays garbled message (ie "f*c* **u, **i*er!")
if (length(heard_garbled))
if(M)
quotedmsg = M.say_quote(stars(message))
else
quotedmsg = stars(quotedmsg)
var/rendered = "[part_a][vname][part_b][quotedmsg][part_c]"
for (var/mob/R in heard_garbled)
aitrack = "<a href='byond://?src=\ref[radio];track2=\ref[R];track=\ref[M]'>"
if(data == 4)
aitrack = "<a href='byond://?src=\ref[radio];track2=\ref[R];faketrack=\ref[M]'>"
if(istype(R, /mob/living/silicon/ai))
R.show_message("[part_a][aitrack][vname]</a>[part_b][quotedmsg][part_c]", 2)
else
R.show_message(rendered, 2)
R.hear_radio(message, verbage, speaking, part_a, part_b, M, 1)
/* --- Complete gibberish. Usually happens when there's a compressed message --- */
if (length(heard_gibberish))
if(M)
quotedmsg = M.say_quote(Gibberish(message, compression + 50))
else
quotedmsg = Gibberish(quotedmsg, compression + 50)
var/rendered = "[part_a][Gibberish(name, compression + 50)][part_b][quotedmsg][part_c]"
for (var/mob/R in heard_gibberish)
aitrack = "<a href='byond://?src=\ref[radio];track2=\ref[R];track=\ref[M]'>"
if(data == 4)
aitrack = "<a href='byond://?src=\ref[radio];track2=\ref[R];faketrack=\ref[M]'>"
if(istype(R, /mob/living/silicon/ai))
R.show_message("[part_a][aitrack][Gibberish(realname, compression + 50)] ([Gibberish(job, compression + 50)]) </a>[part_b][quotedmsg][part_c]", 2)
else
R.show_message(rendered, 2)
R.hear_radio(message, verbage, speaking, part_a, part_b, M, 1)
/proc/Broadcast_SimpleMessage(var/source, var/frequency, var/text, var/data, var/mob/M, var/compression, var/level)
@@ -91,7 +91,9 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list()
"type" = signal.data["type"],
"server" = signal.data["server"],
"reject" = signal.data["reject"],
"level" = signal.data["level"]
"level" = signal.data["level"],
"verb" = signal.data["verb"],
"language" = signal.data["language"]
)
// Keep the "original" signal constant
+1 -1
View File
@@ -766,7 +766,7 @@
product_ads = "We like plants!;Don't you want some?;The greenest thumbs ever.;We like big plants.;Soft soil..."
icon_state = "nutri"
icon_deny = "nutri-deny"
products = list(/obj/item/beezeez = 45,/obj/item/nutrient/ez = 35,/obj/item/nutrient/l4z = 25,/obj/item/nutrient/rh = 15,/obj/item/weapon/pestspray = 20,
products = list(/obj/item/nutrient/ez = 35,/obj/item/nutrient/l4z = 25,/obj/item/nutrient/rh = 15,/obj/item/weapon/pestspray = 20,
/obj/item/weapon/reagent_containers/syringe = 5,/obj/item/weapon/storage/bag/plants = 5)
premium = list(/obj/item/weapon/reagent_containers/glass/bottle/ammonia = 10,/obj/item/weapon/reagent_containers/glass/bottle/diethylamine = 5)
+1 -1
View File
@@ -117,7 +117,7 @@
icon_state = "mecha_taser"
energy_drain = 20
equip_cooldown = 8
projectile = /obj/item/projectile/energy/electrode
projectile = /obj/item/projectile/beam/stun
fire_sound = 'sound/weapons/Taser.ogg'
@@ -91,8 +91,8 @@
/datum/poster/bay_19
icon_state="bsposter19"
name = "Respect a Soghun"
desc = "This poster depicts a well dressed looking Soghun receiving a prestigious award. It appears to espouse greater co-operation and harmony between the two races."
name = "Respect a Unathi"
desc = "This poster depicts a well dressed looking Unathi receiving a prestigious award. It appears to espouse greater co-operation and harmony between the two races."
/datum/poster/bay_20
icon_state="bsposter20"
@@ -142,4 +142,4 @@
/datum/poster/bay_29
icon_state="bsposter29"
name = "Winter Is Coming"
desc = "On the poster is a frighteningly large wolf, he warns: \"Only YOU can keep the station from freezing during planetary occultation!\""
desc = "On the poster is a frighteningly large wolf, he warns: \"Only YOU can keep the station from freezing during planetary occultation!\""
+31 -3
View File
@@ -26,9 +26,37 @@ proc/explosion(turf/epicenter, devastation_range, heavy_impact_range, light_impa
epicenter = get_turf(epicenter)
if(!epicenter) return
var/max_range = max(devastation_range, heavy_impact_range, light_impact_range, flash_range)
//playsound(epicenter, 'sound/effects/explosionfar.ogg', 100, 1, round(devastation_range*2,1) )
//playsound(epicenter, "explosion", 100, 1, round(devastation_range,1) )
playsound(epicenter, 'sound/effects/explosionfar.ogg', 100, 1, round(devastation_range*2,1) )
playsound(epicenter, "explosion", 100, 1, round(devastation_range,1) )
// Play sounds; we want sounds to be different depending on distance so we will manually do it ourselves.
// Stereo users will also hear the direction of the explosion!
// Calculate far explosion sound range. Only allow the sound effect for heavy/devastating explosions.
// 3/7/14 will calculate to 80 + 35
var/far_dist = 0
far_dist += heavy_impact_range * 5
far_dist += devastation_range * 20
var/frequency = get_rand_frequency()
for(var/mob/M in player_list)
// Double check for client
if(M && M.client)
var/turf/M_turf = get_turf(M)
if(M_turf && M_turf.z == epicenter.z)
var/dist = get_dist(M_turf, epicenter)
// If inside the blast radius + world.view - 2
if(dist <= round(max_range + world.view - 2, 1))
M.playsound_local(epicenter, get_sfx("explosion"), 100, 1, frequency, falloff = 5) // get_sfx() is so that everyone gets the same sound
//You hear a far explosion if you're outside the blast radius. Small bombs shouldn't be heard all over the station.
else if(dist <= far_dist)
var/far_volume = Clamp(far_dist, 30, 50) // Volume is based on explosion size and dist
far_volume += (dist <= far_dist * 0.5 ? 50 : 0) // add 50 volume if the mob is pretty close to the explosion
M.playsound_local(epicenter, 'sound/effects/explosionfar.ogg', far_volume, 1, frequency, falloff = 5)
var/close = range(world.view+round(devastation_range,1), epicenter)
// to all distanced mobs play a different sound
@@ -55,7 +83,7 @@ proc/explosion(turf/epicenter, devastation_range, heavy_impact_range, light_impa
var/y0 = epicenter.y
var/z0 = epicenter.z
for(var/turf/T in range(epicenter, max(devastation_range, heavy_impact_range, light_impact_range)))
for(var/turf/T in range(epicenter, max_range))
var/dist = cheap_pythag(T.x - x0,T.y - y0)
if(dist < devastation_range) dist = 1
+3 -3
View File
@@ -10,7 +10,7 @@ var/global/list/obj/item/device/pda/PDAs = list()
icon = 'icons/obj/pda.dmi'
icon_state = "pda"
item_state = "electronic"
w_class = 1.0
w_class = 2.0
flags = FPRINT | TABLEPASS
slot_flags = SLOT_ID | SLOT_BELT
@@ -338,7 +338,7 @@ var/global/list/obj/item/device/pda/PDAs = list()
return
lastmode = mode
var/title = "Personal Data Assistant"
var/data[0] // This is the data that will be sent to the PDA
@@ -367,7 +367,7 @@ var/global/list/obj/item/device/pda/PDAs = list()
if(mode in cartmodes)
data["records"] = cartridge.create_NanoUI_values()
if(mode == 0)
if(mode == 0)
cartdata["name"] = cartridge.name
cartdata["access"] = list(\
"access_security" = cartridge.access_security,\
+1 -1
View File
@@ -4,7 +4,7 @@
icon_state = "flash"
item_state = "flashbang" //looks exactly like a flash (and nothing like a flashbang)
throwforce = 5
w_class = 1.0
w_class = 2.0
throw_speed = 4
throw_range = 10
flags = FPRINT | TABLEPASS| CONDUCT
@@ -107,6 +107,7 @@
item_state = ""
flags = FPRINT | TABLEPASS | CONDUCT
brightness_on = 2
w_class = 1
// the desk lamps are a bit special
+1 -1
View File
@@ -3,7 +3,7 @@
desc = "A device used to project your voice. Loudly."
icon_state = "megaphone"
item_state = "radio"
w_class = 1.0
w_class = 2.0
flags = FPRINT | TABLEPASS | CONDUCT
var/spamcheck = 0
+12 -6
View File
@@ -218,7 +218,7 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use
del(A)
return
/obj/item/device/radio/talk_into(mob/living/M as mob, message, channel)
/obj/item/device/radio/talk_into(mob/living/M as mob, message, channel, var/verb = "says", var/datum/language/speaking = null)
if(!on) return // the device has to be on
// Fix for permacell radios, but kinda eh about actually fixing them.
if(!M || !message) return
@@ -348,7 +348,9 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use
"type" = 0, // determines what type of radio input it is: normal broadcast
"server" = null, // the last server to log this signal
"reject" = 0, // if nonzero, the signal will not be accepted by any broadcasting machinery
"level" = position.z // The source's z level
"level" = position.z, // The source's z level
"language" = speaking,
"verb" = verb
)
signal.frequency = connection.frequency // Quick frequency set
@@ -401,7 +403,9 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use
"type" = 0,
"server" = null,
"reject" = 0,
"level" = position.z
"level" = position.z,
"language" = speaking,
"verb" = verb
)
signal.frequency = connection.frequency // Quick frequency set
@@ -423,7 +427,7 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use
Broadcast_Message(connection, M, voicemask, pick(M.speak_emote),
src, message, displayname, jobname, real_name, M.voice_name,
filter_type, signal.data["compression"], list(position.z), connection.frequency)
filter_type, signal.data["compression"], list(position.z), connection.frequency,verb,speaking)
@@ -596,11 +600,13 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use
else
R.show_message(rendered, 2)
/obj/item/device/radio/hear_talk(mob/M as mob, msg)
/obj/item/device/radio/hear_talk(mob/M as mob, msg, var/verb = "says", var/datum/language/speaking = null)
if (broadcasting)
if(get_dist(src, M) <= canhear_range)
talk_into(M, msg)
talk_into(M, msg,null,verb,speaking)
/*
/obj/item/device/radio/proc/accept_rad(obj/item/device/radio/R as obj, message)
+1 -1
View File
@@ -68,7 +68,7 @@ REAGENT SCANNER
flags = FPRINT | TABLEPASS | CONDUCT
slot_flags = SLOT_BELT
throwforce = 3
w_class = 1.0
w_class = 2.0
throw_speed = 5
throw_range = 10
m_amt = 200
@@ -3,7 +3,7 @@
name = "universal recorder"
icon_state = "taperecorderidle"
item_state = "analyzer"
w_class = 1.0
w_class = 2.0
m_amt = 60
g_amt = 30
var/emagged = 0.0
+1 -1
View File
@@ -5,7 +5,7 @@
item_state = "lgloves"
force = 0
throwforce = 0
w_class = 1.0
w_class = 2.0
throw_speed = 1
throw_range = 15
var/state
+2 -2
View File
@@ -4,7 +4,7 @@
icon = 'icons/obj/items.dmi'
amount = 5
max_amount = 5
w_class = 1
w_class = 2
throw_speed = 4
throw_range = 20
var/heal_brute = 0
@@ -17,7 +17,7 @@
if ( ! (istype(user, /mob/living/carbon/human) || \
istype(user, /mob/living/silicon) || \
istype(user, /mob/living/carbon/monkey) && ticker && ticker.mode.name == "monkey") )
istype(user, /mob/living/carbon/monkey)) )
user << "\red You don't have the dexterity to do this!"
return 1
@@ -131,7 +131,7 @@ var/global/list/datum/stack_recipe/wood_recipes = list ( \
new/datum/stack_recipe("wooden barricade", /obj/structure/barricade/wooden, 5, time = 50, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("wooden door", /obj/structure/mineral_door/wood, 10, time = 20, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("coffin", /obj/structure/closet/coffin, 5, time = 15, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("apiary", /obj/item/apiary, 10, time = 25, one_per_turf = 0, on_floor = 0), \
// new/datum/stack_recipe("apiary", /obj/item/apiary, 10, time = 25, one_per_turf = 0, on_floor = 0)
)
/obj/item/stack/sheet/wood
+1 -1
View File
@@ -4,7 +4,7 @@
//Added by Jack Rost
/obj/item/trash
icon = 'icons/obj/trash.dmi'
w_class = 1.0
w_class = 2.0
desc = "This is rubbish."
raisins
name = "4no raisins"
+1 -1
View File
@@ -41,7 +41,7 @@
throwforce = 5.0
throw_speed = 1
throw_range = 4
w_class = 1
w_class = 2
origin_tech = "materials=4;magnets=3;syndicate=4"
attack_verb = list("shoved", "bashed")
var/active = 0
@@ -94,7 +94,7 @@
storage_slots = 50; //the number of plant pieces it can carry.
max_combined_w_class = 200 //Doesn't matter what this is, so long as it's more or equal to storage_slots * plants.w_class
max_w_class = 3
w_class = 1
w_class = 2
can_hold = list("/obj/item/weapon/reagent_containers/food/snacks/grown","/obj/item/seeds","/obj/item/weapon/grown")
@@ -252,5 +252,5 @@
storage_slots = 50; //the number of cash pieces it can carry.
max_combined_w_class = 200 //Doesn't matter what this is, so long as it's more or equal to storage_slots * cash.w_class
max_w_class = 3
w_class = 1
w_class = 2
can_hold = list("/obj/item/weapon/coin","/obj/item/weapon/spacecash")
@@ -2,6 +2,7 @@
name = "briefcase"
desc = "It's made of AUTHENTIC faux-leather and has a price-tag still attached. Its owner must be a real professional."
icon_state = "briefcase"
item_state = "briefcase"
flags = FPRINT | TABLEPASS| CONDUCT
force = 8.0
throw_speed = 1
@@ -117,3 +117,20 @@
new /obj/item/clothing/suit/space/syndicate(src)
new /obj/item/clothing/head/helmet/space/syndicate(src)
return
/obj/item/weapon/storage/box/syndie_kit/chameleon
name = "Chameleon Kit"
desc = "Comes with all the clothes you need to impersonate most people. Acting lessons sold seperately."
storage_slots = 10
/obj/item/weapon/storage/box/syndie_kit/chameleon/New()
..()
new /obj/item/clothing/under/chameleon(src)
new /obj/item/clothing/head/chameleon(src)
new /obj/item/clothing/suit/chameleon(src)
new /obj/item/clothing/shoes/chameleon(src)
new /obj/item/weapon/storage/backpack/chameleon(src)
new /obj/item/clothing/gloves/chameleon(src)
new /obj/item/clothing/mask/chameleon(src)
new /obj/item/clothing/glasses/chameleon(src)
new /obj/item/weapon/gun/projectile/chameleon(src)
new /obj/item/ammo_magazine/chameleon(src)
+2 -2
View File
@@ -6,7 +6,7 @@
flags = FPRINT | TABLEPASS
slot_flags = SLOT_BELT
throwforce = 0
w_class = 1.0
w_class = 2.0
throw_speed = 7
throw_range = 15
attack_verb = list("banned")
@@ -26,7 +26,7 @@
throw_speed = 1
throw_range = 4
throwforce = 10
w_class = 1
w_class = 2
suicide_act(mob/user)
viewers(user) << "\red <b>[user] is impaling \himself with the [src.name]! It looks like \he's trying to commit suicide.</b>"
+1 -1
View File
@@ -14,7 +14,7 @@ LINEN BINS
throwforce = 1
throw_speed = 1
throw_range = 2
w_class = 1.0
w_class = 2.0
item_color = "white"
@@ -23,5 +23,5 @@
new /obj/item/clothing/head/greenbandana(src)
new /obj/item/weapon/minihoe(src)
new /obj/item/weapon/hatchet(src)
new /obj/item/weapon/bee_net(src)
// new /obj/item/weapon/bee_net(src) //No more bees, March 2014
return
+8 -1
View File
@@ -28,6 +28,13 @@
/obj/structure/extinguisher_cabinet/attack_hand(mob/user)
if(isrobot(user) || isalien(user))
return
if (hasorgans(user))
var/datum/organ/external/temp = user:organs_by_name["r_hand"]
if (user.hand)
temp = user:organs_by_name["l_hand"]
if(temp && !temp.is_usable())
user << "<span class='notice'>You try to move your [temp.display_name], but cannot!"
return
if(has_extinguisher)
user.put_in_hands(has_extinguisher)
user << "<span class='notice'>You take [has_extinguisher] from [src].</span>"
@@ -62,4 +69,4 @@
else
icon_state = "extinguisher_full"
else
icon_state = "extinguisher_empty"
icon_state = "extinguisher_empty"
+304
View File
@@ -0,0 +1,304 @@
/obj/item/inflatable
name = "inflatable wall"
desc = "A folded membrane which rapidly expands into a large cubical shape on activation."
icon = 'icons/obj/inflatable.dmi'
icon_state = "folded_wall"
w_class = 3.0
attack_self(mob/user)
playsound(loc, 'sound/items/zip.ogg', 75, 1)
user << "\blue You inflate [src]."
var/obj/structure/inflatable/R = new /obj/structure/inflatable(user.loc)
src.transfer_fingerprints_to(R)
R.add_fingerprint(user)
del(src)
/obj/structure/inflatable
name = "inflatable wall"
desc = "An inflated membrane. Do not puncture."
density = 1
anchored = 1
opacity = 0
icon = 'icons/obj/inflatable.dmi'
icon_state = "wall"
var/health = 50.0
New(location)
..()
update_nearby_tiles(need_rebuild=1)
Del()
update_nearby_tiles()
..()
proc/update_nearby_tiles(need_rebuild) //Copypasta from airlock code
if(!air_master)
return 0
air_master.mark_for_update(get_turf(src))
return 1
CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
return 0
bullet_act(var/obj/item/projectile/Proj)
health -= Proj.damage
..()
if(health <= 0)
deflate(1)
return
ex_act(severity)
switch(severity)
if(1.0)
del(src)
return
if(2.0)
deflate(1)
return
if(3.0)
if(prob(50))
deflate(1)
return
blob_act()
deflate(1)
meteorhit()
//world << "glass at [x],[y],[z] Mhit"
deflate(1)
attack_paw(mob/user as mob)
return attack_generic(user, 15)
attack_hand(mob/user as mob)
add_fingerprint(user)
return
proc/attack_generic(mob/user as mob, damage = 0) //used by attack_alien, attack_animal, and attack_slime
health -= damage
if(health <= 0)
user.visible_message("<span class='danger'>[user] tears open [src]!</span>")
deflate(1)
else //for nicer text~
user.visible_message("<span class='danger'>[user] tears at [src]!</span>")
attack_alien(mob/user as mob)
if(islarva(user)) return
attack_generic(user, 15)
attack_animal(mob/user as mob)
if(!isanimal(user)) return
var/mob/living/simple_animal/M = user
if(M.melee_damage_upper <= 0) return
attack_generic(M, M.melee_damage_upper)
attack_slime(mob/user as mob)
if(!isslimeadult(user)) return
attack_generic(user, rand(10, 15))
attackby(obj/item/weapon/W as obj, mob/user as mob)
if(!istype(W)) return
if (is_sharp(W))
visible_message("\red <b>[user] pierces [src] with [W]!</b>")
deflate(1)
if(W.damtype == BRUTE || W.damtype == BURN)
hit(W.force)
..()
return
proc/hit(var/damage, var/sound_effect = 1)
health = max(0, health - damage)
if(sound_effect)
playsound(loc, 'sound/effects/Glasshit.ogg', 75, 1)
if(health <= 0)
deflate(1)
proc/deflate(var/violent=0)
playsound(loc, 'sound/machines/hiss.ogg', 75, 1)
if(violent)
visible_message("[src] rapidly deflates!")
var/obj/item/inflatable/torn/R = new /obj/item/inflatable/torn(loc)
src.transfer_fingerprints_to(R)
del(src)
else
//user << "\blue You slowly deflate the inflatable wall."
visible_message("[src] slowly deflates.")
spawn(50)
var/obj/item/inflatable/R = new /obj/item/inflatable(loc)
src.transfer_fingerprints_to(R)
del(src)
verb/hand_deflate()
set name = "Deflate"
set category = "Object"
set src in oview(1)
deflate()
/obj/item/inflatable/door/
name = "inflatable door"
desc = "A folded membrane which rapidly expands into a simple door on activation."
icon = 'icons/obj/inflatable.dmi'
icon_state = "folded_door"
attack_self(mob/user)
playsound(loc, 'sound/items/zip.ogg', 75, 1)
user << "\blue You inflate [src]."
var/obj/structure/inflatable/door/R = new /obj/structure/inflatable/door(user.loc)
src.transfer_fingerprints_to(R)
R.add_fingerprint(user)
del(src)
/obj/structure/inflatable/door //Based on mineral door code
name = "inflatable door"
density = 1
anchored = 1
opacity = 0
icon = 'icons/obj/inflatable.dmi'
icon_state = "door_closed"
var/state = 0 //closed, 1 == open
var/isSwitchingStates = 0
//Bumped(atom/user)
// ..()
// if(!state)
// return TryToSwitchState(user)
// return
attack_ai(mob/user as mob) //those aren't machinery, they're just big fucking slabs of a mineral
if(isAI(user)) //so the AI can't open it
return
else if(isrobot(user)) //but cyborgs can
if(get_dist(user,src) <= 1) //not remotely though
return TryToSwitchState(user)
attack_paw(mob/user as mob)
return TryToSwitchState(user)
attack_hand(mob/user as mob)
return TryToSwitchState(user)
CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
if(air_group)
return state
if(istype(mover, /obj/effect/beam))
return !opacity
return !density
proc/TryToSwitchState(atom/user)
if(isSwitchingStates) return
if(ismob(user))
var/mob/M = user
if(world.time - user.last_bumped <= 60) return //NOTE do we really need that?
if(M.client)
if(iscarbon(M))
var/mob/living/carbon/C = M
if(!C.handcuffed)
SwitchState()
else
SwitchState()
else if(istype(user, /obj/mecha))
SwitchState()
proc/SwitchState()
if(state)
Close()
else
Open()
update_nearby_tiles()
proc/Open()
isSwitchingStates = 1
//playsound(loc, 'sound/effects/stonedoor_openclose.ogg', 100, 1)
flick("door_opening",src)
sleep(10)
density = 0
opacity = 0
state = 1
update_icon()
isSwitchingStates = 0
proc/Close()
isSwitchingStates = 1
//playsound(loc, 'sound/effects/stonedoor_openclose.ogg', 100, 1)
flick("door_closing",src)
sleep(10)
density = 1
opacity = 0
state = 0
update_icon()
isSwitchingStates = 0
update_icon()
if(state)
icon_state = "door_open"
else
icon_state = "door_closed"
deflate(var/violent=0)
playsound(loc, 'sound/machines/hiss.ogg', 75, 1)
if(violent)
visible_message("[src] rapidly deflates!")
var/obj/item/inflatable/door/torn/R = new /obj/item/inflatable/door/torn(loc)
src.transfer_fingerprints_to(R)
del(src)
else
//user << "\blue You slowly deflate the inflatable wall."
visible_message("[src] slowly deflates.")
spawn(50)
var/obj/item/inflatable/door/R = new /obj/item/inflatable/door(loc)
src.transfer_fingerprints_to(R)
del(src)
/obj/item/inflatable/torn
name = "torn inflatable wall"
desc = "A folded membrane which rapidly expands into a large cubical shape on activation. It is too torn to be usable."
icon = 'icons/obj/inflatable.dmi'
icon_state = "folded_wall_torn"
attack_self(mob/user)
user << "\blue The inflatable wall is too torn to be inflated!"
add_fingerprint(user)
/obj/item/inflatable/door/torn
name = "torn inflatable door"
desc = "A folded membrane which rapidly expands into a simple door on activation. It is too torn to be usable."
icon = 'icons/obj/inflatable.dmi'
icon_state = "folded_door_torn"
attack_self(mob/user)
user << "\blue The inflatable door is too torn to be inflated!"
add_fingerprint(user)
/obj/item/weapon/storage/briefcase/inflatable
name = "inflatable barrier box"
desc = "Contains inflatable walls and doors."
icon_state = "inf_box"
item_state = "syringe_kit"
max_combined_w_class = 21
New()
..()
new /obj/item/inflatable/door(src)
new /obj/item/inflatable/door(src)
new /obj/item/inflatable/door(src)
new /obj/item/inflatable(src)
new /obj/item/inflatable(src)
new /obj/item/inflatable(src)
new /obj/item/inflatable(src)
+5 -1
View File
@@ -204,7 +204,11 @@
if("Cn9") soundfile = 'sound/piano/Cn9.ogg'
else return
hearers(15, src) << sound(soundfile)
//hearers(15, src) << sound(soundfile)
var/turf/source = get_turf(src)
for(var/mob/M in hearers(15, source))
M.playsound_local(source, file(soundfile), 100, falloff = 5)
/obj/structure/device/piano/proc/playsong()
do
+19 -10
View File
@@ -323,15 +323,23 @@
anchored = 1
var/busy = 0 //Something's being washed at the moment
/obj/structure/sink/attack_hand(mob/M as mob)
if(isrobot(M) || isAI(M))
/obj/structure/sink/attack_hand(mob/user as mob)
if (hasorgans(user))
var/datum/organ/external/temp = user:organs_by_name["r_hand"]
if (user.hand)
temp = user:organs_by_name["l_hand"]
if(temp && !temp.is_usable())
user << "<span class='notice'>You try to move your [temp.display_name], but cannot!"
return
if(isrobot(user) || isAI(user))
return
if(!Adjacent(M))
if(!Adjacent(user))
return
if(busy)
M << "\red Someone's already washing here."
user << "\red Someone's already washing here."
return
usr << "\blue You start washing your hands."
@@ -340,13 +348,14 @@
sleep(40)
busy = 0
if(!Adjacent(M)) return //Person has moved away from the sink
if(!Adjacent(user)) return //Person has moved away from the sink
M.clean_blood()
if(ishuman(M))
M:update_inv_gloves()
user.clean_blood()
if(ishuman(user))
user:update_inv_gloves()
for(var/mob/V in viewers(src, null))
V.show_message("\blue [M] washes their hands using \the [src].")
V.show_message("\blue [user] washes their hands using \the [src].")
/obj/structure/sink/attackby(obj/item/O as obj, mob/user as mob)
if(busy)
@@ -415,4 +424,4 @@
/obj/structure/sink/puddle/attackby(obj/item/O as obj, mob/user as mob)
icon_state = "puddle-splash"
..()
icon_state = "puddle"
icon_state = "puddle"
+67 -73
View File
@@ -1,79 +1,41 @@
/proc/playsound(var/atom/source, soundin, vol as num, vary, extrarange as num)
//Frequency stuff only works with 45kbps oggs.
var/list/shatter_sound = list('sound/effects/Glassbr1.ogg','sound/effects/Glassbr2.ogg','sound/effects/Glassbr3.ogg')
var/list/explosion_sound = list('sound/effects/Explosion1.ogg','sound/effects/Explosion2.ogg')
var/list/spark_sound = list('sound/effects/sparks1.ogg','sound/effects/sparks2.ogg','sound/effects/sparks3.ogg','sound/effects/sparks4.ogg')
var/list/rustle_sound = list('sound/effects/rustle1.ogg','sound/effects/rustle2.ogg','sound/effects/rustle3.ogg','sound/effects/rustle4.ogg','sound/effects/rustle5.ogg')
var/list/punch_sound = list('sound/weapons/punch1.ogg','sound/weapons/punch2.ogg','sound/weapons/punch3.ogg','sound/weapons/punch4.ogg')
var/list/clown_sound = list('sound/effects/clownstep1.ogg','sound/effects/clownstep2.ogg')
var/list/swing_hit_sound = list('sound/weapons/genhit1.ogg', 'sound/weapons/genhit2.ogg', 'sound/weapons/genhit3.ogg')
var/list/hiss_sound = list('sound/voice/hiss1.ogg','sound/voice/hiss2.ogg','sound/voice/hiss3.ogg','sound/voice/hiss4.ogg')
var/list/page_sound = list('sound/effects/pageturn1.ogg', 'sound/effects/pageturn2.ogg','sound/effects/pageturn3.ogg')
//var/list/gun_sound = list('sound/weapons/Gunshot.ogg', 'sound/weapons/Gunshot2.ogg','sound/weapons/Gunshot3.ogg','sound/weapons/Gunshot4.ogg')
switch(soundin)
if ("shatter") soundin = pick('sound/effects/Glassbr1.ogg','sound/effects/Glassbr2.ogg','sound/effects/Glassbr3.ogg')
if ("explosion") soundin = pick('sound/effects/Explosion1.ogg','sound/effects/Explosion2.ogg')
if ("sparks") soundin = pick('sound/effects/sparks1.ogg','sound/effects/sparks2.ogg','sound/effects/sparks3.ogg','sound/effects/sparks4.ogg')
if ("rustle") soundin = pick('sound/effects/rustle1.ogg','sound/effects/rustle2.ogg','sound/effects/rustle3.ogg','sound/effects/rustle4.ogg','sound/effects/rustle5.ogg')
if ("punch") soundin = pick('sound/weapons/punch1.ogg','sound/weapons/punch2.ogg','sound/weapons/punch3.ogg','sound/weapons/punch4.ogg')
if ("clownstep") soundin = pick('sound/effects/clownstep1.ogg','sound/effects/clownstep2.ogg')
if ("swing_hit") soundin = pick('sound/weapons/genhit1.ogg', 'sound/weapons/genhit2.ogg', 'sound/weapons/genhit3.ogg')
if ("hiss") soundin = pick('sound/voice/hiss1.ogg','sound/voice/hiss2.ogg','sound/voice/hiss3.ogg','sound/voice/hiss4.ogg')
if ("pageturn") soundin = pick('sound/effects/pageturn1.ogg', 'sound/effects/pageturn2.ogg','sound/effects/pageturn3.ogg')
/proc/playsound(var/atom/source, soundin, vol as num, vary, extrarange as num, falloff)
var/sound/S = sound(soundin)
S.wait = 0 //No queue
S.channel = 0 //Any channel
S.volume = vol
soundin = get_sfx(soundin) // same sound for everyone
if (vary)
S.frequency = rand(32000, 55000)
if(isarea(source))
error("[source] is an area and is trying to make the sound: [soundin]")
return
for (var/A in range(world.view+extrarange, source)) // Plays for people in range.
var/frequency = get_rand_frequency() // Same frequency for everybody
var/turf/turf_source = get_turf(source)
if(ismob(A))
var/mob/M = A
var/mob/M2 = locate(/mob/, M)
if (M2 && M2.client)
if(M2.ear_deaf <= 0 || !M.ear_deaf)
if(isturf(source))
var/dx = source.x - M2.x
S.pan = max(-100, min(100, dx/8.0 * 100))
// Looping through the player list has the added bonus of working for mobs inside containers
for (var/P in player_list)
var/mob/M = P
if(!M || !M.client)
continue
if(get_dist(M, turf_source) <= world.view + extrarange)
var/turf/T = get_turf(M)
if(T && T.z == turf_source.z)
M.playsound_local(turf_source, soundin, vol, vary, frequency, falloff)
M2 << S
var/const/FALLOFF_SOUNDS = 1
var/const/SURROUND_CAP = 7
if (M.client)
if(M.ear_deaf <= 0 || !M.ear_deaf)
if(isturf(source))
var/dx = source.x - M.x
S.pan = max(-100, min(100, dx/8.0 * 100))
M << S
if(istype(A, /obj/structure/closet))
var/obj/O = A
for(var/mob/M in O)
if (M.client)
if(M.ear_deaf <= 0 || !M.ear_deaf)
if(isturf(source))
var/dx = source.x - M.x
S.pan = max(-100, min(100, dx/8.0 * 100))
M << S
for(var/obj/mecha/mech in range(world.view+extrarange, source))
var/mob/M = mech.occupant
if (M && M.client)
if(M.ear_deaf <= 0 || !M.ear_deaf)
if(isturf(source))
var/dx = source.x - M.x
S.pan = max(-100, min(100, dx/8.0 * 100))
M << S
// Now plays for people in lockers! -- Polymorph
/mob/proc/playsound_local(var/atom/source, soundin, vol as num, vary, extrarange as num)
/mob/proc/playsound_local(var/turf/turf_source, soundin, vol as num, vary, frequency, falloff)
if(!src.client || ear_deaf > 0) return
switch(soundin)
if ("shatter") soundin = pick('sound/effects/Glassbr1.ogg','sound/effects/Glassbr2.ogg','sound/effects/Glassbr3.ogg')
if ("explosion") soundin = pick('sound/effects/Explosion1.ogg','sound/effects/Explosion2.ogg')
if ("sparks") soundin = pick('sound/effects/sparks1.ogg','sound/effects/sparks2.ogg','sound/effects/sparks3.ogg','sound/effects/sparks4.ogg')
if ("rustle") soundin = pick('sound/effects/rustle1.ogg','sound/effects/rustle2.ogg','sound/effects/rustle3.ogg','sound/effects/rustle4.ogg','sound/effects/rustle5.ogg')
if ("punch") soundin = pick('sound/weapons/punch1.ogg','sound/weapons/punch2.ogg','sound/weapons/punch3.ogg','sound/weapons/punch4.ogg')
if ("clownstep") soundin = pick('sound/effects/clownstep1.ogg','sound/effects/clownstep2.ogg')
if ("swing_hit") soundin = pick('sound/weapons/genhit1.ogg', 'sound/weapons/genhit2.ogg', 'sound/weapons/genhit3.ogg')
if ("hiss") soundin = pick('sound/voice/hiss1.ogg','sound/voice/hiss2.ogg','sound/voice/hiss3.ogg','sound/voice/hiss4.ogg')
soundin = get_sfx(soundin)
var/sound/S = sound(soundin)
S.wait = 0 //No queue
@@ -81,14 +43,46 @@
S.volume = vol
if (vary)
S.frequency = rand(32000, 55000)
if(isturf(source))
var/dx = source.x - src.x
S.pan = max(-100, min(100, dx/8.0 * 100))
if(frequency)
S.frequency = frequency
else
S.frequency = get_rand_frequency()
if(isturf(turf_source))
// 3D sounds, the technology is here!
var/turf/T = get_turf(src)
var/dx = turf_source.x - T.x // Hearing from the right/left
S.x = round(max(-SURROUND_CAP, min(SURROUND_CAP, dx)), 1)
var/dz = turf_source.y - T.y // Hearing from infront/behind
S.z = round(max(-SURROUND_CAP, min(SURROUND_CAP, dz)), 1)
// The y value is for above your head, but there is no ceiling in 2d spessmens.
S.y = 1
S.falloff = (falloff ? falloff : FALLOFF_SOUNDS)
src << S
/client/proc/playtitlemusic()
if(!ticker || !ticker.login_music) return
if(prefs.toggles & SOUND_LOBBY)
src << sound(ticker.login_music, repeat = 0, wait = 0, volume = 85, channel = 1) // MAD JAMS
src << sound(ticker.login_music, repeat = 0, wait = 0, volume = 85, channel = 1) // MAD JAMS
/proc/get_rand_frequency()
return rand(32000, 55000) //Frequency stuff only works with 45kbps oggs.
/proc/get_sfx(soundin)
if(istext(soundin))
switch(soundin)
if ("shatter") soundin = pick(shatter_sound)
if ("explosion") soundin = pick(explosion_sound)
if ("sparks") soundin = pick(spark_sound)
if ("rustle") soundin = pick(rustle_sound)
if ("punch") soundin = pick(punch_sound)
if ("clownstep") soundin = pick(clown_sound)
if ("swing_hit") soundin = pick(swing_hit_sound)
if ("hiss") soundin = pick(hiss_sound)
if ("pageturn") soundin = pick(page_sound)
//if ("gunshot") soundin = pick(gun_sound)
return soundin
+2 -2
View File
@@ -115,8 +115,8 @@ var/list/reg_dna = list( )
var/mouse_respawn_time = 5 //Amount of time that must pass between a player dying as a mouse and repawning as a mouse. In minutes.
var/CELLRATE = 0.002 // multiplier for watts per tick <> cell storage (eg: .002 means if there is a load of 1000 watts, 20 units will be taken from a cell per second)
var/CHARGELEVEL = 0.0005 // Cap for how fast cells charge, as a percentage-per-tick (.001 means cellcharge is capped to 1% per second)
var/CELLRATE = 0.002 // multiplier for watts per tick <> cell storage (eg: 0.02 means if there is a load of 1000 watts, 20 units will be taken from a cell per second)
var/CHARGELEVEL = 0.0005 // Cap for how fast cells charge, as a percentage-per-tick (0.01 means cellcharge is capped to 1% per second)
var/shuttle_z = 2 //default
var/airtunnel_start = 68 // default
+19
View File
@@ -54,6 +54,7 @@ datum/preferences
var/age = 30 //age of character
var/b_type = "A+" //blood type (not-chooseable)
var/underwear = 1 //underwear type
var/undershirt = 1 //undershirt type
var/backbag = 2 //backpack type
var/h_style = "Bald" //Hair type
var/r_hair = 0 //Hair color
@@ -338,6 +339,8 @@ datum/preferences
else
dat += "Underwear: <a href ='?_src_=prefs;preference=underwear;task=input'><b>[underwear_f[underwear]]</b></a><br>"
dat += "Undershirt: <a href='?_src_=prefs;preference=undershirt;task=input'><b>[undershirt_t[undershirt]]</b></a><br>"
dat += "Backpack Type:<br><a href ='?_src_=prefs;preference=bag;task=input'><b>[backbaglist[backbag]]</b></a><br>"
dat += "Nanotrasen Relation:<br><a href ='?_src_=prefs;preference=nt_relation;task=input'><b>[nanotrasen_relation]</b></a><br>"
@@ -843,6 +846,9 @@ datum/preferences
if("underwear")
underwear = rand(1,underwear_m.len)
ShowChoices(user)
if("undershirt")
undershirt = rand(1,undershirt_t.len)
ShowChoices(user)
if("eyes")
r_eyes = rand(0,255)
g_eyes = rand(0,255)
@@ -1019,6 +1025,15 @@ datum/preferences
underwear = underwear_options.Find(new_underwear)
ShowChoices(user)
if("undershirt")
var/list/undershirt_options
undershirt_options = undershirt_t
var/new_undershirt = input(user, "Choose your character's undershirt:", "Character Preference") as null|anything in undershirt_options
if (new_undershirt)
undershirt = undershirt_options.Find(new_undershirt)
ShowChoices(user)
if("eyes")
var/new_eyes = input(user, "Choose your character's eye colour:", "Character Preference") as color|null
if(new_eyes)
@@ -1295,6 +1310,10 @@ datum/preferences
underwear = 0 //I'm sure this is 100% unnecessary, but I'm paranoid... sue me. //HAH NOW NO MORE MAGIC CLONING UNDIES
character.underwear = underwear
if(undershirt > undershirt_t.len || undershirt < 1)
undershirt = 0
character.undershirt = undershirt
if(backbag > 4 || backbag < 1)
backbag = 1 //Same as above
character.backbag = backbag
+9 -2
View File
@@ -84,8 +84,6 @@
S["be_special"] << be_special
S["default_slot"] << default_slot
S["toggles"] << toggles
S["UI_style_color"] << UI_style_color
S["UI_style_alpha"] << UI_style_alpha
return 1
@@ -125,6 +123,7 @@
S["eyes_green"] >> g_eyes
S["eyes_blue"] >> b_eyes
S["underwear"] >> underwear
S["undershirt"] >> undershirt
S["backbag"] >> backbag
S["b_type"] >> b_type
@@ -158,6 +157,9 @@
S["uplinklocation"] >> uplinklocation
S["UI_style_color"] << UI_style_color
S["UI_style_alpha"] << UI_style_alpha
//Sanitize
metadata = sanitize_text(metadata, initial(metadata))
real_name = reject_bad_name(real_name)
@@ -181,6 +183,7 @@
g_eyes = sanitize_integer(g_eyes, 0, 255, initial(g_eyes))
b_eyes = sanitize_integer(b_eyes, 0, 255, initial(b_eyes))
underwear = sanitize_integer(underwear, 1, underwear_m.len, initial(underwear))
undershirt = sanitize_integer(undershirt, 1, undershirt_t.len, initial(undershirt))
backbag = sanitize_integer(backbag, 1, backbaglist.len, initial(backbag))
b_type = sanitize_text(b_type, initial(b_type))
@@ -231,6 +234,7 @@
S["eyes_green"] << g_eyes
S["eyes_blue"] << b_eyes
S["underwear"] << underwear
S["undershirt"] << undershirt
S["backbag"] << backbag
S["b_type"] << b_type
@@ -264,6 +268,9 @@
S["uplinklocation"] << uplinklocation
S["UI_style_color"] << UI_style_color
S["UI_style_alpha"] << UI_style_alpha
return 1
+18
View File
@@ -241,6 +241,9 @@ BLIND // can't see anything
*/
var/obj/item/clothing/tie/hastie = null
var/displays_id = 1
var/rolled_down = 0
var/basecolor
/obj/item/clothing/under/attackby(obj/item/I, mob/user)
if(!hastie && istype(I, /obj/item/clothing/tie))
@@ -307,6 +310,21 @@ BLIND // can't see anything
usr << "Your suit will now report your vital lifesigns as well as your coordinate position."
..()
/obj/item/clothing/under/verb/rollsuit()
set name = "Roll Down Jumpsuit"
set category = "Object"
set src in usr
if(!istype(usr, /mob/living)) return
if(usr.stat) return
if(copytext(item_color,-2) != "_d")
basecolor = item_color
if(basecolor + "_d_s" in icon_states('icons/mob/uniform.dmi'))
item_color = item_color == "[basecolor]" ? "[basecolor]_d" : "[basecolor]"
usr.update_inv_w_uniform()
else
usr << "<span class='notice'>You cannot roll down the uniform!</span>"
/obj/item/clothing/under/verb/removetie()
set name = "Remove Accessory"
set category = "Object"
+1 -1
View File
@@ -21,7 +21,7 @@
desc = "A sterile mask designed to help prevent the spread of diseases."
icon_state = "sterile"
item_state = "sterile"
w_class = 1
w_class = 2
flags = FPRINT|TABLEPASS|MASKCOVERSMOUTH
gas_transfer_coefficient = 0.90
permeability_coefficient = 0.01
+424 -44
View File
@@ -1,3 +1,7 @@
//*****************
//**Cham Jumpsuit**
//*****************
/obj/item/clothing/under/chameleon
//starts off as black
name = "black jumpsuit"
@@ -6,60 +10,35 @@
item_color = "black"
desc = "It's a plain jumpsuit. It seems to have a small dial on the wrist."
origin_tech = "syndicate=3"
siemens_coefficient = 0.8
var/list/clothing_choices = list()
New()
..()
for(var/U in typesof(/obj/item/clothing/under/color)-(/obj/item/clothing/under/color))
var/blocked = list(/obj/item/clothing/under/chameleon, /obj/item/clothing/under/cloud,
/obj/item/clothing/under/golem, /obj/item/clothing/under/gimmick)//Prevent infinite loops and bad jumpsuits.
for(var/U in typesof(/obj/item/clothing/under)-blocked)
var/obj/item/clothing/under/V = new U
src.clothing_choices += V
for(var/U in typesof(/obj/item/clothing/under/rank)-(/obj/item/clothing/under/rank))
var/obj/item/clothing/under/V = new U
src.clothing_choices += V
src.clothing_choices[V.name] = U
return
attackby(obj/item/clothing/under/U as obj, mob/user as mob)
..()
if(istype(U, /obj/item/clothing/under/chameleon))
user << "\red Nothing happens."
return
if(istype(U, /obj/item/clothing/under))
if(src.clothing_choices.Find(U))
user << "\red Pattern is already recognised by the suit."
return
src.clothing_choices += U
user << "\red Pattern absorbed by the suit."
emp_act(severity)
name = "psychedelic"
desc = "Groovy!"
icon_state = "psyche"
item_color = "psyche"
spawn(200)
name = "Black Jumpsuit"
icon_state = "bl_suit"
item_color = "black"
desc = null
..()
update_icon()
usr.update_inv_w_uniform()
verb/change()
set name = "Change Color"
set name = "Change Jumpsuit Appearance"
set category = "Object"
set src in usr
if(icon_state == "psyche")
usr << "\red Your suit is malfunctioning"
return
var/obj/item/clothing/under/A
A = input("Select Colour to change it to", "BOOYEA", A) in clothing_choices
if(!A)
var/picked = input("Select jumpsuit to change it to", "Chameleon Jumpsuit")as null|anything in clothing_choices
if(!picked || !clothing_choices[picked])
return
var/newtype = clothing_choices[picked]
var/obj/item/clothing/A = new newtype
desc = null
permeability_coefficient = 0.90
@@ -69,14 +48,415 @@
icon_state = A.icon_state
item_state = A.item_state
item_color = A.item_color
usr.update_inv_w_uniform() //so our overlays update.
if(usr)
usr.update_inv_w_uniform() //so our overlays update.
//*****************
//**Chameleon Hat**
//*****************
/obj/item/clothing/head/chameleon
name = "grey cap"
icon_state = "greysoft"
item_state = "greysoft"
item_color = "grey"
desc = "It looks like a plain hat, but upon closer inspection, there's an advanced holographic array installed inside. It seems to have a small dial inside."
origin_tech = "syndicate=3"
var/list/clothing_choices = list()
/obj/item/clothing/under/chameleon/all/New()
..()
var/blocked = list(/obj/item/clothing/under/chameleon, /obj/item/clothing/under/chameleon/all)
//to prevent an infinite loop
for(var/U in typesof(/obj/item/clothing/under)-blocked)
var/obj/item/clothing/under/V = new U
src.clothing_choices += V
New()
..()
var/blocked = list(/obj/item/clothing/head/chameleon,
/obj/item/clothing/head/space/golem, /obj/item/clothing/head/justice,)//Prevent infinite loops and bad hats.
for(var/U in typesof(/obj/item/clothing/head)-blocked)
var/obj/item/clothing/head/V = new U
src.clothing_choices[V.name] = U
return
emp_act(severity) //Because we don't have psych for all slots right now but still want a downside to EMP. In this case your cover's blown.
name = "grey cap"
desc = "It's a baseball hat in a tasteful grey colour."
icon_state = "greysoft"
item_color = "grey"
update_icon()
usr.update_inv_head()
verb/change()
set name = "Change Hat/Helmet Appearance"
set category = "Object"
set src in usr
var/picked = input("Select headwear to change it to", "Chameleon Hat")as null|anything in clothing_choices
if(!picked || !clothing_choices[picked])
return
var/newtype = clothing_choices[picked]
var/obj/item/clothing/A = new newtype
desc = null
permeability_coefficient = 0.90
desc = A.desc
name = A.name
icon_state = A.icon_state
item_state = A.item_state
item_color = A.item_color
flags_inv = A.flags_inv
if(usr)
usr.update_inv_head() //so our overlays update.
//******************
//**Chameleon Suit**
//******************
/obj/item/clothing/suit/chameleon
name = "armor"
icon_state = "armor"
item_state = "armor"
desc = "It appears to be a vest of standard armor, except this is embedded with a hidden holographic cloaker, allowing it to change it's appearance, but offering no protection.. It seems to have a small dial inside."
origin_tech = "syndicate=3"
var/list/clothing_choices = list()
New()
..()
var/blocked = list(/obj/item/clothing/suit/chameleon, /obj/item/clothing/suit/space/space_ninja,
/obj/item/clothing/suit/golem, /obj/item/clothing/suit/suit, /obj/item/clothing/suit/cyborg_suit, /obj/item/clothing/suit/justice,
/obj/item/clothing/suit/greatcoat)//Prevent infinite loops and bad suits.
for(var/U in typesof(/obj/item/clothing/suit)-blocked)
var/obj/item/clothing/suit/V = new U
src.clothing_choices[V.name] = U
return
emp_act(severity) //Because we don't have psych for all slots right now but still want a downside to EMP. In this case your cover's blown.
name = "armor"
desc = "An armored vest that protects against some damage."
icon_state = "armor"
item_color = "armor"
update_icon()
usr.update_inv_wear_suit()
verb/change()
set name = "Change Exosuit Appearance"
set category = "Object"
set src in usr
var/picked = input("Select exosuit to change it to", "Chameleon Exosuit")as null|anything in clothing_choices
if(!picked || !clothing_choices[picked])
return
var/newtype = clothing_choices[picked]
var/obj/item/clothing/A = new newtype
desc = null
permeability_coefficient = 0.90
desc = A.desc
name = A.name
icon_state = A.icon_state
item_state = A.item_state
item_color = A.item_color
flags_inv = A.flags_inv
if(usr)
usr.update_inv_wear_suit() //so our overlays update.
//*******************
//**Chameleon Shoes**
//*******************
/obj/item/clothing/shoes/chameleon
name = "black shoes"
icon_state = "black"
item_state = "black"
item_color = "black"
desc = "They're comfy black shoes, with clever cloaking technology built in. It seems to have a small dial on the back of each shoe."
origin_tech = "syndicate=3"
var/list/clothing_choices = list()
New()
..()
var/blocked = list(/obj/item/clothing/shoes/chameleon,
/obj/item/clothing/shoes/golem, /obj/item/clothing/shoes/syndigaloshes, /obj/item/clothing/shoes/cyborg)//prevent infinite loops and bad shoes.
for(var/U in typesof(/obj/item/clothing/shoes)-blocked)
var/obj/item/clothing/shoes/V = new U
src.clothing_choices[V.name] = U
return
emp_act(severity) //Because we don't have psych for all slots right now but still want a downside to EMP. In this case your cover's blown.
name = "black shoes"
desc = "A pair of black shoes."
icon_state = "black"
item_state = "black"
item_color = "black"
update_icon()
usr.update_inv_shoes()
verb/change()
set name = "Change Footwear Appearance"
set category = "Object"
set src in usr
var/picked = input("Select shoes to change it to", "Chameleon Shoes")as null|anything in clothing_choices
if(!picked || !clothing_choices[picked])
return
var/newtype = clothing_choices[picked]
var/obj/item/clothing/A = new newtype
desc = null
permeability_coefficient = 0.90
desc = A.desc
name = A.name
icon_state = A.icon_state
item_state = A.item_state
item_color = A.item_color
if(usr)
usr.update_inv_shoes() //so our overlays update.
//**********************
//**Chameleon Backpack**
//**********************
/obj/item/weapon/storage/backpack/chameleon
name = "backpack"
icon_state = "backpack"
item_state = "backpack"
desc = "A backpack outfitted with cloaking tech. It seems to have a small dial inside, kept away from the storage."
origin_tech = "syndicate=3"
var/list/clothing_choices = list()
New()
..()
var/blocked = list(/obj/item/weapon/storage/backpack/chameleon, /obj/item/weapon/storage/backpack/satchel/withwallet)
for(var/U in typesof(/obj/item/weapon/storage/backpack)-blocked)//Prevent infinite loops and bad backpacks.
var/obj/item/weapon/storage/backpack/V = new U
src.clothing_choices[V.name] = U
return
emp_act(severity) //Because we don't have psych for all slots right now but still want a downside to EMP. In this case your cover's blown.
name = "backpack"
desc = "You wear this on your back and put items into it."
icon_state = "backpack"
item_state = "backpack"
update_icon()
usr.update_inv_back()
verb/change()
set name = "Change Backpack Appearance"
set category = "Object"
set src in usr
var/picked = input("Select backpack to change it to", "Chameleon Backpack")as null|anything in clothing_choices
if(!picked || !clothing_choices[picked])
return
var/newtype = clothing_choices[picked]
var/obj/item/weapon/storage/backpack/A = new newtype
desc = null
permeability_coefficient = 0.90
desc = A.desc
name = A.name
icon_state = A.icon_state
item_state = A.item_state
item_color = A.item_color
if(usr)
usr.update_inv_back() //so our overlays update.
//********************
//**Chameleon Gloves**
//********************
/obj/item/clothing/gloves/chameleon
name = "black gloves"
icon_state = "black"
item_state = "bgloves"
item_color = "brown"
desc = "It looks like a pair of gloves, but it seems to have a small dial inside."
origin_tech = "syndicate=3"
var/list/clothing_choices = list()
New()
..()
var/blocked = list(/obj/item/clothing/gloves/chameleon)//Prevent infinite loops and bad hats.
for(var/U in typesof(/obj/item/clothing/gloves)-blocked)
var/obj/item/clothing/gloves/V = new U
src.clothing_choices[V.name] = U
return
emp_act(severity) //Because we don't have psych for all slots right now but still want a downside to EMP. In this case your cover's blown.
name = "black gloves"
desc = "It looks like a pair of gloves, but it seems to have a small dial inside."
icon_state = "black"
item_color = "brown"
update_icon()
usr.update_inv_gloves()
verb/change()
set name = "Change Gloves Appearance"
set category = "Object"
set src in usr
var/picked = input("Select gloves to change it to", "Chameleon Gloves")as null|anything in clothing_choices
if(!picked || !clothing_choices[picked])
return
var/newtype = clothing_choices[picked]
var/obj/item/clothing/A = new newtype
desc = null
permeability_coefficient = 0.90
desc = A.desc
name = A.name
icon_state = A.icon_state
item_state = A.item_state
item_color = A.item_color
flags_inv = A.flags_inv
if(usr)
usr.update_inv_gloves() //so our overlays update.
//******************
//**Chameleon Mask**
//******************
/obj/item/clothing/mask/chameleon
name = "gas mask"
icon_state = "gas_alt"
item_state = "gas_alt"
desc = "It looks like a plain gask mask, but on closer inspection, it seems to have a small dial inside."
origin_tech = "syndicate=3"
var/list/clothing_choices = list()
New()
..()
var/blocked = list(/obj/item/clothing/mask/chameleon)//Prevent infinite loops and bad hats.
for(var/U in typesof(/obj/item/clothing/mask)-blocked)
var/obj/item/clothing/mask/V = new U
if(V)
src.clothing_choices[V.name] = U
return
emp_act(severity) //Because we don't have psych for all slots right now but still want a downside to EMP. In this case your cover's blown.
name = "gas mask"
desc = "It's a gas mask."
icon_state = "gas_alt"
update_icon()
usr.update_inv_wear_mask()
verb/change()
set name = "Change Mask Appearance"
set category = "Object"
set src in usr
var/picked = input("Select mask to change it to", "Chameleon Mask")as null|anything in clothing_choices
if(!picked || !clothing_choices[picked])
return
var/newtype = clothing_choices[picked]
var/obj/item/clothing/A = new newtype
desc = null
permeability_coefficient = 0.90
desc = A.desc
name = A.name
icon_state = A.icon_state
item_state = A.item_state
flags_inv = A.flags_inv
if(usr)
usr.update_inv_wear_mask() //so our overlays update.
//*********************
//**Chameleon Glasses**
//*********************
/obj/item/clothing/glasses/chameleon
name = "Optical Meson Scanner"
icon_state = "meson"
item_state = "glasses"
desc = "It looks like a plain set of mesons, but on closer inspection, it seems to have a small dial inside."
origin_tech = "syndicate=3"
var/list/clothing_choices = list()
New()
..()
var/blocked = list(/obj/item/clothing/glasses/chameleon)//Prevent infinite loops and bad hats.
for(var/U in typesof(/obj/item/clothing/glasses)-blocked)
var/obj/item/clothing/glasses/V = new U
src.clothing_choices[V.name] = U
return
emp_act(severity) //Because we don't have psych for all slots right now but still want a downside to EMP. In this case your cover's blown.
name = "Optical Meson Scanner"
desc = "It's a set of mesons."
icon_state = "meson"
update_icon()
usr.update_inv_glasses()
verb/change()
set name = "Change Glasses Appearance"
set category = "Object"
set src in usr
var/picked = input("Select glasses to change it to", "Chameleon Glasses")as null|anything in clothing_choices
if(!picked || !clothing_choices[picked])
return
var/newtype = clothing_choices[picked]
var/obj/item/clothing/A = new newtype
desc = null
permeability_coefficient = 0.90
desc = A.desc
name = A.name
icon_state = A.icon_state
item_state = A.item_state
flags_inv = A.flags_inv
if(usr)
usr.update_inv_glasses() //so our overlays update.
//*****************
//**Chameleon Gun**
//*****************
/obj/item/weapon/gun/projectile/chameleon
name = "desert eagle"
desc = "A fake Desert Eagle with a dial on the side to change the gun's disguise."
icon_state = "deagle"
w_class = 3.0
max_shells = 7
caliber = ".45"
origin_tech = "combat=2;materials=2;syndicate=8"
ammo_type = "/obj/item/ammo_casing/chameleon"
var/list/gun_choices = list()
New()
..()
var/blocked = list(/obj/item/weapon/gun/projectile/chameleon)
for(var/U in typesof(/obj/item/weapon/gun/)-blocked)
var/obj/item/weapon/gun/V = new U
src.gun_choices[V.name] = U
return
emp_act(severity)
name = "desert eagle"
desc = "It's a desert eagle."
icon_state = "deagle"
update_icon()
usr.update_inv_r_hand()
usr.update_inv_l_hand()
verb/change()
set name = "Change Gun Appearance"
set category = "Object"
set src in usr
var/picked = input("Select gun to change it to", "Chameleon Gun")as null|anything in gun_choices
if(!picked || !gun_choices[picked])
return
var/newtype = gun_choices[picked]
var/obj/item/weapon/gun/A = new newtype
desc = null
permeability_coefficient = 0.90
desc = A.desc
name = A.name
icon_state = A.icon_state
item_state = A.item_state
flags_inv = A.flags_inv
if(usr)
usr.update_inv_r_hand()
usr.update_inv_l_hand() //so our overlays update.
+6 -6
View File
@@ -762,7 +762,7 @@
icon = 'icons/obj/custom_items.dmi'
icon_state = "mara_kilpatrick_1"
flags = FPRINT|TABLEPASS
w_class = 1
w_class = 2
////// Small locket - Altair An-Nasaqan - Serithi
@@ -775,7 +775,7 @@
item_color = "altair_locket"
slot_flags = 0
flags = FPRINT|TABLEPASS
w_class = 1
w_class = 2
slot_flags = SLOT_MASK
////// Silver locket - Konaa Hirano - Konaa_Hirano
@@ -789,7 +789,7 @@
item_color = "konaahirano"
slot_flags = 0
flags = FPRINT|TABLEPASS
w_class = 1
w_class = 2
slot_flags = SLOT_MASK
var/obj/item/held //Item inside locket.
@@ -819,7 +819,7 @@
icon = 'icons/obj/custom_items.dmi'
icon_state = "nasir_khayyam_1"
flags = FPRINT|TABLEPASS
w_class = 1
w_class = 2
slot_flags = SLOT_MASK
////// Emerald necklace - Ty Foster - Nega
@@ -830,7 +830,7 @@
icon = 'icons/obj/custom_items.dmi'
icon_state = "ty_foster"
flags = FPRINT|TABLEPASS
w_class = 1
w_class = 2
////// Apollon Pendant - Michael Guess - Dragor23
/obj/item/clothing/mask/michael_guess_1
@@ -839,7 +839,7 @@
icon = 'icons/obj/custom_items.dmi'
icon_state = "michael_guess_1"
flags = FPRINT|TABLEPASS
w_class = 1
w_class = 2
slot_flags = SLOT_MASK
//////////// Shoes ////////////
+1 -1
View File
@@ -6,7 +6,7 @@
icon = 'icons/obj/storage.dmi'
icon_state = "evidenceobj"
item_state = ""
w_class = 1
w_class = 2
/obj/item/weapon/evidencebag/afterattack(obj/item/I, mob/user as mob, proximity)
if(!proximity) return
+1 -1
View File
@@ -11,7 +11,7 @@
throwforce = 1.0
throw_speed = 1
throw_range = 2
w_class = 1.0
w_class = 2.0
var/access = list()
access = access_crate_cash
var/worth = 0
+6
View File
@@ -1215,6 +1215,12 @@ I said no!
)
result = /obj/item/weapon/reagent_containers/food/snacks/tofurkey
// Fuck Science!
/datum/recipe/ruinedvirusdish
items = list(
/obj/item/weapon/virusdish
)
result = /obj/item/weapon/ruinedvirusdish
//////////////////////////////////////////
// bs12 food port stuff
+1 -1
View File
@@ -247,7 +247,7 @@
icon_state ="scanner"
throw_speed = 1
throw_range = 5
w_class = 1.0
w_class = 2.0
flags = FPRINT | TABLEPASS
var/obj/machinery/librarycomp/computer // Associated computer - Modes 1 to 3 use this
var/obj/item/weapon/book/book // Currently scanned book
@@ -69,6 +69,15 @@
..()
/mob/dead/observer/Topic(href, href_list)
if (href_list["track"])
var/mob/target = locate(href_list["track"]) in mob_list
if(target)
ManualFollow(target)
/mob/dead/attackby(obj/item/W, mob/user)
if(istype(W,/obj/item/weapon/tome))
var/mob/dead/M = src
+92
View File
@@ -0,0 +1,92 @@
// At minimum every mob has a hear_say proc.
/mob/proc/hear_say(var/message, var/verb = "says", var/datum/language/language = null, var/alt_name = "",var/italics = 0, var/mob/speaker = null)
if(!client)
return
var/style = "body"
if(language)
if(!say_understands(speaker,language))
message = stars(message)
verb = language.speech_verb
style = language.colour
var/speaker_name = speaker.name
if(istype(speaker, /mob/living/carbon/human))
var/mob/living/carbon/human/H = speaker
speaker_name = H.GetVoice()
if(italics)
message = "<i>[message]</i>"
var/track = null
if(istype(src, /mob/dead/observer))
if(speaker_name != speaker.real_name)
speaker_name = "[speaker.real_name] ([speaker_name])"
track = "(<a href='byond://?src=\ref[src];track=\ref[speaker]'>follow</a>) "
if(client.prefs.toggles & CHAT_GHOSTEARS && speaker in view(src))
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 them."
else
src << "<span class='game say'><span class='name'>[speaker_name]</span>[alt_name] [track]<span class='[style]'>[verb], <span class='message'>\"[message]\"</span></span></span>"
/mob/proc/hear_radio(var/message, var/verb="says", var/datum/language/language=null, var/part_a, var/part_b, var/mob/speaker = null, var/hard_to_hear = 0)
if(!client)
return
var/track = null
var/style = "body"
if(language)
if(!say_understands(speaker,language))
message = stars(message)
verb = language.speech_verb
style = language.colour
if(hard_to_hear)
message = stars(message)
var/speaker_name = speaker.name
if(istype(speaker, /mob/living/carbon/human))
var/mob/living/carbon/human/H = speaker
if(H.voice)
speaker_name = H.voice
if(hard_to_hear)
speaker_name = "unknown"
if(istype(src, /mob/living/silicon/ai) && !hard_to_hear)
var/jobname // the mob's "job"
if (ishuman(speaker))
var/mob/living/carbon/human/H = speaker
jobname = H.get_assignment()
else if (iscarbon(speaker)) // Nonhuman carbon mob
jobname = "No id"
else if (isAI(speaker))
jobname = "AI"
else if (isrobot(speaker))
jobname = "Cyborg"
else if (istype(speaker, /mob/living/silicon/pai))
jobname = "Personal AI"
else
jobname = "Unknown"
track = "<a href='byond://?src=\ref[src];track=\ref[speaker]'>[speaker_name] ([jobname])</a>"
if(istype(src, /mob/dead/observer))
if(speaker_name != speaker.real_name)
speaker_name = "[speaker.real_name] ([speaker_name])"
track = "[speaker_name] (<a href='byond://?src=\ref[src];track=\ref[speaker]'>follow</a>)"
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]<span class=\"[style]\"> [verb], \"[message]\"</span></span></span>"
else
src << "[part_a][speaker_name][part_b]<span class=\"[style]\"> [verb], \"[message]\"</span></span></span>"
@@ -5,7 +5,7 @@
icon_state = "brain2"
flags = TABLEPASS
force = 1.0
w_class = 1.0
w_class = 2.0
throwforce = 1.0
throw_speed = 3
throw_range = 5
+12 -7
View File
@@ -195,17 +195,22 @@
if (istype(src,/mob/living/carbon/human) && src:w_uniform)
var/mob/living/carbon/human/H = src
H.w_uniform.add_fingerprint(M)
src.sleeping = max(0,src.sleeping-5)
if(src.sleeping == 0)
src.resting = 0
if(lying)
src.sleeping = max(0,src.sleeping-5)
if(src.sleeping == 0)
src.resting = 0
M.visible_message("<span class='notice'>[M] shakes [src] trying to wake [t_him] up!", \
"<span class='notice'>You shake [src] trying to wake [t_him] up!")
else
M.visible_message("<span class='notice'>[M] hugs [src] to make [t_him] feel better!</span>", \
"<span class='notice'>You hug [src] to make [t_him] feel better!</span>")
AdjustParalysis(-3)
AdjustStunned(-3)
AdjustWeakened(-3)
playsound(src.loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
M.visible_message( \
"\blue [M] shakes [src] trying to wake [t_him] up!", \
"\blue You shake [src] trying to wake [t_him] up!", \
)
/mob/living/carbon/proc/eyecheck()
return 0
@@ -142,6 +142,7 @@
UpdateDamageIcon()
hud_updateflag |= 1 << HEALTH_HUD
updatehealth()
speech_problem_flag = 1
//Heal MANY external organs, in random order
@@ -163,6 +164,7 @@
parts -= picked
updatehealth()
hud_updateflag |= 1 << HEALTH_HUD
speech_problem_flag = 1
if(update) UpdateDamageIcon()
// damage MANY external organs, in random order
@@ -56,7 +56,7 @@ emp_act
return 2
//BEGIN BOOK'S TASER NERF.
if(istype(P, /obj/item/projectile/energy/electrode))
if(istype(P, /obj/item/projectile/beam/stun))
var/datum/organ/external/select_area = get_organ(def_zone) // We're checking the outside, buddy!
var/list/body_parts = list(head, wear_mask, wear_suit, w_uniform, gloves, shoes) // What all are we checking?
// var/deflectchance=90 //Is it a CRITICAL HIT with that taser?
@@ -24,6 +24,7 @@
var/b_type = "A+" //Player's bloodtype
var/underwear = 1 //Which underwear the player wants
var/undershirt = 1 //Which undershirt the player wants.
var/backbag = 2 //Which backpack type the player has chosen. Nothing, Satchel or Backpack.
//Equipment slots
@@ -47,6 +48,10 @@
var/icon/stand_icon = null
var/icon/lying_icon = null
var/voice = "" //Instead of new say code calling GetVoice() over and over and over, we're just going to ask this variable, which gets updated in Life()
var/speech_problem_flag = 0
var/miming = null //Toggle for the mime's abilities.
var/special_voice = "" // For changing our voice. Used by a symptom.
+9 -1
View File
@@ -66,6 +66,8 @@
if(life_tick%30==15)
hud_updateflag = 1022
voice = GetVoice()
//No need to update all of these procs if the guy is dead.
if(stat != DEAD && !in_stasis)
if(air_master.current_cycle%4==2 || failed_last_breath) //First, resolve location and get a breath
@@ -143,7 +145,6 @@
return ONE_ATMOSPHERE - pressure_difference
/mob/living/carbon/human
proc/handle_disabilities()
if (disabilities & EPILEPSY)
if ((prob(1) && paralysis < 1))
@@ -161,6 +162,7 @@
emote("cough")
return
if (disabilities & TOURETTES)
speech_problem_flag = 1
if ((prob(10) && paralysis <= 1))
Stun(10)
spawn( 0 )
@@ -178,6 +180,7 @@
pixel_y = old_y
return
if (disabilities & NERVOUS)
speech_problem_flag = 1
if (prob(10))
stuttering = max(10, stuttering)
// No. -- cib
@@ -232,6 +235,7 @@
if(!gene.block)
continue
if(gene.is_active(src))
speech_problem_flag = 1
gene.OnMobLife(src)
if (radiation)
@@ -1052,6 +1056,7 @@
if(halloss > 0)
adjustHalLoss(-3)
else if(sleeping)
speech_problem_flag = 1
handle_dreams()
adjustHalLoss(-3)
if (mind)
@@ -1103,16 +1108,19 @@
//Other
if(stunned)
speech_problem_flag = 1
AdjustStunned(-1)
if(weakened)
weakened = max(weakened-1,0) //before you get mad Rockdtben: I done this so update_canmove isn't called multiple times
if(stuttering)
speech_problem_flag = 1
stuttering = max(stuttering-1, 0)
if (slurring)
slurring = max(slurring-1, 0)
if(silent)
speech_problem_flag = 1
silent = max(silent-1, 0)
if(druggy)
+168 -31
View File
@@ -1,39 +1,132 @@
/mob/living/carbon/human/say(var/message)
var/verb = "says"
var/alt_name = ""
var/message_range = world.view
var/italics = 0
if(wear_mask)
if(istype(wear_mask, /obj/item/clothing/mask/gas/voice/space_ninja) && wear_mask:voice == "Unknown")
if(copytext(message, 1, 2) != "*")
var/list/temp_message = text2list(message, " ")
var/list/pick_list = list()
for(var/i = 1, i <= temp_message.len, i++)
pick_list += i
for(var/i=1, i <= abs(temp_message.len/3), i++)
var/H = pick(pick_list)
if(findtext(temp_message[H], "*") || findtext(temp_message[H], ";") || findtext(temp_message[H], ":")) continue
temp_message[H] = ninjaspeak(temp_message[H])
pick_list -= H
message = list2text(temp_message, " ")
message = replacetext(message, "o", "¤")
message = replacetext(message, "p", "þ")
message = replacetext(message, "l", "£")
message = replacetext(message, "s", "§")
message = replacetext(message, "u", "µ")
message = replacetext(message, "b", "ß")
if(client)
if(client.prefs.muted & MUTE_IC)
src << "\red You cannot speak in IC (Muted)."
return
if(stat == 2)
return say_dead(message)
else if(istype(wear_mask, /obj/item/clothing/mask/horsehead))
var/obj/item/clothing/mask/horsehead/hoers = wear_mask
if(hoers.voicechange)
if(!(copytext(message, 1, 2) == "*" || (mind && mind.changeling && department_radio_keys[copytext(message, 1, 3)] != "changeling")))
message = pick("NEEIIGGGHHHH!", "NEEEIIIIGHH!", "NEIIIGGHH!", "HAAWWWWW!", "HAAAWWW!")
if(copytext(message,1,2) == "*")
return emote(copytext(message,2))
if ((HULK in mutations) && health >= 25 && length(message))
if(copytext(message, 1, 2) != "*")
message = "[uppertext(message)]!!" //because I don't know how to code properly in getting vars from other files -Bro
if(name != GetVoice())
alt_name = "(as [get_id_name("Unknown")])"
var/message_mode = null
var/datum/language/speaking = null
if(copytext(message,1,2) == ";")
message_mode = "headset"
message = copytext(message,2)
if (src.slurring)
if(copytext(message, 1, 2) != "*")
message = slur(message)
..(message)
if(length(message) >= 2)
var/channel_prefix = copytext(message, 1 ,3)
var/check_language_and_radio = copytext(message,3,5)
if(languages.len)
for(var/datum/language/L in languages)
if(lowertext(channel_prefix) == ":[L.key]" || lowertext(check_language_and_radio) == ":[L.key]")
verb = L.speech_verb
speaking = L
break
if(!message_mode)
message_mode = department_radio_keys[channel_prefix]
if(speaking || copytext(message,1,2) == ":")
var/positioncut = 3
if(speaking && (message_mode && copytext(message,3,4)==":"))
positioncut += 2
message = trim(copytext(message,positioncut))
message = capitalize(trim_left(message))
if(speech_problem_flag)
var/list/handle_r = handle_speech_problems(message)
message = handle_r[1]
verb = handle_r[2]
speech_problem_flag = handle_r[3]
if(!message || stat)
return
var/ending = copytext(message, length(message))
if(ending=="!")
verb=pick("exclaims","shouts","yells")
if(ending=="?")
verb="asks"
var/list/obj/item/used_radios = new
switch (message_mode)
if("headset")
if(l_ear && istype(l_ear,/obj/item/device/radio))
var/obj/item/device/radio/R = l_ear
R.talk_into(src,message,null,verb,speaking)
used_radios += l_ear
else if(r_ear && istype(r_ear,/obj/item/device/radio))
var/obj/item/device/radio/R = r_ear
R.talk_into(src,message,null,verb,speaking)
used_radios += r_ear
if("right_ear")
if(r_ear && istype(r_ear,/obj/item/device/radio))
var/obj/item/device/radio/R = r_ear
R.talk_into(src,message,verb,speaking)
used_radios += r_ear
if("left_ear")
if(l_ear && istype(l_ear,/obj/item/device/radio))
var/obj/item/device/radio/R = l_ear
R.talk_into(src,message,verb,speaking)
used_radios += l_ear
if("intercom")
for(var/obj/item/device/radio/intercom/I in view(1, null))
I.talk_into(src, message, verb, speaking)
used_radios += I
if("whisper")
whisper(message)
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(message_mode)
if(message_mode in radiochannels)
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(used_radios.len)
italics = 1
message_range = 3
var/datum/gas_mixture/environment = loc.return_air()
if(environment)
var/pressure = environment.return_pressure()
if(pressure < SAY_MINIMUM_PRESSURE)
italics = 1
message_range =1
..(message, speaking, verb, alt_name, italics, message_range, used_radios)
/mob/living/carbon/human/say_understands(var/other,var/datum/language/speaking = null)
@@ -71,3 +164,47 @@
/mob/living/carbon/human/proc/GetSpecialVoice()
return special_voice
/mob/living/carbon/human/proc/handle_speech_problems(var/message)
var/list/returns[3]
var/verb = "says"
var/handled = 0
if(silent)
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((HULK in mutations) && health >= 25 && length(message))
message = "[uppertext(message)]!!!"
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))
message = stutter(message)
verb = pick("stammers", "stutters")
if(prob(braindam))
message = uppertext(message)
verb = pick("yells like an idiot","says rather loudly")
returns[1] = message
returns[2] = verb
returns[3] = handled
return returns
@@ -310,6 +310,9 @@ proc/get_damage_icon_part(damage_state, body_part)
if(!fat && !skeleton)
stand_icon.Blend(new /icon('icons/mob/human.dmi', "underwear[underwear]_[g]_s"), ICON_OVERLAY)
if(undershirt>0 && undershirt < 5 && species.flags & HAS_UNDERWEAR)
stand_icon.Blend(new /icon('icons/mob/human.dmi', "undershirt[undershirt]_s"), ICON_OVERLAY)
if(update_icons)
update_icons()
@@ -513,7 +513,4 @@
/mob/living/carbon/monkey/IsAdvancedToolUser()//Unless its monkey mode monkeys cant use advanced tools
if(!ticker) return 0
if(!ticker.mode.name == "monkey") return 0
return 1
return 0
+33 -349
View File
@@ -81,366 +81,52 @@ var/list/department_radio_keys = list(
if(!istype(dongle)) return
if(dongle.translate_binary) return 1
/mob/living/say(var/message)
/*
Formatting and sanitizing.
*/
message = trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN))
/*
Sanity checking and speech failure.
*/
if (!message)
return
if(silent)
return
if (stat == 2) // Dead.
return say_dead(message)
else if (stat) // Unconcious.
return
if (src.client)
if(client.prefs.muted & MUTE_IC)
src << "\red You cannot speak in IC (muted)."
return
if (src.client.handle_spam_prevention(message, MUTE_IC))
return
// Mute disability
if (sdisabilities & MUTE)
return
// Muzzled.
if (istype(wear_mask, /obj/item/clothing/mask/muzzle))
return
// Emotes.
if (copytext(message, 1, 2) == "*" && !stat)
return emote(copytext(message, 2))
/*
Identity hiding.
*/
var/alt_name = ""
if (istype(src, /mob/living/carbon/human) && name != GetVoice())
var/mob/living/carbon/human/H = src
alt_name = " (as [H.get_id_name("Unknown")])"
/*
Now we get into the real meat of the say processing. Determining the message mode.
*/
var/italics = 0
var/message_range = null
var/message_mode = null
var/datum/language/speaking = null //For use if a specific language is being spoken.
var/braindam = getBrainLoss()
if (braindam >= 60)
if(prob(braindam/4))
message = stutter(message)
if(prob(braindam))
message = uppertext(message)
// General public key. Special message handling
else if (copytext(message, 1, 2) == ";" || prob(braindam/2))
if (ishuman(src))
message_mode = "headset"
else if(ispAI(src) || isrobot(src))
message_mode = "pAI"
message = copytext(message, 2)
// Begin checking for either a message mode or a language to speak.
else if (length(message) >= 2)
var/channel_prefix = copytext(message, 1, 3)
//Check if the person is speaking a language that they know.
if(languages.len)
for(var/datum/language/L in languages)
if(lowertext(channel_prefix) == ":[L.key]")
speaking = L
break
message_mode = department_radio_keys[channel_prefix]
if (message_mode || speaking || copytext(message,1,2) == ":")
message = trim(copytext(message, 3))
if (!(istype(src,/mob/living/carbon/human) || istype(src,/mob/living/carbon/monkey) || istype(src, /mob/living/simple_animal/parrot) || isrobot(src) && (message_mode=="department" || (message_mode in radiochannels))))
message_mode = null //only humans can use headsets
if(src.stunned > 2 || (traumatic_shock > 61 && prob(50)))
message_mode = null //Stunned people shouldn't be able to physically turn on their radio/hold down the button to speak into it
message = capitalize(trim_left(message))
if (!message)
return
if (stuttering)
message = stutter(message)
var/list/obj/item/used_radios = new
var/is_speaking_radio = 0
switch (message_mode)
if ("headset")
if (src:l_ear && istype(src:l_ear,/obj/item/device/radio))
src:l_ear.talk_into(src, message)
used_radios += src:l_ear
is_speaking_radio = 1
else if (src:r_ear)
src:r_ear.talk_into(src, message)
used_radios += src:r_ear
is_speaking_radio = 1
message_range = 1
italics = 1
if ("right ear")
if (src:r_ear)
src:r_ear.talk_into(src, message)
used_radios += src:r_ear
is_speaking_radio = 1
message_range = 1
italics = 1
if ("left ear")
if (src:l_ear)
src:l_ear.talk_into(src, message)
used_radios += src:l_ear
is_speaking_radio = 1
message_range = 1
italics = 1
if ("intercom")
for (var/obj/item/device/radio/intercom/I in view(1, null))
I.talk_into(src, message)
used_radios += I
is_speaking_radio = 1
message_range = 1
italics = 1
//I see no reason to restrict such way of whispering
if ("whisper")
whisper(message)
return
if ("binary")
if(robot_talk_understand || binarycheck())
//message = trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN)) //seems redundant
robot_talk(message)
return
if ("alientalk")
if(alien_talk_understand || hivecheck())
//message = trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN)) //seems redundant
alien_talk(message)
return
if ("department")
if(istype(src, /mob/living/carbon))
if (src:l_ear && istype(src:l_ear,/obj/item/device/radio))
src:l_ear.talk_into(src, message, message_mode)
used_radios += src:l_ear
is_speaking_radio = 1
if (src:r_ear)
src:r_ear.talk_into(src, message, message_mode)
used_radios += src:r_ear
is_speaking_radio = 1
else if(istype(src, /mob/living/silicon/robot))
if (src:radio)
src:radio.talk_into(src, message, message_mode)
used_radios += src:radio
message_range = 1
italics = 1
if ("pAI")
if (src:radio)
src:radio.talk_into(src, message)
used_radios += src:radio
message_range = 1
italics = 1
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
////SPECIAL HEADSETS START
else
//world << "SPECIAL HEADSETS"
if (message_mode in radiochannels)
if(isrobot(src))//Seperates robots to prevent runtimes from the ear stuff
var/mob/living/silicon/robot/R = src
if(R.radio)//Sanityyyy
R.radio.talk_into(src, message, message_mode)
used_radios += R.radio
else
if (src:l_ear && istype(src:l_ear,/obj/item/device/radio))
src:l_ear.talk_into(src, message, message_mode)
used_radios += src:l_ear
else if (src:r_ear)
src:r_ear.talk_into(src, message, message_mode)
used_radios += src:r_ear
message_range = 1
italics = 1
/////SPECIAL HEADSETS END
var/datum/gas_mixture/environment = loc.return_air()
if(environment)
var/pressure = environment.return_pressure()
if (pressure < SAY_MINIMUM_PRESSURE) //in space no one can hear you scream
italics = 1
message_range = 1
var/list/listening
listening = get_mobs_in_view(message_range, src)
var/list/onscreen = viewers()
for(var/mob/M in player_list)
if (!M.client)
continue //skip monkeys and leavers
if (istype(M, /mob/new_player))
continue
if(M.stat == DEAD && (M.client.prefs.toggles & CHAT_GHOSTEARS) && src.client) // src.client is so that ghosts don't have to listen to mice
listening|=M
/mob/living/say(var/message, var/datum/language/speaking = null, var/verb="says", var/alt_name="", var/italics=0, var/message_range = world.view, var/list/used_radios = list())
var/turf/T = get_turf(src)
var/list/W = hear(message_range, T)
for (var/obj/O in ((W | contents)-used_radios))
W |= O
var/list/listening = list()
if(T)
for (var/mob/M in W)
W |= M.contents
var/list/hear = hear(message_range, T)
var/list/hearturfs = list()
for (var/atom/A in W)
if(istype(A, /mob/living/simple_animal/parrot)) //Parrot speech mimickry
if(A == src)
continue //Dont imitate ourselves
var/mob/living/simple_animal/parrot/P = A
if(P.speech_buffer.len >= 10)
P.speech_buffer.Remove(pick(P.speech_buffer))
P.speech_buffer.Add(message)
if(istype(A, /obj/)) //radio in pocket could work, radio in backpack wouldn't --rastaf0
var/obj/O = A
spawn (0)
if(O && !istype(O.loc, /obj/item/weapon/storage))
O.hear_talk(src, message)
/* Commented out as replaced by code above from BS12
for (var/obj/O in ((V | contents)-used_radios)) //radio in pocket could work, radio in backpack wouldn't --rastaf0
spawn (0)
if (O)
O.hear_talk(src, message)
*/
/* if(isbrain(src))//For brains to properly talk if they are in an MMI..or in a brain. Could be extended to other mobs I guess.
for(var/obj/O in loc)//Kinda ugly but whatever.
if(O)
spawn(0)
O.hear_talk(src, message)
*/
var/list/heard_a = list() // understood us
var/list/heard_b = list() // didn't understand us
for (var/M in listening)
if(hascall(M,"say_understands"))
if (M:say_understands(src,speaking))
heard_a += M
else
heard_b += M
else
heard_a += M
for(var/I in hear)
if(istype(I, /mob/))
var/mob/M = I
listening += M
hearturfs += M.locs[1]
for(var/obj/item/device/radio/R in contents)
spawn(0)
R.hear_talk(src, message, verb, speaking)
else if(istype(I, /obj/))
var/obj/O = I
hearturfs += O.locs[1]
if(istype(O, /obj/item/device/radio))
spawn(0)
O.hear_talk(src, message, verb, speaking)
for(var/mob/M in player_list)
if(M.stat == DEAD && client && (M.client.prefs.toggles & CHAT_GHOSTEARS))
listening |= M
continue
if(M.locs[1] in hearturfs)
listening |= M
var/speech_bubble_test = say_test(message)
var/image/speech_bubble = image('icons/mob/talk.dmi',src,"h[speech_bubble_test]")
spawn(30) del(speech_bubble)
for(var/mob/M in hearers(5, src))
if(M != src && is_speaking_radio)
M:show_message("<span class='notice'>[src] talks into [used_radios.len ? used_radios[1] : "radio"]</span>")
var/rendered = null
if (length(heard_a))
var/message_a = say_quote(message,speaking)
if (italics)
message_a = "<i>[message_a]</i>"
var/message_ghost = "<b>[message_a]</b>" // bold so ghosts know the person is in view.
rendered = "<span class='game say'><span class='name'>[GetVoice()]</span>[alt_name] <span class='message'>[message_a]</span></span>"
var/rendered_ghost = "<span class='game say'><span class='name'>[GetVoice()]</span>[alt_name] <span class='message'>[message_ghost]</span></span>"
for (var/mob/M in heard_a)
if(M.client)
if(hascall(M,"show_message"))
var/deaf_message = ""
var/deaf_type = 1
if(M != src)
deaf_message = "<span class='name'>[name]</span>[alt_name] talks but you cannot hear them."
else
deaf_message = "<span class='notice'>You cannot hear yourself!</span>"
deaf_type = 2 // Since you should be able to hear yourself without looking
if (M.stat == DEAD && (M.client.prefs.toggles & CHAT_GHOSTEARS) && M in onscreen)
M:show_message(rendered_ghost, 2, deaf_message, deaf_type)
else
M:show_message(rendered, 2, deaf_message, deaf_type)
M << speech_bubble
if (length(heard_b))
var/message_b
message_b = stars(message)
message_b = say_quote(message_b,speaking)
if (italics)
message_b = "<i>[message_b]</i>"
rendered = "<span class='game say'><span class='name'>[name]</span>[alt_name] <span class='message'>[message_b]</span></span>" //Voice_name isn't too useful. You'd be able to tell who was talking presumably.
if(used_radios.len)
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] : "radio"]</span>")
for (var/M in heard_b)
if(hascall(M,"show_message"))
M:show_message(rendered, 2)
M << speech_bubble
for(var/mob/M in listening)
if(M.client)
M << speech_bubble
M.hear_say(message,verb,speaking,alt_name, italics, src)
/*
if(M.client)
if(!M.client.bubbles || M == src)
var/image/I = image('icons/effects/speechbubble.dmi', B, "override")
I.override = 1
M << I
*/ /*
flick("[presay]say", B)
if(istype(loc, /turf))
B.loc = loc
else
B.loc = loc.loc
spawn()
sleep(11)
del(B)
*/
//talking items
for(var/obj/item/weapon/O in view(3,src))
if(O.listening_to_players)
O.catchMessage(message, src)
log_say("[name]/[key] : [message]")
@@ -449,5 +135,3 @@ var/list/department_radio_keys = list(
/mob/living/proc/GetVoice()
return name
+4
View File
@@ -405,9 +405,13 @@ var/list/ai_list = list()
if (href_list["track"])
var/mob/target = locate(href_list["track"]) in mob_list
/*
var/mob/living/silicon/ai/A = locate(href_list["track2"]) in mob_list
if(A && target)
A.ai_actual_track(target)
*/
if(target)
ai_actual_track(target)
return
else if (href_list["faketrack"])
@@ -164,7 +164,7 @@
flags = FPRINT | TABLEPASS | CONDUCT
slot_flags = SLOT_BELT
throwforce = 3
w_class = 1.0
w_class = 2.0
throw_speed = 5
throw_range = 10
m_amt = 200
+95 -28
View File
@@ -2,11 +2,15 @@
var/ending = copytext(text, length(text))
if (ending == "?")
return "queries, \"[text]\"";
return "queries"
else if (ending == "!")
return "declares, \"[text]\"";
return "declares"
return "states, \"[text]\"";
return "states"
#define IS_AI 1
#define IS_ROBOT 2
#define IS_PAI 3
/mob/living/silicon/say(var/message)
if (!message)
@@ -23,39 +27,98 @@
message = trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN))
return say_dead(message)
var/bot_type = 0 //Let's not do a fuck ton of type checks, thanks.
if(istype(src, /mob/living/silicon/ai))
bot_type = IS_AI
else if(istype(src, /mob/living/silicon/robot))
bot_type = IS_ROBOT
else if(istype(src, /mob/living/silicon/pai))
bot_type = IS_PAI
var/mob/living/silicon/ai/AI = src //and let's not declare vars over and over and over for these guys.
var/mob/living/silicon/robot/R = src
var/mob/living/silicon/pai/P = src
//Must be concious to speak
if (stat)
return
if (length(message) >= 2)
var/prefix = copytext(message, 1, 3)
if (department_radio_keys[prefix] == "binary")
if(istype(src, /mob/living/silicon/pai))
return ..(message)
message = copytext(message, 3)
message = trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN))
var/verb = say_quote(message)
var/message_mode = null
// TODO: move the component system up to silicon so we don't have to use this ugly hack..
if(istype(src, /mob/living/silicon/robot))
var/mob/living/silicon/robot/R = src
if(!R.is_component_functioning("comms"))
src << "\red Your binary communications component isn't functional."
if(copytext(message,1,2) == ";")
message_mode = "general" // I don't know why but regular radio = fuck you we ain't broadcasting, pAI mode was what was in old say code.
message = trim(copytext(message,2))
else if(length(message) >= 2)
var/channel_prefix = copytext(message, 1 ,3)
if(!message_mode)
message_mode = department_radio_keys[channel_prefix]
if(message_mode && bot_type == IS_ROBOT)
if(message_mode != "binary" && !R.is_component_functioning("radio"))
src << "\red Your radio isn't functional at this time."
return
if(message_mode && message_mode != "general")
message = trim(copytext(message,3))
switch(message_mode)
if("department")
switch(bot_type)
if(IS_AI)
AI.holopad_talk(message)
if(IS_ROBOT)
log_say("[key_name(src)] : [message]")
R.radio.talk_into(src,message,message_mode,verb)
if(IS_PAI)
log_say("[key_name(src)] : [message]")
P.radio.talk_into(src,message,message_mode,verb)
return
if("binary")
switch(bot_type)
if(IS_ROBOT)
if(!R.is_component_functioning("comms"))
src << "\red Your binary communications component isn't functional."
return
if(IS_PAI)
src << "You do not appear to have that function"
return
robot_talk(message)
else if (department_radio_keys[prefix] == "department")
if(isAI(src)&&client)//For patching directly into AI holopads.
var/mob/living/silicon/ai/U = src
message = copytext(message, 3)
message = trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN))
U.holopad_talk(message)
else//Will not allow anyone by an active AI to use this function.
src << "This function is not available to you."
return
return
if("general")
switch(bot_type)
if(IS_AI)
src << "Yeah, not yet, sorry"
if(IS_ROBOT)
log_say("[key_name(src)] : [message]")
R.radio.talk_into(src,message,null,verb)
if(IS_PAI)
log_say("[key_name(src)] : [message]")
P.radio.talk_into(src,message,null,verb)
return
else
return ..(message)
else
return ..(message)
if(message_mode && message_mode in radiochannels)
switch(bot_type)
if(IS_AI)
src << "You don't have this function yet, I'm working on it"
return
if(IS_ROBOT)
log_say("[key_name(src)] : [message]")
R.radio.talk_into(src,message,message_mode,verb)
if(IS_PAI)
log_say("[key_name(src)] : [message]")
P.radio.talk_into(src,message,message_mode,verb)
return
return ..(message,null,verb)
//For holopads only. Usable by AI.
/mob/living/silicon/ai/proc/holopad_talk(var/message)
@@ -146,4 +209,8 @@
for (var/mob/M in dead_mob_list)
if(!istype(M,/mob/new_player) && !istype(M,/mob/living/carbon/brain)) //No meta-evesdropping
M.show_message(rendered, 2)
M.show_message(rendered, 2)
#undef IS_AI
#undef IS_ROBOT
#undef IS_PAI
@@ -31,7 +31,7 @@
if(stat == CONSCIOUS)
//if we're strong enough, sting some people
var/mob/living/carbon/human/M = target_mob
var/sting_prob = 100 // Bees will always try to sting.
var/sting_prob = 40 // Bees will always try to sting.
if(M in view(src,1)) // Can I see my target?
if(prob(max(feral * 10, 0))) // Am I mad enough to want to sting? And yes, when I initially appear, I AM mad enough
var/obj/item/clothing/worn_suit = M.wear_suit
@@ -42,17 +42,17 @@
sting_prob -= min(worn_helmet.armor["bio"],30) // Is your helmet sealed? I can't get to 30% of your body.
if( prob(sting_prob) && (M.stat == CONSCIOUS || (M.stat == UNCONSCIOUS && prob(25))) ) // Try to sting! If you're not moving, think about stinging.
M.apply_damage(min(strength,2)+mut, BRUTE) // Stinging. The more mutated I am, the harder I sting.
M.apply_damage((round(feral/5,1)*(max((round(strength/10,1)),1)))+toxic, TOX) // Bee venom based on how angry I am and how many there are of me!
M.apply_damage((round(feral/10,1)*(max((round(strength/20,1)),1)))+toxic, TOX) // Bee venom based on how angry I am and how many there are of me!
M << "\red You have been stung!"
M.flash_pain()
//if we're chasing someone, get a little bit angry
if(target_mob && prob(10))
if(target_mob && prob(5))
feral++
//calm down a little bit
if(feral > 0)
if(prob(feral * 10))
if(prob(feral * 20))
feral -= 1
else
//if feral is less than 0, we're becalmed by smoke or steam
@@ -13,6 +13,7 @@ datum/preferences
randomize_hair_color("facial")
randomize_eyes_color()
underwear = rand(1,underwear_m.len)
undershirt = rand(1,undershirt_t.len)
backbag = 2
age = rand(AGE_MIN,AGE_MAX)
if(H)
@@ -188,6 +189,10 @@ datum/preferences
if(underwear > 0 && underwear < 7 && current_species.flags & HAS_UNDERWEAR)
underwear_s = new/icon("icon" = 'icons/mob/human.dmi', "icon_state" = "underwear[underwear]_[g]_s")
var/icon/undershirt_s = null
if(undershirt > 0 && undershirt < 5 && current_species.flags & HAS_UNDERWEAR)
undershirt_s = new/icon("icon" = 'icons/mob/human.dmi', "icon_state" = "undershirt[undershirt]_s")
var/icon/clothes_s = null
if(job_civilian_low & ASSISTANT)//This gives the preview icon clothes depending on which job(if any) is set to 'high'
clothes_s = new /icon('icons/mob/uniform.dmi', "grey_s")
@@ -610,6 +615,8 @@ datum/preferences
preview_icon.Blend(eyes_s, ICON_OVERLAY)
if(underwear_s)
preview_icon.Blend(underwear_s, ICON_OVERLAY)
if(undershirt_s)
preview_icon.Blend(undershirt_s, ICON_OVERLAY)
if(clothes_s)
preview_icon.Blend(clothes_s, ICON_OVERLAY)
preview_icon_front = new(preview_icon, dir = SOUTH)
@@ -617,4 +624,5 @@ datum/preferences
del(eyes_s)
del(underwear_s)
del(undershirt_s)
del(clothes_s)
+50
View File
@@ -0,0 +1,50 @@
/obj/item/weapon/paper/carbon
name = "paper"
icon_state = "paper_stack"
item_state = "paper"
var copied = 0
var iscopy = 0
/obj/item/weapon/paper/carbon/update_icon()
if(iscopy)
if(info)
icon_state = "cpaper_words"
return
icon_state = "cpaper"
else if (copied)
if(info)
icon_state = "paper_words"
return
icon_state = "paper"
else
if(info)
icon_state = "paper_stack_words"
return
icon_state = "paper_stack"
/obj/item/weapon/paper/carbon/verb/removecopy()
set name = "Remove carbon-copy"
set category = "Object"
set src in usr
if (copied == 0)
var/obj/item/weapon/paper/carbon/c = src
var/copycontents = html_decode(c.info)
var/obj/item/weapon/paper/carbon/copy = new /obj/item/weapon/paper/carbon (usr.loc)
copycontents = replacetext(copycontents, "<font face=\"[c.deffont]\" color=", "<font face=\"[c.deffont]\" nocolor=") //state of the art techniques in action
copycontents = replacetext(copycontents, "<font face=\"[c.crayonfont]\" color=", "<font face=\"[c.crayonfont]\" nocolor=") //This basically just breaks the existing color tag, which we need to do because the innermost tag takes priority.
copy.info += copycontents
copy.info += "</font>"
copy.name = "Copy - " + c.name
copy.fields = c.fields
copy.updateinfolinks()
usr << "<span class='notice'>You tear off the carbon-copy!</span>"
c.copied = 1
copy.iscopy = 1
copy.update_icon()
c.update_icon()
else
usr << "There are no more carbon copies attached to this paper!"
File diff suppressed because one or more lines are too long
+33
View File
@@ -26,6 +26,13 @@
/obj/item/weapon/paper_bin/attack_hand(mob/user as mob)
if (hasorgans(user))
var/datum/organ/external/temp = user:organs_by_name["r_hand"]
if (user.hand)
temp = user:organs_by_name["l_hand"]
if(temp && !temp.is_usable())
user << "<span class='notice'>You try to move your [temp.display_name], but cannot!"
return
if(amount >= 1)
amount--
if(amount==0)
@@ -79,3 +86,29 @@
icon_state = "paper_bin0"
else
icon_state = "paper_bin1"
/obj/item/weapon/paper_bin/carbon
name = "carbonless paper bin"
icon_state = "paper_bin2"
/obj/item/weapon/paper_bin/carbon/attack_hand(mob/user as mob)
if(amount >= 1)
amount--
if(amount==0)
update_icon()
var/obj/item/weapon/paper/carbon/P
if(papers.len > 0) //If there's any custom paper on the stack, use that instead of creating a new paper.
P = papers[papers.len]
papers.Remove(P)
else
P = new /obj/item/weapon/paper/carbon
P.loc = user.loc
user.put_in_hands(P)
user << "<span class='notice'>You take [P] out of the [src].</span>"
else
user << "<span class='notice'>[src] is empty!</span>"
add_fingerprint(user)
return
+1 -1
View File
@@ -66,7 +66,7 @@
else if(photocopy)
for(var/i = 0, i < copies, i++)
if(toner > 0)
var/obj/item/weapon/photo/p = new /obj/item/weapon/photo (loc)
var/obj/item/weapon/photo/p = new /obj/item/weapon/photo (src.loc)
var/icon/I = icon(photocopy.icon, photocopy.icon_state)
var/icon/img = icon(photocopy.img)
if(toner > 10) //plenty of toner, go straight greyscale
+2 -2
View File
@@ -26,7 +26,7 @@
icon = 'icons/obj/items.dmi'
icon_state = "photo"
item_state = "paper"
w_class = 1.0
w_class = 2.0
var/icon/img //Big photo image
var/scribble //Scribble on the back.
@@ -84,7 +84,7 @@
/obj/item/weapon/storage/photo_album/MouseDrop(obj/over_object as obj)
if((istype(usr, /mob/living/carbon/human) || (ticker && ticker.mode.name == "monkey")))
if((istype(usr, /mob/living/carbon/human)))
var/mob/M = usr
if(!( istype(over_object, /obj/screen) ))
return ..()
+18 -18
View File
@@ -144,7 +144,7 @@
init()
else
area = src.loc.loc:master
area.apc |= src
area.apc |= src
opened = 1
operating = 0
name = "[area.name] APC"
@@ -171,7 +171,7 @@
cell.charge = start_charge * cell.maxcharge / 100.0 // (convert percentage to actual value)
var/area/A = src.loc.loc
//if area isn't specified use current
if(isarea(A) && src.areastring == null)
@@ -913,7 +913,7 @@
return 0
if ( ! (istype(user, /mob/living/carbon/human) || \
istype(user, /mob/living/silicon) || \
istype(user, /mob/living/carbon/monkey) /*&& ticker && ticker.mode.name == "monkey"*/) )
istype(user, /mob/living/carbon/monkey)) )
user << "\red You don't have the dexterity to use this [src]!"
nanomanager.close_user_uis(user, src)
@@ -1164,6 +1164,7 @@
lastused_equip = area.usage(EQUIP)
lastused_environ = area.usage(ENVIRON)
if(area.powerupdate)
if(debug) log_debug("power update in [area.name] / [name]")
area.clear_usage()
lastused_total = lastused_light + lastused_equip + lastused_environ
@@ -1187,16 +1188,16 @@
if(terminal && terminal.powernet)
perapc = terminal.powernet.perapc
//if(debug)
//world << "Status: [main_status] - Excess: [excess] - Last Equip: [lastused_equip] - Last Light: [lastused_light]"
if(debug)
log_debug( "Status: [main_status] - Excess: [excess] - Last Equip: [lastused_equip] - Last Light: [lastused_light]")
if(cell && !shorted)
var/cell_charge = cell.charge
//var/cell_charge = cell.charge
var/cell_maxcharge = cell.maxcharge
// draw power from cell as before
var/cellused = min(cell_charge, CELLRATE * lastused_total) // clamp deduction to a max, amount left in cell
var/cellused = min(cell.charge, CELLRATE * lastused_total) // clamp deduction to a max, amount left in cell
cell.use(cellused)
if(excess > 0 || perapc > lastused_total) // if power excess, or enough anyway, recharge the cell
@@ -1207,10 +1208,9 @@
else // no excess, and not enough per-apc
if( (cell_charge/CELLRATE+perapc) >= lastused_total) // can we draw enough from cell+grid to cover last usage?
if( (cell.charge/CELLRATE+perapc) >= lastused_total) // can we draw enough from cell+grid to cover last usage?
cell_charge = min(cell_maxcharge, cell_charge + CELLRATE * perapc) //recharge with what we can
cell.charge = cell_charge
cell.give(CELLRATE * perapc) //recharge with what we can
add_load(perapc) // so draw what we can from the grid
charging = 0
@@ -1233,30 +1233,30 @@
longtermpower -= 2
if(cell_charge >= 1250 || longtermpower > 0) // Put most likely at the top so we don't check it last, effeciency 101
if(cell.charge >= 1250 || longtermpower > 0) // Put most likely at the top so we don't check it last, effeciency 101
if(autoflag != 3)
equipment = autoset(equipment, 1)
lighting = autoset(lighting, 1)
environ = autoset(environ, 1)
autoflag = 3
area.poweralert(1, src)
if(cell_charge >= 4000)
area.poweralert(1, src)
else if(cell_charge < 1250 && cell_charge > 750 && longtermpower < 0) // <30%, turn off equipment
if(cell.charge >= 4000)
area.poweralert(1, src)
else if(cell.charge < 1250 && cell.charge > 750 && longtermpower < 0) // <30%, turn off equipment
if(autoflag != 2)
equipment = autoset(equipment, 2)
lighting = autoset(lighting, 1)
environ = autoset(environ, 1)
area.poweralert(0, src)
autoflag = 2
else if(cell_charge < 750 && cell_charge > 10 && longtermpower < 0) // <15%, turn off lighting & equipment
else if(cell.charge < 750 && cell.charge > 10 && longtermpower < 0) // <15%, turn off lighting & equipment
if(autoflag != 1)
equipment = autoset(equipment, 2)
lighting = autoset(lighting, 2)
environ = autoset(environ, 1)
area.poweralert(0, src)
autoflag = 1
else if(cell_charge <= 0) // zero charge, turn all off
else if(cell.charge <= 0) // zero charge, turn all off
if(autoflag != 0)
equipment = autoset(equipment, 0)
lighting = autoset(lighting, 0)
@@ -1269,7 +1269,7 @@
if(chargemode && charging == 1 && operating)
if(excess > 0) // check to make sure we have enough to charge
// Max charge is perapc share, capped to cell capacity, or % per second constant (Whichever is smallest)
var/ch = min(perapc*CELLRATE, (cell_maxcharge - cell_charge), (cell_maxcharge*CHARGELEVEL))
var/ch = min(perapc*CELLRATE, (cell_maxcharge - cell.charge), (cell_maxcharge*CHARGELEVEL))
add_load(ch/CELLRATE) // Removes the power we're taking from the grid
cell.give(ch) // actually recharge the cell
@@ -1307,7 +1307,7 @@
environ = autoset(environ, 0)
area.poweralert(0, src)
autoflag = 0
// update icon & area power if anything changed
+13
View File
@@ -233,6 +233,7 @@
pixel_x = rand(-2,2)
pixel_y = rand(-2,2)
updateicon()
update_wclass()
/obj/item/weapon/cable_coil/proc/updateicon()
if (!item_color)
@@ -248,6 +249,12 @@
icon_state = "coil"
name = "cable coil"
/obj/item/weapon/cable_coil/proc/update_wclass()
if(amount == 1)
w_class = 1.0
else
w_class = 2.0
/obj/item/weapon/cable_coil/examine()
set src in view(1)
@@ -283,6 +290,7 @@
new/obj/item/weapon/cable_coil(user.loc, 1,item_color)
user << "<span class='notice'>You cut a piece off the cable coil.</span>"
src.updateicon()
src.update_wclass()
return
else if( istype(W, /obj/item/weapon/cable_coil) )
@@ -295,6 +303,7 @@
C.amount += src.amount
user << "<span class='notice'>You join the cable coils together.</span>"
C.updateicon()
C.update_wclass()
del(src)
return
@@ -302,8 +311,10 @@
user << "<span class='notice'>You transfer [MAXCOIL - src.amount ] length\s of cable from one coil to the other.</span>"
src.amount -= (MAXCOIL-C.amount)
src.updateicon()
src.update_wclass()
C.amount = MAXCOIL
C.updateicon()
C.update_wclass()
return
/obj/item/weapon/cable_coil/proc/use(var/used)
@@ -314,6 +325,7 @@
else
amount -= used
updateicon()
update_wclass()
return 1
// called when cable_coil is clicked on a turf/simulated/floor
@@ -597,6 +609,7 @@ obj/structure/cable/proc/cableColor(var/colorC)
pixel_x = rand(-2,2)
pixel_y = rand(-2,2)
updateicon()
update_wclass()
/obj/item/weapon/cable_coil/yellow
item_color = COLOR_YELLOW
+1 -1
View File
@@ -642,7 +642,7 @@
flags = FPRINT | TABLEPASS
force = 2
throwforce = 5
w_class = 1
w_class = 2
var/status = 0 // LIGHT_OK, LIGHT_BURNED or LIGHT_BROKEN
var/base_state
var/switchcount = 0 // number of times switched
@@ -460,6 +460,7 @@ var/global/list/uneatable = list(
move_self = 1 //Do we move on our own?
grav_pull = 10 //How many tiles out do we pull?
consume_range = 3 //How many tiles out do we eat
var/last_boom = 0
/obj/machinery/singularity/narsie/large
name = "Nar-Sie"
@@ -490,9 +491,11 @@ var/global/list/uneatable = list(
return 0
if (istype(A,/mob/living))//Mobs get gibbed
A:gib()
else if(istype(A,/obj/))
A:ex_act(1.0)
if(A) del(A)
else if(istype(A,/obj))
var/obj/O = A
machines -= O
processing_objects -= O
O.loc = null
else if(isturf(A))
var/turf/T = A
if(T.intact)
@@ -502,6 +505,9 @@ var/global/list/uneatable = list(
if(O.invisibility == 101)
src.consume(O)
A:ChangeTurf(/turf/space)
if(last_boom + 100 < world.time && prob(5))
explosion(loc, -1, -1, -1, 1, 0) //Since we're not exploding everything in consume() toss out an explosion effect every now and again
last_boom = world.time
return
/obj/machinery/singularity/narsie/ex_act() //No throwing bombs at it either. --NEO
+4
View File
@@ -218,6 +218,10 @@
if (!istype(src.loc, /turf) && !istype(usr, /mob/living/silicon/))
return 0 // Do not update ui
for(var/area/A in active_areas)
A.master.powerupdate = 3
if( href_list["cmode"] )
chargemode = !chargemode
if(!chargemode)
+1 -1
View File
@@ -53,7 +53,7 @@
item_state = "syringe_kit"
m_amt = 50000
throwforce = 2
w_class = 1.0
w_class = 2.0
throw_speed = 4
throw_range = 10
var/list/stored_ammo = list()
@@ -135,4 +135,18 @@
icon_state = "a762"
ammo_type = "/obj/item/ammo_casing/a762"
max_ammo = 0
multiple_sprites = 1
/obj/item/ammo_magazine/chameleon
name = "magazine (.45)"
icon_state = "45"
ammo_type = "/obj/item/ammo_casing/chameleon"
max_ammo = 7
multiple_sprites = 1
/obj/item/ammo_magazine/chameleon/empty
name = "magazine (.45)"
icon_state = "45"
ammo_type = "/obj/item/ammo_casing/chameleon"
max_ammo = 0
multiple_sprites = 1
@@ -105,3 +105,9 @@
icon_state = "rocketshell"
projectile_type = "/obj/item/missile"
caliber = "rocket"
/obj/item/ammo_casing/chameleon
name = "chameleon bullets"
desc = "A set of bullets for the Chameleon Gun."
projectile_type = "/obj/item/projectile/bullet/chameleon"
caliber = ".45"
@@ -6,7 +6,7 @@
fire_sound = 'sound/weapons/Taser.ogg'
charge_cost = 100 //How much energy is needed to fire.
projectile_type = "/obj/item/projectile/energy/electrode"
projectile_type = "/obj/item/projectile/beam/stun"
origin_tech = "combat=3;magnets=2"
modifystate = "energystun"
@@ -27,7 +27,7 @@
charge_cost = 100
fire_sound = 'sound/weapons/Taser.ogg'
user << "\red [src.name] is now set to stun."
projectile_type = "/obj/item/projectile/energy/electrode"
projectile_type = "/obj/item/projectile/beam/stun"
modifystate = "energystun"
update_icon()
@@ -18,7 +18,7 @@
charge_cost = 100
fire_sound = 'sound/weapons/Taser.ogg'
user << "\red [src.name] is now set to stun."
projectile_type = "/obj/item/projectile/energy/electrode"
projectile_type = "/obj/item/projectile/beam/stun"
if(0)
mode = 1
charge_cost = 100
+7 -7
View File
@@ -6,7 +6,7 @@
item_state = null //so the human update icon uses the icon_state instead.
fire_sound = 'sound/weapons/Taser.ogg'
charge_cost = 100
projectile_type = "/obj/item/projectile/energy/electrode"
projectile_type = "/obj/item/projectile/beam/stun"
cell_type = "/obj/item/weapon/cell/crap"
/obj/item/weapon/gun/energy/taser/cyborg
@@ -15,7 +15,7 @@
icon_state = "taser"
fire_sound = 'sound/weapons/Taser.ogg'
charge_cost = 100
projectile_type = "/obj/item/projectile/energy/electrode"
projectile_type = "/obj/item/projectile/beam/stun"
cell_type = "/obj/item/weapon/cell/secborg"
var/charge_tick = 0
var/recharge_time = 10 //Time it takes for shots to recharge (in ticks)
@@ -33,16 +33,16 @@
charge_tick++
if(charge_tick < recharge_time) return 0
charge_tick = 0
if(!power_supply) return 0 //sanity
if(power_supply.charge >= power_supply.maxcharge) return 0 // check if we actually need to recharge
if(isrobot(src.loc))
var/mob/living/silicon/robot/R = src.loc
if(R && R.cell)
R.cell.use(charge_cost) //Take power from the borg...
power_supply.give(charge_cost) //... to recharge the shot
update_icon()
return 1
@@ -51,10 +51,10 @@
name = "stun revolver"
desc = "A high-tech revolver that fires stun cartridges. The stun cartridges can be recharged using a conventional energy weapon recharger."
icon_state = "stunrevolver"
fire_sound = 'sound/weapons/Gunshot.ogg'
fire_sound = 'sound/weapons/Taser.ogg'
origin_tech = "combat=3;materials=3;powerstorage=2"
charge_cost = 125
projectile_type = "/obj/item/projectile/energy/electrode"
projectile_type = "/obj/item/projectile/beam/stun"
cell_type = "/obj/item/weapon/cell"
+8 -1
View File
@@ -168,4 +168,11 @@ var/list/beam_master = list()
damage = 60
stun = 5
weaken = 5
stutter = 5
stutter = 5
/obj/item/projectile/beam/stun
name = "stun beam"
icon_state = "stun"
nodamage = 1
agony = 40
damage_type = HALLOSS
@@ -58,4 +58,7 @@
embed = 0
/obj/item/projectile/bullet/a762
damage = 25
damage = 25
/obj/item/projectile/bullet/chameleon
damage = 1 // stop trying to murderbone with a fake gun dumbass!!!

Some files were not shown because too many files have changed in this diff Show More