Merge remote-tracking branch 'upstream/dev' into 151210-TapeTape

Conflicts:
	code/__defines/misc.dm
This commit is contained in:
PsiOmegaDelta
2015-12-13 11:50:06 +01:00
91 changed files with 3150 additions and 2217 deletions

View File

@@ -0,0 +1,37 @@
/obj/machinery/acting/wardrobe
name = "wardrobe dispenser"
desc = "A machine that dispenses holo-clothing for those in need."
icon = 'icons/obj/vending.dmi'
icon_state = "cart"
anchored = 1
density = 1
var/active = 1
/obj/machinery/acting/wardrobe/attack_hand(var/mob/user as mob)
user.show_message("You push a button and watch patiently as the machine begins to hum.")
if(active)
active = 0
spawn(30)
new /obj/item/weapon/storage/box/syndie_kit/chameleon(src.loc)
src.visible_message("\The [src] beeps, dispensing a small box onto the floor.", "You hear a beeping sound followed by a thumping noise of some kind.")
active = 1
/obj/machinery/acting/changer
name = "Quickee's Plastic Surgeon"
desc = "For when you need to be someone else right now."
icon = 'icons/obj/surgery.dmi'
icon_state = "bioprinter"
anchored = 1
density = 1
/obj/machinery/acting/changer/attack_hand(var/mob/user as mob)
if(ishuman(user))
var/mob/living/carbon/human/H = user
H.change_appearance(APPEARANCE_ALL, H.loc, H, H.generate_valid_species(), state = z_state)
var/getName = sanitize(input(H, "Would you like to change your name to something else?", "Name change") as null|text, MAX_NAME_LEN)
if(getName)
H.real_name = getName
H.name = getName
H.dna.real_name = getName
if(H.mind)
H.mind.name = H.name

View File

@@ -128,9 +128,6 @@ var/list/admin_verbs_spawn = list(
/datum/admins/proc/spawn_plant,
/datum/admins/proc/spawn_atom, // allows us to spawn instances,
/client/proc/respawn_character,
/client/proc/FireLaser,
/client/proc/FireCannons,
/client/proc/ChangeIcarusPosition,
/client/proc/virus2_editor,
/client/proc/spawn_chemdisp_cartridge
)

View File

@@ -1671,13 +1671,8 @@
else
var/choice = alert("Please confirm Feed channel creation","Network Channel Handler","Confirm","Cancel")
if(choice=="Confirm")
var/datum/feed_channel/newChannel = new /datum/feed_channel
newChannel.channel_name = src.admincaster_feed_channel.channel_name
newChannel.author = src.admincaster_signature
newChannel.locked = src.admincaster_feed_channel.locked
newChannel.is_admin_channel = 1
feedback_inc("newscaster_channels",1)
news_network.network_channels += newChannel //Adding channel to the global network
news_network.CreateFeedChannel(admincaster_feed_channel.channel_name, admincaster_signature, admincaster_feed_channel.locked, 1)
feedback_inc("newscaster_channels",1) //Adding channel to the global network
log_admin("[key_name_admin(usr)] created command feed channel: [src.admincaster_feed_channel.channel_name]!")
src.admincaster_screen=5
src.access_news_network()

View File

@@ -1,129 +0,0 @@
/client/proc/FireLaser()
set name = "Fire the Icarus lasers"
set desc = "Fires a laser bolt at your position. You should only do this as a(n) (a)ghost"
set category = "Fun"
var/turf/target = get_turf(src.mob)
log_and_message_admins("has fired the Icarus point defense laser at [target.x]-[target.y]-[target.z]")
if(!src.holder)
src << "Only administrators may use this command."
return
Icarus_FireLaser(target)
/client/proc/FireCannons()
set name = "Fire the Icarus cannons"
set desc = "Fires an explosive missile at your position. You should only do this as a(n) (a)ghost."
set category = "Fun"
var/turf/target = get_turf(src.mob)
log_and_message_admins("has fired the Icarus main gun projectile at [target.x]-[target.y]-[target.z]")
if(!src.holder)
src << "Only administrators may use this command."
return
Icarus_FireCannon(target)
/client/proc/ChangeIcarusPosition()
set name = "Adjust Icarus Position"
set desc = "Lets you chose the position of the Icarus in regards to the map."
set category = "Fun"
log_and_message_admins("is changing the Icarus position.")
if(!src.holder)
src << "Only administrators may use this command."
return
Icarus_SetPosition(src)
var/icarus_position = SOUTH
proc/Icarus_FireLaser(var/turf/target)
// Find the world edge to fire from.
var/x = icarus_position & EAST ? world.maxx : icarus_position & WEST ? 1 : target.x
var/y = icarus_position & NORTH ? world.maxy : icarus_position & SOUTH ? 1 : target.y
var/x_off = x != target.x ? abs(target.x - x) : INFINITY
var/y_off = y != target.y ? abs(target.y - y) : INFINITY
// Get the minimum number of steps using the rise/run shit.
var/iterations = round(min(x_off, y_off)) - 14 // We cannot fire straight from the edge since teleport thing.
// Now we can get the location of the start.
x = target.x + (icarus_position & EAST ? iterations : icarus_position & WEST ? -iterations : 0)
y = target.y + (icarus_position & NORTH ? iterations : icarus_position & SOUTH ? -iterations : 0)
var/turf/start = locate(x, y, target.z)
// should step down as:
// 1000, 500, 333, 250, 200, 167, 142, 125, 111, 100, 90
var/damage = 1000
for(var/i in 2 to 12)
var/obj/item/projectile/beam/in_chamber = new (start)
in_chamber.original = target
in_chamber.starting = start
in_chamber.silenced = 1
in_chamber.yo = icarus_position & NORTH ? -1 : icarus_position & SOUTH ? 1 : 0
in_chamber.xo = icarus_position & EAST ? -1 : icarus_position & WEST ? 1 : 0
in_chamber.damage = damage
in_chamber.kill_count = 500
in_chamber.process()
damage -= damage / i
sleep(-1)
// Let everyone know what hit them.
var/obj/item/projectile/beam/in_chamber = new (start)
in_chamber.original = target
in_chamber.starting = start
in_chamber.silenced = 0
in_chamber.yo = icarus_position & NORTH ? -1 : icarus_position & SOUTH ? 1 : 0
in_chamber.xo = icarus_position & EAST ? -1 : icarus_position & WEST ? 1 : 0
in_chamber.kill_count = 500
in_chamber.damage = 0
in_chamber.name = "point defense laser"
in_chamber.firer = "Icarus" // Never displayed, but we want this to display the hit message.
in_chamber.process()
proc/Icarus_FireCannon(var/turf/target)
// Find the world edge to fire from.
var/x = icarus_position & EAST ? world.maxx : icarus_position & WEST ? 1 : target.x
var/y = icarus_position & NORTH ? world.maxy : icarus_position & SOUTH ? 1 : target.y
var/x_off = x != target.x ? abs(target.x - x) : INFINITY
var/y_off = y != target.y ? abs(target.y - y) : INFINITY
// Get the minimum number of steps using the rise/run shit.
var/iterations = round(min(x_off, y_off)) - 14 // We cannot fire straight from the edge since teleport thing.
// Now we can get the location of the start.
x = target.x + (icarus_position & EAST ? iterations : icarus_position & WEST ? -iterations : 0)
y = target.y + (icarus_position & NORTH ? iterations : icarus_position & SOUTH ? -iterations : 0)
var/turf/start = locate(x, y, target.z)
// Now we find the corresponding turf on the other side of the level.
// Yeah, yeah. Overuse of the terinary operator. So sue me.
x = icarus_position & EAST ? 1 : icarus_position & WEST ? world.maxx : target.x
y = icarus_position & NORTH ? 1 : icarus_position & SOUTH ? world.maxy : target.y
x_off = x != target.x ? abs(target.x - x) : INFINITY
y_off = y != target.y ? abs(target.y - y) : INFINITY
iterations = round(min(x_off, y_off))
x = target.x + (icarus_position & EAST ? -iterations : icarus_position & WEST ? iterations : 0)
y = target.y + (icarus_position & NORTH ? -iterations : icarus_position & SOUTH ? iterations : 0)
target = locate(x, y, target.z)
// Finally fire the fucker.
var/obj/effect/meteor/projectile = new (start)
projectile.dest = target
projectile.name = "main gun projectile" // stealthy
projectile.hits = 6
// Make sure it travels
spawn(0)
walk_towards(projectile, projectile.dest, 1)
proc/Icarus_SetPosition(var/user)
var/global/list/directions = list("North" = 1, "North East" = 5, "East" = 4, "South East" = 6, "South" = 2, "South West" = 10, "West" = 8, "North West" = 9)
var/direction = input(user, "Where should the Icarus fire from?", "Icarus Comms") as null|anything in directions
if(!direction)
return
icarus_position = directions[direction]

View File

@@ -520,7 +520,8 @@ Traitors and the like can also be revived with the previous role mostly intact.
if(! (C.stat & (BROKEN|NOPOWER) ) )
var/obj/item/weapon/paper/P = new /obj/item/weapon/paper( C.loc )
P.name = "'[command_name()] Update.'"
P.info = input
P.info = replacetext(input, "\n", "<br/>")
P.update_space(P.info)
P.update_icon()
C.messagetitle.Add("[command_name()] Update")
C.messagetext.Add(P.info)

View File

@@ -120,7 +120,8 @@
if(prob(health))
expand(T)
return
B.pulse(forceLeft - 1, dirs)
if(forceLeft)
B.pulse(forceLeft - 1, dirs)
/obj/effect/blob/bullet_act(var/obj/item/projectile/Proj)
if(!Proj)
@@ -158,6 +159,7 @@
fire_resist = 2
expandType = /obj/effect/blob/shield
var/blob_may_process = 1
/obj/effect/blob/core/update_icon()
return
@@ -171,10 +173,16 @@
return ..()
/obj/effect/blob/core/process()
set waitfor = 0
if(!blob_may_process)
return
blob_may_process = 0
sleep(0)
pulse(20, list(NORTH, EAST))
pulse(20, list(NORTH, WEST))
pulse(20, list(SOUTH, EAST))
pulse(20, list(SOUTH, WEST))
blob_may_process = 1
/obj/effect/blob/shield
name = "strong blob"

View File

@@ -1134,7 +1134,31 @@ var/global/list/gear_datums = list()
/datum/gear/cards
display_name = "deck of cards"
path = /obj/item/weapon/deck
path = /obj/item/weapon/deck/cards
sort_category = "misc"
cost = 1
/datum/gear/tarot
display_name = "deck of tarot cards"
path = /obj/item/weapon/deck/tarot
sort_category = "misc"
cost = 1
/datum/gear/holder
display_name = "card holder"
path = /obj/item/weapon/deck/holder
sort_category = "misc"
cost = 1
/datum/gear/cardemon_pack
display_name = "\improper Cardemon booster pack"
path = /obj/item/weapon/pack/cardemon
sort_category = "misc"
cost = 1
/datum/gear/spaceball_pack
display_name = "\improper Spaceball booster pack"
path = /obj/item/weapon/pack/spaceball
sort_category = "misc"
cost = 1

View File

@@ -0,0 +1,126 @@
/*TODO:
implement icon loading that is efficient using browse_rsc
implement being able to move pieces
*/
/obj/item/weapon/board
name = "board"
desc = "A standard 12' checkerboard. Well used."
icon = 'icons/obj/pieces.dmi'
icon_state = "board"
var/num = 0
var/board_icons = list()
var/board = list()
var/selected = -1
/obj/item/weapon/board/examine(mob/user, var/distance = -1)
if(in_range(user,src))
user.set_machine(src)
interact(user)
return
..()
obj/item/weapon/board/attackby(obj/item/I as obj, mob/user as mob)
if(I.w_class != 1) //only small stuff
user.show_message("<span class='warning'>\The [I] is too big to be used as a board piece.</span>")
return
if(num == 64)
user.show_message("<span class='warning'>\The [src] is already full!</span>")
return
user.drop_from_inventory(I)
I.forceMove(src)
num++
if(!board_icons["[I.icon] [I.icon_state]"])
board_icons["[I.icon] [I.icon_state]"] = new /icon(I.icon,I.icon_state)
var i;
for(i=0;i<64;i++)
if(!board["[i]"])
board["[i]"] = I
return
src.updateDialog()
/obj/item/weapon/board/interact(mob/user as mob)
var/dat = "<HTML>"
dat += "<table border='0'>"
var i;
for(i=0; i<64; i++)
if(i%8 == 0)
dat += "<tr>"
dat += "<td align='center' height='50' width='50' bgcolor="
if(selected == i)
dat += "'#FF8566'>"
else if(i%2 == 0)
dat += "'#66CCFF'>"
else
dat += "'#252536'>"
dat += "<A href='?src=\ref[src];select=[i]'"
if(board["[i]"])
var/obj/item/I = board["[i]"]
user << browse_rsc(board_icons["[I.icon] [I.icon_state]"],"[I.icon_state].png")
dat += "><image src='[I.icon_state].png' style='border-style: none'>"
else
dat += "style='display:block;text-decoration:none;'>&nbsp;"
dat += "</A></td>"
dat += "</table><br>"
if(selected >= 0)
dat += "<br><A href='?src=\ref[src];remove=0'>Remove Selected Piece</A>"
user << browse(dat,"window=boardgame;size=500x500")
onclose(usr, "boardgame")
/obj/item/weapon/board/Topic(href, href_list)
if(href_list["select"])
var/s = href_list["select"]
var/obj/item/I = board["[s]"]
if(selected >= 0)
if(I) //cant put items on other items.
return
//put item in new spot.
I = board["[selected]"]
board["[selected]"] = null
board -= "[selected]"
board -= null
board["[s]"] = I
selected = -1
else
if(I)
selected = text2num(s)
if(href_list["remove"])
var/obj/item/I = board["[selected]"]
board["[selected]"] = null
board -= "[selected]"
board -= null
I.forceMove(src.loc)
num--
selected = -1
var j
for(j=0;j<64;j++)
if(board["[j]"])
var/obj/item/K = board["[j]"]
if(K.icon == I.icon && cmptext(K.icon_state,I.icon_state))
src.updateDialog()
return
//Didn't find it in use, remove it and allow GC to delete it.
board_icons["[I.icon] [I.icon_state]"] = null
board_icons -= "[I.icon] [I.icon_state]"
board_icons -= null
src.updateDialog()
/obj/item/weapon/checker/
name = "black checker"
desc = "It is plastic and shiny."
icon = 'icons/obj/pieces.dmi'
icon_state = "checker_black"
w_class = 1
/obj/item/weapon/checker/red
name = "red checker"
icon_state = "checker_red"

View File

@@ -0,0 +1,30 @@
/obj/item/weapon/pack/cardemon
name = "\improper Cardemon booster pack"
desc = "Finally! A children's card game in space!"
icon_state = "card_pack_cardemon"
/obj/item/weapon/pack/cardemon/New()
var/datum/playingcard/P
var/i
for(i=0; i<5; i++)
var/rarity
if(prob(10))
if(prob(5))
if(prob(5))
rarity = "Plasteel"
else
rarity = "Platinum"
else
rarity = "Silver"
var/nam = pick("Death","Life","Plant","Leaf","Air","Earth","Fire","Water","Killer","Holy", "God", "Ordinary","Demon","Angel", "Plasteel", "Phoron", "Mad", "Insane", "Metal", "Steel", "Secret")
var/nam2 = pick("Carp", "Corgi", "Cat", "Mouse", "Octopus", "Lizard", "Monkey", "Plant", "Duck", "Demon", "Spider", "Bird")
P = new()
P.name = "[nam] [nam2]"
P.card_icon = "card_cardemon"
if(rarity)
P.name = "[rarity] [P.name]"
P.card_icon += "_[rarity]"
P.back_icon = "card_back_cardemon"
cards += P

View File

@@ -1,17 +1,24 @@
/datum/playingcard
var/name = "playing card"
var/card_icon = "card_back"
var/back_icon = "card_back"
/obj/item/weapon/deck
name = "deck of cards"
desc = "A simple deck of playing cards."
icon = 'icons/obj/playing_cards.dmi'
icon_state = "deck"
w_class = 2
icon = 'icons/obj/playing_cards.dmi'
var/list/cards = list()
/obj/item/weapon/deck/New()
/obj/item/weapon/deck/holder
name = "card box"
desc = "A small leather case to show how classy you are compared to everyone else."
icon_state = "card_holder"
/obj/item/weapon/deck/cards
name = "deck of cards"
desc = "A simple deck of playing cards."
icon_state = "deck"
/obj/item/weapon/deck/cards/New()
..()
var/datum/playingcard/P
@@ -27,12 +34,14 @@
P = new()
P.name = "[number] of [suit]"
P.card_icon = "[colour]num"
P.back_icon = "card_back"
cards += P
for(var/number in list("jack","queen","king"))
P = new()
P.name = "[number] of [suit]"
P.card_icon = "[colour]col"
P.back_icon = "card_back"
cards += P
@@ -48,7 +57,7 @@
for(var/datum/playingcard/P in H.cards)
cards += P
qdel(O)
user << "You place your cards on the bottom of the deck."
user << "You place your cards on the bottom of \the [src]."
return
..()
@@ -128,12 +137,12 @@
/obj/item/weapon/hand/attackby(obj/O as obj, mob/user as mob)
if(istype(O,/obj/item/weapon/hand))
var/obj/item/weapon/hand/H = O
for(var/datum/playingcard/P in H.cards)
cards += P
src.concealed = H.concealed
qdel(O)
user.put_in_hands(src)
update_icon()
for(var/datum/playingcard/P in cards)
H.cards += P
H.concealed = src.concealed
user.drop_from_inventory(src,user.loc)
qdel(src)
H.update_icon()
return
..()
@@ -159,6 +168,28 @@
deal_at(usr, over)
/obj/item/weapon/pack/
name = "card pack"
desc = "For those with disposible income."
icon_state = "card_pack"
icon = 'icons/obj/playing_cards.dmi'
w_class = 1
var/list/cards = list()
/obj/item/weapon/pack/attack_self(var/mob/user as mob)
user.visible_message("[user] rips open \the [src]!")
var/obj/item/weapon/hand/H = new()
H.cards += cards
cards.Cut();
user.drop_item()
qdel(src)
H.update_icon()
user.put_in_active_hand(H)
/obj/item/weapon/hand
name = "hand of cards"
desc = "Some playing cards."
@@ -226,7 +257,7 @@
if(cards.len == 1)
var/datum/playingcard/P = cards[1]
var/image/I = new(src.icon, (concealed ? "card_back" : "[P.card_icon]") )
var/image/I = new(src.icon, (concealed ? "[P.back_icon]" : "[P.card_icon]") )
I.pixel_x += (-5+rand(10))
I.pixel_y += (-5+rand(10))
overlays += I
@@ -249,7 +280,7 @@
M.Translate(-2, 0)
var/i = 0
for(var/datum/playingcard/P in cards)
var/image/I = new(src.icon, (concealed ? "card_back" : "[P.card_icon]") )
var/image/I = new(src.icon, (concealed ? "[P.back_icon]" : "[P.card_icon]") )
//I.pixel_x = origin+(offset*i)
switch(direction)
if(SOUTH)

View File

@@ -0,0 +1,23 @@
/obj/item/weapon/pack/spaceball
name = "\improper Spaceball booster pack"
desc = "Officially licensed to take your money."
icon_state = "card_pack_spaceball"
/obj/item/weapon/pack/spaceball/New()
var/datum/playingcard/P
var/i
var/year = 554 + text2num(time2text(world.timeofday, "YYYY"))
for(i=0;i<5;i++)
P = new()
if(prob(1))
P.name = "Spaceball Jones, [year] Brickburn Galaxy Trekers"
P.card_icon = "spaceball_jones"
else
var/language_type = pick(/datum/language/human,/datum/language/diona,/datum/language/tajaran,/datum/language/unathi)
var/datum/language/L = new language_type()
var/team = pick("Brickburn Galaxy Trekers","Mars Rovers", "Qerrbalak Saints", "Moghes Rockets", "Ahdomai Lightening")
P.name = "[L.get_random_name(pick(MALE,FEMALE))], [year - rand(0,50)] [team]"
P.card_icon = "spaceball_standard"
P.back_icon = "card_back_spaceball"
cards += P

View File

@@ -0,0 +1,39 @@
/* this is a playing card deck based off of the Rider-Waite Tarot Deck.
*/
/obj/item/weapon/deck/tarot
name = "deck of tarot cards"
desc = "For all your occult needs!"
icon_state = "deck_tarot"
/obj/item/weapon/deck/tarot/New()
..()
var/datum/playingcard/P
for(var/name in list("Fool","Magician","High Priestess","Empress","Emperor","Hierophant","Lovers","Chariot","Strength","Hermit","Wheel of Fortune","Justice","Hanged Man","Death","Temperance","Devil","Tower","Star","Moon","Sun","Judgement","World"))
P = new()
P.name = "[name]"
P.card_icon = "tarot_major"
P.back_icon = "card_back_tarot"
cards += P
for(var/suit in list("wands","pentacles","cups","swords"))
for(var/number in list("ace","two","three","four","five","six","seven","eight","nine","ten","page","knight","queen","king"))
P = new()
P.name = "[number] of [suit]"
P.card_icon = "tarot_[suit]"
P.back_icon = "card_back_tarot"
cards += P
/obj/item/weapon/deck/tarot/attack_self(var/mob/user as mob)
var/list/newcards = list()
while(cards.len)
var/datum/playingcard/P = pick(cards)
P.name = replacetext(P.name," reversed","")
if(prob(50))
P.name += " reversed"
newcards += P
cards -= P
cards = newcards
user.visible_message("\The [user] shuffles [src].")

View File

@@ -11,7 +11,7 @@
recipes += new/datum/stack_recipe("[display_name] ashtray", /obj/item/weapon/material/ashtray, 2, one_per_turf = 1, on_floor = 1, supplied_material = "[name]")
recipes += new/datum/stack_recipe("[display_name] spoon", /obj/item/weapon/material/kitchen/utensil/spoon/plastic, 1, on_floor = 1, supplied_material = "[name]")
if(integrity>=100)
if(integrity>=50)
recipes += new/datum/stack_recipe("[display_name] door", /obj/structure/simple_door, 10, one_per_turf = 1, on_floor = 1, supplied_material = "[name]")
recipes += new/datum/stack_recipe("[display_name] barricade", /obj/structure/barricade, 5, time = 50, one_per_turf = 1, on_floor = 1, supplied_material = "[name]")
recipes += new/datum/stack_recipe("[display_name] stool", /obj/item/weapon/stool, one_per_turf = 1, on_floor = 1, supplied_material = "[name]")

View File

@@ -571,7 +571,7 @@ var/list/name_to_material
name = "wood"
stack_type = /obj/item/stack/material/wood
icon_colour = "#824B28"
integrity = 25
integrity = 50
icon_base = "solid"
explosion_resistance = 2
shard_type = SHARD_SPLINTER

View File

@@ -2,9 +2,8 @@
//m_type == 1 --> visual.
//m_type == 2 --> audible
/mob/proc/custom_emote(var/m_type=1,var/message = null)
if(stat || !use_me && usr == src)
usr << "You are unable to emote."
src << "You are unable to emote."
return
var/muzzled = istype(src.wear_mask, /obj/item/clothing/mask/muzzle)

View File

@@ -735,7 +735,8 @@
if(!check_has_mouth())
return
if(stat == DEAD)
return
if(!lastpuke)
lastpuke = 1
src << "<span class='warning'>You feel nauseous...</span>"
@@ -1384,7 +1385,7 @@
/mob/living/carbon/human/MouseDrop(var/atom/over_object)
var/mob/living/carbon/human/H = over_object
if(holder_type && a_intent == "help" && istype(H) && H.a_intent == "help" && !issmall(H) && Adjacent(H))
if(holder_type && a_intent == I_HELP && istype(H) && H == usr && H.a_intent == I_HELP && !issmall(H) && Adjacent(H))
get_scooped(H)
return
return ..()

View File

@@ -11,6 +11,7 @@
origin_tech = list(TECH_BIO = 4)
var/Uses = 1 // uses before it goes inert
var/enhanced = 0 //has it been enhanced before?
flags = OPENCONTAINER
attackby(obj/item/O as obj, mob/user as mob)
if(istype(O, /obj/item/weapon/slimesteroid2))

View File

@@ -14,6 +14,7 @@ var/list/department_radio_keys = list(
":u" = "Supply", ".u" = "Supply",
":v" = "Service", ".v" = "Service",
":p" = "AI Private", ".p" = "AI Private",
":z" = "Entertainment",".z" = "Entertainment",
":R" = "right ear", ".R" = "right ear",
":L" = "left ear", ".L" = "left ear",
@@ -29,6 +30,7 @@ var/list/department_radio_keys = list(
":U" = "Supply", ".U" = "Supply",
":V" = "Service", ".V" = "Service",
":P" = "AI Private", ".P" = "AI Private",
":Z" = "Entertainment",".Z" = "Entertainment",
//kinda localization -- rastaf0
//same keys as above, but on russian keyboard layout. This file uses cp1251 as encoding.
@@ -167,7 +169,7 @@ proc/get_radio_key_from_channel(var/channel)
speaking.broadcast(src,trim(message))
return 1
verb = say_quote(message, speaking)
verb = say_quote(message, speaking)
if(is_muzzled())
src << "<span class='danger'>You're muzzled and cannot speak!</span>"

View File

@@ -146,13 +146,13 @@
/mob/living/silicon/robot/handle_regular_hud_updates()
if (src.stat == 2 || XRAY in mutations || src.sight_mode & BORGXRAY)
if (src.stat == 2 || (XRAY in mutations) || (src.sight_mode & BORGXRAY))
src.sight |= SEE_TURFS
src.sight |= SEE_MOBS
src.sight |= SEE_OBJS
src.see_in_dark = 8
src.see_invisible = SEE_INVISIBLE_MINIMUM
else if (src.sight_mode & BORGMESON && src.sight_mode & BORGTHERM)
else if ((src.sight_mode & BORGMESON) && (src.sight_mode & BORGTHERM))
src.sight |= SEE_TURFS
src.sight |= SEE_MOBS
src.see_in_dark = 8
@@ -161,6 +161,10 @@
src.sight |= SEE_TURFS
src.see_in_dark = 8
see_invisible = SEE_INVISIBLE_MINIMUM
else if (src.sight_mode & BORGMATERIAL)
src.sight |= SEE_OBJS
src.see_in_dark = 8
see_invisible = SEE_INVISIBLE_MINIMUM
else if (src.sight_mode & BORGTHERM)
src.sight |= SEE_MOBS
src.see_in_dark = 8

View File

@@ -326,7 +326,7 @@ var/global/list/robot_modules = list(
src.modules += new /obj/item/weapon/crowbar(src)
src.modules += new /obj/item/weapon/pickaxe/plasmacutter(src)
src.modules += new /obj/item/device/pipe_painter(src)
src.modules += new /obj/item/weapon/inflatable_dispenser(src)
src.modules += new /obj/item/weapon/gripper/no_use/loader(src)
var/datum/matter_synth/metal = new /datum/matter_synth/metal()
var/datum/matter_synth/plasteel = new /datum/matter_synth/plasteel()
@@ -580,7 +580,7 @@ var/global/list/robot_modules = list(
/obj/item/weapon/robot_module/miner/New()
src.modules += new /obj/item/device/flash(src)
src.modules += new /obj/item/borg/sight/meson(src)
src.modules += new /obj/item/borg/sight/material(src)
src.modules += new /obj/item/weapon/wrench(src)
src.modules += new /obj/item/weapon/screwdriver(src)
src.modules += new /obj/item/weapon/storage/bag/ore(src)
@@ -692,6 +692,7 @@ var/global/list/robot_modules = list(
src.modules += new /obj/item/device/lightreplacer(src)
src.modules += new /obj/item/weapon/gripper(src)
src.modules += new /obj/item/weapon/soap(src)
src.modules += new /obj/item/weapon/gripper/no_use/loader(src)
src.modules += new /obj/item/weapon/extinguisher(src)
robot.internals = new/obj/item/weapon/tank/jetpack/carbondioxide(src)

View File

@@ -160,7 +160,7 @@
return buckled ? FULLY_BUCKLED : UNBUCKLED
/mob/proc/incapacitated(var/incapacitation_flags = INCAPACITATION_DEFAULT)
if (stat || paralysis || stunned || weakened || resting || sleeping || (status_flags & FAKEDEATH))
if ((incapacitation_flags & INCAPACITATION_DISABLED) && (stat || paralysis || stunned || weakened || resting || sleeping || (status_flags & FAKEDEATH)))
return 1
if((incapacitation_flags & INCAPACITATION_RESTRAINED) && restrained())
@@ -734,7 +734,7 @@
else
if(istype(buckled, /obj/vehicle))
var/obj/vehicle/V = buckled
if(cannot_stand())
if(incapacitated(INCAPACITATION_DISABLED))
lying = 1
canmove = 0
pixel_y = V.mob_offset_y - 5

View File

@@ -2,15 +2,24 @@ datum/preferences
//The mob should have a gender you want before running this proc. Will run fine without H
proc/randomize_appearance_for(var/mob/living/carbon/human/H)
gender = pick(MALE, FEMALE)
s_tone = random_skin_tone()
var/datum/species/current_species = all_species[species]
if(current_species)
if(current_species.flags & HAS_SKIN_TONE)
s_tone = random_skin_tone()
if(current_species.flags & HAS_EYE_COLOR)
randomize_eyes_color()
if(current_species.flags & HAS_SKIN_COLOR)
randomize_skin_color()
if(current_species.flags & HAS_UNDERWEAR)
underwear = rand(1,underwear_m.len)
undershirt = rand(1,undershirt_t.len)
h_style = random_hair_style(gender, species)
f_style = random_facial_hair_style(gender, species)
randomize_hair_color("hair")
randomize_hair_color("facial")
randomize_eyes_color()
randomize_skin_color()
underwear = rand(1,underwear_m.len)
undershirt = rand(1,undershirt_t.len)
backbag = 2
age = rand(AGE_MIN,AGE_MAX)
if(H)

View File

@@ -22,6 +22,16 @@ If d1 = dir1 and d2 = dir2, it's a full X-X cable, getting from dir1 to dir2
By design, d1 is the smallest direction and d2 is the highest
*/
var/list/possible_cable_coil_colours = list(
"Yellow" = COLOR_YELLOW,
"Green" = COLOR_LIME,
"Pink" = COLOR_PINK,
"Blue" = COLOR_BLUE,
"Orange" = COLOR_ORANGE,
"Cyan" = COLOR_CYAN,
"Red" = COLOR_RED
)
/obj/structure/cable
level = 1
anchored =1
@@ -480,6 +490,7 @@ obj/structure/cable/proc/cableColor(var/colorC)
slot_flags = SLOT_BELT
item_state = "coil"
attack_verb = list("whipped", "lashed", "disciplined", "flogged")
stacktype = /obj/item/stack/cable_coil
/obj/item/stack/cable_coil/cyborg
name = "cable coil synthesizer"
@@ -488,7 +499,6 @@ obj/structure/cable/proc/cableColor(var/colorC)
matter = null
uses_charge = 1
charge_costs = list(1)
stacktype = /obj/item/stack/cable_coil
/obj/item/stack/cable_coil/suicide_act(mob/user)
if(locate(/obj/item/weapon/stool) in user.loc)
@@ -550,6 +560,17 @@ obj/structure/cable/proc/cableColor(var/colorC)
icon_state = "coil"
name = "cable coil"
/obj/item/stack/cable_coil/proc/set_cable_color(var/selected_color, var/user)
if(!selected_color)
return
var/final_color = possible_cable_coil_colours[selected_color]
if(!final_color)
final_color = possible_cable_coil_colours["Red"]
selected_color = "red"
color = final_color
user << "<span class='notice'>You change \the [src]'s color to [lowertext(selected_color)].</span>"
/obj/item/stack/cable_coil/proc/update_wclass()
if(amount == 1)
w_class = 1.0
@@ -590,26 +611,8 @@ obj/structure/cable/proc/cableColor(var/colorC)
set name = "Change Colour"
set category = "Object"
var/list/possible_colours = list ("Yellow", "Green", "Pink", "Blue", "Orange", "Cyan", "Red")
var/selected_type = input("Pick new colour.", "Cable Colour", null, null) as null|anything in possible_colours
if(selected_type)
switch(selected_type)
if("Yellow")
color = COLOR_YELLOW
if("Green")
color = COLOR_LIME
if("Pink")
color = COLOR_PINK
if("Blue")
color = COLOR_BLUE
if("Orange")
color = COLOR_ORANGE
if("Cyan")
color = COLOR_CYAN
else
color = COLOR_RED
usr << "You change your cable coil's colour to [selected_type]"
var/selected_type = input("Pick new colour.", "Cable Colour", null, null) as null|anything in possible_cable_coil_colours
set_cable_color(selected_type, usr)
// Items usable on a cable coil :
// - Wirecutters : cut them duh !

View File

@@ -156,55 +156,3 @@ obj/item/weapon/gun/energy/staff/focus
user << "<span class='warning'>The [src.name] will now strike only a single person.</span>"
projectile_type = "/obj/item/projectile/forcebolt"
*/
/* Adminbus guns */
// Serves as a target spotter for the Icarus.
/obj/item/weapon/gun/energy/icarus
name = "rubber ducky"
desc = "It's a cute rubber duck. With an evil gleam in it's eye."
projectile_type = /obj/item/projectile/icarus/pointdefense
icon = 'icons/obj/watercloset.dmi'
item_icons = null
icon_state = "rubberducky"
item_state = "rubberducky"
charge_cost = 0
silenced = 1
/obj/item/weapon/gun/energy/icarus/attack_self(mob/living/user as mob)
if(projectile_type == /obj/item/projectile/icarus/pointdefense)
projectile_type = /obj/item/projectile/icarus/guns
user << "You inform the Icarus to switch to the main guns."
else
projectile_type = /obj/item/projectile/icarus/pointdefense
user << "You inform the Icarus to switch to the point-defense lasers."
. = ..()
/obj/item/weapon/gun/energy/icarus/update_icon()
return
/obj/item/weapon/gun/energy/icarus/verb/SetIcarusAngle()
set src in usr
set name = "Set Firing Angle"
set desc = "Sets the angle from which the icarus will fire."
set category = "Object"
Icarus_SetPosition(usr)
/obj/item/weapon/gun/energy/variable
name = "abstract weapon"
desc = "It seems to shift and flow as you watch."
charge_cost = 0
silenced = 1
/obj/item/weapon/gun/energy/variable/update_icon()
return
/obj/item/weapon/gun/energy/variable/attack_self(mob/living/user as mob)
var/type = input(user,"What projectile type?","Projectile", null) as null|anything in typesof(/obj/item/projectile)
if(!type)
return ..()
projectile_type = type
. = ..()

View File

@@ -137,20 +137,6 @@
var/mob/living/carbon/human/M = target
M.adjustBrainLoss(20)
M.hallucination += 20
/obj/item/projectile/icarus/pointdefense/process()
Icarus_FireLaser(get_turf(original))
spawn
qdel(src)
return
/obj/item/projectile/icarus/guns/process()
Icarus_FireCannon(get_turf(original))
spawn
qdel(src)
return
/obj/item/projectile/chameleon
name = "bullet"
icon_state = "bullet"
@@ -159,3 +145,4 @@
nodamage = 1
damage_type = HALLOSS
muzzle_type = /obj/effect/projectile/bullet/muzzle

View File

@@ -206,5 +206,6 @@ var/global/list/map_count = list()
target_map.map[target_map.get_map_cell(tx+x,ty+y)] = map[current_cell]
handle_post_overlay_on(target_map,tx,ty)
/datum/random_map/proc/handle_post_overlay_on(var/datum/random_map/target_map, var/tx, var/ty)
return
return

View File

@@ -27,6 +27,7 @@
var/pillsprite = "1"
var/client/has_sprites = list()
var/max_pill_count = 20
flags = OPENCONTAINER
/obj/machinery/chem_master/New()
..()

View File

@@ -145,9 +145,15 @@
// mouse drop another mob or self
//
/obj/machinery/disposal/MouseDrop_T(mob/target, mob/user)
if (!istype(target) || target.buckled || get_dist(user, src) > 1 || get_dist(user, target) > 1 || user.stat || istype(user, /mob/living/silicon/ai))
if(user.stat || !user.canmove || !istype(target))
return
if(isanimal(user) && target != user) return //animals cannot put mobs other than themselves into disposal
if(target.buckled || get_dist(user, src) > 1 || get_dist(user, target) > 1)
return
//animals cannot put mobs other than themselves into disposal
if(isanimal(user) && target != user)
return
src.add_fingerprint(user)
var/target_loc = target.loc
var/msg
@@ -736,21 +742,25 @@
// expel the held objects into a turf
// called when there is a break in the pipe
//
proc/expel(var/obj/structure/disposalholder/H, var/turf/T, var/direction)
var/turf/target
if(T.density) // dense ouput turf, so stop holder
H.active = 0
H.loc = src
if(!istype(H))
return
// Empty the holder if it is expelled into a dense turf.
// Leaving it intact and sitting in a wall is stupid.
if(T.density)
for(var/atom/movable/AM in H)
AM.loc = T
AM.pipe_eject(0)
qdel(H)
return
if(!T.is_plating() && istype(T,/turf/simulated/floor)) //intact floor, pop the tile
var/turf/simulated/floor/F = T
F.break_tile()
new /obj/item/stack/tile(H) // add to holder so it will be thrown with other stuff
var/turf/target
if(direction) // direction is specified
if(istype(T, /turf/space)) // if ended in space, then range is unlimited
target = get_edge_target_turf(T, direction)

View File

@@ -744,12 +744,19 @@ CIRCUITS BELOW
desc = "Allows for the construction of \a [item_name] circuit board."
/datum/design/circuit/arcademachine
name = "arcade machine"
name = "battle arcade machine"
id = "arcademachine"
req_tech = list(TECH_DATA = 1)
build_path = /obj/item/weapon/circuitboard/arcade
build_path = /obj/item/weapon/circuitboard/arcade/battle
sort_string = "MAAAA"
/datum/design/circuit/oriontrail
name = "orion trail arcade machine"
id = "oriontrail"
req_tech = list(TECH_DATA = 1)
build_path = /obj/item/weapon/circuitboard/arcade/orion_trail
sort_string = "MABAA"
/datum/design/circuit/seccamera
name = "security camera monitor"
id = "seccamera"

View File

@@ -48,13 +48,15 @@
victim.verbs -= V
var/mob/dead/observer/ghost = victim.ghostize(0)
ghost.spell_list = victim.spell_list//If they have spells, transfer them. Now we basically have a backup mob.
ghost.spell_list += victim.spell_list//If they have spells, transfer them. Now we basically have a backup mob.
caster.mind.transfer_to(victim)
victim.spell_list = list() //clear those out
for(var/spell/S in caster.spell_list)
victim.add_spell(S) //Now they are inside the victim's body - this also generates the HUD
caster.spell_list = list() //clean that out as well
for(var/spell/S in victim.spell_list) //get rid of spells the new way
victim.remove_spell(S) //This will make it so that players will not get the HUD and all that spell bugginess that caused copies of spells and stuff of that nature.
for(var/spell/S in caster.spell_list)
victim.add_spell(S) //Now they are inside the victim's body - this also generates the HUD
caster.remove_spell(S) //remove the spells from the caster
if(victim.mind.special_verbs.len)//To add all the special verbs for the original caster.
for(var/V in caster.mind.special_verbs)//Not too important but could come into play.
@@ -62,9 +64,9 @@
ghost.mind.transfer_to(caster)
caster.key = ghost.key //have to transfer the key since the mind was not active
for(var/spell/S in ghost.spell_list)
caster.add_spell(S)
ghost.spell_list = list()
for(var/spell/S in ghost.spell_list)
caster.add_spell(S)
ghost.spell_list = list()
if(caster.mind.special_verbs.len)//If they had any special verbs, we add them here.
for(var/V in caster.mind.special_verbs)
@@ -76,4 +78,4 @@
//After a certain amount of time the victim gets a message about being in a different body.
spawn(msg_wait)
caster << "<span class='danger'>You feel woozy and lightheaded. Your body doesn't seem like your own.</span>"
caster << "<span class='danger'>You feel woozy and lightheaded. Your body doesn't seem like your own.</span>"