Commit Graph

1997 Commits

Author SHA1 Message Date
tralezab
3c6ce0afba Butthurt Admin Prevention (#55661)
It's a story as old as time itself. Admin loads a new shuttle, decorates it, and then shuttle catastrophe triggers and the admin gets deeply, deeply owned. With this, you can set what emergency shuttle they picked and prevent any more changes to the shuttle!
2020-12-24 00:36:36 -08:00
LemonInTheDark
c7b46fea81 The garbage collector doesn't waste time anymore (#55595)
Co-authored-by: Kyle Spier-Swenson <kyleshome@gmail.com>
2020-12-19 02:41:34 -08:00
Jack LeCroy
23ee09967e Fix Hanukkah (again) and refactor Moth Week and Beer Day (#55532)
* Fix Hanukkah (again) and refactor Moth Week and Beer Day

* Remove unnecessary changes
2020-12-16 17:16:44 -08:00
Qustinnus
12c1464bc3 [READY] Creates Datumized AI and applies it to monkeys (#55238)
New AI system, implemented for monkeys.
2020-12-13 13:19:54 +01:00
Qustinnus
15c7de802a Refactor the procedural generation of lavaland and turf/closed/mineral (#54915)
This replaces lavaland's old diagonal tunnel gen which was really 
horrendously jammed into asteroid floor code (?????) with Cellular 
Automata which runs in rust (PR for that here: 
https://github.com/tgstation/rust-g/pull/57 ). The new code is a bit 
cleaner, but also looks better.

VID: https://streamable.com/a45ke2

Things to do:
- Make an icemoon version
- Fix the roundstart atmos adjacency issues

I asked AnturK if this was an acceptable PR for this month; he said it 
was okay as long as I didn't add new areas, which I don't plan to do. 
But if anyone thinks this PR breaks the spirit of the month I'll open 
it again in december.
2020-12-10 20:59:29 -08:00
Jared-Fogle
7d3fd4355f Everything that uses maptext now uses the class that makes it actually readable (#55420)
Adds a MAPTEXT macro that wraps the given text in the maptext class, the thing we use for Runechat to make it so you can actually read it. Everything that sets maptext now uses this.
2020-12-10 23:25:46 +00:00
LemonInTheDark
92f509ea80 Revert "Refactors how movetype flags are added and removed and the floating animation (#54963)" (#55432)
This reverts commit b8425c003a.
2020-12-09 19:30:28 -08:00
silicons
160175ee8b pass_flags handling refactor + rewrites a part of projectiles for the n-th time (#54924)
Yeah uhh this'll probably need testmerging even after it's done because yeah it's a bit big.
If y'all want me to atomize this into two PRs (pass flags vs projectiles) tell me please. Pass flags would have to go in first though, in that case, as new projectile hit handling will rely on pass_flags_self.
Pass flags:

Pass flags handling now uses an atom variable named pass_flags_self.
If any of these match a pass_flag on a thing trying to pass through, it's allowed through by default.
This makes overriding CanAllowThrough unnecessary for the majority of things. I've however not removed overrides for very.. weird cases, like plastic flaps which uses a prob(60) for letting PASSGLASS things through for god knows why.
LETPASSTHROW is now on pass_flags_self
Projectiles:

Not finalized yet, need to do something to make the system I have in mind have less unneeded overhead + snowflake

Basically, for piercing/phasing/otherwise projectiles that go through things instead of hitting the first dense object, I have them use pass_flags flags for two new variables, projectile_phasing and projectile_piercing. Anything with pass_flags_self in the former gets phased through entirely. Anything in the latter gets hit, and the projectile then goes through. on_hit will also register a piercing hit vs a normal hit (so things like missiles can only explode on a normal hit or otherwise, instead of exploding multiple times. Not needed as missiles qdel(src) right now but it's nice to have for the future).

I still need to decide what to do for hit handling proper, as Bump() is still preferred due to it not being as high-overhead as something like scanning on Moved(). I'm thinking I'll make Moved() only scan for cases where it needs to hit a non-dense object - a prone human the user clicked on, anything special like that. Don't know the exact specifics yet, which is why this is still WIP.

Projectiles now use check_pierce() to determine if it goes through something and hits it, doesn't hit it, or doesn't go through something at all (should delete self after hitting). Will likely make an on_pierce proc to be called post-piercing something so you can have !fun! things like projectiles that go down in damage after piercing something. This will likely deprecate the process_hit proc, or at least make it less awful.

scan_for_hit() is now used to attempt to hit something and will return whether the projectile got deleted or not. It will delete the projectile if the projectile does hit something and fails to pierce through it.

scan_moved_turf() (WIP) will be used for handling moving onto a turf.

permutated has been renamed to impacted. Ricocheting projectiles get it reset, allowing projectiles to pierce and potentially hit something again if it goes back around.

A new unit test has been added checking for projectiles with movement type of PHASING. This is because PHASING completely causes projectiles to break down as projectiles mainly sense collisions through Bump. The small boost in performance from using PHASING instead of having all pass flags active/overriding check_pierce is in my opinion not worth the extra snowflake in scan_moved_turf() I'd have to do to deal with having to check for hits manually rather than Bump()ing things.
Movement types

UNSTOPPABLE renamed to PHASING to better describe what it is, going through and crossing everything but not actually bumping.
Why It's Good For The Game

Better pass flags handling allows for less proc overrides, bitflag checks are far less expensive in general.

Fixes penetrating projectiles like sniper penetrators

This system also allows for better handling of piercing projectiles (see above) without too much snowflake code, as you'd only need to modify on_pierce() if you needed to do special handling like dampening damage per target pierced, and otherwise you could just use the standardized system and just set pass flags to what's needed. If you really need a projectile that pierces almost everything, override check_pierce(), which is still going to be easier than what was done before (even with snowflake handling of UNSTOPPABLE flag process_hit() was extremely ugly, now we don't rely on movement types at all.)
2020-12-10 09:29:27 +13:00
Ghom
b8425c003a Refactors how movetype flags are added and removed and the floating animation (#54963)
I wanted to refactor how movetype flags are added and removed into traits to prevent multiple sources of specific movement types from conflicting one other. I ended up also having to refactor the floating animation loop (the one that bobs up and down) code in the process.
Why It's Good For The Game

A way to avoid conflict from multiple sources of movement types.
This also stops melee attacks, jitteriness and update_transform() from temporarily disabling the floating movetype bitflag altogether until the next life tick.

Tested, but i'm pretty sure improvements could be made.
Changelog

cl
fix: jitteriness, melee attack animations and resting/standing up should no longer momentarily remove the floating movement type.
/cl
2020-12-10 09:28:32 +13:00
Jared-Fogle
f00e379939 Singularity component (#55096)
Adds singularity component
2020-12-08 10:58:03 +01:00
Tad Hardesty
70e468b891 Merge branch 'master' of https://github.com/tgstation/tgstation into patch/docs-from-github-wiki 2020-11-30 21:25:43 -08:00
TiviPlus
de7994c0f7 Init sanity unit test (#55147)
https://github.com/tgstation/TerraGov-Marine-Corps/pull/5326
Stemming from 
https://github.com/ParadiseSS13/Paradise/pull/14770

Basically it just checks for bad initialize calls
2020-11-30 17:15:11 -05:00
TiviPlus
0eaab0bc54 Grep for space indentation (#54850)
#54604 atomizing
Since a lot of the space indents are in lists ill atomize those later
2020-11-30 12:48:40 -05:00
Tad Hardesty
abeb3ca072 Add AnturK's 'GC Issues' guide 2020-11-29 21:27:02 -08:00
Kyle Spier-Swenson
ff6576d036 sstimer no longer batches maintenance tasks to the bucket list to avoid edge cases and duplicated logic. (#55140)
* sstimer no longer delays maintenance tasks if its going over its tick.

This was leading to bugs if certain state operations happened while a task was delayed, furthermore if the timer subsystem was overloaded, the invoked timers list would bloat as it would never get cleared out, which would make all timer invocations take longer as they had to add to an ever growing list.

* Update timer.dm

* Fix error when a bucket has only one timer.

* simply timer loop logic & improve timer debug string

It would try to batch up linked list modifications and every issue we have ever had has been related to this, so now it just directly pulls the head of the linked list off, using bucketEject, rather then detect when it reaches the end of the linked list queue it will now just know because the bucket will be empty.

All bucketCount logic has been moved to bucketEject and bucketJoin(), which should also keep that more proper.

* Update timer.dm

* Update timer.dm
2020-11-30 01:30:45 +08:00
ArcaneMusic
bf39caca6a Refactors Pastries into newfood. (#54996)
Co-authored-by: Jared-Fogle <35135081+Jared-Fogle@users.noreply.github.com>
Co-authored-by: Floyd <Floydje123@hotmail.com>
2020-11-24 16:18:10 -08:00
Kyle Spier-Swenson
ea363e7b01 Fix client time timers duplicating if any client time timer caused a stack overflow. (#54977)
* Fix client time timers duplicating if any client time timer caused a stack overflow.
2020-11-16 05:05:21 +00:00
Timberpoes
3475080f21 [TM Candidate] Fix a number of atmos-related runtimes through pipeline and SSair tweaks. (#54804)
* Feex

* Moar feex
2020-11-14 20:07:30 -05:00
ArcaneMusic
816fe2e1e3 Arconomy: Amputating the Invisible Hand of Income. (#54161)
* Final Stage Capitalism.

* tweaks.

* Got overzelous in my fervor for blood

* well, this now has my full attention.

* Whoops missed a <<

* fixes issue because there were changes I missed

* Cobby: Departmental income is static.

* Whoops

* Various high cost premium prices and a few custom_prices have been adjusted to better suit the lack of income. Code cleanup on income so they're all in-line with cargo.

* First, this has been atomized out.

* UI is now fixed as god intended.

* Actually no, this is dynamic now. No more confusion.

* Conflicts fixed.

* Apply suggestions from code review

Co-authored-by: Jared-Fogle <35135081+Jared-Fogle@users.noreply.github.com>

* tgui recompile.

* Hopefully aquires that green checkmark.

* --fixes the spacing.

* var cleanup and departmental budget assignment cleanup.

* merge conflict fix

Co-authored-by: Jared-Fogle <35135081+Jared-Fogle@users.noreply.github.com>
2020-11-13 16:32:09 -05:00
Rob Bailey
505881b188 Performance Logging no longer produces broken csv files (#54894)
Also better file names so it's easier to mass scrape them.
2020-11-10 09:26:31 -05:00
TemporalOroboros
edd6500d78 /obj/screen --> /atom/movable/screen (#54403)
Repaths screen objects to /atom/movable
2020-11-08 23:07:15 -03:00
Rob Bailey
a6ffa29818 performance logging (#54809)
Dumps a bunch of perf info to a csv every 10 seconds.

Currently this info is only stored in blackbox where it's effectively useless.
csv is a very easy to parse format and is natively supported by a lot of data analysis tools
2020-11-07 20:22:48 -08:00
Qustinnus
6424b6136e Turns transparency for turfs into an element, and gives it to datum materials. (#54250) 2020-11-03 15:05:54 -08:00
WarlockD
f15bcc4692 Initialize and LateInitialize runs correctly at round start (#54594)
I've been pulling my hair out on this one. Ever since I started my ntnet project, I could never get LateInitalize to work right. Apparently it has never worked right. How it was set up before on server start

    Station map loads, Does NOT run Initialize(mapload = TRUE)
    Generates space, lavaland/icebox ruins
    Loads a ruin, DOES run Initialize(mapload = TRUE) EXCEPT on areas
    End of mapping system
    Atom system Initialized and it checks and runs Initialize(mapload = TRUE) on world

You see the issue? Initialize and by extension LateInitialize is run in blocks. Worst, LateInitialize is run on turfs FIRST in ruins BEFORE Initialize is ever run on the other atoms. While there isn't much in Area, there is map_generator so I am sure it caused some grief for map creators.

The NEW order now is

    Station map loads, Does NOT run Initialize(mapload = TRUE)
    Generates space, lavaland/icebox ruins
    Loads a ruin, Does NOT run Initialize(mapload = TRUE)
    End of mapping system
    Atom system Initialized and it checks and runs Initialize(mapload = TRUE) on world

Also if you dynamicly load a map, like snowdin or such, it will Initialize all atoms at once and then run LateInitialize properly
2020-10-26 12:26:46 -03:00
Bobbahbrown
4e48e1379d Interview System / Soft Panic Bunker (#54465)
About The Pull Request

Ports and improves my interview system that has been previously used in the summer ball and toolbox tournament events. Allows for a 'softer' panic bunker, wherein players who fall below the required living time limit can still join the server and be restricted to filling out a questionnaire. Upon completing the questionnaire, the player may be allowed into the server by an administrator. If the application is approved, they get a notification that they will be reconnected and upon reconnecting will have all verbs as they usually would. If the application is denied the user is put on a cooldown after which they may submit a new questionnaire.

Players who are being interviewed (herein interviewees) have no verbs other than those required for the stat panel to function, as well as a verb to pull up the interview panel. Interviews do not persist through restarts, and the ability to join that is granted by an accepted interview is only valid for the duration of that round.

Open interviews are listed under a new 'interviews' tab for admins, which is VERY similar to the existing tickets tab.

Below is what a player who is flagged as an interviewee will see when they join the server. They can do nothing but respond to the questionnaire or leave.
image

This is what an administrator sees after an interview is submitted, they will also see a corresponding message within their chatbox, and an age-old BWOINK when an interview is submitted.
image

The interviews tab, which is similar to the tickets menu. You can open the interview manager panel to view all active (including non-submitted) interviews, queued (submitted) interviews, and closed interviews.

image
FAQ:

What happens if someone submits an interview when no admins are on? It's treated like adminhelps are, the message gets sent to TGS to be dispatched off to configured end-points (like Discord or IRC), and the user is notified that their interview was handled this way.

Can you configure the questions? Yes, in config/ there is now a interviews.txt file in which the welcome message and the individual questions can be set and modified.

Can this be turned on and off during a round? Yes, it can be toggled like the panic bunker. It requires the panic bunker to be raised in order to function.

Can interviewees have further questions asked to them? Yes, if you admin-pm them, which is possible using regular means or a conveniently placed button on the interview UI, they will be able to respond to the message.
Technical details

To use the interview system you must have the panic bunker enabled, this is an additional setting for the panic bunker. It can be set through the PANIC_BUNKER_INTERVIEW setting in config.txt, or alternatively enabled in-game as prompted during the panic bunker toggling process. It also can be toggled on its own using a verb added for this purpose, Toggle PB Interviews found under the server tab. These new actions are included in the logging for the panic bunker. I have also added a reporting stat to the world topic status keyword, which now reports if the interview system is on using the keyword interviews.

As mentioned above, for server operators, configure the questions and welcome message in config/interviews.txt.

Note to maintainers and those with big brains I had to add a call to init_verbs on the stat panel window being ready because seemingly a race condition exists wherein the add_verb of the 'view my interview' verb doesn't cause a refresh of the tabs (and therefore doesn't show the 'Interview' tab) when running in dream daemon but running it directly from visual studio code properly shows the tab. Adding a init_verbs call directly after adding the verb didn't seem to help.
A note for downstreams

If you don't use the HTML stat panel (which may not be a bad thing) then you will have to do some conversion from the HTML stat panel stuff used here to the old style stat panels. It's pretty trivial, but just be aware of that. You can see how I used to use the old stat panels in my PR from the summer ball, here, which should be helpful.
Why It's Good For The Game

This allows for a softer version of the panic bunker which impedes the flow of malicious players while allowing genuine players a chance to enter a round to gain enough time to not be affected by the panic bunker's restrictions.
Changelog

🆑 bobbahbrown
add: Added the interview system, a 'soft' panic bunker which lets players who would normally be blocked from joining be interviewed by admins to be selectively allowed to play.
/🆑
2020-10-25 14:10:06 +13:00
Qustinnus
74755a5a3a Audio falloff re-work, and increased audio range. (#54362)
imo; the ss13 audio-scape is quite barren, you can only hear most things if you can see them, which in my opinion doesn't make much sense. This changes that so you can hear further away, but falloff is much higher, so in reality you will only hear things relatively quietly when they're out of sight.

This PR increases the hearing distance of most sound by 9, excluding sounds such as antag items that are meant to be used stealthily

This PR also replaces Byond's inbuilt falloff system with something I made, (And thanks to potato for helping me throw together a formula for it). This fall-off system makes sound fall off more naturally, with sounds being full volume within a certain range, and then softly falling off until they are completely quiet. This makes for a smoother transition between "This sound is full volume" and "I dont hear this sound".

Co-authored-by: ff <ff>
2020-10-20 17:14:16 -07:00
Ghom
8eb866fee3 SSeconomy/var/bank_accounts is now an association list of account identifiers and datums for O(1) performance (#54430)
Title. Also added some precautions to bank_account/new() and the crab17 gear.
The fact the majority of functions pertinent to the bank_accounts list was O(n) disquieted me.
2020-10-18 20:47:06 -03:00
ShizCalev
b720bcd63d adds more cursed animal masks (#53539)
Animal masks refactor
2020-10-15 22:16:00 +02:00
ZeWaka
9629feed35 Converts A && A.B into A?.B (#54342)
Implements the ?. operator, replacing code like A && A.B with A?.B

BYOND Ref:
When reading A?.B, it's equivalent to A && A.B except that A is only evaluated once, even if it's a complex expression like a proc call.
2020-10-13 16:43:53 -03:00
Jared-Fogle
f951aa0c6d tgui: Communications Console (#54220)
* Start of work

* More work

* Finish visuals for main page for AIs, start work on behavior

* More functionality--authenticating and calling shuttle

* Set security level

* Message list

* Purchasing shuttles

* Emagging, messaing associates, nuke codes, permission fixes

* Sending message to allied sectors (done?)

* CentComm -> CentCom

* Resolve part of feedback

* Remove now unused pageComponent variable

* Change children to not use array

* Split lines

* Flex box allied stations

* Don't use ternary

* Fix lints

* Rebuild tgui

* Change icon to biohazard

* Clean up color property

* Rebuild tgui
2020-10-13 09:55:42 +03:00
Ryll Ryll
9d5a3ceba0 Temporal Scarring is now per-character-slot, changelings now fake scars when disguising (#54311) 2020-10-12 13:39:44 -07:00
TemporalOroboros
cab4313b29 Adds Alloy Materials (#53623)
Adds and implements alloy materials

Takes several materials that were mostly fluff and converts them into actual usable materials.
Messes with material code a bit to make alloys recycle back into their component materials.
Adds the alloy materials to their in-game stacks.

Materials added:
    Plasteel
    Plastitanium
    Plasmaglass
    Titaniumglass
    Plastitanium Glass
    Alien Alloy

Makes plasteel/plastitanium/plasmaglass and the rest able to have separate properties from their component materials. It doesn't make much sense that the materials used to seal off the supermatter chamber from the rest of the station would be prone to exploding when heated.

Allows for further expansion of materials, possibly including actual functional metallurgy and smelting at some point in the very distant future.

(Lemons note: Adds a regeneration component, used for alien alloy)
2020-10-09 12:23:40 -07:00
ArcaneMusic
d8177711f5 Mice properly spawn in maintenance during the migration event. (#54243)
fix: Mice properly spawn during the mouse migration event.
Fixes #54242 .
2020-10-09 08:14:39 +01:00
Dennok
d7a0d45082 Fix shuttle loader (#54200)
Set mode = SHUTTLE_PREARRIVAL to shuttle that initially placed to transit docking port.
No more SSshuttles delete transit for half loaded shuttle

Fix #54232
2020-10-08 10:18:21 +01:00
ArcaneMusic
efe62dfaba Cleans up rat related features and makes Regal Ratking a rare spawn from mouse migration event. (#54191) 2020-10-07 11:55:42 -07:00
Dennok
516a3e5bdc Some shuttes rework. Allow many shuttles of one template to work at the same time. (#53993)
* add replace button to shuttle panel

load button now only load new shuttle

* shuttle teplate loads as shuttle

* new shuttle console connects to shuttle

* new navigation computer connect to shurrle

* docking_port id now unique

add count to id if id already in work

* many docks from one base tenplate

* up

* fix unregister

* up

* up

* up

* block multiple shuttle loading

* return preview button

* up  id generation
2020-10-06 00:20:15 +03:00
Qustinnus
eca964db35 Ports soup, snacks, icecream, salads and meat to newfood (#54028)
Ports soup, snacks, icecream, salads and meat to newfood
2020-09-29 20:36:27 -07:00
Couls
ed02f99f92 Communication hotfix (#54084) 2020-09-29 15:28:22 -07:00
Couls
1432662d57 Rebindable communication(OOC, Say, Me) (#54035)
OOC, Say and Me is now rebindable
2020-09-29 13:07:03 -03:00
Bobbahbrown
0d5d5af0e5 Restyles Stat Panel, Adds Subpanel Sub-Categories (#53947)
I re-styled the CSS for the stat panel in hopes to make it look nice, and I also added the ability to use sub-categories (currently a single level) of verbs using a . (period), an example being Admin.Fun instead of the previous Admin - Fun. This now results in a sub-category being automagically generated in the stat panel.
2020-09-29 06:36:14 -03:00
Hulkamania
c6a94683c6 Cross server evacuation messages now include the evacuation reason (#53980)
Co-authored-by: Bobbahbrown <bobbahbrown@gmail.com>
2020-09-29 01:21:12 -07:00
Timberpoes
1f23cc281d Enforce preserving parent proc return values across ui_act call stacks (#53964)
All ui_act procs should call parent by default. All procs should preserve the value of the parent proc when it's TRUTHY and pass it down the call stack. No UI should be interactible when its flags or state indicate it should not be, except when explicity overriden by child procs intentionally disregarding parent return values to achieve a specific goal.
2020-09-26 11:52:39 -03:00
Gandalf
95d25ec33b Emergency Shuttle Toggle (#53912)
Admins now have the option to enable or disable the shuttle(located in the admin tab).
Disabling the shuttle will basically pause it where it is, regardless(unless game is over). Until the admins enable it again. It will resume exactly back to where it was and continue from there. This is great for events. You can't recall or call the shuttle while it's disabled.

Admins also now get the option when calling the shuttle to disable the recall of said shuttle unless they cancel it or select enable shuttle.
2020-09-25 07:40:50 -03:00
skoglol
0df21c399c Merge pull request #53911 from Gandalf2k15/explosions
Advanced Explosions
2020-09-25 02:03:16 +02:00
Couls
f174cd671c improve performance of vis_overlays by handling dir by using vis_flags (#53816)
vis dir changes are now handled by vis_flags
2020-09-24 06:00:41 -03:00
Gandalf
3322faa56f oops. 2020-09-23 13:47:48 +01:00
Tad Hardesty
f80836d00d Fix broken dmdoc crosslinks (#53896)
- Backtick-escape code samples which contain `[]` syntax.
- Fix all crosslinks to nonexistent symbols.
- Somewhat improve docs for qdel defines, research defines, dynamic mode, and others.
- Remove unused bloodcrawling defines.

Some crosslinks to defined but undocumented symbols remain. For BYOND builtins, a future dmdoc version may link those symbols to their entries in the DM reference. Other symbols could be documented by a future PR.

New "file" crosslinks as used in `research.dm` are slated for release in a future dmdoc version.
2020-09-23 03:47:44 -03:00
Ryll Ryll
105107bb41 Fixes scars sticking around after a limb is dismembered (#53763)
During dismemberment from wounds, some scars would stick around even though the limb was no longer attached to the person. This was because I removed the scars from the person before removing the wounds, which itself would create more scars that would still be tied to the victim's scars. This fixes that, and tidies up some related code as well. Notably, you can now see which types of wounds a detached limb is suffering from by sight. Also, I have no clue what happened before when you attached a limb with existing wounds to someone, but I've made sure it applies the wounds to the person where they left off.

I also realized I made an order of operations error in the self-treatment for broken bones (with the bone gel and surgical tape) on the bone gel step, which made failing these treatments and briefly passing out/wasting a use of the gel 38 percentage points more likely than intended. This corrects that, so the base is 25%/45% failure for severe/critical blunt wounds. It also raises the bonuses to succeeding you get from painkillers a bit since you're going through a lot of trouble for all this already.
2020-09-23 02:48:11 -03:00
AnturK
61e5c556df Custom statues and sculpting changes. (#53154)
### Gameplay changes:
- Spacemen lose their ability to sculpt all minerals into statues barehanded, you need a chisel now.
- You can now create carving blocks out of 5 sheets of most materials.
- Using a chisel on the blocks you can designate what to carve in it (including the preset statues from before).
- Chisels can be printed at autolathe, there's also one in art storage.
### Code changes:
- Squeak component now squeaks on attack_hand for structures.
- Radials now accept atom paths automatically extracting the name with initial.
- Base and rigid stack recipes renamed appropriately.
- Statues now use custom materials.
2020-09-23 02:46:01 -03:00
Gandalf
44e421c440 checkus deletus 2020-09-23 02:04:00 +01:00