Conflicts:
	html/changelogs/Hubblenaut-dev.yml
This commit is contained in:
Hubblenaut
2015-12-08 15:50:00 +01:00
73 changed files with 1441 additions and 761 deletions
+15
View File
@@ -0,0 +1,15 @@
/client/New()
..()
dir = NORTH
/client/verb/spinleft()
set name = "Spin View CCW"
set category = "OOC"
dir = turn(dir, 90)
/client/verb/spinright()
set name = "Spin View CW"
set category = "OOC"
dir = turn(dir, -90)
+14 -1
View File
@@ -773,6 +773,13 @@ var/global/list/gear_datums = list()
cost = 1
allowed_roles = list("Captain")
/datum/gear/corpdetsuit
display_name = "uniform, corporate (Detective)"
path = /obj/item/clothing/under/det/corporate
cost = 1
slot = slot_w_uniform
allowed_roles = list("Detective","Head of Security")
/datum/gear/corpsecsuit
display_name = "uniform, corporate (Security)"
path = /obj/item/clothing/under/rank/security/corp
@@ -1008,7 +1015,7 @@ var/global/list/gear_datums = list()
/datum/gear/leather_coat
display_name = "leather coat"
path = /obj/item/clothing/suit/leathercoat/alt
path = /obj/item/clothing/suit/leathercoat
cost = 2
slot = slot_wear_suit
@@ -1504,6 +1511,12 @@ var/global/list/gear_datums = list()
sort_category = "utility"
cost = 1
/datum/gear/communicator
display_name = "personal communicator"
path = /obj/item/device/communicator
sort_category = "utility"
cost = 1
/datum/gear/folder_blue
display_name = "folder, blue"
path = /obj/item/weapon/folder/blue
@@ -7,14 +7,13 @@
icon_state = "space"
desc = "A special helmet designed for work in a hazardous, low-pressure environment."
item_flags = STOPPRESSUREDAMAGE | THICKMATERIAL | AIRTIGHT
flags_inv = BLOCKHAIR
item_state_slots = list(
slot_l_hand_str = "s_helmet",
slot_r_hand_str = "s_helmet",
)
permeability_coefficient = 0.01
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 100, rad = 50)
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|BLOCKHAIR
body_parts_covered = HEAD|FACE|EYES
cold_protection = HEAD
min_cold_protection_temperature = SPACE_HELMET_MIN_COLD_PROTECTION_TEMPERATURE
+1 -1
View File
@@ -122,7 +122,7 @@
name = "black medical space helmet"
desc = "A black helmet sporting a medical cross and durable plating. Hopefully the wearer abides by space geneva."
icon_state = "syndicate-helm-black-med"
item_state_slots = list(slot_head_str = "syndicate-black-med")
item_state_slots = list(slot_head_str = "syndicate-helm-black-med")
/obj/item/clothing/suit/space/syndicate/black/med
name = "black medical space suit"
@@ -8,7 +8,7 @@
armor = list(melee = 40, bullet = 5, laser = 20,energy = 5, bomb = 35, bio = 100, rad = 20)
max_heat_protection_temperature = SPACE_SUIT_MAX_HEAT_PROTECTION_TEMPERATURE
flags_inv = HIDEEARS | BLOCKHAIR
// flags_inv = HIDEEARS|BLOCKHAIR
//Species-specific stuff.
species_restricted = list("Human")
+4 -13
View File
@@ -212,18 +212,12 @@
//coats
/obj/item/clothing/suit/leathercoat
name = "leather coat"
desc = "A long, thick black leather coat."
icon_state = "leathercoat"
item_state = "leathercoat"
/obj/item/clothing/suit/leathercoat/alt
name = "leather coat"
desc = "A long, thick black leather coat."
icon_state = "leathercoat_alt"
item_state = "leathercoat_alt"
/obj/item/clothing/suit/leathercoat/alt/sec
/obj/item/clothing/suit/leathercoat/sec
name = "leather coat"
desc = "A long, thick black leather coat."
icon_state = "leathercoat_sec"
@@ -397,11 +391,8 @@
body_parts_covered = UPPER_TORSO|ARMS
/obj/item/clothing/suit/storage/leather_jacket/alt
name = "leather jacket"
desc = "A black leather coat."
icon_state = "leather_jacket_alt"
item_state = "leather_jacket_alt"
body_parts_covered = UPPER_TORSO|ARMS
icon_state = "leatherjacket_alt"
item_state = "leatherjacket_alt"
/obj/item/clothing/suit/storage/leather_jacket/nanotrasen
desc = "A black leather coat. A corporate logo is proudly displayed on the back."
@@ -409,7 +400,7 @@
//This one has buttons for some reason
/obj/item/clothing/suit/storage/toggle/brown_jacket
name = "leather jacket"
name = "brown jacket"
desc = "A brown leather coat."
icon_state = "brown_jacket"
item_state = "brown_jacket"
+7
View File
@@ -53,6 +53,7 @@ var/list/ai_verbs_default = list(
var/viewalerts = 0
var/icon/holo_icon//Default is assigned when AI is created.
var/obj/item/device/pda/ai/aiPDA = null
var/obj/item/device/communicator/aiCommunicator = null
var/obj/item/device/multitool/aiMulti = null
var/obj/item/device/radio/headset/heads/ai_integrated/aiRadio = null
var/camera_light_on = 0 //Defines if the AI toggled the light on the camera it's looking through.
@@ -114,6 +115,9 @@ var/list/ai_verbs_default = list(
density = 1
loc = loc
aiCommunicator = new /obj/item/device/communicator/integrated(src)
holo_icon = getHologramIcon(icon('icons/mob/AI.dmi',"holo1"))
proc_holder_list = new()
@@ -243,6 +247,9 @@ var/list/ai_verbs_default = list(
aiPDA.owner = pickedName
aiPDA.name = pickedName + " (" + aiPDA.ownjob + ")"
if(aiCommunicator)
aiCommunicator.register_device(src)
/*
The AI Power supply is a dummy object used for powering the AI since only machinery should be using power.
The alternative was to rewrite a bunch of AI code instead here we are.
@@ -15,6 +15,7 @@
var/userDNA // The DNA string of our assigned user
var/obj/item/device/paicard/card // The card we inhabit
var/obj/item/device/radio/radio // Our primary radio
var/obj/item/device/communicator/integrated/communicator // Our integrated communicator.
var/chassis = "repairbot" // A record of your chosen chassis.
var/global/list/possible_chassis = list(
@@ -75,6 +76,7 @@
src.loc = paicard
card = paicard
sradio = new(src)
communicator = new(src)
if(card)
if(!card.radio)
card.radio = new /obj/item/device/radio(src.card)
@@ -47,6 +47,7 @@
var/module_state_3 = null
var/obj/item/device/radio/borg/radio = null
var/obj/item/device/communicator/integrated/communicator = null
var/mob/living/silicon/ai/connected_ai = null
var/obj/item/weapon/cell/cell = null
var/obj/machinery/camera/camera = null
@@ -110,6 +111,8 @@
updateicon()
radio = new /obj/item/device/radio/borg(src)
// communicator = new /obj/item/device/communicator/integrated(src)
// communicator.register_device(src)
common_radio = radio
if(!scrambledcodes && !camera)
@@ -199,6 +202,11 @@
rbPDA = new/obj/item/device/pda/ai(src)
rbPDA.set_name_and_job(custom_name,"[modtype] [braintype]")
/mob/living/silicon/robot/proc/setup_communicator()
if (!communicator)
communicator = new/obj/item/device/communicator/integrated(src)
communicator.register_device(src, "[modtype] [braintype]")
//If there's an MMI in the robot, have it ejected when the mob goes away. --NEO
//Improved /N
/mob/living/silicon/robot/Destroy()
@@ -279,6 +287,9 @@
// if we've changed our name, we also need to update the display name for our PDA
setup_PDA()
// as well as our communicator registration
setup_communicator()
//We also need to update name of internal camera.
if (camera)
camera.c_tag = changed_name
+94
View File
@@ -0,0 +1,94 @@
//A very, very simple mob that exists inside other objects to talk and has zero influence on the world.
/mob/living/voice
name = "unknown"
desc = "How are you examining me?"
// default_language = "Galactic Common"
var/obj/item/device/communicator/comm = null
emote_type = 2 //This lets them emote through containers. The communicator has a image feed of the person calling them so...
var/stable_connection = 0 //If set to zero, makes the mob effectively deaf, mute, and blind, due to interferance.
/mob/living/voice/New(loc)
add_language("Galactic Common")
for(var/datum/language/L in languages) //This is needed to get around some saycode problems.
if(L.name == "Galactic Common")
set_default_language(L)
break
if(istype(loc, /obj/item/device/communicator))
comm = loc
..()
/mob/living/voice/proc/transfer_identity(mob/speaker)
if(ismob(speaker))
icon = speaker.icon
icon_state = speaker.icon_state
overlays = speaker.overlays
alpha = 127 //Maybe we'll have hologram calls later.
if(speaker.client && speaker.client.prefs)
var/datum/preferences/p = speaker.client.prefs
name = p.real_name
real_name = name
gender = p.gender
for(var/language in p.alternate_languages)
add_language(language)
/mob/living/voice/Login()
var/obj/screen/static_effect = new() //Since what the player sees is essentially a video feed, from a vast distance away, the view isn't going to be perfect.
static_effect.screen_loc = ui_entire_screen
static_effect.icon = 'icons/effects/static.dmi'
static_effect.icon_state = "1 light"
static_effect.mouse_opacity = 0 //So the static doesn't get in the way of clicking.
client.screen.Add(static_effect)
/mob/living/voice/Destroy()
comm = null
..()
/mob/living/voice/verb/hang_up()
set name = "Hang Up"
set category = "Communicator"
set desc = "Disconnects you from whoever you're talking to."
set src = usr
if(comm)
comm.close_connection(src, "[src] hung up")
else
src << "You appear to not be inside a communicator. This is a bug and you should report it."
/mob/living/voice/Life()
if(comm && comm.server && !comm.server.active)
comm.close_connection(src,"Connection to telecommunications array timed out")
..()
/mob/living/voice/say(var/message, var/datum/language/speaking = null, var/verb="says", var/alt_name="")
// world << "say() was called. Arguments: ([message], [speaking], [verb], [alt_name])."
if(!stable_connection)
return 0
//Speech bubbles.
if(comm)
var/speech_bubble_test = say_test(message)
var/image/speech_bubble = image('icons/mob/talk.dmi',src,"h[speech_bubble_test]")
spawn(30)
qdel(speech_bubble)
for(var/mob/M in hearers(world.view,comm)) //simplifed since it's just a speech bubble
M << speech_bubble
src << speech_bubble
..(message, speaking, verb, alt_name) //mob/living/say() can do the actual talking.
/*
/mob/verb/test_voice_mob()
set name = "Make Voice Mob"
set category = "Debug"
set desc = "For testing only!"
set src = usr
var/turf/T = get_turf(src)
var/obj/item/device/communicator/comm = new(T)
comm.open_connection(src, src)
*/
+2 -2
View File
@@ -733,8 +733,8 @@
if(istype(buckled, /obj/vehicle))
var/obj/vehicle/V = buckled
if(cannot_stand())
lying = 1
canmove = 0
lying = 0
canmove = 1
pixel_y = V.mob_offset_y - 5
else
if(buckled.buckle_lying != -1) lying = buckled.buckle_lying
@@ -206,6 +206,14 @@
name = "Bun"
icon_state = "hair_bun"
bun2
name = "Bun 2"
icon_state = "hair_bun2"
bun3
name = "Bun 3"
icon_state = "hair_bun3"
bowl
name = "Bowl"
icon_state = "hair_bowlcut"
@@ -267,6 +275,14 @@
name = "Long Emo"
icon_state = "hair_emolong"
fringeemo
name = "Emo Fringe"
icon_state = "hair_emofringe"
veryshortovereyealternate
name = "Overeye Very Short, Alternate"
icon_state = "hair_veryshortovereyealternate"
veryshortovereye
name = "Overeye Very Short"
icon_state = "hair_veryshortovereye"
+3
View File
@@ -1,6 +1,9 @@
/datum/proc/nano_host()
return src
/datum/proc/nano_container()
return src
/datum/proc/CanUseTopic(var/mob/user, var/datum/topic_state/state)
var/src_object = nano_host()
return state.can_use_topic(src_object, user)
+5 -3
View File
@@ -9,10 +9,12 @@
/mob/proc/default_can_use_topic(var/src_object)
return STATUS_CLOSE // By default no mob can do anything with NanoUI
/mob/dead/observer/default_can_use_topic()
/mob/dead/observer/default_can_use_topic(var/src_object)
if(can_admin_interact())
return STATUS_INTERACTIVE // Admins are more equal
return STATUS_UPDATE // Ghosts can view updates
return STATUS_INTERACTIVE // Admins are more equal
if(!client || get_dist(src_object, src) > client.view) // Preventing ghosts from having a million windows open by limiting to objects in range
return STATUS_CLOSE
return STATUS_UPDATE // Ghosts can view updates
/mob/living/silicon/pai/default_can_use_topic(var/src_object)
if((src_object == src || src_object == radio) && !stat)
@@ -0,0 +1,7 @@
/*
This state always returns STATUS_INTERACTIVE
*/
/var/global/datum/topic_state/interactive/interactive_state = new()
/datum/topic_state/interactive/can_use_topic(var/src_object, var/mob/user)
return STATUS_INTERACTIVE
+39
View File
@@ -0,0 +1,39 @@
/*
This state checks that user is capable, within range of the remoter, etc. and that src_object meets the basic requirements for interaction (being powered, non-broken, etc.
Whoever initializes this state is also responsible for deleting it properly.
*/
/datum/topic_state/remote
var/datum/remoter
var/datum/remote_target
var/datum/topic_state/remoter_state
/datum/topic_state/remote/New(var/remoter, var/remote_target, var/datum/topic_state/remoter_state = default_state)
src.remoter = remoter
src.remote_target = remote_target
src.remoter_state = remoter_state
..()
/datum/topic_state/remote/Destroy()
src.remoter = null
src.remoter_state = null
// Force an UI update before we go, ensuring that any windows we may have opened for the remote target closes.
nanomanager.update_uis(remote_target.nano_container())
remote_target = null
return ..()
/datum/topic_state/remote/can_use_topic(var/datum/src_object, var/mob/user)
if(!(remoter && remoter_state)) // The remoter is gone, let us leave
return STATUS_CLOSE
if(src_object != remote_target)
error("remote - Unexpected src_object: Expected '[remote_target]'/[remote_target.type], was '[src_object]'/[src_object.type]")
// This checks if src_object is powered, etc.
// The interactive state is otherwise simplistic and only returns STATUS_INTERACTIVE and never checks distances, etc.
. = src_object.CanUseTopic(user, interactive_state)
if(. == STATUS_CLOSE)
return
// This is the (generally) heavy checking, making sure the user is capable, within range of the remoter source, etc.
return min(., remoter.CanUseTopic(user, remoter_state))
+1 -1
View File
@@ -47,7 +47,7 @@
// Allows us to process UI clicks, which are relayed in form of hrefs.
/datum/nano_module/power_monitor/Topic(href, href_list)
if(..())
return
return 1
if( href_list["clear"] )
active_sensor = null
if( href_list["refresh"] )
+5 -1
View File
@@ -140,7 +140,8 @@ nanoui is used to open and update nano browser uis
* @return nothing
*/
/datum/nanoui/proc/update_status(var/push_update = 0)
var/new_status = src_object.CanUseTopic(user, state)
var/obj/host = src_object.nano_host()
var/new_status = host.CanUseTopic(user, state)
if(master_ui)
new_status = min(new_status, master_ui.status)
@@ -428,6 +429,9 @@ nanoui is used to open and update nano browser uis
user << browse(null, "window=[window_id]")
for(var/datum/nanoui/child in children)
child.close()
children.Cut()
state = null
master_ui = null
/**
* Set the UI window to call the nanoclose verb when the window is closed
+14 -12
View File
@@ -720,11 +720,6 @@
// do APC interaction
src.interact(user)
/obj/machinery/power/apc/attack_ghost(user as mob)
if(stat & (BROKEN|MAINT))
return
return ui_interact(user)
/obj/machinery/power/apc/interact(mob/user)
if(!user)
return
@@ -749,7 +744,7 @@
"totalLoad" = round(lastused_total),
"totalCharging" = round(lastused_charging),
"coverLocked" = coverlocked,
"siliconUser" = istype(user, /mob/living/silicon),
"siliconUser" = issilicon(user) || isobserver(user), //I add observer here so admins can have more control, even if it makes 'siliconUser' seem inaccurate.
"powerChannels" = list(
list(
@@ -822,11 +817,13 @@
/obj/machinery/power/apc/proc/can_use(mob/user as mob, var/loud = 0) //used by attack_hand() and Topic()
if(!user.client)
return 0
if(isobserver(user) && is_admin(user) ) //This is to allow nanoUI interaction by ghost admins.
return 1
if (user.stat)
user << "<span class='warning'>You must be conscious to use [src]!</span>"
return 0
if(!user.client)
return 0
if(inoperable())
return 0
if(!user.IsAdvancedToolUser())
@@ -872,10 +869,15 @@
if(!can_use(usr, 1))
return 1
if(!istype(usr, /mob/living/silicon) && locked)
// Shouldn't happen, this is here to prevent href exploits
usr << "You must unlock the panel to use this!"
return 1
if(locked && !issilicon(usr) )
if(isobserver(usr) )
var/mob/dead/observer/O = usr //Added to allow admin nanoUI interactions.
if(!O.can_admin_interact() ) //NanoUI /should/ make this not needed, but better safe than sorry.
usr << "Try as you might, your ghostly fingers can't press the buttons."
return 1
else
usr << "You must unlock the panel to use this!"
return 1
if (href_list["lock"])
coverlocked = !coverlocked
+1 -1
View File
@@ -107,7 +107,7 @@
continue
if(O.invisibility == 101)
O.singularity_act(src, current_size)
ChangeTurf(get_base_turf(src.z))
ChangeTurf(get_base_turf_by_area(src))
return 2
/turf/simulated/wall/singularity_pull(S, current_size)
+1 -4
View File
@@ -223,10 +223,7 @@
/obj/machinery/power/smes/attack_ai(mob/user)
add_fingerprint(user)
ui_interact(user)
/obj/machinery/power/smes/attack_ghost(mob/user)
add_hiddenprint(user)
ui_interact(user)
/obj/machinery/power/smes/attack_hand(mob/user)
+9 -2
View File
@@ -309,6 +309,14 @@
return !P.launch_from_gun(target, user, src, target_zone, x_offset, y_offset)
//apart of reskins that have two sprites, touching may result in frustration and breaks
/obj/item/weapon/gun/projectile/colt/detective/attack_hand(var/mob/living/user)
if(!unique_reskin && loc == user)
reskin_gun(user)
return
..()
//Suicide handling.
/obj/item/weapon/gun/var/mouthshoot = 0 //To stop people from suiciding twice... >.>
/obj/item/weapon/gun/proc/handle_suicide(mob/living/user)
@@ -389,5 +397,4 @@
return new_mode
/obj/item/weapon/gun/attack_self(mob/user)
switch_firemodes(user)
switch_firemodes(user)
@@ -30,7 +30,7 @@
/obj/item/weapon/gun/projectile/automatic/c20r
name = "submachine gun"
desc = "The C-20r is a lightweight and rapid firing SMG, for when you REALLY need someone dead. Uses 12mm rounds. Has a 'Scarborough Arms - Per falcis, per pravitas' buttstamp."
desc = "The C-20r is a lightweight and rapid firing SMG, for when you REALLY need someone dead. Uses 10mm rounds. Has a 'Scarborough Arms - Per falcis, per pravitas' buttstamp."
icon_state = "c20r"
item_state = "c20r"
w_class = 3
@@ -1,4 +1,5 @@
/obj/item/weapon/gun/projectile/colt
var/unique_reskin
name = "vintage .45 pistol"
desc = "A cheap Martian knock-off of a Colt M1911. Uses .45 rounds."
magazine_type = /obj/item/ammo_magazine/c45m
@@ -12,6 +13,18 @@
desc = "A Martian recreation of an old Terran pistol. Uses .45 rounds."
magazine_type = /obj/item/ammo_magazine/c45m/rubber
/obj/item/weapon/gun/projectile/colt/detective/update_icon()
if(ammo_magazine)
if(unique_reskin)
icon_state = unique_reskin
else
icon_state = initial(icon_state)
else
if(unique_reskin)
icon_state = "[unique_reskin]-e"
else
icon_state = "[initial(icon_state)]-e"
/obj/item/weapon/gun/projectile/colt/detective/verb/rename_gun()
set name = "Name Gun"
set category = "Object"
@@ -40,9 +53,14 @@
options["NT Mk. 58"] = "secguncomp"
options["NT Mk. 58 Custom"] = "secgundark"
options["Colt M1911"] = "colt"
options["USP"] = "usp"
options["H&K VP"] = "VP78"
options["P08 Luger"] = "p08"
options["P08 Luger, Brown"] = "p08b"
var/choice = input(M,"What do you want to skin the gun to?","Reskin Gun") in options
if(src && choice && !M.stat && in_range(M,src))
icon_state = options[choice]
unique_reskin = options[choice]
M << "Your gun is now skinned as [choice]. Say hello to your new friend."
return 1
@@ -56,6 +74,13 @@
fire_sound = 'sound/weapons/Gunshot_light.ogg'
load_method = MAGAZINE
/obj/item/weapon/gun/projectile/sec/update_icon()
..()
if(ammo_magazine)
icon_state = "secguncomp"
else
icon_state = "secguncomp-e"
/obj/item/weapon/gun/projectile/sec/flash
name = ".45 signal pistol"
magazine_type = /obj/item/ammo_magazine/c45m/flash
@@ -65,6 +90,13 @@
name = "custom .45 Pistol"
icon_state = "secgundark"
/obj/item/weapon/gun/projectile/sec/wood/update_icon()
..()
if(ammo_magazine)
icon_state = "secgundark"
else
icon_state = "secgundark-e"
/obj/item/weapon/gun/projectile/silenced
name = "silenced pistol"
desc = "A small, quiet, easily concealable gun. Uses .45 rounds."
@@ -73,6 +73,26 @@
qdel(src)
return B
/obj/item/weapon/reagent_containers/food/drinks/bottle/verb/smash_bottle()
set name = "Smash Bottle"
set category = "Object"
var/list/things_to_smash_on = list()
for(var/atom/A in range (1, usr))
if(A.density && usr.Adjacent(A) && !istype(A, /mob))
things_to_smash_on += A
var/atom/choice = input("Select what you want to smash the bottle on.") as null|anything in things_to_smash_on
if(!choice)
return
if(!(choice.density && usr.Adjacent(choice)))
usr << "<span class='warning'>You must stay close to your target! You moved away from \the [choice]</span>"
return
usr.put_in_hands(src.smash(usr.loc, choice))
usr.visible_message("<span class='danger'>\The [usr] smashed \the [src] on \the [choice]!</span>")
usr << "<span class='danger'>You smash \the [src] on \the [choice]!</span>"
/obj/item/weapon/reagent_containers/food/drinks/bottle/attackby(obj/item/W, mob/user)
if(!rag && istype(W, /obj/item/weapon/reagent_containers/glass/rag))
insert_rag(W, user)
@@ -452,6 +472,4 @@
center_of_mass = list("x"=16, "y"=10)
New()
..()
reagents.add_reagent("ale", 30)
reagents.add_reagent("ale", 30)