mirror of
https://github.com/Aurorastation/Aurora.3.git
synced 2025-12-23 16:42:13 +00:00
Merge remote-tracking branch 'upstream/dev' into 151210-TapeTape
Conflicts: code/__defines/misc.dm
This commit is contained in:
37
code/modules/acting/acting_items.dm
Normal file
37
code/modules/acting/acting_items.dm
Normal 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
|
||||
@@ -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
|
||||
)
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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]
|
||||
@@ -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)
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
126
code/modules/games/boardgame.dm
Normal file
126
code/modules/games/boardgame.dm
Normal 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;'> "
|
||||
|
||||
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"
|
||||
30
code/modules/games/cardemon.dm
Normal file
30
code/modules/games/cardemon.dm
Normal 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
|
||||
@@ -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)
|
||||
|
||||
23
code/modules/games/spaceball_cards.dm
Normal file
23
code/modules/games/spaceball_cards.dm
Normal 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
|
||||
39
code/modules/games/tarot.dm
Normal file
39
code/modules/games/tarot.dm
Normal 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].")
|
||||
@@ -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]")
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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 ..()
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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>"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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 !
|
||||
|
||||
@@ -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
|
||||
. = ..()
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -27,6 +27,7 @@
|
||||
var/pillsprite = "1"
|
||||
var/client/has_sprites = list()
|
||||
var/max_pill_count = 20
|
||||
flags = OPENCONTAINER
|
||||
|
||||
/obj/machinery/chem_master/New()
|
||||
..()
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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>"
|
||||
|
||||
Reference in New Issue
Block a user