Merge branch 'master' of https://github.com/tgstation/-tg-station into dalawisfluid

Conflicts:
	code/game/objects/items/weapons/AI_modules.dm
	code/modules/research/designs.dm
	maps/tgstation.2.1.2.dmm
This commit is contained in:
Miauw
2014-01-07 18:18:59 +01:00
380 changed files with 6099 additions and 6002 deletions
+174
View File
@@ -0,0 +1,174 @@
/tg/station 13 v1.0 - 6 October 2010
Website: http://ss13.eu
Code: https://github.com/tgstation/-tg-station
IRC: irc://irc.rizon.net/coderbus
# DOWNLOADING
There are a number of ways to download the source code. Some are described here, an alternative all-inclusive guide is also located at http://wiki.ss13.eu/index.php/Downloading_the_source_code
Option 1: Download the source code as a zip by clicking the ZIP button in the
code tab of https://github.com/tgstation/-tg-station
(note: this will use a lot of bandwidth if you wish to update and is a lot of
hassle if you want to make any changes at all, so it's not recommended.)
(Options 2/3): Install Git-scm from here first: http://git-scm.com/download/win
Option 2:
Install GitHub::windows from http://windows.github.com/
It handles most of the setup and configuraton of Git for you.
Then you simply search for the -tg-station repository and click the big clone
button.
Option 3:
Follow this: http://wiki.ss13.eu/index.php/Setting_up_git
(It's recommended that you use git-scm, as above, rather than the git CLI
suggested by the guide)
#INSTALLATION
First-time installation should be fairly straightforward. First, you'll need
BYOND installed. You can get it from http://www.byond.com/. Once you've done
that, extract the game files to wherever you want to keep them. This is a
sourcecode-only release, so the next step is to compile the server files.
Open tgstation.dme by double-clicking it, open the Build menu, and click
compile. This'll take a little while, and if everything's done right you'll get
a message like this:
```
saving tgstation.dmb (DEBUG mode)
tgstation.dmb - 0 errors, 0 warnings
```
If you see any errors or warnings, something has gone wrong - possibly a corrupt
download or the files extracted wrong. If problems persist, ask for assistance
in irc://irc.rizon.net/coderbus
Once that's done, open up the config folder. You'll want to edit config.txt to
set the probabilities for different gamemodes in Secret and to set your server
location so that all your players don't get disconnected at the end of each
round. It's recommended you don't turn on the gamemodes with probability 0,
except Extended, as they have various issues and aren't currently being tested,
so they may have unknown and bizarre bugs. Extended is essentially no mode, and
isn't in the Secret rotation by default as it's just not very fun.
You'll also want to edit config/admins.txt to remove the default admins and add
your own. "Game Master" is the highest level of access, and probably the one
you'll want to use for now. You can set up your own ranks and find out more in
config/admin_ranks.txt
The format is
```
byondkey = Rank
```
where the admin rank must be properly capitalised.
Finally, to start the server, run Dream Daemon and enter the path to your
compiled tgstation.dmb file. Make sure to set the port to the one you
specified in the config.txt, and set the Security box to 'Safe'. Then press GO
and the server should start up and be ready to join.
#UPDATING
To update an existing installation, first back up your /config and /data folders
as these store your server configuration, player preferences and banlist.
Then, extract the new files (preferably into a clean directory, but updating in
place should work fine), copy your /config and /data folders back into the new
install, overwriting when prompted except if we've specified otherwise, and
recompile the game. Once you start the server up again, you should be running
the new version.
#SQL SETUP
The SQL backend for the library and stats tracking requires a
MySQL server. Your server details go in /config/dbconfig.txt, and the SQL
schema is in /SQL/tgstation_schema.sql. More detailed setup instructions are located here: http://wiki.ss13.eu/index.php/Downloading_the_source_code#Setting_up_the_database
#IRC BOT SETUP
Included in the SVN is an IRC bot capable of relaying adminhelps to a specified
IRC channel/server (thanks to Skibiliano).
Instructions for bot setup are included in the /bot folder along with the script
itself
#CONTRIBUTING
Everyone is free to contribute to this project as long as they follow these simple guidelines and specifications.
**Introduction**
As a goal to increase code maintainability we are going to be requiring all pull requests to hold up to the standards mentioned below. This is in order for all of us to benefit, instead of having to fix the same bug more than once because of duplicated code.
But first we want to make it clear over what powers the maintainers have over your pull request, so you do not get any surprises when submitting pull requests and it is closed for a reason you did not suspect.
Maintainers are quality control. If a proposed pull request does not meet the mentioned quality specifications then it can be closed if you fail to satisfy them. Maintainers are required to give a reason for closing the pull request.
Maintainers can revert your changes if they feel they are not worth maintaining or if they did not live up to the quality specifications.
Headcoders, which are elected by the maintainers and members of the project, have complete control over what goes through and what is reverted. They are encouraged to take control in what features are added to the game. It is encouraged that if you do not want to waste time working on a feature, that might be denied, that you ask a head coder first.
**Specification**
As BYOND's Dream Maker is an object oriented language, code must be object oriented when possible in order to be more flexible when adding content to it.
You must write BYOND code with absolute pathing, like so:
```DM
/obj/item/weapon/baseball_bat
name = "baseball bat"
desc = "A baseball bat."
var/wooden = 1
/obj/item/weapon/baseball_bat/examine()
if(wooden)
desc = "A wooden baseball bat."
else
desc = "A metal baseball bat."
..()
```
You must not use colons to override safety checks on an object's variable/function, instead of using proper type casting.
It is rarely allowed to put type paths in a text format, as they is no compile errors if the type path no longer exists.
You must use tabs to indent your code.
Hacky code, such as adding specific checks, is highly discouraged and only allowed when there is no other option. You can avoid hacky code by using object oriented methodologies, such as overriding a function (called procs in DM) or sectioning code into functions and then overriding them as required.
Duplicated code is 99% of the time never allowed. Copying code from one place to another maybe suitable for small short time projects but /tg/station focuses on the long term and thus discourages this. Instead you can use object orientation, or simply placing repeated code in a function, to obey this specification easily.
Code should be modular where possible, if you are working on a new class then it is best if you put it in a new file.
Bloated code may be necessary to add a certain feature, which means there has to be a judgement over whether the feature is worth having or not. You can help make this decision easier by making sure your code is modular.
You are expected to help maintain the code that you add, meaning if there is a problem then you are likely to be approached in order to fix any issues, runtimes or bugs.
**Other Requirements/Information**
Pull requests will sometimes take a while before they are looked at by a maintainer, the bigger the change the more time it will take before they are accepted into the code.
You are expected to document all your changes in the pull request, failing to do so will risk delaying it. On the other hand you can speed up the process by making the pull request readable and easy to understand, with diagrams or before/after data.
If you are proposing multiple changes, which change many different aspects of the code, you are to section them off into different pull requests in order to easily review them and to deny/accept the changes that are deemed acceptable.
If your pull request is accepted, the code you add is no longer yours but everyones, everyone is free to work on it but you are also free to object to any changes being made, which will be noted by a headcoder.
**Getting Started**
We have a [list of guides on the wiki](http://wiki.ss13.eu/index.php/Guides#Development_and_Contribution_Guides) which will help you get started contributing to /tg/station with git and Dream Maker.
For beginners, it is recommended you work on small projects, at first. There is an easy list of issues which are [contributor friendly, here](https://github.com/tgstation/-tg-station/issues?labels=Contributor+Friendly&page=1&state=open).
#LICENSE
All code is under a GNU GPL v3 license (http://www.gnu.org/licenses/gpl.html),
including tools unless their readme specifies otherwise.
All content including icons and sound is under a Creative Commons 3.0 BY-SA
license (http://creativecommons.org/licenses/by-sa/3.0/).
-112
View File
@@ -1,112 +0,0 @@
/tg/station 13 v1.0 - 6 October 2010
Website: http://ss13.eu
Code: https://github.com/tgstation/-tg-station
IRC: irc://irc.rizon.net/coderbus
================================================================================
DOWNLOADING
================================================================================
There are a number of ways to download the source code. Some are described here, an alternative all-inclusive guide is also located at http://wiki.ss13.eu/index.php/Downloading_the_source_code
Option 1: Download the source code as a zip by clicking the ZIP button in the
code tab of https://github.com/tgstation/-tg-station
(note: this will use a lot of bandwidth if you wish to update and is a lot of
hassle if you want to make any changes at all, so it's not recommended.)
(Options 2/3): Install Git-scm from here first: http://git-scm.com/download/win
Option 2:
Install GitHub::windows from http://windows.github.com/
It handles most of the setup and configuraton of Git for you.
Then you simply search for the -tg-station repository and click the big clone
button.
Option 3:
Follow this: http://wiki.ss13.eu/index.php/Setting_up_git
(It's recommended that you use git-scm, as above, rather than the git CLI
suggested by the guide)
================================================================================
INSTALLATION
================================================================================
First-time installation should be fairly straightforward. First, you'll need
BYOND installed. You can get it from http://www.byond.com/. Once you've done
that, extract the game files to wherever you want to keep them. This is a
sourcecode-only release, so the next step is to compile the server files.
Open tgstation.dme by double-clicking it, open the Build menu, and click
compile. This'll take a little while, and if everything's done right you'll get
a message like this:
saving tgstation.dmb (DEBUG mode)
tgstation.dmb - 0 errors, 0 warnings
If you see any errors or warnings, something has gone wrong - possibly a corrupt
download or the files extracted wrong. If problems persist, ask for assistance
in irc://irc.rizon.net/coderbus
Once that's done, open up the config folder. You'll want to edit config.txt to
set the probabilities for different gamemodes in Secret and to set your server
location so that all your players don't get disconnected at the end of each
round. It's recommended you don't turn on the gamemodes with probability 0,
except Extended, as they have various issues and aren't currently being tested,
so they may have unknown and bizarre bugs. Extended is essentially no mode, and
isn't in the Secret rotation by default as it's just not very fun.
You'll also want to edit config/admins.txt to remove the default admins and add
your own. "Game Master" is the highest level of access, and probably the one
you'll want to use for now. You can set up your own ranks and find out more in
config/admin_ranks.txt
The format is
byondkey = Rank
where the admin rank must be properly capitalised.
Finally, to start the server, run Dream Daemon and enter the path to your
compiled tgstation.dmb file. Make sure to set the port to the one you
specified in the config.txt, and set the Security box to 'Safe'. Then press GO
and the server should start up and be ready to join.
================================================================================
UPDATING
================================================================================
To update an existing installation, first back up your /config and /data folders
as these store your server configuration, player preferences and banlist.
Then, extract the new files (preferably into a clean directory, but updating in
place should work fine), copy your /config and /data folders back into the new
install, overwriting when prompted except if we've specified otherwise, and
recompile the game. Once you start the server up again, you should be running
the new version.
================================================================================
SQL SETUP
================================================================================
The SQL backend for the library and stats tracking requires a
MySQL server. Your server details go in /config/dbconfig.txt, and the SQL
schema is in /SQL/tgstation_schema.sql. More detailed setup instructions are located here: http://wiki.ss13.eu/index.php/Downloading_the_source_code#Setting_up_the_database
================================================================================
IRC BOT SETUP
================================================================================
Included in the SVN is an IRC bot capable of relaying adminhelps to a specified
IRC channel/server (thanks to Skibiliano).
Instructions for bot setup are included in the /bot folder along with the script
itself
================================================================================
LICENSE
================================================================================
All code is under a GNU GPL v3 license (http://www.gnu.org/licenses/gpl.html),
including tools unless their readme specifies otherwise.
All content including icons and sound is under a Creative Commons 3.0 BY-SA
license (http://creativecommons.org/licenses/by-sa/3.0/).
-8
View File
@@ -312,11 +312,3 @@ obj/machinery/atmospherics/valve
close()
else
open()
attackby(var/obj/item/weapon/W as obj, var/mob/user as mob)
if (!istype(W, /obj/item/weapon/wrench))
return ..()
if (istype(src, /obj/machinery/atmospherics/valve/digital))
user << "\red You cannot unwrench this [src], it's too complicated."
return 1
return ..()
+27 -14
View File
@@ -32,16 +32,22 @@ datum/controller/air_system
if(kill_air)
return 1
for(var/i=0,i<speed,i++)
current_cycle++
process_active_turfs()
process_excited_groups()
process_high_pressure_delta()
process_hotspots()
process_super_conductivity()
if(speed > 1)
for(var/i=0,i<speed,i++)
spawn((10/speed)*i)
process_air()
else
process_air()
return 1
/datum/controller/air_system/proc/process_air()
current_cycle++
process_active_turfs()
process_excited_groups()
process_high_pressure_delta()
process_hotspots()
process_super_conductivity()
/datum/controller/air_system/proc/process_hotspots()
for(var/obj/effect/hotspot/H in hotspots)
H.process()
@@ -200,14 +206,21 @@ turf/CanPass(atom/movable/mover, turf/target, height=1.5,air_group=0)
T.atmos_adjacent_turfs &= ~counterdir
/atom/movable/proc/air_update_turf(var/command = 0)
if(istype(loc,/turf))
for(var/turf/T in locs) // used by double wide doors and other nonexistant multitile structures
if(command)
T.CalculateAdjacentTurfs()
if(air_master)
air_master.add_to_active(T,command)
if(!istype(loc,/turf) && command)
return
for(var/turf/T in locs) // used by double wide doors and other nonexistant multitile structures
T.air_update_turf(command)
/turf/proc/air_update_turf(var/command = 0)
if(command)
CalculateAdjacentTurfs()
if(air_master)
air_master.add_to_active(src,command)
/atom/movable/proc/move_update_air(var/turf/T)
if(istype(T,/turf))
T.air_update_turf(1)
air_update_turf(1)
/atom/movable/proc/atmos_spawn_air(var/text, var/amount) //because a lot of people loves to copy paste awful code lets just make a easy proc to spawn your plasma fires
var/turf/simulated/T = get_turf(src)
+10 -1
View File
@@ -42,7 +42,16 @@
return heard
/proc/alone_in_area(var/area/the_area, var/mob/must_be_alone, var/check_type = /mob/living/carbon)
var/area/our_area = get_area_master(the_area)
for(var/C in living_mob_list)
if(!istype(C, check_type))
continue
if(C == must_be_alone)
continue
if(our_area == get_area_master(C))
return 0
return 1
//Magic constants obtained by using linear regression on right-angled triangles of sides 0<x<1, 0<y<1
+2 -2
View File
@@ -81,8 +81,8 @@ Proc for attack log creation, because really why not
proc/add_logs(mob/user, mob/target, what_done, var/admin=1, var/object=null, var/addition=null)
if(user && ismob(user))
user.attack_log += text("\[[time_stamp()]\] <font color='red'>Has [what_done] [target ? "[target.name][target.ckey ? "([target.ckey])" : ""]" : "NON-EXISTANT SUBJECT"][object ? " with [object]" : " "][addition]</font>")
user.attack_log += text("\[[time_stamp()]\] <font color='red'>Has [what_done] [target ? "[target.name][(ismob(target) && target.ckey) ? "([target.ckey])" : ""]" : "NON-EXISTANT SUBJECT"][object ? " with [object]" : " "][addition]</font>")
if(target && ismob(target))
target.attack_log += text("\[[time_stamp()]\] <font color='orange'>Has been [what_done] by [user ? "[user.name][user.ckey ? "([user.ckey])" : ""]" : "NON-EXISTANT SUBJECT"][object ? " with [object]" : " "][addition]</font>")
target.attack_log += text("\[[time_stamp()]\] <font color='orange'>Has been [what_done] by [user ? "[user.name][(ismob(user) && user.ckey) ? "([user.ckey])" : ""]" : "NON-EXISTANT SUBJECT"][object ? " with [object]" : " "][addition]</font>")
if(admin)
log_attack("<font color='red'>[user ? "[user.name][(ismob(user) && user.ckey) ? "([user.ckey])" : ""]" : "NON-EXISTANT SUBJECT"] [what_done] [target ? "[target.name][(ismob(target) && target.ckey)? "([target.ckey])" : ""]" : "NON-EXISTANT SUBJECT"][object ? " with [object]" : " "][addition]</font>")
+64 -67
View File
@@ -9,99 +9,96 @@
"1:2,3:4" is the square (1,3) with pixel offsets (+2, +4); slightly right and slightly above the turf grid.
Pixel offsets are used so you don't perfectly hide the turf under them, that would be crappy.
In addition, the keywords NORTH, SOUTH, EAST, WEST and CENTER can be used to represent their respective
screen borders. NORTH-1, for example, is the row just below the upper edge. Useful if you want your
UI to scale with screen size.
The size of the user's screen is defined by client.view (indirectly by world.view), in our case "15x15".
Therefore, the top right corner (except during admin shenanigans) is at "15,15"
*/
//Upper left action buttons, displayed when you pick up an item that has this enabled.
#define ui_action_slot1 "1:6,14:26"
#define ui_action_slot2 "2:8,14:26"
#define ui_action_slot3 "3:10,14:26"
#define ui_action_slot4 "4:12,14:26"
#define ui_action_slot5 "5:14,14:26"
#define ui_action_slot1 "WEST :6, NORTH-1:26"
#define ui_action_slot2 "WEST+1:8, NORTH-1:26"
#define ui_action_slot3 "WEST+2:10,NORTH-1:26"
#define ui_action_slot4 "WEST+3:12,NORTH-1:26"
#define ui_action_slot5 "WEST+4:14,NORTH-1:26"
//Lower left, persistant menu
#define ui_inventory "1:6,1:5"
#define ui_inventory "WEST:6,SOUTH:5"
//Middle left indicators
#define ui_alienplasmadisplay "14:28,8:13"
#define ui_lingchemdisplay "1,7:15"
#define ui_lingchemdisplay "WEST:6,CENTER-1:15"
#define ui_lingstingdisplay "WEST:6,CENTER-3:11"
//Lower center, persistant menu
#define ui_sstore1 "3:10,1:5"
#define ui_id "4:12,1:5"
#define ui_belt "5:14,1:5"
#define ui_back "6:14,1:5"
#define ui_rhand "7:16,1:5"
#define ui_lhand "8:16,1:5"
#define ui_equip "7:16,2:5"
#define ui_swaphand1 "7:16,2:5"
#define ui_swaphand2 "8:16,2:5"
#define ui_storage1 "9:18,1:5"
#define ui_storage2 "10:20,1:5"
#define ui_sstore1 "CENTER-5:10,SOUTH:5"
#define ui_id "CENTER-4:12,SOUTH:5"
#define ui_belt "CENTER-3:14,SOUTH:5"
#define ui_back "CENTER-2:14,SOUTH:5"
#define ui_rhand "CENTER:-16,SOUTH:5"
#define ui_lhand "CENTER: 16,SOUTH:5"
#define ui_equip "CENTER:-16,SOUTH+1:5"
#define ui_swaphand1 "CENTER:-16,SOUTH+1:5"
#define ui_swaphand2 "CENTER: 16,SOUTH+1:5"
#define ui_storage1 "CENTER+1:18,SOUTH:5"
#define ui_storage2 "CENTER+2:20,SOUTH:5"
#define ui_inv1 "6:16,1:5" //borgs
#define ui_inv2 "7:16,1:5" //borgs
#define ui_inv3 "8:16,1:5" //borgs
#define ui_borg_store "9:16,1:5" //borgs
#define ui_inv1 "CENTER-2:16,SOUTH:5" //borgs
#define ui_inv2 "CENTER-1 :16,SOUTH:5" //borgs
#define ui_inv3 "CENTER :16,SOUTH:5" //borgs
#define ui_borg_store "CENTER+1:16,SOUTH:5" //borgs
#define ui_monkey_mask "5:14,1:5" //monkey
#define ui_monkey_back "6:15,1:5" //monkey
#define ui_monkey_mask "CENTER-3:14,SOUTH:5" //monkey
#define ui_monkey_back "CENTER-2:15,SOUTH:5" //monkey
#define ui_alien_storage_l "6:14,1:5"
#define ui_alien_storage_r "9:18,1:5"
#define ui_alien_storage_l "CENTER-2:14,SOUTH:5"//alien
#define ui_alien_storage_r "CENTER+1:18,SOUTH:5"//alien
//Lower right, persistant menu
#define ui_drop_throw "14:28,2:7"
#define ui_pull_resist "13:26,2:7"
#define ui_movi "13:26,1:5"
#define ui_acti "12:24,1:5"
#define ui_zonesel "14:28,1:5"
#define ui_acti_alt "14:28,1:5" //alternative intent switcher for when the interface is hidden (F12)
#define ui_drop_throw "EAST-1:28,SOUTH+1:7"
#define ui_pull_resist "EAST-2:26,SOUTH+1:7"
#define ui_movi "EAST-2:26,SOUTH:5"
#define ui_acti "EAST-3:24,SOUTH:5"
#define ui_zonesel "EAST-1:28,SOUTH:5"
#define ui_acti_alt "EAST-1:28,SOUTH:5" //alternative intent switcher for when the interface is hidden (F12)
#define ui_borg_pull "12:24,2:7"
#define ui_borg_module "13:26,2:7"
#define ui_borg_panel "14:28,2:7"
#define ui_borg_pull "EAST-3:24,SOUTH+1:7"
#define ui_borg_module "EAST-2:26,SOUTH+1:7"
#define ui_borg_panel "EAST-1:28,SOUTH+1:7"
//Upper-middle right (damage indicators)
#define ui_toxin "14:28,13:27"
#define ui_fire "14:28,12:25"
#define ui_oxygen "14:28,11:23"
#define ui_pressure "14:28,10:21"
#define ui_toxin "EAST-1:28,CENTER+5:27"
#define ui_fire "EAST-1:28,CENTER+4:25"
#define ui_oxygen "EAST-1:28,CENTER+3:23"
#define ui_pressure "EAST-1:28,CENTER+2:21"
#define ui_alien_toxin "14:28,13:25"
#define ui_alien_fire "14:28,12:25"
#define ui_alien_oxygen "14:28,11:25"
#define ui_alien_toxin "EAST-1:28,CENTER+5:25"
#define ui_alien_fire "EAST-1:28,CENTER+4:25"
#define ui_alien_oxygen "EAST-1:28,CENTER+3:25"
//Middle right (status indicators)
#define ui_nutrition "14:28,5:11"
#define ui_temp "14:28,6:13"
#define ui_health "14:28,7:15"
#define ui_internal "14:28,8:17"
//borgs
#define ui_borg_health "14:28,6:13" //borgs have the health display where humans have the pressure damage indicator.
#define ui_alien_health "14:28,6:13" //aliens have the health display where humans have the pressure damage indicator.
#define ui_nutrition "EAST-1:28,CENTER-3:11"
#define ui_temp "EAST-1:28,CENTER-2:13"
#define ui_health "EAST-1:28,CENTER-1:15"
#define ui_internal "EAST-1:28,CENTER:17"
//borgs and aliens
#define ui_borg_health "EAST-1:28,CENTER-1:15" //borgs have the health display where humans have the pressure damage indicator.
#define ui_alien_health "EAST-1:28,CENTER-1:15" //aliens have the health display where humans have the pressure damage indicator.
#define ui_alienplasmadisplay "EAST-1:28,CENTER-2:15"
//Pop-up inventory
#define ui_shoes "2:8,1:5"
#define ui_shoes "WEST+1:8,SOUTH:5"
#define ui_iclothing "1:6,2:7"
#define ui_oclothing "2:8,2:7"
#define ui_gloves "3:10,2:7"
#define ui_iclothing "WEST:6,SOUTH+1:7"
#define ui_oclothing "WEST+1:8,SOUTH+1:7"
#define ui_gloves "WEST+2:10,SOUTH+1:7"
#define ui_glasses "1:6,3:9"
#define ui_mask "2:8,3:9"
#define ui_ears "3:10,3:9"
#define ui_glasses "WEST:6,SOUTH+2:9"
#define ui_mask "WEST+1:8,SOUTH+2:9"
#define ui_ears "WEST+2:10,SOUTH+2:9"
#define ui_head "2:8,4:11"
#define ui_hand "6:14,1:5"
#define ui_hstore1 "5,5"
#define ui_sleep "EAST+1, NORTH-13"
#define ui_rest "EAST+1, NORTH-14"
#define ui_head "WEST+1:8,SOUTH+3:11"
#define ui_iarrowleft "SOUTH-1,11"
#define ui_iarrowright "SOUTH-1,13"
#define ui_lingstingdisplay "1,6:15"
+2 -2
View File
@@ -151,14 +151,14 @@
mymob.blind.icon = 'icons/mob/screen_full.dmi'
mymob.blind.icon_state = "blackimageoverlay"
mymob.blind.name = " "
mymob.blind.screen_loc = "1,1"
mymob.blind.screen_loc = "CENTER-7,CENTER-7"
mymob.blind.layer = 0
mymob.flash = new /obj/screen()
mymob.flash.icon = 'icons/mob/screen_alien.dmi'
mymob.flash.icon_state = "blank"
mymob.flash.name = "flash"
mymob.flash.screen_loc = "1,1 to 15,15"
mymob.flash.screen_loc = "WEST,SOUTH to EAST,NORTH"
mymob.flash.layer = 17
mymob.zone_sel = new /obj/screen/zone_sel/alien()
+2 -2
View File
@@ -57,14 +57,14 @@
mymob.blind.icon = 'icons/mob/screen_full.dmi'
mymob.blind.icon_state = "blackimageoverlay"
mymob.blind.name = " "
mymob.blind.screen_loc = "1,1"
mymob.blind.screen_loc = "CENTER-7,CENTER-7"
mymob.blind.layer = 0
mymob.flash = new /obj/screen()
mymob.flash.icon = 'icons/mob/screen_alien.dmi'
mymob.flash.icon_state = "blank"
mymob.flash.name = "flash"
mymob.flash.screen_loc = "1,1 to 15,15"
mymob.flash.screen_loc = "WEST,SOUTH to EAST,NORTH"
mymob.flash.layer = 17
mymob.zone_sel = new /obj/screen/zone_sel/alien()
+103 -57
View File
@@ -2,6 +2,12 @@
The global hud:
Uses the same visual objects for all players.
*/
#define HUD_VERSIONS 3 //used in show_hud()
//1 = standard hud
//2 = reduced hud (just hands and intent switcher)
//3 = no hud (for screenshots)
var/datum/global_hud/global_hud = new()
/datum/global_hud
@@ -30,32 +36,32 @@ var/datum/global_hud/global_hud = new()
//that nasty looking dither you get when you're short-sighted
vimpaired = newlist(/obj/screen,/obj/screen,/obj/screen,/obj/screen)
O = vimpaired[1]
O.screen_loc = "1,1 to 5,15"
O.screen_loc = "WEST,SOUTH to CENTER-3,NORTH" //West dither
O = vimpaired[2]
O.screen_loc = "5,1 to 10,5"
O.screen_loc = "WEST,SOUTH to EAST,CENTER-3" //South dither
O = vimpaired[3]
O.screen_loc = "6,11 to 10,15"
O.screen_loc = "CENTER+3,SOUTH to EAST,NORTH" //East dither
O = vimpaired[4]
O.screen_loc = "11,1 to 15,15"
O.screen_loc = "WEST,CENTER+3 to EAST,NORTH" //North dither
//welding mask overlay black/dither
darkMask = newlist(/obj/screen, /obj/screen, /obj/screen, /obj/screen, /obj/screen, /obj/screen, /obj/screen, /obj/screen)
O = darkMask[1]
O.screen_loc = "3,3 to 5,13"
O.screen_loc = "CENTER-5,CENTER-5 to CENTER-3,CENTER+5" //West dither
O = darkMask[2]
O.screen_loc = "5,3 to 10,5"
O.screen_loc = "CENTER-5,CENTER-5 to CENTER+5,CENTER-3" //South dither
O = darkMask[3]
O.screen_loc = "6,11 to 10,13"
O.screen_loc = "CENTER+3,CENTER-5 to CENTER+5,CENTER+5" //East dither
O = darkMask[4]
O.screen_loc = "11,3 to 13,13"
O.screen_loc = "CENTER-5,CENTER+3 to CENTER+5,CENTER+5" //North dither
O = darkMask[5]
O.screen_loc = "1,1 to 15,2"
O.screen_loc = "WEST,SOUTH to CENTER-5,NORTH" //West black
O = darkMask[6]
O.screen_loc = "1,3 to 2,15"
O.screen_loc = "WEST,SOUTH to EAST,CENTER-5" //South black
O = darkMask[7]
O.screen_loc = "14,3 to 15,15"
O.screen_loc = "CENTER+5,SOUTH to EAST,NORTH" //East black
O = darkMask[8]
O.screen_loc = "3,14 to 13,15"
O.screen_loc = "WEST,CENTER+5 to EAST,NORTH" //North black
for(i = 1, i <= 4, i++)
O = vimpaired[i]
@@ -84,6 +90,7 @@ var/datum/global_hud/global_hud = new()
var/mob/mymob
var/hud_shown = 1 //Used for the HUD toggle (F12)
var/hud_version = 1 //Current displayed version of the HUD
var/inventory_shown = 1 //the inventory
var/show_intent_icons = 0
var/hotkey_ui_hidden = 0 //This is to hide the buttons that can be used via hotkeys. (hotkeybuttons list of buttons)
@@ -189,57 +196,99 @@ datum/hud/New(mob/owner)
blob_hud()
if(istype(mymob.loc,/obj/mecha))
hide_hud()
show_hud(1)
/datum/hud/proc/hide_hud() // hide hands is not currently used by anything but could be
//Version denotes which style should be displayed. blank or 0 means "next version"
/datum/hud/proc/show_hud(var/version = 0)
if(!ismob(mymob))
return 0
if(!mymob.client)
return 0
if(hud_shown)
hud_shown = 0
if(adding)
mymob.client.screen -= adding
if(other)
mymob.client.screen -= other
if(hotkeybuttons)
mymob.client.screen -= hotkeybuttons
if(item_action_list)
mymob.client.screen -= item_action_list
var/display_hud_version = version
if(!display_hud_version) //If 0 or blank, display the next hud version
display_hud_version = hud_version + 1
if(display_hud_version > HUD_VERSIONS) //If the requested version number is greater than the available versions, reset back to the first version
display_hud_version = 1
//These ones are not a part of 'adding', 'other' or 'hotkeybuttons' but we want them gone.
mymob.client.screen -= mymob.zone_sel //zone_sel is a mob variable for some reason.
switch(display_hud_version)
if(1) //Default HUD
hud_shown = 1 //Governs behavior of other procs
if(adding)
mymob.client.screen += adding
if(other && inventory_shown)
mymob.client.screen += other
if(hotkeybuttons && !hotkey_ui_hidden)
mymob.client.screen += hotkeybuttons
//These ones are a part of 'adding', 'other' or 'hotkeybuttons' but we want them to stay
mymob.client.screen += l_hand_hud_object //we want the hands to be visible
mymob.client.screen += r_hand_hud_object //we want the hands to be visible
mymob.client.screen += action_intent //we want the intent swticher visible
action_intent.screen_loc = ui_acti_alt //move this to the alternative position, where zone_select usually is.
action_intent.screen_loc = ui_acti //Restore intent selection to the original position
mymob.client.screen += mymob.zone_sel //This one is a special snowflake
mymob.client.screen += mymob.bodytemp //As are the rest of these...
mymob.client.screen += mymob.fire
mymob.client.screen += mymob.healths
mymob.client.screen += mymob.internals
mymob.client.screen += mymob.nutrition_icon
mymob.client.screen += mymob.oxygen
mymob.client.screen += mymob.pressure
mymob.client.screen += mymob.toxin
mymob.client.screen += lingstingdisplay
mymob.client.screen += lingchemdisplay
hidden_inventory_update()
persistant_inventory_update()
mymob.update_action_buttons()
hidden_inventory_update()
persistant_inventory_update()
mymob.update_action_buttons()
if(2) //Reduced HUD
hud_shown = 0 //Governs behavior of other procs
if(adding)
mymob.client.screen -= adding
if(other)
mymob.client.screen -= other
if(hotkeybuttons)
mymob.client.screen -= hotkeybuttons
if(item_action_list)
mymob.client.screen -= item_action_list
/datum/hud/proc/show_hud()
if(!ismob(mymob))
return 0
if(!mymob.client)
return 0
if(!hud_shown)
hud_shown = 1
if(adding)
mymob.client.screen += adding
if(other && inventory_shown)
mymob.client.screen += other
if(hotkeybuttons && !hotkey_ui_hidden)
mymob.client.screen += hotkeybuttons
//These ones are not a part of 'adding', 'other' or 'hotkeybuttons' but we want them gone.
mymob.client.screen -= mymob.zone_sel //zone_sel is a mob variable for some reason.
mymob.client.screen -= lingstingdisplay
mymob.client.screen -= lingchemdisplay
action_intent.screen_loc = ui_acti //Restore intent selection to the original position
mymob.client.screen += mymob.zone_sel //This one is a special snowflake
hidden_inventory_update()
persistant_inventory_update()
mymob.update_action_buttons()
//These ones are a part of 'adding', 'other' or 'hotkeybuttons' but we want them to stay
mymob.client.screen += l_hand_hud_object //we want the hands to be visible
mymob.client.screen += r_hand_hud_object //we want the hands to be visible
mymob.client.screen += action_intent //we want the intent swticher visible
action_intent.screen_loc = ui_acti_alt //move this to the alternative position, where zone_select usually is.
hidden_inventory_update()
persistant_inventory_update()
mymob.update_action_buttons()
if(3) //No HUD
hud_shown = 0 //Governs behavior of other procs
if(adding)
mymob.client.screen -= adding
if(other)
mymob.client.screen -= other
if(hotkeybuttons)
mymob.client.screen -= hotkeybuttons
if(item_action_list)
mymob.client.screen -= item_action_list
//These ones are not a part of 'adding', 'other' or 'hotkeybuttons' but we want them gone.
mymob.client.screen -= mymob.zone_sel //zone_sel is a mob variable for some reason.
mymob.client.screen -= mymob.bodytemp
mymob.client.screen -= mymob.fire
mymob.client.screen -= mymob.healths
mymob.client.screen -= mymob.internals
mymob.client.screen -= mymob.nutrition_icon
mymob.client.screen -= mymob.oxygen
mymob.client.screen -= mymob.pressure
mymob.client.screen -= mymob.toxin
mymob.client.screen -= lingstingdisplay
mymob.client.screen -= lingchemdisplay
hidden_inventory_update()
persistant_inventory_update()
mymob.update_action_buttons()
hud_version = display_hud_version
//Triggered when F12 is pressed (Unless someone changed something in the DMF)
/mob/verb/button_pressed_F12()
@@ -248,10 +297,7 @@ datum/hud/New(mob/owner)
if(hud_used && client)
if(ishuman(src))
if(hud_used.hud_shown)
hud_used.hide_hud()
else
hud_used.show_hud()
hud_used.show_hud() //Shows the next hud preset
else
usr << "\red Inventory hiding is currently only supported for human mobs, sorry."
else
+4 -4
View File
@@ -292,7 +292,7 @@
mymob.blind.icon = 'icons/mob/screen_full.dmi'
mymob.blind.icon_state = "blackimageoverlay"
mymob.blind.name = " "
mymob.blind.screen_loc = "1,1"
mymob.blind.screen_loc = "CENTER-7,CENTER-7"
mymob.blind.mouse_opacity = 0
mymob.blind.layer = 0
@@ -300,14 +300,14 @@
mymob.damageoverlay.icon = 'icons/mob/screen_full.dmi'
mymob.damageoverlay.icon_state = "oxydamageoverlay0"
mymob.damageoverlay.name = "dmg"
mymob.damageoverlay.screen_loc = "1,1"
mymob.damageoverlay.screen_loc = "CENTER-7,CENTER-7"
mymob.damageoverlay.mouse_opacity = 0
mymob.damageoverlay.layer = 18.1 //The black screen overlay sets layer to 18 to display it, this one has to be just on top.
mymob.flash = new /obj/screen()
mymob.flash.icon_state = "blank"
mymob.flash.name = "flash"
mymob.flash.screen_loc = "1,1 to 15,15"
mymob.flash.screen_loc = "WEST,SOUTH to EAST,NORTH"
mymob.flash.layer = 17
mymob.zone_sel = new /obj/screen/zone_sel()
@@ -339,7 +339,7 @@
if(!hud_used) return
if(!client) return
if(!hud_used.hud_shown) //Hud toggled to minimal
if(hud_used.hud_shown != 1) //Hud toggled to minimal
return
client.screen -= hud_used.item_action_list
+11 -3
View File
@@ -152,14 +152,14 @@
mymob.blind.icon = 'icons/mob/screen_full.dmi'
mymob.blind.icon_state = "blackimageoverlay"
mymob.blind.name = " "
mymob.blind.screen_loc = "1,1"
mymob.blind.screen_loc = "CENTER-7,CENTER-7"
mymob.blind.layer = 0
mymob.flash = new /obj/screen()
mymob.flash.icon = ui_style
mymob.flash.icon_state = "blank"
mymob.flash.name = "flash"
mymob.flash.screen_loc = "1,1 to 15,15"
mymob.flash.screen_loc = "WEST,SOUTH to EAST,NORTH"
mymob.flash.layer = 17
mymob.zone_sel = new /obj/screen/zone_sel()
@@ -168,5 +168,13 @@
mymob.client.screen = null
using = new /obj/screen()
using.name = "resist"
using.icon = ui_style
using.icon_state = "act_resist"
using.screen_loc = ui_pull_resist
using.layer = 19
adding += using
mymob.client.screen += list( mymob.throw_icon, mymob.zone_sel, mymob.oxygen, mymob.pressure, mymob.toxin, mymob.bodytemp, mymob.internals, mymob.fire, mymob.healths, mymob.pullin, mymob.blind, mymob.flash, lingchemdisplay, lingstingdisplay) //, mymob.hands, mymob.rest, mymob.sleep, mymob.mach )
mymob.client.screen += adding + other
mymob.client.screen += adding + other
+1 -1
View File
@@ -10,7 +10,7 @@
mymob.blind.icon = 'icons/mob/screen_full.dmi'
mymob.blind.icon_state = "blackimageoverlay"
mymob.blind.name = " "
mymob.blind.screen_loc = "1,1"
mymob.blind.screen_loc = "CENTER-7,CENTER-7"
mymob.blind.layer = 0
/datum/hud/proc/ai_hud()
+2 -2
View File
@@ -121,14 +121,14 @@
mymob.blind.icon = 'icons/mob/screen_full.dmi'
mymob.blind.icon_state = "blackimageoverlay"
mymob.blind.name = " "
mymob.blind.screen_loc = "1,1"
mymob.blind.screen_loc = "CENTER-7,CENTER-7"
mymob.blind.layer = 0
mymob.flash = new /obj/screen()
mymob.flash.icon = 'icons/mob/screen_cyborg.dmi'
mymob.flash.icon_state = "blank"
mymob.flash.name = "flash"
mymob.flash.screen_loc = "1,1 to 15,15"
mymob.flash.screen_loc = "WEST,SOUTH to EAST,NORTH"
mymob.flash.layer = 17
mymob.zone_sel = new /obj/screen/zone_sel()
+1 -1
View File
@@ -35,7 +35,7 @@
user.lastattacked = M
M.lastattacker = user
add_logs(user, M, "attacked", src.name, "(INTENT: [uppertext(user.a_intent)]) (DAMTYE: [uppertext(damtype)])")
add_logs(user, M, "attacked", object=src.name, addition="(INTENT: [uppertext(user.a_intent)]) (DAMTYE: [uppertext(damtype)])")
//spawn(1800) // this wont work right
// M.lastattacker = null
+1 -1
View File
@@ -158,7 +158,7 @@ datum/shuttle_controller
captain_announce("The Emergency Shuttle has left the station. Estimate [round(timeleft()/60,1)] minutes until the shuttle docks at Central Command.")
else if(location == TRANSIT)
move_shuttles()
message_admins("Shuttles have attempted to move to Centcom")
//message_admins("Shuttles have attempted to move to Centcom")
location = ENDGAME
online = 0
endtime = null
+347 -343
View File
@@ -1,4 +1,3 @@
// reference: /client/proc/modify_variables(var/atom/O, var/param_var_name = null, var/autodetect_class = 0)
client
@@ -402,56 +401,14 @@ client
//This should all be moved over to datum/admins/Topic() or something ~Carn
if( (usr.client != src) || !src.holder )
return
if(!check_rights(R_VAREDIT))
return
if(href_list["Vars"])
debug_variables(locate(href_list["Vars"]))
//~CARN: for renaming mobs (updates their name, real_name, mind.name, their ID/PDA and datacore records).
else if(href_list["rename"])
if(!check_rights(0)) return
var/mob/M = locate(href_list["rename"])
if(!istype(M))
usr << "This can only be used on instances of type /mob"
if(href_list["datumrefresh"])
var/datum/DAT = locate(href_list["datumrefresh"])
if(!istype(DAT, /datum))
return
var/new_name = copytext(sanitize(input(usr,"What would you like to name this mob?","Input a name",M.real_name) as text|null),1,MAX_NAME_LEN)
if( !new_name || !M ) return
message_admins("Admin [key_name_admin(usr)] renamed [key_name_admin(M)] to [new_name].")
M.fully_replace_character_name(M.real_name,new_name)
href_list["datumrefresh"] = href_list["rename"]
else if(href_list["varnameedit"] && href_list["datumedit"])
if(!check_rights(0)) return
var/D = locate(href_list["datumedit"])
if(!istype(D,/datum) && !istype(D,/client))
usr << "This can only be used on instances of types /client or /datum"
return
modify_variables(D, href_list["varnameedit"], 1)
else if(href_list["varnamechange"] && href_list["datumchange"])
if(!check_rights(0)) return
var/D = locate(href_list["datumchange"])
if(!istype(D,/datum) && !istype(D,/client))
usr << "This can only be used on instances of types /client or /datum"
return
modify_variables(D, href_list["varnamechange"], 0)
else if(href_list["varnamemass"] && href_list["datummass"])
if(!check_rights(0)) return
var/atom/A = locate(href_list["datummass"])
if(!istype(A))
usr << "This can only be used on instances of type /atom"
return
cmd_mass_modify_object_variables(A, href_list["varnamemass"])
src.debug_variables(DAT)
else if(href_list["mob_player_panel"])
if(!check_rights(0)) return
@@ -464,39 +421,6 @@ client
src.holder.show_player_panel(M)
href_list["datumrefresh"] = href_list["mob_player_panel"]
else if(href_list["give_spell"])
if(!check_rights(0)) return
var/mob/M = locate(href_list["give_spell"])
if(!istype(M))
usr << "This can only be used on instances of type /mob"
return
src.give_spell(M)
href_list["datumrefresh"] = href_list["give_spell"]
else if(href_list["give_disease"])
if(!check_rights(0)) return
var/mob/M = locate(href_list["give_disease"])
if(!istype(M))
usr << "This can only be used on instances of type /mob"
return
src.give_disease(M)
href_list["datumrefresh"] = href_list["give_spell"]
else if(href_list["ninja"])
if(!check_rights(0)) return
var/mob/M = locate(href_list["ninja"])
if(!istype(M))
usr << "This can only be used on instances of type /mob"
return
src.cmd_admin_ninjafy(M)
href_list["datumrefresh"] = href_list["ninja"]
else if(href_list["godmode"])
if(!check_rights(R_REJUVINATE)) return
@@ -508,125 +432,6 @@ client
src.cmd_admin_godmode(M)
href_list["datumrefresh"] = href_list["godmode"]
else if(href_list["gib"])
if(!check_rights(0)) return
var/mob/M = locate(href_list["gib"])
if(!istype(M))
usr << "This can only be used on instances of type /mob"
return
src.cmd_admin_gib(M)
else if(href_list["build_mode"])
if(!check_rights(R_BUILDMODE)) return
var/mob/M = locate(href_list["build_mode"])
if(!istype(M))
usr << "This can only be used on instances of type /mob"
return
togglebuildmode(M)
href_list["datumrefresh"] = href_list["build_mode"]
else if(href_list["drop_everything"])
if(!check_rights(0)) return
var/mob/M = locate(href_list["drop_everything"])
if(!istype(M))
usr << "This can only be used on instances of type /mob"
return
if(usr.client)
usr.client.cmd_admin_drop_everything(M)
else if(href_list["direct_control"])
if(!check_rights(0)) return
var/mob/M = locate(href_list["direct_control"])
if(!istype(M))
usr << "This can only be used on instances of type /mob"
return
if(usr.client)
usr.client.cmd_assume_direct_control(M)
else if(href_list["make_skeleton"])
if(!check_rights(0)) return
var/mob/living/carbon/human/H = locate(href_list["make_skeleton"])
if(!istype(H))
usr << "This can only be used on instances of type /mob/living/carbon/human"
return
H.makeSkeleton()
href_list["datumrefresh"] = href_list["make_skeleton"]
else if(href_list["delall"])
if(!check_rights(R_DEBUG|R_SERVER)) return
var/obj/O = locate(href_list["delall"])
if(!isobj(O))
usr << "This can only be used on instances of type /obj"
return
var/action_type = alert("Strict type ([O.type]) or type and all subtypes?",,"Strict type","Type and subtypes","Cancel")
if(action_type == "Cancel" || !action_type)
return
if(alert("Are you really sure you want to delete all objects of type [O.type]?",,"Yes","No") != "Yes")
return
if(alert("Second confirmation required. Delete?",,"Yes","No") != "Yes")
return
var/O_type = O.type
switch(action_type)
if("Strict type")
var/i = 0
for(var/obj/Obj in world)
if(Obj.type == O_type)
i++
del(Obj)
if(!i)
usr << "No objects of this type exist"
return
log_admin("[key_name(usr)] deleted all objects of type [O_type] ([i] objects deleted) ")
message_admins("\blue [key_name(usr)] deleted all objects of type [O_type] ([i] objects deleted) ")
if("Type and subtypes")
var/i = 0
for(var/obj/Obj in world)
if(istype(Obj,O_type))
i++
del(Obj)
if(!i)
usr << "No objects of this type exist"
return
log_admin("[key_name(usr)] deleted all objects of type or subtype of [O_type] ([i] objects deleted) ")
message_admins("\blue [key_name(usr)] deleted all objects of type or subtype of [O_type] ([i] objects deleted) ")
else if(href_list["explode"])
if(!check_rights(0)) return
var/atom/A = locate(href_list["explode"])
if(!isobj(A) && !ismob(A) && !isturf(A))
usr << "This can only be done to instances of type /obj, /mob and /turf"
return
src.cmd_admin_explosion(A)
href_list["datumrefresh"] = href_list["explode"]
else if(href_list["emp"])
if(!check_rights(0)) return
var/atom/A = locate(href_list["emp"])
if(!isobj(A) && !ismob(A) && !isturf(A))
usr << "This can only be done to instances of type /obj, /mob and /turf"
return
src.cmd_admin_emp(A)
href_list["datumrefresh"] = href_list["emp"]
else if(href_list["mark_object"])
if(!check_rights(0)) return
@@ -638,123 +443,6 @@ client
src.holder.marked_datum = D
href_list["datumrefresh"] = href_list["mark_object"]
else if(href_list["rotatedatum"])
if(!check_rights(0)) return
var/atom/A = locate(href_list["rotatedatum"])
if(!istype(A))
usr << "This can only be done to instances of type /atom"
return
switch(href_list["rotatedir"])
if("right") A.dir = turn(A.dir, -45)
if("left") A.dir = turn(A.dir, 45)
href_list["datumrefresh"] = href_list["rotatedatum"]
else if(href_list["makehuman"])
if(!check_rights(0)) return
var/mob/living/carbon/monkey/Mo = locate(href_list["makehuman"])
if(!istype(Mo))
usr << "This can only be done to instances of type /mob/living/carbon/monkey"
return
if(alert("Confirm mob type change?",,"Transform","Cancel") != "Transform") return
if(!Mo)
usr << "Mob doesn't exist anymore"
return
holder.Topic(href, list("humanone"=href_list["makehuman"]))
else if(href_list["makemonkey"])
if(!check_rights(0)) return
var/mob/living/carbon/human/H = locate(href_list["makemonkey"])
if(!istype(H))
usr << "This can only be done to instances of type /mob/living/carbon/human"
return
if(alert("Confirm mob type change?",,"Transform","Cancel") != "Transform") return
if(!H)
usr << "Mob doesn't exist anymore"
return
holder.Topic(href, list("monkeyone"=href_list["makemonkey"]))
else if(href_list["makerobot"])
if(!check_rights(0)) return
var/mob/living/carbon/human/H = locate(href_list["makerobot"])
if(!istype(H))
usr << "This can only be done to instances of type /mob/living/carbon/human"
return
if(alert("Confirm mob type change?",,"Transform","Cancel") != "Transform") return
if(!H)
usr << "Mob doesn't exist anymore"
return
holder.Topic(href, list("makerobot"=href_list["makerobot"]))
else if(href_list["makealien"])
if(!check_rights(0)) return
var/mob/living/carbon/human/H = locate(href_list["makealien"])
if(!istype(H))
usr << "This can only be done to instances of type /mob/living/carbon/human"
return
if(alert("Confirm mob type change?",,"Transform","Cancel") != "Transform") return
if(!H)
usr << "Mob doesn't exist anymore"
return
holder.Topic(href, list("makealien"=href_list["makealien"]))
else if(href_list["makeslime"])
if(!check_rights(0)) return
var/mob/living/carbon/human/H = locate(href_list["makeslime"])
if(!istype(H))
usr << "This can only be done to instances of type /mob/living/carbon/human"
return
if(alert("Confirm mob type change?",,"Transform","Cancel") != "Transform") return
if(!H)
usr << "Mob doesn't exist anymore"
return
holder.Topic(href, list("makeslime"=href_list["makeslime"]))
else if(href_list["makeai"])
if(!check_rights(0)) return
var/mob/living/carbon/human/H = locate(href_list["makeai"])
if(!istype(H))
usr << "This can only be done to instances of type /mob/living/carbon/human"
return
if(alert("Confirm mob type change?",,"Transform","Cancel") != "Transform") return
if(!H)
usr << "Mob doesn't exist anymore"
return
holder.Topic(href, list("makeai"=href_list["makeai"]))
else if(href_list["setmutantrace"])
if(!check_rights(0)) return
var/mob/living/carbon/human/H = locate(href_list["setmutantrace"])
if(!istype(H))
usr << "This can only be done to instances of type /mob/living/carbon/human"
return
var/new_mutantrace = input("Please choose a new mutantrace","Mutantrace",null) as null|anything in list("NONE","golem","lizard","slime","plant","shadow", "fly", "skeleton")
switch(new_mutantrace)
if(null) return
if("NONE") new_mutantrace = ""
if(!H)
usr << "Mob doesn't exist anymore"
return
if(H.dna)
H.dna.mutantrace = new_mutantrace
H.update_body()
H.update_hair()
else if(href_list["regenerateicons"])
if(!check_rights(0)) return
@@ -764,41 +452,357 @@ client
return
M.regenerate_icons()
else if(href_list["adjustDamage"] && href_list["mobToDamage"])
if(!check_rights(0)) return
//Needs +VAREDIT past this point
var/mob/living/L = locate(href_list["mobToDamage"])
if(!istype(L)) return
else if(check_rights(R_VAREDIT))
var/Text = href_list["adjustDamage"]
var/amount = input("Deal how much damage to mob? (Negative values here heal)","Adjust [Text]loss",0) as num
//~CARN: for renaming mobs (updates their name, real_name, mind.name, their ID/PDA and datacore records).
if(!L)
usr << "Mob doesn't exist anymore"
return
if(href_list["rename"])
if(!check_rights(0)) return
switch(Text)
if("brute") L.adjustBruteLoss(amount)
if("fire") L.adjustFireLoss(amount)
if("toxin") L.adjustToxLoss(amount)
if("oxygen")L.adjustOxyLoss(amount)
if("brain") L.adjustBrainLoss(amount)
if("clone") L.adjustCloneLoss(amount)
else
usr << "You caused an error. DEBUG: Text:[Text] Mob:[L]"
var/mob/M = locate(href_list["rename"])
if(!istype(M))
usr << "This can only be used on instances of type /mob"
return
if(amount != 0)
log_admin("[key_name(usr)] dealt [amount] amount of [Text] damage to [L] ")
message_admins("\blue [key_name(usr)] dealt [amount] amount of [Text] damage to [L] ")
href_list["datumrefresh"] = href_list["mobToDamage"]
var/new_name = copytext(sanitize(input(usr,"What would you like to name this mob?","Input a name",M.real_name) as text|null),1,MAX_NAME_LEN)
if( !new_name || !M ) return
message_admins("Admin [key_name_admin(usr)] renamed [key_name_admin(M)] to [new_name].")
M.fully_replace_character_name(M.real_name,new_name)
href_list["datumrefresh"] = href_list["rename"]
else if(href_list["varnameedit"] && href_list["datumedit"])
if(!check_rights(0)) return
var/D = locate(href_list["datumedit"])
if(!istype(D,/datum) && !istype(D,/client))
usr << "This can only be used on instances of types /client or /datum"
return
modify_variables(D, href_list["varnameedit"], 1)
else if(href_list["varnamechange"] && href_list["datumchange"])
if(!check_rights(0)) return
var/D = locate(href_list["datumchange"])
if(!istype(D,/datum) && !istype(D,/client))
usr << "This can only be used on instances of types /client or /datum"
return
modify_variables(D, href_list["varnamechange"], 0)
else if(href_list["varnamemass"] && href_list["datummass"])
if(!check_rights(0)) return
var/atom/A = locate(href_list["datummass"])
if(!istype(A))
usr << "This can only be used on instances of type /atom"
return
cmd_mass_modify_object_variables(A, href_list["varnamemass"])
else if(href_list["give_spell"])
if(!check_rights(0)) return
var/mob/M = locate(href_list["give_spell"])
if(!istype(M))
usr << "This can only be used on instances of type /mob"
return
src.give_spell(M)
href_list["datumrefresh"] = href_list["give_spell"]
else if(href_list["give_disease"])
if(!check_rights(0)) return
var/mob/M = locate(href_list["give_disease"])
if(!istype(M))
usr << "This can only be used on instances of type /mob"
return
src.give_disease(M)
href_list["datumrefresh"] = href_list["give_spell"]
else if(href_list["ninja"])
if(!check_rights(R_FUN)) return
var/mob/M = locate(href_list["ninja"])
if(!istype(M))
usr << "This can only be used on instances of type /mob"
return
src.cmd_admin_ninjafy(M)
href_list["datumrefresh"] = href_list["ninja"]
else if(href_list["gib"])
if(!check_rights(R_FUN)) return
var/mob/M = locate(href_list["gib"])
if(!istype(M))
usr << "This can only be used on instances of type /mob"
return
src.cmd_admin_gib(M)
else if(href_list["build_mode"])
if(!check_rights(R_BUILDMODE)) return
var/mob/M = locate(href_list["build_mode"])
if(!istype(M))
usr << "This can only be used on instances of type /mob"
return
togglebuildmode(M)
href_list["datumrefresh"] = href_list["build_mode"]
else if(href_list["drop_everything"])
if(!check_rights(0)) return
var/mob/M = locate(href_list["drop_everything"])
if(!istype(M))
usr << "This can only be used on instances of type /mob"
return
if(usr.client)
usr.client.cmd_admin_drop_everything(M)
else if(href_list["direct_control"])
if(!check_rights(0)) return
var/mob/M = locate(href_list["direct_control"])
if(!istype(M))
usr << "This can only be used on instances of type /mob"
return
if(usr.client)
usr.client.cmd_assume_direct_control(M)
else if(href_list["make_skeleton"])
if(!check_rights(R_FUN)) return
var/mob/living/carbon/human/H = locate(href_list["make_skeleton"])
if(!istype(H))
usr << "This can only be used on instances of type /mob/living/carbon/human"
return
H.makeSkeleton()
href_list["datumrefresh"] = href_list["make_skeleton"]
else if(href_list["delall"])
if(!check_rights(R_DEBUG|R_SERVER)) return
var/obj/O = locate(href_list["delall"])
if(!isobj(O))
usr << "This can only be used on instances of type /obj"
return
var/action_type = alert("Strict type ([O.type]) or type and all subtypes?",,"Strict type","Type and subtypes","Cancel")
if(action_type == "Cancel" || !action_type)
return
if(alert("Are you really sure you want to delete all objects of type [O.type]?",,"Yes","No") != "Yes")
return
if(alert("Second confirmation required. Delete?",,"Yes","No") != "Yes")
return
var/O_type = O.type
switch(action_type)
if("Strict type")
var/i = 0
for(var/obj/Obj in world)
if(Obj.type == O_type)
i++
del(Obj)
if(!i)
usr << "No objects of this type exist"
return
log_admin("[key_name(usr)] deleted all objects of type [O_type] ([i] objects deleted) ")
message_admins("\blue [key_name(usr)] deleted all objects of type [O_type] ([i] objects deleted) ")
if("Type and subtypes")
var/i = 0
for(var/obj/Obj in world)
if(istype(Obj,O_type))
i++
del(Obj)
if(!i)
usr << "No objects of this type exist"
return
log_admin("[key_name(usr)] deleted all objects of type or subtype of [O_type] ([i] objects deleted) ")
message_admins("\blue [key_name(usr)] deleted all objects of type or subtype of [O_type] ([i] objects deleted) ")
else if(href_list["explode"])
if(!check_rights(R_FUN)) return
var/atom/A = locate(href_list["explode"])
if(!isobj(A) && !ismob(A) && !isturf(A))
usr << "This can only be done to instances of type /obj, /mob and /turf"
return
src.cmd_admin_explosion(A)
href_list["datumrefresh"] = href_list["explode"]
else if(href_list["emp"])
if(!check_rights(R_FUN)) return
var/atom/A = locate(href_list["emp"])
if(!isobj(A) && !ismob(A) && !isturf(A))
usr << "This can only be done to instances of type /obj, /mob and /turf"
return
src.cmd_admin_emp(A)
href_list["datumrefresh"] = href_list["emp"]
else if(href_list["rotatedatum"])
if(!check_rights(0)) return
var/atom/A = locate(href_list["rotatedatum"])
if(!istype(A))
usr << "This can only be done to instances of type /atom"
return
switch(href_list["rotatedir"])
if("right") A.dir = turn(A.dir, -45)
if("left") A.dir = turn(A.dir, 45)
href_list["datumrefresh"] = href_list["rotatedatum"]
else if(href_list["makehuman"])
if(!check_rights(R_SPAWN)) return
var/mob/living/carbon/monkey/Mo = locate(href_list["makehuman"])
if(!istype(Mo))
usr << "This can only be done to instances of type /mob/living/carbon/monkey"
return
if(alert("Confirm mob type change?",,"Transform","Cancel") != "Transform") return
if(!Mo)
usr << "Mob doesn't exist anymore"
return
holder.Topic(href, list("humanone"=href_list["makehuman"]))
else if(href_list["makemonkey"])
if(!check_rights(R_SPAWN)) return
var/mob/living/carbon/human/H = locate(href_list["makemonkey"])
if(!istype(H))
usr << "This can only be done to instances of type /mob/living/carbon/human"
return
if(alert("Confirm mob type change?",,"Transform","Cancel") != "Transform") return
if(!H)
usr << "Mob doesn't exist anymore"
return
holder.Topic(href, list("monkeyone"=href_list["makemonkey"]))
else if(href_list["makerobot"])
if(!check_rights(R_SPAWN)) return
var/mob/living/carbon/human/H = locate(href_list["makerobot"])
if(!istype(H))
usr << "This can only be done to instances of type /mob/living/carbon/human"
return
if(alert("Confirm mob type change?",,"Transform","Cancel") != "Transform") return
if(!H)
usr << "Mob doesn't exist anymore"
return
holder.Topic(href, list("makerobot"=href_list["makerobot"]))
else if(href_list["makealien"])
if(!check_rights(R_SPAWN)) return
var/mob/living/carbon/human/H = locate(href_list["makealien"])
if(!istype(H))
usr << "This can only be done to instances of type /mob/living/carbon/human"
return
if(alert("Confirm mob type change?",,"Transform","Cancel") != "Transform") return
if(!H)
usr << "Mob doesn't exist anymore"
return
holder.Topic(href, list("makealien"=href_list["makealien"]))
else if(href_list["makeslime"])
if(!check_rights(R_SPAWN)) return
var/mob/living/carbon/human/H = locate(href_list["makeslime"])
if(!istype(H))
usr << "This can only be done to instances of type /mob/living/carbon/human"
return
if(alert("Confirm mob type change?",,"Transform","Cancel") != "Transform") return
if(!H)
usr << "Mob doesn't exist anymore"
return
holder.Topic(href, list("makeslime"=href_list["makeslime"]))
else if(href_list["makeai"])
if(!check_rights(R_SPAWN)) return
var/mob/living/carbon/human/H = locate(href_list["makeai"])
if(!istype(H))
usr << "This can only be done to instances of type /mob/living/carbon/human"
return
if(alert("Confirm mob type change?",,"Transform","Cancel") != "Transform") return
if(!H)
usr << "Mob doesn't exist anymore"
return
holder.Topic(href, list("makeai"=href_list["makeai"]))
else if(href_list["setmutantrace"])
if(!check_rights(R_SPAWN)) return
var/mob/living/carbon/human/H = locate(href_list["setmutantrace"])
if(!istype(H))
usr << "This can only be done to instances of type /mob/living/carbon/human"
return
var/new_mutantrace = input("Please choose a new mutantrace","Mutantrace",null) as null|anything in list("NONE","golem","lizard","slime","plant","shadow", "fly", "skeleton")
switch(new_mutantrace)
if(null) return
if("NONE") new_mutantrace = ""
if(!H)
usr << "Mob doesn't exist anymore"
return
if(H.dna)
H.dna.mutantrace = new_mutantrace
H.update_body()
H.update_hair()
else if(href_list["adjustDamage"] && href_list["mobToDamage"])
if(!check_rights(0)) return
var/mob/living/L = locate(href_list["mobToDamage"])
if(!istype(L)) return
var/Text = href_list["adjustDamage"]
var/amount = input("Deal how much damage to mob? (Negative values here heal)","Adjust [Text]loss",0) as num
if(!L)
usr << "Mob doesn't exist anymore"
return
switch(Text)
if("brute") L.adjustBruteLoss(amount)
if("fire") L.adjustFireLoss(amount)
if("toxin") L.adjustToxLoss(amount)
if("oxygen")L.adjustOxyLoss(amount)
if("brain") L.adjustBrainLoss(amount)
if("clone") L.adjustCloneLoss(amount)
else
usr << "You caused an error. DEBUG: Text:[Text] Mob:[L]"
return
if(amount != 0)
log_admin("[key_name(usr)] dealt [amount] amount of [Text] damage to [L] ")
message_admins("\blue [key_name(usr)] dealt [amount] amount of [Text] damage to [L] ")
href_list["datumrefresh"] = href_list["mobToDamage"]
if(href_list["datumrefresh"])
var/datum/DAT = locate(href_list["datumrefresh"])
if(!istype(DAT, /datum))
return
src.debug_variables(DAT)
return
@@ -35,9 +35,24 @@ Bonus
/datum/symptom/damage_converter/proc/Convert(var/mob/living/M)
if(M.getFireLoss() > 0 || M.getBruteLoss() > 0)
var/get_damage = rand(1, 2)
M.adjustFireLoss(-get_damage)
M.adjustBruteLoss(-get_damage)
M.adjustToxLoss(get_damage)
return 1
var/get_damage = rand(1, 2)
if(istype(M, /mob/living/carbon/human))
var/mob/living/carbon/human/H = M
var/parts = H.get_damaged_organs(1,1) //1,1 because it needs inputs.
for(var/obj/item/organ/limb/L in parts)
L.heal_damage(get_damage, get_damage, 0)
else
if(M.getFireLoss() > 0 || M.getBruteLoss() > 0)
M.adjustFireLoss(-get_damage)
M.adjustBruteLoss(-get_damage)
M.adjustToxLoss(get_damage)
return 1
+2 -2
View File
@@ -39,8 +39,8 @@
if(jobban_isbanned(affected_mob, new_form))
affected_mob.death(1)
return
if(affected_mob.monkeyizing) return
affected_mob.monkeyizing = 1
if(affected_mob.notransform) return
affected_mob.notransform = 1
affected_mob.canmove = 0
affected_mob.icon = null
affected_mob.overlays.Cut()
+1 -1
View File
@@ -783,7 +783,7 @@ datum/mind
else if (href_list["monkey"])
var/mob/living/L = current
if (L.monkeyizing)
if (L.notransform)
return
switch(href_list["monkey"])
if("healthy")
+20 -8
View File
@@ -6,6 +6,7 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin
/obj/effect/proc_holder/spell
name = "Spell"
desc = "A wizard spell"
panel = "Spells"
density = 0
opacity = 0
@@ -15,14 +16,17 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin
var/charge_max = 100 //recharge time in deciseconds if charge_type = "recharge" or starting charges if charge_type = "charges"
var/charge_counter = 0 //can only cast spells if it equals recharge, ++ each decisecond if charge_type = "recharge" or -- each cast if charge_type = "charges"
var/still_recharging_msg = "<span class='notice'>The spell is still recharging.</span>"
var/holder_var_type = "bruteloss" //only used if charge_type equals to "holder_var"
var/holder_var_amount = 20 //same. The amount adjusted with the mob's var when the spell is used
var/clothes_req = 1 //see if it requires clothes
var/human_req = 0 //spell can only be cast by humans
var/stat_allowed = 0 //see if it requires being conscious/alive, need to set to 1 for ghostpells
var/invocation = "HURP DURP" //what is uttered when the wizard casts the spell
var/invocation_type = "none" //can be none, whisper and shout
var/invocation_emote_self = null
var/invocation_type = "none" //can be none, whisper, emote and shout
var/range = 7 //the range of the spell; outer radius for aoe spells
var/message = "" //whatever it says to the guy affected by it
var/selection_type = "view" //can be "range" or "view"
@@ -56,7 +60,7 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin
switch(charge_type)
if("recharge")
if(charge_counter < charge_max)
user << "<span class='notice'>[name] is still recharging.</span>"
user << still_recharging_msg
return 0
if("charges")
if(!charge_counter)
@@ -86,7 +90,7 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin
H << "<span class='notice'>I don't feel strong enough without my hat.</span>"
return 0
else
if(clothes_req)
if(clothes_req || human_req)
user << "<span class='notice'>This spell can only be casted by humans!</span>"
return 0
@@ -113,10 +117,13 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin
user.whisper(invocation)
else
user.whisper(replacetext(invocation," ","`"))
if("emote")
user.visible_message(invocation, invocation_emote_self) //same style as in mob/living/emote.dm
/obj/effect/proc_holder/spell/New()
..()
still_recharging_msg = "<span class='notice'>[name] is still recharging.</span>"
charge_counter = charge_max
/obj/effect/proc_holder/spell/Click()
@@ -132,9 +139,10 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin
sleep(1)
charge_counter++
/obj/effect/proc_holder/spell/proc/perform(list/targets, recharge = 1) //if recharge is started is important for the trigger spells
/obj/effect/proc_holder/spell/proc/perform(list/targets, recharge = 1, mob/user = usr) //if recharge is started is important for the trigger spells
before_cast(targets)
invocation()
user.attack_log += text("\[[time_stamp()]\] <font color='red'>[user.real_name] ([user.ckey]) cast the spell [name].</font>")
spawn(0)
if(charge_type == "recharge" && recharge)
start_recharge()
@@ -176,11 +184,11 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin
if(smoke_spread)
if(smoke_spread == 1)
var/datum/effect/effect/system/harmless_smoke_spread/smoke = new /datum/effect/effect/system/harmless_smoke_spread()
smoke.set_up(smoke_amt, 0, location) //no idea what the 0 is
smoke.set_up(smoke_amt, 0, location, smoke_amt == 1 ? 15 : 0) // if more than one smoke, spread it around
smoke.start()
else if(smoke_spread == 2)
var/datum/effect/effect/system/bad_smoke_spread/smoke = new /datum/effect/effect/system/bad_smoke_spread()
smoke.set_up(smoke_amt, 0, location) //no idea what the 0 is
smoke.set_up(smoke_amt, 0, location, smoke_amt == 1 ? 15 : 0) // same here
smoke.start()
/obj/effect/proc_holder/spell/proc/cast(list/targets)
@@ -246,7 +254,11 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin
continue
possible_targets += M
targets += input("Choose the target for the spell.", "Targeting") as mob in possible_targets
//targets += input("Choose the target for the spell.", "Targeting") as mob in possible_targets
//Adds a safety check post-input to make sure those targets are actually in range.
var/mob/M = input("Choose the target for the spell.", "Targeting") as mob in possible_targets
if(M in view_or_range(range, user, selection_type)) targets += M
else
var/list/possible_targets = list()
for(var/mob/living/target in view_or_range(range, user, selection_type))
@@ -285,4 +297,4 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin
perform(targets)
return
return
+3
View File
@@ -48,6 +48,9 @@
I.max_charges = 0
burnt_out = 1
I.charges = I.max_charges
if(istype(item,/obj/item/weapon/gun/magic/wand) && I.max_charges != 0)
var/obj/item/weapon/gun/magic/W = item
W.icon_state = initial(W.icon_state)
charged_item = I
break
else if(istype(item, /obj/item/weapon/cell/))
+5 -2
View File
@@ -14,12 +14,15 @@
//should have format of list("emagged" = 1,"name" = "Wizard's Justicebot"), for example
var/delay = 1//Go Go Gadget Inheritance
var/cast_sound = 'sound/items/welder.ogg'
/obj/effect/proc_holder/spell/aoe_turf/conjure/cast(list/targets)
for(var/turf/T in targets)
if(T.density && !summon_ignore_density)
targets -= T
playsound(src.loc, 'sound/items/welder.ogg', 50, 1)
playsound(src.loc, cast_sound, 50, 1)
if(do_after(usr,delay))
for(var/i=0,i<summon_amt,i++)
@@ -64,4 +67,4 @@
summon_type = list(/obj/machinery/bot/ed209)
summon_amt = 10
range = 3
newVars = list("emagged" = 1,"name" = "Wizard's Justicebot")
newVars = list("emagged" = 2,"name" = "Wizard's Justicebot")
+12 -1
View File
@@ -83,10 +83,21 @@
invocation_type = "none"
range = -1
include_user = 1
phaseshift = 1
jaunt_duration = 50 //in deciseconds
centcom_cancast = 0 //Stop people from getting to centcom
/obj/effect/proc_holder/spell/targeted/ethereal_jaunt/shift/jaunt_disappear(var/atom/movable/overlay/animation, var/mob/living/target)
animation.icon_state = "phase_shift"
animation.dir = target.dir
flick("phase_shift",animation)
/obj/effect/proc_holder/spell/targeted/ethereal_jaunt/shift/jaunt_reappear(var/atom/movable/overlay/animation, var/mob/living/target)
animation.icon_state = "phase_shift2"
animation.dir = target.dir
flick("phase_shift2",animation)
/obj/effect/proc_holder/spell/targeted/ethereal_jaunt/shift/jaunt_steam(var/mobloc)
return
/obj/effect/proc_holder/spell/targeted/projectile/magic_missile/lesser
name = "Lesser Magic Missile"
+36 -52
View File
@@ -11,12 +11,11 @@
cooldown_min = 100 //50 deciseconds reduction per rank
include_user = 1
centcom_cancast = 0 //Prevent people from getting to centcom
var phaseshift = 0
var/jaunt_duration = 50 //in deciseconds
/obj/effect/proc_holder/spell/targeted/ethereal_jaunt/cast(list/targets) //magnets, so mostly hardcoded
for(var/mob/living/target in targets)
target.notransform = 1 //protects the mob from being transformed (replaced) midjaunt and getting stuck in bluespace
spawn(0)
var/mobloc = get_turf(target.loc)
var/obj/effect/dummy/spell_jaunt/holder = new /obj/effect/dummy/spell_jaunt( mobloc )
@@ -25,61 +24,46 @@
animation.density = 0
animation.anchored = 1
animation.icon = 'icons/mob/mob.dmi'
animation.icon_state = "liquify"
animation.layer = 5
animation.master = holder
target.ExtinguishMob()
if(target.buckled)
target.buckled.unbuckle()
if(phaseshift == 1)
animation.dir = target.dir
flick("phase_shift",animation)
target.loc = holder
sleep(jaunt_duration)
mobloc = get_turf(target.loc)
animation.loc = mobloc
target.canmove = 0
holder.reappearing = 1
sleep(20)
animation.dir = target.dir
flick("phase_shift2",animation)
sleep(5)
if(!target.Move(mobloc))
for(var/direction in list(1,2,4,8,5,6,9,10))
var/turf/T = get_step(mobloc, direction)
if(T)
if(target.Move(T))
break
target.canmove = 1
target.client.eye = target
del(animation)
del(holder)
else
flick("liquify",animation)
target.loc = holder
var/datum/effect/effect/system/steam_spread/steam = new /datum/effect/effect/system/steam_spread()
steam.set_up(10, 0, mobloc)
steam.start()
sleep(jaunt_duration)
mobloc = get_turf(target.loc)
animation.loc = mobloc
steam.location = mobloc
steam.start()
target.canmove = 0
holder.reappearing = 1
sleep(20)
flick("reappear",animation)
sleep(5)
if(!target.Move(mobloc))
for(var/direction in list(1,2,4,8,5,6,9,10))
var/turf/T = get_step(mobloc, direction)
if(T)
if(target.Move(T))
break
target.canmove = 1
target.client.eye = target
del(animation)
del(holder)
jaunt_disappear(animation, target)
target.loc = holder
target.notransform=0 //mob is safely inside holder now, no need for protection.
jaunt_steam(mobloc)
sleep(jaunt_duration)
mobloc = get_turf(target.loc)
animation.loc = mobloc
jaunt_steam(mobloc)
target.canmove = 0
holder.reappearing = 1
sleep(20)
jaunt_reappear(animation, target)
sleep(5)
if(!target.Move(mobloc))
for(var/direction in list(1,2,4,8,5,6,9,10))
var/turf/T = get_step(mobloc, direction)
if(T)
if(target.Move(T))
break
target.canmove = 1
target.client.eye = target
del(animation)
del(holder)
/obj/effect/proc_holder/spell/targeted/ethereal_jaunt/proc/jaunt_disappear(var/atom/movable/overlay/animation, var/mob/living/target)
animation.icon_state = "liquify"
flick("liquify",animation)
/obj/effect/proc_holder/spell/targeted/ethereal_jaunt/proc/jaunt_reappear(var/atom/movable/overlay/animation, var/mob/living/target)
flick("reappear",animation)
/obj/effect/proc_holder/spell/targeted/ethereal_jaunt/proc/jaunt_steam(var/mobloc)
var/datum/effect/effect/system/steam_spread/steam = new /datum/effect/effect/system/steam_spread()
steam.set_up(10, 0, mobloc)
steam.start()
/obj/effect/dummy/spell_jaunt
name = "water"
+53
View File
@@ -0,0 +1,53 @@
/obj/effect/proc_holder/spell/aoe_turf/conjure/mime_wall
name = "Invisible wall"
desc = "The mime's performance transmutates into physical reality."
school = "mime"
panel = "Mime"
summon_type = list(/obj/effect/forcefield/mime)
invocation_type = "emote"
invocation_emote_self = "<span class='notice'>You form a wall in front of yourself.</span>"
summon_lifespan = 300
charge_max = 300
clothes_req = 0
range = 0
cast_sound = null
/obj/effect/proc_holder/spell/aoe_turf/conjure/mime_wall/Click()
if(usr)
invocation = "<B>[usr.real_name]</B> looks as if a wall is in front of them."
else
invocation_type ="none"
..()
/obj/effect/proc_holder/spell/targeted/mime/speak
name = "Speech"
desc = "Make or break a vow of silence."
school = "mime"
panel = "Mime"
clothes_req = 0
human_req = 1
charge_max = 3000
range = -1
include_user = 1
/obj/effect/proc_holder/spell/targeted/mime/speak/Click()
if(!usr)
return
if(!ishuman(usr))
return
var/mob/living/carbon/human/H = usr
if(H.miming)
still_recharging_msg = "<span class='notice'>You can't break your vow of silence that fast!</span>"
else
still_recharging_msg = "<span class='notice'>You'll have to wait before you can give your vow of silence again.</span>"
..()
/obj/effect/proc_holder/spell/targeted/mime/speak/cast(list/targets)
for(var/mob/living/carbon/human/H in targets)
H.miming=!H.miming
if(H.miming)
H << "<span class='notice'>You make a vow of silence.</span>"
else
H << "<span class='notice'>You break your vow of silence.</span>"
+1 -6
View File
@@ -10,7 +10,6 @@
range = 1
cooldown_min = 200 //100 deciseconds reduction per rank
var/list/protected_roles = list("Wizard","Changeling","Cultist") //which roles are immune to the spell
var/list/compatible_mobs = list(/mob/living/carbon/human,/mob/living/carbon/monkey) //which types of mobs are affected by the spell. NOTE: change at your own risk
var/base_spell_loss_chance = 20 //base probability of the wizard losing a spell in the process
var/spell_loss_chance_modifier = 7 //amount of probability of losing a spell added per spell (mind_transfer included)
var/spell_loss_amount = 1 //the maximum amount of spells possible to lose during a single transfer
@@ -38,12 +37,8 @@ Also, you never added distance checking after target is selected. I've went ahea
user << "They are too far away!"
return
if(!(target.type in compatible_mobs))
user << "Their mind isn't compatible with yours."
return
if(target.stat == DEAD)
user << "You didn't study necromancy back at the Space Wizard Federation academy."
user << "You don't particularly want to be dead."
return
if(!target.key || !target.mind)
+2 -1
View File
@@ -31,4 +31,5 @@
if(!picked || !isturf(picked))
return
target.loc = picked
if(!target.Move(picked))
target.loc = picked
+1 -1
View File
@@ -107,7 +107,7 @@
smoke_spread = 1
smoke_amt = 10
smoke_amt = 1
inner_tele_radius = 0
outer_tele_radius = 6
+3 -1
View File
@@ -684,11 +684,13 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
cost = 50
containertype = /obj/structure/closet/critter/corgi
containername = "corgi crate"
/datum/supply_packs/organic/cat
name = "Cat crate"
cost = 40
cost = 50 //Cats are worth as much as corgis.
containertype = /obj/structure/closet/critter/cat
containername = "cat crate"
/datum/supply_packs/organic/pug
name = "Pug crate"
cost = 50
+2
View File
@@ -377,6 +377,7 @@ var/list/uplink_items = list()
You can wrench the bomb down to prevent removal. The crew may attempt to defuse the bomb."
item = /obj/item/device/sbeacondrop/bomb
cost = 5
excludefrom = list(/datum/game_mode/traitor/double_agents)
/datum/uplink_item/device_tools/syndicate_detonator
name = "Syndicate Detonator"
@@ -384,6 +385,7 @@ var/list/uplink_items = list()
Useful for when speed matters or you wish to synchronize multiple bomb blasts. Be sure to stand clear of the blast radius before using the detonator."
item = /obj/item/device/syndicatedetonator
cost = 1
gamemodes = list(/datum/game_mode/nuclear)
/datum/uplink_item/device_tools/teleporter
name = "Teleporter Circuit Board"
-4
View File
@@ -11,8 +11,6 @@ var/const/WIRE_ACTIVATE = 16 // Will start a bombs timer if pulsed, will hint if
/datum/wires/syndicatebomb/UpdatePulsed(var/index)
var/obj/machinery/syndicatebomb/P = holder
if(P.degutted)
return
switch(index)
if(WIRE_BOOM)
if (P.active)
@@ -49,8 +47,6 @@ var/const/WIRE_ACTIVATE = 16 // Will start a bombs timer if pulsed, will hint if
/datum/wires/syndicatebomb/UpdateCut(var/index, var/mended)
var/obj/machinery/syndicatebomb/P = holder
if(P.degutted)
return
switch(index)
if(WIRE_EXPLODE)
if(!mended)
-1
View File
@@ -75,7 +75,6 @@
throwforce = 0.0
throw_speed = 1
throw_range = 20
flags = FPRINT | TABLEPASS
afterattack(atom/target as mob|obj|turf|area, mob/user as mob)
user.drop_item()
src.throw_at(target, throw_range, throw_speed)
+17 -55
View File
@@ -3,7 +3,6 @@
desc = "Should anything ever go wrong..."
icon = 'icons/obj/items.dmi'
icon_state = "red_phone"
flags = FPRINT | TABLEPASS | CONDUCT
force = 3.0
throwforce = 2.0
throw_speed = 1
@@ -22,7 +21,6 @@
anchored = 0.0
var/matter = 0
var/mode = 1
flags = TABLEPASS
w_class = 3.0
/obj/item/weapon/spacecash
@@ -145,7 +143,6 @@
icon = 'icons/obj/weapons.dmi'
icon_state = "cane"
item_state = "stick"
flags = FPRINT | TABLEPASS| CONDUCT
force = 5.0
throwforce = 7.0
w_class = 2.0
@@ -182,7 +179,7 @@
gender = PLURAL
icon = 'icons/obj/items.dmi'
icon_state = "handcuff"
flags = FPRINT | TABLEPASS | CONDUCT
flags = CONDUCT
throwforce = 0
w_class = 3.0
origin_tech = "materials=1"
@@ -241,7 +238,6 @@
throw_speed = 1
throw_range = 5
w_class = 2.0
flags = FPRINT | TABLEPASS
attack_verb = list("warned", "cautioned", "smashed")
/obj/item/weapon/caution/cone
@@ -254,48 +250,9 @@
desc = "Parts of a rack."
icon = 'icons/obj/items.dmi'
icon_state = "rack_parts"
flags = FPRINT | TABLEPASS| CONDUCT
flags = CONDUCT
m_amt = 3750
/*/obj/item/weapon/syndicate_uplink
name = "station bounced radio"
desc = "Remain silent about this..."
icon = 'icons/obj/radio.dmi'
icon_state = "radio"
var/temp = null
var/uses = 10.0
var/selfdestruct = 0.0
var/traitor_frequency = 0.0
var/mob/currentUser = null
var/obj/item/device/radio/origradio = null
flags = FPRINT | TABLEPASS | CONDUCT | ONBELT
w_class = 2.0
item_state = "radio"
throw_speed = 4
throw_range = 20
m_amt = 100
origin_tech = "magnets=2;syndicate=3"*/
/obj/item/weapon/SWF_uplink
name = "station-bounced radio"
desc = "used to comunicate it appears."
icon = 'icons/obj/radio.dmi'
icon_state = "radio"
var/temp = null
var/uses = 4.0
var/selfdestruct = 0.0
var/traitor_frequency = 0.0
var/obj/item/device/radio/origradio = null
flags = FPRINT | TABLEPASS| CONDUCT
slot_flags = SLOT_BELT
item_state = "radio"
throwforce = 5
w_class = 2.0
throw_speed = 4
throw_range = 20
m_amt = 100
origin_tech = "magnets=1"
/obj/item/weapon/staff
name = "wizards staff"
desc = "Apparently a staff used by the wizard."
@@ -306,7 +263,7 @@
throw_speed = 1
throw_range = 5
w_class = 2.0
flags = FPRINT | TABLEPASS | NOSHIELD
flags = NOSHIELD
attack_verb = list("bludgeoned", "whacked", "disciplined")
/obj/item/weapon/staff/broom
@@ -326,7 +283,7 @@
throw_speed = 1
throw_range = 5
w_class = 2.0
flags = FPRINT | TABLEPASS | NOSHIELD
flags = NOSHIELD
/obj/item/weapon/table_parts
name = "table parts"
@@ -335,7 +292,7 @@
icon = 'icons/obj/items.dmi'
icon_state = "table_parts"
m_amt = 3750
flags = FPRINT | TABLEPASS| CONDUCT
flags = CONDUCT
attack_verb = list("slammed", "bashed", "battered", "bludgeoned", "thrashed", "whacked")
/obj/item/weapon/table_parts/reinforced
@@ -344,7 +301,7 @@
icon = 'icons/obj/items.dmi'
icon_state = "reinf_tableparts"
m_amt = 7500
flags = FPRINT | TABLEPASS| CONDUCT
flags = CONDUCT
/obj/item/weapon/table_parts/wood
name = "wooden table parts"
@@ -352,13 +309,18 @@
icon_state = "wood_tableparts"
flags = null
/obj/item/weapon/table_parts/wood/poker
name = "poker table parts"
desc = "Keep away from fire, and keep near seedy dealers."
icon_state = "poker_tableparts"
flags = null
/obj/item/weapon/module
icon = 'icons/obj/module.dmi'
icon_state = "std_module"
w_class = 2.0
item_state = "electronic"
flags = FPRINT|TABLEPASS|CONDUCT
var/mtype = 1 // 1=electronic 2=hardware
flags = CONDUCT
/obj/item/weapon/module/card_reader
name = "card reader module"
@@ -390,7 +352,7 @@
desc = "Meat that appears...strange..."
icon = 'icons/obj/food.dmi'
icon_state = "meat"
flags = FPRINT | TABLEPASS | CONDUCT
flags = CONDUCT
w_class = 1.0
origin_tech = "biotech=2"
@@ -399,7 +361,7 @@
desc = "A very sharp axe blade upon a short fibremetal handle. It has a long history of chopping things, but now it is used for chopping wood."
icon = 'icons/obj/weapons.dmi'
icon_state = "hatchet"
flags = FPRINT | TABLEPASS | CONDUCT
flags = CONDUCT
force = 12.0
w_class = 1.0
throwforce = 15.0
@@ -422,7 +384,7 @@
throw_speed = 1
throw_range = 3
w_class = 4.0
flags = FPRINT | TABLEPASS | NOSHIELD
flags = CONDUCT | NOSHIELD
slot_flags = SLOT_BACK
origin_tech = "materials=2;combat=2"
attack_verb = list("chopped", "sliced", "cut", "reaped")
@@ -445,7 +407,7 @@
w_class = 1
throwforce = 2
var/cigarcount = 6
flags = ONBELT | TABLEPASS */
*/
/obj/item/weapon/pai_cable
desc = "A flexible coated cable with a universal jack on one end."
+1 -3
View File
@@ -1,7 +1,7 @@
/atom
layer = 2
var/level = 2
var/flags = FPRINT
var/flags = null
var/list/fingerprints
var/list/fingerprintshidden
var/fingerprintslast = null
@@ -249,8 +249,6 @@ var/list/blood_splatter_icons = list()
return 0
if(!check_dna_integrity(M)) //check dna is valid and create/setup if necessary
return 0 //no dna!
if(!(flags & FPRINT))
return 0
if(!istype(blood_DNA, /list)) //if our list of DNA doesn't exist yet (or isn't a list) initialise it.
blood_DNA = list()
return
+29 -74
View File
@@ -70,89 +70,44 @@
src.throwing = 1
if(usr)
if(HULK in usr.mutations)
src.throwing = 2 // really strong throw!
var/dist_x = abs(target.x - src.x)
var/dist_y = abs(target.y - src.y)
var/dx
if (target.x > src.x)
dx = EAST
else
dx = WEST
var/dy
if (target.y > src.y)
dy = NORTH
else
dy = SOUTH
var/dx = (target.x > src.x) ? EAST : WEST
var/dy = (target.y > src.y) ? NORTH : SOUTH
var/dist_travelled = 0
var/dist_since_sleep = 0
var/area/a = get_area(src.loc)
if(dist_x > dist_y)
var/error = dist_x/2 - dist_y
var/tdist_x = dist_x;
var/tdist_y = dist_y;
var/tdx = dx;
var/tdy = dy;
if(dist_x <= dist_y)
tdist_x = dist_y;
tdist_y = dist_x;
tdx = dy;
tdy = dx;
while(src && target &&((((src.x < target.x && dx == EAST) || (src.x > target.x && dx == WEST)) && dist_travelled < range) || (a && a.has_gravity == 0) || istype(src.loc, /turf/space)) && src.throwing && istype(src.loc, /turf))
// only stop when we've gone the whole distance (or max throw range) and are on a non-space tile, or hit something, or hit the end of the map, or someone picks it up
if(error < 0)
var/atom/step = get_step(src, dy)
if(!step) // going off the edge of the map makes get_step return null, don't let things go off the edge
break
src.Move(step)
hit_check()
error += dist_x
dist_travelled++
dist_since_sleep++
if(dist_since_sleep >= speed)
dist_since_sleep = 0
sleep(1)
else
var/atom/step = get_step(src, dx)
if(!step) // going off the edge of the map makes get_step return null, don't let things go off the edge
break
src.Move(step)
hit_check()
error -= dist_y
dist_travelled++
dist_since_sleep++
if(dist_since_sleep >= speed)
dist_since_sleep = 0
sleep(1)
a = get_area(src.loc)
else
var/error = dist_y/2 - dist_x
while(src && target &&((((src.y < target.y && dy == NORTH) || (src.y > target.y && dy == SOUTH)) && dist_travelled < range) || (a.has_gravity == 0) || istype(src.loc, /turf/space)) && src.throwing && istype(src.loc, /turf))
// only stop when we've gone the whole distance (or max throw range) and are on a non-space tile, or hit something, or hit the end of the map, or someone picks it up
if(error < 0)
var/atom/step = get_step(src, dx)
if(!step) // going off the edge of the map makes get_step return null, don't let things go off the edge
break
src.Move(step)
hit_check()
error += dist_y
dist_travelled++
dist_since_sleep++
if(dist_since_sleep >= speed)
dist_since_sleep = 0
sleep(1)
else
var/atom/step = get_step(src, dy)
if(!step) // going off the edge of the map makes get_step return null, don't let things go off the edge
break
src.Move(step)
hit_check()
error -= dist_x
dist_travelled++
dist_since_sleep++
if(dist_since_sleep >= speed)
dist_since_sleep = 0
sleep(1)
var/error = tdist_x/2 - tdist_y
while(target && (((((dist_x > dist_y) && ((src.x < target.x && dx == EAST) || (src.x > target.x && dx == WEST))) || ((dist_x <= dist_y) && ((src.y < target.y && dy == NORTH) || (src.y > target.y && dy == SOUTH))) || (src.x > target.x && dx == WEST)) && dist_travelled < range) || (a && a.has_gravity == 0) || istype(src.loc, /turf/space)))
// only stop when we've gone the whole distance (or max throw range) and are on a non-space tile, or hit something, or hit the end of the map, or someone picks it up
if(!src.throwing) break
if(!istype(src.loc, /turf)) break
a = get_area(src.loc)
var/atom/step = get_step(src, (error < 0) ? tdy : tdx)
if(!step) // going off the edge of the map makes get_step return null, don't let things go off the edge
break
src.Move(step)
hit_check()
error += (error < 0) ? tdist_x : -tdist_y;
dist_travelled++
dist_since_sleep++
if(dist_since_sleep >= speed)
dist_since_sleep = 0
sleep(1)
a = get_area(src.loc)
//done throwing, either because it hit something or it finished moving
src.throwing = 0
+8 -3
View File
@@ -110,10 +110,15 @@ var/list/radiochannels = list(
"Service" = 1349,
)
//depenging helpers
var/list/DEPT_FREQS = list(1351,1355,1357,1213,1441,1347,1349)
var/const/SEC_FREQ = 1359 //security, colored cyan in chat window
var/const/SYND_FREQ = 1213 //nuke op frequency, coloured dark brown in chat window
var/const/SUPP_FREQ = 1347 //supply, coloured light brown in chat window
var/const/SERV_FREQ = 1349 //service, coloured green in chat window
var/const/SCI_FREQ = 1351 //science, coloured plum in chat window
var/const/COMM_FREQ = 1353 //command, colored gold in chat window
var/const/SYND_FREQ = 1213
var/const/MED_FREQ = 1355 //medical, coloured blue in chat window
var/const/ENG_FREQ = 1357 //engineering, coloured orange in chat window
var/const/SEC_FREQ = 1359 //security, coloured red in chat window
var/const/DSQUAD_FREQ = 1441 //death squad frequency, coloured grey in chat window
#define TRANSMISSION_WIRE 0
#define TRANSMISSION_RADIO 1
+25 -10
View File
@@ -35,7 +35,7 @@
var/mob/living/carbon/human/H = character
L[DNA_HAIR_STYLE_BLOCK] = construct_block(hair_styles_list.Find(H.hair_style), hair_styles_list.len)
L[DNA_HAIR_COLOR_BLOCK] = sanitize_hexcolor(H.hair_color)
L[DNA_FACIAL_HAIR_STYLE_BLOCK] = construct_block(hair_styles_list.Find(H.facial_hair_style), facial_hair_styles_list.len)
L[DNA_FACIAL_HAIR_STYLE_BLOCK] = construct_block(facial_hair_styles_list.Find(H.facial_hair_style), facial_hair_styles_list.len)
L[DNA_FACIAL_HAIR_COLOR_BLOCK] = sanitize_hexcolor(H.facial_hair_color)
L[DNA_SKIN_TONE_BLOCK] = construct_block(skin_tones.Find(H.skin_tone), skin_tones.len)
L[DNA_EYE_COLOR_BLOCK] = sanitize_hexcolor(H.eye_color)
@@ -336,6 +336,9 @@
use_power = 1
idle_power_usage = 50
active_power_usage = 300
var/damage_coeff
var/scan_level
var/precision_coeff
/obj/machinery/dna_scannernew/New()
..()
@@ -347,8 +350,20 @@
component_parts += new /obj/item/weapon/stock_parts/console_screen(null)
component_parts += new /obj/item/weapon/cable_coil(null, 1)
component_parts += new /obj/item/weapon/cable_coil(null, 1)
RefreshParts()
/obj/machinery/dna_scannernew/RefreshParts()
scan_level = 0
damage_coeff = 0
precision_coeff = 0
for(var/obj/item/weapon/stock_parts/scanning_module/P in component_parts)
scan_level += P.rating
for(var/obj/item/weapon/stock_parts/manipulator/P in component_parts)
precision_coeff = P.rating
for(var/obj/item/weapon/stock_parts/micro_laser/P in component_parts)
damage_coeff = P.rating
/obj/machinery/dna_scannernew/proc/toggle_open(mob/user=usr)
if(!user)
return
@@ -582,7 +597,7 @@
if(connected)
if(connected.occupant) //set occupant_status message
viable_occupant = connected.occupant
if(check_dna_integrity(viable_occupant) && !(NOCLONE in viable_occupant.mutations)) //occupent is viable for dna modification
if(check_dna_integrity(viable_occupant) && (!(NOCLONE in viable_occupant.mutations) || (connected.scan_level == 3))) //occupent is viable for dna modification
occupant_status += "[viable_occupant.name] => "
switch(viable_occupant.stat)
if(CONSCIOUS) occupant_status += "<span class='good'>Conscious</span>"
@@ -624,7 +639,7 @@
var/stddev = radstrength*RADIATION_STRENGTH_MULTIPLIER
status += "<div class='line'><div class='statusLabel'>Output Level:</div><div class='statusValue'>[radstrength]</div></div>"
status += "<div class='line'><div class='statusLabel'>&nbsp;&nbsp;\> Mutation:</div><div class='statusValue'>(-[stddev] to +[stddev] = 68%) (-[2*stddev] to +[2*stddev] = 95%)</div></div>"
stddev = RADIATION_ACCURACY_MULTIPLIER/radduration
stddev = RADIATION_ACCURACY_MULTIPLIER/(radduration + (connected.precision_coeff ** 2))
var/chance_to_hit
switch(stddev) //hardcoded values from a z-table for a normal distribution
if(0 to 0.25) chance_to_hit = ">95%"
@@ -828,9 +843,9 @@
if(num && viable_occupant)
num = Clamp(num, 1, NUMBER_OF_BUFFERS)
var/list/buffer_slot = buffer[num]
if(istype(buffer_slot))
viable_occupant.radiation += rand(15,40)
switch(href_list["text"])
if(istype(buffer_slot)) //15 and 40 are just magic numbers that were here before so i didnt touch them, they are initial boundaries of damage
viable_occupant.radiation += rand(15/(connected.damage_coeff ** 2),40/(connected.damage_coeff ** 2)) //Each laser level reduces damage by lvl^2, so no effect on 1 lvl, 4 times less damage on 2 and 9 times less damage on 3
switch(href_list["text"]) //Numbers are this high because other way upgrading laser is just not worth the hassle, and i cant think of anything better to inmrove
if("se")
if(buffer_slot["SE"])
viable_occupant.dna.struc_enzymes = buffer_slot["SE"]
@@ -899,13 +914,13 @@
current_screen = "mainmenu"
if(viable_occupant && connected && connected.occupant==viable_occupant)
viable_occupant.radiation += RADIATION_IRRADIATION_MULTIPLIER*radduration*radstrength
switch(href_list["task"])
viable_occupant.radiation += (RADIATION_IRRADIATION_MULTIPLIER*radduration*radstrength)/(connected.damage_coeff ** 2) //Read comment in "transferbuffer" section above for explanation
switch(href_list["task"]) //Same thing as there but values are even lower, on best part they are about 0.0*, effectively no damage
if("pulseui")
var/len = length(viable_occupant.dna.uni_identity)
num = Wrap(num, 1, len+1)
num = randomize_radiation_accuracy(num, radduration, len)
num = randomize_radiation_accuracy(num, radduration + (connected.precision_coeff ** 2), len) //Each manipulator level above 1 makes randomization as accurate as selected time + manipulator lvl^2
//Value is this high for the same reason as with laser - not worth the hassle of upgrading if the bonus is low
var/block = round((num-1)/DNA_BLOCK_SIZE)+1
var/subblock = num - block*DNA_BLOCK_SIZE
last_change = "UI #[block]-[subblock]; "
+3 -3
View File
@@ -102,7 +102,7 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon"
var/datum/objective/absorb/absorb_objective = new
absorb_objective.owner = changeling
absorb_objective.gen_amount_goal(5, 7)
absorb_objective.gen_amount_goal(6, 8)
changeling.objectives += absorb_objective
var/datum/objective/assassinate/kill_objective = new
@@ -131,7 +131,7 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon"
/datum/game_mode/proc/greet_changeling(var/datum/mind/changeling, var/you_are=1)
if (you_are)
changeling.current << "<b>\red You are a changeling!</b>"
changeling.current << "<b>\red You are a changeling! You have absorbed and taken the form of a human.</b>"
changeling.current << "<b>\red Use say \":g message\" to communicate with your fellow changelings.</b>"
changeling.current << "<b>You must complete the following tasks:</b>"
@@ -219,7 +219,7 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon"
/datum/changeling //stores changeling powers, changeling recharge thingie, changeling absorbed DNA and changeling ID (for changeling hivemind)
var/list/absorbed_dna = list()
var/dna_max = 4 //How many extra DNA strands the changeling can store for transformation.
var/absorbedcount = 0
var/absorbedcount = 1 //We would require at least 1 sample of compatible DNA to have taken on the form of a human.
var/chem_charges = 20
var/chem_storage = 50
var/chem_recharge_rate = 0.5
@@ -558,6 +558,7 @@ var/list/datum/dna/hivemind_bank = list()
src << "<span class='notice'>We stealthly sting [C.name].</span>"
if(C.mind && C.mind.changeling)
C << "<span class='warning'>You feel a tiny prick.</span>"
add_logs(src, C, "unsuccessfully stung")
return 0
else
return 1
@@ -581,9 +582,9 @@ var/list/datum/dna/hivemind_bank = list()
set_sting(/mob/living/carbon/proc/sting_effect_trasnform, "sting_transform", D)
/mob/living/carbon/proc/sting_effect_trasnform(mob/living/carbon/T)
add_logs(src, T, "stung", "transformation sting", "new identity is [src.mind.changeling.chosen_dna.real_name]")
if(!sting_can_reach(T, 40))
return 0
add_logs(src, T, "stung", object="transformation sting", addition="new identity is [src.mind.changeling.chosen_dna.real_name]")
if((HUSK in T.mutations) || !check_dna_integrity(T))
src << "<span class='warning'>Our sting appears ineffective against its DNA.</span>"
return 0
@@ -603,9 +604,9 @@ var/list/datum/dna/hivemind_bank = list()
set_sting(/mob/living/carbon/proc/sting_effect_extract, "sting_extract")
/mob/living/carbon/proc/sting_effect_extract(mob/living/carbon/T)
add_logs(src, T, "stung", "extraction sting")
if(!sting_can_reach(T, 25))
return 0
add_logs(src, T, "stung", object="extraction sting")
if(src.mind.changeling.can_absorb_dna(T, usr))
src.mind.changeling.absorb_dna(T, usr)
else//If the sting fails, give the guy most of his chems back.
@@ -622,9 +623,9 @@ var/list/datum/dna/hivemind_bank = list()
set_sting(/mob/living/carbon/proc/sting_effect_mute, "sting_mute")
/mob/living/carbon/proc/sting_effect_mute(mob/living/carbon/T)
add_logs(src, T, "stung", "mute sting")
if(!sting_can_reach(T, 20))
return 0
add_logs(src, T, "stung", object="mute sting")
T.silent += 30
feedback_add_details("changeling_powers","MS")
return 1
@@ -637,9 +638,9 @@ var/list/datum/dna/hivemind_bank = list()
set_sting(/mob/living/carbon/proc/sting_effect_blind, "sting_blind")
/mob/living/carbon/proc/sting_effect_blind(mob/living/carbon/T)
add_logs(src, T, "stung", "blind sting")
if(!sting_can_reach(T, 25))
return 0
add_logs(src, T, "stung", object="blind sting")
T << "<span class='danger'>Your eyes burn horrifically!</span>"
T.disabilities |= NEARSIGHTED
T.eye_blind = 20
@@ -655,9 +656,9 @@ var/list/datum/dna/hivemind_bank = list()
set_sting(/mob/living/carbon/proc/sting_effect_lsd, "sting_lsd")
/mob/living/carbon/proc/sting_effect_lsd(mob/living/carbon/T)
add_logs(src, T, "stung", "LSD sting")
if(!sting_can_reach(T, 5))
return 0
add_logs(src, T, "stung", object="LSD sting")
spawn(rand(300,600))
if(T) T.hallucination += 400
feedback_add_details("changeling_powers","HS")
@@ -671,9 +672,9 @@ var/list/datum/dna/hivemind_bank = list()
set_sting(/mob/living/carbon/proc/sting_effect_cryo, "sting_cryo")
/mob/living/carbon/proc/sting_effect_cryo(mob/living/carbon/T)
add_logs(src, T, "stung", "cryo sting")
if(!sting_can_reach(T, 15))
return 0
add_logs(src, T, "stung", object="cryo sting")
if(T.reagents)
T.reagents.add_reagent("frostoil", 30)
T.reagents.add_reagent("ice", 30)
+3 -5
View File
@@ -3,7 +3,7 @@
desc = "An arcane weapon wielded by the followers of Nar-Sie"
icon_state = "cultblade"
item_state = "cultblade"
flags = FPRINT | TABLEPASS
flags = CONDUCT
w_class = 4
force = 30
throwforce = 10
@@ -34,7 +34,7 @@
icon_state = "culthood"
desc = "A hood worn by the followers of Nar-Sie."
flags_inv = HIDEFACE
flags = FPRINT|TABLEPASS|HEADCOVERSEYES
flags = HEADCOVERSEYES
armor = list(melee = 30, bullet = 10, laser = 5,energy = 5, bomb = 0, bio = 0, rad = 0)
cold_protection = HEAD
min_cold_protection_temperature = HELMET_MIN_TEMP_PROTECT
@@ -55,7 +55,6 @@
desc = "A set of armored robes worn by the followers of Nar-Sie"
icon_state = "cultrobes"
item_state = "cultrobes"
flags = FPRINT | TABLEPASS
body_parts_covered = CHEST|GROIN|LEGS|ARMS
allowed = list(/obj/item/weapon/tome,/obj/item/weapon/melee/cultblade)
armor = list(melee = 50, bullet = 30, laser = 50,energy = 20, bomb = 25, bio = 10, rad = 0)
@@ -71,7 +70,7 @@
item_state = "magus"
desc = "A helm worn by the followers of Nar-Sie."
flags_inv = HIDEFACE
flags = FPRINT|TABLEPASS|HEADCOVERSEYES|HEADCOVERSMOUTH|BLOCKHAIR
flags = HEADCOVERSEYES|HEADCOVERSMOUTH|BLOCKHAIR
armor = list(melee = 30, bullet = 30, laser = 30,energy = 20, bomb = 0, bio = 0, rad = 0)
/obj/item/clothing/suit/magusred
@@ -79,7 +78,6 @@
desc = "A set of armored robes worn by the followers of Nar-Sie"
icon_state = "magusred"
item_state = "magusred"
flags = FPRINT | TABLEPASS
body_parts_covered = CHEST|GROIN|LEGS|ARMS
allowed = list(/obj/item/weapon/tome,/obj/item/weapon/melee/cultblade)
armor = list(melee = 50, bullet = 30, laser = 50,energy = 20, bomb = 25, bio = 10, rad = 0)
-1
View File
@@ -306,7 +306,6 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology",
throw_speed = 1
throw_range = 5
w_class = 2.0
flags = FPRINT | TABLEPASS
var/notedat = ""
var/tomedat = ""
var/list/words = list("ire" = "ire", "ego" = "ego", "nahlizet" = "nahlizet", "certum" = "certum", "veri" = "veri", "jatkaa" = "jatkaa", "balaq" = "balaq", "mgar" = "mgar", "karazet" = "karazet", "geeri" = "geeri")
+1 -1
View File
@@ -288,7 +288,7 @@ var/list/sacrificed = list()
return fizzle()
for(var/obj/item/organ/limb/affecting in corpse_to_raise.organs)
affecting.heal_damage(1000, 1000)
affecting.heal_damage(1000, 1000, 0)
corpse_to_raise.setToxLoss(0)
corpse_to_raise.setOxyLoss(0)
corpse_to_raise.SetParalysis(0)
+2 -1
View File
@@ -133,7 +133,8 @@
var/turf/T = get_turf(M)
if(!T || T.z != src.z)
continue
shake_camera(M, 3, get_dist(M.loc, src.loc) > 20 ? 1 : 3)
var/dist = get_dist(M.loc, src.loc)
shake_camera(M, dist > 20 ? 3 : 5, dist > 20 ? 1 : 3)
M.playsound_local(src.loc, 'sound/effects/meteorimpact.ogg', 50, 1, get_rand_frequency(), 10)
explosion(src.loc, 0, 1, 2, 3, 0)
@@ -14,7 +14,6 @@ var/bomb_set
var/yes_code = 0.0
var/safety = 1.0
var/obj/item/weapon/disk/nuclear/auth = null
flags = FPRINT
use_power = 0
/obj/machinery/nuclearbomb/New()
+1 -1
View File
@@ -2,7 +2,7 @@
name = "pinpointer"
icon = 'icons/obj/device.dmi'
icon_state = "pinoff"
flags = FPRINT | TABLEPASS| CONDUCT
flags = CONDUCT
slot_flags = SLOT_BELT
w_class = 2.0
item_state = "electronic"
-3
View File
@@ -10,7 +10,6 @@
throw_range = 5
w_class = 1.0
var/used = 0
flags = FPRINT | TABLEPASS
/obj/item/weapon/contract/attack_self(mob/user as mob)
@@ -116,7 +115,6 @@
icon = 'icons/obj/wizard.dmi'
icon_state = "render"
item_state = "render"
flags = FPRINT | TABLEPASS
force = 15
throwforce = 10
w_class = 3
@@ -196,7 +194,6 @@
throwforce = 15
damtype = BURN
force = 15
flags = FPRINT | TABLEPASS
hitsound = 'sound/items/welder2.ogg'
/obj/item/weapon/scrying/attack_self(mob/user as mob)
+2 -4
View File
@@ -7,7 +7,7 @@
if(H.stat == 2 || !(H.client)) continue
if(H.mind)
if(H.mind.special_role == "Wizard" || H.mind.special_role == "apprentice") continue
if(prob(25))
if(prob(25) && !(H.mind in ticker.mode.traitors))
ticker.mode.traitors += H.mind
H.mind.special_role = "traitor"
var/datum/objective/survive/survive = new
@@ -20,7 +20,7 @@
H << "<B>Objective #[obj_count]</B>: [OBJ.explanation_text]"
obj_count++
var/randomizeguns = pick("taser","egun","laser","revolver","detective","smg","nuclear","deagle","gyrojet","pulse","silenced","cannon","doublebarrel","shotgun","combatshotgun","mateba","smg","uzi","crossbow","saw")
var/randomizemagic = pick("fireball","smoke","blind","mindswap","forcewall","knock","horsemask","charge","wandnothing", "wanddeath", "wandresurrection", "wandpolymorph", "wandteleport", "wanddoor", "wandfireball", "staffchange", "staffanimation", "staffhealing", "armor", "scrying")
var/randomizemagic = pick("fireball","smoke","blind","mindswap","forcewall","knock","horsemask","charge","wandnothing", "wanddeath", "wandresurrection", "wandpolymorph", "wandteleport", "wanddoor", "wandfireball", "staffchange", "staffhealing", "armor", "scrying")
if(!summon_type)
switch (randomizeguns)
if("taser")
@@ -96,8 +96,6 @@
new /obj/item/weapon/gun/magic/wand/door(get_turf(H))
if("staffchange")
new /obj/item/weapon/gun/magic/staff/change(get_turf(H))
if("staffanimation")
new /obj/item/weapon/gun/magic/staff/animate(get_turf(H))
if("staffhealing")
new /obj/item/weapon/gun/magic/staff/healing(get_turf(H))
if("armor")
-2
View File
@@ -5,7 +5,6 @@
item_state = "electronic"
desc = "A fragment of the legendary treasure known simply as the 'Soul Stone'. The shard still flickers with a fraction of the full artefacts power."
w_class = 1.0
flags = FPRINT | TABLEPASS
slot_flags = SLOT_BELT
origin_tech = "bluespace=4;materials=4"
var/imprinted = "empty"
@@ -81,7 +80,6 @@
icon = 'icons/obj/wizard.dmi'
icon_state = "construct"
desc = "A wicked machine used by those skilled in magical arts. It is inactive"
flags = FPRINT | TABLEPASS
/obj/structure/constructshell/attackby(obj/item/O as obj, mob/user as mob)
if(istype(O, /obj/item/device/soulstone))
+42 -4
View File
@@ -6,7 +6,6 @@
throw_speed = 1
throw_range = 5
w_class = 1.0
flags = FPRINT | TABLEPASS
var/uses = 5
var/temp = null
var/max_uses = 5
@@ -253,7 +252,7 @@
max_uses--
temp = "You have cast summon guns."
if("summonmagic")
feedback_add_details("wizard_spell_learned","SM") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
feedback_add_details("wizard_spell_learned","SU") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
H.rightandwrong(1)
max_uses--
temp = "You have cast summon magic."
@@ -334,6 +333,7 @@
else
user.spell_list += S
user <<"<span class='notice'>you rapidly read through the arcane book. Suddenly you realize you understand [spellname]!</span>"
user.attack_log += text("\[[time_stamp()]\] <font color='orange'>[user.real_name] ([user.ckey]) learned the spell [spellname] ([S]).</font>")
onlearned(user)
/obj/item/weapon/spellbook/oneuse/proc/recoil(mob/user as mob)
@@ -387,6 +387,7 @@
spellname = "mindswap"
icon_state ="bookmindswap"
desc = "This book's cover is pristine, though its pages look ragged and torn."
var/mob/stored_swap = null //Used in used book recoils to store an identity for mindswaps
/obj/item/weapon/spellbook/oneuse/mindswap/onlearned()
spellname = pick("fireball","smoke","blind","forcewall","knock","horses","charge")
@@ -396,8 +397,45 @@
/obj/item/weapon/spellbook/oneuse/mindswap/recoil(mob/user as mob)
..()
user <<"<span class='warning'>You suddenly don't feel like yourself!</span>"
wabbajack(user)
if(stored_swap in dead_mob_list)
stored_swap = null
if(!stored_swap)
stored_swap = user
user <<"<span class='warning'>For a moment you feel like you don't even know who you are anymore.</span>"
return
if(stored_swap == user)
user <<"<span class='notice'>You stare at the book some more, but there doesn't seem to be anything else to learn...</span>"
return
if(user.mind.special_verbs.len)
for(var/V in user.mind.special_verbs)
user.verbs -= V
if(stored_swap.mind.special_verbs.len)
for(var/V in stored_swap.mind.special_verbs)
stored_swap.verbs -= V
var/mob/dead/observer/ghost = stored_swap.ghostize(0)
ghost.spell_list = stored_swap.spell_list
user.mind.transfer_to(stored_swap)
stored_swap.spell_list = user.spell_list
if(stored_swap.mind.special_verbs.len)
for(var/V in user.mind.special_verbs)
user.verbs += V
ghost.mind.transfer_to(user)
user.key = ghost.key
user.spell_list = ghost.spell_list
if(user.mind.special_verbs.len)
for(var/V in user.mind.special_verbs)
user.verbs += V
stored_swap <<"<span class='warning'>You're suddenly somewhere else... and someone else?!</span>"
user <<"<span class='warning'>Suddenly you're staring at [src] again... where are you, who are you?!</span>"
stored_swap = null
/obj/item/weapon/spellbook/oneuse/forcewall
spell = /obj/effect/proc_holder/spell/aoe_turf/conjure/forcewall
+3 -4
View File
@@ -242,10 +242,8 @@
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack)
H.equip_to_slot_or_del(new /obj/item/toy/crayon/mime(H), slot_in_backpack)
H.equip_to_slot_or_del(new /obj/item/weapon/reagent_containers/food/drinks/bottle/bottleofnothing(H), slot_in_backpack)
H.verbs += /client/proc/mimespeak
H.verbs += /client/proc/mimewall
H.mind.special_verbs += /client/proc/mimespeak
H.mind.special_verbs += /client/proc/mimewall
H.spell_list += new /obj/effect/proc_holder/spell/aoe_turf/conjure/mime_wall(H)
H.spell_list += new /obj/effect/proc_holder/spell/targeted/mime/speak(H)
H.miming = 1
H.rename_self("mime")
return 1
@@ -268,6 +266,7 @@
equip(var/mob/living/carbon/human/H)
if(!H) return 0
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/janitor(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_srv(H), slot_ears)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/device/pda/janitor(H), slot_belt)
return 1
+8
View File
@@ -303,6 +303,14 @@
/obj/machinery/sleeper/container_resist()
eject()
/obj/machinery/sleeper/relaymove(var/mob/user)
..()
eject()
/obj/machinery/sleeper/Del()
go_out()
..()
/obj/machinery/sleeper/proc/eject()
go_out()
add_fingerprint(usr)
+39 -88
View File
@@ -874,7 +874,7 @@ Code shamelessly copied from apc_frame
desc = "Used for building Air Alarms"
icon = 'icons/obj/monitors.dmi'
icon_state = "alarm_bitem"
flags = FPRINT | TABLEPASS| CONDUCT
flags = CONDUCT
/obj/item/alarm_frame/attackby(obj/item/weapon/W as obj, mob/user as mob)
if (istype(W, /obj/item/weapon/wrench))
@@ -986,9 +986,9 @@ FIRE ALARM
if (istype(W, /obj/item/device/multitool))
src.detecting = !( src.detecting )
if (src.detecting)
user.visible_message("\red [user] has reconnected [src]'s detecting unit!", "You have reconnected [src]'s detecting unit.")
user.visible_message("<span class='warning'>[user] has reconnected [src]'s detecting unit!</span>", "<span class='warning'>You have reconnected [src]'s detecting unit.</span>")
else
user.visible_message("\red [user] has disconnected [src]'s detecting unit!", "You have disconnected [src]'s detecting unit.")
user.visible_message("<span class='warning'>[user] has disconnected [src]'s detecting unit!</span>", "<span class='warning'>You have disconnected [src]'s detecting unit.</span>")
else if (istype(W, /obj/item/weapon/wirecutters))
buildstage = 1
@@ -996,13 +996,13 @@ FIRE ALARM
var/obj/item/weapon/cable_coil/coil = new /obj/item/weapon/cable_coil()
coil.amount = 5
coil.loc = user.loc
user << "You cut the wires from \the [src]"
user << "<span class='notice'>You cut the wires from \the [src]</span>"
update_icon()
if(1)
if(istype(W, /obj/item/weapon/cable_coil))
var/obj/item/weapon/cable_coil/coil = W
if(coil.amount < 5)
user << "You need more cable for this!"
user << "<span class='warning'>You need more cable for this!</span>"
return
coil.amount -= 5
@@ -1010,26 +1010,26 @@ FIRE ALARM
del(coil)
buildstage = 2
user << "You wire \the [src]!"
user << "<span class='notice'>You wire \the [src]!</span>"
update_icon()
else if(istype(W, /obj/item/weapon/crowbar))
user << "You pry out the circuit!"
playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1)
spawn(20)
var/obj/item/weapon/firealarm_electronics/circuit = new /obj/item/weapon/firealarm_electronics()
circuit.loc = user.loc
buildstage = 0
update_icon()
if(buildstage == 1)
user << "<span class='notice'>You pry out the circuit!</span>"
new /obj/item/weapon/firealarm_electronics(user.loc)
buildstage = 0
update_icon()
if(0)
if(istype(W, /obj/item/weapon/firealarm_electronics))
user << "You insert the circuit!"
user << "<span class='notice'>You insert the circuit!</span>"
del(W)
buildstage = 1
update_icon()
else if(istype(W, /obj/item/weapon/wrench))
user << "You remove the fire alarm assembly from the wall!"
user.visible_message("<span class='warning'>[user] removes the fire alarm assembly from the wall!</span>", "<span class='warning'>You remove the fire alarm assembly from the wall!</span>")
var/obj/item/firealarm_frame/frame = new /obj/item/firealarm_frame()
frame.loc = user.loc
playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
@@ -1208,28 +1208,9 @@ Code shamelessly copied from apc_frame
desc = "Used for building Fire Alarms"
icon = 'icons/obj/monitors.dmi'
icon_state = "fire_bitem"
flags = FPRINT | TABLEPASS| CONDUCT
flags = CONDUCT
/*
* Party button
*/
/obj/machinery/partyalarm
name = "\improper PARTY BUTTON"
desc = "Cuban Pete is in the house!"
icon = 'icons/obj/monitors.dmi'
icon_state = "fire0"
var/detecting = 1.0
var/working = 1.0
var/time = 10.0
var/timing = 0.0
var/lockdownbyai = 0
anchored = 1.0
use_power = 1
idle_power_usage = 2
active_power_usage = 6
/obj/item/firealarm_frame/attackby(obj/item/weapon/W as obj, mob/user as mob)
if (istype(W, /obj/item/weapon/wrench))
new /obj/item/stack/sheet/metal( get_turf(src.loc), 2 )
@@ -1262,16 +1243,22 @@ Code shamelessly copied from apc_frame
del(src)
/obj/machinery/partyalarm/attack_paw(mob/user as mob)
return src.attack_hand(user)
/obj/machinery/partyalarm/attack_hand(mob/user as mob)
/*
* Party button
*/
/obj/machinery/firealarm/partyalarm
name = "\improper PARTY BUTTON"
desc = "Cuban Pete is in the house!"
/obj/machinery/firealarm/partyalarm/attack_hand(mob/user as mob)
if(user.stat || stat & (NOPOWER|BROKEN))
return
user.set_machine(src)
var/area/A = src.loc
var/d1
var/d2
var/dat
if (istype(user, /mob/living/carbon/human) || istype(user, /mob/living/silicon/ai))
A = A.loc
@@ -1279,76 +1266,40 @@ Code shamelessly copied from apc_frame
d1 = text("<A href='?src=\ref[];reset=1'>No Party :(</A>", src)
else
d1 = text("<A href='?src=\ref[];alarm=1'>PARTY!!!</A>", src)
if (src.timing)
d2 = text("<A href='?src=\ref[];time=0'>Stop Time Lock</A>", src)
else
d2 = text("<A href='?src=\ref[];time=1'>Initiate Time Lock</A>", src)
var/second = src.time % 60
var/minute = (src.time - second) / 60
var/dat = text("<HTML><HEAD></HEAD><BODY><TT><B>Party Button</B> []\n<HR>\nTimer System: []<br />\nTime Left: [][] <A href='?src=\ref[];tp=-30'>-</A> <A href='?src=\ref[];tp=-1'>-</A> <A href='?src=\ref[];tp=1'>+</A> <A href='?src=\ref[];tp=30'>+</A>\n</TT></BODY></HTML>", d1, d2, (minute ? text("[]:", minute) : null), second, src, src, src, src)
user << browse(dat, "window=partyalarm")
onclose(user, "partyalarm")
dat = text("<HTML><HEAD></HEAD><BODY><TT><B>Party Button</B> []</BODY></HTML>", d1)
else
A = A.loc
if (A.fire)
d1 = text("<A href='?src=\ref[];reset=1'>[]</A>", src, stars("No Party :("))
else
d1 = text("<A href='?src=\ref[];alarm=1'>[]</A>", src, stars("PARTY!!!"))
if (src.timing)
d2 = text("<A href='?src=\ref[];time=0'>[]</A>", src, stars("Stop Time Lock"))
else
d2 = text("<A href='?src=\ref[];time=1'>[]</A>", src, stars("Initiate Time Lock"))
var/second = src.time % 60
var/minute = (src.time - second) / 60
var/dat = text("<HTML><HEAD></HEAD><BODY><TT><B>[]</B> []\n<HR>\nTimer System: []<br />\nTime Left: [][] <A href='?src=\ref[];tp=-30'>-</A> <A href='?src=\ref[];tp=-1'>-</A> <A href='?src=\ref[];tp=1'>+</A> <A href='?src=\ref[];tp=30'>+</A>\n</TT></BODY></HTML>", stars("Party Button"), d1, d2, (minute ? text("[]:", minute) : null), second, src, src, src, src)
user << browse(dat, "window=partyalarm")
onclose(user, "partyalarm")
dat = text("<HTML><HEAD></HEAD><BODY><TT><B>[]</B> []", stars("Party Button"), d1)
var/datum/browser/popup = new(user, "firealarm", "Party Alarm")
popup.set_content(dat)
popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state))
popup.open()
return
/obj/machinery/partyalarm/proc/reset()
/obj/machinery/firealarm/partyalarm/reset()
if (!( src.working ))
return
var/area/A = src.loc
A = A.loc
if (!( istype(A, /area) ))
return
A.partyreset()
for(var/area/RA in A.related)
RA.partyreset()
return
/obj/machinery/partyalarm/proc/alarm()
/obj/machinery/firealarm/partyalarm/alarm()
if (!( src.working ))
return
var/area/A = src.loc
A = A.loc
if (!( istype(A, /area) ))
return
A.partyalert()
return
/obj/machinery/partyalarm/Topic(href, href_list)
if(..())
return
if (usr.stat || stat & (BROKEN|NOPOWER))
return
if ((usr.contents.Find(src) || ((get_dist(src, usr) <= 1) && istype(src.loc, /turf))) || (istype(usr, /mob/living/silicon/ai)))
usr.set_machine(src)
if (href_list["reset"])
src.reset()
else
if (href_list["alarm"])
src.alarm()
else
if (href_list["time"])
src.timing = text2num(href_list["time"])
else
if (href_list["tp"])
var/tp = text2num(href_list["tp"])
src.time += tp
src.time = min(max(round(src.time), 0), 120)
src.updateUsrDialog()
src.add_fingerprint(usr)
else
usr << browse(null, "window=partyalarm")
return
return
for(var/area/RA in A.related)
RA.partyalert()
return
+4 -5
View File
@@ -4,7 +4,6 @@
icon_state = "yellow"
density = 1
var/health = 100.0
flags = FPRINT | CONDUCT
var/valve_open = 0
var/release_pressure = ONE_ATMOSPHERE
@@ -264,14 +263,14 @@ Release Pressure: <A href='?src=\ref[src];pressure_adj=-1000'>-</A> <A href='?sr
if(href_list["toggle"])
if (valve_open)
if (holding)
release_log += "Valve was <b>closed</b> by [usr], stopping the transfer into the [holding]<br>"
release_log += "Valve was <b>closed</b> by [usr] ([usr.ckey]), stopping the transfer into the [holding]<br>"
else
release_log += "Valve was <b>closed</b> by [usr], stopping the transfer into the <font color='red'><b>air</b></font><br>"
release_log += "Valve was <b>closed</b> by [usr] ([usr.ckey]), stopping the transfer into the <font color='red'><b>air</b></font><br>"
else
if (holding)
release_log += "Valve was <b>opened</b> by [usr], starting the transfer into the [holding]<br>"
release_log += "Valve was <b>opened</b> by [usr] ([usr.ckey]), starting the transfer into the [holding]<br>"
else
release_log += "Valve was <b>opened</b> by [usr], starting the transfer into the <font color='red'><b>air</b></font><br>"
release_log += "Valve was <b>opened</b> by [usr] ([usr.ckey]), starting the transfer into the <font color='red'><b>air</b></font><br>"
valve_open = !valve_open
if (href_list["remove_tank"])
+39 -20
View File
@@ -89,6 +89,7 @@ var/global/list/autolathe_recipes_hidden = list( \
idle_power_usage = 10
active_power_usage = 100
var/busy = 0
var/prod_coeff
proc
wires_win(mob/user as mob)
@@ -104,6 +105,7 @@ var/global/list/autolathe_recipes_hidden = list( \
onclose(user, "autolathe_hack")
regular_win(mob/user as mob)
var/coeff = 2 ** prod_coeff
var/dat as text
dat = text("<B>Metal Amount:</B> [src.m_amount] cm<sup>3</sup> (MAX: [max_m_amount])<BR>\n<FONT color=blue><B>Glass Amount:</B></FONT> [src.g_amount] cm<sup>3</sup> (MAX: [max_g_amount])<HR>")
var/list/objs = list()
@@ -111,12 +113,13 @@ var/global/list/autolathe_recipes_hidden = list( \
if (src.hacked)
objs += src.LL
for(var/obj/t in objs)
var/title = "[t.name] ([t.m_amt] m /[t.g_amt] g)"
if (m_amount<t.m_amt || g_amount<t.g_amt)
dat += title + "<br>"
continue
dat += "<A href='?src=\ref[src];make=\ref[t]'>[title]</A>"
if (istype(t, /obj/item/stack))
var/title = "[t.name] ([t.m_amt] m /[t.g_amt] g)"
if (m_amount<t.m_amt || g_amount<t.g_amt)
dat += title + "<br>"
continue
dat += "<A href='?src=\ref[src];make=\ref[t]'>[title]</A>"
var/obj/item/stack/S = t
var/max_multiplier = min(S.max_amount, S.m_amt?round(m_amount/S.m_amt):INFINITY, S.g_amt?round(g_amount/S.g_amt):INFINITY)
if (max_multiplier>1)
@@ -127,6 +130,12 @@ var/global/list/autolathe_recipes_hidden = list( \
dat += " <A href='?src=\ref[src];make=\ref[t];multiplier=[25]'>x[25]</A>"
if (max_multiplier>1)
dat += " <A href='?src=\ref[src];make=\ref[t];multiplier=[max_multiplier]'>x[max_multiplier]</A>"
else
var/title = "[t.name] ([t.m_amt/coeff] m /[t.g_amt/coeff] g)"
if (m_amount<t.m_amt/coeff || g_amount<t.g_amt/coeff)
dat += title + "<br>"
continue
dat += "<A href='?src=\ref[src];make=\ref[t]'>[title]</A>"
dat += "<br>"
user << browse("<HTML><HEAD><TITLE>Autolathe Control Panel</TITLE></HEAD><BODY><TT>[dat]</TT></BODY></HTML>", "window=autolathe_regular")
onclose(user, "autolathe_regular")
@@ -250,6 +259,7 @@ var/global/list/autolathe_recipes_hidden = list( \
src.add_fingerprint(usr)
if (!busy)
if(href_list["make"])
var/coeff = 2 ** prod_coeff
var/turf/T = get_step(src.loc, get_dir(src,usr))
var/obj/template = locate(href_list["make"])
var/multiplier = text2num(href_list["multiplier"])
@@ -260,21 +270,27 @@ var/global/list/autolathe_recipes_hidden = list( \
use_power(power)
icon_state = "autolathe"
flick("autolathe_n",src)
spawn(16)
spawn(16/coeff)
use_power(power)
spawn(16)
spawn(16/coeff)
use_power(power)
spawn(16)
src.m_amount -= template.m_amt*multiplier
src.g_amount -= template.g_amt*multiplier
spawn(16/coeff)
if(template.type == /obj/item/stack)
src.m_amount -= template.m_amt*multiplier
src.g_amount -= template.g_amt*multiplier
var/obj/new_item = new template.type(T)
var/obj/item/stack/S = new_item
S.amount = multiplier
else
src.m_amount -= template.m_amt/coeff
src.g_amount -= template.g_amt/coeff
var/obj/new_item = new template.type(T)
new_item.m_amt /= coeff
new_item.g_amt /= coeff
if(src.m_amount < 0)
src.m_amount = 0
if(src.g_amount < 0)
src.g_amount = 0
var/obj/new_item = new template.type(T)
if (multiplier>1)
var/obj/item/stack/S = new_item
S.amount = multiplier
busy = 0
src.updateUsrDialog()
if(href_list["act"])
@@ -319,21 +335,24 @@ var/global/list/autolathe_recipes_hidden = list( \
RefreshParts()
..()
var/tot_rating = 0
prod_coeff = 0
for(var/obj/item/weapon/stock_parts/matter_bin/MB in component_parts)
tot_rating += MB.rating
tot_rating *= 25000
max_m_amount = tot_rating * 2
max_g_amount = tot_rating
for(var/obj/item/weapon/stock_parts/manipulator/M in component_parts)
prod_coeff += M.rating - 1
New()
..()
component_parts = list()
component_parts += new /obj/item/weapon/circuitboard/autolathe(src)
component_parts += new /obj/item/weapon/stock_parts/matter_bin(src)
component_parts += new /obj/item/weapon/stock_parts/matter_bin(src)
component_parts += new /obj/item/weapon/stock_parts/matter_bin(src)
component_parts += new /obj/item/weapon/stock_parts/manipulator(src)
component_parts += new /obj/item/weapon/stock_parts/console_screen(src)
component_parts += new /obj/item/weapon/circuitboard/autolathe(null)
component_parts += new /obj/item/weapon/stock_parts/matter_bin(null)
component_parts += new /obj/item/weapon/stock_parts/matter_bin(null)
component_parts += new /obj/item/weapon/stock_parts/matter_bin(null)
component_parts += new /obj/item/weapon/stock_parts/manipulator(null)
component_parts += new /obj/item/weapon/stock_parts/console_screen(null)
RefreshParts()
src.L = autolathe_recipes
-1
View File
@@ -9,7 +9,6 @@
throw_speed = 2
throw_range = 5
w_class = 3.0
flags = TABLEPASS
var/created_name = "Cleanbot"
-2
View File
@@ -9,7 +9,6 @@
throw_speed = 2
throw_range = 5
w_class = 3.0
flags = TABLEPASS
var/created_name = "Floorbot"
/obj/item/weapon/toolbox_tiles_sensor
@@ -22,7 +21,6 @@
throw_speed = 2
throw_range = 5
w_class = 3.0
flags = TABLEPASS
var/created_name = "Floorbot"
//Floorbot
+1 -1
View File
@@ -219,7 +219,7 @@ Auto Patrol: []"},
walk_to(src,0)
if(target) // make sure target exists
if(get_dist(src, src.target) <= 1) // if right next to perp
if(get_dist(src, src.target) <= 1 && isturf(src.target.loc)) // if right next to perp
playsound(src.loc, 'sound/weapons/Egloves.ogg', 50, 1, -1)
src.icon_state = "secbot-c"
spawn(2)
+1 -1
View File
@@ -125,7 +125,7 @@
//U << text("Now tracking [] on camera.", target.name)
//if (U.machine == null)
// U.machine = U
U << "Now tracking [target.name] on camera."
U << "Now tracking [target.get_visible_name()] on camera."
spawn (0)
while (U.cameraFollow == target)
+39 -19
View File
@@ -3,6 +3,9 @@
//Potential replacement for genetics revives or something I dunno (?)
#define CLONE_INITIAL_DAMAGE 190 //Clones in clonepods start with 190 cloneloss damage and 190 brainloss damage, thats just logical
/obj/machinery/clonepod
anchored = 1
name = "cloning pod"
@@ -18,19 +21,30 @@
var/mess = 0 //Need to clean out it if it's full of exploded clone.
var/attempting = 0 //One clone attempt at a time thanks
var/eject_wait = 0 //Don't eject them as soon as they are created fuckkk
var/speed_coeff
var/efficiency
/obj/machinery/clonepod/New()
..()
component_parts = list()
component_parts += new /obj/item/weapon/circuitboard/clonepod(src)
component_parts += new /obj/item/weapon/stock_parts/scanning_module(src)
component_parts += new /obj/item/weapon/stock_parts/scanning_module(src)
component_parts += new /obj/item/weapon/stock_parts/manipulator(src)
component_parts += new /obj/item/weapon/stock_parts/manipulator(src)
component_parts += new /obj/item/weapon/stock_parts/console_screen(src)
component_parts += new /obj/item/weapon/cable_coil(src, 1)
component_parts += new /obj/item/weapon/cable_coil(src, 1)
component_parts += new /obj/item/weapon/circuitboard/clonepod(null)
component_parts += new /obj/item/weapon/stock_parts/scanning_module(null)
component_parts += new /obj/item/weapon/stock_parts/scanning_module(null)
component_parts += new /obj/item/weapon/stock_parts/manipulator(null)
component_parts += new /obj/item/weapon/stock_parts/manipulator(null)
component_parts += new /obj/item/weapon/stock_parts/console_screen(null)
component_parts += new /obj/item/weapon/cable_coil(null, 1)
component_parts += new /obj/item/weapon/cable_coil(null, 1)
RefreshParts()
/obj/machinery/clonepod/RefreshParts()
speed_coeff = 0
efficiency = 0
for(var/obj/item/weapon/stock_parts/scanning_module/S in component_parts)
efficiency += S.rating
for(var/obj/item/weapon/stock_parts/manipulator/P in component_parts)
speed_coeff += P.rating
heal_level = (efficiency * 15) + 10
//The return of data disks?? Just for transferring between genetics machine/cloning machine.
//TO-DO: Make the genetics machine accept them.
@@ -132,8 +146,6 @@
return 0
src.heal_level = rand(50,90) //Randomizes what health the clone is when ejected
src.attempting = 1 //One at a time!!
src.locked = 1
@@ -150,8 +162,8 @@
src.icon_state = "pod_1"
//Get the clone body ready
H.adjustCloneLoss(src.heal_level + 100) //new damage var so you can't eject a clone early then stab them to abuse the current damage system --NeoFite
H.adjustBrainLoss(heal_level)
H.adjustCloneLoss(CLONE_INITIAL_DAMAGE ) //Yeah, clones start with very low health, not with random, because why would they start with random health
H.adjustBrainLoss(CLONE_INITIAL_DAMAGE )
H.Paralyse(4)
//Here let's calculate their health so the pod doesn't immediately eject them!!!
@@ -178,7 +190,13 @@
// -- End mode specific stuff
hardset_dna(H, ui, se, null, mrace)
randmutb(H) //Sometimes the clones come out wrong.
if(efficiency > 2)
for(var/A in bad_se_blocks)
setblock(H.dna.struc_enzymes, A, construct_block(0,2))
if(efficiency > 5 && prob(20))
randmutg(H)
if(efficiency < 3 && prob(50))
randmutb(H)
if(H.gender == MALE)
H.facial_hair_style = "Full Beard"
@@ -206,14 +224,14 @@
src.connected_message("Clone Rejected: Deceased.")
return
else if(src.occupant.cloneloss > src.heal_level)
else if(src.occupant.cloneloss > (100 - src.heal_level))
src.occupant.Paralyse(4)
//Slowly get that clone healed and finished.
src.occupant.adjustCloneLoss(-heal_level/50)
src.occupant.adjustCloneLoss(-((speed_coeff/2)))
//Premature clones may have brain damage.
src.occupant.adjustBrainLoss(-heal_level/100)
src.occupant.adjustBrainLoss(-((speed_coeff/2)))
//So clones don't die of oxyloss in a running pod.
if (src.occupant.reagents.get_reagent_amount("inaprovaline") < 30)
@@ -222,7 +240,7 @@
use_power(7500) //This might need tweaking.
return
else if((src.occupant.cloneloss <= src.heal_level) && (!src.eject_wait))
else if((src.occupant.cloneloss <= (100 - src.heal_level)) && (!src.eject_wait))
src.connected_message("Cloning Process Complete.")
src.locked = 0
src.go_out()
@@ -350,7 +368,7 @@
return
/obj/machinery/clonepod/emp_act(severity)
if(prob(100/severity)) malfunction()
if(prob(100/(severity*efficiency))) malfunction()
..()
/obj/machinery/clonepod/ex_act(severity)
@@ -427,4 +445,6 @@
/* EMP grenade/spell effect
if(istype(A, /obj/machinery/clonepod))
A:malfunction()
*/
*/
#undef CLONE_INITIAL_DAMAGE
@@ -371,7 +371,7 @@
throw_range = 5
throwforce = 0
w_class = 2.0
flags = FPRINT | TABLEPASS | NOSHIELD
flags = NOSHIELD
var/active = 0
/obj/item/weapon/holo/esword/green
+4 -4
View File
@@ -279,7 +279,7 @@ That prevents a few funky behaviors.
A.loc = T.loc
A.cancel_camera()
A << "You have been uploaded to a stationary terminal. Remote device connection restored."
U << "\blue <b>Transfer succesful</b>: \black [A.name] ([rand(1000,9999)].exe) installed and executed successfully. Local copy has been removed."
U << "\blue <b>Transfer successful</b>: \black [A.name] ([rand(1000,9999)].exe) installed and executed successfully. Local copy has been removed."
del(T)
if("AIFIXER")//AI Fixer terminal.
var/obj/machinery/computer/aifixer/T = target
@@ -303,7 +303,7 @@ That prevents a few funky behaviors.
T.overlays -= image('icons/obj/computer.dmi', "ai-fixer-empty")
A.cancel_camera()
A << "You have been uploaded to a stationary terminal. Sadly, there is no remote access from here."
U << "\blue <b>Transfer successful</b>: \black [A.name] ([rand(1000,9999)].exe) installed and executed succesfully. Local copy has been removed."
U << "\blue <b>Transfer successful</b>: \black [A.name] ([rand(1000,9999)].exe) installed and executed successfully. Local copy has been removed."
else
if(!C.contents.len && T.occupant && !T.active)
C.name = "inteliCard - [T.occupant.name]"
@@ -315,7 +315,7 @@ That prevents a few funky behaviors.
C.icon_state = "aicard-full"
T.overlays -= image('icons/obj/computer.dmi', "ai-fixer-full")
T.occupant << "You have been downloaded to a mobile storage device. Still no remote access."
U << "\blue <b>Transfer succesful</b>: \black [T.occupant.name] ([rand(1000,9999)].exe) removed from host terminal and stored within local memory."
U << "\blue <b>Transfer successful</b>: \black [T.occupant.name] ([rand(1000,9999)].exe) removed from host terminal and stored within local memory."
T.occupant.loc = C
T.occupant.cancel_camera()
T.occupant = null
@@ -340,7 +340,7 @@ That prevents a few funky behaviors.
T.overlays -= image('icons/obj/computer.dmi', "ai-fixer-empty")
A.cancel_camera()
A << "You have been uploaded to a stationary terminal. Sadly, there is no remote access from here."
U << "\blue <b>Transfer successful</b>: \black [A.name] ([rand(1000,9999)].exe) installed and executed succesfully. Local copy has been removed."
U << "\blue <b>Transfer successful</b>: \black [A.name] ([rand(1000,9999)].exe) installed and executed successfully. Local copy has been removed."
else
if(!C.AI && T.occupant && !T.active)
if (T.occupant.stat)
+1 -1
View File
@@ -70,7 +70,7 @@
desc = "Does not support Pinball."
icon = 'icons/obj/computer.dmi'
icon_state = "arcade"
circuit = /obj/item/weapon/circuitboard/arcade
circuit = /obj/item/weapon/circuitboard/arcade/battle
var/enemy_name = "Space Villian"
var/temp = "Winners Don't Use Spacedrugs" //Temporary message, for attack messages, etc
var/player_hp = 30 //Player health/attack points
+103 -95
View File
@@ -31,195 +31,195 @@
/obj/item/weapon/circuitboard/message_monitor
name = "circuit board (Message Monitor)"
build_path = "/obj/machinery/computer/message_monitor"
build_path = /obj/machinery/computer/message_monitor
origin_tech = "programming=3"
/obj/item/weapon/circuitboard/security
name = "circuit board (Security)"
build_path = "/obj/machinery/computer/security"
build_path = /obj/machinery/computer/security
/obj/item/weapon/circuitboard/aicore
name = "circuit board (AI core)"
origin_tech = "programming=4;biotech=2"
board_type = "other"
/obj/item/weapon/circuitboard/aiupload
name = "circuit board (AI Upload)"
build_path = "/obj/machinery/computer/upload/ai"
build_path = /obj/machinery/computer/upload/ai
origin_tech = "programming=4"
/obj/item/weapon/circuitboard/borgupload
name = "circuit board (Cyborg Upload)"
build_path = "/obj/machinery/computer/upload/borg"
build_path = /obj/machinery/computer/upload/borg
origin_tech = "programming=4"
/obj/item/weapon/circuitboard/med_data
name = "circuit board (Medical Records Console)"
build_path = "/obj/machinery/computer/med_data"
build_path = /obj/machinery/computer/med_data
/obj/item/weapon/circuitboard/pandemic
name = "circuit board (PanD.E.M.I.C. 2200)"
build_path = "/obj/machinery/computer/pandemic"
build_path = /obj/machinery/computer/pandemic
origin_tech = "programming=2;biotech=2"
/obj/item/weapon/circuitboard/scan_consolenew
name = "circuit board (DNA Machine)"
build_path = "/obj/machinery/computer/scan_consolenew"
build_path = /obj/machinery/computer/scan_consolenew
origin_tech = "programming=2;biotech=2"
/obj/item/weapon/circuitboard/communications
name = "circuit board (Communications)"
build_path = "/obj/machinery/computer/communications"
build_path = /obj/machinery/computer/communications
origin_tech = "programming=2;magnets=2"
/obj/item/weapon/circuitboard/card
name = "circuit board (ID Console)"
build_path = "/obj/machinery/computer/card"
build_path = /obj/machinery/computer/card
/obj/item/weapon/circuitboard/card/centcom
name = "circuit board (Centcom ID Console)"
build_path = "/obj/machinery/computer/card/centcom"
build_path = /obj/machinery/computer/card/centcom
//obj/item/weapon/circuitboard/shield
// name = "Circuit board (Shield Control)"
// build_path = "/obj/machinery/computer/stationshield"
// build_path = /obj/machinery/computer/stationshield
/obj/item/weapon/circuitboard/teleporter
name = "circuit board (Teleporter)"
build_path = "/obj/machinery/computer/teleporter"
build_path = /obj/machinery/computer/teleporter
origin_tech = "programming=2;bluespace=2"
/obj/item/weapon/circuitboard/secure_data
name = "circuit board (Security Records Console)"
build_path = "/obj/machinery/computer/secure_data"
build_path = /obj/machinery/computer/secure_data
/obj/item/weapon/circuitboard/stationalert
name = "circuit board (Station Alerts)"
build_path = "/obj/machinery/computer/station_alert"
/obj/item/weapon/circuitboard/atmospheresiphonswitch
build_path = /obj/machinery/computer/station_alert
/*/obj/item/weapon/circuitboard/atmospheresiphonswitch
name = "circuit board (Atmosphere siphon control)"
build_path = "/obj/machinery/computer/atmosphere/siphonswitch"
build_path = /obj/machinery/computer/atmosphere/siphonswitch*/
/obj/item/weapon/circuitboard/air_management
name = "circuit board (Atmospheric monitor)"
build_path = "/obj/machinery/computer/general_air_control"
build_path = /obj/machinery/computer/general_air_control
/obj/item/weapon/circuitboard/injector_control
name = "circuit board (Injector control)"
build_path = "/obj/machinery/computer/general_air_control/fuel_injection"
build_path = /obj/machinery/computer/general_air_control/fuel_injection
/obj/item/weapon/circuitboard/atmos_alert
name = "circuit board (Atmospheric Alert)"
build_path = "/obj/machinery/computer/atmos_alert"
build_path = /obj/machinery/computer/atmos_alert
/obj/item/weapon/circuitboard/pod
name = "circuit board (Massdriver control)"
build_path = "/obj/machinery/computer/pod"
build_path = /obj/machinery/computer/pod
/obj/item/weapon/circuitboard/robotics
name = "circuit board (Robotics Control)"
build_path = "/obj/machinery/computer/robotics"
build_path = /obj/machinery/computer/robotics
origin_tech = "programming=3"
/obj/item/weapon/circuitboard/cloning
name = "circuit board (Cloning)"
build_path = "/obj/machinery/computer/cloning"
build_path = /obj/machinery/computer/cloning
origin_tech = "programming=3;biotech=3"
/obj/item/weapon/circuitboard/arcade/battle
name = "circuit board (Arcade Battle)"
build_path = "/obj/machinery/computer/arcade/battle"
build_path = /obj/machinery/computer/arcade/battle
origin_tech = "programming=1"
/obj/item/weapon/circuitboard/arcade/orion_trail
name = "circuit board (Orion_Trail)"
build_path = "/obj/machinery/computer/arcade/orion_trail"
build_path = /obj/machinery/computer/arcade/orion_trail
origin_tech = "programming=2"
/obj/item/weapon/circuitboard/turbine_control
name = "circuit board (Turbine control)"
build_path = "/obj/machinery/computer/turbine_computer"
build_path = /obj/machinery/computer/turbine_computer
/obj/item/weapon/circuitboard/solar_control
name = "circuit board (Solar Control)" //name fixed 250810
build_path = "/obj/machinery/power/solar_control"
build_path = /obj/machinery/power/solar_control
origin_tech = "programming=2;powerstorage=2"
/obj/item/weapon/circuitboard/powermonitor
name = "circuit board (Power Monitor)" //name fixed 250810
build_path = "/obj/machinery/computer/monitor"
build_path = /obj/machinery/computer/monitor
/obj/item/weapon/circuitboard/olddoor
name = "circuit board (DoorMex)"
build_path = "/obj/machinery/computer/pod/old"
build_path = /obj/machinery/computer/pod/old
/obj/item/weapon/circuitboard/syndicatedoor
name = "circuit board (ProComp Executive)"
build_path = "/obj/machinery/computer/pod/old/syndicate"
build_path = /obj/machinery/computer/pod/old/syndicate
/obj/item/weapon/circuitboard/swfdoor
name = "circuit board (Magix)"
build_path = "/obj/machinery/computer/pod/old/swf"
build_path = /obj/machinery/computer/pod/old/swf
/obj/item/weapon/circuitboard/prisoner
name = "circuit board (Prisoner Management Console)"
build_path = "/obj/machinery/computer/prisoner"
build_path = /obj/machinery/computer/prisoner
/obj/item/weapon/circuitboard/rdconsole
name = "circuit Board (RD Console)"
build_path = "/obj/machinery/computer/rdconsole/core"
build_path = /obj/machinery/computer/rdconsole/core
/obj/item/weapon/circuitboard/mecha_control
name = "circuit Board (Exosuit Control Console)"
build_path = "/obj/machinery/computer/mecha"
build_path = /obj/machinery/computer/mecha
/obj/item/weapon/circuitboard/rdservercontrol
name = "circuit Board (R&D Server Control)"
build_path = "/obj/machinery/computer/rdservercontrol"
build_path = /obj/machinery/computer/rdservercontrol
/obj/item/weapon/circuitboard/crew
name = "circuit board (Crew Monitoring Console)"
build_path = "/obj/machinery/computer/crew"
build_path = /obj/machinery/computer/crew
origin_tech = "programming=3;biotech=2;magnets=2"
/obj/item/weapon/circuitboard/mech_bay_power_console
name = "circuit board (Mech Bay Power Control Console)"
build_path = "/obj/machinery/computer/mech_bay_power_console"
build_path = /obj/machinery/computer/mech_bay_power_console
origin_tech = "programming=2;powerstorage=3"
/obj/item/weapon/circuitboard/ordercomp
name = "circuit board (Supply Ordering Console)"
build_path = "/obj/machinery/computer/ordercomp"
build_path = /obj/machinery/computer/ordercomp
origin_tech = "programming=2"
/obj/item/weapon/circuitboard/supplycomp
name = "circuit board (Supply shuttle console)"
build_path = "/obj/machinery/computer/supplycomp"
build_path = /obj/machinery/computer/supplycomp
origin_tech = "programming=3"
var/contraband_enabled = 0
/obj/item/weapon/circuitboard/operating
name = "circuit board (Operating Computer)"
build_path = "/obj/machinery/computer/operating"
build_path = /obj/machinery/computer/operating
origin_tech = "programming=2;biotech=2"
/obj/item/weapon/circuitboard/mining
name = "circuit board (Outpost Status Display)"
build_path = "/obj/machinery/computer/security/mining"
build_path = /obj/machinery/computer/security/mining
origin_tech = "programming=2"
/obj/item/weapon/circuitboard/comm_monitor
name = "circuit board (Telecommunications Monitor)"
build_path = "/obj/machinery/computer/telecomms/monitor"
build_path = /obj/machinery/computer/telecomms/monitor
origin_tech = "programming=3"
/obj/item/weapon/circuitboard/comm_server
name = "circuit board (Telecommunications Server Monitor)"
build_path = "/obj/machinery/computer/telecomms/server"
build_path = /obj/machinery/computer/telecomms/server
origin_tech = "programming=3"
/obj/item/weapon/circuitboard/comm_traffic
name = "circuitboard (Telecommunications Traffic Control)"
build_path = "/obj/machinery/computer/telecomms/traffic"
build_path = /obj/machinery/computer/telecomms/traffic
origin_tech = "programming=3"
/obj/item/weapon/circuitboard/curefab
/*/obj/item/weapon/circuitboard/curefab
name = "circuit board (Cure fab)"
build_path = "/obj/machinery/computer/curer"
build_path = /obj/machinery/computer/curer
/obj/item/weapon/circuitboard/splicer
name = "circuit board (Disease Splicer)"
build_path = "/obj/machinery/computer/diseasesplicer"
build_path = /obj/machinery/computer/diseasesplicer*/
/obj/item/weapon/circuitboard/shuttle
name = "circuit board (Shuttle)"
build_path = "/obj/machinery/computer/shuttle"
build_path = /obj/machinery/computer/shuttle
origin_tech = "programming=2"
id = "1"
/obj/item/weapon/circuitboard/labor_shuttle
name = "circuit Board (Labor Shuttle)"
build_path = "/obj/machinery/computer/shuttle/labor"
build_path = /obj/machinery/computer/shuttle/labor
origin_tech = "programming 2"
/obj/item/weapon/circuitboard/labor_shuttle/one_way
name = "circuit Board (Prisoner Shuttle Console)"
build_path = "/obj/machinery/computer/shuttle/labor/one_way"
build_path = /obj/machinery/computer/shuttle/labor/one_way
origin_tech = "programming 2"
/obj/item/weapon/circuitboard/mining_shuttle
name = "circuit Board (Mining Shuttle)"
build_path = "/obj/machinery/computer/shuttle/mining"
build_path = /obj/machinery/computer/shuttle/mining
origin_tech = "programming 2"
/obj/item/weapon/circuitboard/HolodeckControl // Not going to let people get this, but it's just here for future
name = "circuit board (Holodeck Control)"
build_path = "/obj/machinery/computer/HolodeckControl"
build_path = /obj/machinery/computer/HolodeckControl
origin_tech = "programming=4"
/obj/item/weapon/circuitboard/aifixer
name = "circuit board (AI Integrity Restorer)"
build_path = "/obj/machinery/computer/aifixer"
build_path = /obj/machinery/computer/aifixer
origin_tech = "programming=3;biotech=2"
/obj/item/weapon/circuitboard/area_atmos
name = "circuit board (Area Air Control)"
build_path = "/obj/machinery/computer/area_atmos"
build_path = /obj/machinery/computer/area_atmos
origin_tech = "programming=2"
/obj/item/weapon/circuitboard/prison_shuttle
/*/obj/item/weapon/circuitboard/prison_shuttle
name = "circuit board (Prison Shuttle)"
build_path = "/obj/machinery/computer/prison_shuttle"
origin_tech = "programming=2"
build_path = /obj/machinery/computer/prison_shuttle
origin_tech = "programming=2"*/
/obj/item/weapon/circuitboard/supplycomp/attackby(obj/item/I as obj, mob/user as mob)
@@ -247,13 +247,13 @@
/obj/item/weapon/circuitboard/rdconsole/attackby(obj/item/I as obj, mob/user as mob)
if(istype(I,/obj/item/weapon/screwdriver))
if(src.build_path == "/obj/machinery/computer/rdconsole/core")
src.name = "circuit board (RD Console - Robotics)"
src.build_path = "/obj/machinery/computer/rdconsole/robotics"
user << "\blue Access protocols successfully updated."
name = "circuit board (RD Console - Robotics)"
build_path = /obj/machinery/computer/rdconsole/robotics
user << "<span class='notice'>Access protocols successfully updated.</span>"
else
src.name = "circuit board (RD Console)"
src.build_path = "/obj/machinery/computer/rdconsole/core"
user << "\blue Defaulting access protocols."
name = "circuit board (RD Console)"
build_path = /obj/machinery/computer/rdconsole/core
user << "<span class='notice'>Defaulting access protocols.</span>"
return
/obj/item/weapon/circuitboard/shuttle/attackby(obj/item/I as obj, mob/user as mob)
@@ -264,79 +264,85 @@
return
/obj/structure/computerframe/attackby(obj/item/P as obj, mob/user as mob)
add_fingerprint(user)
switch(state)
if(0)
if(istype(P, /obj/item/weapon/wrench))
playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
if(do_after(user, 20))
user << "\blue You wrench the frame into place."
src.anchored = 1
src.state = 1
user << "<span class='notice'>You wrench the frame into place.</span>"
anchored = 1
state = 1
if(istype(P, /obj/item/weapon/weldingtool))
var/obj/item/weapon/weldingtool/WT = P
if(!WT.remove_fuel(0, user))
user << "The welding tool must be on to complete this task."
user << "<span class='warning'>The welding tool must be on to complete this task.</span>"
return
playsound(src.loc, 'sound/items/Welder.ogg', 50, 1)
if(do_after(user, 20))
if(!src || !WT.isOn()) return
user << "\blue You deconstruct the frame."
new /obj/item/stack/sheet/metal( src.loc, 5 )
user << "<span class='notice'>You deconstruct the frame.</span>"
var/obj/item/stack/sheet/metal/M = new (loc, 5)
M.add_fingerprint(user)
del(src)
if(1)
if(istype(P, /obj/item/weapon/wrench))
playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
if(do_after(user, 20))
user << "\blue You unfasten the frame."
src.anchored = 0
src.state = 0
user << "<span class='notice'>You unfasten the frame.</span>"
anchored = 0
state = 0
if(istype(P, /obj/item/weapon/circuitboard) && !circuit)
var/obj/item/weapon/circuitboard/B = P
if(B.board_type == "computer")
playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
user << "\blue You place the circuit board inside the frame."
src.icon_state = "1"
src.circuit = P
user << "<span class='notice'>You place the circuit board inside the frame.</span>"
icon_state = "1"
circuit = P
user.drop_item()
circuit.add_fingerprint(user)
P.loc = src
else
user << "\red This frame does not accept circuit boards of this type!"
user << "<span class='warning'>This frame does not accept circuit boards of this type!</span>"
if(istype(P, /obj/item/weapon/screwdriver) && circuit)
playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
user << "\blue You screw the circuit board into place."
src.state = 2
src.icon_state = "2"
user << "<span class='notice'>You screw the circuit board into place.</span>"
state = 2
icon_state = "2"
if(istype(P, /obj/item/weapon/crowbar) && circuit)
playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1)
user << "\blue You remove the circuit board."
src.state = 1
src.icon_state = "0"
user << "<span class='notice'>You remove the circuit board.</span>"
state = 1
icon_state = "0"
circuit.loc = src.loc
src.circuit = null
circuit.add_fingerprint(user)
circuit = null
if(2)
if(istype(P, /obj/item/weapon/screwdriver) && circuit)
playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
user << "\blue You unfasten the circuit board."
user << "<span class='notice'>You unfasten the circuit board.</span>"
src.state = 1
src.icon_state = "1"
if(istype(P, /obj/item/weapon/cable_coil))
if(P:amount >= 5)
var/obj/item/weapon/cable_coil/C = P
if(C.amount >= 5)
playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
if(do_after(user, 20))
if(P)
P:amount -= 5
if(!P:amount) del(P)
user << "\blue You add cables to the frame."
if(C && C.amount >= 5)
C.amount -= 5
if(C.amount <= 0) del(C)
user << "<span class='notice'>You add cables to the frame.</span>"
src.state = 3
src.icon_state = "3"
if(3)
if(istype(P, /obj/item/weapon/wirecutters))
playsound(src.loc, 'sound/items/Wirecutter.ogg', 50, 1)
user << "\blue You remove the cables."
user << "<span class='notice'>You remove the cables.</span>"
src.state = 2
src.icon_state = "2"
var/obj/item/weapon/cable_coil/A = new /obj/item/weapon/cable_coil( src.loc )
var/obj/item/weapon/cable_coil/A = new (loc)
A.amount = 5
A.add_fingerprint(user)
if(istype(P, /obj/item/stack/sheet/glass))
if(P:amount >= 2)
@@ -344,20 +350,21 @@
if(do_after(user, 20))
if(P)
P:use(2)
user << "\blue You put in the glass panel."
user << "<span class='notice'>You put in the glass panel.</span>"
src.state = 4
src.icon_state = "4"
if(4)
if(istype(P, /obj/item/weapon/crowbar))
playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1)
user << "\blue You remove the glass panel."
user << "<span class='notice'>You remove the glass panel.</span>"
src.state = 3
src.icon_state = "3"
new /obj/item/stack/sheet/glass( src.loc, 2 )
var/obj/item/stack/sheet/glass/G = new (loc, 2)
G.add_fingerprint(user)
if(istype(P, /obj/item/weapon/screwdriver))
playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
user << "\blue You connect the monitor."
var/B = new src.circuit.build_path ( src.loc )
user << "<span class='notice'>You connect the monitor.</span>"
var/obj/B = new src.circuit.build_path (src.loc)
if(circuit.powernet) B:powernet = circuit.powernet
if(circuit.id) B:id = circuit.id
if(circuit.records) B:records = circuit.records
@@ -370,4 +377,5 @@
var/obj/machinery/computer/shuttle/S = B
var/obj/item/weapon/circuitboard/shuttle/C = circuit
S.id = C.id
transfer_fingerprints_to(B)
del(src)
+30 -3
View File
@@ -15,6 +15,7 @@
var/datum/data/record/active_record = null
var/obj/item/weapon/disk/data/diskette = null //Mostly so the geneticist can steal everything.
var/loading = 0 // Nice loading text
var/autoprocess = 0
/obj/machinery/computer/cloning/New()
..()
@@ -23,6 +24,19 @@
return
return
/obj/machinery/computer/cloning/process()
if(!(scanner && pod1 && autoprocess))
return
if(scanner.occupant && (scanner.scan_level > 2))
scan_mob(scanner.occupant)
if(!(pod1.occupant || pod1.mess) && (pod1.efficiency > 5))
for(var/datum/data/record/R in records)
if(!(pod1.occupant || pod1.mess))
if(pod1.growclone(R.fields["ckey"], R.fields["name"], R.fields["UI"], R.fields["SE"], R.fields["mind"], R.fields["mrace"]))
records -= R
/obj/machinery/computer/cloning/proc/updatemodules()
src.scanner = findscanner()
src.pod1 = findcloner()
@@ -82,7 +96,13 @@
var/dat = ""
dat += "<a href='byond://?src=\ref[src];refresh=1'>Refresh</a>"
if(scanner && pod1 && ((scanner.scan_level > 2) || (pod1.efficiency > 5)))
if(!autoprocess)
dat += "<a href='byond://?src=\ref[src];task=autoprocess'>Autoprocess</a>"
else
dat += "<a href='byond://?src=\ref[src];task=stopautoprocess'>Stop autoprocess</a>"
else
dat += "<span class='linkOff'>Autoprocess</span>"
dat += "<h3>Cloning Pod Status</h3>"
dat += "<div class='statusDisplay'>[temp]&nbsp;</div>"
@@ -200,7 +220,14 @@
if(loading)
return
if ((href_list["scan"]) && (!isnull(src.scanner)))
if(href_list["task"])
switch(href_list["task"])
if("autoprocess")
autoprocess = 1
if("stopautoprocess")
autoprocess = 0
else if ((href_list["scan"]) && (!isnull(src.scanner)))
scantemp = ""
loading = 1
@@ -325,7 +352,7 @@
if (subject.suiciding == 1)
scantemp = "<font class='bad'>Subject's brain is not responding to scanning stimuli.</font>"
return
if (NOCLONE in subject.mutations)
if (NOCLONE in subject.mutations && src.scanner.scan_level < 2)
scantemp = "<font class='bad'>Subject no longer contains the fundamental materials required to create a living clone.</font>"
return
if ((!subject.ckey) || (!subject.client))
+2 -2
View File
@@ -439,7 +439,7 @@
if( customrecepient.loc && ishuman(customrecepient.loc) )
var/mob/living/carbon/human/H = customrecepient.loc
H << "\icon[customrecepient] <b>Message from [customsender] ([customjob]), </b>\"[custommessage]\" (<a href='byond://?src=\ref[src];choice=Message;skiprefresh=1;target=\ref[src]'>Reply</a>)"
log_pda("[usr] (PDA: [customsender]) sent \"[custommessage]\" to [customrecepient.owner]")
log_pda("[usr]/([usr.ckey]) (PDA: [customsender]) sent \"[custommessage]\" to [customrecepient.owner]")
customrecepient.overlays.Cut()
customrecepient.overlays += image('icons/obj/pda.dmi', "pda-r")
//Sender is faking as someone who exists
@@ -453,7 +453,7 @@
if( customrecepient.loc && ishuman(customrecepient.loc) )
var/mob/living/carbon/human/H = customrecepient.loc
H << "\icon[customrecepient] <b>Message from [PDARec.owner] ([customjob]), </b>\"[custommessage]\" (<a href='byond://?src=\ref[customrecepient];choice=Message;skiprefresh=1;target=\ref[PDARec]'>Reply</a>)"
log_pda("[usr] (PDA: [PDARec.owner]) sent \"[custommessage]\" to [customrecepient.owner]")
log_pda("[usr]/([usr.ckey]) (PDA: [PDARec.owner]) sent \"[custommessage]\" to [customrecepient.owner]")
customrecepient.overlays.Cut()
customrecepient.overlays += image('icons/obj/pda.dmi', "pda-r")
//Finally..
+1 -1
View File
@@ -8,7 +8,7 @@
attackby(var/obj/item/weapon/card/W as obj, var/mob/user as mob)
if(stat & (BROKEN|NOPOWER)) return
if ((!( istype(W, /obj/item/weapon/card) ) || !( ticker ) || emergency_shuttle.location != DOCKED || !( user ))) return
if (!( istype(W, /obj/item/weapon/card) ) || !( ticker ) || emergency_shuttle.location != DOCKED || !( user ) || emergency_shuttle.timeleft() < 11) return
if (istype(W, /obj/item/weapon/card/id)||istype(W, /obj/item/device/pda))
if (istype(W, /obj/item/device/pda))
var/obj/item/device/pda/pda = W
+18 -18
View File
@@ -162,7 +162,7 @@ to destroy them and players will be able to make replacements.
*/
/obj/item/weapon/circuitboard/destructive_analyzer
name = "circuit board (Destructive Analyzer)"
build_path = "/obj/machinery/r_n_d/destructive_analyzer"
build_path = /obj/machinery/r_n_d/destructive_analyzer
board_type = "machine"
origin_tech = "magnets=2;engineering=2;programming=2"
req_components = list(
@@ -172,7 +172,7 @@ to destroy them and players will be able to make replacements.
/obj/item/weapon/circuitboard/autolathe
name = "circuit board (Autolathe)"
build_path = "/obj/machinery/autolathe"
build_path = /obj/machinery/autolathe
board_type = "machine"
origin_tech = "engineering=2;programming=2"
req_components = list(
@@ -182,7 +182,7 @@ to destroy them and players will be able to make replacements.
/obj/item/weapon/circuitboard/protolathe
name = "circuit board (Protolathe)"
build_path = "/obj/machinery/r_n_d/protolathe"
build_path = /obj/machinery/r_n_d/protolathe
board_type = "machine"
origin_tech = "engineering=2;programming=2"
req_components = list(
@@ -193,7 +193,7 @@ to destroy them and players will be able to make replacements.
/obj/item/weapon/circuitboard/circuit_imprinter
name = "circuit board (Circuit Imprinter)"
build_path = "/obj/machinery/r_n_d/circuit_imprinter"
build_path = /obj/machinery/r_n_d/circuit_imprinter
board_type = "machine"
origin_tech = "engineering=2;programming=2"
req_components = list(
@@ -203,7 +203,7 @@ to destroy them and players will be able to make replacements.
/obj/item/weapon/circuitboard/pacman
name = "circuit board (PACMAN-type Generator)"
build_path = "/obj/machinery/power/port_gen/pacman"
build_path = /obj/machinery/power/port_gen/pacman
board_type = "machine"
origin_tech = "programming=3:powerstorage=3;plasmatech=3;engineering=3"
req_components = list(
@@ -214,7 +214,7 @@ to destroy them and players will be able to make replacements.
/obj/item/weapon/circuitboard/pacman/super
name = "circuit board (SUPERPACMAN-type Generator)"
build_path = "/obj/machinery/power/port_gen/pacman/super"
build_path = /obj/machinery/power/port_gen/pacman/super
origin_tech = "programming=3;powerstorage=4;engineering=4"
/obj/item/weapon/circuitboard/pacman/mrs
@@ -224,7 +224,7 @@ to destroy them and players will be able to make replacements.
obj/item/weapon/circuitboard/rdserver
name = "circuit board (R&D Server)"
build_path = "/obj/machinery/r_n_d/server"
build_path = /obj/machinery/r_n_d/server
board_type = "machine"
origin_tech = "programming=3"
req_components = list(
@@ -233,7 +233,7 @@ obj/item/weapon/circuitboard/rdserver
/obj/item/weapon/circuitboard/mechfab
name = "circuit board (Exosuit Fabricator)"
build_path = "/obj/machinery/mecha_part_fabricator"
build_path = /obj/machinery/mecha_part_fabricator
board_type = "machine"
origin_tech = "programming=3;engineering=3"
req_components = list(
@@ -244,7 +244,7 @@ obj/item/weapon/circuitboard/rdserver
/obj/item/weapon/circuitboard/clonepod
name = "circuit board (Clone Pod)"
build_path = "/obj/machinery/clonepod"
build_path = /obj/machinery/clonepod
board_type = "machine"
origin_tech = "programming=3;biotech=3"
req_components = list(
@@ -255,7 +255,7 @@ obj/item/weapon/circuitboard/rdserver
/obj/item/weapon/circuitboard/clonescanner
name = "circuit board (Cloning Scanner)"
build_path = "/obj/machinery/dna_scannernew"
build_path = /obj/machinery/dna_scannernew
board_type = "machine"
origin_tech = "programming=2;biotech=2"
req_components = list(
@@ -267,7 +267,7 @@ obj/item/weapon/circuitboard/rdserver
/obj/item/weapon/circuitboard/cyborgrecharger
name = "circuit board (Cyborg Recharger)"
build_path = "/obj/machinery/recharge_station"
build_path = /obj/machinery/recharge_station
board_type = "machine"
origin_tech = "powerstorage=3;engineering=3"
req_components = list(
@@ -279,7 +279,7 @@ obj/item/weapon/circuitboard/rdserver
/obj/item/weapon/circuitboard/telecomms/receiver
name = "circuit board (Subspace Receiver)"
build_path = "/obj/machinery/telecomms/receiver"
build_path = /obj/machinery/telecomms/receiver
board_type = "machine"
origin_tech = "programming=2;engineering=2;bluespace=1"
req_components = list(
@@ -290,7 +290,7 @@ obj/item/weapon/circuitboard/rdserver
/obj/item/weapon/circuitboard/telecomms/hub
name = "circuit board (Hub Mainframe)"
build_path = "/obj/machinery/telecomms/hub"
build_path = /obj/machinery/telecomms/hub
board_type = "machine"
origin_tech = "programming=2;engineering=2"
req_components = list(
@@ -300,7 +300,7 @@ obj/item/weapon/circuitboard/rdserver
/obj/item/weapon/circuitboard/telecomms/relay
name = "circuit board (Relay Mainframe)"
build_path = "/obj/machinery/telecomms/relay"
build_path = /obj/machinery/telecomms/relay
board_type = "machine"
origin_tech = "programming=2;engineering=2;bluespace=2"
req_components = list(
@@ -310,7 +310,7 @@ obj/item/weapon/circuitboard/rdserver
/obj/item/weapon/circuitboard/telecomms/bus
name = "circuit board (Bus Mainframe)"
build_path = "/obj/machinery/telecomms/bus"
build_path = /obj/machinery/telecomms/bus
board_type = "machine"
origin_tech = "programming=2;engineering=2"
req_components = list(
@@ -320,7 +320,7 @@ obj/item/weapon/circuitboard/rdserver
/obj/item/weapon/circuitboard/telecomms/processor
name = "circuit board (Processor Unit)"
build_path = "/obj/machinery/telecomms/processor"
build_path = /obj/machinery/telecomms/processor
board_type = "machine"
origin_tech = "programming=2;engineering=2"
req_components = list(
@@ -333,7 +333,7 @@ obj/item/weapon/circuitboard/rdserver
/obj/item/weapon/circuitboard/telecomms/server
name = "circuit board (Telecommunication Server)"
build_path = "/obj/machinery/telecomms/server"
build_path = /obj/machinery/telecomms/server
board_type = "machine"
origin_tech = "programming=2;engineering=2"
req_components = list(
@@ -343,7 +343,7 @@ obj/item/weapon/circuitboard/rdserver
/obj/item/weapon/circuitboard/telecomms/broadcaster
name = "circuit board (Subspace Broadcaster)"
build_path = "/obj/machinery/telecomms/broadcaster"
build_path = /obj/machinery/telecomms/broadcaster
board_type = "machine"
origin_tech = "programming=2;engineering=2;bluespace=1"
req_components = list(
+2 -2
View File
@@ -67,9 +67,9 @@
return
/obj/machinery/door/Move()
air_update_turf(1)
var/turf/T = loc
..()
air_update_turf(1)
move_update_air(T)
/obj/machinery/door/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
if(air_group) return 0
+2 -2
View File
@@ -409,10 +409,10 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co
dat+="<FONT COLOR='green'>Wanted issue for [src.channel_name] successfully edited.</FONT><BR><BR>"
dat+="<BR><A href='?src=\ref[src];setScreen=[0]'>Return</A><BR>"
if(20)
dat+="<FONT COLOR='green'>Printing successfull. Please receive your newspaper from the bottom of the machine.</FONT><BR><BR>"
dat+="<FONT COLOR='green'>Printing successful. Please receive your newspaper from the bottom of the machine.</FONT><BR><BR>"
dat+="<A href='?src=\ref[src];setScreen=[0]'>Return</A>"
if(21)
dat+="<FONT COLOR='maroon'>Unable to print newspaper. Insufficient paper. Please notify maintenance personnell to refill machine storage.</FONT><BR><BR>"
dat+="<FONT COLOR='maroon'>Unable to print newspaper. Insufficient paper. Please notify maintenance personnel to refill machine storage.</FONT><BR><BR>"
dat+="<A href='?src=\ref[src];setScreen=[0]'>Return</A>"
else
dat+="I'm sorry to break your immersion. This shit's bugged. Report this bug to Agouri, polyxenitopalidou@gmail.com"
+36 -14
View File
@@ -20,6 +20,7 @@ Buildable meters
#define PIPE_PASSIVE_GATE 15
#define PIPE_VOLUME_PUMP 16
#define PIPE_HEAT_EXCHANGE 17
#define PIPE_DVALVE 18
/obj/item/pipe
name = "pipe"
@@ -31,7 +32,6 @@ Buildable meters
icon = 'icons/obj/pipe-item.dmi'
icon_state = "simple"
item_state = "buildpipe"
flags = TABLEPASS|FPRINT
w_class = 3
level = 2
@@ -59,6 +59,8 @@ Buildable meters
src.pipe_type = PIPE_MANIFOLD
else if(istype(make_from, /obj/machinery/atmospherics/unary/vent_pump))
src.pipe_type = PIPE_UVENT
else if(istype(make_from, /obj/machinery/atmospherics/valve/digital))
src.pipe_type = PIPE_DVALVE
else if(istype(make_from, /obj/machinery/atmospherics/valve))
src.pipe_type = PIPE_MVALVE
else if(istype(make_from, /obj/machinery/atmospherics/binary/pump))
@@ -94,8 +96,8 @@ Buildable meters
"connector", \
"manifold", \
"junction", \
"uvent", \
"mvalve", \
"vent", \
"manual valve", \
"pump", \
"scrubber", \
"insulated pipe", \
@@ -105,6 +107,7 @@ Buildable meters
"passive gate", \
"volume pump", \
"heat exchanger", \
"digital valve", \
)
name = nlist[pipe_type+1] + " fitting"
var/list/islist = list( \
@@ -126,6 +129,7 @@ Buildable meters
"passivegate", \
"volumepump", \
"heunary", \
"dvalve", \
)
icon_state = islist[pipe_type + 1]
@@ -144,7 +148,7 @@ Buildable meters
src.dir = turn(src.dir, -90)
if (pipe_type in list (PIPE_SIMPLE_STRAIGHT, PIPE_HE_STRAIGHT, PIPE_INSULATED_STRAIGHT, PIPE_MVALVE))
if (pipe_type in list (PIPE_SIMPLE_STRAIGHT, PIPE_HE_STRAIGHT, PIPE_INSULATED_STRAIGHT, PIPE_MVALVE, PIPE_DVALVE))
if(dir==2)
dir = 1
else if(dir==8)
@@ -157,7 +161,7 @@ Buildable meters
if ((pipe_type in list (PIPE_SIMPLE_BENT, PIPE_HE_BENT, PIPE_INSULATED_BENT)) \
&& (src.dir in cardinal))
src.dir = src.dir|turn(src.dir, 90)
else if (pipe_type in list (PIPE_SIMPLE_STRAIGHT, PIPE_HE_STRAIGHT, PIPE_INSULATED_STRAIGHT, PIPE_MVALVE))
else if (pipe_type in list (PIPE_SIMPLE_STRAIGHT, PIPE_HE_STRAIGHT, PIPE_INSULATED_STRAIGHT, PIPE_MVALVE, PIPE_DVALVE))
if(dir==2)
dir = 1
else if(dir==8)
@@ -177,11 +181,12 @@ Buildable meters
if( PIPE_SIMPLE_STRAIGHT, \
PIPE_INSULATED_STRAIGHT, \
PIPE_HE_STRAIGHT, \
PIPE_JUNCTION ,\
PIPE_PUMP ,\
PIPE_VOLUME_PUMP ,\
PIPE_PASSIVE_GATE ,\
PIPE_MVALVE \
PIPE_JUNCTION, \
PIPE_PUMP, \
PIPE_VOLUME_PUMP, \
PIPE_PASSIVE_GATE, \
PIPE_MVALVE, \
PIPE_DVALVE \
)
return dir|flip
if(PIPE_SIMPLE_BENT, PIPE_INSULATED_BENT, PIPE_HE_BENT)
@@ -236,7 +241,7 @@ Buildable meters
return ..()
if (!isturf(src.loc))
return 1
if (pipe_type in list (PIPE_SIMPLE_STRAIGHT, PIPE_HE_STRAIGHT, PIPE_INSULATED_STRAIGHT, PIPE_MVALVE))
if (pipe_type in list (PIPE_SIMPLE_STRAIGHT, PIPE_HE_STRAIGHT, PIPE_INSULATED_STRAIGHT, PIPE_MVALVE, PIPE_DVALVE))
if(dir==2)
dir = 1
else if(dir==8)
@@ -361,7 +366,7 @@ Buildable meters
if(PIPE_MVALVE) //manual valve
var/obj/machinery/atmospherics/valve/V = new( src.loc)
var/obj/machinery/atmospherics/valve/V = new(src.loc)
V.dir = dir
V.initialize_directions = pipe_dir
if (pipename)
@@ -379,6 +384,23 @@ Buildable meters
V.node2.initialize()
V.node2.build_network()
if(PIPE_DVALVE) //Digital valves. Shameless copypaste from manual valves because I don't into atmos code.
var/obj/machinery/atmospherics/valve/digital/V = new(src.loc)
V.dir = dir
V.initialize_directions = pipe_dir
if (pipename)
V.name = pipename
var/turf/T = V.loc
V.level = T.intact ? 2 : 1
V.initialize()
V.build_network()
if (V.node1)
V.node1.initialize()
V.node1.build_network()
if (V.node2)
V.node2.initialize()
V.node2.build_network()
if(PIPE_PUMP) //gas pump
var/obj/machinery/atmospherics/binary/pump/P = new(src.loc)
P.dir = dir
@@ -536,7 +558,6 @@ Buildable meters
icon = 'icons/obj/pipe-item.dmi'
icon_state = "meter"
item_state = "buildpipe"
flags = TABLEPASS|FPRINT
w_class = 4
/obj/item/pipe_meter/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob)
@@ -569,4 +590,5 @@ Buildable meters
#undef PIPE_GAS_MIXER
#undef PIPE_PASSIVE_GATE
#undef PIPE_VOLUME_PUMP
#undef PIPE_OUTLET_INJECT
#undef PIPE_OUTLET_INJECT
#undef PIPE_DVALVE
+3 -2
View File
@@ -18,9 +18,10 @@
<A href='?src=\ref[src];make=1;dir=5'>Bent Pipe</A><BR>
<A href='?src=\ref[src];make=5;dir=1'>Manifold</A><BR>
<A href='?src=\ref[src];make=8;dir=1'>Manual Valve</A><BR>
<A href='?src=\ref[src];make=18;dir=1'>Digital Valve</A><BR>
<b>Devices:</b><BR>
<A href='?src=\ref[src];make=4;dir=1'>Connector</A><BR>
<A href='?src=\ref[src];make=7;dir=1'>Unary Vent</A><BR>
<A href='?src=\ref[src];make=7;dir=1'>Vent</A><BR>
<A href='?src=\ref[src];make=9;dir=1'>Gas Pump</A><BR>
<A href='?src=\ref[src];make=15;dir=1'>Passive Gate</A><BR>
<A href='?src=\ref[src];make=16;dir=1'>Volume Pump</A><BR>
@@ -70,7 +71,7 @@
return
/obj/machinery/pipedispenser/attackby(var/obj/item/W as obj, var/mob/user as mob)
src.add_fingerprint(usr)
add_fingerprint(user)
if (istype(W, /obj/item/pipe) || istype(W, /obj/item/pipe_meter))
usr << "<span class='notice'>You put [W] back into [src].</span>"
user.drop_item()
+33 -8
View File
@@ -13,12 +13,32 @@
var/circuitboard = "/obj/item/weapon/circuitboard/cyborgrecharger"
var/locked = 1
req_access = list(access_robotics)
var/recharge_speed
var/repairs
/obj/machinery/recharge_station/New()
..()
component_parts = list()
component_parts += new /obj/item/weapon/circuitboard/cyborgrecharger(null)
component_parts += new /obj/item/weapon/stock_parts/capacitor(null)
component_parts += new /obj/item/weapon/stock_parts/capacitor(null)
component_parts += new /obj/item/weapon/stock_parts/manipulator(null)
component_parts += new /obj/item/weapon/cell/high(null)
RefreshParts()
build_icon()
/obj/machinery/recharge_station/RefreshParts()
recharge_speed = 0
repairs = 0
for(var/obj/item/weapon/stock_parts/capacitor/C in component_parts)
recharge_speed += C.rating * 100
for(var/obj/item/weapon/stock_parts/manipulator/M in component_parts)
repairs += M.rating - 1
for(var/obj/item/weapon/cell/C in component_parts)
recharge_speed *= C.maxcharge / 10000
/obj/machinery/recharge_station/process()
if(!(NOPOWER|BROKEN))
return
@@ -230,22 +250,25 @@
/obj/machinery/recharge_station/proc/process_occupant()
if(occupant)
restock_modules()
if(repairs)
occupant.heal_organ_damage(repairs, repairs - 1)
if(occupant.cell)
if(occupant.cell.charge >= occupant.cell.maxcharge)
occupant.cell.charge = occupant.cell.maxcharge
else
occupant.cell.charge = min(occupant.cell.charge + 200, occupant.cell.maxcharge)
occupant.cell.charge = min(occupant.cell.charge + recharge_speed, occupant.cell.maxcharge)
/obj/machinery/recharge_station/proc/restock_modules()
if(occupant)
if(occupant.module && occupant.module.modules)
var/list/um = occupant.contents|occupant.module.modules
// ^ makes sinle list of active (occupant.contents) and inactive modules (occupant.module.modules)
var/coeff = recharge_speed / 200
for(var/obj/O in um)
// Engineering
if(istype(O,/obj/item/stack/sheet/metal) || istype(O,/obj/item/stack/sheet/rglass) || istype(O,/obj/item/stack/rods) || istype(O,/obj/item/weapon/cable_coil)|| istype(O,/obj/item/stack/tile/plasteel))
if(O:amount < 50)
O:amount += 1
O:amount += coeff
// Security
if(istype(O,/obj/item/device/flash))
if(O:broken)
@@ -254,7 +277,7 @@
O:icon_state = "flash"
if(istype(O,/obj/item/weapon/gun/energy/taser/cyborg))
if(O:power_supply.charge < O:power_supply.maxcharge)
O:power_supply.give(O:charge_cost)
O:power_supply.give(O:charge_cost * coeff)
O:update_icon()
else
O:charge_tick = 0
@@ -265,16 +288,18 @@
//Service
if(istype(O,/obj/item/weapon/reagent_containers/food/condiment/enzyme))
if(O.reagents.get_reagent_amount("enzyme") < 50)
O.reagents.add_reagent("enzyme", 2)
O.reagents.add_reagent("enzyme", 2 * coeff)
//Medical
if(istype(O,/obj/item/weapon/reagent_containers/glass/bottle/robot))
var/obj/item/weapon/reagent_containers/glass/bottle/robot/B = O
if(B.reagent && (B.reagents.get_reagent_amount(B.reagent) < B.volume))
B.reagents.add_reagent(B.reagent, 2)
B.reagents.add_reagent(B.reagent, 2 * coeff)
//Janitor
if(istype(O, /obj/item/device/lightreplacer))
var/obj/item/device/lightreplacer/LR = O
LR.Charge(occupant)
var/i = 1
for(1, i < coeff, i++)
LR.Charge(occupant)
if(occupant)
if(occupant.module)
@@ -285,6 +310,6 @@
if(istype(occupant.module.emag, /obj/item/weapon/reagent_containers/spray))
var/obj/item/weapon/reagent_containers/spray/S = occupant.module.emag
if(S.name == "polyacid spray")
S.reagents.add_reagent("pacid", 2)
S.reagents.add_reagent("pacid", 2 * coeff)
else if(S.name == "lube spray")
S.reagents.add_reagent("lube", 2)
S.reagents.add_reagent("lube", 2 * coeff)
+6 -4
View File
@@ -22,9 +22,9 @@
..()
/obj/machinery/shield/Move()
air_update_turf(1)
var/turf/T = loc
..()
air_update_turf(1)
move_update_air(T)
/obj/machinery/shield/CanPass(atom/movable/mover, turf/target, height, air_group)
if(!height || air_group) return 0
@@ -150,6 +150,7 @@
var/list/deployed_shields = list()
var/is_open = 0 //Whether or not the wires are exposed
var/locked = 0
var/shield_range = 4
/obj/machinery/shieldgen/Del()
for(var/obj/machinery/shield/shield_tile in deployed_shields)
@@ -163,7 +164,7 @@
src.active = 1
update_icon()
for(var/turf/target_tile in range(2, src))
for(var/turf/target_tile in range(shield_range, src))
if (istype(target_tile,/turf/space) && !(locate(/obj/machinery/shield) in target_tile))
if (malfunction && prob(33) || !malfunction)
deployed_shields += new /obj/machinery/shield(target_tile)
@@ -176,6 +177,7 @@
for(var/obj/machinery/shield/shield_tile in deployed_shields)
del(shield_tile)
deployed_shields.Cut()
/obj/machinery/shieldgen/process()
if(malfunction && active)
@@ -332,7 +334,7 @@
// var/maxshieldload = 200
var/obj/structure/cable/attached // the attached cable
var/storedpower = 0
flags = FPRINT | CONDUCT
flags = CONDUCT
use_power = 0
/obj/machinery/shieldwallgen/proc/power()
-2
View File
@@ -11,8 +11,6 @@
var/set_temperature = 50 // in celcius, add T0C for kelvin
var/heating_power = 40000
flags = FPRINT
New()
..()
+26 -28
View File
@@ -14,7 +14,7 @@
var/open_panel = 0 //are the wires exposed?
var/active = 0 //is the bomb counting down?
var/defused = 0 //is the bomb capable of exploding?
var/degutted = 0 //is the bomb even a bomb anymore?
var/obj/item/weapon/syndicatebombcore/payload
/obj/machinery/syndicatebomb/process()
if(active && !defused && (timer > 0)) //Tick Tock
@@ -24,15 +24,17 @@
active = 0
timer = 60
processing_objects.Remove(src)
explosion(src.loc,2,5,11, flame_range = 11)
del(src)
icon_state = "syndicate-bomb-inactive[open_panel ? "-wires" : ""]"
if(payload in src)
payload.detonate()
return
if(!active || defused) //Counter terrorists win
processing_objects.Remove(src)
return
/obj/machinery/syndicatebomb/New()
wires = new(src)
wires = new(src)
payload = new(src)
..()
@@ -69,37 +71,34 @@
user << "<span class='notice'>You [open_panel ? "open" : "close"] the wire panel.</span>"
else if(istype(I, /obj/item/weapon/wirecutters) || istype(I, /obj/item/device/multitool) || istype(I, /obj/item/device/assembly/signaler ))
if(degutted)
user << "<span class='notice'>The wires aren't connected to anything!<span>"
else if(open_panel)
if(open_panel)
wires.Interact(user)
else if(istype(I, /obj/item/weapon/crowbar))
if(open_panel && !degutted && isWireCut(WIRE_BOOM) && isWireCut(WIRE_UNBOLT) && isWireCut(WIRE_DELAY) && isWireCut(WIRE_PROCEED) && isWireCut(WIRE_ACTIVATE))
user << "<span class='notice'>You carefully pry out the bomb's payload.</span>"
degutted = 1
new /obj/item/weapon/syndicatebombcore(user.loc)
if(open_panel && isWireCut(WIRE_BOOM) && isWireCut(WIRE_UNBOLT) && isWireCut(WIRE_DELAY) && isWireCut(WIRE_PROCEED) && isWireCut(WIRE_ACTIVATE))
if(payload)
user << "<span class='notice'>You carefully pry out [payload].</span>"
payload.loc = user.loc
payload = null
else
user << "<span class='notice'>There isn't anything in here to remove!</span>"
else if (open_panel)
user << "<span class='notice'>The wires conneting the shell to the explosives are holding it down!</span>"
else if (degutted)
user << "<span class='notice'>The explosives have already been removed.</span>"
else
user << "<span class='notice'>The cover is screwed on, it won't pry off!</span>"
else if(istype(I, /obj/item/weapon/syndicatebombcore))
if(degutted)
user << "<span class='notice'>You place the payload into the shell.</span>"
degutted = 0
if(!payload)
payload = I
user << "<span class='notice'>You place [payload] into [src].</span>"
user.drop_item()
del(I)
payload.loc = src
else
user << "<span class='notice'>While a double strength bomb would surely be a thing of terrible beauty, there's just no room for it.</span>"
user << "<span class='notice'>[payload] is already loaded into [src], you'll have to remove it first.</span>"
else
..()
/obj/machinery/syndicatebomb/attack_hand(var/mob/user)
if(degutted)
user << "<span class='notice'>The bomb's explosives have been removed, the [open_panel ? "wires" : "buttons"] are useless now.</span>"
else if(anchored)
if(anchored)
if(open_panel)
wires.Interact(user)
else if(!active)
@@ -116,10 +115,8 @@
timer = newtime
src.loc.visible_message("\blue \icon[src] timer set for [timer] seconds.")
if(alert(usr,"Would you like to start the countdown now?",,"Yes","No") == "Yes" && in_range(src, usr) && isliving(usr))
if(defused || active || degutted)
if(degutted)
src.loc.visible_message("\blue \icon[src] Device error: Payload missing")
else if(defused)
if(defused || active)
if(defused)
src.loc.visible_message("\blue \icon[src] Device error: User intervention required")
return
else
@@ -147,12 +144,14 @@
icon = 'icons/obj/assemblies.dmi'
icon_state = "bombcore"
item_state = "eshield0"
flags = FPRINT | TABLEPASS
w_class = 3.0
origin_tech = "syndicate=6;combat=5"
/obj/item/weapon/syndicatebombcore/ex_act(severity) //Little boom can chain a big boom
explosion(src.loc,2,5,11, flame_range = 11)
src.detonate()
/obj/item/weapon/syndicatebombcore/proc/detonate()
explosion(get_turf(src),2,5,11, flame_range = 11)
del(src)
/obj/item/device/syndicatedetonator
@@ -161,7 +160,6 @@
icon = 'icons/obj/assemblies.dmi'
icon_state = "bigred"
item_state = "electronic"
flags = FPRINT | TABLEPASS
w_class = 1.0
origin_tech = "syndicate=2"
var/cooldown = 0
+34 -15
View File
@@ -340,17 +340,17 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
freq_text = "#unkn"
if(COMM_FREQ)
freq_text = "Command"
if(1351)
if(SCI_FREQ)
freq_text = "Science"
if(1355)
if(MED_FREQ)
freq_text = "Medical"
if(1357)
if(ENG_FREQ)
freq_text = "Engineering"
if(SEC_FREQ)
freq_text = "Security"
if(1349)
if(SERV_FREQ)
freq_text = "Service"
if(1347)
if(SUPP_FREQ)
freq_text = "Supply"
//There's probably a way to use the list var of channels in code\game\communications.dm to make the dept channels non-hardcoded, but I wasn't in an experimentive mood. --NEO
@@ -372,11 +372,20 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
part_a = "<span class='syndradio'><span class='name'>"
else if (display_freq==COMM_FREQ)
part_a = "<span class='comradio'><span class='name'>"
else if (display_freq==SCI_FREQ)
part_a = "<span class='sciradio'><span class='name'>"
else if (display_freq==MED_FREQ)
part_a = "<span class='medradio'><span class='name'>"
else if (display_freq==ENG_FREQ)
part_a = "<span class='engradio'><span class='name'>"
else if (display_freq==SEC_FREQ)
part_a = "<span class='secradio'><span class='name'>"
else if (display_freq in DEPT_FREQS)
part_a = "<span class='deptradio'><span class='name'>"
else if (display_freq==SERV_FREQ)
part_a = "<span class='servradio'><span class='name'>"
else if (display_freq==SUPP_FREQ)
part_a = "<span class='suppradio'><span class='name'>"
else if (display_freq==DSQUAD_FREQ)
part_a = "<span class='dsquadradio'><span class='name'>"
// --- Filter the message; place it in quotes apply a verb ---
@@ -626,17 +635,17 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
freq_text = "#unkn"
if(COMM_FREQ)
freq_text = "Command"
if(1351)
if(SCI_FREQ)
freq_text = "Science"
if(1355)
if(MED_FREQ)
freq_text = "Medical"
if(1357)
if(ENG_FREQ)
freq_text = "Engineering"
if(SEC_FREQ)
freq_text = "Security"
if(1349)
if(SERV_FREQ)
freq_text = "Service"
if(1347)
if(SUPP_FREQ)
freq_text = "Supply"
//There's probably a way to use the list var of channels in code\game\communications.dm to make the dept channels non-hardcoded, but I wasn't in an experimentive mood. --NEO
@@ -662,10 +671,20 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
part_a = "<span class='syndradio'><span class='name'>"
else if (display_freq==COMM_FREQ)
part_a = "<span class='comradio'><span class='name'>"
else if (display_freq==SCI_FREQ)
part_a = "<span class='sciradio'><span class='name'>"
else if (display_freq==MED_FREQ)
part_a = "<span class='medradio'><span class='name'>"
else if (display_freq==ENG_FREQ)
part_a = "<span class='engradio'><span class='name'>"
else if (display_freq==SEC_FREQ)
part_a = "<span class='secradio'><span class='name'>"
else if (display_freq in DEPT_FREQS)
part_a = "<span class='deptradio'><span class='name'>"
else if (display_freq==SERV_FREQ)
part_a = "<span class='servradio'><span class='name'>"
else if (display_freq==SUPP_FREQ)
part_a = "<span class='suppradio'><span class='name'>"
else if (display_freq==DSQUAD_FREQ)
part_a = "<span class='dsquadradio'><span class='name'>"
// --- This following recording is intended for research and feedback in the use of department radio channels ---
@@ -606,12 +606,12 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list()
/obj/machinery/telecomms/server/proc/admin_log(var/mob/mob)
var/msg="[mob.name] has compiled a script to server [src]:"
var/msg="[mob.real_name]/([mob.key]) has compiled a script to server [src]:"
diary << msg
diary << rawcode
src.investigate_log("[msg]<br>[rawcode]", "ntsl")
if(length(rawcode)) // Let's not bother the admins for empty code.
message_admins("[mob.real_name] ([mob.key]) has compiled and uploaded a NTLS script to [src.id] ([mob.x],[mob.y],[mob.z] - <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[mob.x];Y=[mob.y];Z=[mob.z]'>JMP</a>)",0,1)
message_admins("[mob.real_name]/([mob.key]) has compiled and uploaded a NTSL script to [src.id] ([mob.x],[mob.y],[mob.z] - <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[mob.x];Y=[mob.y];Z=[mob.z]'>JMP</a>)",0,1)
/obj/machinery/telecomms/server/proc/compile(var/mob/user)
+133 -164
View File
@@ -472,177 +472,146 @@
//If he wants it back he can uncomment it
/obj/structure/turret/gun_turret
name = "gun turret"
/obj/machinery/gun_turret //related to turrets but work way differentely because of being mounted on a moving ship.
name = "machine gun turret"
desc = "Syndicate defense turret. It really packs a bunch."
density = 1
anchored = 1
var/cooldown = 20
var/projectiles = 100
var/projectiles_per_shot = 2
var/deviation = 0.3
var/list/exclude = list()
var/atom/cur_target
var/scan_range = 7
var/health = 40
var/list/scan_for = list("human"=0,"cyborg"=0,"mecha"=0,"alien"=1)
var/on = 0
var/state = 0 //Like stat on mobs, 0 is alive, 1 is damaged, 2 is dead
var/faction = "syndicate"
var/atom/cur_target = null
var/scan_range = 9 //You will never see them coming
var/health = 200 //Because it lacks a cover, and is mostly to keep people from touching the syndie shuttle.
icon = 'icons/obj/turrets.dmi'
icon_state = "gun_turret"
icon_state = "syndieturret0"
/obj/machinery/gun_turret/New()
..()
take_damage(0) //check your health
/obj/machinery/gun_turret/ex_act(severity)
switch(severity)
if(1)
die()
if(2)
take_damage(100)
if(3)
take_damage(50)
return
/obj/machinery/gun_turret/emp_act() //Can't emp an mechanical turret.
return
/obj/machinery/gun_turret/meteorhit()
die()
return
/obj/machinery/gun_turret/update_icon()
if(state > 2 || state < 0) //someone fucked up the vars so fix them
take_damage(0)
icon_state = "syndieturret" + "[state]"
return
ex_act()
del src
return
emp_act()
del src
return
meteorhit()
del src
return
proc/update_health()
if(src.health<=0)
del src
return
proc/take_damage(damage)
src.health -= damage
if(src.health<=0)
del src
return
bullet_act(var/obj/item/projectile/Proj)
src.take_damage(Proj.damage)
..()
return
attack_hand(mob/user as mob)
user.set_machine(src)
var/dat = {"<html>
<head><title>[src] Control</title></head>
<body>
<b>Power: </b><a href='?src=\ref[src];power=1'>[on?"on":"off"]</a><br>
<b>Scan Range: </b><a href='?src=\ref[src];scan_range=-1'>-</a> [scan_range] <a href='?src=\ref[src];scan_range=1'>+</a><br>
<b>Scan for: </b>"}
for(var/scan in scan_for)
dat += "<div style=\"margin-left: 15px;\">[scan] (<a href='?src=\ref[src];scan_for=[scan]'>[scan_for[scan]?"Yes":"No"]</a>)</div>"
dat += {"<b>Ammo: </b>[max(0, projectiles)]<br>
</body>
</html>"}
user << browse(dat, "window=turret")
onclose(user, "turret")
return
attack_ai(mob/user as mob)
return attack_hand(user)
attack_alien(mob/user as mob)
user.visible_message("[user] slashes at [src]", "You slash at [src]")
src.take_damage(15)
return
Topic(href, href_list)
if(href_list["power"])
src.on = !src.on
if(src.on)
spawn(50)
if(src)
src.process()
if(href_list["scan_range"])
src.scan_range = Clamp(src.scan_range+text2num(href_list["scan_range"]), 1, 8)
if(href_list["scan_for"])
if(href_list["scan_for"] in scan_for)
scan_for[href_list["scan_for"]] = !scan_for[href_list["scan_for"]]
src.updateUsrDialog()
return
proc/validate_target(atom/target)
if(get_dist(target, src)>scan_range)
return 0
if(istype(target, /mob))
var/mob/M = target
if(!M.stat && !M.lying)//ninjas can't catch you if you're lying
return 1
else if(istype(target, /obj/mecha))
return 1
return 0
process()
spawn while(on)
if(projectiles<=0)
on = 0
/obj/machinery/gun_turret/proc/take_damage(damage)
health -= damage
switch(health)
if(101 to INFINITY)
state = 0
if(1 to 100)
state = 1
if(-INFINITY to 0)
if(state != 2)
die()
return
if(cur_target && !validate_target(cur_target))
cur_target = null
if(!cur_target)
cur_target = get_target()
fire(cur_target)
sleep(cooldown)
state = 2
update_icon()
return
/obj/machinery/gun_turret/bullet_act(var/obj/item/projectile/Proj)
take_damage(Proj.damage)
return
/obj/machinery/gun_turret/proc/die()
state = 2
update_icon()
/obj/machinery/gun_turret/attack_hand(mob/user)
return
/obj/machinery/gun_turret/attack_ai(mob/user)
return attack_hand(user)
/obj/machinery/gun_turret/attack_alien(mob/user as mob)
user.visible_message("[user] slashes at [src]", "You slash at [src]")
take_damage(15)
return
/obj/machinery/gun_turret/proc/validate_target(atom/target)
if(get_dist(target, src)>scan_range)
return 0
if(istype(target, /mob))
var/mob/M = target
if(!M.stat)
return 1
else if(istype(target, /obj/mecha))
var/obj/mecha/M = target
if(M.occupant)
return 1
return 0
/obj/machinery/gun_turret/process()
if(state == 2)
return
proc/get_target()
var/list/pos_targets = list()
var/target = null
if(scan_for["human"])
for(var/mob/living/carbon/human/M in oview(scan_range,src))
if(M.stat || M.lying || M in exclude)
continue
pos_targets += M
if(scan_for["cyborg"])
for(var/mob/living/silicon/M in oview(scan_range,src))
if(M.stat || M.lying || M in exclude)
continue
pos_targets += M
if(scan_for["mecha"])
for(var/obj/mecha/M in oview(scan_range, src))
if(M in exclude)
continue
pos_targets += M
if(scan_for["alien"])
for(var/mob/living/carbon/alien/M in oview(scan_range,src))
if(M.stat || M.lying || M in exclude)
continue
pos_targets += M
if(pos_targets.len)
target = pick(pos_targets)
return target
if(cur_target && !validate_target(cur_target))
cur_target = null
if(!cur_target)
cur_target = get_target()
if(cur_target)
fire(cur_target)
return
proc/fire(atom/target)
if(!target)
cur_target = null
return
src.dir = get_dir(src,target)
var/turf/targloc = get_turf(target)
var/target_x = targloc.x
var/target_y = targloc.y
var/target_z = targloc.z
targloc = null
spawn(-1)
for(var/i=1 to min(projectiles, projectiles_per_shot))
if(!src) break
var/turf/curloc = get_turf(src)
var/dx = round(gaussian(0,deviation),1)
var/dy = round(gaussian(0,deviation),1)
targloc = locate(target_x+dx, target_y+dy, target_z)
if (!targloc || !curloc)
continue
if (targloc == curloc)
continue
playsound(src, 'sound/weapons/Gunshot.ogg', 50, 1)
var/obj/item/projectile/A = new /obj/item/projectile(curloc)
src.projectiles--
A.current = curloc
A.yo = targloc.y - curloc.y
A.xo = targloc.x - curloc.x
A.process()
sleep(2)
/obj/machinery/gun_turret/proc/get_target()
var/list/pos_targets = list()
var/target = null
for(var/mob/living/M in view(scan_range,src))
if(M.stat || faction == M.faction)
continue
pos_targets += M
for(var/obj/mecha/M in oview(scan_range, src))
if(M.occupant)
if(faction == M.occupant.faction)
continue
if(!M.occupant)
continue //Don't shoot at empty mechs.
pos_targets += M
if(pos_targets.len)
target = pick(pos_targets)
return target
/obj/machinery/gun_turret/proc/fire(atom/target)
if(!target)
cur_target = null
return
src.dir = get_dir(src,target)
var/turf/targloc = get_turf(target)
if(!src)
return
var/turf/curloc = get_turf(src)
if (!targloc || !curloc)
return
if (targloc == curloc)
return
playsound(src, 'sound/weapons/Gunshot.ogg', 50, 1)
var/obj/item/projectile/A = new /obj/item/projectile/bullet(curloc)
A.current = curloc
A.yo = targloc.y - curloc.y
A.xo = targloc.x - curloc.x
spawn(0)
A.process()
return
+5 -5
View File
@@ -266,9 +266,6 @@
usr << "<span class='notice'>The vending machine refuses to interface with you, as you are not in its target demographic!</span>"
return
if(panel_open)
usr << "<span class='notice'>The vending machine cannot dispense products while its service panel is open!</span>"
return
if(href_list["remove_coin"])
if(!coin)
usr << "<span class='notice'>There is no coin in this machine.</span>"
@@ -283,6 +280,9 @@
usr.set_machine(src)
if((href_list["vend"]) && (vend_ready))
if(panel_open)
usr << "<span class='notice'>The vending machine cannot dispense products while its service panel is open!</span>"
return
if((!allowed(usr)) && !emagged && scan_id) //For SECURE VENDING MACHINES YEAH
usr << "<span class='warning'>Access denied.</span>" //Unless emagged of course
@@ -678,7 +678,7 @@
/obj/item/clothing/suit/wizrobe/fake = 1,/obj/item/clothing/head/wizard/fake = 1,/obj/item/weapon/staff = 3,/obj/item/clothing/mask/gas/sexyclown = 1,
/obj/item/clothing/under/sexyclown = 1,/obj/item/clothing/mask/gas/sexymime = 1,/obj/item/clothing/under/sexymime = 1,/obj/item/clothing/suit/apron/overalls = 1,
/obj/item/clothing/head/rabbitears =1) //Pretty much everything that had a chance to spawn.
contraband = list(/obj/item/clothing/suit/cardborg = 1,/obj/item/clothing/head/cardborg = 1,/obj/item/clothing/suit/judgerobe = 1,/obj/item/clothing/head/powdered_wig = 1)
contraband = list(/obj/item/clothing/suit/cardborg = 1,/obj/item/clothing/head/cardborg = 1,/obj/item/clothing/suit/judgerobe = 1,/obj/item/clothing/head/powdered_wig = 1,/obj/item/weapon/gun/magic/wand = 1)
premium = list(/obj/item/clothing/suit/hgpirate = 1, /obj/item/clothing/head/hgpiratecap = 1, /obj/item/clothing/head/helmet/roman = 1, /obj/item/clothing/head/helmet/roman/legionaire = 1, /obj/item/clothing/under/roman = 1, /obj/item/clothing/shoes/roman = 1, /obj/item/weapon/shield/riot/roman = 1)
refill_canister = /obj/item/weapon/vending_refill/autodrobe
@@ -687,7 +687,7 @@
desc = "A kitchen and restaurant equipment vendor"
product_ads = "Mm, food stuffs!;Food and food accessories.;Get your plates!;You like forks?;I like forks.;Woo, utensils.;You don't really need these..."
icon_state = "dinnerware"
products = list(/obj/item/weapon/tray = 8,/obj/item/weapon/kitchen/utensil/fork = 6,/obj/item/weapon/kitchenknife = 3,/obj/item/weapon/reagent_containers/food/drinks/drinkingglass = 8,/obj/item/clothing/suit/chef/classic = 2)
products = list(/obj/item/weapon/tray = 8,/obj/item/weapon/kitchen/utensil/fork = 6,/obj/item/weapon/kitchenknife = 3,/obj/item/weapon/reagent_containers/food/drinks/drinkingglass = 8,/obj/item/clothing/suit/chef/classic = 2,/obj/item/weapon/reagent_containers/food/condiment/pack/ketchup = 5,/obj/item/weapon/reagent_containers/food/condiment/pack/hotsauce = 5)
contraband = list(/obj/item/weapon/kitchen/rollingpin = 2, /obj/item/weapon/butch = 2)
/obj/machinery/vending/sovietsoda
+2 -1
View File
@@ -24,13 +24,14 @@
damage_absorption = list("brute"=0.6,"fire"=0.8,"bullet"=0.6,"laser"=0.5,"energy"=0.65,"bomb"=0.8)
max_temperature = 35000
overload_coeff = 1
operation_req_access = list(access_syndicate)
wreckage = /obj/structure/mecha_wreckage/gygax/dark
max_equip = 4
step_energy_drain = 5
/obj/mecha/combat/gygax/dark/loaded/New()
..()
var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/scattershot
var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/carbine
ME.attach(src)
ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/flashbang
ME.attach(src)
+6 -4
View File
@@ -42,9 +42,11 @@
/obj/mecha/combat/marauder/mauler/loaded/New()
..()
var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg
var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg(src)
ME.attach(src)
ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack
ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/scattershot(src)
ME.attach(src)
ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack(src)
ME.attach(src)
ME = new /obj/item/mecha_parts/mecha_equipment/tesla_energy_relay(src)
ME.attach(src)
@@ -56,9 +58,9 @@
/obj/mecha/combat/marauder/loaded/New()
..()
var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/weapon/energy/pulse
var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/weapon/energy/pulse(src)
ME.attach(src)
ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack
ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack(src)
ME.attach(src)
ME = new /obj/item/mecha_parts/mecha_equipment/tesla_energy_relay(src)
ME.attach(src)
+108 -93
View File
@@ -5,38 +5,40 @@
var/projectile
var/fire_sound
/obj/item/mecha_parts/mecha_equipment/weapon/can_attach(var/obj/mecha/combat/M as obj)
if(..())
if(istype(M))
return 1
return 0
/obj/item/mecha_parts/mecha_equipment/weapon/action(atom/target)
if(!action_checks(target)) return 0
set_ready_state(0)
var/turf/curloc = chassis.loc
var/atom/targloc = get_turf(target)
if (!targloc || !istype(targloc, /turf) || !curloc)
return
if (targloc == curloc)
return
playsound(chassis, fire_sound, 50, 1)
var/obj/item/projectile/A = new projectile(curloc)
A.firer = chassis.occupant
A.original = target
A.current = curloc
A.yo = targloc.y - curloc.y
A.xo = targloc.x - curloc.x
A.process()
chassis.log_message("Fired from [src.name], targeting [target].")
do_after_cooldown()
return 1
//Base energy weapon type
/obj/item/mecha_parts/mecha_equipment/weapon/energy
name = "general energy weapon"
action(target)
if(!action_checks(target)) return
var/turf/curloc = chassis.loc
var/atom/targloc = get_turf(target)
if (!targloc || !istype(targloc, /turf) || !curloc)
return
if (targloc == curloc)
return
set_ready_state(0)
playsound(chassis, fire_sound, 50, 1)
var/obj/item/projectile/A = new projectile(curloc)
A.firer = chassis.occupant
A.original = target
A.current = curloc
A.yo = targloc.y - curloc.y
A.xo = targloc.x - curloc.x
chassis.use_power(energy_drain)
A.process()
chassis.log_message("Fired from [src.name], targeting [target].")
do_after_cooldown()
return
/obj/item/mecha_parts/mecha_equipment/weapon/energy/action(atom/target)
..()
chassis.use_power(energy_drain)
/obj/item/mecha_parts/mecha_equipment/weapon/energy/laser
@@ -107,86 +109,101 @@
construction_time = 500
construction_cost = list("metal"=20000,"bananium"=10000)
can_attach(obj/mecha/combat/honker/M as obj)
if(..())
if(istype(M))
return 1
return 0
/obj/item/mecha_parts/mecha_equipment/weapon/honker/can_attach(obj/mecha/combat/honker/M as obj)
if(..())
if(istype(M))
return 1
return 0
action(target)
if(!chassis)
return 0
if(energy_drain && chassis.get_charge() < energy_drain)
return 0
if(!equip_ready)
return 0
/obj/item/mecha_parts/mecha_equipment/weapon/honker/action(target)
if(!action_checks(target)) return 0
set_ready_state(0)
playsound(chassis, 'sound/items/AirHorn.ogg', 100, 1)
chassis.occupant_message("<font color='red' size='5'>HONK</font>")
for(var/mob/living/carbon/M in ohearers(6, chassis))
if(istype(M, /mob/living/carbon/human))
var/mob/living/carbon/human/H = M
if(istype(H.ears, /obj/item/clothing/ears/earmuffs))
continue
M << "<font color='red' size='7'>HONK</font>"
M.sleeping = 0
M.stuttering += 20
M.ear_deaf += 30
M.Weaken(3)
if(prob(30))
M.Stun(10)
M.Paralyse(4)
else
M.make_jittery(500)
/* //else the mousetraps are useless
if(istype(M, /mob/living/carbon/human))
var/mob/living/carbon/human/H = M
if(isobj(H.shoes))
var/thingy = H.shoes
H.drop_from_inventory(H.shoes)
walk_away(thingy,chassis,15,2)
spawn(20)
if(thingy)
walk(thingy,0)
*/
chassis.use_power(energy_drain)
log_message("Honked from [src.name]. HONK!")
var/turf/T = get_turf(src)
message_admins("[key_name(chassis.occupant, chassis.occupant.client)](<A HREF='?_src_=holder;adminmoreinfo=\ref[chassis.occupant]'>?</A>) used a Mecha Honker in ([T.x],[T.y],[T.z] - <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[T.x];Y=[T.y];Z=[T.z]'>JMP</a>)",0,1)
log_game("[chassis.occupant.ckey]([chassis.occupant]) used a Mecha Honker in ([T.x],[T.y],[T.z])")
do_after_cooldown()
return
playsound(chassis, 'sound/items/AirHorn.ogg', 100, 1)
chassis.occupant_message("<font color='red' size='5'>HONK</font>")
for(var/mob/living/carbon/M in ohearers(6, chassis))
if(istype(M, /mob/living/carbon/human))
var/mob/living/carbon/human/H = M
if(istype(H.ears, /obj/item/clothing/ears/earmuffs))
continue
M << "<font color='red' size='7'>HONK</font>"
M.sleeping = 0
M.stuttering += 20
M.ear_deaf += 30
M.Weaken(3)
if(prob(30))
M.Stun(10)
M.Paralyse(4)
else
M.make_jittery(500)
/* //else the mousetraps are useless
if(istype(M, /mob/living/carbon/human))
var/mob/living/carbon/human/H = M
if(isobj(H.shoes))
var/thingy = H.shoes
H.drop_from_inventory(H.shoes)
walk_away(thingy,chassis,15,2)
spawn(20)
if(thingy)
walk(thingy,0)
*/
chassis.use_power(energy_drain)
log_message("Honked from [src.name]. HONK!")
var/turf/T = get_turf(src)
message_admins("[key_name(chassis.occupant, chassis.occupant.client)](<A HREF='?_src_=holder;adminmoreinfo=\ref[chassis.occupant]'>?</A>) used a Mecha Honker in ([T.x],[T.y],[T.z] - <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[T.x];Y=[T.y];Z=[T.z]'>JMP</a>)",0,1)
log_game("[chassis.occupant.ckey]([chassis.occupant]) used a Mecha Honker in ([T.x],[T.y],[T.z])")
do_after_cooldown()
return
//Base ballistic weapon type
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic
name = "general ballisic weapon"
fire_sound = 'sound/weapons/Gunshot.ogg'
var/projectiles
var/projectile_energy_cost
action_checks(atom/target)
if(..())
if(projectiles > 0)
return 1
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/action_checks(target)
if(!..())
return 0
if(projectiles <= 0)
return 0
if(!equip_ready)
return 0
return 1
get_equip_info()
return "[..()]\[[src.projectiles]\][(src.projectiles < initial(src.projectiles))?" - <a href='?src=\ref[src];rearm=1'>Rearm</a>":null]"
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/get_equip_info()
return "[..()]\[[src.projectiles]\][(src.projectiles < initial(src.projectiles))?" - <a href='?src=\ref[src];rearm=1'>Rearm</a>":null]"
proc/rearm()
if(projectiles < initial(projectiles))
var/projectiles_to_add = initial(projectiles) - projectiles
while(chassis.get_charge() >= projectile_energy_cost && projectiles_to_add)
projectiles++
projectiles_to_add--
chassis.use_power(projectile_energy_cost)
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/proc/rearm()
if(projectiles < initial(projectiles))
var/projectiles_to_add = initial(projectiles) - projectiles
while(chassis.get_charge() >= projectile_energy_cost && projectiles_to_add)
projectiles++
projectiles_to_add--
chassis.use_power(projectile_energy_cost)
send_byjax(chassis.occupant,"exosuit.browser","\ref[src]",src.get_equip_info())
log_message("Rearmed [src.name].")
return
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/Topic(href, href_list)
..()
if (href_list["rearm"])
src.rearm()
return
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/action(atom/target)
if(..())
src.projectiles--
send_byjax(chassis.occupant,"exosuit.browser","\ref[src]",src.get_equip_info())
log_message("Rearmed [src.name].")
return
Topic(href, href_list)
..()
if (href_list["rearm"])
src.rearm()
return
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/carbine
name = "\improper FNX-66 Carbine"
icon_state = "mecha_carbine"
equip_cooldown = 5
projectile = /obj/item/projectile/bullet/incendiary
projectiles = 24
projectile_energy_cost = 15
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/scattershot
@@ -194,7 +211,6 @@
icon_state = "mecha_scatter"
equip_cooldown = 20
projectile = /obj/item/projectile/bullet/midbullet
fire_sound = 'sound/weapons/Gunshot.ogg'
projectiles = 40
projectile_energy_cost = 25
var/projectiles_per_shot = 4
@@ -236,7 +252,6 @@
icon_state = "mecha_uac2"
equip_cooldown = 10
projectile = /obj/item/projectile/bullet/weakbullet
fire_sound = 'sound/weapons/Gunshot.ogg'
projectiles = 300
projectile_energy_cost = 20
var/projectiles_per_shot = 3
@@ -279,7 +294,7 @@
name = "\improper SRM-8 missile rack"
icon_state = "mecha_missilerack"
projectile = /obj/item/missile
fire_sound = 'sound/effects/bang.ogg'
fire_sound = 'sound/weapons/grenadelaunch.ogg'
projectiles = 8
projectile_energy_cost = 1000
equip_cooldown = 60
@@ -320,7 +335,7 @@
name = "\improper SGL-6 grenade launcher"
icon_state = "mecha_grenadelnchr"
projectile = /obj/item/weapon/grenade/flashbang
fire_sound = 'sound/effects/bang.ogg'
fire_sound = 'sound/weapons/grenadelaunch.ogg'
projectiles = 6
missile_speed = 1.5
projectile_energy_cost = 800
+17 -17
View File
@@ -133,12 +133,12 @@
/obj/machinery/mecha_part_fabricator/New()
..()
component_parts = list()
component_parts += new /obj/item/weapon/circuitboard/mechfab(src)
component_parts += new /obj/item/weapon/stock_parts/matter_bin(src)
component_parts += new /obj/item/weapon/stock_parts/matter_bin(src)
component_parts += new /obj/item/weapon/stock_parts/manipulator(src)
component_parts += new /obj/item/weapon/stock_parts/micro_laser(src)
component_parts += new /obj/item/weapon/stock_parts/console_screen(src)
component_parts += new /obj/item/weapon/circuitboard/mechfab(null)
component_parts += new /obj/item/weapon/stock_parts/matter_bin(null)
component_parts += new /obj/item/weapon/stock_parts/matter_bin(null)
component_parts += new /obj/item/weapon/stock_parts/manipulator(null)
component_parts += new /obj/item/weapon/stock_parts/micro_laser(null)
component_parts += new /obj/item/weapon/stock_parts/console_screen(null)
RefreshParts()
// part_sets["Cyborg Upgrade Modules"] = typesof(/obj/item/borg/upgrade/) - /obj/item/borg/upgrade/ // Eh. This does it dymaically, but to support having the items referenced otherwhere in the code but not being constructable, going to do it manaully.
@@ -162,18 +162,16 @@
T = 0
for(var/obj/item/weapon/stock_parts/micro_laser/Ma in component_parts)
T += Ma.rating
if(T >= 1)
T -= 1
T -= 1
var/diff
diff = round(initial(resource_coeff) - (initial(resource_coeff)*(T))/25,0.01)
diff = round(initial(resource_coeff) - (initial(resource_coeff)*(T))/6,0.01)
if(resource_coeff!=diff)
resource_coeff = diff
T = 0
for(var/obj/item/weapon/stock_parts/manipulator/Ml in component_parts)
T += Ml.rating
if(T>= 2)
T -= 2
diff = round(initial(time_coeff) - (initial(time_coeff)*(T))/25,0.01)
T -= 1
diff = round(initial(time_coeff) - (initial(time_coeff)*(T))/4,0.01)
if(time_coeff!=diff)
time_coeff = diff
@@ -358,6 +356,8 @@
src.being_built = new part.type(src)
src.desc = "It's building [src.being_built]."
src.remove_resources(part)
part.m_amt = get_resource_cost_w_coeff(part,"metal")
part.g_amt = get_resource_cost_w_coeff(part,"glass")
src.overlays += "fab-active"
src.use_power = 2
src.updateUsrDialog()
@@ -447,10 +447,10 @@
for(var/datum/design/D in files.known_designs)
if(D.build_type&16)
if(D.category in part_sets)//Checks if it's a valid category
if(add_part_to_set(D.category, text2path(D.build_path)))//Adds it to said category
if(add_part_to_set(D.category, D.build_path))//Adds it to said category
i++
else
if(add_part_to_set("Misc", text2path(D.build_path)))//If in doubt, chunk it into the Misc
if(add_part_to_set("Misc", D.build_path))//If in doubt, chunk it into the Misc
i++
return i
@@ -514,7 +514,7 @@
temp += "<a href='?src=\ref[src];clear_temp=1'>Return</a>"
src.updateUsrDialog()
if(i || tech_output)
src.visible_message("\icon[src] <b>[src]</b> beeps, \"Succesfully synchronized with R&D server. New data processed.\"")
src.visible_message("\icon[src] <b>[src]</b> beeps, \"Successfully synchronized with R&D server. New data processed.\"")
if(!silent && !found)
temp = "Unable to connect to local R&D Database.<br>Please check your connections and try again.<br><a href='?src=\ref[src];clear_temp=1'>Return</a>"
src.updateUsrDialog()
@@ -581,10 +581,10 @@
<body>
<table style='width: 100%;'>
<tr>
<td style='width: 70%; padding-right: 10px;'>
<td style='width: 65%; padding-right: 10px;'>
[left_part]
</td>
<td style='width: 30%; background: #ccc;' id='queue'>
<td style='width: 35%; background: #ccc;' id='queue'>
[list_queue()]
</td>
<tr>
+2 -2
View File
@@ -236,7 +236,7 @@
target = safepick(view(3,target))
if(!target)
return
if(get_dist(src, target)>1)
if(!target.Adjacent(src))
if(selected && selected.is_ranged())
selected.action(target)
else if(selected && selected.is_melee())
@@ -988,7 +988,7 @@
H.forceMove(src)
if(H.hud_used)
last_user_hud = H.hud_used.hud_shown
H.hud_used.hide_hud()
H.hud_used.show_hud(1)
src.occupant = H
src.add_fingerprint(H)
+2 -3
View File
@@ -7,7 +7,7 @@
icon = 'icons/mecha/mech_construct.dmi'
icon_state = "blank"
w_class = 20
flags = FPRINT | TABLEPASS | CONDUCT
flags = CONDUCT
origin_tech = "programming=2;materials=2"
var/construction_time = 100
var/list/construction_cost = list("metal"=20000,"glass"=5000)
@@ -18,7 +18,6 @@
icon_state = "backbone"
var/datum/construction/construct
construction_cost = list("metal"=20000)
flags = FPRINT | CONDUCT
attackby(obj/item/W as obj, mob/user as mob)
if(!construct || !construct.action(W, user))
@@ -405,7 +404,7 @@
icon_state = "std_mod"
item_state = "electronic"
board_type = "other"
flags = FPRINT | TABLEPASS | CONDUCT
flags = CONDUCT
force = 5.0
w_class = 2.0
throwforce = 5.0
+2 -3
View File
@@ -35,10 +35,9 @@
return
/obj/structure/alien/resin/Move()
air_update_turf(1)
var/turf/T = loc
..()
air_update_turf(1)
return
move_update_air(T)
/obj/structure/alien/resin/CanAtmosPass()
return !density
+31 -1
View File
@@ -1,7 +1,7 @@
//########################## CONTRABAND ;3333333333333333333 -Agouri ###################################################
#define NUM_OF_POSTER_DESIGNS 11
#define NUM_OF_POSTER_DESIGNS 21
/obj/item/weapon/contraband
name = "contraband item"
@@ -116,6 +116,36 @@ obj/structure/sign/poster/New(serial)
if(11)
name += " - RIP Badger"
desc += " This poster commemorates the day hundreds of badgers worldwide were sacrificed for the greater good."
if(12)
name += " - Ambrosia Vulgaris"
desc += " This poster is lookin' pretty trippy man."
if(13)
name += " - Donut Corp."
desc += " This poster is an advertisement for Donut Corp."
if(14)
name += " - EAT"
desc += " This poster is advising that you eat."
if(15)
name += " - Tools"
desc += " This poster is an advertisement for tools."
if(16)
name += " - Power"
desc += " A poster all about power."
if(17)
name += " - Power to the People"
desc += " Screw those EDF guys!"
if(18)
name += " - Communist state"
desc += " All hail the Communist party!"
if(19)
name += " - Lamarr"
desc += " This poster depicts Lamarr. Probably made by the research director."
if(20)
name += " - Borg Fancy"
desc += " Being fancy can be for any borg, Just need a suit."
if(21)
name += " - Borg Fancy v2"
desc += " Borg Fancy, Now only taking the most fancy."
else
name = "This shit just bugged. Report it to Agouri - polyxenitopalidou@gmail.com"
desc = "Why are you still here?"
+4 -13
View File
@@ -11,14 +11,12 @@ would spawn and follow the beaker, even if it is carried or thrown.
icon = 'icons/effects/effects.dmi'
mouse_opacity = 0
unacidable = 1//So effect are not targeted by alien acid.
flags = TABLEPASS
/obj/effect/effect/water
name = "water"
icon = 'icons/effects/effects.dmi'
icon_state = "extinguish"
var/life = 15.0
flags = TABLEPASS
mouse_opacity = 0
/obj/effect/effect/smoke
@@ -845,15 +843,8 @@ steam.start() -- spawns the effect
return
if (istype(AM, /mob/living/carbon))
var/mob/M = AM
if (istype(M, /mob/living/carbon/human) && (istype(M:shoes, /obj/item/clothing/shoes) && M:shoes.flags&NOSLIP))
return
M.stop_pulling()
M << "\blue You slipped on the foam!"
playsound(src.loc, 'sound/misc/slip.ogg', 50, 1, -3)
M.Stun(5)
M.Weaken(2)
var/mob/living/carbon/M = AM
M.slip(5, 2, src)
/datum/effect/effect/system/foam_spread
@@ -930,9 +921,9 @@ steam.start() -- spawns the effect
..()
Move()
air_update_turf(1)
var/turf/T = loc
..()
air_update_turf(1)
move_update_air(T)
proc/updateicon()
if(metal == 1)
+2 -8
View File
@@ -109,20 +109,14 @@
/obj/effect/landmark/costume/nyangirl/New()
new /obj/item/clothing/under/schoolgirl(src.loc)
new /obj/item/clothing/head/kitty(src.loc)
if (prob(50))
new /obj/item/clothing/glasses/sunglasses/blindfold(src.loc)
else
new /obj/item/clothing/mask/muzzle/gag(src.loc)
new /obj/item/clothing/glasses/sunglasses/blindfold(src.loc)
del(src)
/obj/effect/landmark/costume/maid/New()
new /obj/item/clothing/under/blackskirt(src.loc)
var/CHOICE = pick( /obj/item/clothing/head/beret , /obj/item/clothing/head/rabbitears )
new CHOICE(src.loc)
if (prob(50))
new /obj/item/clothing/glasses/sunglasses/blindfold(src.loc)
else
new /obj/item/clothing/mask/muzzle/gag(src.loc)
new /obj/item/clothing/glasses/sunglasses/blindfold(src.loc)
del(src)
/obj/effect/landmark/costume/butler/New()
+30 -8
View File
@@ -7,6 +7,19 @@
else return dy + (0.5*dx)
proc/trange(var/Dist=0,var/turf/Center=null)//alternative to range (ONLY processes turfs and thus less intensive)
if(Center==null) return
//var/x1=((Center.x-Dist)<1 ? 1 : Center.x-Dist)
//var/y1=((Center.y-Dist)<1 ? 1 : Center.y-Dist)
//var/x2=((Center.x+Dist)>world.maxx ? world.maxx : Center.x+Dist)
//var/y2=((Center.y+Dist)>world.maxy ? world.maxy : Center.y+Dist)
var/turf/x1y1 = locate(((Center.x-Dist)<1 ? 1 : Center.x-Dist),((Center.y-Dist)<1 ? 1 : Center.y-Dist),Center.z)
var/turf/x2y2 = locate(((Center.x+Dist)>world.maxx ? world.maxx : Center.x+Dist),((Center.y+Dist)>world.maxy ? world.maxy : Center.y+Dist),Center.z)
return block(x1y1,x2y2)
proc/explosion(turf/epicenter, devastation_range, heavy_impact_range, light_impact_range, flash_range, adminlog = 1, ignorecap = 0, flame_range = 0)
src = null //so we don't abort once src is deleted
epicenter = get_turf(epicenter)
@@ -86,7 +99,8 @@ proc/explosion(turf/epicenter, devastation_range, heavy_impact_range, light_impa
var/y0 = epicenter.y
var/z0 = epicenter.z
for(var/turf/T in range(epicenter, max_range))
for(var/turf/T in trange(max_range, epicenter))
var/dist = cheap_pythag(T.x - x0,T.y - y0)
var/flame_dist = 0
var/hotspot_exists
@@ -100,15 +114,19 @@ proc/explosion(turf/epicenter, devastation_range, heavy_impact_range, light_impa
else dist = 0
//------- TURF FIRES -------\\
//------- TURF FIRES -------
if(T)
if(flame_dist && prob(40) && !istype(T, /turf/space))
new/obj/effect/hotspot(T) //Mostly for ambience!
spawn()
new/obj/effect/hotspot(T) //Mostly for ambience!
hotspot_exists = 1
if(dist)
T.ex_act(dist)
spawn()
if(T)
T.ex_act(dist)
//------- THINGS IN TURFS FIRES -------\\
//------- THINGS IN TURFS FIRES -------
for(var/atom_movable in T.contents) //bypass type checking since only atom/movable can be contained by turfs anyway
var/atom/movable/AM = atom_movable
@@ -116,10 +134,14 @@ proc/explosion(turf/epicenter, devastation_range, heavy_impact_range, light_impa
if(AM) //Something is inside T (We have already checked T exists above) - RR
if(flame_dist) //if it has flame distance, run this - RR
if(isliving(AM) && !hotspot_exists && !istype(T, /turf/space))
new /obj/effect/hotspot(AM.loc)
spawn()
if(AM && AM.loc!=null)
new /obj/effect/hotspot(AM.loc)
//Just in case we missed a mob while they were in flame_range, but a hotspot didn't spawn on them, otherwise it looks weird when you just burst into flame out of nowhere
if(dist) //if no flame_dist, run this - RR
AM.ex_act(dist)
spawn()
if(AM)
AM.ex_act(dist)
@@ -145,5 +167,5 @@ proc/explosion(turf/epicenter, devastation_range, heavy_impact_range, light_impa
proc/secondaryexplosion(turf/epicenter, range)
for(var/turf/tile in range(range, epicenter))
for(var/turf/tile in trange(range, epicenter))
tile.ex_act(2)
+16 -38
View File
@@ -9,31 +9,12 @@
/obj
var/explosion_resistance
/datum/explosion_turf
var/turf/turf //The turf which will get ex_act called on it
var/max_power //The largest amount of power the turf sustained
New()
..()
max_power = 0
proc/save_power_if_larger(power)
if(power > max_power)
max_power = power
return 1
return 0
var/list/explosion_turfs = list()
var/list/datum/explosion_turf/explosion_turfs = list()
var/explosion_in_progress = 0
proc/get_explosion_turf(var/turf/T)
for( var/datum/explosion_turf/ET in explosion_turfs )
if( T == ET.turf )
return ET
var/datum/explosion_turf/ET = new()
ET.turf = T
explosion_turfs += ET
return ET
proc/explosion_rec(turf/epicenter, power)
@@ -55,9 +36,8 @@ proc/explosion_rec(turf/epicenter, power)
explosion_in_progress = 1
explosion_turfs = list()
var/datum/explosion_turf/ETE = get_explosion_turf()
ETE.turf = epicenter
ETE.max_power = power
explosion_turfs[epicenter] = power
//This steap handles the gathering of turfs which will be ex_act() -ed in the next step. It also ensures each turf gets the maximum possible amount of power dealt to it.
for(var/direction in cardinal)
@@ -65,22 +45,21 @@ proc/explosion_rec(turf/epicenter, power)
T.explosion_spread(power - epicenter.explosion_resistance, direction)
//This step applies the ex_act effects for the explosion, as planned in the previous step.
for( var/datum/explosion_turf/ET in explosion_turfs )
if(ET.max_power <= 0) continue
if(!ET.turf) continue
for(var/turf/T in explosion_turfs)
if(explosion_turfs[T] <= 0) continue
if(!T) continue
//Wow severity looks confusing to calculate... Fret not, I didn't leave you with any additional instructions or help. (just kidding, see the line under the calculation)
var/severity = 4 - round(max(min( 3, ((ET.max_power - ET.turf.explosion_resistance) / (max(3,(power/3)))) ) ,1), 1)
//sanity effective power on tile divided by either 3 or one third the total explosion power
var/severity = 4 - round(max(min( 3, ((explosion_turfs[T] - T.explosion_resistance) / (max(3,(power/3)))) ) ,1), 1) //sanity effective power on tile divided by either 3 or one third the total explosion power
// One third because there are three power levels and I
// want each one to take up a third of the crater
var/x = ET.turf.x
var/y = ET.turf.y
var/z = ET.turf.z
ET.turf.ex_act(severity)
if(!ET.turf)
ET.turf = locate(x,y,z)
for( var/atom/A in ET.turf )
var/x = T.x
var/y = T.y
var/z = T.z
T.ex_act(severity)
if(!T)
T = locate(x,y,z)
for(var/atom/A in T)
A.ex_act(severity)
explosion_in_progress = 0
@@ -126,10 +105,9 @@ proc/explosion_rec(turf/epicenter, power)
new/obj/effect/debugging/marker(src)
*/
var/datum/explosion_turf/ET = get_explosion_turf(src)
if(ET.max_power >= power)
if(explosion_turfs[src] >= power)
return //The turf already sustained and spread a power greated than what we are dealing with. No point spreading again.
ET.max_power = power
explosion_turfs[src] = power
var/spread_power = power - src.explosion_resistance //This is the amount of power that will be spread to the tile in the direction of the blast
var/side_spread_power = power - 2 * src.explosion_resistance //This is the amount of power that will be spread to the side tiles
-1
View File
@@ -8,7 +8,6 @@
var/burning = null
var/hitsound = null
var/w_class = 3.0
flags = FPRINT | TABLEPASS
var/slot_flags = 0 //This is used to determine on which slots an item can fit.
pass_flags = PASSTABLE
pressure_resistance = 5
+1 -1
View File
@@ -5,7 +5,7 @@
desc = "Used for repairing or building APCs"
icon = 'icons/obj/apc_repair.dmi'
icon_state = "apc_frame"
flags = FPRINT | TABLEPASS| CONDUCT
flags = CONDUCT
/obj/item/apc_frame/attackby(obj/item/weapon/W as obj, mob/user as mob)
..()
+7 -15
View File
@@ -11,7 +11,6 @@ var/global/list/obj/item/device/pda/PDAs = list()
icon_state = "pda"
item_state = "electronic"
w_class = 1.0
flags = FPRINT | TABLEPASS
slot_flags = SLOT_ID | SLOT_BELT
//Main variables
@@ -960,20 +959,13 @@ var/global/list/obj/item/device/pda/PDAs = list()
/obj/item/device/pda/clown/Crossed(AM as mob|obj) //Clown PDA is slippery.
if (istype(AM, /mob/living/carbon))
var/mob/M = AM
if ((istype(M, /mob/living/carbon/human) && (istype(M:shoes, /obj/item/clothing/shoes) && M:shoes.flags&NOSLIP)) || M.m_intent == "walk")
return
if ((istype(M, /mob/living/carbon/human) && (M.real_name != src.owner) && (istype(src.cartridge, /obj/item/weapon/cartridge/clown))))
if (src.cartridge:honk_charges < 5)
src.cartridge:honk_charges++
M.stop_pulling()
M << "\blue You slipped on the PDA!"
playsound(src.loc, 'sound/misc/slip.ogg', 50, 1, -3)
M.Stun(8)
M.Weaken(5)
var/mob/living/carbon/M = AM
if(M.slip(8, 5, src, NO_SLIP_WHEN_WALKING))
if (ishuman(M) && (M.real_name != src.owner))
if (istype(src.cartridge, /obj/item/weapon/cartridge/clown))
var/obj/item/weapon/cartridge/clown/cart = src.cartridge
if(cart.honk_charges < 5)
cart.honk_charges++
//AI verb and proc for sending PDA messages.
@@ -4,7 +4,6 @@
icon_state = "aicard" // aicard-full
item_state = "electronic"
w_class = 2.0
flags = FPRINT | TABLEPASS
slot_flags = SLOT_BELT
var/flush = null
origin_tech = "programming=4;materials=4"
@@ -1,7 +1,7 @@
/obj/item/device/chameleon
name = "chameleon-projector"
icon_state = "shield0"
flags = FPRINT | TABLEPASS| CONDUCT
flags = CONDUCT
slot_flags = SLOT_BELT
item_state = "electronic"
throwforce = 5.0
@@ -12,6 +12,9 @@
var/can_use = 1
var/obj/effect/dummy/chameleon/active_dummy = null
var/saved_item = /obj/item/weapon/cigbutt
var/saved_icon = 'icons/obj/clothing/masks.dmi'
var/saved_icon_state = "cigbutt"
var/saved_overlays
/obj/item/device/chameleon/dropped()
disrupt()
@@ -29,6 +32,9 @@
playsound(get_turf(src), 'sound/weapons/flash.ogg', 100, 1, -6)
user << "\blue Scanned [target]."
saved_item = target.type
saved_icon = target.icon
saved_icon_state = target.icon_state
saved_overlays = target.overlays
/obj/item/device/chameleon/proc/toggle()
if(!can_use || !saved_item) return
@@ -47,7 +53,7 @@
var/obj/O = new saved_item(src)
if(!O) return
var/obj/effect/dummy/chameleon/C = new/obj/effect/dummy/chameleon(usr.loc)
C.activate(O, usr, src)
C.activate(O, usr, saved_icon, saved_icon_state, saved_overlays, src)
del(O)
usr << "\blue You activate the [src]."
var/obj/effect/overlay/T = new/obj/effect/overlay(get_turf(src))
@@ -83,11 +89,12 @@
var/can_move = 1
var/obj/item/device/chameleon/master = null
/obj/effect/dummy/chameleon/proc/activate(var/obj/item/O, var/mob/M, var/obj/item/device/chameleon/C)
/obj/effect/dummy/chameleon/proc/activate(var/obj/O, var/mob/M, new_icon, new_iconstate, new_overlays, var/obj/item/device/chameleon/C)
name = O.name
desc = O.desc
icon = O.icon
icon_state = O.icon_state
icon = new_icon
icon_state = new_iconstate
overlays = new_overlays
dir = O.dir
M.loc = src
master = C
+1 -1
View File
@@ -7,7 +7,7 @@
w_class = 1.0
throw_speed = 4
throw_range = 10
flags = FPRINT | TABLEPASS| CONDUCT
flags = CONDUCT
origin_tech = "magnets=2;combat=1"
var/times_used = 0 //Number of times it's been used.
@@ -5,7 +5,7 @@
icon_state = "flashlight"
item_state = "flashlight"
w_class = 2
flags = FPRINT | TABLEPASS | CONDUCT
flags = CONDUCT
slot_flags = SLOT_BELT
m_amt = 50
g_amt = 20
@@ -104,7 +104,7 @@
desc = "A pen-sized light, used by medical staff."
icon_state = "penlight"
item_state = ""
flags = FPRINT | TABLEPASS | CONDUCT
flags = CONDUCT
brightness_on = 2
@@ -116,7 +116,7 @@
item_state = "lamp"
brightness_on = 5
w_class = 4
flags = FPRINT | TABLEPASS | CONDUCT
flags = CONDUCT
m_amt = 0
g_amt = 0
on = 1
@@ -205,7 +205,6 @@
icon_state = "slime"
item_state = "slime"
w_class = 2
flags = FPRINT | TABLEPASS | CONDUCT
slot_flags = SLOT_BELT
m_amt = 0
g_amt = 0
@@ -6,7 +6,7 @@
icon_state = "pointer"
item_state = "pen"
var/pointer_icon_state
flags = FPRINT | TABLEPASS | CONDUCT
flags = CONDUCT
slot_flags = SLOT_BELT
m_amt = 500
g_amt = 500

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