mirror of https://github.com/marrub--/zscript-doc
Compare commits
4 Commits
0d8b097846
...
11b4e635e5
Author | SHA1 | Date |
---|---|---|
an | 11b4e635e5 | |
an | 94e70bd557 | |
an | b7f8614ab4 | |
an | 03f151dca4 |
128
api.md
128
api.md
|
@ -26,7 +26,7 @@ modder rather than for the engine.
|
|||
|
||||
<!-- inter-toc actor -->
|
||||
|
||||
* [State](api-actor-State.md)
|
||||
* [State](api/actor/State.md)
|
||||
|
||||
<!-- end -->
|
||||
|
||||
|
@ -36,15 +36,15 @@ TODO
|
|||
|
||||
<!-- inter-toc base -->
|
||||
|
||||
* [Array](api-base-Array.md)
|
||||
* [Color](api-base-Color.md)
|
||||
* [CVar](api-base-CVar.md)
|
||||
* [FixedArray](api-base-FixedArray.md)
|
||||
* [Object](api-base-Object.md)
|
||||
* [String](api-base-String.md)
|
||||
* [StringTable](api-base-StringTable.md)
|
||||
* [Thinker](api-base-Thinker.md)
|
||||
* [Vector](api-base-Vector.md)
|
||||
* [Array](api/base/Array.md)
|
||||
* [CVar](api/base/CVar.md)
|
||||
* [Color](api/base/Color.md)
|
||||
* [FixedArray](api/base/FixedArray.md)
|
||||
* [Object](api/base/Object.md)
|
||||
* [StringTable](api/base/StringTable.md)
|
||||
* [String](api/base/String.md)
|
||||
* [Thinker](api/base/Thinker.md)
|
||||
* [Vector](api/base/Vector.md)
|
||||
|
||||
<!-- end -->
|
||||
|
||||
|
@ -54,14 +54,14 @@ TODO
|
|||
|
||||
<!-- inter-toc drawing -->
|
||||
|
||||
* [BrokenLines](api-drawing-BrokenLines.md)
|
||||
* [Console](api-drawing-Console.md)
|
||||
* [Font](api-drawing-Font.md)
|
||||
* [GIFont](api-drawing-GIFont.md)
|
||||
* [Screen](api-drawing-Screen.md)
|
||||
* [Shape2D](api-drawing-Shape2D.md)
|
||||
* [TexMan](api-drawing-TexMan.md)
|
||||
* [TextureID](api-drawing-TextureID.md)
|
||||
* [BrokenLines](api/drawing/BrokenLines.md)
|
||||
* [Console](api/drawing/Console.md)
|
||||
* [Font](api/drawing/Font.md)
|
||||
* [GIFont](api/drawing/GIFont.md)
|
||||
* [Screen](api/drawing/Screen.md)
|
||||
* [Shape2D](api/drawing/Shape2D.md)
|
||||
* [TexMan](api/drawing/TexMan.md)
|
||||
* [TextureID](api/drawing/TextureID.md)
|
||||
|
||||
<!-- end -->
|
||||
|
||||
|
@ -71,11 +71,11 @@ TODO
|
|||
|
||||
<!-- inter-toc events -->
|
||||
|
||||
* [ConsoleEvent](api-events-ConsoleEvent.md)
|
||||
* [EventHandler](api-events-EventHandler.md)
|
||||
* [RenderEvent](api-events-RenderEvent.md)
|
||||
* [ReplaceEvent](api-events-ReplaceEvent.md)
|
||||
* [StaticEventHandler](api-events-StaticEventHandler.md)
|
||||
* [ConsoleEvent](api/events/ConsoleEvent.md)
|
||||
* [EventHandler](api/events/EventHandler.md)
|
||||
* [RenderEvent](api/events/RenderEvent.md)
|
||||
* [ReplaceEvent](api/events/ReplaceEvent.md)
|
||||
* [StaticEventHandler](api/events/StaticEventHandler.md)
|
||||
|
||||
<!-- end -->
|
||||
|
||||
|
@ -85,7 +85,7 @@ TODO
|
|||
|
||||
<!-- inter-toc files -->
|
||||
|
||||
* [Wads](api-files-Wads.md)
|
||||
* [Wads](api/files/Wads.md)
|
||||
|
||||
<!-- end -->
|
||||
|
||||
|
@ -95,11 +95,11 @@ TODO
|
|||
|
||||
<!-- inter-toc inter -->
|
||||
|
||||
* [InterBackground](api-inter-InterBackground.md)
|
||||
* [PatchInfo](api-inter-PatchInfo.md)
|
||||
* [StatusScreen](api-inter-StatusScreen.md)
|
||||
* [WBPlayerStruct](api-inter-WBPlayerStruct.md)
|
||||
* [WBStartStruct](api-inter-WBStartStruct.md)
|
||||
* [InterBackground](api/inter/InterBackground.md)
|
||||
* [PatchInfo](api/inter/PatchInfo.md)
|
||||
* [StatusScreen](api/inter/StatusScreen.md)
|
||||
* [WBPlayerStruct](api/inter/WBPlayerStruct.md)
|
||||
* [WBStartStruct](api/inter/WBStartStruct.md)
|
||||
|
||||
<!-- end -->
|
||||
|
||||
|
@ -115,17 +115,17 @@ for [statistics drivers][1].
|
|||
|
||||
<!-- inter-toc level -->
|
||||
|
||||
* [F3DFloor](api-level-F3DFloor.md)
|
||||
* [FColorMap](api-level-FColorMap.md)
|
||||
* [Line](api-level-Line.md)
|
||||
* [LineIdIterator](api-level-LineIdIterator.md)
|
||||
* [SecPlane](api-level-SecPlane.md)
|
||||
* [SecSpecial](api-level-SecSpecial.md)
|
||||
* [Sector](api-level-Sector.md)
|
||||
* [SectorEffect](api-level-SectorEffect.md)
|
||||
* [SectorTagIterator](api-level-SectorTagIterator.md)
|
||||
* [Side](api-level-Side.md)
|
||||
* [Vertex](api-level-Vertex.md)
|
||||
* [F3DFloor](api/level/F3DFloor.md)
|
||||
* [FColorMap](api/level/FColorMap.md)
|
||||
* [LineIdIterator](api/level/LineIdIterator.md)
|
||||
* [Line](api/level/Line.md)
|
||||
* [SecPlane](api/level/SecPlane.md)
|
||||
* [SecSpecial](api/level/SecSpecial.md)
|
||||
* [SectorEffect](api/level/SectorEffect.md)
|
||||
* [SectorTagIterator](api/level/SectorTagIterator.md)
|
||||
* [Sector](api/level/Sector.md)
|
||||
* [Side](api/level/Side.md)
|
||||
* [Vertex](api/level/Vertex.md)
|
||||
|
||||
<!-- end -->
|
||||
|
||||
|
@ -135,9 +135,9 @@ TODO
|
|||
|
||||
<!-- inter-toc player -->
|
||||
|
||||
* [PlayerClass](api-player-PlayerClass.md)
|
||||
* [PlayerSkin](api-player-PlayerSkin.md)
|
||||
* [Team](api-player-Team.md)
|
||||
* [PlayerClass](api/player/PlayerClass.md)
|
||||
* [PlayerSkin](api/player/PlayerSkin.md)
|
||||
* [Team](api/player/Team.md)
|
||||
|
||||
<!-- end -->
|
||||
|
||||
|
@ -147,7 +147,7 @@ TODO
|
|||
|
||||
<!-- inter-toc sound -->
|
||||
|
||||
* [SeqNode](api-sound-SeqNode.md)
|
||||
* [SeqNode](api/sound/SeqNode.md)
|
||||
|
||||
<!-- end -->
|
||||
|
||||
|
@ -155,9 +155,9 @@ TODO
|
|||
|
||||
# Weapons
|
||||
|
||||
<!-- inter-toc wep -->
|
||||
<!-- inter-toc weapon -->
|
||||
|
||||
* [PSprite](api-wep-PSprite.md)
|
||||
* [PSprite](api/weapon/PSprite.md)
|
||||
|
||||
<!-- end -->
|
||||
|
||||
|
@ -165,39 +165,39 @@ TODO
|
|||
|
||||
# Global Objects
|
||||
|
||||
<!-- inter-toc global-data -->
|
||||
<!-- inter-toc global/data -->
|
||||
|
||||
* [Client](api-global-data-Client.md)
|
||||
* [Constants](api-global-data-Constants.md)
|
||||
* [Game](api-global-data-Game.md)
|
||||
* [Information](api-global-data-Information.md)
|
||||
* [Player](api-global-data-Player.md)
|
||||
* [Client](api/global/data/Client.md)
|
||||
* [Constants](api/global/data/Constants.md)
|
||||
* [Game](api/global/data/Game.md)
|
||||
* [Information](api/global/data/Information.md)
|
||||
* [Player](api/global/data/Player.md)
|
||||
|
||||
<!-- end -->
|
||||
|
||||
These variables are accessible in any context and are not bound by any specific
|
||||
object. Generally these mirror global information within the engine itself.
|
||||
|
||||
<!-- inter-toc global-func -->
|
||||
<!-- inter-toc global/func -->
|
||||
|
||||
* [Classes](api-global-func-Classes.md)
|
||||
* [Game](api-global-func-Game.md)
|
||||
* [Math](api-global-func-Math.md)
|
||||
* [Random](api-global-func-Random.md)
|
||||
* [Sound](api-global-func-Sound.md)
|
||||
* [System](api-global-func-System.md)
|
||||
* [Classes](api/global/func/Classes.md)
|
||||
* [Game](api/global/func/Game.md)
|
||||
* [Math](api/global/func/Math.md)
|
||||
* [Random](api/global/func/Random.md)
|
||||
* [Sound](api/global/func/Sound.md)
|
||||
* [System](api/global/func/System.md)
|
||||
|
||||
<!-- end -->
|
||||
|
||||
These functions are accessible in any context and are not bound by any specific
|
||||
object. Generally these are utility functions.
|
||||
|
||||
<!-- inter-toc global-type -->
|
||||
<!-- inter-toc global/type -->
|
||||
|
||||
* [DehInfo](api-global-type-DehInfo.md)
|
||||
* [FOptionMenuSettings](api-global-type-FOptionMenuSettings.md)
|
||||
* [GameInfoStruct](api-global-type-GameInfoStruct.md)
|
||||
* [LevelLocals](api-global-type-LevelLocals.md)
|
||||
* [DehInfo](api/global/type/DehInfo.md)
|
||||
* [FOptionMenuSettings](api/global/type/FOptionMenuSettings.md)
|
||||
* [GameInfoStruct](api/global/type/GameInfoStruct.md)
|
||||
* [LevelLocals](api/global/type/LevelLocals.md)
|
||||
|
||||
<!-- end -->
|
||||
|
||||
|
|
|
@ -17,13 +17,13 @@ struct State
|
|||
readonly uint16 TicRange;
|
||||
readonly uint8 UseFlags;
|
||||
|
||||
readonly bool bCANRAISE;
|
||||
readonly bool bDEHACKED;
|
||||
readonly bool bFAST;
|
||||
readonly bool bFULLBRIGHT;
|
||||
readonly bool bNODELAY;
|
||||
readonly bool bSAMEFRAME;
|
||||
readonly bool bSLOW;
|
||||
readonly bool bCanRaise;
|
||||
readonly bool bDeHackEd;
|
||||
readonly bool bFast;
|
||||
readonly bool bFullBright;
|
||||
readonly bool bNoDelay;
|
||||
readonly bool bSameFrame;
|
||||
readonly bool bSlow;
|
||||
|
||||
int DistanceTo(State other);
|
||||
bool InStateSequence(State base);
|
||||
|
@ -65,38 +65,38 @@ struct State
|
|||
The scope of this state. See *Action Scoping*. Can have any of the
|
||||
`DefaultStateUsage` flags.
|
||||
|
||||
- `bCANRAISE`
|
||||
- `bCanRaise`
|
||||
|
||||
State has the `CANRAISE` flag, allowing `A_VileChase` to target this actor
|
||||
State has the `CanRaise` flag, allowing `A_VileChase` to target this actor
|
||||
for healing without entering an infinitely long state.
|
||||
|
||||
- `bDEHACKED`
|
||||
- `bDeHackEd`
|
||||
|
||||
`true` if the state has been modified by DeHackEd.
|
||||
|
||||
- `bFAST`
|
||||
- `bFast`
|
||||
|
||||
State has the `FAST` flag, halving the duration when fast monsters is
|
||||
State has the `Fast` flag, halving the duration when fast monsters is
|
||||
enabled.
|
||||
|
||||
- `bFULLBRIGHT`
|
||||
- `bFullBright`
|
||||
|
||||
State has the `BRIGHT` flag, making it fully bright regardless of other
|
||||
State has the `Bright` flag, making it fully bright regardless of other
|
||||
lighting conditions.
|
||||
|
||||
- `bNODELAY`
|
||||
- `bNoDelay`
|
||||
|
||||
State has the `NODELAY` flag, forcing the associated action function to be
|
||||
State has the `NoDelay` flag, forcing the associated action function to be
|
||||
run if the actor is in its first tic.
|
||||
|
||||
- `bSAMEFRAME`
|
||||
- `bSameFrame`
|
||||
|
||||
`true` if the state's frame is to be kept from the last frame used, i.e., is
|
||||
`#`.
|
||||
|
||||
- `bSLOW`
|
||||
- `bSlow`
|
||||
|
||||
State has the `SLOW` flag, doubling the duration when slow monsters is
|
||||
State has the `Slow` flag, doubling the duration when slow monsters is
|
||||
enabled.
|
||||
|
||||
- `DistanceTo`
|
|
@ -12,6 +12,7 @@ struct Array<Type>
|
|||
uint Max() const;
|
||||
uint Size() const;
|
||||
|
||||
void Append(array<Type> other);
|
||||
void Copy(array<Type> other);
|
||||
void Move(array<Type> other);
|
||||
|
||||
|
@ -51,6 +52,11 @@ struct Array<Type>
|
|||
Removes the last item in the array, possibly destroying it. Returns `false`
|
||||
if there are no items in the array to begin with.
|
||||
|
||||
- `Append`
|
||||
|
||||
Value-copies another array's contents and places them into this array at the
|
||||
end.
|
||||
|
||||
- `Copy`
|
||||
|
||||
Value-copies another array's contents into this array. The contents of
|
|
@ -5,7 +5,7 @@ The base class of all `class` types.
|
|||
```
|
||||
class Object
|
||||
{
|
||||
bool bDESTROYED;
|
||||
bool bDestroyed;
|
||||
|
||||
class GetClass();
|
||||
string GetClassName();
|
||||
|
@ -17,7 +17,7 @@ class Object
|
|||
}
|
||||
```
|
||||
|
||||
- `bDESTROYED`
|
||||
- `bDestroyed`
|
||||
|
||||
This object wants to be destroyed but has not yet been garbage collected.
|
||||
|
|
@ -36,11 +36,11 @@ class PSprite : Object play
|
|||
double X;
|
||||
double Y;
|
||||
|
||||
bool bADDBOB;
|
||||
bool bADDWEAPON;
|
||||
bool bCVARFAST;
|
||||
bool bFLIP;
|
||||
bool bPOWDOUBLE;
|
||||
bool bAddBob;
|
||||
bool bAddWeapon;
|
||||
bool bCVarFast;
|
||||
bool bFlip;
|
||||
bool bPowDouble;
|
||||
|
||||
void SetState(State newstate, bool pending = false);
|
||||
void Tick();
|
||||
|
@ -108,23 +108,23 @@ class PSprite : Object play
|
|||
The offset from the weapon's normal resting position on the vertical axis.
|
||||
Note that `32` is the real resting position because of `A_Raise`.
|
||||
|
||||
- `bADDBOB`
|
||||
- `bAddBob`
|
||||
|
||||
Adds the weapon's bobbing to this layer's offset.
|
||||
|
||||
- `bADDWEAPON`
|
||||
- `bAddWeapon`
|
||||
|
||||
Adds the weapon layer's offsets to this layer's offset.
|
||||
|
||||
- `bCVARFAST`
|
||||
- `bCVarFast`
|
||||
|
||||
Layer will respect `sv_fastweapons`.
|
||||
|
||||
- `bFLIP`
|
||||
- `bFlip`
|
||||
|
||||
Flips the weapon visually horizontally.
|
||||
|
||||
- `bPOWDOUBLE`
|
||||
- `bPowDouble`
|
||||
|
||||
Layer will respect `PowerDoubleFiringSpeed`.
|
||||
|
10
glossary.md
10
glossary.md
|
@ -2,11 +2,11 @@
|
|||
|
||||
<!-- inter-toc -->
|
||||
|
||||
* [Classes](glossary-Classes.md)
|
||||
* [Concepts](glossary-Concepts.md)
|
||||
* [Structures](glossary-Structures.md)
|
||||
* [Style](glossary-Style.md)
|
||||
* [Versions](glossary-Versions.md)
|
||||
* [Classes](glossary/Classes.md)
|
||||
* [Concepts](glossary/Concepts.md)
|
||||
* [Structures](glossary/Structures.md)
|
||||
* [Style](glossary/Style.md)
|
||||
* [Versions](glossary/Versions.md)
|
||||
|
||||
<!-- end -->
|
||||
|
||||
|
|
|
@ -127,15 +127,15 @@ Finally, here is a table of contents for each language element:
|
|||
|
||||
<!-- inter-toc -->
|
||||
|
||||
* [Classes](lang-Classes.md)
|
||||
* [Constants](lang-Constants.md)
|
||||
* [Enumerations](lang-Enumerations.md)
|
||||
* [Expressions](lang-Expressions.md)
|
||||
* [Members](lang-Members.md)
|
||||
* [Methods](lang-Methods.md)
|
||||
* [Statements](lang-Statements.md)
|
||||
* [Structures](lang-Structures.md)
|
||||
* [Types](lang-Types.md)
|
||||
* [Classes](language/Classes.md)
|
||||
* [Constants](language/Constants.md)
|
||||
* [Enumerations](language/Enumerations.md)
|
||||
* [Expressions](language/Expressions.md)
|
||||
* [Members](language/Members.md)
|
||||
* [Methods](language/Methods.md)
|
||||
* [Statements](language/Statements.md)
|
||||
* [Structures](language/Structures.md)
|
||||
* [Types](language/Types.md)
|
||||
|
||||
<!-- end -->
|
||||
|
|
@ -2,17 +2,17 @@
|
|||
|
||||
<!-- vim-markdown-toc GFM -->
|
||||
|
||||
* [Example: Class headers](#example-class-headers)
|
||||
* [Example: Class definitions](#example-class-definitions)
|
||||
* [Example: Class headers](#example-class-headers)
|
||||
* [Example: Class definitions](#example-class-definitions)
|
||||
* [Class Flags](#class-flags)
|
||||
* [Class Content](#class-content)
|
||||
* [Property Definitions](#property-definitions)
|
||||
* [Example: Property definitions](#example-property-definitions)
|
||||
* [Example: Property definitions](#example-property-definitions)
|
||||
* [Flag Definitions](#flag-definitions)
|
||||
* [Example: Flag definitions](#example-flag-definitions)
|
||||
* [Example: Flag definitions](#example-flag-definitions)
|
||||
* [Default Blocks](#default-blocks)
|
||||
* [Default Flag](#default-flag)
|
||||
* [Default Property](#default-property)
|
||||
* [Default Flag](#default-flag)
|
||||
* [Default Property](#default-property)
|
||||
* [State Definitions](#state-definitions)
|
||||
|
||||
<!-- vim-markdown-toc -->
|
||||
|
@ -211,7 +211,7 @@ Flag definitions are used within classes to define defaultable boolean flags on
|
|||
actors. They are not valid on classes not derived from Actor.
|
||||
|
||||
When registered, a flag will be available in the `default` block as
|
||||
`CLASSNAME.FLAGNAME`, as well as a member as `bFLAGNAME`.
|
||||
`ClassName.FlagName`, as well as a member as `bFlagName`.
|
||||
|
||||
Each flag operates on a singular bit of any integer member of the class. The
|
||||
integer must be exactly 32 bits, though if it is signed or not does not matter.
|
||||
|
@ -246,23 +246,23 @@ class MyCoolActorWithFlags : Actor
|
|||
// Hey, those sentences sounded familiar...
|
||||
default
|
||||
{
|
||||
+MYCOOLACTORWITHFLAGS.THIS_ONE_IS_ON
|
||||
-MYCOOLACTORWITHFLAGS.THIS_ONE_IS_OFF
|
||||
+MyCoolActorWithFlags.ThisOneIsOn
|
||||
-MyCoolActorWithFlags.ThisOneIsOff
|
||||
}
|
||||
|
||||
// Declare a flag field for all of the flags. This can hold up to 32 flags.
|
||||
int m_Flags;
|
||||
|
||||
// Declare the flags, one at a time...
|
||||
flagdef THIS_ONE_IS_ON: m_Flags, 0;
|
||||
flagdef THIS_ONE_IS_OFF: m_Flags, 1;
|
||||
flagdef THIS_ONE_ALIASES_ON: m_Flags, 0;
|
||||
flagdef ThisOneIsOn: m_Flags, 0;
|
||||
flagdef ThisOneIsOff: m_Flags, 1;
|
||||
flagdef ThisOneAliasesOn: m_Flags, 0;
|
||||
|
||||
// Unnecessary, since you can just access it directly, but this demonstrates
|
||||
// how declared flags can be used in methods.
|
||||
bool CheckIfOnIsOn()
|
||||
{
|
||||
return bTHIS_ONE_IS_ON;
|
||||
return bThisOneIsOn;
|
||||
}
|
||||
}
|
||||
```
|
|
@ -3,55 +3,62 @@
|
|||
## By Alison Sanderson. Attribution is encouraged, though not required.
|
||||
## <https://creativecommons.org/publicdomain/zero/1.0/legalcode>
|
||||
## TOCGen: Generates inter-file TOCs.
|
||||
## Example usage:
|
||||
## tools/tocgen.rb
|
||||
|
||||
$d = Dir["*.md"]
|
||||
def emit_filtered_file_toc file_matcher
|
||||
links = []
|
||||
files = ALL_MD_FILES.map do |p| p.match file_matcher end.compact
|
||||
|
||||
def filter_emit r
|
||||
res = []
|
||||
for m in $d.map{|p| p.match r}.compact
|
||||
res << "* [#{m[1]}](#{m[0]})"
|
||||
end
|
||||
res.join ?\n
|
||||
for md_file in files
|
||||
links << "* [#{md_file[1]}](#{md_file[0]})"
|
||||
end
|
||||
|
||||
links.sort.join ?\n
|
||||
end
|
||||
|
||||
def find_toc_areas f
|
||||
re = /^(<!-- inter-toc\s*([^\s]+)\s*-->)(?:.|\n)*?(<!-- end -->)/i
|
||||
f.to_enum(:scan, re).map{$~}
|
||||
TOC_REGEX = /^(<!-- inter-toc\s*([^\s]+)?\s*-->)(?:.|\n)*?(<!-- end -->)/i
|
||||
def find_inter_toc_areas file
|
||||
file.to_enum(:scan, TOC_REGEX).map do $~ end
|
||||
end
|
||||
|
||||
def filter_toc_areas f
|
||||
o = String.new
|
||||
lof = 0
|
||||
for area in find_toc_areas f
|
||||
of = area.offset 0
|
||||
o << f[lof...of[0]]
|
||||
o << area[1]
|
||||
o << "\n\n"
|
||||
o << filter_emit(yield area[2])
|
||||
o << "\n\n"
|
||||
o << area[3]
|
||||
lof = of[1]
|
||||
end
|
||||
o << f[lof..-1]
|
||||
o
|
||||
def filter_toc_areas file
|
||||
content = ""
|
||||
last_offset = 0
|
||||
|
||||
for area in find_inter_toc_areas file
|
||||
offset = area.offset 0
|
||||
content << file[last_offset...offset[0]]
|
||||
content << area[1]
|
||||
content << "\n\n"
|
||||
content << emit_filtered_file_toc(yield area[2])
|
||||
content << "\n\n"
|
||||
content << area[3]
|
||||
last_offset = offset[1]
|
||||
end
|
||||
|
||||
content << file[last_offset..-1]
|
||||
content
|
||||
end
|
||||
|
||||
def rewrite fnam
|
||||
f = File.read fnam
|
||||
o = yield f
|
||||
File.write fnam, o
|
||||
def rewrite filename
|
||||
file = File.read filename
|
||||
output = yield file
|
||||
File.write filename, output
|
||||
end
|
||||
|
||||
rewrite "api.md" do |f|
|
||||
filter_toc_areas f do |a| /api-#{a}-(\w+).md/ end
|
||||
ALL_MD_FILES = Dir["{api,glossary,language}/**/*.md"]
|
||||
|
||||
rewrite "api.md" do |file|
|
||||
filter_toc_areas file do |folder| /api\/#{folder}\/(\w+).md/ end
|
||||
end
|
||||
|
||||
rewrite "glossary.md" do |f|
|
||||
filter_toc_areas f do |a| /glossary-(\w+).md/ end
|
||||
rewrite "glossary.md" do |file|
|
||||
filter_toc_areas file do |_| /glossary\/(\w+).md/ end
|
||||
end
|
||||
|
||||
rewrite "lang.md" do |f|
|
||||
filter_toc_areas f do |a| /lang-(\w+).md/ end
|
||||
rewrite "language.md" do |file|
|
||||
filter_toc_areas file do |_| /language\/(\w+).md/ end
|
||||
end
|
||||
|
||||
## EOF
|
||||
|
|
|
@ -4,51 +4,51 @@
|
|||
## <https://creativecommons.org/publicdomain/zero/1.0/legalcode>
|
||||
## TreeGen: Generates the glossary files for classes.
|
||||
## Example usage:
|
||||
## tools/treegen.rb \
|
||||
## tools/treegen.rb \
|
||||
## '/mnt/g/Archive/gzdoom-g4.1.0/wadsrc/static/zscript/**/*.zs' \
|
||||
## 4.1.0
|
||||
|
||||
require "./tools/zsclasstree.rb"
|
||||
|
||||
DIR = ARGV.shift
|
||||
VER = ARGV.shift
|
||||
FILES = ARGV.shift
|
||||
VERSION = ARGV.shift
|
||||
|
||||
si = ClassSiphon.new DIR
|
||||
siphon = ClassSiphon.new FILES
|
||||
|
||||
f = open "glossary-Classes.md", "wb"
|
||||
f.puts <<_end_
|
||||
file = open "glossary-Classes.md", "wb"
|
||||
file.puts <<_end_
|
||||
# Classes
|
||||
|
||||
Here is a full tree of all classes in ZScript as of GZDoom #{VER}. There are
|
||||
#{si.classes.count + 1} classes total.
|
||||
Here is a full tree of all classes in ZScript as of GZDoom #{VERSION}. There
|
||||
are #{siphon.classes.count + 1} classes total.
|
||||
|
||||
```
|
||||
Object
|
||||
_end_
|
||||
|
||||
si.print_classes f
|
||||
siphon.print_classes file
|
||||
|
||||
f.puts <<_end_
|
||||
file.puts <<_end_
|
||||
```
|
||||
|
||||
<!-- EOF -->
|
||||
_end_
|
||||
|
||||
f = open "glossary-Structures.md", "wb"
|
||||
f.puts <<_end_
|
||||
file = open "glossary-Structures.md", "wb"
|
||||
file.puts <<_end_
|
||||
# Structures
|
||||
|
||||
Here is a full list of all structures in ZScript as of GZDoom #{VER}. There are
|
||||
#{si.structs.count} structures total. Note that some of these are merely
|
||||
implementation details and should not be used in code.
|
||||
Here is a full list of all structures in ZScript as of GZDoom #{VERSION}.
|
||||
There are #{siphon.structs.count} structures total. Note that some of these
|
||||
are merely implementation details and should not be used in code.
|
||||
|
||||
```
|
||||
Struct
|
||||
_end_
|
||||
|
||||
si.print_structs f
|
||||
siphon.print_structs file
|
||||
|
||||
f.puts <<_end_
|
||||
file.puts <<_end_
|
||||
```
|
||||
|
||||
<!-- EOF -->
|
||||
|
|
|
@ -11,101 +11,101 @@
|
|||
require 'set'
|
||||
|
||||
class ClassSiphon
|
||||
attr_reader :structs, :classes, :clstree, :strtree, :caps
|
||||
attr_reader :structs, :classes, :clstree, :strtree, :caps
|
||||
|
||||
def initialize dirs
|
||||
@subcls = {}
|
||||
@classes = Set[]
|
||||
@structs = Set[]
|
||||
@caps = {}
|
||||
def initialize dirs
|
||||
@subcls = {}
|
||||
@classes = Set[]
|
||||
@structs = Set[]
|
||||
@caps = {}
|
||||
|
||||
Dir.glob dirs do |f| proc_file File.read f end
|
||||
Dir.glob dirs do |f| proc_file File.read f end
|
||||
|
||||
@clstree = make_tree "OBJECT", @subcls["OBJECT"]
|
||||
@strtree = @structs.map {|type| [type, nil]}
|
||||
@clstree = make_tree "OBJECT", @subcls["OBJECT"]
|
||||
@strtree = @structs.map {|type| [type, nil]}
|
||||
|
||||
@classes.freeze
|
||||
@structs.freeze
|
||||
@clstree.freeze
|
||||
@strtree.freeze
|
||||
@caps.freeze
|
||||
end
|
||||
@classes.freeze
|
||||
@structs.freeze
|
||||
@clstree.freeze
|
||||
@strtree.freeze
|
||||
@caps.freeze
|
||||
end
|
||||
|
||||
def print_classes out, filter = []
|
||||
print_tree out, filter, "OBJECT", clstree
|
||||
end
|
||||
def print_classes out, filter = []
|
||||
print_tree out, filter, "OBJECT", clstree
|
||||
end
|
||||
|
||||
def print_structs out, filter = []
|
||||
print_tree out, filter, "STRUCT", strtree
|
||||
end
|
||||
def print_structs out, filter = []
|
||||
print_tree out, filter, "STRUCT", strtree
|
||||
end
|
||||
|
||||
private
|
||||
def add_class m
|
||||
ctype = m[0] .strip
|
||||
cbase = (m[1] or "Object").strip
|
||||
type = ctype.upcase
|
||||
base = cbase.upcase
|
||||
@caps[type] = ctype
|
||||
@caps[base] = cbase
|
||||
private
|
||||
def add_class m
|
||||
ctype = m[0] .strip
|
||||
cbase = (m[1] or "Object").strip
|
||||
type = ctype.upcase
|
||||
base = cbase.upcase
|
||||
@caps[type] = ctype
|
||||
@caps[base] = cbase
|
||||
|
||||
if base != type
|
||||
if @subcls[base]
|
||||
@subcls[base] << type
|
||||
else
|
||||
@subcls[base] = [type]
|
||||
end
|
||||
raise "duplicate class #{type}" if @classes === type
|
||||
@classes << type
|
||||
end
|
||||
end
|
||||
if base != type
|
||||
if @subcls[base]
|
||||
@subcls[base] << type
|
||||
else
|
||||
@subcls[base] = [type]
|
||||
end
|
||||
raise "duplicate class #{type}" if @classes === type
|
||||
@classes << type
|
||||
end
|
||||
end
|
||||
|
||||
def add_struct m
|
||||
ctype = m[0]
|
||||
type = ctype.upcase
|
||||
@caps[type] = ctype
|
||||
@structs << type
|
||||
end
|
||||
def add_struct m
|
||||
ctype = m[0]
|
||||
type = ctype.upcase
|
||||
@caps[type] = ctype
|
||||
@structs << type
|
||||
end
|
||||
|
||||
def proc_file f
|
||||
f.gsub! /\/\*(?!\*\/)+\*\//m, ""
|
||||
f.gsub! /\/\/.+/, ""
|
||||
f.scan(/^class\s*(\w*)[\s\w]+(?::\s+(\w*))?/).each {|m| add_class m}
|
||||
f.scan(/^struct\s*(\w*)/) .each {|m| add_struct m}
|
||||
end
|
||||
def proc_file f
|
||||
f.gsub! /\/\*(?!\*\/)+\*\//m, ""
|
||||
f.gsub! /\/\/.+/, ""
|
||||
f.scan(/^class\s*(\w*)[\s\w]+(?::\s+(\w*))?/).each {|m| add_class m}
|
||||
f.scan(/^struct\s*(\w*)/) .each {|m| add_struct m}
|
||||
end
|
||||
|
||||
# work our way down the subclasses recursively, making them into a tree structure
|
||||
def make_tree bcl, subs
|
||||
return nil unless subs
|
||||
node = {}
|
||||
subs.each do |cl| node[cl] = make_tree cl, @subcls[cl] end
|
||||
node
|
||||
end
|
||||
# work our way down the subclasses recursively, making them into a tree structure
|
||||
def make_tree bcl, subs
|
||||
return nil unless subs
|
||||
node = {}
|
||||
subs.each do |cl| node[cl] = make_tree cl, @subcls[cl] end
|
||||
node
|
||||
end
|
||||
|
||||
def print_tree out, filter, base, tree, tab = ""
|
||||
return if !tree or filter.include? base
|
||||
def print_tree out, filter, base, tree, tab = ""
|
||||
return if !tree or filter.include? base
|
||||
|
||||
tree = tree.map do |type, base| [type, base] end
|
||||
tree.sort!
|
||||
tree = tree.map do |type, base| [type, base] end
|
||||
tree.sort!
|
||||
|
||||
for type, base in tree
|
||||
last = type == tree[-1][0]
|
||||
sep = last ? "└ " : "├ "
|
||||
nxt = last ? " " : "│ "
|
||||
for type, base in tree
|
||||
last = type == tree[-1][0]
|
||||
sep = last ? "└ " : "├ "
|
||||
nxt = last ? " " : "│ "
|
||||
|
||||
out.puts tab + sep + @caps[type]
|
||||
out.puts tab + sep + @caps[type]
|
||||
|
||||
print_tree out, filter, type, base, tab + nxt
|
||||
end
|
||||
end
|
||||
print_tree out, filter, type, base, tab + nxt
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
if __FILE__ == $0
|
||||
in_dirs = ARGV.shift
|
||||
filters = ARGV
|
||||
in_dirs = ARGV.shift
|
||||
filters = ARGV
|
||||
|
||||
si = ClassSiphon.new in_dirs
|
||||
puts "Object"; si.print_classes STDOUT, filters
|
||||
puts "Struct"; si.print_structs STDOUT, filters
|
||||
si = ClassSiphon.new in_dirs
|
||||
puts "Object"; si.print_classes STDOUT, filters
|
||||
puts "Struct"; si.print_structs STDOUT, filters
|
||||
end
|
||||
|
||||
## EOF
|
||||
|
|
Loading…
Reference in New Issue