mirror of
				https://github.com/KevinMidboe/linguist.git
				synced 2025-10-29 17:50:22 +00:00 
			
		
		
		
	Merge branch 'master' into 989
Conflicts: lib/linguist/languages.yml
This commit is contained in:
		| @@ -6,6 +6,7 @@ rvm: | ||||
|   - 1.9.2 | ||||
|   - 1.9.3 | ||||
|   - 2.0.0 | ||||
|   - 2.1.1 | ||||
|   - ree | ||||
| notifications: | ||||
|   disabled: true | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| Gem::Specification.new do |s| | ||||
|   s.name    = 'github-linguist' | ||||
|   s.version = '2.10.11' | ||||
|   s.version = '2.10.12' | ||||
|   s.summary = "GitHub Language detection" | ||||
|   s.description = 'We use this library at GitHub to detect blob languages, highlight code, ignore binary files, suppress generated files in diffs, and generate language breakdown graphs.' | ||||
|  | ||||
|   | ||||
| @@ -28,6 +28,9 @@ module Linguist | ||||
|         if languages.all? { |l| ["Common Lisp", "OpenCL"].include?(l) } | ||||
|           disambiguate_cl(data, languages) | ||||
|         end | ||||
|         if languages.all? { |l| ["Rebol", "R"].include?(l) } | ||||
|           disambiguate_r(data, languages) | ||||
|         end | ||||
|       end | ||||
|     end | ||||
|  | ||||
| @@ -73,6 +76,13 @@ module Linguist | ||||
|       matches | ||||
|     end | ||||
|  | ||||
|     def self.disambiguate_r(data, languages) | ||||
|       matches = [] | ||||
|       matches << Language["Rebol"] if /\bRebol\b/i.match(data) | ||||
|       matches << Language["R"] if data.include?("<-") | ||||
|       matches | ||||
|     end | ||||
|  | ||||
|     def self.active? | ||||
|       !!ACTIVE | ||||
|     end | ||||
|   | ||||
| @@ -485,7 +485,7 @@ module Linguist | ||||
|     # | ||||
|     # Returns html String | ||||
|     def colorize(text, options = {}) | ||||
|       lexer.highlight(text, options = {}) | ||||
|       lexer.highlight(text, options) | ||||
|     end | ||||
|  | ||||
|     # Public: Return name as String representation | ||||
|   | ||||
| @@ -10,7 +10,7 @@ | ||||
| # ace_mode          - A String name of Ace Mode (if available) | ||||
| # wrap              - Boolean wrap to enable line wrapping (default: false) | ||||
| # extension         - An Array of associated extensions | ||||
| # interpreter       - An Array of associated interpreters | ||||
| # interpreters      - An Array of associated interpreters | ||||
| # primary_extension - A String for the main extension associated with | ||||
| #                     the language. Must be unique. Used when a Language is picked | ||||
| #                     from a dropdown and we need to automatically choose an | ||||
| @@ -86,6 +86,12 @@ Agda: | ||||
|   color: "#467C91" | ||||
|   primary_extension: .agda | ||||
|  | ||||
| Alloy: | ||||
|   type: programming  # 'modeling' would be more appropiate | ||||
|   lexer: Text only | ||||
|   color: "#cc5c24" | ||||
|   primary_extension: .als | ||||
|  | ||||
| ApacheConf: | ||||
|   type: markup | ||||
|   aliases: | ||||
| @@ -129,6 +135,12 @@ AsciiDoc: | ||||
|   - .adoc | ||||
|   - .asc | ||||
|  | ||||
| AspectJ: | ||||
|   type: programming | ||||
|   lexer: AspectJ | ||||
|   color: "#1957b0" | ||||
|   primary_extension: .aj | ||||
|  | ||||
| Assembly: | ||||
|   type: programming | ||||
|   lexer: NASM | ||||
| @@ -261,6 +273,7 @@ C++: | ||||
|   - .hh | ||||
|   - .hpp | ||||
|   - .hxx | ||||
|   - .inl | ||||
|   - .tcc | ||||
|   - .tpp | ||||
|  | ||||
| @@ -300,7 +313,7 @@ COBOL: | ||||
|  | ||||
| CSS: | ||||
|   ace_mode: css | ||||
|   color: "#1f085e" | ||||
|   color: "#563d7c" | ||||
|   primary_extension: .css | ||||
|  | ||||
| Ceylon: | ||||
| @@ -488,10 +501,19 @@ DCPU-16 ASM: | ||||
| Diff: | ||||
|   primary_extension: .diff | ||||
|  | ||||
| Dogescript: | ||||
|   type: programming | ||||
|   lexer: Text only | ||||
|   color: "#cca760" | ||||
|   primary_extension: .djs | ||||
|  | ||||
| Dylan: | ||||
|   type: programming | ||||
|   color: "#3ebc27" | ||||
|   primary_extension: .dylan | ||||
|   extensions: | ||||
|   - .intr | ||||
|   - .lid | ||||
|  | ||||
| Ecere Projects: | ||||
|   type: data | ||||
| @@ -507,6 +529,14 @@ ECL: | ||||
|   extensions: | ||||
|   - .eclxml | ||||
|  | ||||
| Eagle: | ||||
|   type: markup | ||||
|   color: "#3994bc" | ||||
|   lexer: XML | ||||
|   primary_extension: .sch | ||||
|   extensions: | ||||
|   - .brd | ||||
|  | ||||
| Eiffel: | ||||
|   type: programming | ||||
|   lexer: Text only | ||||
| @@ -617,6 +647,17 @@ Forth: | ||||
|   extensions: | ||||
|   - .4th | ||||
|  | ||||
| Frege: | ||||
|   type: programming | ||||
|   color: "#00cafe" | ||||
|   lexer: Haskell | ||||
|   primary_extension: .fr | ||||
|  | ||||
| Game Maker Language: | ||||
|   type: programming | ||||
|   lexer: JavaScript | ||||
|   primary_extension: .gml | ||||
|  | ||||
| GAS: | ||||
|   type: programming | ||||
|   group: Assembly | ||||
| @@ -664,6 +705,17 @@ Glyph: | ||||
|   lexer: Tcl | ||||
|   primary_extension: .glf | ||||
|  | ||||
| Gnuplot: | ||||
|   type: programming | ||||
|   color: "#f0a9f0" | ||||
|   lexer: Gnuplot | ||||
|   primary_extension: .gp | ||||
|   extensions: | ||||
|   - .gnu | ||||
|   - .gnuplot | ||||
|   - .plot | ||||
|   - .plt | ||||
|  | ||||
| Go: | ||||
|   type: programming | ||||
|   color: "#a89b4d" | ||||
| @@ -674,6 +726,16 @@ Gosu: | ||||
|   color: "#82937f" | ||||
|   primary_extension: .gs | ||||
|  | ||||
| Grammatical Framework: | ||||
|   type: programming | ||||
|   lexer: Haskell | ||||
|   aliases: | ||||
|   - gf | ||||
|   wrap: false | ||||
|   primary_extension: .gf | ||||
|   searchable: true | ||||
|   color: "#ff0000" | ||||
|  | ||||
| Groff: | ||||
|   primary_extension: .man | ||||
|   extensions: | ||||
| @@ -865,6 +927,12 @@ JSONLD: | ||||
|   lexer: JavaScript | ||||
|   primary_extension: .jsonld | ||||
|  | ||||
| JSONiq: | ||||
|   type: programming | ||||
|   ace_mode: jsoniq | ||||
|   lexer: XQuery | ||||
|   primary_extension: .jq | ||||
|  | ||||
| Jade: | ||||
|   group: HTML | ||||
|   type: markup | ||||
| @@ -887,7 +955,7 @@ Java Server Pages: | ||||
| JavaScript: | ||||
|   type: programming | ||||
|   ace_mode: javascript | ||||
|   color: "#f15501" | ||||
|   color: "#f7df1e" | ||||
|   aliases: | ||||
|   - js | ||||
|   - node | ||||
| @@ -907,6 +975,8 @@ JavaScript: | ||||
|   - .ssjs | ||||
|   filenames: | ||||
|   - Jakefile | ||||
|   interpreters: | ||||
|   - node | ||||
|  | ||||
| Julia: | ||||
|   type: programming | ||||
| @@ -1060,6 +1130,11 @@ Mask: | ||||
|   ace_mode: scss | ||||
|   primary_extension: .mask | ||||
|  | ||||
| Mathematica: | ||||
|   type: programming | ||||
|   primary_extension: .mathematica | ||||
|   lexer: Text only | ||||
|  | ||||
| Matlab: | ||||
|   type: programming | ||||
|   color: "#bb92ac" | ||||
| @@ -1186,9 +1261,14 @@ Objective-C: | ||||
|   - obj-c | ||||
|   - objc | ||||
|   primary_extension: .m | ||||
|   extensions: | ||||
|   - .h | ||||
|   - .mm | ||||
|  | ||||
| Objective-C++: | ||||
|   type: programming | ||||
|   color: "#4886FC" | ||||
|   aliases: | ||||
|   - obj-c++ | ||||
|   - objc++ | ||||
|   primary_extension: .mm | ||||
|  | ||||
| Objective-J: | ||||
|   type: programming | ||||
| @@ -1391,6 +1471,12 @@ Pure Data: | ||||
|   lexer: Text only | ||||
|   primary_extension: .pd | ||||
|  | ||||
| PureScript: | ||||
|   type: programming | ||||
|   color: "#f3ce45" | ||||
|   lexer: Haskell | ||||
|   primary_extension: .purs | ||||
|  | ||||
| Python: | ||||
|   type: programming | ||||
|   ace_mode: python | ||||
| @@ -1494,10 +1580,12 @@ Rebol: | ||||
|   type: programming | ||||
|   lexer: REBOL | ||||
|   color: "#358a5b" | ||||
|   primary_extension: .rebol | ||||
|   primary_extension: .reb | ||||
|   extensions: | ||||
|   - .r | ||||
|   - .r2 | ||||
|   - .r3 | ||||
|   - .rebol | ||||
|  | ||||
| Redcode: | ||||
|   primary_extension: .cw | ||||
| @@ -1636,6 +1724,11 @@ Shell: | ||||
|   filenames: | ||||
|   - Dockerfile | ||||
|  | ||||
| ShellSession: | ||||
|   type: programming | ||||
|   lexer: Bash Session | ||||
|   primary_extension: .sh-session | ||||
|  | ||||
| Shen: | ||||
|   type: programming | ||||
|   color: "#120F14" | ||||
| @@ -1655,6 +1748,13 @@ Smalltalk: | ||||
| Smarty: | ||||
|   primary_extension: .tpl | ||||
|  | ||||
| SourcePawn: | ||||
|   type: programming | ||||
|   color: "#f69e1d" | ||||
|   aliases: | ||||
|   - sourcemod | ||||
|   primary_extension: .sp | ||||
|  | ||||
| Squirrel: | ||||
|   type: programming | ||||
|   lexer: C++ | ||||
| @@ -1669,6 +1769,19 @@ Standard ML: | ||||
|   extensions: | ||||
|   - .fun | ||||
|  | ||||
| Stata: | ||||
|   type: programming | ||||
|   lexer: Text only | ||||
|   extensions: | ||||
|   - .ado | ||||
|   - .do | ||||
|   - .doh | ||||
|   - .ihlp | ||||
|   - .mata | ||||
|   - .matah | ||||
|   - .sthlp | ||||
|   primary_extension: .do | ||||
|  | ||||
| Stylus: | ||||
|   type: markup | ||||
|   group: CSS | ||||
| @@ -1681,6 +1794,15 @@ SuperCollider: | ||||
|   lexer: Text only | ||||
|   primary_extension: .scd | ||||
|  | ||||
| SystemVerilog: | ||||
|   type: programming | ||||
|   color: "#343761" | ||||
|   lexer: systemverilog | ||||
|   primary_extension: .sv | ||||
|   extensions: | ||||
|   - .svh | ||||
|   - .vh | ||||
|  | ||||
| TOML: | ||||
|   type: data | ||||
|   primary_extension: .toml | ||||
| @@ -1696,6 +1818,7 @@ Tcl: | ||||
|   primary_extension: .tcl | ||||
|   extensions: | ||||
|   - .adp | ||||
|   - .tm | ||||
|  | ||||
| Tcsh: | ||||
|   type: programming | ||||
| @@ -1858,6 +1981,7 @@ XML: | ||||
|   - .kml | ||||
|   - .launch | ||||
|   - .mxml | ||||
|   - .osm | ||||
|   - .plist | ||||
|   - .pluginspec | ||||
|   - .ps1xml | ||||
| @@ -1938,6 +2062,12 @@ YAML: | ||||
|   - .rviz | ||||
|   - .yaml | ||||
|  | ||||
| Zephir: | ||||
|   type: programming | ||||
|   lexer: PHP | ||||
|   color: "#118f9e" | ||||
|   primary_extension: .zep | ||||
|  | ||||
| eC: | ||||
|   type: programming | ||||
|   search_term: ec | ||||
|   | ||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -10,7 +10,7 @@ | ||||
| ## Vendor Conventions ## | ||||
|  | ||||
| # Caches | ||||
| - cache/ | ||||
| - (^|/)cache/ | ||||
|  | ||||
| # Dependencies | ||||
| - ^[Dd]ependencies/ | ||||
| @@ -98,6 +98,9 @@ | ||||
| # AngularJS | ||||
| - (^|/)angular([^.]*)(\.min)?\.js$ | ||||
|  | ||||
| # React | ||||
| - (^|/)react(-[^.]*)?(\.min)?\.js$ | ||||
|  | ||||
| ## Python ## | ||||
|  | ||||
| # django | ||||
| @@ -128,6 +131,7 @@ | ||||
|  | ||||
| # Visual Studio IntelliSense | ||||
| - -vsdoc\.js$ | ||||
| - \.intellisense\.js$ | ||||
|  | ||||
| # jQuery validation plugin (MS bundles this with asp.net mvc) | ||||
| - (^|/)jquery([^.]*)\.validate(\.unobtrusive)?(\.min)?\.js$ | ||||
|   | ||||
							
								
								
									
										59
									
								
								samples/Alloy/file_system.als
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										59
									
								
								samples/Alloy/file_system.als
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,59 @@ | ||||
| module examples/systems/file_system | ||||
|  | ||||
| /* | ||||
|  * Model of a generic file system. | ||||
|  */ | ||||
|  | ||||
| abstract sig Object {} | ||||
|  | ||||
| sig Name {} | ||||
|  | ||||
| sig File extends Object {} { some d: Dir | this in d.entries.contents } | ||||
|  | ||||
| sig Dir extends Object { | ||||
|   entries: set DirEntry, | ||||
|   parent: lone Dir | ||||
| } { | ||||
|   parent = this.~@contents.~@entries | ||||
|   all e1, e2 : entries | e1.name = e2.name => e1 = e2 | ||||
|   this !in this.^@parent | ||||
|   this != Root => Root in this.^@parent | ||||
| } | ||||
|  | ||||
| one sig Root extends Dir {} { no parent } | ||||
|  | ||||
| lone sig Cur extends Dir {} | ||||
|  | ||||
| sig DirEntry { | ||||
|   name: Name, | ||||
|   contents: Object | ||||
| } { | ||||
|   one this.~entries | ||||
| } | ||||
|  | ||||
|  | ||||
| /** | ||||
|  * all directories besides root have one parent | ||||
|  */ | ||||
| pred OneParent_buggyVersion { | ||||
|     all d: Dir - Root | one d.parent | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * all directories besides root have one parent | ||||
|  */ | ||||
| pred OneParent_correctVersion { | ||||
|     all d: Dir - Root | (one d.parent && one contents.d) | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * Only files may be linked (that is, have more than one entry) | ||||
|  * That is, all directories are the contents of at most one directory entry | ||||
|  */ | ||||
| pred NoDirAliases { | ||||
|     all o: Dir | lone o.~contents | ||||
| } | ||||
|  | ||||
| check { OneParent_buggyVersion => NoDirAliases } for 5 expect 1 | ||||
|  | ||||
| check { OneParent_correctVersion => NoDirAliases } for 5 expect 0 | ||||
							
								
								
									
										83
									
								
								samples/Alloy/marksweepgc.als
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										83
									
								
								samples/Alloy/marksweepgc.als
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,83 @@ | ||||
| module examples/systems/marksweepgc | ||||
|  | ||||
| /* | ||||
|  * Model of mark and sweep garbage collection. | ||||
|  */ | ||||
|  | ||||
| // a node in the heap | ||||
| sig Node {} | ||||
|  | ||||
| sig HeapState { | ||||
|   left, right : Node -> lone Node, | ||||
|   marked : set Node, | ||||
|   freeList : lone Node | ||||
| } | ||||
|  | ||||
| pred clearMarks[hs, hs' : HeapState] { | ||||
|   // clear marked set | ||||
|   no hs'.marked | ||||
|   // left and right fields are unchanged | ||||
|   hs'.left = hs.left | ||||
|   hs'.right = hs.right | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * simulate the recursion of the mark() function using transitive closure | ||||
|  */ | ||||
| fun reachable[hs: HeapState, n: Node] : set Node { | ||||
|   n + n.^(hs.left + hs.right) | ||||
| } | ||||
|  | ||||
| pred mark[hs: HeapState, from : Node, hs': HeapState] { | ||||
|   hs'.marked = hs.reachable[from] | ||||
|   hs'.left = hs.left | ||||
|   hs'.right = hs.right | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * complete hack to simulate behavior of code to set freeList | ||||
|  */ | ||||
| pred setFreeList[hs, hs': HeapState] { | ||||
|   // especially hackish | ||||
|   hs'.freeList.*(hs'.left) in (Node - hs.marked) | ||||
|   all n: Node | | ||||
|     (n !in hs.marked) => { | ||||
|       no hs'.right[n] | ||||
|       hs'.left[n] in (hs'.freeList.*(hs'.left)) | ||||
|       n in hs'.freeList.*(hs'.left) | ||||
|     } else { | ||||
|       hs'.left[n] = hs.left[n] | ||||
|       hs'.right[n] = hs.right[n] | ||||
|     } | ||||
|   hs'.marked = hs.marked | ||||
| } | ||||
|  | ||||
| pred GC[hs: HeapState, root : Node, hs': HeapState] { | ||||
|   some hs1, hs2: HeapState | | ||||
|     hs.clearMarks[hs1] && hs1.mark[root, hs2] && hs2.setFreeList[hs'] | ||||
| } | ||||
|  | ||||
| assert Soundness1 { | ||||
|   all h, h' : HeapState, root : Node | | ||||
|     h.GC[root, h'] => | ||||
|       (all live : h.reachable[root] | { | ||||
|         h'.left[live] = h.left[live] | ||||
|         h'.right[live] = h.right[live] | ||||
|       }) | ||||
| } | ||||
|  | ||||
| assert Soundness2 { | ||||
|   all h, h' : HeapState, root : Node | | ||||
|     h.GC[root, h'] => | ||||
|       no h'.reachable[root] & h'.reachable[h'.freeList] | ||||
| } | ||||
|  | ||||
| assert Completeness { | ||||
|   all h, h' : HeapState, root : Node | | ||||
|     h.GC[root, h'] => | ||||
|       (Node - h'.reachable[root]) in h'.reachable[h'.freeList] | ||||
| } | ||||
|  | ||||
| check Soundness1 for 3 expect 0 | ||||
| check Soundness2 for 3 expect 0 | ||||
| check Completeness for 3 expect 0 | ||||
							
								
								
									
										217
									
								
								samples/Alloy/views.als
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										217
									
								
								samples/Alloy/views.als
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,217 @@ | ||||
| module examples/systems/views | ||||
|  | ||||
| /* | ||||
|  * Model of views in object-oriented programming. | ||||
|  * | ||||
|  * Two object references, called the view and the backing, | ||||
|  * are related by a view mechanism when changes to the | ||||
|  * backing are automatically propagated to the view. Note | ||||
|  * that the state of a view need not be a projection of the | ||||
|  * state of the backing; the keySet method of Map, for | ||||
|  * example, produces two view relationships, and for the | ||||
|  * one in which the map is modified by changes to the key | ||||
|  * set, the value of the new map cannot be determined from | ||||
|  * the key set. Note that in the iterator view mechanism, | ||||
|  * the iterator is by this definition the backing object, | ||||
|  * since changes are propagated from iterator to collection | ||||
|  * and not vice versa. Oddly, a reference may be a view of | ||||
|  * more than one backing: there can be two iterators on the | ||||
|  * same collection, eg. A reference cannot be a view under | ||||
|  * more than one view type. | ||||
|  * | ||||
|  * A reference is made dirty when it is a backing for a view | ||||
|  * with which it is no longer related by the view invariant. | ||||
|  * This usually happens when a view is modified, either | ||||
|  * directly or via another backing. For example, changing a | ||||
|  * collection directly when it has an iterator invalidates | ||||
|  * it, as does changing the collection through one iterator | ||||
|  * when there are others. | ||||
|  * | ||||
|  * More work is needed if we want to model more closely the | ||||
|  * failure of an iterator when its collection is invalidated. | ||||
|  * | ||||
|  * As a terminological convention, when there are two | ||||
|  * complementary view relationships, we will give them types | ||||
|  * t and t'. For example, KeySetView propagates from map to | ||||
|  * set, and KeySetView' propagates from set to map. | ||||
|  * | ||||
|  * author: Daniel Jackson | ||||
|  */ | ||||
|  | ||||
| open util/ordering[State] as so | ||||
| open util/relation as rel | ||||
|  | ||||
| sig Ref {} | ||||
| sig Object {} | ||||
|  | ||||
| -- t->b->v in views when v is view of type t of backing b | ||||
| -- dirty contains refs that have been invalidated | ||||
| sig State { | ||||
|   refs: set Ref, | ||||
|   obj: refs -> one Object, | ||||
|   views: ViewType -> refs -> refs, | ||||
|   dirty: set refs | ||||
| --  , anyviews: Ref -> Ref -- for visualization | ||||
|   } | ||||
| -- {anyviews = ViewType.views} | ||||
|  | ||||
| sig Map extends Object { | ||||
|   keys: set Ref, | ||||
|   map: keys -> one Ref | ||||
|   }{all s: State |  keys + Ref.map in s.refs} | ||||
| sig MapRef extends Ref {} | ||||
| fact {State.obj[MapRef] in Map} | ||||
|  | ||||
| sig Iterator extends Object { | ||||
|   left, done: set Ref, | ||||
|   lastRef: lone done | ||||
|   }{all s: State | done + left + lastRef in s.refs} | ||||
| sig IteratorRef extends Ref {} | ||||
| fact {State.obj[IteratorRef] in Iterator} | ||||
|  | ||||
| sig Set extends Object { | ||||
|   elts: set Ref | ||||
|   }{all s: State | elts in s.refs} | ||||
| sig SetRef extends Ref {} | ||||
| fact {State.obj[SetRef] in Set} | ||||
|  | ||||
| abstract sig ViewType {} | ||||
| one sig KeySetView, KeySetView', IteratorView extends ViewType {} | ||||
| fact ViewTypes { | ||||
|   State.views[KeySetView] in MapRef -> SetRef | ||||
|   State.views[KeySetView'] in SetRef -> MapRef | ||||
|   State.views[IteratorView] in IteratorRef -> SetRef | ||||
|   all s: State | s.views[KeySetView] = ~(s.views[KeySetView']) | ||||
|   } | ||||
|  | ||||
| /** | ||||
|  * mods is refs modified directly or by view mechanism | ||||
|  * doesn't handle possibility of modifying an object and its view at once? | ||||
|  * should we limit frame conds to non-dirty refs? | ||||
|  */ | ||||
| pred modifies [pre, post: State, rs: set Ref] { | ||||
|   let vr = pre.views[ViewType], mods = rs.*vr { | ||||
|     all r: pre.refs - mods | pre.obj[r] = post.obj[r] | ||||
|     all b: mods, v: pre.refs, t: ViewType | | ||||
|       b->v in pre.views[t] => viewFrame [t, pre.obj[v], post.obj[v], post.obj[b]] | ||||
|     post.dirty = pre.dirty + | ||||
|       {b: pre.refs | some v: Ref, t: ViewType | | ||||
|           b->v in pre.views[t] && !viewFrame [t, pre.obj[v], post.obj[v], post.obj[b]] | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|  | ||||
| pred allocates [pre, post: State, rs: set Ref] { | ||||
|   no rs & pre.refs | ||||
|   post.refs = pre.refs + rs | ||||
|   } | ||||
|  | ||||
| /**  | ||||
|  * models frame condition that limits change to view object from v to v' when backing object changes to b' | ||||
|  */ | ||||
| pred viewFrame [t: ViewType, v, v', b': Object] { | ||||
|   t in KeySetView => v'.elts = dom [b'.map] | ||||
|   t in KeySetView' => b'.elts = dom [v'.map] | ||||
|   t in KeySetView' => (b'.elts) <: (v.map) = (b'.elts) <: (v'.map) | ||||
|   t in IteratorView => v'.elts = b'.left + b'.done | ||||
|   } | ||||
|  | ||||
| pred MapRef.keySet [pre, post: State, setRefs: SetRef] { | ||||
|   post.obj[setRefs].elts = dom [pre.obj[this].map] | ||||
|   modifies [pre, post, none] | ||||
|   allocates [pre, post, setRefs] | ||||
|   post.views = pre.views + KeySetView->this->setRefs + KeySetView'->setRefs->this | ||||
|   } | ||||
|  | ||||
| pred MapRef.put [pre, post: State, k, v: Ref] { | ||||
|   post.obj[this].map = pre.obj[this].map ++ k->v | ||||
|   modifies [pre, post, this] | ||||
|   allocates [pre, post, none] | ||||
|   post.views = pre.views | ||||
|   } | ||||
|  | ||||
| pred SetRef.iterator [pre, post: State, iterRef: IteratorRef] { | ||||
|   let i = post.obj[iterRef] { | ||||
|     i.left = pre.obj[this].elts | ||||
|     no i.done + i.lastRef | ||||
|     } | ||||
|   modifies [pre,post,none] | ||||
|   allocates [pre, post, iterRef] | ||||
|   post.views = pre.views + IteratorView->iterRef->this | ||||
|   } | ||||
|  | ||||
| pred IteratorRef.remove [pre, post: State] { | ||||
|   let i = pre.obj[this], i' = post.obj[this] { | ||||
|     i'.left = i.left | ||||
|     i'.done = i.done - i.lastRef | ||||
|     no i'.lastRef | ||||
|     } | ||||
|   modifies [pre,post,this] | ||||
|   allocates [pre, post, none] | ||||
|   pre.views = post.views | ||||
|   } | ||||
|  | ||||
| pred IteratorRef.next [pre, post: State, ref: Ref] { | ||||
|   let i = pre.obj[this], i' = post.obj[this] { | ||||
|     ref in i.left | ||||
|     i'.left = i.left - ref | ||||
|     i'.done = i.done + ref | ||||
|     i'.lastRef = ref | ||||
|     } | ||||
|   modifies [pre, post, this] | ||||
|   allocates [pre, post, none] | ||||
|   pre.views = post.views | ||||
|   } | ||||
|  | ||||
| pred IteratorRef.hasNext [s: State] { | ||||
|   some s.obj[this].left | ||||
|   } | ||||
|  | ||||
| assert zippishOK { | ||||
|   all | ||||
|     ks, vs: SetRef, | ||||
|     m: MapRef, | ||||
|     ki, vi: IteratorRef, | ||||
|     k, v: Ref | | ||||
|     let s0=so/first, | ||||
|     s1=so/next[s0], | ||||
|     s2=so/next[s1], | ||||
|     s3=so/next[s2], | ||||
|     s4=so/next[s3], | ||||
|     s5=so/next[s4], | ||||
|     s6=so/next[s5], | ||||
|     s7=so/next[s6] | | ||||
|   ({ | ||||
|     precondition [s0, ks, vs, m] | ||||
|     no s0.dirty | ||||
|     ks.iterator [s0, s1, ki] | ||||
|     vs.iterator [s1, s2, vi] | ||||
|     ki.hasNext [s2] | ||||
|     vi.hasNext [s2] | ||||
|     ki.this/next [s2, s3, k] | ||||
|     vi.this/next [s3, s4, v] | ||||
|     m.put [s4, s5, k, v] | ||||
|     ki.remove [s5, s6] | ||||
|     vi.remove [s6, s7] | ||||
|   } => no State.dirty) | ||||
|   } | ||||
|  | ||||
| pred precondition [pre: State, ks, vs, m: Ref] { | ||||
|   // all these conditions and other errors discovered in scope of 6 but 8,3 | ||||
|   // in initial state, must have view invariants hold | ||||
|   (all t: ViewType, b, v: pre.refs | | ||||
|     b->v in pre.views[t] => viewFrame [t, pre.obj[v], pre.obj[v], pre.obj[b]]) | ||||
|   // sets are not aliases | ||||
| --  ks != vs | ||||
|   // sets are not views of map | ||||
| --  no (ks+vs)->m & ViewType.pre.views | ||||
|   // no iterator currently on either set | ||||
| --  no Ref->(ks+vs) & ViewType.pre.views | ||||
|   } | ||||
|  | ||||
| check zippishOK for 6 but 8 State, 3 ViewType expect 1 | ||||
|  | ||||
| /**  | ||||
|  * experiment with controlling heap size | ||||
|  */ | ||||
| fact {all s: State | #s.obj < 5} | ||||
							
								
								
									
										41
									
								
								samples/AspectJ/CacheAspect.aj
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								samples/AspectJ/CacheAspect.aj
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,41 @@ | ||||
| package com.blogspot.miguelinlas3.aspectj.cache; | ||||
|  | ||||
| import java.util.Map; | ||||
| import java.util.WeakHashMap; | ||||
|  | ||||
| import org.aspectj.lang.JoinPoint; | ||||
|  | ||||
| import com.blogspot.miguelinlas3.aspectj.cache.marker.Cachable; | ||||
|  | ||||
| /** | ||||
|  * This simple aspect simulates the behaviour of a very simple cache | ||||
|  *   | ||||
|  * @author migue | ||||
|  * | ||||
|  */ | ||||
| public aspect CacheAspect { | ||||
|  | ||||
| 	public pointcut cache(Cachable cachable): execution(@Cachable * * (..)) && @annotation(cachable); | ||||
| 	 | ||||
| 	Object around(Cachable cachable): cache(cachable){ | ||||
| 	 | ||||
| 		String evaluatedKey = this.evaluateKey(cachable.scriptKey(), thisJoinPoint); | ||||
| 		 | ||||
| 		if(cache.containsKey(evaluatedKey)){ | ||||
| 			System.out.println("Cache hit for key " + evaluatedKey); | ||||
| 			return this.cache.get(evaluatedKey); | ||||
| 		} | ||||
| 		 | ||||
| 		System.out.println("Cache miss for key " + evaluatedKey); | ||||
| 		Object value = proceed(cachable); | ||||
| 		cache.put(evaluatedKey, value); | ||||
| 		return value; | ||||
| 	} | ||||
| 	 | ||||
| 	protected String evaluateKey(String key, JoinPoint joinPoint) { | ||||
| 		// TODO add some smart staff to allow simple scripting in @Cachable annotation | ||||
| 		return key; | ||||
| 	} | ||||
| 	 | ||||
| 	protected Map<String, Object> cache = new WeakHashMap<String, Object>(); | ||||
| } | ||||
							
								
								
									
										50
									
								
								samples/AspectJ/OptimizeRecursionCache.aj
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										50
									
								
								samples/AspectJ/OptimizeRecursionCache.aj
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,50 @@ | ||||
| package aspects.caching; | ||||
|  | ||||
| import java.util.Map; | ||||
|  | ||||
| /** | ||||
|  * Cache aspect for optimize recursive functions. | ||||
|  *  | ||||
|  * @author Migueli | ||||
|  * @date 05/11/2013 | ||||
|  * @version 1.0 | ||||
|  * | ||||
|  */ | ||||
| public abstract aspect OptimizeRecursionCache { | ||||
| 		 | ||||
| 	@SuppressWarnings("rawtypes") | ||||
| 	private Map _cache; | ||||
| 	 | ||||
| 	public OptimizeRecursionCache() { | ||||
| 		_cache = getCache(); | ||||
| 	} | ||||
| 	 | ||||
| 	@SuppressWarnings("rawtypes") | ||||
| 	abstract public Map getCache(); | ||||
| 	 | ||||
| 	abstract public pointcut operation(Object o); | ||||
|  | ||||
| 	pointcut topLevelOperation(Object o): operation(o) && !cflowbelow(operation(Object)); | ||||
|  | ||||
| 	before(Object o) : topLevelOperation(o) { | ||||
| 		System.out.println("Seeking value for " + o); | ||||
| 	} | ||||
|  | ||||
| 	Object around(Object o) : operation(o) { | ||||
| 		Object cachedValue = _cache.get(o); | ||||
| 		if (cachedValue != null) { | ||||
| 			System.out.println("Found cached value for " + o + ": " + cachedValue); | ||||
| 			return cachedValue; | ||||
| 		} | ||||
| 		return proceed(o); | ||||
| 	} | ||||
|  | ||||
| 	@SuppressWarnings("unchecked") | ||||
| 	after(Object o) returning(Object result) : topLevelOperation(o) { | ||||
| 		_cache.put(o, result); | ||||
| 	} | ||||
| 	 | ||||
| 	after(Object o) returning(Object result) : topLevelOperation(o) { | ||||
| 		System.out.println("cache size: " + _cache.size()); | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										530
									
								
								samples/C++/Math.inl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										530
									
								
								samples/C++/Math.inl
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,530 @@ | ||||
| /* | ||||
| =========================================================================== | ||||
| The Open Game Libraries. | ||||
| Copyright (C) 2007-2010 Lusito Software | ||||
|  | ||||
| Author:  Santo Pfingsten (TTK-Bandit) | ||||
| Purpose: Math namespace | ||||
| ----------------------------------------- | ||||
|  | ||||
| This software is provided 'as-is', without any express or implied | ||||
| warranty. In no event will the authors be held liable for any damages | ||||
| arising from the use of this software. | ||||
|  | ||||
| Permission is granted to anyone to use this software for any purpose, | ||||
| including commercial applications, and to alter it and redistribute it | ||||
| freely, subject to the following restrictions: | ||||
|  | ||||
| 1. The origin of this software must not be misrepresented; you must not | ||||
|    claim that you wrote the original software. If you use this software | ||||
|    in a product, an acknowledgment in the product documentation would be | ||||
|    appreciated but is not required. | ||||
|  | ||||
| 2. Altered source versions must be plainly marked as such, and must not be | ||||
|    misrepresented as being the original software. | ||||
|  | ||||
| 3. This notice may not be removed or altered from any source distribution. | ||||
| =========================================================================== | ||||
| */ | ||||
|  | ||||
| #ifndef __OG_MATH_INL__ | ||||
| #define __OG_MATH_INL__ | ||||
|  | ||||
| namespace og { | ||||
|  | ||||
| /* | ||||
| ============================================================================== | ||||
|  | ||||
|   Math | ||||
|  | ||||
| ============================================================================== | ||||
| */ | ||||
|  | ||||
| /* | ||||
| ================ | ||||
| Math::Abs | ||||
| ================ | ||||
| */ | ||||
| OG_INLINE int Math::Abs( int i ) { | ||||
| #if 1 | ||||
| 	if ( i & 0x80000000 ) | ||||
| 		return 0x80000000 - (i & MASK_SIGNED); | ||||
| 	return i; | ||||
| #else | ||||
|    int y = x >> 31; | ||||
|    return ( ( x ^ y ) - y ); | ||||
| #endif | ||||
| } | ||||
|  | ||||
| /* | ||||
| ================ | ||||
| Math::Fabs | ||||
| ================ | ||||
| */ | ||||
| OG_INLINE float Math::Fabs( float f ) { | ||||
| #if 1 | ||||
| 	uInt *pf = reinterpret_cast<uInt*>(&f); | ||||
| 	*(pf) &= MASK_SIGNED; | ||||
| 	return f; | ||||
| #else | ||||
| 	return fabsf( f ); | ||||
| #endif | ||||
| } | ||||
|  | ||||
| /* | ||||
| ================ | ||||
| Math::Round | ||||
| ================ | ||||
| */ | ||||
| OG_INLINE float Math::Round( float f ) { | ||||
| 	return floorf( f + 0.5f ); | ||||
| } | ||||
|  | ||||
| /* | ||||
| ================ | ||||
| Math::Floor | ||||
| ================ | ||||
| */ | ||||
| OG_INLINE float Math::Floor( float f ) { | ||||
| 	return floorf( f ); | ||||
| } | ||||
|  | ||||
| /* | ||||
| ================ | ||||
| Math::Ceil | ||||
| ================ | ||||
| */ | ||||
| OG_INLINE float Math::Ceil( float f ) { | ||||
| 	return ceilf( f ); | ||||
| } | ||||
|  | ||||
| /* | ||||
| ================ | ||||
| Math::Ftoi | ||||
|  | ||||
| ok since this is SSE, why should the other ftoi be the faster one ? | ||||
| and: we might need to add a check for SSE extensions.. | ||||
| because sse isn't *really* faster (I actually read that GCC does not handle | ||||
| SSE extensions perfectly. I'll find the link and send it to you when you're online) | ||||
| ================ | ||||
| */ | ||||
| OG_INLINE int Math::Ftoi( float f ) { | ||||
| 	//! @todo	needs testing | ||||
| 	// note: sse function cvttss2si | ||||
| #if OG_ASM_MSVC | ||||
| 	int i; | ||||
| #if defined(OG_FTOI_USE_SSE) | ||||
| 	if( SysInfo::cpu.general.SSE ) { | ||||
| 		__asm cvttss2si	eax, f | ||||
| 		__asm mov		i, eax | ||||
| 		return i; | ||||
| 	} else | ||||
| #endif | ||||
| 	{ | ||||
| 		__asm fld		f | ||||
| 		__asm fistp		i | ||||
| 		//__asm mov eax, i // do we need this ? O_o | ||||
| 	} | ||||
| 	return i; | ||||
| #elif OG_ASM_GNU | ||||
| 	int i; | ||||
| #if defined(OG_FTOI_USE_SSE) | ||||
| 	if( SysInfo::cpu.general.SSE ) { | ||||
| 		__asm__ __volatile__( "cvttss2si %1    \n\t" | ||||
| 			: "=m" (i) | ||||
| 			: "m" (f) | ||||
| 		); | ||||
| 	} else | ||||
| #endif | ||||
| 	{ | ||||
| 		__asm__ __volatile__( "flds %1    \n\t" | ||||
| 							  "fistpl %0  \n\t" | ||||
| 			: "=m" (i) | ||||
| 			: "m" (f) | ||||
| 		); | ||||
| 	} | ||||
| 	return i; | ||||
| #else | ||||
| 	// we use c++ cast instead of c cast (not sure why id did that) | ||||
| 	return static_cast<int>(f); | ||||
| #endif | ||||
| } | ||||
|  | ||||
| /* | ||||
| ================ | ||||
| Math::FtoiFast | ||||
| ================ | ||||
| */ | ||||
| OG_INLINE int Math::FtoiFast( float f ) { | ||||
| #if OG_ASM_MSVC | ||||
| 	int i; | ||||
| 	__asm fld		f | ||||
| 	__asm fistp		i | ||||
| 	//__asm mov eax, i // do we need this ? O_o | ||||
| 	return i; | ||||
| #elif OG_ASM_GNU | ||||
| 	int i; | ||||
| 	__asm__ __volatile__( "flds %1    \n\t" | ||||
| 						  "fistpl %0  \n\t" | ||||
| 		: "=m" (i) | ||||
| 		: "m" (f) | ||||
| 	); | ||||
| 	return i; | ||||
| #else | ||||
| 	// we use c++ cast instead of c cast (not sure why id did that) | ||||
| 	return static_cast<int>(f); | ||||
| #endif | ||||
| } | ||||
|  | ||||
| /* | ||||
| ================ | ||||
| Math::Ftol | ||||
| ================ | ||||
| */ | ||||
| OG_INLINE long Math::Ftol( float f ) { | ||||
| #if OG_ASM_MSVC | ||||
| 	long i; | ||||
| 	__asm fld		f | ||||
| 	__asm fistp		i | ||||
| 	//__asm mov eax, i // do we need this ? O_o | ||||
| 	return i; | ||||
| #elif OG_ASM_GNU | ||||
| 	long i; | ||||
| 	__asm__ __volatile__( "flds %1    \n\t" | ||||
| 						  "fistpl %0  \n\t" | ||||
| 		: "=m" (i) | ||||
| 		: "m" (f) | ||||
| 	); | ||||
| 	return i; | ||||
| #else | ||||
| 	// we use c++ cast instead of c cast (not sure why id did that) | ||||
| 	return static_cast<long>(f); | ||||
| #endif | ||||
| } | ||||
|  | ||||
| /* | ||||
| ================ | ||||
| Math::Sign | ||||
| ================ | ||||
| */ | ||||
| OG_INLINE float Math::Sign( float f )	{ | ||||
| 	if ( f > 0.0f ) | ||||
| 		return 1.0f; | ||||
| 	if ( f < 0.0f ) | ||||
| 		return -1.0f; | ||||
| 	return 0.0f; | ||||
| } | ||||
|  | ||||
| /* | ||||
| ================ | ||||
| Math::Fmod | ||||
| ================ | ||||
| */ | ||||
| OG_INLINE float Math::Fmod( float numerator, float denominator ) { | ||||
| 	return fmodf( numerator, denominator ); | ||||
| } | ||||
|  | ||||
| /* | ||||
| ================ | ||||
| Math::Modf | ||||
| ================ | ||||
| */ | ||||
| OG_INLINE float Math::Modf( float f, float& i ) { | ||||
| 	return modff( f, &i ); | ||||
| } | ||||
| OG_INLINE float Math::Modf( float f ) { | ||||
| 	float i; | ||||
| 	return modff( f, &i ); | ||||
| } | ||||
|  | ||||
| /* | ||||
| ================ | ||||
| Math::Sqrt | ||||
| ================ | ||||
| */ | ||||
| OG_INLINE float Math::Sqrt( float f ) { | ||||
| 	return sqrtf( f ); | ||||
| } | ||||
|  | ||||
| /* | ||||
| ================ | ||||
| Math::InvSqrt | ||||
|  | ||||
| Cannot be 0.0f | ||||
| ================ | ||||
| */ | ||||
| OG_INLINE float Math::InvSqrt( float f ) { | ||||
| 	OG_ASSERT( f != 0.0f ); | ||||
| 	return 1.0f / sqrtf( f ); | ||||
| } | ||||
|  | ||||
| /* | ||||
| ================ | ||||
| Math::RSqrt | ||||
|  | ||||
| Can be 0.0f | ||||
| ================ | ||||
| */ | ||||
| OG_INLINE float Math::RSqrt( float f ) { | ||||
| 	float g = 0.5f * f; | ||||
| 	int i = *reinterpret_cast<int *>(&f); | ||||
|  | ||||
| 	// do a guess | ||||
| 	i = 0x5f375a86 - ( i>>1 ); | ||||
| 	f = *reinterpret_cast<float *>(&i); | ||||
|  | ||||
| 	// Newtons calculation | ||||
| 	f = f * ( 1.5f - g * f * f ); | ||||
| 	return f; | ||||
| } | ||||
|  | ||||
| /* | ||||
| ================ | ||||
| Math::Log/Log2/Log10 | ||||
|  | ||||
| Log of 0 is bad. | ||||
| I've also heard you're not really | ||||
| supposed to do log of negatives, yet | ||||
| they work fine. | ||||
| ================ | ||||
| */ | ||||
| OG_INLINE float Math::Log( float f ) { | ||||
| 	OG_ASSERT( f != 0.0f ); | ||||
| 	return logf( f ); | ||||
| } | ||||
| OG_INLINE float Math::Log2( float f ) { | ||||
| 	OG_ASSERT( f != 0.0f ); | ||||
| 	return INV_LN_2 * logf( f ); | ||||
| } | ||||
| OG_INLINE float Math::Log10( float f ) { | ||||
| 	OG_ASSERT( f != 0.0f ); | ||||
| 	return INV_LN_10 * logf( f ); | ||||
| } | ||||
|  | ||||
| /* | ||||
| ================ | ||||
| Math::Pow | ||||
| ================ | ||||
| */ | ||||
| OG_INLINE float Math::Pow( float base, float exp ) { | ||||
| 	return powf( base, exp ); | ||||
| } | ||||
|  | ||||
| /* | ||||
| ================ | ||||
| Math::Exp | ||||
| ================ | ||||
| */ | ||||
| OG_INLINE float Math::Exp( float f ) { | ||||
| 	return expf( f ); | ||||
| } | ||||
|  | ||||
| /* | ||||
| ================ | ||||
| Math::IsPowerOfTwo | ||||
| ================ | ||||
| */ | ||||
| OG_INLINE bool Math::IsPowerOfTwo( int x ) { | ||||
| 	// This is the faster of the two known methods | ||||
| 	// with the x > 0 check moved to the beginning | ||||
| 	return x > 0 && ( x & ( x - 1 ) ) == 0; | ||||
| } | ||||
|  | ||||
| /* | ||||
| ================ | ||||
| Math::HigherPowerOfTwo | ||||
| ================ | ||||
| */ | ||||
| OG_INLINE int Math::HigherPowerOfTwo( int x ) { | ||||
| 	x--; | ||||
| 	x |= x >> 1; | ||||
| 	x |= x >> 2; | ||||
| 	x |= x >> 4; | ||||
| 	x |= x >> 8; | ||||
| 	x |= x >> 16; | ||||
| 	return x + 1; | ||||
| } | ||||
|  | ||||
| /* | ||||
| ================ | ||||
| Math::LowerPowerOfTwo | ||||
| ================ | ||||
| */ | ||||
| OG_INLINE int Math::LowerPowerOfTwo( int x ) { | ||||
| 	return HigherPowerOfTwo( x ) >> 1; | ||||
| } | ||||
|  | ||||
| /* | ||||
| ================ | ||||
| Math::FloorPowerOfTwo | ||||
| ================ | ||||
| */ | ||||
| OG_INLINE int Math::FloorPowerOfTwo( int x ) { | ||||
| 	return IsPowerOfTwo( x ) ? x : LowerPowerOfTwo( x ); | ||||
| } | ||||
|  | ||||
| /* | ||||
| ================ | ||||
| Math::CeilPowerOfTwo | ||||
| ================ | ||||
| */ | ||||
| OG_INLINE int Math::CeilPowerOfTwo( int x ) { | ||||
| 	return IsPowerOfTwo( x ) ? x : HigherPowerOfTwo( x ); | ||||
| } | ||||
|  | ||||
| /* | ||||
| ================ | ||||
| Math::ClosestPowerOfTwo | ||||
| ================ | ||||
| */ | ||||
| OG_INLINE int Math::ClosestPowerOfTwo( int x ) { | ||||
| 	if ( IsPowerOfTwo( x ) ) | ||||
| 		return x; | ||||
| 	int high = HigherPowerOfTwo( x ); | ||||
| 	int low = high >> 1; | ||||
| 	return ((high-x) < (x-low)) ? high : low; | ||||
| } | ||||
|  | ||||
| /* | ||||
| ================ | ||||
| Math::Digits | ||||
| ================ | ||||
| */ | ||||
| OG_INLINE int Math::Digits( int x ) { | ||||
| 	int digits = 1; | ||||
| 	int step = 10; | ||||
| 	while (step <= x) { | ||||
| 		digits++; | ||||
| 		step *= 10; | ||||
| 	} | ||||
| 	return digits; | ||||
| } | ||||
|  | ||||
| /* | ||||
| ================ | ||||
| Math::Sin/ASin | ||||
| ================ | ||||
| */ | ||||
| OG_INLINE float Math::Sin( float f ) { | ||||
| 	return sinf( f ); | ||||
| } | ||||
| OG_INLINE float Math::ASin( float f ) { | ||||
| 	if ( f <= -1.0f ) | ||||
| 		return -HALF_PI; | ||||
| 	if ( f >= 1.0f ) | ||||
| 		return HALF_PI; | ||||
| 	return asinf( f ); | ||||
| } | ||||
|  | ||||
| /* | ||||
| ================ | ||||
| Math::Cos/ACos | ||||
| ================ | ||||
| */ | ||||
| OG_INLINE float Math::Cos( float f ) { | ||||
| 	return cosf( f ); | ||||
| } | ||||
| OG_INLINE float Math::ACos( float f ) { | ||||
| 	if ( f <= -1.0f ) | ||||
| 		return PI; | ||||
| 	if ( f >= 1.0f ) | ||||
| 		return 0.0f; | ||||
| 	return acosf( f ); | ||||
| } | ||||
|  | ||||
| /* | ||||
| ================ | ||||
| Math::Tan/ATan | ||||
| ================ | ||||
| */ | ||||
| OG_INLINE float Math::Tan( float f ) { | ||||
| 	return tanf( f ); | ||||
| } | ||||
| OG_INLINE float Math::ATan( float f ) { | ||||
| 	return atanf( f ); | ||||
| } | ||||
| OG_INLINE float Math::ATan( float f1, float f2 ) { | ||||
| 	return atan2f( f1, f2 ); | ||||
| } | ||||
|  | ||||
| /* | ||||
| ================ | ||||
| Math::SinCos | ||||
| ================ | ||||
| */ | ||||
| OG_INLINE void Math::SinCos( float f, float &s, float &c ) { | ||||
| #if OG_ASM_MSVC | ||||
| 	// sometimes assembler is just waaayy faster | ||||
| 	_asm { | ||||
| 		fld		f | ||||
| 		fsincos | ||||
| 		mov		ecx, c | ||||
| 		mov		edx, s | ||||
| 		fstp	dword ptr [ecx] | ||||
| 		fstp	dword ptr [edx] | ||||
| 	} | ||||
| #elif OG_ASM_GNU | ||||
| 	asm ("fsincos" : "=t" (c), "=u" (s) : "0" (f)); | ||||
| #else | ||||
| 	s = Sin(f); | ||||
| 	c = Sqrt( 1.0f - s * s ); // faster than calling Cos(f) | ||||
| #endif | ||||
| } | ||||
|  | ||||
| /* | ||||
| ================ | ||||
| Math::Deg2Rad | ||||
| ================ | ||||
| */ | ||||
| OG_INLINE float Math::Deg2Rad( float f ) { | ||||
| 	return f * DEG_TO_RAD; | ||||
| } | ||||
|  | ||||
| /* | ||||
| ================ | ||||
| Math::Rad2Deg | ||||
| ================ | ||||
| */ | ||||
| OG_INLINE float Math::Rad2Deg( float f ) { | ||||
| 	return f * RAD_TO_DEG; | ||||
| } | ||||
|  | ||||
| /* | ||||
| ================ | ||||
| Math::Square | ||||
| ================ | ||||
| */ | ||||
| OG_INLINE float Math::Square( float v ) { | ||||
| 	return v * v; | ||||
| } | ||||
|  | ||||
| /* | ||||
| ================ | ||||
| Math::Cube | ||||
| ================ | ||||
| */ | ||||
| OG_INLINE float Math::Cube( float v ) { | ||||
| 	return v * v * v; | ||||
| } | ||||
|  | ||||
| /* | ||||
| ================ | ||||
| Math::Sec2Ms | ||||
| ================ | ||||
| */ | ||||
| OG_INLINE int Math::Sec2Ms( int sec ) { | ||||
| 	return sec * 1000; | ||||
| } | ||||
|  | ||||
| /* | ||||
| ================ | ||||
| Math::Ms2Sec | ||||
| ================ | ||||
| */ | ||||
| OG_INLINE int Math::Ms2Sec( int ms ) { | ||||
| 	return FtoiFast( ms * 0.001f ); | ||||
| } | ||||
|  | ||||
| } | ||||
|  | ||||
| #endif | ||||
							
								
								
									
										16
									
								
								samples/Dogescript/example.djs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								samples/Dogescript/example.djs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,16 @@ | ||||
| quiet | ||||
|  wow  | ||||
|     such language | ||||
|   very syntax | ||||
|         github recognized wow | ||||
| loud | ||||
|  | ||||
| such language much friendly | ||||
|     rly friendly is true | ||||
|         plz console.loge with 'such friend, very inclusive' | ||||
|     but | ||||
|         plz console.loge with 'no love for doge' | ||||
|     wow | ||||
| wow | ||||
|  | ||||
| module.exports is language | ||||
							
								
								
									
										1396
									
								
								samples/Eagle/Eagle.brd
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1396
									
								
								samples/Eagle/Eagle.brd
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										3612
									
								
								samples/Eagle/Eagle.sch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3612
									
								
								samples/Eagle/Eagle.sch
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										44
									
								
								samples/Frege/CommandLineClock.fr
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										44
									
								
								samples/Frege/CommandLineClock.fr
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,44 @@ | ||||
| {--  | ||||
|     This program displays the | ||||
|     current time on stdandard output | ||||
|     every other second. | ||||
|     -} | ||||
|      | ||||
| module examples.CommandLineClock where | ||||
|  | ||||
| data Date = native java.util.Date where | ||||
|     native new :: () -> IO (MutableIO Date)     -- new Date() | ||||
|     native toString :: Mutable s Date -> ST s String    -- d.toString() | ||||
|  | ||||
| --- 'IO' action to give us the current time as 'String' | ||||
| current :: IO String | ||||
| current = do | ||||
|     d <- Date.new () | ||||
|     d.toString | ||||
|  | ||||
| {-  | ||||
|     "java.lang.Thread.sleep" takes a "long" and | ||||
|     returns nothing, but may throw an InterruptedException. | ||||
|     This is without doubt an IO action. | ||||
|      | ||||
|     public static void sleep(long millis) | ||||
|                   throws InterruptedException | ||||
|      | ||||
|     Encoded in Frege: | ||||
|     - argument type  long   Long | ||||
|     - result         void   () | ||||
|     - does IO               IO () | ||||
|     - throws ...            throws .... | ||||
|       | ||||
| -} | ||||
| -- .... defined in frege.java.Lang | ||||
| -- native sleep java.lang.Thread.sleep :: Long -> IO () throws InterruptedException | ||||
|  | ||||
|        | ||||
| main args =   | ||||
|     forever do | ||||
|         current >>= print | ||||
|         print "\r" | ||||
|         stdout.flush | ||||
|         Thread.sleep 999 | ||||
|                  | ||||
							
								
								
									
										147
									
								
								samples/Frege/Concurrent.fr
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										147
									
								
								samples/Frege/Concurrent.fr
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,147 @@ | ||||
| module examples.Concurrent where | ||||
|  | ||||
| import System.Random | ||||
| import Java.Net (URL) | ||||
| import Control.Concurrent as C | ||||
|  | ||||
| main2 args = do | ||||
|     m <- newEmptyMVar | ||||
|     forkIO do | ||||
|         m.put 'x' | ||||
|         m.put 'y'  | ||||
|         m.put 'z' | ||||
|     replicateM_ 3 do | ||||
|         c <- m.take | ||||
|         print "got: " | ||||
|         println c   | ||||
|          | ||||
|              | ||||
| example1 = do | ||||
|     forkIO (replicateM_ 100000 (putChar 'a')) | ||||
|     replicateM_ 100000 (putChar 'b') | ||||
|  | ||||
| example2 =  do | ||||
|     s <- getLine | ||||
|     case s.long of | ||||
|         Right n -> forkIO (setReminder n) >> example2 | ||||
|         Left _  -> println ("exiting ...") | ||||
|      | ||||
| setReminder :: Long -> IO () | ||||
| setReminder n = do | ||||
|         println ("Ok, I remind you in " ++ show n ++ " seconds") | ||||
|         Thread.sleep (1000L*n) | ||||
|         println (show n ++ " seconds is up!") | ||||
|  | ||||
| table = "table" | ||||
|              | ||||
| mainPhil _ = do | ||||
|     [fork1,fork2,fork3,fork4,fork5] <- mapM MVar.new [1..5] | ||||
|     forkIO (philosopher "Kant" fork5 fork1) | ||||
|     forkIO (philosopher "Locke" fork1 fork2) | ||||
|     forkIO (philosopher "Wittgenstein" fork2 fork3) | ||||
|     forkIO (philosopher "Nozick" fork3 fork4) | ||||
|     forkIO (philosopher "Mises" fork4 fork5) | ||||
|     return ()     | ||||
|  | ||||
| philosopher :: String -> MVar Int -> MVar Int -> IO () | ||||
| philosopher me left right = do | ||||
|     g <- Random.newStdGen | ||||
|     let phil g  = do | ||||
|             let (tT,g1) = Random.randomR (60L, 120L) g | ||||
|                 (eT, g2)  = Random.randomR (80L, 160L) g1 | ||||
|                 thinkTime = 300L * tT | ||||
|                 eatTime   = 300L * eT | ||||
|      | ||||
|             println(me ++ " is going to the dining room and takes his seat.")  | ||||
|             fl <- left.take             | ||||
|             println (me ++ " takes up left fork (" ++ show fl ++ ")") | ||||
|             rFork <- right.poll | ||||
|             case rFork of | ||||
|                 Just fr -> do  | ||||
|                     println (me ++ " takes up right fork. (" ++ show fr ++ ")")  | ||||
|                     println (me ++ " is going to eat for " ++ show eatTime ++ "ms") | ||||
|                     Thread.sleep eatTime | ||||
|                     println (me ++ " finished eating.") | ||||
|                     right.put fr | ||||
|                     println (me ++ " took down right fork.") | ||||
|                     left.put fl | ||||
|                     println (me ++ " took down left fork.") | ||||
|                     table.notifyAll  | ||||
|                     println(me ++ " is going to think for " ++ show thinkTime ++ "ms.") | ||||
|                     Thread.sleep thinkTime | ||||
|                     phil g2 | ||||
|                 Nothing -> do | ||||
|                     println (me ++ " finds right fork is already in use.") | ||||
|                     left.put fl | ||||
|                     println (me ++ " took down left fork.") | ||||
|                     table.notifyAll | ||||
|                     println (me ++ " is going to the bar to await notifications from table.") | ||||
|                     table.wait | ||||
|                     println (me ++ " got notice that something changed at the table.") | ||||
|                     phil g2 | ||||
|              | ||||
|         inter :: InterruptedException -> IO () | ||||
|         inter _ = return ()         | ||||
|      | ||||
|     phil g `catch` inter | ||||
|  | ||||
|      | ||||
| getURL xx = do | ||||
|         url <- URL.new xx  | ||||
|         con <- url.openConnection | ||||
|         con.connect | ||||
|         is  <- con.getInputStream | ||||
|         typ <- con.getContentType | ||||
|         -- stderr.println ("content-type is " ++ show typ)  | ||||
|         ir  <- InputStreamReader.new is (fromMaybe "UTF-8" (charset typ)) | ||||
|             `catch` unsupportedEncoding is  | ||||
|         br  <- BufferedReader.new ir | ||||
|         br.getLines | ||||
|     where | ||||
|         unsupportedEncoding :: InputStream -> UnsupportedEncodingException -> IO InputStreamReader | ||||
|         unsupportedEncoding is x = do | ||||
|             stderr.println x.catched | ||||
|             InputStreamReader.new is "UTF-8" | ||||
|              | ||||
|         charset ctyp = do | ||||
|             typ <- ctyp | ||||
|             case typ of | ||||
|                 m~´charset=(\S+)´ -> m.group 1 | ||||
|                 _ -> Nothing | ||||
|  | ||||
|      | ||||
| type SomeException = Throwable | ||||
|  | ||||
| main ["dining"] = mainPhil [] | ||||
|          | ||||
| main _ =  do | ||||
|     m1 <- MVar.newEmpty | ||||
|     m2 <- MVar.newEmpty | ||||
|     m3 <- MVar.newEmpty | ||||
|      | ||||
|     forkIO do | ||||
|         r <- (catchAll . getURL) "http://www.wikipedia.org/wiki/Haskell" | ||||
|         m1.put r | ||||
|      | ||||
|     forkIO do | ||||
|         r <- (catchAll . getURL) "htto://www.wikipedia.org/wiki/Java" | ||||
|         m2.put r | ||||
|      | ||||
|     forkIO do | ||||
|         r <- (catchAll . getURL) "http://www.wikipedia.org/wiki/Frege" | ||||
|         m3.put r | ||||
|      | ||||
|     r1 <- m1.take | ||||
|     r2 <- m2.take | ||||
|     r3 <- m3.take | ||||
|     println (result r1, result r2, result r3) | ||||
|     -- case r3 of | ||||
|     --     Right ss -> mapM_ putStrLn ss | ||||
|     --     Left _   -> return () | ||||
|   where | ||||
|     result :: (SomeException|[String]) -> (String|Int) | ||||
|     result (Left x)  = Left x.getClass.getName | ||||
|     result (Right y) = (Right . sum . map length)  y | ||||
|     -- mapM_ putStrLn r2 | ||||
|  | ||||
|          | ||||
							
								
								
									
										561
									
								
								samples/Frege/Sudoku.fr
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										561
									
								
								samples/Frege/Sudoku.fr
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,561 @@ | ||||
| package examples.Sudoku where | ||||
|  | ||||
| import Data.TreeMap (Tree, keys) | ||||
| import Data.List as DL hiding (find, union) | ||||
|  | ||||
|  | ||||
| type Element    = Int           -- 1,2,3,4,5,6,7,8,9 | ||||
| type Zelle      = [Element]     -- set of candidates | ||||
| type Position   = Int           -- 0..80 | ||||
| type Feld       = (Position, Zelle) | ||||
| type Brett      = [Feld] | ||||
|  | ||||
| --- data type for assumptions and conclusions | ||||
| data Assumption = | ||||
|               !ISNOT Position Element | ||||
|             | !IS    Position Element | ||||
|  | ||||
|  | ||||
| derive Eq Assumption | ||||
| derive Ord Assumption | ||||
| instance Show Assumption where | ||||
|     show (IS p e)    = pname p ++ "=" ++ e.show | ||||
|     show (ISNOT p e) = pname p ++ "/" ++ e.show | ||||
|  | ||||
| showcs cs = joined " " (map Assumption.show cs) | ||||
|  | ||||
| elements :: [Element]           -- all possible elements | ||||
| elements = [1 .. 9] | ||||
|  | ||||
| {- | ||||
|     a  b  c   d  e  f   g  h  i | ||||
|      0  1  2 | 3  4  5 | 6  7  8    1 | ||||
|      9 10 11 |12 13 14 |15 16 17    2 | ||||
|     18 19 20 |21 22 23 |24 25 26    3 | ||||
|     ---------|---------|-------- | ||||
|     27 28 29 |30 31 32 |33 34 35    4 | ||||
|     36 37 38 |39 40 41 |42 43 44    5 | ||||
|     45 46 47 |48 49 50 |51 52 53    6 | ||||
|     ---------|---------|-------- | ||||
|     54 55 56 |57 58 59 |60 61 62    7 | ||||
|     63 64 65 |66 67 68 |69 70 71    8 | ||||
|     72 73 74 |75 76 77 |78 79 80    9 | ||||
| -} | ||||
|  | ||||
| positions :: [Position]         -- all possible positions | ||||
| positions = [0..80] | ||||
| rowstarts :: [Position]         -- all positions where a row is starting | ||||
| rowstarts =  [0,9,18,27,36,45,54,63,72] | ||||
| colstarts :: [Position]         -- all positions where a column is starting | ||||
| colstarts =  [0,1,2,3,4,5,6,7,8] | ||||
| boxstarts :: [Position]         -- all positions where a box is starting | ||||
| boxstarts =  [0,3,6,27,30,33,54,57,60] | ||||
| boxmuster :: [Position]         -- pattern for a box, by adding upper left position results in real box | ||||
| boxmuster =  [0,1,2,9,10,11,18,19,20] | ||||
|  | ||||
|  | ||||
| --- extract field for position | ||||
| getf :: Brett -> Position  -> Feld | ||||
| getf (f:fs) p | ||||
|     | fst f == p = f | ||||
|     | otherwise  = getf fs p | ||||
| getf [] p = (p,[]) | ||||
|  | ||||
|  | ||||
| --- extract cell for position | ||||
| getc :: Brett -> Position -> Zelle | ||||
| getc b p = snd (getf b p) | ||||
|  | ||||
| --- compute the list of all positions that belong to the same row as a given position | ||||
| row :: Position -> [Position] | ||||
| row p = [z..(z+8)] where z = (p `quot` 9) * 9 | ||||
|  | ||||
| --- compute the list of all positions that belong to the same col as a given position | ||||
| col :: Position -> [Position] | ||||
| col p = map (c+) rowstarts where c = p `mod` 9 | ||||
|  | ||||
| --- compute the list of all positions that belong to the same box as a given position | ||||
| box :: Position -> [Position] | ||||
| box p  = map (z+) boxmuster where | ||||
|     ri = p `div` 27 * 27    -- 0, 27 or 54, depending on row | ||||
|     ci = p `mod` 9          -- column index 0..8, 0,1,2 is left, 3,4,5 is middle, 6,7,8 is right | ||||
|     cs = ci `div` 3 * 3     -- 0, 3 or 6 | ||||
|     z  = ri + cs | ||||
|  | ||||
| --- check if candidate set has exactly one member, i.e. field has been solved | ||||
| single :: Zelle -> Bool | ||||
| single [_] = true | ||||
| single _   = false | ||||
|  | ||||
| unsolved :: Zelle -> Bool | ||||
| unsolved [_] = false | ||||
| unsolved _   = true | ||||
|  | ||||
| -- list of rows, cols, boxes | ||||
| allrows = map row rowstarts | ||||
| allcols = map col colstarts | ||||
| allboxs = map box boxstarts | ||||
| allrcb  = zip (repeat "row") allrows | ||||
|           ++ zip (repeat "col") allcols | ||||
|           ++ zip (repeat "box") allboxs | ||||
|  | ||||
|  | ||||
| containers :: [(Position -> [Position], String)] | ||||
| containers = [(row, "row"), (col, "col"), (box, "box")] | ||||
|  | ||||
| -- ----------------- PRINTING ------------------------------------ | ||||
| -- printable coordinate of field, upper left is a1, lower right is i9 | ||||
| pname p = packed [chr (ord 'a' + p `mod` 9), chr (ord '1' + p `div` 9)] | ||||
|  | ||||
| -- print board | ||||
| printb b = mapM_ p1line allrows >> println "" | ||||
|     where | ||||
|         p1line row = do | ||||
|                 print (joined "" (map pfld line)) | ||||
|             where line = map (getc b) row | ||||
|  | ||||
| -- print field (brief) | ||||
| --   ? = no candidate | ||||
| --   5 = field is 5 | ||||
| --   . = some candidates | ||||
| pfld [] = "?" | ||||
| pfld [x] = show x | ||||
| pfld zs = "0" | ||||
|  | ||||
| -- print initial/final board | ||||
| result msg b = do | ||||
|         println ("Result: " ++ msg) | ||||
|         print   ("Board: ") | ||||
|         printb b | ||||
|         return b | ||||
|  | ||||
| res012 b = case concatMap (getc b) [0,1,2] of | ||||
|     [a,b,c] -> a*100+b*10+c | ||||
|     _ -> 9999999 | ||||
|  | ||||
| -- -------------------------- BOARD ALTERATION ACTIONS --------------------------------- | ||||
| -- print a message about what is done to the board and return the new board | ||||
| turnoff1 :: Position -> Zelle -> Brett -> IO Brett | ||||
| turnoff1 i off b | ||||
|     | single nc = do | ||||
|             -- print (pname i) | ||||
|             -- print ": set to " | ||||
|             -- print (head nc) | ||||
|             -- println " (naked single)" | ||||
|             return newb | ||||
|     | otherwise = return newb | ||||
|     where | ||||
|         cell   = getc b i | ||||
|         nc     = filter (`notElem` off) cell | ||||
|         newb   = (i, nc) : [ f | f <- b, fst f != i ] | ||||
|  | ||||
| turnoff :: Int -> Zelle -> String -> Brett -> IO Brett | ||||
| turnoff i off msg b = do | ||||
|         -- print (pname i) | ||||
|         -- print ": set to " | ||||
|         -- print nc | ||||
|         -- print " by clearing " | ||||
|         -- print off | ||||
|         -- print " " | ||||
|         -- println  msg | ||||
|         return newb | ||||
|     where | ||||
|         cell   = getc b i | ||||
|         nc     = filter (`notElem` off) cell | ||||
|         newb   = (i, nc) : [ f | f <- b, fst f != i ] | ||||
|  | ||||
| turnoffh ps off msg b = foldM toh b ps | ||||
|     where | ||||
|         toh b p = turnoff p off msg b | ||||
|  | ||||
| setto :: Position -> Element -> String -> Brett -> IO Brett | ||||
| setto i n cname b = do | ||||
|         -- print (pname i) | ||||
|         -- print ": set to " | ||||
|         -- print n | ||||
|         -- print " (hidden single in " | ||||
|         -- print cname | ||||
|         -- println ")" | ||||
|         return newb | ||||
|     where | ||||
|         nf     = [n] | ||||
|         newb   = (i, nf) : [ f | f <- b, fst f != i ] | ||||
|  | ||||
|  | ||||
| -- ----------------------------- SOLVING STRATEGIES --------------------------------------------- | ||||
| -- reduce candidate sets that contains numbers already in same row, col or box | ||||
| -- This finds (and logs) NAKED SINGLEs in passing. | ||||
| reduce b = [  turnoff1 p sss | (p,cell) <- b,               -- for each field | ||||
|                 unsolved cell,                              --  with more than 1 candidate | ||||
|                 --       single fields in containers that are candidates of that field | ||||
|                 sss = [ s | (rcb, _) <- containers, [s] <- map (getc b) (rcb p), s `elem` cell], | ||||
|                 sss != [] ]                                     -- collect field index, elements to remove from candidate set | ||||
|  | ||||
| -- look for a number that appears in exactly 1 candidate set of a container | ||||
| -- this number can go in no other place (HIDDEN SINGLE) | ||||
| hiddenSingle b = [ setto i n cname |                     -- select index, number, containername | ||||
|             (cname, rcb) <- allrcb,                 -- FOR rcb IN allrcb | ||||
|             n <- elements,                          --  FOR n IN elements | ||||
|             fs     = filter (unsolved • snd) (map (getf b) rcb), | ||||
|             occurs  = filter ((n `elem`) • snd) fs, | ||||
|             length occurs == 1, | ||||
|             (i, _) <- occurs ] | ||||
|  | ||||
| -- look for NAKED PAIRS, TRIPLES, QUADS | ||||
| nakedPair n b = [ turnoff p t ("(naked tuple in " ++ nm ++ ")") |           -- SELECT pos, tuple, name | ||||
|             -- n <- [2,3,4],                    //  FOR n IN [2,3,4] | ||||
|             (nm, rcb) <- allrcb,             --    FOR rcb IN containers | ||||
|             fs = map (getf b) rcb,              --      let fs = fields for rcb positions | ||||
|             u  = (fold union [] . filter unsolved . map snd) fs,   -- let u = union of non single candidates | ||||
|             t <- n `outof` u,                   --      FOR t IN n-tuples | ||||
|             hit = (filter ((`subset` t) . snd) . filter (unsolved . snd)) fs, | ||||
|             length hit == n, | ||||
|             (p, cell) <- fs, | ||||
|             p `notElem` map fst hit, | ||||
|             any (`elem` cell) t | ||||
|             ] | ||||
|  | ||||
| -- look for HIDDEN PAIRS, TRIPLES or QUADS | ||||
| hiddenPair n b = [ turnoff p off ("(hidden " ++ show t ++ " in " ++ nm ++ ")") |           -- SELECT pos, tuple, name | ||||
|             -- n <- [2,3,4],                    //  FOR n IN [2,3,4] | ||||
|             (nm, rcb) <- allrcb,             --    FOR rcb IN containers | ||||
|             fs = map (getf b) rcb,              --      let fs = fields for rcb positions | ||||
|             u  = (fold union [] . filter ((>1) . length) . map snd) fs,   -- let u = union of non single candidates | ||||
|             t <- n `outof` u,                   --      FOR t IN n-tuples | ||||
|             hit = (filter (any ( `elem` t) . snd) . filter (unsolved . snd)) fs, | ||||
|             length hit == n, | ||||
|             off = (fold union [] . map snd) hit `minus` t, | ||||
|             off != [], | ||||
|             (p, cell) <- hit, | ||||
|             ! (cell `subset` t) | ||||
|             ] | ||||
|  | ||||
| a `subset` b = all (`elem` b) a | ||||
| a `union`  b = uniq (sort (a ++ b)) | ||||
| a `minus`  b = filter (`notElem` b) a | ||||
| a `common` b = filter (`elem` b) a | ||||
| n `outof` as | ||||
|     | length as < n = [] | ||||
|     | [] <- as      = [] | ||||
|     | 1 >= n        = map (:[]) as | ||||
|     | (a:bs) <- as  = map (a:) ((n-1) `outof` bs) ++ (n `outof` bs) | ||||
|     | otherwise     = undefined  -- cannot happen because either as is empty or not | ||||
|  | ||||
| same f a b = b `elem` f a | ||||
|  | ||||
| intersectionlist = [(allboxs, row, "box/row intersection"), (allboxs, col, "box/col intersection"), | ||||
|                     (allrows ++ allcols, box, "line/box intersection")] | ||||
| intersections b = [ | ||||
|     turnoff pos [c] reason |    -- SELECT position, candidate, reson | ||||
|         (from, container, reason) <- intersectionlist, | ||||
|         rcb <- from, | ||||
|         fs = (filter (unsolved . snd) . map (getf b)) rcb,        -- fs = fields in from with more than 1 candidate | ||||
|         c <- (fold union [] • map snd) fs,                          -- FOR c IN union of candidates | ||||
|         cpos = (map fst • filter ((c `elem`) • snd)) fs,            -- cpos = positions where c occurs | ||||
|         cpos != [],                                                 -- WHERE cpos is not empty | ||||
|         all (same container (head cpos)) (tail cpos),               -- WHERE all positions are in the intersection | ||||
|         -- we can remove all occurences of c that are in container, but not in from | ||||
|         (pos, cell) <- map (getf b) (container (head cpos)), | ||||
|         c `elem` cell, | ||||
|         pos `notElem` rcb ] | ||||
|  | ||||
|  | ||||
| -- look for an XY Wing | ||||
| --  - there exists a cell A with candidates X and Y | ||||
| --  - there exists a cell B with candidates X and Z that shares a container with A | ||||
| --  - there exists a cell C with candidates Y and Z that shares a container with A | ||||
| -- reasoning | ||||
| --  - if A is X, B will be Z | ||||
| --  - if A is Y, C will be Z | ||||
| --  - since A will indeed be X or Y -> B or C will be Z | ||||
| --  - thus, no cell that can see B and C can be Z | ||||
| xyWing board = [ turnoff p [z] ("xy wing " ++ pname b ++ " " ++ pname c ++ " because of " ++ pname a) | | ||||
|         (a, [x,y]) <- board,                            -- there exists a cell a with candidates x and y | ||||
|         rcba = map (getf board) (row a ++ col a ++ box a),  -- rcba = all fields that share a container with a | ||||
|         (b, [b1, b2]) <- rcba, | ||||
|         b != a, | ||||
|         b1 == x && b2 != y || b2 == x && b1 != y,       -- there exists a cell B with candidates x and z | ||||
|         z = if b1 == x then b2 else b1, | ||||
|         (c, [c1, c2]) <- rcba, | ||||
|         c != a, c!= b, | ||||
|         c1 == y && c2 == z || c1 == z && c2 == y,       -- there exists a cell C with candidates y and z | ||||
|         ps = (uniq . sort) ((row b ++ col b ++ box b) `common` (row c ++ col c ++ box c)), | ||||
|         -- remove z in ps | ||||
|         (p, cs) <- map (getf board) ps, | ||||
|         p != b, p != c, | ||||
|         z `elem` cs ] | ||||
|  | ||||
| -- look for a N-Fish (2: X-Wing, 3: Swordfish, 4: Jellyfish) | ||||
| -- When all candidates for a particular digit in N rows are located | ||||
| -- in only N columns, we can eliminate all candidates from those N columns | ||||
| --  which are not located on those N rows | ||||
| fish n board = fish "row" allrows row col ++ fish "col" allcols col row where | ||||
|     fishname 2 = "X-Wing" | ||||
|     fishname 3 = "Swordfish" | ||||
|     fishname 4 = "Jellyfish" | ||||
|     fishname _ = "unknown fish" | ||||
|     fish nm allrows row col = [ turnoff p [x] (fishname n ++ " in " ++ nm ++ " " ++ show (map (pname . head) rset)) | | ||||
|         rset <- n `outof` allrows,          -- take n rows (or cols) | ||||
|         x <- elements,                      -- look for certain number | ||||
|         rflds = map (filter ((>1) . length . snd) . map (getf board)) rset,       -- unsolved fields in the rowset | ||||
|         colss  = (map (map (head . col . fst) . filter ((x `elem`) . snd)) rflds),   -- where x occurs in candidates | ||||
|         all ((>1) . length) colss,         -- x must appear in at least 2 cols | ||||
|         cols = fold union [] colss, | ||||
|         length cols == n, | ||||
|         cstart <- cols, | ||||
|         (p, cell) <- map (getf board) (col cstart), | ||||
|         x `elem` cell, | ||||
|         all (p `notElem`) rset] | ||||
|  | ||||
|  | ||||
| -- compute immediate consequences of an assumption of the form (p `IS` e) or (p `ISNOT` e) | ||||
| conseq board (IS p e) = uniq (sort ([ p `ISNOT` x | x <- getc board p, x != e ] ++ | ||||
|     [ a `ISNOT` e | | ||||
|         (a,cs) <- map (getf board) (row p ++ col p ++ box p), | ||||
|         a != p, | ||||
|         e `elem` cs | ||||
|     ])) | ||||
| conseq board (ISNOT p  e) = uniq (sort ([ p `IS` x | cs = getc board p, length cs == 2, x <- cs, x != e ] ++ | ||||
|     [ a `IS` e | | ||||
|         cp <- [row p, box p, col p], | ||||
|         as = (filter ((e `elem`) . getc board) . filter (p!=)) cp, | ||||
|         length as == 1, | ||||
|         a = head as | ||||
|     ])) | ||||
|  | ||||
| -- check if two assumptions contradict each other | ||||
| contradicts (IS a x)    (IS b y)    = a==b && x!=y | ||||
| contradicts (IS a x)    (ISNOT b y) = a==b && x==y | ||||
| contradicts (ISNOT a x) (IS b y)    = a==b && x==y | ||||
| contradicts (ISNOT _ _) (ISNOT _ _) = false | ||||
|  | ||||
| -- get the Position of an Assumption | ||||
| aPos (IS p _)    = p | ||||
| aPos (ISNOT p _) = p | ||||
|  | ||||
| -- get List of elements that must be turned off when assumption is true/false | ||||
| toClear board true  (IS p x)    = filter (x!=) (getc board p) | ||||
| toClear board false (IS p x)    = [x] | ||||
| toClear board true  (ISNOT p x) = [x] | ||||
| toClear board false (ISNOT p x) = filter (x!=) (getc board p) | ||||
|  | ||||
|  | ||||
| -- look for assumptions whose implications contradict themself | ||||
| chain board paths = [ solution a (head cs) (reverse cs) | | ||||
|         (a, css) <-  paths, | ||||
|         cs <- take 1 [ cs | cs <- css, contradicts a (head cs) ] | ||||
|         ] | ||||
|     where | ||||
|         solution a c cs = turnoff (aPos a) (toClear board false a) reason where | ||||
|             reason = "Assumption " ++ show a ++ " implies " ++ show c ++ "\n\t" | ||||
|                 ++ showcs cs ++ "\n\t" | ||||
|                 ++ "Therefore, " ++ show a ++ " must be false." | ||||
|  | ||||
| -- look for an assumption that yields to contradictory implications | ||||
| -- this assumption must be false | ||||
| chainContra board paths = [ solution a (reverse pro) (reverse contra) | | ||||
|         (a, css) <- paths,          -- FOR ALL assumptions "a" with list of conlusions "css" | ||||
|         (pro, contra) <- take 1 [ (pro, contra) | | ||||
|             pro <- (uniqBy (using head) . sortBy (comparing head)) css,                 -- FOR ALL conslusion chains "pro" | ||||
|             c = head pro,               -- LET "c" BE the final conclusion | ||||
|             contra <- take 1 (filter ((contradicts c) . head) css)   -- THE FIRST conclusion that contradicts c | ||||
|         ] | ||||
|       ] | ||||
|     where | ||||
|         solution a pro con = turnoff (aPos a) (toClear board false a) reason where | ||||
|             reason = ("assumption " ++ show a ++ " leads to contradictory conclusions\n\t" | ||||
|                         ++ showcs pro ++ "\n\t" ++ showcs con) | ||||
|  | ||||
|  | ||||
|  | ||||
| -- look for a common implication c of some assumptions ai, where at least 1 ai is true | ||||
| -- so that (a0 OR a1 OR a2 OR ...) IMPLIES c | ||||
| -- For all cells pi in same container that have x as candidate, we can construct (p0==x OR p1==x OR ... OR pi==x) | ||||
| -- For a cell p with candidates ci, we can construct (p==c0 OR p==c1) | ||||
| cellRegionChain board paths = [ solution b as (map head os) | | ||||
|         as <- cellas ++ regionas,           -- one of as must be true | ||||
|         iss = filter ((`elem` as) . fst) paths,    -- the implications for as | ||||
|         (a, ass) <- take 1 iss,             -- implications for first assumption | ||||
|         fs <- (uniqBy (using head) . sortBy (comparing head)) ass, | ||||
|         b = head fs,                        -- final conclusions of first assumption | ||||
|         os = [fs] : map (take 1 . filter ((b==) . head) . snd) (tail iss), -- look for implications with same conclusion | ||||
|         all ([]!=) os] | ||||
|     where | ||||
|         cellas   = [ map (p `IS`) candidates | (p, candidates@(_:_:_)) <- board ] | ||||
|         regionas = [ map (`IS` e) ps | | ||||
|             region <- map (map (getf board)) (allrows ++ allcols ++ allboxs), | ||||
|             e <- elements, | ||||
|             ps = map fst (filter ((e `elem`) . snd) region), | ||||
|             length ps > 1 ] | ||||
|         solution b as oss = turnoff (aPos b) (toClear board true b) reason where | ||||
|             reason = "all of the assumptions " ++ joined ", " (map show as) ++ " imply " ++ show b ++ "\n\t" | ||||
|                 ++ joined "\n\t" (map (showcs . reverse) oss) ++ "\n\t" | ||||
|                 ++ "One of them must be true, so " ++ show b ++ " must be true." | ||||
|  | ||||
|  | ||||
| {- | ||||
|     Wir brauchen für einige Funktionen eine Datenstruktur wie | ||||
|         [ (Assumption, [[Assumption]]) ] | ||||
|     d.i. eine Liste von möglichen Annahmen samt aller Schlußketten. | ||||
|     Idealerweise sollte die Schlußkette in umgekehrter Reihenfolge vorliegen, | ||||
|     dann kann man einfach finden: | ||||
|     - Annahmen, die zum Selbstwiderspruch führen. | ||||
|     - alles, was aus einer bestimmten Annahme folgt (map (map head) [[a]]) | ||||
|     -... | ||||
| -} | ||||
| --- Liste aller Annahmen für ein bestimmtes Brett | ||||
| assumptions :: Brett -> [Assumption] | ||||
| assumptions board = [ a | | ||||
|                 (p, cs) <- board, | ||||
|                 !(single cs), | ||||
|                 a <- map (ISNOT p) cs ++ map (IS p) cs ] | ||||
|  | ||||
| consequences :: Brett -> [Assumption] -> [[Assumption]] | ||||
| consequences board as = map (conseq board) as | ||||
|  | ||||
| acstree :: Brett -> Tree Assumption [Assumption] | ||||
| acstree board = Tree.fromList (zip as cs) | ||||
|     where | ||||
|         as = assumptions  board | ||||
|         cs = consequences board as | ||||
|  | ||||
| -- bypass maybe on tree lookup | ||||
| find :: Tree Assumption [Assumption] -> Assumption -> [Assumption] | ||||
| find t a | ||||
|     | Just cs <- t.lookup a = cs | ||||
|     | otherwise = error ("no consequences for " ++ show a) | ||||
|  | ||||
| -- for performance resons, we confine ourselves to implication chains of length 20 per assumption | ||||
| mkPaths :: Tree Assumption [Assumption] -> [ (Assumption, [[Assumption]]) ] | ||||
| mkPaths acst = map impl  (keys acst)   -- {[a1], [a2], [a3] ] | ||||
|     where | ||||
|         -- [Assumption] -> [(a, [chains, ordered by length] | ||||
|         impl a = (a, impls [[a]]) | ||||
|         impls ns = (take 1000 • concat • takeUntil null • iterate expandchain) ns | ||||
|         -- expandchain :: [[Assumption]] -> [[Assumption]] | ||||
|         expandchain css = [ (n:a:as) | | ||||
|             (a : as) <- css,               -- list of assumptions | ||||
|             n <- find acst a,              -- consequences of a | ||||
|             n `notElem` as                 -- avoid loops | ||||
|           ] | ||||
|         -- uni (a:as) = a : uni (filter ((head a !=) • head) as) | ||||
|         -- uni [] = empty | ||||
|         -- empty = [] | ||||
|  | ||||
|  | ||||
| -- ------------------ SOLVE A SUDOKU -------------------------- | ||||
| -- Apply all available strategies until nothing changes anymore | ||||
| -- Strategy functions are supposed to return a list of | ||||
| -- functions, which, when applied to a board, give a changed board. | ||||
| -- When a strategy does not find anything to alter, | ||||
| -- it returns [], and the next strategy can be tried. | ||||
| solve b | ||||
|     | all (single . snd) b       = result "Solved" b | ||||
|     | any (([]==) . snd) b       = result "not solvable" b | ||||
|     | res@(_:_) <- reduce b       = apply b res >>=solve       -- compute smallest candidate sets | ||||
|     -- comment "candidate sets are up to date" = () | ||||
|     | res@(_:_) <- hiddenSingle b  = apply b res >>= solve     -- find HIDDEN SINGLES | ||||
|     -- comment "no more hidden singles" = () | ||||
|     | res@(_:_) <- intersections b = apply b res >>= solve     -- find locked candidates | ||||
|     -- comment "no more intersections" = () | ||||
|     | res@(_:_) <- nakedPair 2 b     = apply b res >>= solve     -- find NAKED PAIRS, TRIPLES or QUADRUPELS | ||||
|     -- comment "no more naked pairs" = () | ||||
|     | res@(_:_) <- hiddenPair  2 b   = apply b res >>= solve      -- find HIDDEN PAIRS, TRIPLES or QUADRUPELS | ||||
|     -- comment "no more hidden pairs" = () | ||||
|     -- res@(_:_) <- nakedPair 3 b     = apply b res >>= solve       // find NAKED PAIRS, TRIPLES or QUADRUPELS | ||||
|     -- | comment "no more naked triples" = () | ||||
|     -- res@(_:_) <- hiddenPair  3 b    = apply b res >>= solve      // find HIDDEN PAIRS, TRIPLES or QUADRUPELS | ||||
|     -- | comment "no more hidden triples" = () | ||||
|     -- res@(_:_) <- nakedPair 4 b     = apply b res >>=solve       // find NAKED PAIRS, TRIPLES or QUADRUPELS | ||||
|     -- | comment "no more naked quadruples" = () | ||||
|     -- res@(_:_) <- hiddenPair  4 b    = apply b res >>=solve      // find HIDDEN PAIRS, TRIPLES or QUADRUPELS | ||||
|     -- | comment "no more hidden quadruples" = () | ||||
|     | res@(_:_) <- xyWing b            = apply b res >>=solve      -- find XY WINGS | ||||
|     -- comment "no more xy wings"       = () | ||||
|     | res@(_:_) <- fish 2 b            = apply b res >>=solve      -- find 2-FISH | ||||
|     -- comment "no more x-wings"        = () | ||||
|     -- res@(_:_) <- fish 3 b            = apply b res >>=solve      // find 3-FISH | ||||
|     -- | comment "no more swordfish"      = () | ||||
|     -- res@(_:_) <- fish 4 b            = apply b res >>=solve      // find 4-FISH | ||||
|     -- | comment "no more jellyfish"      = () | ||||
|     -- | comment pcomment                 = () | ||||
|     | res@(_:_) <- chain b paths             = apply b (take 9 res) >>= solve  -- find forcing chains | ||||
|     | res@(_:_) <- cellRegionChain b paths   = apply b (take 9 res) >>= solve  -- find common conclusion for true assumption | ||||
|     | res@(_:_) <- chainContra b paths       = apply b (take 9 res) >>= solve  -- find assumptions that allow to infer both a and !a | ||||
|     -- comment "consistent conclusions only"       = () | ||||
|  | ||||
|     | otherwise = result "ambiguous" b | ||||
|     where | ||||
|         apply brd fs = foldM (\b\f -> f b) brd fs | ||||
|         paths = mkPaths (acstree b) | ||||
|         -- pcomment = show (length paths) ++ " assumptions with " ++ show (fold (+) 0 (map (length <~ snd) paths)) | ||||
|         --    ++ " implication chains" | ||||
|  | ||||
| -- comment com = do stderr << com << "\n" for false | ||||
| -- log com     = do stderr << com << "\n" for true | ||||
|  | ||||
| --- turn a string into a row | ||||
| mkrow :: String -> [Zelle] | ||||
| mkrow s = mkrow1 xs | ||||
|     where | ||||
|         xs = s ++ "---------" -- make sure at least 9 elements | ||||
|         mkrow1 xs = (take 9 • filter ([]!=) • map f • unpacked) xs | ||||
|         f x | x >= '1' && x <= '9'  =  [ord x - ord '0'] | ||||
|             | x == ' '  = []    -- ignored | ||||
|             | otherwise = elements | ||||
|  | ||||
| main ["-h"]    = main [] | ||||
| main ["-help"] = main [] | ||||
| main [] = do | ||||
|         mapM_ stderr.println [ | ||||
|             "usage: java Sudoku file ...", | ||||
|             "       java Sudoku position", | ||||
|             "where position is a 81 char string consisting of digits", | ||||
|             "One can get such a string by going to", | ||||
|             "http://www.sudokuoftheday.com/pages/s-o-t-d.php", | ||||
|             "Right click on the puzzle and open it in new tab", | ||||
|             "Copy the 81 digits from the URL in the address field of your browser.", | ||||
|             "", | ||||
|             "There is also a file with hard sudokus in examples/top95.txt\n"] | ||||
|         return () | ||||
|  | ||||
|  | ||||
| main [s@#^[0-9\W]{81}$#] = solve board >> return () | ||||
|     where | ||||
|         board = zip positions felder | ||||
|         felder = decode s | ||||
|  | ||||
| main files = forM_ files sudoku | ||||
|     where | ||||
|         sudoku file = do | ||||
|             br <- openReader file | ||||
|             lines <- BufferedReader.getLines br | ||||
|             bs <- process lines | ||||
|             ss <- mapM (\b -> print "Puzzle: " >> printb b >> solve b) bs | ||||
|             println ("Euler: " ++ show (sum (map res012 ss))) | ||||
|             return () | ||||
|  | ||||
| -- "--3-" => [1..9, 1..9, [3], 1..9] | ||||
| decode s = map candi (unpacked s) where | ||||
|         candi c | c >= '1' && c <= '9'  = [(ord c - ord '0')] | ||||
|                 | otherwise = elements | ||||
| process [] = return [] | ||||
| process (s:ss) | ||||
|     | length s == 81 = consider b1 | ||||
|     | length s == 9, | ||||
|       length acht == 8, | ||||
|       all ((9==) • length) acht = consider b2 | ||||
|     | otherwise = do | ||||
|             stderr.println ("skipped line: " ++ s) | ||||
|             process ss | ||||
|     where | ||||
|         acht = take 8 ss | ||||
|         neun = fold (++) "" (s:acht) | ||||
|         b1 = zip positions (decode s) | ||||
|         b2 = zip positions (decode neun) | ||||
|         consider b = do | ||||
|             -- print "Puzzle: " | ||||
|             -- printb b | ||||
|             bs <- process ss | ||||
|             return (b:bs) | ||||
|  | ||||
							
								
								
									
										79
									
								
								samples/Frege/SwingExamples.fr
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										79
									
								
								samples/Frege/SwingExamples.fr
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,79 @@ | ||||
| package examples.SwingExamples where | ||||
|  | ||||
| import Java.Awt  (ActionListener) | ||||
| import Java.Swing | ||||
|  | ||||
|  | ||||
| main _ = do | ||||
|     rs <- mapM Runnable.new [helloWorldGUI, buttonDemoGUI, celsiusConverterGUI] | ||||
|     mapM_ invokeLater rs | ||||
|     println "Hit enter to end ...." | ||||
|     s <- getLine | ||||
|     return () | ||||
|  | ||||
| celsiusConverterGUI = do | ||||
|     tempTextField   <- JTextField.new() | ||||
|     celsiusLabel    <- JLabel.new () | ||||
|     convertButton   <- JButton.new () | ||||
|     fahrenheitLabel <- JLabel.new ()  | ||||
|     frame           <- JFrame.new () | ||||
|     frame.setDefaultCloseOperation JFrame.dispose_on_close | ||||
|     frame.setTitle "Celsius Converter" | ||||
|     celsiusLabel.setText  "Celsius" | ||||
|     convertButton.setText "Convert" | ||||
|     let convertButtonActionPerformed _ = do | ||||
|             celsius <- tempTextField.getText | ||||
|             case celsius.double of | ||||
|                 Left _  -> fahrenheitLabel.setText ("not a valid number: " ++ celsius) | ||||
|                 Right c -> fahrenheitLabel.setText (show (c*1.8 + 32.0).long ++ " Fahrenheit")  | ||||
|             return () | ||||
|     ActionListener.new convertButtonActionPerformed >>= convertButton.addActionListener | ||||
|     fahrenheitLabel.setText "Fahrenheit" | ||||
|     contentPane <- frame.getContentPane | ||||
|     layout      <- GroupLayout.new contentPane | ||||
|     contentPane.setLayout layout | ||||
|     -- TODO continue | ||||
|     -- http://docs.oracle.com/javase/tutorial/displayCode.html?code=http://docs.oracle.com/javase/tutorial/uiswing/examples/learn/CelsiusConverterProject/src/learn/CelsiusConverterGUI.java | ||||
|     frame.pack | ||||
|     frame.setVisible true | ||||
|  | ||||
| helloWorldGUI = do | ||||
|     frame <- JFrame.new "Hello World Frege" | ||||
|     frame.setDefaultCloseOperation(JFrame.dispose_on_close) | ||||
|     label <- JLabel.new "Hello World!" | ||||
|     cp <- frame.getContentPane | ||||
|     cp.add label | ||||
|     frame.pack | ||||
|     frame.setVisible true | ||||
|  | ||||
| buttonDemoGUI = do | ||||
|     frame <- JFrame.new "Button Demo" | ||||
|     frame.setDefaultCloseOperation(JFrame.dispose_on_close) | ||||
|     newContentPane <- JPanel.new () | ||||
|     b1::JButton <- JButton.new "Disable middle button" | ||||
|     b1.setVerticalTextPosition   SwingConstants.center | ||||
|     b1.setHorizontalTextPosition SwingConstants.leading | ||||
|     b2::JButton <- JButton.new "Middle button" | ||||
|     b2.setVerticalTextPosition   SwingConstants.center | ||||
|     b2.setHorizontalTextPosition SwingConstants.leading | ||||
|     b3::JButton <- JButton.new "Enable middle button" | ||||
|     b3.setVerticalTextPosition   SwingConstants.center | ||||
|     b3.setHorizontalTextPosition SwingConstants.leading | ||||
|     b3.setEnabled false | ||||
|     let action1 _ = do | ||||
|             b2.setEnabled false | ||||
|             b1.setEnabled false | ||||
|             b3.setEnabled true | ||||
|         action3 _ = do | ||||
|             b2.setEnabled true | ||||
|             b1.setEnabled true | ||||
|             b3.setEnabled false | ||||
|     ActionListener.new action1  >>= b1.addActionListener | ||||
|     ActionListener.new action3  >>= b3.addActionListener  | ||||
|     newContentPane.add b1 | ||||
|     newContentPane.add b2 | ||||
|     newContentPane.add b3 | ||||
|     newContentPane.setOpaque true | ||||
|     frame.setContentPane newContentPane | ||||
|     frame.pack | ||||
|     frame.setVisible true | ||||
							
								
								
									
										642
									
								
								samples/Game Maker Language/ClientBeginStep.gml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										642
									
								
								samples/Game Maker Language/ClientBeginStep.gml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,642 @@ | ||||
| /* | ||||
|     Originally from /Source/gg2/Scripts/Client/ClientBeginStep.gml in Gang Garrison 2 | ||||
|  | ||||
|     Copyright (C) 2008-2013 Faucet Software | ||||
|     http://www.ganggarrison.com | ||||
|  | ||||
|     This program is free software;  | ||||
|     you can redistribute it and/or modify it under the terms of the GNU General Public License | ||||
|     as published by the Free Software Foundation; either version 3 of the License, or (at your option) | ||||
|     any later version. | ||||
|     This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;  | ||||
|     without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  | ||||
|     See the GNU General Public License for more details. | ||||
|     You should have received a copy of the GNU General Public License along with this program; if not, | ||||
|     see <http://www.gnu.org/licenses>. | ||||
|  | ||||
|     Additional permission under GNU GPL version 3 section 7 | ||||
|     If you modify this Program, or any covered work, by linking or combining it with the Game Maker runtime library,  | ||||
|     the 39dll library/extension, Hobbel's Download Manager DLL, or modified versions of these libraries, | ||||
|     the licensors of this Program grant you additional permission to convey the resulting work. | ||||
| */ | ||||
|  | ||||
| // receive and interpret the server's message(s) | ||||
| var i, playerObject, playerID, player, otherPlayerID, otherPlayer, sameVersion, buffer, plugins, pluginsRequired, usePlugins; | ||||
|  | ||||
| if(tcp_eof(global.serverSocket)) { | ||||
|     if(gotServerHello) | ||||
|         show_message("You have been disconnected from the server."); | ||||
|     else | ||||
|         show_message("Unable to connect to the server."); | ||||
|     instance_destroy(); | ||||
|     exit; | ||||
| } | ||||
|  | ||||
| if(room == DownloadRoom and keyboard_check(vk_escape)) | ||||
| { | ||||
|     instance_destroy(); | ||||
|     exit; | ||||
| } | ||||
|  | ||||
| if(downloadingMap) | ||||
| { | ||||
|     while(tcp_receive(global.serverSocket, min(1024, downloadMapBytes-buffer_size(downloadMapBuffer)))) | ||||
|     { | ||||
|         write_buffer(downloadMapBuffer, global.serverSocket); | ||||
|         if(buffer_size(downloadMapBuffer) == downloadMapBytes) | ||||
|         { | ||||
|             write_buffer_to_file(downloadMapBuffer, "Maps/" + downloadMapName + ".png"); | ||||
|             downloadingMap = false; | ||||
|             buffer_destroy(downloadMapBuffer); | ||||
|             downloadMapBuffer = -1; | ||||
|             exit; | ||||
|         } | ||||
|     } | ||||
|     exit; | ||||
| } | ||||
|  | ||||
| roomchange = false; | ||||
| do { | ||||
|     if(tcp_receive(global.serverSocket,1)) { | ||||
|         switch(read_ubyte(global.serverSocket)) { | ||||
|         case HELLO: | ||||
|             gotServerHello = true; | ||||
|             global.joinedServerName = receivestring(global.serverSocket, 1); | ||||
|             downloadMapName = receivestring(global.serverSocket, 1); | ||||
|             advertisedMapMd5 = receivestring(global.serverSocket, 1); | ||||
|             receiveCompleteMessage(global.serverSocket, 1, global.tempBuffer); | ||||
|             pluginsRequired = read_ubyte(global.tempBuffer); | ||||
|             plugins = receivestring(global.serverSocket, 1); | ||||
|             if(string_pos("/", downloadMapName) != 0 or string_pos("\", downloadMapName) != 0) | ||||
|             { | ||||
|                 show_message("Server sent illegal map name: "+downloadMapName); | ||||
|                 instance_destroy(); | ||||
|                 exit; | ||||
|             } | ||||
|  | ||||
|             if (!noReloadPlugins && string_length(plugins)) | ||||
|             { | ||||
|                 usePlugins = pluginsRequired || !global.serverPluginsPrompt; | ||||
|                 if (global.serverPluginsPrompt) | ||||
|                 { | ||||
|                     var prompt; | ||||
|                     if (pluginsRequired) | ||||
|                     { | ||||
|                         prompt = show_question( | ||||
|                             "This server requires the following plugins to play on it: " | ||||
|                             + string_replace_all(plugins, ",", "#") | ||||
|                             + '#They are downloaded from the source: "' | ||||
|                             + PLUGIN_SOURCE | ||||
|                             + '"#The source states: "' | ||||
|                             + PLUGIN_SOURCE_NOTICE | ||||
|                             + '"#Do you wish to download them and continue connecting?' | ||||
|                         ); | ||||
|                         if (!prompt) | ||||
|                         { | ||||
|                             instance_destroy(); | ||||
|                             exit; | ||||
|                         } | ||||
|                     } | ||||
|                     else | ||||
|                     { | ||||
|                         prompt = show_question( | ||||
|                             "This server suggests the following optional plugins to play on it: " | ||||
|                             + string_replace_all(plugins, ",", "#") | ||||
|                             + '#They are downloaded from the source: "' | ||||
|                             + PLUGIN_SOURCE | ||||
|                             + '"#The source states: "' | ||||
|                             + PLUGIN_SOURCE_NOTICE | ||||
|                             + '"#Do you wish to download them and use them?' | ||||
|                         ); | ||||
|                         if (prompt) | ||||
|                         { | ||||
|                             usePlugins = true; | ||||
|                         } | ||||
|                     } | ||||
|                 } | ||||
|                 if (usePlugins) | ||||
|                 { | ||||
|                     if (!loadserverplugins(plugins)) | ||||
|                     { | ||||
|                         show_message("Error ocurred loading server-sent plugins."); | ||||
|                         instance_destroy(); | ||||
|                         exit; | ||||
|                     } | ||||
|                     global.serverPluginsInUse = true; | ||||
|                 } | ||||
|             } | ||||
|             noReloadPlugins = false; | ||||
|              | ||||
|             if(advertisedMapMd5 != "") | ||||
|             { | ||||
|                 var download; | ||||
|                 download = not file_exists("Maps/" + downloadMapName + ".png"); | ||||
|                 if(!download and CustomMapGetMapMD5(downloadMapName) != advertisedMapMd5) | ||||
|                 { | ||||
|                     if(show_question("The server's copy of the map (" + downloadMapName + ") differs from ours.#Would you like to download this server's version of the map?")) | ||||
|                         download = true; | ||||
|                     else | ||||
|                     { | ||||
|                         instance_destroy(); | ||||
|                         exit; | ||||
|                     } | ||||
|                 } | ||||
|                  | ||||
|                 if(download) | ||||
|                 { | ||||
|                     write_ubyte(global.serverSocket, DOWNLOAD_MAP); | ||||
|                     socket_send(global.serverSocket); | ||||
|                     receiveCompleteMessage(global.serverSocket,4,global.tempBuffer); | ||||
|                     downloadMapBytes = read_uint(global.tempBuffer); | ||||
|                     downloadMapBuffer = buffer_create(); | ||||
|                     downloadingMap = true; | ||||
|                     roomchange=true; | ||||
|                 } | ||||
|             } | ||||
|             ClientPlayerJoin(global.serverSocket); | ||||
|             if(global.rewardKey != "" and global.rewardId != "") | ||||
|             { | ||||
|                 var rewardId; | ||||
|                 rewardId = string_copy(global.rewardId, 0, 255); | ||||
|                 write_ubyte(global.serverSocket, REWARD_REQUEST); | ||||
|                 write_ubyte(global.serverSocket, string_length(rewardId)); | ||||
|                 write_string(global.serverSocket, rewardId); | ||||
|             } | ||||
|             if(global.queueJumping == true) | ||||
|             { | ||||
|                 write_ubyte(global.serverSocket, CLIENT_SETTINGS); | ||||
|                 write_ubyte(global.serverSocket, global.queueJumping); | ||||
|             } | ||||
|             socket_send(global.serverSocket); | ||||
|             break; | ||||
|              | ||||
|         case JOIN_UPDATE: | ||||
|             receiveCompleteMessage(global.serverSocket,2,global.tempBuffer); | ||||
|             global.playerID = read_ubyte(global.tempBuffer); | ||||
|             global.currentMapArea = read_ubyte(global.tempBuffer); | ||||
|             break; | ||||
|          | ||||
|         case FULL_UPDATE: | ||||
|             deserializeState(FULL_UPDATE); | ||||
|             break; | ||||
|          | ||||
|         case QUICK_UPDATE: | ||||
|             deserializeState(QUICK_UPDATE); | ||||
|             break; | ||||
|               | ||||
|         case CAPS_UPDATE: | ||||
|             deserializeState(CAPS_UPDATE); | ||||
|             break; | ||||
|                    | ||||
|         case INPUTSTATE: | ||||
|             deserializeState(INPUTSTATE); | ||||
|             break;              | ||||
|          | ||||
|         case PLAYER_JOIN: | ||||
|             player = instance_create(0,0,Player); | ||||
|             player.name = receivestring(global.serverSocket, 1); | ||||
|                    | ||||
|             ds_list_add(global.players, player); | ||||
|             if(ds_list_size(global.players)-1 == global.playerID) { | ||||
|                 global.myself = player; | ||||
|                 instance_create(0,0,PlayerControl); | ||||
|             } | ||||
|             break; | ||||
|              | ||||
|         case PLAYER_LEAVE: | ||||
|             // Delete player from the game, adjust own ID accordingly | ||||
|             receiveCompleteMessage(global.serverSocket,1,global.tempBuffer); | ||||
|             playerID = read_ubyte(global.tempBuffer); | ||||
|             player = ds_list_find_value(global.players, playerID); | ||||
|             removePlayer(player); | ||||
|             if(playerID < global.playerID) { | ||||
|                 global.playerID -= 1; | ||||
|             } | ||||
|             break; | ||||
|                                     | ||||
|         case PLAYER_DEATH: | ||||
|             var causeOfDeath, assistantPlayerID, assistantPlayer; | ||||
|             receiveCompleteMessage(global.serverSocket,4,global.tempBuffer); | ||||
|             playerID = read_ubyte(global.tempBuffer); | ||||
|             otherPlayerID = read_ubyte(global.tempBuffer); | ||||
|             assistantPlayerID = read_ubyte(global.tempBuffer); | ||||
|             causeOfDeath = read_ubyte(global.tempBuffer); | ||||
|                    | ||||
|             player = ds_list_find_value(global.players, playerID); | ||||
|              | ||||
|             otherPlayer = noone; | ||||
|             if(otherPlayerID != 255) | ||||
|                 otherPlayer = ds_list_find_value(global.players, otherPlayerID); | ||||
|              | ||||
|             assistantPlayer = noone; | ||||
|             if(assistantPlayerID != 255) | ||||
|                 assistantPlayer = ds_list_find_value(global.players, assistantPlayerID); | ||||
|              | ||||
|             doEventPlayerDeath(player, otherPlayer, assistantPlayer, causeOfDeath); | ||||
|             break; | ||||
|               | ||||
|         case BALANCE: | ||||
|             receiveCompleteMessage(global.serverSocket,1,global.tempBuffer); | ||||
|             balanceplayer=read_ubyte(global.tempBuffer); | ||||
|             if balanceplayer == 255 { | ||||
|                 if !instance_exists(Balancer) instance_create(x,y,Balancer); | ||||
|                 with(Balancer) notice=0; | ||||
|             } else { | ||||
|                 player = ds_list_find_value(global.players, balanceplayer); | ||||
|                 if(player.object != -1) { | ||||
|                     with(player.object) { | ||||
|                         instance_destroy(); | ||||
|                     } | ||||
|                     player.object = -1; | ||||
|                 } | ||||
|                 if(player.team==TEAM_RED) { | ||||
|                     player.team = TEAM_BLUE; | ||||
|                 } else { | ||||
|                     player.team = TEAM_RED; | ||||
|                 } | ||||
|                 if !instance_exists(Balancer) instance_create(x,y,Balancer); | ||||
|                 Balancer.name=player.name; | ||||
|                 with (Balancer) notice=1; | ||||
|             } | ||||
|             break; | ||||
|                    | ||||
|         case PLAYER_CHANGETEAM: | ||||
|             receiveCompleteMessage(global.serverSocket,2,global.tempBuffer); | ||||
|             player = ds_list_find_value(global.players, read_ubyte(global.tempBuffer)); | ||||
|             if(player.object != -1) { | ||||
|                 with(player.object) { | ||||
|                     instance_destroy(); | ||||
|                 } | ||||
|                 player.object = -1; | ||||
|             } | ||||
|             player.team = read_ubyte(global.tempBuffer); | ||||
|             break; | ||||
|               | ||||
|         case PLAYER_CHANGECLASS: | ||||
|             receiveCompleteMessage(global.serverSocket,2,global.tempBuffer); | ||||
|             player = ds_list_find_value(global.players, read_ubyte(global.tempBuffer)); | ||||
|             if(player.object != -1) { | ||||
|                 with(player.object) { | ||||
|                     instance_destroy(); | ||||
|                 } | ||||
|                 player.object = -1; | ||||
|             } | ||||
|             player.class = read_ubyte(global.tempBuffer); | ||||
|             break;              | ||||
|          | ||||
|         case PLAYER_CHANGENAME: | ||||
|             receiveCompleteMessage(global.serverSocket,1,global.tempBuffer); | ||||
|             player = ds_list_find_value(global.players, read_ubyte(global.tempBuffer)); | ||||
|             player.name = receivestring(global.serverSocket, 1); | ||||
|             if player=global.myself { | ||||
|                 global.playerName=player.name | ||||
|             } | ||||
|             break; | ||||
|                   | ||||
|         case PLAYER_SPAWN: | ||||
|             receiveCompleteMessage(global.serverSocket,3,global.tempBuffer); | ||||
|             player = ds_list_find_value(global.players, read_ubyte(global.tempBuffer)); | ||||
|             doEventSpawn(player, read_ubyte(global.tempBuffer), read_ubyte(global.tempBuffer)); | ||||
|             break; | ||||
|                | ||||
|         case CHAT_BUBBLE: | ||||
|             var bubbleImage; | ||||
|             receiveCompleteMessage(global.serverSocket,2,global.tempBuffer); | ||||
|             player = ds_list_find_value(global.players, read_ubyte(global.tempBuffer)); | ||||
|             setChatBubble(player, read_ubyte(global.tempBuffer)); | ||||
|             break; | ||||
|               | ||||
|         case BUILD_SENTRY: | ||||
|             receiveCompleteMessage(global.serverSocket,6,global.tempBuffer); | ||||
|             player = ds_list_find_value(global.players, read_ubyte(global.tempBuffer)); | ||||
|             buildSentry(player, read_ushort(global.tempBuffer)/5, read_ushort(global.tempBuffer)/5, read_byte(global.tempBuffer)); | ||||
|             break; | ||||
|                | ||||
|         case DESTROY_SENTRY: | ||||
|             receiveCompleteMessage(global.serverSocket,4,global.tempBuffer); | ||||
|             playerID = read_ubyte(global.tempBuffer); | ||||
|             otherPlayerID = read_ubyte(global.tempBuffer); | ||||
|             assistantPlayerID = read_ubyte(global.tempBuffer); | ||||
|             causeOfDeath = read_ubyte(global.tempBuffer); | ||||
|              | ||||
|             player = ds_list_find_value(global.players, playerID); | ||||
|             if(otherPlayerID == 255) { | ||||
|                 doEventDestruction(player, noone, noone, causeOfDeath); | ||||
|             } else { | ||||
|                 otherPlayer = ds_list_find_value(global.players, otherPlayerID); | ||||
|                 if (assistantPlayerID == 255) { | ||||
|                     doEventDestruction(player, otherPlayer, noone, causeOfDeath); | ||||
|                 } else { | ||||
|                     assistantPlayer = ds_list_find_value(global.players, assistantPlayerID); | ||||
|                     doEventDestruction(player, otherPlayer, assistantPlayer, causeOfDeath); | ||||
|                 } | ||||
|             } | ||||
|             break; | ||||
|                        | ||||
|         case GRAB_INTEL: | ||||
|             receiveCompleteMessage(global.serverSocket,1,global.tempBuffer); | ||||
|             player = ds_list_find_value(global.players, read_ubyte(global.tempBuffer)); | ||||
|             doEventGrabIntel(player); | ||||
|             break; | ||||
|        | ||||
|         case SCORE_INTEL: | ||||
|             receiveCompleteMessage(global.serverSocket,1,global.tempBuffer); | ||||
|             player = ds_list_find_value(global.players, read_ubyte(global.tempBuffer)); | ||||
|             doEventScoreIntel(player); | ||||
|             break; | ||||
|        | ||||
|         case DROP_INTEL: | ||||
|             receiveCompleteMessage(global.serverSocket,1,global.tempBuffer); | ||||
|             player = ds_list_find_value(global.players, read_ubyte(global.tempBuffer)); | ||||
|             doEventDropIntel(player);  | ||||
|             break; | ||||
|              | ||||
|         case RETURN_INTEL: | ||||
|             receiveCompleteMessage(global.serverSocket,1,global.tempBuffer); | ||||
|             doEventReturnIntel(read_ubyte(global.tempBuffer)); | ||||
|             break; | ||||
|    | ||||
|         case GENERATOR_DESTROY: | ||||
|             receiveCompleteMessage(global.serverSocket,1,global.tempBuffer); | ||||
|             team = read_ubyte(global.tempBuffer); | ||||
|             doEventGeneratorDestroy(team); | ||||
|             break; | ||||
|        | ||||
|         case UBER_CHARGED: | ||||
|             receiveCompleteMessage(global.serverSocket,1,global.tempBuffer); | ||||
|             player = ds_list_find_value(global.players, read_ubyte(global.tempBuffer)); | ||||
|             doEventUberReady(player); | ||||
|             break; | ||||
|    | ||||
|         case UBER: | ||||
|             receiveCompleteMessage(global.serverSocket,1,global.tempBuffer); | ||||
|             player = ds_list_find_value(global.players, read_ubyte(global.tempBuffer)); | ||||
|             doEventUber(player); | ||||
|             break;     | ||||
|    | ||||
|         case OMNOMNOMNOM: | ||||
|             receiveCompleteMessage(global.serverSocket,1,global.tempBuffer); | ||||
|             player = ds_list_find_value(global.players, read_ubyte(global.tempBuffer)); | ||||
|             if(player.object != -1) { | ||||
|                 with(player.object) { | ||||
|                     omnomnomnom=true; | ||||
|                     if(hp < 200) | ||||
|                     { | ||||
|                         canEat = false; | ||||
|                         alarm[6] = eatCooldown; //10 second cooldown | ||||
|                     } | ||||
|                     if(player.team == TEAM_RED) { | ||||
|                         omnomnomnomindex=0; | ||||
|                         omnomnomnomend=31; | ||||
|                     } else if(player.team==TEAM_BLUE) { | ||||
|                         omnomnomnomindex=32; | ||||
|                         omnomnomnomend=63; | ||||
|                     } | ||||
|                     xscale=image_xscale;  | ||||
|                 }  | ||||
|             } | ||||
|             break; | ||||
|        | ||||
|         case TOGGLE_ZOOM: | ||||
|             receiveCompleteMessage(global.serverSocket,1,global.tempBuffer); | ||||
|             player = ds_list_find_value(global.players, read_ubyte(global.tempBuffer)); | ||||
|             if player.object != -1 { | ||||
|                 toggleZoom(player.object); | ||||
|             } | ||||
|             break; | ||||
|                                           | ||||
|         case PASSWORD_REQUEST: | ||||
|             if(!usePreviousPwd) | ||||
|                 global.clientPassword = get_string("Enter Password:", ""); | ||||
|             write_ubyte(global.serverSocket, string_length(global.clientPassword)); | ||||
|             write_string(global.serverSocket, global.clientPassword); | ||||
|             socket_send(global.serverSocket); | ||||
|             break; | ||||
|         | ||||
|         case PASSWORD_WRONG:                                     | ||||
|             show_message("Incorrect Password."); | ||||
|             instance_destroy(); | ||||
|             exit; | ||||
|          | ||||
|         case INCOMPATIBLE_PROTOCOL: | ||||
|             show_message("Incompatible server protocol version."); | ||||
|             instance_destroy(); | ||||
|             exit; | ||||
|              | ||||
|         case KICK: | ||||
|             receiveCompleteMessage(global.serverSocket,1,global.tempBuffer); | ||||
|             reason = read_ubyte(global.tempBuffer); | ||||
|             if reason == KICK_NAME kickReason = "Name Exploit"; | ||||
|             else if reason == KICK_BAD_PLUGIN_PACKET kickReason = "Invalid plugin packet ID"; | ||||
|             else if reason == KICK_MULTI_CLIENT kickReason = "There are too many connections from your IP"; | ||||
|             else kickReason = ""; | ||||
|             show_message("You have been kicked from the server. "+kickReason+"."); | ||||
|             instance_destroy(); | ||||
|             exit; | ||||
|                | ||||
|         case ARENA_STARTROUND: | ||||
|             doEventArenaStartRound(); | ||||
|             break; | ||||
|              | ||||
|         case ARENA_ENDROUND: | ||||
|             with ArenaHUD clientArenaEndRound(); | ||||
|             break;    | ||||
|          | ||||
|         case ARENA_RESTART: | ||||
|             doEventArenaRestart(); | ||||
|             break; | ||||
|              | ||||
|         case UNLOCKCP: | ||||
|             doEventUnlockCP(); | ||||
|             break; | ||||
|                     | ||||
|         case MAP_END: | ||||
|             global.nextMap=receivestring(global.serverSocket, 1); | ||||
|             receiveCompleteMessage(global.serverSocket,2,global.tempBuffer); | ||||
|             global.winners=read_ubyte(global.tempBuffer); | ||||
|             global.currentMapArea=read_ubyte(global.tempBuffer); | ||||
|             global.mapchanging = true; | ||||
|             if !instance_exists(ScoreTableController) instance_create(0,0,ScoreTableController); | ||||
|             instance_create(0,0,WinBanner); | ||||
|             break; | ||||
|  | ||||
|         case CHANGE_MAP: | ||||
|             roomchange=true; | ||||
|             global.mapchanging = false; | ||||
|             global.currentMap = receivestring(global.serverSocket, 1); | ||||
|             global.currentMapMD5 = receivestring(global.serverSocket, 1); | ||||
|             if(global.currentMapMD5 == "") { // if this is an internal map (signified by the lack of an md5) | ||||
|                 if(findInternalMapRoom(global.currentMap)) | ||||
|                     room_goto_fix(findInternalMapRoom(global.currentMap)); | ||||
|                 else | ||||
|                 { | ||||
|                     show_message("Error:#Server went to invalid internal map: " + global.currentMap + "#Exiting."); | ||||
|                     instance_destroy(); | ||||
|                     exit; | ||||
|                 } | ||||
|             } else { // it's an external map | ||||
|                 if(string_pos("/", global.currentMap) != 0 or string_pos("\", global.currentMap) != 0) | ||||
|                 { | ||||
|                     show_message("Server sent illegal map name: "+global.currentMap); | ||||
|                     instance_destroy(); | ||||
|                     exit; | ||||
|                 } | ||||
|                 if(!file_exists("Maps/" + global.currentMap + ".png") or CustomMapGetMapMD5(global.currentMap) != global.currentMapMD5) | ||||
|                 {   // Reconnect to the server to download the map | ||||
|                     var oldReturnRoom; | ||||
|                     oldReturnRoom = returnRoom; | ||||
|                     returnRoom = DownloadRoom; | ||||
|                     if (global.serverPluginsInUse) | ||||
|                         noUnloadPlugins = true; | ||||
|                     event_perform(ev_destroy,0); | ||||
|                     ClientCreate(); | ||||
|                     if (global.serverPluginsInUse) | ||||
|                         noReloadPlugins = true; | ||||
|                     returnRoom = oldReturnRoom; | ||||
|                     usePreviousPwd = true; | ||||
|                     exit; | ||||
|                 } | ||||
|                 room_goto_fix(CustomMapRoom); | ||||
|             } | ||||
|                   | ||||
|             for(i=0; i<ds_list_size(global.players); i+=1) { | ||||
|                 player = ds_list_find_value(global.players, i); | ||||
|                 if global.currentMapArea == 1 {  | ||||
|                     player.stats[KILLS] = 0; | ||||
|                     player.stats[DEATHS] = 0; | ||||
|                     player.stats[CAPS] = 0; | ||||
|                     player.stats[ASSISTS] = 0; | ||||
|                     player.stats[DESTRUCTION] = 0; | ||||
|                     player.stats[STABS] = 0; | ||||
|                     player.stats[HEALING] = 0; | ||||
|                     player.stats[DEFENSES] = 0; | ||||
|                     player.stats[INVULNS] = 0; | ||||
|                     player.stats[BONUS] = 0; | ||||
|                     player.stats[DOMINATIONS] = 0; | ||||
|                     player.stats[REVENGE] = 0; | ||||
|                     player.stats[POINTS] = 0; | ||||
|                     player.roundStats[KILLS] = 0; | ||||
|                     player.roundStats[DEATHS] = 0; | ||||
|                     player.roundStats[CAPS] = 0; | ||||
|                     player.roundStats[ASSISTS] = 0; | ||||
|                     player.roundStats[DESTRUCTION] = 0; | ||||
|                     player.roundStats[STABS] = 0; | ||||
|                     player.roundStats[HEALING] = 0; | ||||
|                     player.roundStats[DEFENSES] = 0; | ||||
|                     player.roundStats[INVULNS] = 0; | ||||
|                     player.roundStats[BONUS] = 0; | ||||
|                     player.roundStats[DOMINATIONS] = 0; | ||||
|                     player.roundStats[REVENGE] = 0; | ||||
|                     player.roundStats[POINTS] = 0; | ||||
|                     player.team = TEAM_SPECTATOR; | ||||
|                 } | ||||
|             } | ||||
|             break; | ||||
|          | ||||
|         case SERVER_FULL: | ||||
|             show_message("The server is full."); | ||||
|             instance_destroy(); | ||||
|             exit; | ||||
|          | ||||
|         case REWARD_CHALLENGE_CODE: | ||||
|             var challengeData; | ||||
|             receiveCompleteMessage(global.serverSocket,16,global.tempBuffer); | ||||
|             challengeData = read_binstring(global.tempBuffer, buffer_size(global.tempBuffer)); | ||||
|             challengeData += socket_remote_ip(global.serverSocket); | ||||
|  | ||||
|             write_ubyte(global.serverSocket, REWARD_CHALLENGE_RESPONSE); | ||||
|             write_binstring(global.serverSocket, hmac_md5_bin(global.rewardKey, challengeData)); | ||||
|             socket_send(global.serverSocket); | ||||
|             break; | ||||
|  | ||||
|         case REWARD_UPDATE: | ||||
|             receiveCompleteMessage(global.serverSocket,1,global.tempBuffer); | ||||
|             player = ds_list_find_value(global.players, read_ubyte(global.tempBuffer)); | ||||
|             var rewardString; | ||||
|             rewardString = receivestring(global.serverSocket, 2); | ||||
|             doEventUpdateRewards(player, rewardString); | ||||
|             break; | ||||
|              | ||||
|         case MESSAGE_STRING: | ||||
|             var message, notice; | ||||
|             message = receivestring(global.serverSocket, 1); | ||||
|             with NoticeO instance_destroy(); | ||||
|             notice = instance_create(0, 0, NoticeO); | ||||
|             notice.notice = NOTICE_CUSTOM; | ||||
|             notice.message = message; | ||||
|             break; | ||||
|          | ||||
|         case SENTRY_POSITION: | ||||
|             receiveCompleteMessage(global.serverSocket,5,global.tempBuffer); | ||||
|             player = ds_list_find_value(global.players, read_ubyte(global.tempBuffer)); | ||||
|             if(player.sentry) | ||||
|             { | ||||
|                 player.sentry.x = read_ushort(global.tempBuffer) / 5; | ||||
|                 player.sentry.y = read_ushort(global.tempBuffer) / 5; | ||||
|                 player.sentry.xprevious = player.sentry.x; | ||||
|                 player.sentry.yprevious = player.sentry.y; | ||||
|                 player.sentry.vspeed = 0; | ||||
|             } | ||||
|             break; | ||||
|            | ||||
|         case WEAPON_FIRE: | ||||
|             receiveCompleteMessage(global.serverSocket,9,global.tempBuffer); | ||||
|             player = ds_list_find_value(global.players, read_ubyte(global.tempBuffer)); | ||||
|              | ||||
|             if(player.object) | ||||
|             { | ||||
|                 with(player.object) | ||||
|                 { | ||||
|                     x = read_ushort(global.tempBuffer)/5; | ||||
|                     y = read_ushort(global.tempBuffer)/5; | ||||
|                     hspeed = read_byte(global.tempBuffer)/8.5; | ||||
|                     vspeed = read_byte(global.tempBuffer)/8.5; | ||||
|                     xprevious = x; | ||||
|                     yprevious = y; | ||||
|                 } | ||||
|                  | ||||
|                 doEventFireWeapon(player, read_ushort(global.tempBuffer)); | ||||
|             } | ||||
|             break; | ||||
|  | ||||
|         case PLUGIN_PACKET: | ||||
|             var packetID, packetLen, buf, success; | ||||
|  | ||||
|             // fetch full packet | ||||
|             receiveCompleteMessage(global.serverSocket, 2, global.tempBuffer); | ||||
|             packetLen = read_ushort(global.tempBuffer); | ||||
|             receiveCompleteMessage(global.serverSocket, packetLen, global.tempBuffer); | ||||
|  | ||||
|             packetID = read_ubyte(global.tempBuffer); | ||||
|  | ||||
|             // get packet data | ||||
|             buf = buffer_create(); | ||||
|             write_buffer_part(buf, global.tempBuffer, packetLen - 1); | ||||
|  | ||||
|             // try to enqueue | ||||
|             // give "noone" value for client since received from server | ||||
|             success = _PluginPacketPush(packetID, buf, noone); | ||||
|              | ||||
|             // if it returned false, packetID was invalid | ||||
|             if (!success) | ||||
|             { | ||||
|                 // clear up buffer | ||||
|                 buffer_destroy(buf); | ||||
|                 show_error("ERROR when reading plugin packet: no such plugin packet ID " + string(packetID), true); | ||||
|             } | ||||
|             break; | ||||
|          | ||||
|         case CLIENT_SETTINGS: | ||||
|             receiveCompleteMessage(global.serverSocket,2,global.tempBuffer); | ||||
|             player = ds_list_find_value(global.players, read_ubyte(global.tempBuffer)); | ||||
|             player.queueJump = read_ubyte(global.tempBuffer); | ||||
|             break; | ||||
|  | ||||
|         default: | ||||
|             promptRestartOrQuit("The Server sent unexpected data."); | ||||
|             exit; | ||||
|         } | ||||
|     } else { | ||||
|         break; | ||||
|     } | ||||
| } until(roomchange); | ||||
							
								
								
									
										141
									
								
								samples/Game Maker Language/Create.gml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										141
									
								
								samples/Game Maker Language/Create.gml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,141 @@ | ||||
| /* | ||||
|     Originally from /Source/gg2/Objects/Updater.events/Create.xml in Gang Garrison 2 | ||||
|  | ||||
|     Copyright (C) 2008-2013 Faucet Software | ||||
|     http://www.ganggarrison.com | ||||
|  | ||||
|     This program is free software;  | ||||
|     you can redistribute it and/or modify it under the terms of the GNU General Public License | ||||
|     as published by the Free Software Foundation; either version 3 of the License, or (at your option) | ||||
|     any later version. | ||||
|     This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;  | ||||
|     without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  | ||||
|     See the GNU General Public License for more details. | ||||
|     You should have received a copy of the GNU General Public License along with this program; if not, | ||||
|     see <http://www.gnu.org/licenses>. | ||||
|  | ||||
|     Additional permission under GNU GPL version 3 section 7 | ||||
|     If you modify this Program, or any covered work, by linking or combining it with the Game Maker runtime library,  | ||||
|     the 39dll library/extension, Hobbel's Download Manager DLL, or modified versions of these libraries, | ||||
|     the licensors of this Program grant you additional permission to convey the resulting work. | ||||
| */ | ||||
| // Downloading code.  | ||||
|  | ||||
| var downloadHandle, url, tmpfile, window_oldshowborder, window_oldfullscreen; | ||||
| timeLeft = 0; | ||||
| counter = 0; | ||||
| AudioControlPlaySong(-1, false); | ||||
| window_oldshowborder = window_get_showborder(); | ||||
| window_oldfullscreen = window_get_fullscreen(); | ||||
| window_set_fullscreen(false); | ||||
| window_set_showborder(false); | ||||
|  | ||||
| if(global.updaterBetaChannel) | ||||
|     url = UPDATE_SOURCE_BETA; | ||||
| else | ||||
|     url = UPDATE_SOURCE; | ||||
|  | ||||
| tmpfile = temp_directory + "\gg2update.zip"; | ||||
|      | ||||
| downloadHandle = httpGet(url, -1); | ||||
|  | ||||
| while(!httpRequestStatus(downloadHandle))  | ||||
| { // while download isn't finished | ||||
|     sleep(floor(1000/30)); // sleep for the equivalent of one frame | ||||
|     io_handle(); // this prevents GameMaker from appearing locked-up | ||||
|     httpRequestStep(downloadHandle); | ||||
|      | ||||
|     // check if the user cancelled the download with the esc key | ||||
|     if(keyboard_check(vk_escape))  | ||||
|     { | ||||
|         httpRequestDestroy(downloadHandle); | ||||
|         window_set_showborder(window_oldshowborder); | ||||
|         window_set_fullscreen(window_oldfullscreen); | ||||
|         room_goto_fix(Menu); | ||||
|         exit; | ||||
|     } | ||||
|       | ||||
|     if(counter == 0 || counter mod 60 == 0) | ||||
|         timer = random(359)+1; | ||||
|     draw_sprite(UpdaterBackgroundS,0,0,0); | ||||
|     draw_set_color(c_white); | ||||
|     draw_set_halign(fa_left); | ||||
|     draw_set_valign(fa_center); | ||||
|     minutes=floor(timer/60); | ||||
|     seconds=floor(timer-minutes*60); | ||||
|     draw_text(x,y-20,string(minutes) + " minutes " + string(seconds) + " seconds Remaining..."); | ||||
|     counter+=1; | ||||
|     var progress, size; | ||||
|     progress = httpRequestResponseBodyProgress(downloadHandle); | ||||
|     size = httpRequestResponseBodySize(downloadHandle); | ||||
|     if (size != -1) | ||||
|     { | ||||
|         progressBar = floor((progress/size) * 20); | ||||
|         offset = 3; | ||||
|         for(i=0;i<progressBar;i+=1){ | ||||
|             draw_sprite(UpdaterProgressS,0,x+offset,y); | ||||
|             offset+=12; | ||||
|         } | ||||
|     } | ||||
|     screen_refresh(); | ||||
| } | ||||
| // Errored | ||||
| if (httpRequestStatus(downloadHandle) == 2) | ||||
| { | ||||
|     show_message("Downloading update failed!#" + httpRequestError(downloadHandle)); | ||||
|     httpRequestDestroy(downloadHandle); | ||||
|     window_set_showborder(window_oldshowborder); | ||||
|     window_set_fullscreen(window_oldfullscreen); | ||||
|     room_goto_fix(Menu); | ||||
|     exit; | ||||
| } | ||||
| // Request failed | ||||
| if (httpRequestStatusCode(downloadHandle) != 200) | ||||
| { | ||||
|     show_message("Downloading update failed!#" + string(httpRequestStatusCode(downloadHandle)) + " " + httpRequestReasonPhrase(downloadHandle)); | ||||
|     httpRequestDestroy(downloadHandle); | ||||
|     window_set_showborder(window_oldshowborder); | ||||
|     window_set_fullscreen(window_oldfullscreen); | ||||
|     room_goto_fix(Menu); | ||||
|     exit; | ||||
| } | ||||
|  | ||||
| write_buffer_to_file(httpRequestResponseBody(downloadHandle), tmpfile); | ||||
| httpRequestDestroy(downloadHandle); | ||||
|  | ||||
| if(!file_exists(tmpfile)) | ||||
| { | ||||
|     window_set_showborder(window_oldshowborder); | ||||
|     window_set_fullscreen(window_oldfullscreen); | ||||
|     show_message("Error updating: Missing gg2update.zip in temp directory, download failed(?)"); | ||||
|     room_goto_fix(Menu); | ||||
|     exit; | ||||
| } | ||||
|  | ||||
| // rename existing "Gang Garrison 2.exe" to avoid conflict when extracting | ||||
| if (file_exists("Gang Garrison 2.exe")) | ||||
| { | ||||
|     var newName, n; | ||||
|     n = 1; | ||||
|      | ||||
|     // increment until unused name found | ||||
|     do | ||||
|     { | ||||
|         newName = "gg2-old.delete.me." + string(n); | ||||
|         n += 1; | ||||
|     } | ||||
|     until(!file_exists(newName)); | ||||
|  | ||||
|     file_rename("Gang Garrison 2.exe", newName); | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
| // let's extract the downloaded file now. | ||||
| extractzip(tmpfile, working_directory); | ||||
|  | ||||
| // run new version     | ||||
| execute_program("Gang Garrison 2.exe", "", false); | ||||
|  | ||||
| // exit | ||||
| game_end(); | ||||
							
								
								
									
										161
									
								
								samples/Game Maker Language/Draw.gml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										161
									
								
								samples/Game Maker Language/Draw.gml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,161 @@ | ||||
| /* | ||||
|     Originally from /Source/gg2/Objects/InGameElements/Character.events/Draw.xml in Gang Garrison 2 | ||||
|  | ||||
|     Copyright (C) 2008-2013 Faucet Software | ||||
|     http://www.ganggarrison.com | ||||
|  | ||||
|     This program is free software;  | ||||
|     you can redistribute it and/or modify it under the terms of the GNU General Public License | ||||
|     as published by the Free Software Foundation; either version 3 of the License, or (at your option) | ||||
|     any later version. | ||||
|     This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;  | ||||
|     without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  | ||||
|     See the GNU General Public License for more details. | ||||
|     You should have received a copy of the GNU General Public License along with this program; if not, | ||||
|     see <http://www.gnu.org/licenses>. | ||||
|  | ||||
|     Additional permission under GNU GPL version 3 section 7 | ||||
|     If you modify this Program, or any covered work, by linking or combining it with the Game Maker runtime library,  | ||||
|     the 39dll library/extension, Hobbel's Download Manager DLL, or modified versions of these libraries, | ||||
|     the licensors of this Program grant you additional permission to convey the resulting work. | ||||
| */ | ||||
|  | ||||
| xoffset = view_xview[0]; | ||||
| yoffset = view_yview[0]; | ||||
| xsize = view_wview[0]; | ||||
| ysize = view_hview[0]; | ||||
|  | ||||
| if (distance_to_point(xoffset+xsize/2,yoffset+ysize/2) > 800) | ||||
|     exit; | ||||
|  | ||||
| var xr, yr; | ||||
| xr = round(x); | ||||
| yr = round(y); | ||||
|      | ||||
| image_alpha = cloakAlpha; | ||||
|  | ||||
| if (global.myself.team == team and canCloak) | ||||
|     image_alpha = cloakAlpha/2 + 0.5; | ||||
|  | ||||
| if (invisible) | ||||
|     exit; | ||||
|  | ||||
| if(stabbing) | ||||
|     image_alpha -= power(currentWeapon.stab.alpha, 2); | ||||
|  | ||||
| if team == global.myself.team && (player != global.myself || global.showHealthBar == 1){ | ||||
|     draw_set_alpha(1); | ||||
|     draw_healthbar(xr-10, yr-30, xr+10, yr-25,hp*100/maxHp,c_black,c_red,c_green,0,true,true); | ||||
| }     | ||||
| if(distance_to_point(mouse_x, mouse_y)<25) { | ||||
|     if cloak && team!=global.myself.team exit; | ||||
|     draw_set_alpha(1); | ||||
|     draw_set_halign(fa_center); | ||||
|     draw_set_valign(fa_bottom); | ||||
|     if(team==TEAM_RED) { | ||||
|         draw_set_color(c_red); | ||||
|     } else { | ||||
|         draw_set_color(c_blue); | ||||
|     } | ||||
|     draw_text(xr, yr-35, player.name); | ||||
|      | ||||
|     if(team == global.myself.team && global.showTeammateStats) | ||||
|     { | ||||
|         if(weapons[0] == Medigun) | ||||
|             draw_text(xr,yr+50, "Superburst: " + string(currentWeapon.uberCharge/20) + "%"); | ||||
|         else if(weapons[0] == Shotgun) | ||||
|             draw_text(xr,yr+50, "Nuts 'N' Bolts: " + string(nutsNBolts)); | ||||
|         else if(weapons[0] == Minegun) | ||||
|             draw_text(xr,yr+50, "Lobbed Mines: " + string(currentWeapon.lobbed)); | ||||
|     } | ||||
| }   | ||||
|  | ||||
| draw_set_alpha(1); | ||||
| if team == TEAM_RED ubercolour = c_red; | ||||
| if team == TEAM_BLUE ubercolour = c_blue; | ||||
|  | ||||
| var sprite, overlaySprite; | ||||
| if zoomed | ||||
| { | ||||
|     if (team == TEAM_RED) | ||||
|         sprite = SniperCrouchRedS; | ||||
|     else | ||||
|         sprite = SniperCrouchBlueS; | ||||
|     overlaySprite = sniperCrouchOverlay; | ||||
| } | ||||
| else | ||||
| { | ||||
|     sprite = sprite_index; | ||||
|     overlaySprite = overlay; | ||||
| } | ||||
|      | ||||
| if (omnomnomnom) | ||||
| { | ||||
|     draw_sprite_ext_overlay(omnomnomnomSprite,omnomnomnomOverlay,omnomnomnomindex,xr,yr,image_xscale,image_yscale,image_angle,c_white,1); | ||||
|     if (ubered) | ||||
|         draw_sprite_ext_overlay(omnomnomnomSprite,omnomnomnomOverlay,omnomnomnomindex,xr,yr,image_xscale,image_yscale,image_angle,ubercolour,0.7); | ||||
| } | ||||
| else if (taunting) | ||||
| { | ||||
|     draw_sprite_ext_overlay(tauntsprite,tauntOverlay,tauntindex,xr,yr,image_xscale,image_yscale,image_angle,c_white,1); | ||||
|     if (ubered) | ||||
|         draw_sprite_ext_overlay(tauntsprite,tauntOverlay,tauntindex,xr,yr,image_xscale,image_yscale,image_angle,ubercolour,0.7); | ||||
| } | ||||
| else if (player.humiliated) | ||||
|     draw_sprite_ext(humiliationPoses,floor(animationImage)+humiliationOffset,xr,yr,image_xscale,image_yscale,image_angle,c_white,image_alpha); | ||||
| else if (!taunting) | ||||
| { | ||||
|     if (cloak) | ||||
|     { | ||||
|         if (!ubered) | ||||
|             draw_sprite_ext(sprite,floor(animationImage+animationOffset),xr,yr,image_xscale,image_yscale,image_angle,c_white,image_alpha); | ||||
|         else if (ubered) | ||||
|         { | ||||
|             draw_sprite_ext(sprite,floor(animationImage+animationOffset),xr,yr,image_xscale,image_yscale,image_angle,c_white,1); | ||||
|             draw_sprite_ext(sprite,floor(animationImage+animationOffset),xr,yr,image_xscale,image_yscale,image_angle,ubercolour,0.7); | ||||
|         } | ||||
|     } | ||||
|     else | ||||
|     { | ||||
|         if (!ubered) | ||||
|             draw_sprite_ext_overlay(sprite,overlaySprite,floor(animationImage+animationOffset),xr,yr,image_xscale,image_yscale,image_angle,c_white,image_alpha); | ||||
|         else if (ubered) | ||||
|         { | ||||
|             draw_sprite_ext_overlay(sprite,overlaySprite,floor(animationImage+animationOffset),xr,yr,image_xscale,image_yscale,image_angle,c_white,1); | ||||
|             draw_sprite_ext_overlay(sprite,overlaySprite,floor(animationImage+animationOffset),xr,yr,image_xscale,image_yscale,image_angle,ubercolour,0.7); | ||||
|         } | ||||
|     } | ||||
| } | ||||
| if (burnDuration > 0 or burnIntensity > 0) { | ||||
|     for(i = 0; i < numFlames * burnIntensity / maxIntensity; i += 1) | ||||
|     { | ||||
|         draw_sprite_ext(FlameS, alarm[5] + i + random(2), x + flameArray_x[i], y + flameArray_y[i], 1, 1, 0, c_white, burnDuration / maxDuration * 0.71 + 0.35); | ||||
|     }   | ||||
| } | ||||
|  | ||||
| // Copied from Lorgan's itemserver "angels" with slight modifications | ||||
| // All credit be upon him | ||||
| if (demon != -1) | ||||
| { | ||||
|     demonX = median(x-40,demonX,x+40); | ||||
|     demonY = median(y-40,demonY,y); | ||||
|     demonOffset += demonDir; | ||||
|     if (abs(demonOffset) > 15) | ||||
|         demonDir *= -1; | ||||
|  | ||||
|     var dir; | ||||
|     if (demonX > x) | ||||
|         dir = -1; | ||||
|     else | ||||
|         dir = 1; | ||||
|  | ||||
|     if (demonFrame > sprite_get_number(demon)) | ||||
|         demonFrame = 0; | ||||
|  | ||||
|     if (stabbing || ubered) | ||||
|         draw_sprite_ext(demon,demonFrame+floor(animationImage)+7*player.team,demonX,demonY+demonOffset,dir*1,1,0,c_white,1); | ||||
|     else | ||||
|         draw_sprite_ext(demon,demonFrame+floor(animationImage)+7*player.team,demonX,demonY+demonOffset,dir*1,1,0,c_white,image_alpha); | ||||
|  | ||||
|     demonFrame += 1; | ||||
| } | ||||
							
								
								
									
										80
									
								
								samples/Game Maker Language/characterDrawEvent.gml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										80
									
								
								samples/Game Maker Language/characterDrawEvent.gml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,80 @@ | ||||
| // Originally from /spelunky/Scripts/Platform Engine/characterDrawEvent.gml in the Spelunky Community Update Project | ||||
|  | ||||
| /********************************************************************************** | ||||
|     Copyright (c) 2008, 2009 Derek Yu and Mossmouth, LLC | ||||
|      | ||||
|     This file is part of Spelunky. | ||||
|  | ||||
|     You can redistribute and/or modify Spelunky, including its source code, under | ||||
|     the terms of the Spelunky User License. | ||||
|  | ||||
|     Spelunky is distributed in the hope that it will be entertaining and useful, | ||||
|     but WITHOUT WARRANTY. Please see the Spelunky User License for more details. | ||||
|  | ||||
|     The Spelunky User License should be available in "Game Information", which | ||||
|     can be found in the Resource Explorer, or as an external file called COPYING. | ||||
|     If not, please obtain a new copy of Spelunky from <http://spelunkyworld.com/> | ||||
|      | ||||
| ***********************************************************************************/ | ||||
|  | ||||
| /* | ||||
| This event should be placed in the draw event of the platform character. | ||||
| */ | ||||
| //draws the sprite | ||||
| draw = true; | ||||
| if (facing == RIGHT) image_xscale = -1; | ||||
| else image_xscale = 1; | ||||
|  | ||||
| if (blinkToggle != 1) | ||||
| { | ||||
|     if ((state == CLIMBING or (sprite_index == sPExit or sprite_index == sDamselExit or sprite_index == sTunnelExit)) and global.hasJetpack and not whipping) | ||||
|     { | ||||
|         draw_sprite_ext(sprite_index, -1, x, y, image_xscale, image_yscale, image_angle, image_blend, image_alpha); | ||||
|         //draw_sprite(sprite_index,-1,x,y); | ||||
|         draw_sprite(sJetpackBack,-1,x,y); | ||||
|         draw = false; | ||||
|     } | ||||
|     else if (global.hasJetpack and facing == RIGHT) draw_sprite(sJetpackRight,-1,x-4,y-1); | ||||
|     else if (global.hasJetpack) draw_sprite(sJetpackLeft,-1,x+4,y-1); | ||||
|     if (draw) | ||||
|     { | ||||
|         if (redColor > 0) draw_sprite_ext(sprite_index, -1, x, y, image_xscale, image_yscale, image_angle, make_color_rgb(200 + redColor,0,0), image_alpha); | ||||
|         else draw_sprite_ext(sprite_index, -1, x, y, image_xscale, image_yscale, image_angle, image_blend, image_alpha); | ||||
|     } | ||||
|     if (facing == RIGHT) | ||||
|     { | ||||
|         if (holdArrow == ARROW_NORM) | ||||
|         { | ||||
|             draw_sprite(sArrowRight, -1, x+4, y+1); | ||||
|         } | ||||
|         else if (holdArrow == ARROW_BOMB) | ||||
|         { | ||||
|             if (holdArrowToggle) draw_sprite(sBombArrowRight, 0, x+4, y+2); | ||||
|             else draw_sprite(sBombArrowRight, 1, x+4, y+2); | ||||
|         } | ||||
|     } | ||||
|     else if (facing == LEFT) | ||||
|     { | ||||
|         if (holdArrow == ARROW_NORM) | ||||
|         { | ||||
|             draw_sprite(sArrowLeft, -1, x-4, y+1); | ||||
|         } | ||||
|         else if (holdArrow == ARROW_BOMB) | ||||
|         { | ||||
|             if (holdArrowToggle) draw_sprite(sBombArrowLeft, 0, x-4, y+2); | ||||
|             else draw_sprite(sBombArrowLeft, 1, x-4, y+2); | ||||
|         } | ||||
|     } | ||||
| } | ||||
| /* | ||||
| if canRun | ||||
| { | ||||
|   xOffset=80 | ||||
|   if player=1 | ||||
|     yOffset=120 | ||||
|   else | ||||
|     yOffset=143 | ||||
|   //draw the "flySpeed" bar, which shows how much speed the character has acquired while holding the "run" button | ||||
|   //draw_healthbar(view_xview[0]+224+xOffset,view_yview[0]+432+yOffset,view_xview[0]+400+xOffset,view_yview[0]+450+yOffset,flySpeed,make_color_rgb(0,64,128),c_blue,c_aqua,0,1,1) | ||||
| } | ||||
| */ | ||||
							
								
								
									
										1050
									
								
								samples/Game Maker Language/characterStepEvent.gml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1050
									
								
								samples/Game Maker Language/characterStepEvent.gml
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										251
									
								
								samples/Game Maker Language/doEventPlayerDeath.gml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										251
									
								
								samples/Game Maker Language/doEventPlayerDeath.gml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,251 @@ | ||||
| /* | ||||
|     Originally from /Source/gg2/Scripts/Events/doEventPlayerDeath.gml in Gang Garrison 2 | ||||
|  | ||||
|     Copyright (C) 2008-2013 Faucet Software | ||||
|     http://www.ganggarrison.com | ||||
|  | ||||
|     This program is free software;  | ||||
|     you can redistribute it and/or modify it under the terms of the GNU General Public License | ||||
|     as published by the Free Software Foundation; either version 3 of the License, or (at your option) | ||||
|     any later version. | ||||
|     This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;  | ||||
|     without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  | ||||
|     See the GNU General Public License for more details. | ||||
|     You should have received a copy of the GNU General Public License along with this program; if not, | ||||
|     see <http://www.gnu.org/licenses>. | ||||
|  | ||||
|     Additional permission under GNU GPL version 3 section 7 | ||||
|     If you modify this Program, or any covered work, by linking or combining it with the Game Maker runtime library,  | ||||
|     the 39dll library/extension, Hobbel's Download Manager DLL, or modified versions of these libraries, | ||||
|     the licensors of this Program grant you additional permission to convey the resulting work. | ||||
| */ | ||||
|  | ||||
| /** | ||||
|  * Perform the "player death" event, i.e. change the appropriate scores, | ||||
|  * destroy the character object to much splattering and so on. | ||||
|  * | ||||
|  * argument0: The player whose character died | ||||
|  * argument1: The player who inflicted the fatal damage (or noone for unknown) | ||||
|  * argument2: The player who assisted the kill (or noone for no assist) | ||||
|  * argument3: The source of the fatal damage | ||||
|  */ | ||||
| var victim, killer, assistant, damageSource; | ||||
| victim = argument0; | ||||
| killer = argument1; | ||||
| assistant = argument2; | ||||
| damageSource = argument3; | ||||
|  | ||||
| if(!instance_exists(killer)) | ||||
|     killer = noone; | ||||
|  | ||||
| if(!instance_exists(assistant)) | ||||
|     assistant = noone; | ||||
|  | ||||
| //************************************* | ||||
| //*      Scoring and Kill log | ||||
| //************************************* | ||||
|   | ||||
|  | ||||
| recordKillInLog(victim, killer, assistant, damageSource); | ||||
|  | ||||
| victim.stats[DEATHS] += 1; | ||||
| if(killer) | ||||
| { | ||||
|     if(damageSource == WEAPON_KNIFE || damageSource == WEAPON_BACKSTAB) | ||||
|     { | ||||
|         killer.stats[STABS] += 1; | ||||
|         killer.roundStats[STABS] += 1; | ||||
|         killer.stats[POINTS] += 1; | ||||
|         killer.roundStats[POINTS] +=1; | ||||
|     } | ||||
|      | ||||
|     if (victim.object.currentWeapon.object_index == Medigun) | ||||
|     { | ||||
|         if (victim.object.currentWeapon.uberReady) | ||||
|         { | ||||
|             killer.stats[BONUS] += 1; | ||||
|             killer.roundStats[BONUS] += 1; | ||||
|             killer.stats[POINTS] += 1; | ||||
|             killer.roundStats[POINTS] += 1; | ||||
|         } | ||||
|     } | ||||
|          | ||||
|     if (killer != victim) | ||||
|     { | ||||
|         killer.stats[KILLS] += 1; | ||||
|         killer.roundStats[KILLS] += 1; | ||||
|         killer.stats[POINTS] += 1; | ||||
|         killer.roundStats[POINTS] += 1; | ||||
|         if(victim.object.intel) | ||||
|         { | ||||
|             killer.stats[DEFENSES] += 1; | ||||
|             killer.roundStats[DEFENSES] += 1; | ||||
|             killer.stats[POINTS] += 1; | ||||
|             killer.roundStats[POINTS] += 1; | ||||
|             recordEventInLog(4, killer.team, killer.name, global.myself == killer); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| if (assistant) | ||||
| { | ||||
|     assistant.stats[ASSISTS] += 1; | ||||
|     assistant.roundStats[ASSISTS] += 1; | ||||
|     assistant.stats[POINTS] += .5; | ||||
|     assistant.roundStats[POINTS] += .5; | ||||
| } | ||||
|  | ||||
| //SPEC | ||||
| if (victim == global.myself) | ||||
|     instance_create(victim.object.x, victim.object.y, Spectator); | ||||
|  | ||||
| //************************************* | ||||
| //*         Gibbing | ||||
| //************************************* | ||||
| var xoffset, yoffset, xsize, ysize; | ||||
|  | ||||
| xoffset = view_xview[0]; | ||||
| yoffset = view_yview[0]; | ||||
| xsize = view_wview[0]; | ||||
| ysize = view_hview[0]; | ||||
|  | ||||
| randomize(); | ||||
| with(victim.object) { | ||||
|     if((damageSource == WEAPON_ROCKETLAUNCHER  | ||||
|     or damageSource == WEAPON_MINEGUN or damageSource == FRAG_BOX  | ||||
|     or damageSource == WEAPON_REFLECTED_STICKY or damageSource == WEAPON_REFLECTED_ROCKET  | ||||
|     or damageSource == FINISHED_OFF_GIB or damageSource == GENERATOR_EXPLOSION)  | ||||
|     and (player.class != CLASS_QUOTE) and (global.gibLevel>1)  | ||||
|     and distance_to_point(xoffset+xsize/2,yoffset+ysize/2) < 900) { | ||||
|         if (hasReward(victim, 'PumpkinGibs')) | ||||
|         { | ||||
|             repeat(global.gibLevel * 2) { | ||||
|                 createGib(x,y,PumpkinGib,hspeed,vspeed,random(145)-72, choose(0,1,1,2,2,3), false, true) | ||||
|             } | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             repeat(global.gibLevel) { | ||||
|                 createGib(x,y,Gib,hspeed,vspeed,random(145)-72, 0, false) | ||||
|             } | ||||
|             switch(player.team) | ||||
|             { | ||||
|             case TEAM_BLUE : | ||||
|                 repeat(global.gibLevel - 1) { | ||||
|                     createGib(x,y,BlueClump,hspeed,vspeed,random(145)-72, 0, false) | ||||
|                 } | ||||
|                 break; | ||||
|             case TEAM_RED : | ||||
|                 repeat(global.gibLevel - 1) { | ||||
|                     createGib(x,y,RedClump,hspeed,vspeed,random(145)-72, 0, false) | ||||
|                 } | ||||
|                 break; | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         repeat(global.gibLevel * 14) { | ||||
|             var blood; | ||||
|             blood = instance_create(x+random(23)-11,y+random(23)-11,BloodDrop); | ||||
|             blood.hspeed=(random(21)-10); | ||||
|             blood.vspeed=(random(21)-13); | ||||
|             if (hasReward(victim, 'PumpkinGibs')) | ||||
|             { | ||||
|                 blood.sprite_index = PumpkinJuiceS; | ||||
|             } | ||||
|         } | ||||
|         if (!hasReward(victim, 'PumpkinGibs')) | ||||
|         { | ||||
|             //All Classes gib head, hands, and feet | ||||
|             if(global.gibLevel > 2 || choose(0,1) == 1) | ||||
|                 createGib(x,y,Headgib,0,0,random(105)-52, player.class, false); | ||||
|             repeat(global.gibLevel -1){ | ||||
|                 //Medic has specially colored hands | ||||
|                 if (player.class == CLASS_MEDIC){ | ||||
|                     if (player.team == TEAM_RED) | ||||
|                         createGib(x,y,Hand, hspeed, vspeed, random(105)-52 , 9, false); | ||||
|                     else | ||||
|                         createGib(x,y,Hand, hspeed, vspeed, random(105)-52 , 10, false); | ||||
|                 }else{ | ||||
|                     createGib(x,y,Hand, hspeed, vspeed, random(105)-52 , player.class, false); | ||||
|                 } | ||||
|                 createGib(x,y,Feet,random(5)-2,random(3),random(13)-6 , player.class, true); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         //Class specific gibs | ||||
|         switch(player.class) { | ||||
|         case CLASS_PYRO : | ||||
|             if(global.gibLevel > 2 || choose(0,1) == 1) | ||||
|                 createGib(x,y,Accesory,hspeed,vspeed,random(105)-52, 4, false) | ||||
|             break; | ||||
|         case CLASS_SOLDIER : | ||||
|             if(global.gibLevel > 2 || choose(0,1) == 1){ | ||||
|                 switch(player.team) { | ||||
|                     case TEAM_BLUE : | ||||
|                         createGib(x,y,Accesory,hspeed,vspeed,random(105)-52, 2, false); | ||||
|                         break; | ||||
|                     case TEAM_RED : | ||||
|                         createGib(x,y,Accesory,hspeed,vspeed,random(105)-52, 1, false); | ||||
|                         break; | ||||
|                     } | ||||
|             } | ||||
|             break; | ||||
|         case CLASS_ENGINEER : | ||||
|             if(global.gibLevel > 2 || choose(0,1) == 1) | ||||
|                 createGib(x,y,Accesory,hspeed,vspeed,random(105)-52, 3, false) | ||||
|             break; | ||||
|         case CLASS_SNIPER : | ||||
|             if(global.gibLevel > 2 || choose(0,1) == 1) | ||||
|                 createGib(x,y,Accesory,hspeed,vspeed,random(105)-52, 0, false) | ||||
|             break; | ||||
|         } | ||||
|         playsound(x,y,Gibbing); | ||||
|     } else { | ||||
|         var deadbody; | ||||
|         if player.class != CLASS_QUOTE playsound(x,y,choose(DeathSnd1, DeathSnd2)); | ||||
|         deadbody = instance_create(x,y-30,DeadGuy); | ||||
|         // 'GS' reward - *G*olden *S*tatue | ||||
|         if(hasReward(player, 'GS')) | ||||
|         { | ||||
|             deadbody.sprite_index = haxxyStatue; | ||||
|             deadbody.image_index = 0; | ||||
|         } | ||||
|         else | ||||
|         {  | ||||
|             deadbody.sprite_index = sprite_index; | ||||
|             deadbody.image_index = CHARACTER_ANIMATION_DEAD; | ||||
|         } | ||||
|         deadbody.hspeed=hspeed; | ||||
|         deadbody.vspeed=vspeed; | ||||
|         if(hspeed>0) { | ||||
|             deadbody.image_xscale = -1;   | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| if (global.gg_birthday){ | ||||
|     myHat = instance_create(victim.object.x,victim.object.y,PartyHat); | ||||
|     myHat.image_index = victim.team; | ||||
| } | ||||
| if (global.xmas){ | ||||
|     myHat = instance_create(victim.object.x,victim.object.y,XmasHat); | ||||
|     myHat.image_index = victim.team; | ||||
| } | ||||
|  | ||||
|  | ||||
| with(victim.object) {        | ||||
|     instance_destroy(); | ||||
| } | ||||
|  | ||||
| //************************************* | ||||
| //*         Deathcam | ||||
| //************************************* | ||||
| if( global.killCam and victim == global.myself and killer and killer != victim and !(damageSource == KILL_BOX || damageSource == FRAG_BOX || damageSource == FINISHED_OFF || damageSource == FINISHED_OFF_GIB || damageSource == GENERATOR_EXPLOSION)) { | ||||
|     instance_create(0,0,DeathCam); | ||||
|     DeathCam.killedby=killer; | ||||
|     DeathCam.name=killer.name; | ||||
|     DeathCam.oldxview=view_xview[0]; | ||||
|     DeathCam.oldyview=view_yview[0]; | ||||
|     DeathCam.lastDamageSource=damageSource; | ||||
|     DeathCam.team = global.myself.team; | ||||
| } | ||||
							
								
								
									
										1469
									
								
								samples/Game Maker Language/faucet-http.gml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1469
									
								
								samples/Game Maker Language/faucet-http.gml
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										484
									
								
								samples/Game Maker Language/game_init.gml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										484
									
								
								samples/Game Maker Language/game_init.gml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,484 @@ | ||||
| /* | ||||
|     Originally from /Source/gg2/Scripts/game_init.gml in Gang Garrison 2 | ||||
|  | ||||
|     Copyright (C) 2008-2013 Faucet Software | ||||
|     http://www.ganggarrison.com | ||||
|  | ||||
|     This program is free software;  | ||||
|     you can redistribute it and/or modify it under the terms of the GNU General Public License | ||||
|     as published by the Free Software Foundation; either version 3 of the License, or (at your option) | ||||
|     any later version. | ||||
|     This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;  | ||||
|     without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  | ||||
|     See the GNU General Public License for more details. | ||||
|     You should have received a copy of the GNU General Public License along with this program; if not, | ||||
|     see <http://www.gnu.org/licenses>. | ||||
|  | ||||
|     Additional permission under GNU GPL version 3 section 7 | ||||
|     If you modify this Program, or any covered work, by linking or combining it with the Game Maker runtime library,  | ||||
|     the 39dll library/extension, Hobbel's Download Manager DLL, or modified versions of these libraries, | ||||
|     the licensors of this Program grant you additional permission to convey the resulting work. | ||||
| */ | ||||
|  | ||||
| // Returns true if the game is successfully initialized, false if there was an error and we should quit. | ||||
| { | ||||
|     instance_create(0,0,RoomChangeObserver); | ||||
|     set_little_endian_global(true); | ||||
|     if file_exists("game_errors.log") file_delete("game_errors.log"); | ||||
|     if file_exists("last_plugin.log") file_delete("last_plugin.log"); | ||||
|      | ||||
|     // Delete old left-over files created by the updater | ||||
|     var backupFilename; | ||||
|     backupFilename = file_find_first("gg2-old.delete.me.*", 0); | ||||
|     while(backupFilename != "") | ||||
|     { | ||||
|         file_delete(backupFilename); | ||||
|         backupFilename = file_find_next(); | ||||
|     } | ||||
|     file_find_close(); | ||||
|      | ||||
|     var customMapRotationFile, restart; | ||||
|     restart = false; | ||||
|  | ||||
|     //import wav files for music | ||||
|     global.MenuMusic=sound_add(choose("Music/menumusic1.wav","Music/menumusic2.wav","Music/menumusic3.wav","Music/menumusic4.wav","Music/menumusic5.wav","Music/menumusic6.wav"), 1, true); | ||||
|     global.IngameMusic=sound_add("Music/ingamemusic.wav", 1, true); | ||||
|     global.FaucetMusic=sound_add("Music/faucetmusic.wav", 1, true); | ||||
|     if(global.MenuMusic != -1) | ||||
|         sound_volume(global.MenuMusic, 0.8); | ||||
|     if(global.IngameMusic != -1) | ||||
|         sound_volume(global.IngameMusic, 0.8); | ||||
|     if(global.FaucetMusic != -1) | ||||
|         sound_volume(global.FaucetMusic, 0.8); | ||||
|          | ||||
|     global.sendBuffer = buffer_create(); | ||||
|     global.tempBuffer = buffer_create(); | ||||
|     global.HudCheck = false; | ||||
|     global.map_rotation = ds_list_create(); | ||||
|      | ||||
|     global.CustomMapCollisionSprite = -1; | ||||
|      | ||||
|     window_set_region_scale(-1, false); | ||||
|      | ||||
|     ini_open("gg2.ini"); | ||||
|     global.playerName = ini_read_string("Settings", "PlayerName", "Player"); | ||||
|     if string_count("#",global.playerName) > 0 global.playerName = "Player"; | ||||
|     global.playerName = string_copy(global.playerName, 0, min(string_length(global.playerName), MAX_PLAYERNAME_LENGTH)); | ||||
|     global.fullscreen = ini_read_real("Settings", "Fullscreen", 0); | ||||
|     global.useLobbyServer = ini_read_real("Settings", "UseLobby", 1); | ||||
|     global.hostingPort = ini_read_real("Settings", "HostingPort", 8190); | ||||
|     global.music = ini_read_real("Settings", "Music", ini_read_real("Settings", "IngameMusic", MUSIC_BOTH)); | ||||
|     global.playerLimit = ini_read_real("Settings", "PlayerLimit", 10); | ||||
|     //thy playerlimit shalt not exceed 48! | ||||
|     if (global.playerLimit > 48) | ||||
|     { | ||||
|         if (global.dedicatedMode != 1) | ||||
|             show_message("Warning: Player Limit cannot exceed 48. It has been set to 48"); | ||||
|         global.playerLimit = 48; | ||||
|         ini_write_real("Settings", "PlayerLimit", 48); | ||||
|     } | ||||
|     global.multiClientLimit = ini_read_real("Settings", "MultiClientLimit", 3); | ||||
|     global.particles =  ini_read_real("Settings", "Particles", PARTICLES_NORMAL); | ||||
|     global.gibLevel = ini_read_real("Settings", "Gib Level", 3); | ||||
|     global.killCam = ini_read_real("Settings", "Kill Cam", 1); | ||||
|     global.monitorSync = ini_read_real("Settings", "Monitor Sync", 0); | ||||
|     if global.monitorSync == 1 set_synchronization(true); | ||||
|     else set_synchronization(false); | ||||
|     global.medicRadar = ini_read_real("Settings", "Healer Radar", 1); | ||||
|     global.showHealer = ini_read_real("Settings", "Show Healer", 1); | ||||
|     global.showHealing = ini_read_real("Settings", "Show Healing", 1); | ||||
|     global.showHealthBar = ini_read_real("Settings", "Show Healthbar", 0); | ||||
|     global.showTeammateStats = ini_read_real("Settings", "Show Extra Teammate Stats", 0); | ||||
|     global.serverPluginsPrompt = ini_read_real("Settings", "ServerPluginsPrompt", 1); | ||||
|     global.restartPrompt = ini_read_real("Settings", "RestartPrompt", 1); | ||||
|     //user HUD settings | ||||
|     global.timerPos=ini_read_real("Settings","Timer Position", 0) | ||||
|     global.killLogPos=ini_read_real("Settings","Kill Log Position", 0) | ||||
|     global.kothHudPos=ini_read_real("Settings","KoTH HUD Position", 0) | ||||
|     global.clientPassword = ""; | ||||
|     // for admin menu | ||||
|     customMapRotationFile = ini_read_string("Server", "MapRotation", ""); | ||||
|     global.shuffleRotation = ini_read_real("Server", "ShuffleRotation", 1); | ||||
|     global.timeLimitMins = max(1, min(255, ini_read_real("Server", "Time Limit", 15))); | ||||
|     global.serverPassword = ini_read_string("Server", "Password", ""); | ||||
|     global.mapRotationFile = customMapRotationFile; | ||||
|     global.dedicatedMode = ini_read_real("Server", "Dedicated", 0); | ||||
|     global.serverName = ini_read_string("Server", "ServerName", "My Server"); | ||||
|     global.welcomeMessage = ini_read_string("Server", "WelcomeMessage", ""); | ||||
|     global.caplimit = max(1, min(255, ini_read_real("Server", "CapLimit", 5))); | ||||
|     global.caplimitBkup = global.caplimit; | ||||
|     global.autobalance = ini_read_real("Server", "AutoBalance",1); | ||||
|     global.Server_RespawntimeSec = ini_read_real("Server", "Respawn Time", 5); | ||||
|     global.rewardKey = unhex(ini_read_string("Haxxy", "RewardKey", "")); | ||||
|     global.rewardId = ini_read_string("Haxxy", "RewardId", ""); | ||||
|     global.mapdownloadLimitBps = ini_read_real("Server", "Total bandwidth limit for map downloads in bytes per second", 50000); | ||||
|     global.updaterBetaChannel = ini_read_real("General", "UpdaterBetaChannel", isBetaVersion()); | ||||
|     global.attemptPortForward = ini_read_real("Server", "Attempt UPnP Forwarding", 0);  | ||||
|     global.serverPluginList = ini_read_string("Server", "ServerPluginList", ""); | ||||
|     global.serverPluginsRequired = ini_read_real("Server", "ServerPluginsRequired", 0); | ||||
|     if (string_length(global.serverPluginList) > 254) { | ||||
|         show_message("Error: Server plugin list cannot exceed 254 characters"); | ||||
|         return false; | ||||
|     } | ||||
|     var CrosshairFilename, CrosshairRemoveBG; | ||||
|     CrosshairFilename = ini_read_string("Settings", "CrosshairFilename", ""); | ||||
|     CrosshairRemoveBG = ini_read_real("Settings", "CrosshairRemoveBG", 1); | ||||
|     global.queueJumping = ini_read_real("Settings", "Queued Jumping", 0); | ||||
|  | ||||
|     global.backgroundHash = ini_read_string("Background", "BackgroundHash", "default"); | ||||
|     global.backgroundTitle = ini_read_string("Background", "BackgroundTitle", ""); | ||||
|     global.backgroundURL = ini_read_string("Background", "BackgroundURL", ""); | ||||
|     global.backgroundShowVersion = ini_read_real("Background", "BackgroundShowVersion", true); | ||||
|      | ||||
|     readClasslimitsFromIni(); | ||||
|  | ||||
|     global.currentMapArea=1; | ||||
|     global.totalMapAreas=1; | ||||
|     global.setupTimer=1800; | ||||
|     global.joinedServerName=""; | ||||
|     global.serverPluginsInUse=false; | ||||
|     // Create plugin packet maps | ||||
|     global.pluginPacketBuffers = ds_map_create(); | ||||
|     global.pluginPacketPlayers = ds_map_create(); | ||||
|          | ||||
|     ini_write_string("Settings", "PlayerName", global.playerName); | ||||
|     ini_write_real("Settings", "Fullscreen", global.fullscreen); | ||||
|     ini_write_real("Settings", "UseLobby", global.useLobbyServer); | ||||
|     ini_write_real("Settings", "HostingPort", global.hostingPort); | ||||
|     ini_key_delete("Settings", "IngameMusic"); | ||||
|     ini_write_real("Settings", "Music", global.music); | ||||
|     ini_write_real("Settings", "PlayerLimit", global.playerLimit); | ||||
|     ini_write_real("Settings", "MultiClientLimit", global.multiClientLimit); | ||||
|     ini_write_real("Settings", "Particles", global.particles); | ||||
|     ini_write_real("Settings", "Gib Level", global.gibLevel); | ||||
|     ini_write_real("Settings", "Kill Cam", global.killCam); | ||||
|     ini_write_real("Settings", "Monitor Sync", global.monitorSync); | ||||
|     ini_write_real("Settings", "Healer Radar", global.medicRadar); | ||||
|     ini_write_real("Settings", "Show Healer", global.showHealer); | ||||
|     ini_write_real("Settings", "Show Healing", global.showHealing); | ||||
|     ini_write_real("Settings", "Show Healthbar", global.showHealthBar); | ||||
|     ini_write_real("Settings", "Show Extra Teammate Stats", global.showTeammateStats); | ||||
|     ini_write_real("Settings", "Timer Position", global.timerPos); | ||||
|     ini_write_real("Settings", "Kill Log Position", global.killLogPos); | ||||
|     ini_write_real("Settings", "KoTH HUD Position", global.kothHudPos); | ||||
|     ini_write_real("Settings", "ServerPluginsPrompt", global.serverPluginsPrompt); | ||||
|     ini_write_real("Settings", "RestartPrompt", global.restartPrompt); | ||||
|     ini_write_string("Server", "MapRotation", customMapRotationFile); | ||||
|     ini_write_real("Server", "ShuffleRotation", global.shuffleRotation); | ||||
|     ini_write_real("Server", "Dedicated", global.dedicatedMode); | ||||
|     ini_write_string("Server", "ServerName", global.serverName); | ||||
|     ini_write_string("Server", "WelcomeMessage", global.welcomeMessage); | ||||
|     ini_write_real("Server", "CapLimit", global.caplimit); | ||||
|     ini_write_real("Server", "AutoBalance", global.autobalance); | ||||
|     ini_write_real("Server", "Respawn Time", global.Server_RespawntimeSec); | ||||
|     ini_write_real("Server", "Total bandwidth limit for map downloads in bytes per second", global.mapdownloadLimitBps); | ||||
|     ini_write_real("Server", "Time Limit", global.timeLimitMins); | ||||
|     ini_write_string("Server", "Password", global.serverPassword); | ||||
|     ini_write_real("General", "UpdaterBetaChannel", global.updaterBetaChannel); | ||||
|     ini_write_real("Server", "Attempt UPnP Forwarding", global.attemptPortForward);  | ||||
|     ini_write_string("Server", "ServerPluginList", global.serverPluginList);  | ||||
|     ini_write_real("Server", "ServerPluginsRequired", global.serverPluginsRequired);  | ||||
|     ini_write_string("Settings", "CrosshairFilename", CrosshairFilename); | ||||
|     ini_write_real("Settings", "CrosshairRemoveBG", CrosshairRemoveBG); | ||||
|     ini_write_real("Settings", "Queued Jumping", global.queueJumping); | ||||
|  | ||||
|     ini_write_string("Background", "BackgroundHash", global.backgroundHash); | ||||
|     ini_write_string("Background", "BackgroundTitle", global.backgroundTitle); | ||||
|     ini_write_string("Background", "BackgroundURL", global.backgroundURL); | ||||
|     ini_write_real("Background", "BackgroundShowVersion", global.backgroundShowVersion); | ||||
|      | ||||
|     ini_write_real("Classlimits", "Scout", global.classlimits[CLASS_SCOUT]) | ||||
|     ini_write_real("Classlimits", "Pyro", global.classlimits[CLASS_PYRO]) | ||||
|     ini_write_real("Classlimits", "Soldier", global.classlimits[CLASS_SOLDIER]) | ||||
|     ini_write_real("Classlimits", "Heavy", global.classlimits[CLASS_HEAVY]) | ||||
|     ini_write_real("Classlimits", "Demoman", global.classlimits[CLASS_DEMOMAN]) | ||||
|     ini_write_real("Classlimits", "Medic", global.classlimits[CLASS_MEDIC]) | ||||
|     ini_write_real("Classlimits", "Engineer", global.classlimits[CLASS_ENGINEER]) | ||||
|     ini_write_real("Classlimits", "Spy", global.classlimits[CLASS_SPY]) | ||||
|     ini_write_real("Classlimits", "Sniper", global.classlimits[CLASS_SNIPER]) | ||||
|     ini_write_real("Classlimits", "Quote", global.classlimits[CLASS_QUOTE]) | ||||
|  | ||||
|     //screw the 0 index we will start with 1 | ||||
|     //map_truefort  | ||||
|     maps[1] = ini_read_real("Maps", "ctf_truefort", 1); | ||||
|     //map_2dfort  | ||||
|     maps[2] = ini_read_real("Maps", "ctf_2dfort", 2); | ||||
|     //map_conflict  | ||||
|     maps[3] = ini_read_real("Maps", "ctf_conflict", 3); | ||||
|     //map_classicwell  | ||||
|     maps[4] = ini_read_real("Maps", "ctf_classicwell", 4); | ||||
|     //map_waterway  | ||||
|     maps[5] = ini_read_real("Maps", "ctf_waterway", 5); | ||||
|     //map_orange  | ||||
|     maps[6] = ini_read_real("Maps", "ctf_orange", 6); | ||||
|     //map_dirtbowl | ||||
|     maps[7] = ini_read_real("Maps", "cp_dirtbowl", 7); | ||||
|     //map_egypt | ||||
|     maps[8] = ini_read_real("Maps", "cp_egypt", 8); | ||||
|     //arena_montane | ||||
|     maps[9] = ini_read_real("Maps", "arena_montane", 9); | ||||
|     //arena_lumberyard | ||||
|     maps[10] = ini_read_real("Maps", "arena_lumberyard", 10); | ||||
|     //gen_destroy | ||||
|     maps[11] = ini_read_real("Maps", "gen_destroy", 11); | ||||
|     //koth_valley | ||||
|     maps[12] = ini_read_real("Maps", "koth_valley", 12); | ||||
|     //koth_corinth | ||||
|     maps[13] = ini_read_real("Maps", "koth_corinth", 13); | ||||
|     //koth_harvest | ||||
|     maps[14] = ini_read_real("Maps", "koth_harvest", 14); | ||||
|     //dkoth_atalia | ||||
|     maps[15] = ini_read_real("Maps", "dkoth_atalia", 15); | ||||
|     //dkoth_sixties | ||||
|     maps[16] = ini_read_real("Maps", "dkoth_sixties", 16); | ||||
|      | ||||
|     //Server respawn time calculator. Converts each second to a frame. (read: multiply by 30 :hehe:) | ||||
|     if (global.Server_RespawntimeSec == 0) | ||||
|     { | ||||
|         global.Server_Respawntime = 1; | ||||
|     }     | ||||
|     else | ||||
|     { | ||||
|         global.Server_Respawntime = global.Server_RespawntimeSec * 30;     | ||||
|     }     | ||||
|      | ||||
|     // I have to include this, or the client'll complain about an unknown variable. | ||||
|     global.mapchanging = false; | ||||
|      | ||||
|     ini_write_real("Maps", "ctf_truefort", maps[1]); | ||||
|     ini_write_real("Maps", "ctf_2dfort", maps[2]); | ||||
|     ini_write_real("Maps", "ctf_conflict", maps[3]); | ||||
|     ini_write_real("Maps", "ctf_classicwell", maps[4]); | ||||
|     ini_write_real("Maps", "ctf_waterway", maps[5]); | ||||
|     ini_write_real("Maps", "ctf_orange", maps[6]); | ||||
|     ini_write_real("Maps", "cp_dirtbowl", maps[7]); | ||||
|     ini_write_real("Maps", "cp_egypt", maps[8]); | ||||
|     ini_write_real("Maps", "arena_montane", maps[9]); | ||||
|     ini_write_real("Maps", "arena_lumberyard", maps[10]); | ||||
|     ini_write_real("Maps", "gen_destroy", maps[11]); | ||||
|     ini_write_real("Maps", "koth_valley", maps[12]); | ||||
|     ini_write_real("Maps", "koth_corinth", maps[13]); | ||||
|     ini_write_real("Maps", "koth_harvest", maps[14]); | ||||
|     ini_write_real("Maps", "dkoth_atalia", maps[15]); | ||||
|     ini_write_real("Maps", "dkoth_sixties", maps[16]); | ||||
|  | ||||
|     ini_close(); | ||||
|      | ||||
|     // parse the protocol version UUID for later use | ||||
|     global.protocolUuid = buffer_create(); | ||||
|     parseUuid(PROTOCOL_UUID, global.protocolUuid); | ||||
|  | ||||
|     global.gg2lobbyId = buffer_create(); | ||||
|     parseUuid(GG2_LOBBY_UUID, global.gg2lobbyId); | ||||
|  | ||||
|     // Create abbreviations array for rewards use | ||||
|     initRewards() | ||||
|      | ||||
| var a, IPRaw, portRaw; | ||||
| doubleCheck=0; | ||||
| global.launchMap = ""; | ||||
|  | ||||
|     for(a = 1; a <= parameter_count(); a += 1)  | ||||
|     { | ||||
|         if (parameter_string(a) == "-dedicated") | ||||
|         { | ||||
|             global.dedicatedMode = 1; | ||||
|         } | ||||
|         else if (parameter_string(a) == "-restart") | ||||
|         { | ||||
|             restart = true; | ||||
|         } | ||||
|         else if (parameter_string(a) == "-server") | ||||
|         { | ||||
|             IPRaw = parameter_string(a+1); | ||||
|             if (doubleCheck == 1) | ||||
|             { | ||||
|                 doubleCheck = 2; | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 doubleCheck = 1; | ||||
|             } | ||||
|         } | ||||
|         else if (parameter_string(a) == "-port") | ||||
|         { | ||||
|             portRaw = parameter_string(a+1); | ||||
|             if (doubleCheck == 1) | ||||
|             { | ||||
|                 doubleCheck = 2; | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 doubleCheck = 1; | ||||
|             } | ||||
|         } | ||||
|         else if (parameter_string(a) == "-map") | ||||
|         { | ||||
|             global.launchMap = parameter_string(a+1); | ||||
|             global.dedicatedMode = 1; | ||||
|         } | ||||
|     } | ||||
|      | ||||
|     if (doubleCheck == 2) | ||||
|     { | ||||
|         global.serverPort = real(portRaw); | ||||
|         global.serverIP = IPRaw; | ||||
|         global.isHost = false; | ||||
|         instance_create(0,0,Client); | ||||
|     }    | ||||
|      | ||||
|     global.customMapdesginated = 0;     | ||||
|      | ||||
|     // if the user defined a valid map rotation file, then load from there | ||||
|  | ||||
|     if(customMapRotationFile != "" && file_exists(customMapRotationFile) && global.launchMap == "") { | ||||
|         global.customMapdesginated = 1; | ||||
|         var fileHandle, i, mapname; | ||||
|         fileHandle = file_text_open_read(customMapRotationFile); | ||||
|         for(i = 1; !file_text_eof(fileHandle); i += 1) { | ||||
|             mapname = file_text_read_string(fileHandle); | ||||
|             // remove leading whitespace from the string | ||||
|             while(string_char_at(mapname, 0) == " " || string_char_at(mapname, 0) == chr(9)) { // while it starts with a space or tab | ||||
|               mapname = string_delete(mapname, 0, 1); // delete that space or tab | ||||
|             } | ||||
|             if(mapname != "" && string_char_at(mapname, 0) != "#") { // if it's not blank and it's not a comment (starting with #) | ||||
|                 ds_list_add(global.map_rotation, mapname); | ||||
|             } | ||||
|             file_text_readln(fileHandle); | ||||
|         } | ||||
|         file_text_close(fileHandle); | ||||
|     } | ||||
|      | ||||
|      else if (global.launchMap != "") && (global.dedicatedMode == 1) | ||||
|         {   | ||||
|         ds_list_add(global.map_rotation, global.launchMap); | ||||
|         } | ||||
|      | ||||
|      else { // else load from the ini file Maps section | ||||
|         //Set up the map rotation stuff | ||||
|         var i, sort_list; | ||||
|         sort_list = ds_list_create(); | ||||
|         for(i=1; i <= 16; i += 1) { | ||||
|             if(maps[i] != 0) ds_list_add(sort_list, ((100*maps[i])+i)); | ||||
|         } | ||||
|         ds_list_sort(sort_list, 1); | ||||
|          | ||||
|         // translate the numbers back into the names they represent | ||||
|         for(i=0; i < ds_list_size(sort_list); i += 1) { | ||||
|             switch(ds_list_find_value(sort_list, i) mod 100) { | ||||
|                 case 1: | ||||
|                     ds_list_add(global.map_rotation, "ctf_truefort"); | ||||
|                 break; | ||||
|                 case 2: | ||||
|                     ds_list_add(global.map_rotation, "ctf_2dfort"); | ||||
|                 break; | ||||
|                 case 3: | ||||
|                     ds_list_add(global.map_rotation, "ctf_conflict"); | ||||
|                 break; | ||||
|                 case 4: | ||||
|                     ds_list_add(global.map_rotation, "ctf_classicwell"); | ||||
|                 break; | ||||
|                 case 5: | ||||
|                     ds_list_add(global.map_rotation, "ctf_waterway"); | ||||
|                 break; | ||||
|                 case 6: | ||||
|                     ds_list_add(global.map_rotation, "ctf_orange"); | ||||
|                 break; | ||||
|                 case 7: | ||||
|                     ds_list_add(global.map_rotation, "cp_dirtbowl"); | ||||
|                 break; | ||||
|                 case 8: | ||||
|                     ds_list_add(global.map_rotation, "cp_egypt"); | ||||
|                 break; | ||||
|                 case 9: | ||||
|                     ds_list_add(global.map_rotation, "arena_montane"); | ||||
|                 break; | ||||
|                 case 10: | ||||
|                     ds_list_add(global.map_rotation, "arena_lumberyard"); | ||||
|                 break; | ||||
|                 case 11: | ||||
|                     ds_list_add(global.map_rotation, "gen_destroy"); | ||||
|                 break; | ||||
|                 case 12: | ||||
|                     ds_list_add(global.map_rotation, "koth_valley"); | ||||
|                 break; | ||||
|                 case 13: | ||||
|                     ds_list_add(global.map_rotation, "koth_corinth"); | ||||
|                 break; | ||||
|                 case 14: | ||||
|                     ds_list_add(global.map_rotation, "koth_harvest"); | ||||
|                 break; | ||||
|                 case 15: | ||||
|                     ds_list_add(global.map_rotation, "dkoth_atalia"); | ||||
|                 break; | ||||
|                 case 16: | ||||
|                     ds_list_add(global.map_rotation, "dkoth_sixties"); | ||||
|                 break; | ||||
|                      | ||||
|             } | ||||
|         } | ||||
|         ds_list_destroy(sort_list); | ||||
|     } | ||||
|      | ||||
|     window_set_fullscreen(global.fullscreen); | ||||
|      | ||||
|     global.gg2Font = font_add_sprite(gg2FontS,ord("!"),false,0); | ||||
|     global.countFont = font_add_sprite(countFontS, ord("0"),false,2); | ||||
|     draw_set_font(global.gg2Font); | ||||
|     cursor_sprite = CrosshairS; | ||||
|      | ||||
|     if(!directory_exists(working_directory + "\Maps")) directory_create(working_directory + "\Maps"); | ||||
|      | ||||
|     instance_create(0, 0, AudioControl); | ||||
|     instance_create(0, 0, SSControl); | ||||
|      | ||||
|     // custom dialog box graphics | ||||
|     message_background(popupBackgroundB); | ||||
|     message_button(popupButtonS); | ||||
|     message_text_font("Century",9,c_white,1); | ||||
|     message_button_font("Century",9,c_white,1); | ||||
|     message_input_font("Century",9,c_white,0); | ||||
|      | ||||
|     //Key Mapping | ||||
|     ini_open("controls.gg2"); | ||||
|     global.jump = ini_read_real("Controls", "jump", ord("W")); | ||||
|     global.down = ini_read_real("Controls", "down", ord("S")); | ||||
|     global.left = ini_read_real("Controls", "left", ord("A")); | ||||
|     global.right = ini_read_real("Controls", "right", ord("D")); | ||||
|     global.attack = ini_read_real("Controls", "attack", MOUSE_LEFT); | ||||
|     global.special = ini_read_real("Controls", "special", MOUSE_RIGHT); | ||||
|     global.taunt = ini_read_real("Controls", "taunt", ord("F")); | ||||
|     global.chat1 = ini_read_real("Controls", "chat1", ord("Z")); | ||||
|     global.chat2 = ini_read_real("Controls", "chat2", ord("X")); | ||||
|     global.chat3 = ini_read_real("Controls", "chat3", ord("C")); | ||||
|     global.medic = ini_read_real("Controls", "medic", ord("E")); | ||||
|     global.drop = ini_read_real("Controls", "drop", ord("B")); | ||||
|     global.changeTeam = ini_read_real("Controls", "changeTeam", ord("N")); | ||||
|     global.changeClass = ini_read_real("Controls", "changeClass", ord("M")); | ||||
|     global.showScores = ini_read_real("Controls", "showScores", vk_shift); | ||||
|     ini_close(); | ||||
|      | ||||
|     calculateMonthAndDay(); | ||||
|  | ||||
|     if(!directory_exists(working_directory + "\Plugins")) directory_create(working_directory + "\Plugins"); | ||||
|     loadplugins(); | ||||
|      | ||||
|     /* Windows 8 is known to crash GM when more than three (?) sounds play at once | ||||
|      * We'll store the kernel version (Win8 is 6.2, Win7 is 6.1) and check it there. | ||||
|      ***/ | ||||
|     registry_set_root(1); // HKLM | ||||
|     global.NTKernelVersion = real(registry_read_string_ext("\SOFTWARE\Microsoft\Windows NT\CurrentVersion\", "CurrentVersion")); // SIC | ||||
|  | ||||
|     if (file_exists(CrosshairFilename)) | ||||
|     { | ||||
|         sprite_replace(CrosshairS,CrosshairFilename,1,CrosshairRemoveBG,false,0,0); | ||||
|         sprite_set_offset(CrosshairS,sprite_get_width(CrosshairS)/2,sprite_get_height(CrosshairS)/2); | ||||
|     } | ||||
|     if(global.dedicatedMode == 1) { | ||||
|         AudioControlToggleMute(); | ||||
|         room_goto_fix(Menu); | ||||
|     } else if(restart) { | ||||
|         room_goto_fix(Menu); | ||||
|     } | ||||
|     return true; | ||||
| } | ||||
							
								
								
									
										1861
									
								
								samples/Game Maker Language/jsonion.gml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1861
									
								
								samples/Game Maker Language/jsonion.gml
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										1169
									
								
								samples/Game Maker Language/jsonion_test.gml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1169
									
								
								samples/Game Maker Language/jsonion_test.gml
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										252
									
								
								samples/Game Maker Language/loadserverplugins.gml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										252
									
								
								samples/Game Maker Language/loadserverplugins.gml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,252 @@ | ||||
| /* | ||||
|     Originally from /Source/gg2/Scripts/Plugins/loadserverplugins.gml in Gang Garrison 2 | ||||
|  | ||||
|     Copyright (C) 2008-2013 Faucet Software | ||||
|     http://www.ganggarrison.com | ||||
|  | ||||
|     This program is free software;  | ||||
|     you can redistribute it and/or modify it under the terms of the GNU General Public License | ||||
|     as published by the Free Software Foundation; either version 3 of the License, or (at your option) | ||||
|     any later version. | ||||
|     This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;  | ||||
|     without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  | ||||
|     See the GNU General Public License for more details. | ||||
|     You should have received a copy of the GNU General Public License along with this program; if not, | ||||
|     see <http://www.gnu.org/licenses>. | ||||
|  | ||||
|     Additional permission under GNU GPL version 3 section 7 | ||||
|     If you modify this Program, or any covered work, by linking or combining it with the Game Maker runtime library,  | ||||
|     the 39dll library/extension, Hobbel's Download Manager DLL, or modified versions of these libraries, | ||||
|     the licensors of this Program grant you additional permission to convey the resulting work. | ||||
| */ | ||||
|  | ||||
| // loads plugins from ganggarrison.com asked for by server | ||||
| // argument0 - comma separated plugin list (pluginname@md5hash) | ||||
| // returns true on success, false on failure | ||||
| var list, hashList, text, i, pluginname, pluginhash, realhash, url, handle, filesize, progress, tempfile, tempdir, failed, lastContact, isCached; | ||||
|  | ||||
| failed = false; | ||||
| list = ds_list_create(); | ||||
| lastContact = 0; | ||||
| isCached = false; | ||||
| isDebug = false; | ||||
| hashList = ds_list_create(); | ||||
|  | ||||
| // split plugin list string | ||||
| list = split(argument0, ','); | ||||
|  | ||||
| // Split hashes from plugin names | ||||
| for (i = 0; i < ds_list_size(list); i += 1) | ||||
| { | ||||
|     text = ds_list_find_value(list, i); | ||||
|     pluginname = string_copy(text, 0, string_pos("@", text) - 1); | ||||
|     pluginhash = string_copy(text, string_pos("@", text) + 1, string_length(text) - string_pos("@", text)); | ||||
|     ds_list_replace(list, i, pluginname); | ||||
|     ds_list_add(hashList, pluginhash); | ||||
| } | ||||
|  | ||||
| // Check plugin names and check for duplicates | ||||
| for (i = 0; i < ds_list_size(list); i += 1) | ||||
| { | ||||
|     pluginname = ds_list_find_value(list, i); | ||||
|      | ||||
|     // invalid plugin name | ||||
|     if (!checkpluginname(pluginname)) | ||||
|     { | ||||
|         show_message('Error loading server-sent plugins - invalid plugin name:#"' + pluginname + '"'); | ||||
|         return false; | ||||
|     } | ||||
|     // is duplicate | ||||
|     else if (ds_list_find_index(list, pluginname) != i) | ||||
|     { | ||||
|         show_message('Error loading server-sent plugins - duplicate plugin:#"' + pluginname + '"'); | ||||
|         return false; | ||||
|     } | ||||
| } | ||||
|  | ||||
| // Download plugins | ||||
| for (i = 0; i < ds_list_size(list); i += 1) | ||||
| { | ||||
|     pluginname = ds_list_find_value(list, i); | ||||
|     pluginhash = ds_list_find_value(hashList, i); | ||||
|     isDebug = file_exists(working_directory + "\ServerPluginsDebug\" + pluginname + ".zip"); | ||||
|     isCached = file_exists(working_directory + "\ServerPluginsCache\" + pluginname + "@" + pluginhash); | ||||
|     tempfile = temp_directory + "\" + pluginname + ".zip.tmp"; | ||||
|     tempdir = temp_directory + "\" + pluginname + ".tmp"; | ||||
|  | ||||
|     // check to see if we have a local copy for debugging | ||||
|     if (isDebug) | ||||
|     { | ||||
|         file_copy(working_directory + "\ServerPluginsDebug\" + pluginname + ".zip", tempfile); | ||||
|         // show warning | ||||
|         if (global.isHost) | ||||
|         { | ||||
|             show_message( | ||||
|                 "Warning: server-sent plugin '" | ||||
|                 + pluginname | ||||
|                 + "' is being loaded from ServerPluginsDebug. Make sure clients have the same version, else they may be unable to connect." | ||||
|             ); | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             show_message( | ||||
|                 "Warning: server-sent plugin '" | ||||
|                 + pluginname | ||||
|                 + "' is being loaded from ServerPluginsDebug. Make sure the server has the same version, else you may be unable to connect." | ||||
|             ); | ||||
|         } | ||||
|     } | ||||
|     // otherwise, check if we have it cached | ||||
|     else if (isCached) | ||||
|     { | ||||
|         file_copy(working_directory + "\ServerPluginsCache\" + pluginname + "@" + pluginhash, tempfile); | ||||
|     } | ||||
|     // otherwise, download as usual | ||||
|     else | ||||
|     { | ||||
|         // construct the URL | ||||
|         // http://www.ganggarrison.com/plugins/$PLUGINNAME$@$PLUGINHASH$.zip) | ||||
|         url = PLUGIN_SOURCE + pluginname + "@" + pluginhash + ".zip"; | ||||
|          | ||||
|         // let's make the download handle | ||||
|         handle = httpGet(url, -1); | ||||
|          | ||||
|         // download it | ||||
|         while (!httpRequestStatus(handle)) { | ||||
|             // prevent game locking up | ||||
|             io_handle(); | ||||
|  | ||||
|             httpRequestStep(handle); | ||||
|              | ||||
|             if (!global.isHost) { | ||||
|                 // send ping if we haven't contacted server in 20 seconds | ||||
|                 // we need to do this to keep the connection open | ||||
|                 if (current_time-lastContact > 20000) { | ||||
|                     write_byte(global.serverSocket, PING); | ||||
|                     socket_send(global.serverSocket); | ||||
|                     lastContact = current_time; | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|             // draw progress bar since they may be waiting a while | ||||
|             filesize = httpRequestResponseBodySize(handle); | ||||
|             progress = httpRequestResponseBodyProgress(handle); | ||||
|             draw_background_ext(background_index[0], 0, 0, background_xscale[0], background_yscale[0], 0, c_white, 1); | ||||
|             draw_set_color(c_white); | ||||
|             draw_set_alpha(1); | ||||
|             draw_set_halign(fa_left); | ||||
|             draw_rectangle(50, 550, 300, 560, 2); | ||||
|             draw_text(50, 530, "Downloading server-sent plugin " + string(i + 1) + "/" + string(ds_list_size(list)) + ' - "' + pluginname + '"'); | ||||
|             if (filesize != -1) | ||||
|                 draw_rectangle(50, 550, 50 + progress / filesize * 250, 560, 0); | ||||
|             screen_refresh(); | ||||
|         } | ||||
|  | ||||
|         // errored | ||||
|         if (httpRequestStatus(handle) == 2) | ||||
|         { | ||||
|             show_message('Error loading server-sent plugins - download failed for "' + pluginname + '":#' + httpRequestError(handle)); | ||||
|             failed = true; | ||||
|             break; | ||||
|         } | ||||
|  | ||||
|         // request failed | ||||
|         if (httpRequestStatusCode(handle) != 200) | ||||
|         { | ||||
|             show_message('Error loading server-sent plugins - download failed for "' + pluginname + '":#' + string(httpRequestStatusCode(handle)) + ' ' + httpRequestReasonPhrase(handle)); | ||||
|             failed = true; | ||||
|             break; | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             write_buffer_to_file(httpRequestResponseBody(handle), tempfile); | ||||
|             if (!file_exists(tempfile)) | ||||
|             { | ||||
|                 show_message('Error loading server-sent plugins - download failed for "' + pluginname + '":# No such file?'); | ||||
|                 failed = true; | ||||
|                 break; | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         httpRequestDestroy(handle); | ||||
|     } | ||||
|  | ||||
|     // check file integrity | ||||
|     realhash = GG2DLL_compute_MD5(tempfile); | ||||
|     if (realhash != pluginhash) | ||||
|     { | ||||
|         show_message('Error loading server-sent plugins - integrity check failed (MD5 hash mismatch) for:#"' + pluginname + '"'); | ||||
|         failed = true; | ||||
|         break; | ||||
|     } | ||||
|      | ||||
|     // don't try to cache debug plugins | ||||
|     if (!isDebug) | ||||
|     { | ||||
|         // add to cache if we don't already have it | ||||
|         if (!file_exists(working_directory + "\ServerPluginsCache\" + pluginname + "@" + pluginhash)) | ||||
|         { | ||||
|             // make sure directory exists | ||||
|             if (!directory_exists(working_directory + "\ServerPluginsCache")) | ||||
|             { | ||||
|                 directory_create(working_directory + "\ServerPluginsCache"); | ||||
|             } | ||||
|             // store in cache | ||||
|             file_copy(tempfile, working_directory + "\ServerPluginsCache\" + pluginname + "@" + pluginhash); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     // let's get 7-zip to extract the files | ||||
|     extractzip(tempfile, tempdir); | ||||
|      | ||||
|     // if the directory doesn't exist, extracting presumably failed | ||||
|     if (!directory_exists(tempdir)) | ||||
|     { | ||||
|         show_message('Error loading server-sent plugins - extracting zip failed for:#"' + pluginname + '"'); | ||||
|         failed = true; | ||||
|         break; | ||||
|     } | ||||
| } | ||||
|  | ||||
| if (!failed) | ||||
| { | ||||
|     // Execute plugins | ||||
|     for (i = 0; i < ds_list_size(list); i += 1) | ||||
|     { | ||||
|         pluginname = ds_list_find_value(list, i); | ||||
|         tempdir = temp_directory + "\" + pluginname + ".tmp"; | ||||
|          | ||||
|         // Debugging facility, so we know *which* plugin caused compile/execute error | ||||
|         fp = file_text_open_write(working_directory + "\last_plugin.log"); | ||||
|         file_text_write_string(fp, pluginname); | ||||
|         file_text_close(fp); | ||||
|  | ||||
|         // packetID is (i), so make queues for it | ||||
|         ds_map_add(global.pluginPacketBuffers, i, ds_queue_create()); | ||||
|         ds_map_add(global.pluginPacketPlayers, i, ds_queue_create()); | ||||
|  | ||||
|         // Execute plugin | ||||
|         execute_file( | ||||
|             // the plugin's main gml file must be in the root of the zip | ||||
|             // it is called plugin.gml | ||||
|             tempdir + "\plugin.gml", | ||||
|             // the plugin needs to know where it is | ||||
|             // so the temporary directory is passed as first argument | ||||
|             tempdir, | ||||
|             // the plugin needs to know its packetID | ||||
|             // so it is passed as the second argument | ||||
|             i | ||||
|         ); | ||||
|     } | ||||
| } | ||||
|  | ||||
| // Delete last plugin log | ||||
| file_delete(working_directory + "\last_plugin.log"); | ||||
|  | ||||
| // Get rid of plugin list | ||||
| ds_list_destroy(list); | ||||
|  | ||||
| // Get rid of plugin hash list | ||||
| ds_list_destroy(hashList); | ||||
|  | ||||
| return !failed; | ||||
							
								
								
									
										384
									
								
								samples/Game Maker Language/processClientCommands.gml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										384
									
								
								samples/Game Maker Language/processClientCommands.gml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,384 @@ | ||||
| /* | ||||
|     Originally from /Source/gg2/Scripts/GameServer/processClientCommands.gml in Gang Garrison 2 | ||||
|  | ||||
|     Copyright (C) 2008-2013 Faucet Software | ||||
|     http://www.ganggarrison.com | ||||
|  | ||||
|     This program is free software;  | ||||
|     you can redistribute it and/or modify it under the terms of the GNU General Public License | ||||
|     as published by the Free Software Foundation; either version 3 of the License, or (at your option) | ||||
|     any later version. | ||||
|     This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;  | ||||
|     without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  | ||||
|     See the GNU General Public License for more details. | ||||
|     You should have received a copy of the GNU General Public License along with this program; if not, | ||||
|     see <http://www.gnu.org/licenses>. | ||||
|  | ||||
|     Additional permission under GNU GPL version 3 section 7 | ||||
|     If you modify this Program, or any covered work, by linking or combining it with the Game Maker runtime library,  | ||||
|     the 39dll library/extension, Hobbel's Download Manager DLL, or modified versions of these libraries, | ||||
|     the licensors of this Program grant you additional permission to convey the resulting work. | ||||
| */ | ||||
|  | ||||
| var player, playerId, commandLimitRemaining; | ||||
|  | ||||
| player = argument0; | ||||
| playerId = argument1; | ||||
|  | ||||
| // To prevent players from flooding the server, limit the number of commands to process per step and player. | ||||
| commandLimitRemaining = 10; | ||||
|  | ||||
| with(player) { | ||||
|     if(!variable_local_exists("commandReceiveState")) { | ||||
|         // 0: waiting for command byte. | ||||
|         // 1: waiting for command data length (1 byte) | ||||
|         // 2: waiting for command data. | ||||
|         commandReceiveState = 0; | ||||
|         commandReceiveExpectedBytes = 1; | ||||
|         commandReceiveCommand = 0; | ||||
|     } | ||||
| } | ||||
|  | ||||
| while(commandLimitRemaining > 0) { | ||||
|     var socket; | ||||
|     socket = player.socket; | ||||
|     if(!tcp_receive(socket, player.commandReceiveExpectedBytes)) { | ||||
|         return 0; | ||||
|     } | ||||
|      | ||||
|     switch(player.commandReceiveState) | ||||
|     { | ||||
|     case 0: | ||||
|         player.commandReceiveCommand = read_ubyte(socket); | ||||
|         switch(commandBytes[player.commandReceiveCommand]) { | ||||
|         case commandBytesInvalidCommand: | ||||
|             // Invalid byte received. Wait for another command byte. | ||||
|             break; | ||||
|              | ||||
|         case commandBytesPrefixLength1: | ||||
|             player.commandReceiveState = 1; | ||||
|             player.commandReceiveExpectedBytes = 1; | ||||
|             break; | ||||
|  | ||||
|         case commandBytesPrefixLength2: | ||||
|             player.commandReceiveState = 3; | ||||
|             player.commandReceiveExpectedBytes = 2; | ||||
|             break; | ||||
|  | ||||
|         default: | ||||
|             player.commandReceiveState = 2; | ||||
|             player.commandReceiveExpectedBytes = commandBytes[player.commandReceiveCommand]; | ||||
|             break; | ||||
|         } | ||||
|         break; | ||||
|          | ||||
|     case 1: | ||||
|         player.commandReceiveState = 2; | ||||
|         player.commandReceiveExpectedBytes = read_ubyte(socket); | ||||
|         break; | ||||
|  | ||||
|     case 3: | ||||
|         player.commandReceiveState = 2; | ||||
|         player.commandReceiveExpectedBytes = read_ushort(socket); | ||||
|         break; | ||||
|          | ||||
|     case 2: | ||||
|         player.commandReceiveState = 0; | ||||
|         player.commandReceiveExpectedBytes = 1; | ||||
|         commandLimitRemaining -= 1; | ||||
|          | ||||
|         switch(player.commandReceiveCommand) | ||||
|         { | ||||
|         case PLAYER_LEAVE: | ||||
|             socket_destroy(player.socket); | ||||
|             player.socket = -1; | ||||
|             break; | ||||
|              | ||||
|         case PLAYER_CHANGECLASS: | ||||
|             var class; | ||||
|             class = read_ubyte(socket); | ||||
|             if(getCharacterObject(player.team, class) != -1) | ||||
|             { | ||||
|                 if(player.object != -1) | ||||
|                 { | ||||
|                     with(player.object) | ||||
|                     { | ||||
|                         if (collision_point(x,y,SpawnRoom,0,0) < 0) | ||||
|                         { | ||||
|                             if (!instance_exists(lastDamageDealer) || lastDamageDealer == player) | ||||
|                             { | ||||
|                                 sendEventPlayerDeath(player, player, noone, BID_FAREWELL); | ||||
|                                 doEventPlayerDeath(player, player, noone, BID_FAREWELL); | ||||
|                             } | ||||
|                             else | ||||
|                             { | ||||
|                                 var assistant; | ||||
|                                 assistant = secondToLastDamageDealer; | ||||
|                                 if (lastDamageDealer.object) | ||||
|                                     if (lastDamageDealer.object.healer) | ||||
|                                         assistant = lastDamageDealer.object.healer; | ||||
|                                 sendEventPlayerDeath(player, lastDamageDealer, assistant, FINISHED_OFF); | ||||
|                                 doEventPlayerDeath(player, lastDamageDealer, assistant, FINISHED_OFF); | ||||
|                             } | ||||
|                         } | ||||
|                         else  | ||||
|                         instance_destroy();  | ||||
|                          | ||||
|                     } | ||||
|                 } | ||||
|                 else if(player.alarm[5]<=0) | ||||
|                     player.alarm[5] = 1; | ||||
|                 class = checkClasslimits(player, player.team, class); | ||||
|                 player.class = class; | ||||
|                 ServerPlayerChangeclass(playerId, player.class, global.sendBuffer); | ||||
|             } | ||||
|             break; | ||||
|              | ||||
|         case PLAYER_CHANGETEAM: | ||||
|             var newTeam, balance, redSuperiority; | ||||
|             newTeam = read_ubyte(socket); | ||||
|              | ||||
|             redSuperiority = 0   //calculate which team is bigger | ||||
|             with(Player) | ||||
|             { | ||||
|                 if(team == TEAM_RED) | ||||
|                     redSuperiority += 1; | ||||
|                 else if(team == TEAM_BLUE) | ||||
|                     redSuperiority -= 1; | ||||
|             } | ||||
|             if(redSuperiority > 0) | ||||
|                 balance = TEAM_RED; | ||||
|             else if(redSuperiority < 0) | ||||
|                 balance = TEAM_BLUE; | ||||
|             else | ||||
|                 balance = -1; | ||||
|              | ||||
|             if(balance != newTeam) | ||||
|             { | ||||
|                 if(getCharacterObject(newTeam, player.class) != -1 or newTeam==TEAM_SPECTATOR) | ||||
|                 {   | ||||
|                     if(player.object != -1) | ||||
|                     { | ||||
|                         with(player.object) | ||||
|                         { | ||||
|                             if (!instance_exists(lastDamageDealer) || lastDamageDealer == player) | ||||
|                             { | ||||
|                                 sendEventPlayerDeath(player, player, noone, BID_FAREWELL); | ||||
|                                 doEventPlayerDeath(player, player, noone, BID_FAREWELL); | ||||
|                             } | ||||
|                             else | ||||
|                             { | ||||
|                                 var assistant; | ||||
|                                 assistant = secondToLastDamageDealer; | ||||
|                                 if (lastDamageDealer.object) | ||||
|                                     if (lastDamageDealer.object.healer) | ||||
|                                         assistant = lastDamageDealer.object.healer; | ||||
|                                 sendEventPlayerDeath(player, lastDamageDealer, assistant, FINISHED_OFF); | ||||
|                                 doEventPlayerDeath(player, lastDamageDealer, assistant, FINISHED_OFF); | ||||
|                             } | ||||
|                         } | ||||
|                         player.alarm[5] = global.Server_Respawntime; | ||||
|                     } | ||||
|                     else if(player.alarm[5]<=0) | ||||
|                         player.alarm[5] = 1;                     | ||||
|                     var newClass; | ||||
|                     newClass = checkClasslimits(player, newTeam, player.class); | ||||
|                     if newClass != player.class | ||||
|                     { | ||||
|                         player.class = newClass; | ||||
|                         ServerPlayerChangeclass(playerId, player.class, global.sendBuffer); | ||||
|                     } | ||||
|                     player.team = newTeam; | ||||
|                     ServerPlayerChangeteam(playerId, player.team, global.sendBuffer); | ||||
|                     ServerBalanceTeams(); | ||||
|                 } | ||||
|             } | ||||
|             break;                    | ||||
|              | ||||
|         case CHAT_BUBBLE: | ||||
|             var bubbleImage; | ||||
|             bubbleImage = read_ubyte(socket); | ||||
|             if(global.aFirst) { | ||||
|                 bubbleImage = 0; | ||||
|             } | ||||
|             write_ubyte(global.sendBuffer, CHAT_BUBBLE); | ||||
|             write_ubyte(global.sendBuffer, playerId); | ||||
|             write_ubyte(global.sendBuffer, bubbleImage); | ||||
|              | ||||
|             setChatBubble(player, bubbleImage); | ||||
|             break; | ||||
|              | ||||
|         case BUILD_SENTRY: | ||||
|             if(player.object != -1) | ||||
|             { | ||||
|                 if(player.class == CLASS_ENGINEER | ||||
|                         and collision_circle(player.object.x, player.object.y, 50, Sentry, false, true) < 0 | ||||
|                         and player.object.nutsNBolts == 100 | ||||
|                         and (collision_point(player.object.x,player.object.y,SpawnRoom,0,0) < 0) | ||||
|                         and !player.sentry | ||||
|                         and !player.object.onCabinet) | ||||
|                 { | ||||
|                     write_ubyte(global.sendBuffer, BUILD_SENTRY); | ||||
|                     write_ubyte(global.sendBuffer, playerId); | ||||
|                     write_ushort(global.serializeBuffer, round(player.object.x*5)); | ||||
|                     write_ushort(global.serializeBuffer, round(player.object.y*5)); | ||||
|                     write_byte(global.serializeBuffer, player.object.image_xscale); | ||||
|                     buildSentry(player, player.object.x, player.object.y, player.object.image_xscale); | ||||
|                 } | ||||
|             } | ||||
|             break;                                        | ||||
|  | ||||
|         case DESTROY_SENTRY: | ||||
|             with(player.sentry) | ||||
|                 instance_destroy(); | ||||
|             break;                      | ||||
|          | ||||
|         case DROP_INTEL: | ||||
|             if (player.object != -1) | ||||
|             { | ||||
|                 if (player.object.intel) | ||||
|                 { | ||||
|                     sendEventDropIntel(player); | ||||
|                     doEventDropIntel(player); | ||||
|                 } | ||||
|             } | ||||
|             break;      | ||||
|                | ||||
|         case OMNOMNOMNOM: | ||||
|             if(player.object != -1) { | ||||
|                 if(!player.humiliated | ||||
|                     and !player.object.taunting | ||||
|                     and !player.object.omnomnomnom | ||||
|                     and player.object.canEat | ||||
|                     and player.class==CLASS_HEAVY) | ||||
|                 {                             | ||||
|                     write_ubyte(global.sendBuffer, OMNOMNOMNOM); | ||||
|                     write_ubyte(global.sendBuffer, playerId); | ||||
|                     with(player.object) | ||||
|                     { | ||||
|                         omnomnomnom = true; | ||||
|                         if player.team == TEAM_RED { | ||||
|                             omnomnomnomindex=0; | ||||
|                             omnomnomnomend=31; | ||||
|                         } else if player.team==TEAM_BLUE { | ||||
|                             omnomnomnomindex=32; | ||||
|                             omnomnomnomend=63; | ||||
|                         }  | ||||
|                         xscale=image_xscale; | ||||
|                     }              | ||||
|                 } | ||||
|             } | ||||
|             break; | ||||
|               | ||||
|         case TOGGLE_ZOOM: | ||||
|             if player.object != -1 { | ||||
|                 if player.class == CLASS_SNIPER { | ||||
|                     write_ubyte(global.sendBuffer, TOGGLE_ZOOM); | ||||
|                     write_ubyte(global.sendBuffer, playerId); | ||||
|                     toggleZoom(player.object); | ||||
|                 } | ||||
|             } | ||||
|             break; | ||||
|                                                        | ||||
|         case PLAYER_CHANGENAME: | ||||
|             var nameLength; | ||||
|             nameLength = socket_receivebuffer_size(socket); | ||||
|             if(nameLength > MAX_PLAYERNAME_LENGTH) | ||||
|             { | ||||
|                 write_ubyte(player.socket, KICK); | ||||
|                 write_ubyte(player.socket, KICK_NAME); | ||||
|                 socket_destroy(player.socket); | ||||
|                 player.socket = -1; | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 with(player) | ||||
|                 { | ||||
|                     if(variable_local_exists("lastNamechange"))  | ||||
|                         if(current_time - lastNamechange < 1000) | ||||
|                             break; | ||||
|                     lastNamechange = current_time; | ||||
|                     name = read_string(socket, nameLength); | ||||
|                     if(string_count("#",name) > 0) | ||||
|                     { | ||||
|                         name = "I <3 Bacon"; | ||||
|                     } | ||||
|                     write_ubyte(global.sendBuffer, PLAYER_CHANGENAME); | ||||
|                     write_ubyte(global.sendBuffer, playerId); | ||||
|                     write_ubyte(global.sendBuffer, string_length(name)); | ||||
|                     write_string(global.sendBuffer, name); | ||||
|                 } | ||||
|             } | ||||
|             break; | ||||
|              | ||||
|         case INPUTSTATE: | ||||
|             if(player.object != -1) | ||||
|             { | ||||
|                 with(player.object) | ||||
|                 { | ||||
|                     keyState = read_ubyte(socket); | ||||
|                     netAimDirection = read_ushort(socket); | ||||
|                     aimDirection = netAimDirection*360/65536; | ||||
|                     event_user(1); | ||||
|                 } | ||||
|             } | ||||
|             break; | ||||
|          | ||||
|         case REWARD_REQUEST: | ||||
|             player.rewardId = read_string(socket, socket_receivebuffer_size(socket)); | ||||
|             player.challenge = rewardCreateChallenge(); | ||||
|              | ||||
|             write_ubyte(socket, REWARD_CHALLENGE_CODE); | ||||
|             write_binstring(socket, player.challenge); | ||||
|             break; | ||||
|              | ||||
|         case REWARD_CHALLENGE_RESPONSE: | ||||
|             var answer, i, authbuffer; | ||||
|             answer = read_binstring(socket, 16); | ||||
|              | ||||
|             with(player) | ||||
|                 if(variable_local_exists("challenge") and variable_local_exists("rewardId")) | ||||
|                     rewardAuthStart(player, answer, challenge, true, rewardId); | ||||
|             | ||||
|             break; | ||||
|  | ||||
|         case PLUGIN_PACKET: | ||||
|             var packetID, buf, success; | ||||
|  | ||||
|             packetID = read_ubyte(socket); | ||||
|              | ||||
|             // get packet data | ||||
|             buf = buffer_create(); | ||||
|             write_buffer_part(buf, socket, socket_receivebuffer_size(socket)); | ||||
|  | ||||
|             // try to enqueue | ||||
|             success = _PluginPacketPush(packetID, buf, player); | ||||
|              | ||||
|             // if it returned false, packetID was invalid | ||||
|             if (!success) | ||||
|             { | ||||
|                 // clear up buffer | ||||
|                 buffer_destroy(buf); | ||||
|  | ||||
|                 // kick player | ||||
|                 write_ubyte(player.socket, KICK); | ||||
|                 write_ubyte(player.socket, KICK_BAD_PLUGIN_PACKET); | ||||
|                 socket_destroy(player.socket); | ||||
|                 player.socket = -1; | ||||
|             } | ||||
|             break; | ||||
|              | ||||
|         case CLIENT_SETTINGS: | ||||
|             var mirror; | ||||
|             mirror = read_ubyte(player.socket); | ||||
|             player.queueJump = mirror; | ||||
|              | ||||
|             write_ubyte(global.sendBuffer, CLIENT_SETTINGS); | ||||
|             write_ubyte(global.sendBuffer, playerId); | ||||
|             write_ubyte(global.sendBuffer, mirror); | ||||
|             break; | ||||
|          | ||||
|         } | ||||
|         break; | ||||
|     }  | ||||
| } | ||||
							
								
								
									
										298
									
								
								samples/Game Maker Language/scrInitLevel.gml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										298
									
								
								samples/Game Maker Language/scrInitLevel.gml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,298 @@ | ||||
| // Originally from /spelunky/Scripts/Level Generation/scrInitLevel.gml in the Spelunky Community Update Project | ||||
|  | ||||
| // | ||||
| // scrInitLevel() | ||||
| // | ||||
| // Calls scrLevelGen(), scrRoomGen*(), and scrEntityGen() to build level. | ||||
| // | ||||
|  | ||||
| /********************************************************************************** | ||||
|     Copyright (c) 2008, 2009 Derek Yu and Mossmouth, LLC | ||||
|      | ||||
|     This file is part of Spelunky. | ||||
|  | ||||
|     You can redistribute and/or modify Spelunky, including its source code, under | ||||
|     the terms of the Spelunky User License. | ||||
|  | ||||
|     Spelunky is distributed in the hope that it will be entertaining and useful, | ||||
|     but WITHOUT WARRANTY.  Please see the Spelunky User License for more details. | ||||
|  | ||||
|     The Spelunky User License should be available in "Game Information", which | ||||
|     can be found in the Resource Explorer, or as an external file called COPYING. | ||||
|     If not, please obtain a new copy of Spelunky from <http://spelunkyworld.com/> | ||||
|      | ||||
| ***********************************************************************************/ | ||||
|  | ||||
| global.levelType = 0; | ||||
| //global.currLevel = 16; | ||||
| if (global.currLevel > 4 and global.currLevel < 9) global.levelType = 1; | ||||
| if (global.currLevel > 8 and global.currLevel < 13) global.levelType = 2; | ||||
| if (global.currLevel > 12 and global.currLevel < 16) global.levelType = 3; | ||||
| if (global.currLevel == 16) global.levelType = 4; | ||||
|  | ||||
| if (global.currLevel <= 1 or | ||||
|     global.currLevel == 5 or | ||||
|     global.currLevel == 9 or | ||||
|     global.currLevel == 13) | ||||
| { | ||||
|     global.hadDarkLevel = false; | ||||
| } | ||||
|  | ||||
| // global.levelType = 3; // debug | ||||
|  | ||||
| // DEBUG MODE // | ||||
| /* | ||||
| if (global.currLevel == 2) global.levelType = 4; | ||||
| if (global.currLevel == 3) global.levelType = 2; | ||||
| if (global.currLevel == 4) global.levelType = 3; | ||||
| if (global.currLevel == 5) global.levelType = 4; | ||||
| */ | ||||
|  | ||||
| // global.levelType = 0; | ||||
|  | ||||
| global.startRoomX = 0; | ||||
| global.startRoomY = 0; | ||||
| global.endRoomX = 0; | ||||
| global.endRoomY = 0; | ||||
| oGame.levelGen = false; | ||||
|  | ||||
| // this is used to determine the path to the exit (generally no bombs required) | ||||
| for (i = 0; i < 4; i += 1) | ||||
| { | ||||
|     for (j = 0; j < 4; j += 1) | ||||
|     { | ||||
|         global.roomPath[i,j] = 0; | ||||
|     } | ||||
| } | ||||
|  | ||||
| // side walls | ||||
| if (global.levelType == 4) | ||||
|     k = 54; | ||||
| else if (global.levelType == 2) | ||||
|     k = 38; | ||||
| else if (global.lake) | ||||
|     k = 41; | ||||
| else | ||||
|     k = 33; | ||||
| for (i = 0; i <= 42; i += 1) | ||||
| { | ||||
|     for (j = 0; j <= k; j += 1) | ||||
|     { | ||||
|         if (not isLevel()) | ||||
|         { | ||||
|             i = 999; | ||||
|             j = 999; | ||||
|         } | ||||
|         else if (global.levelType == 2) | ||||
|         { | ||||
|             if (i*16 == 0 or | ||||
|                 i*16 == 656 or | ||||
|                 j*16 == 0) | ||||
|             { | ||||
|                 obj = instance_create(i*16, j*16, oDark); | ||||
|                 obj.invincible = true; | ||||
|                 obj.sprite_index = sDark; | ||||
|             } | ||||
|         } | ||||
|         else if (global.levelType == 4) | ||||
|         { | ||||
|             if (i*16 == 0 or | ||||
|                 i*16 == 656 or | ||||
|                 j*16 == 0) | ||||
|             { | ||||
|                 obj = instance_create(i*16, j*16, oTemple); | ||||
|                 obj.invincible = true; | ||||
|                 if (not global.cityOfGold) obj.sprite_index = sTemple; | ||||
|             } | ||||
|         } | ||||
|         else if (global.lake) | ||||
|         { | ||||
|             if (i*16 == 0 or | ||||
|                 i*16 == 656 or | ||||
|                 j*16 == 0 or | ||||
|                 j*16 >= 656) | ||||
|             { | ||||
|                 obj = instance_create(i*16, j*16, oLush); obj.sprite_index = sLush; | ||||
|                 obj.invincible = true; | ||||
|             } | ||||
|         } | ||||
|         else if (i*16 == 0 or | ||||
|             i*16 == 656 or | ||||
|             j*16 == 0 or | ||||
|             j*16 >= 528) | ||||
|         { | ||||
|             if (global.levelType == 0) { obj = instance_create(i*16, j*16, oBrick); obj.sprite_index = sBrick; } | ||||
|             else if (global.levelType == 1) { obj = instance_create(i*16, j*16, oLush); obj.sprite_index = sLush; } | ||||
|             else { obj = instance_create(i*16, j*16, oTemple); if (not global.cityOfGold) obj.sprite_index = sTemple; } | ||||
|             obj.invincible = true; | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| if (global.levelType == 2) | ||||
| { | ||||
|     for (i = 0; i <= 42; i += 1) | ||||
|     { | ||||
|         instance_create(i*16, 40*16, oDark); | ||||
|         //instance_create(i*16, 35*16, oSpikes); | ||||
|     } | ||||
| } | ||||
|  | ||||
| if (global.levelType == 3) | ||||
| { | ||||
|     background_index = bgTemple; | ||||
| } | ||||
|  | ||||
| global.temp1 = global.gameStart; | ||||
| scrLevelGen(); | ||||
|  | ||||
| global.cemetary = false; | ||||
| if (global.levelType == 1 and rand(1,global.probCemetary) == 1) global.cemetary = true; | ||||
|  | ||||
| with oRoom | ||||
| { | ||||
|     if (global.levelType == 0) scrRoomGen(); | ||||
|     else if (global.levelType == 1) | ||||
|     { | ||||
|         if (global.blackMarket) scrRoomGenMarket(); | ||||
|         else scrRoomGen2(); | ||||
|     } | ||||
|     else if (global.levelType == 2) | ||||
|     { | ||||
|         if (global.yetiLair) scrRoomGenYeti(); | ||||
|         else scrRoomGen3(); | ||||
|     } | ||||
|     else if (global.levelType == 3) scrRoomGen4(); | ||||
|     else scrRoomGen5(); | ||||
| } | ||||
|  | ||||
| global.darkLevel = false; | ||||
| //if (not global.hadDarkLevel and global.currLevel != 0 and global.levelType != 2 and global.currLevel != 16 and rand(1,1) == 1) | ||||
| if (not global.hadDarkLevel and not global.noDarkLevel and global.currLevel != 0 and global.currLevel != 1 and global.levelType != 2 and global.currLevel != 16 and rand(1,global.probDarkLevel) == 1) | ||||
| { | ||||
|     global.darkLevel = true; | ||||
|     global.hadDarkLevel = true; | ||||
|     //instance_create(oPlayer1.x, oPlayer1.y, oFlare); | ||||
| } | ||||
|  | ||||
| if (global.blackMarket) global.darkLevel = false; | ||||
|  | ||||
| global.genUdjatEye = false; | ||||
| if (not global.madeUdjatEye) | ||||
| { | ||||
|     if (global.currLevel == 2 and rand(1,3) == 1) global.genUdjatEye = true; | ||||
|     else if (global.currLevel == 3 and rand(1,2) == 1) global.genUdjatEye = true; | ||||
|     else if (global.currLevel == 4) global.genUdjatEye = true; | ||||
| } | ||||
|  | ||||
| global.genMarketEntrance = false; | ||||
| if (not global.madeMarketEntrance) | ||||
| { | ||||
|     if (global.currLevel == 5 and rand(1,3) == 1) global.genMarketEntrance = true; | ||||
|     else if (global.currLevel == 6 and rand(1,2) == 1) global.genMarketEntrance = true; | ||||
|     else if (global.currLevel == 7) global.genMarketEntrance = true; | ||||
| } | ||||
|  | ||||
| //////////////////////////// | ||||
| // ENTITY / TREASURES | ||||
| //////////////////////////// | ||||
| global.temp2 = global.gameStart; | ||||
| if (not isRoom("rTutorial") and not isRoom("rLoadLevel")) scrEntityGen(); | ||||
|  | ||||
| if (instance_exists(oEntrance) and not global.customLevel) | ||||
| { | ||||
|     oPlayer1.x = oEntrance.x+8; | ||||
|     oPlayer1.y = oEntrance.y+8; | ||||
| } | ||||
|  | ||||
| if (global.darkLevel or | ||||
|     global.blackMarket or | ||||
|     global.snakePit or | ||||
|     global.cemetary or | ||||
|     global.lake or | ||||
|     global.yetiLair or | ||||
|     global.alienCraft or | ||||
|     global.sacrificePit or | ||||
|     global.cityOfGold) | ||||
| { | ||||
|     if (not isRoom("rLoadLevel")) | ||||
|     { | ||||
|         with oPlayer1 { alarm[0] = 10; } | ||||
|     } | ||||
| } | ||||
|  | ||||
| if (global.levelType == 4) scrSetupWalls(864); | ||||
| else if (global.lake) scrSetupWalls(656); | ||||
| else scrSetupWalls(528); | ||||
|  | ||||
| // add background details | ||||
| if (global.graphicsHigh) | ||||
| { | ||||
|     repeat(20) | ||||
|     { | ||||
|         // bg = instance_create(16*rand(1,42), 16*rand(1,33), oCaveBG); | ||||
|         if (global.levelType == 1 and rand(1,3) < 3) | ||||
|             tile_add(bgExtrasLush, 32*rand(0,1), 0, 32, 32, 16*rand(1,42), 16*rand(1,33), 10002); | ||||
|         else if (global.levelType == 2 and rand(1,3) < 3) | ||||
|             tile_add(bgExtrasIce, 32*rand(0,1), 0, 32, 32, 16*rand(1,42), 16*rand(1,33), 10002); | ||||
|         else if (global.levelType == 3 and rand(1,3) < 3) | ||||
|             tile_add(bgExtrasTemple, 32*rand(0,1), 0, 32, 32, 16*rand(1,42), 16*rand(1,33), 10002); | ||||
|         else | ||||
|             tile_add(bgExtras, 32*rand(0,1), 0, 32, 32, 16*rand(1,42), 16*rand(1,33), 10002); | ||||
|     } | ||||
| } | ||||
|  | ||||
| oGame.levelGen = true; | ||||
|  | ||||
| // generate angry shopkeeper at exit if murderer or thief | ||||
| if ((global.murderer or global.thiefLevel > 0) and isRealLevel()) | ||||
| { | ||||
|     with oExit | ||||
|     { | ||||
|         if (type == "Exit") | ||||
|         { | ||||
|             obj = instance_create(x, y, oShopkeeper); | ||||
|             obj.status = 4; | ||||
|         } | ||||
|     } | ||||
|     // global.thiefLevel -= 1; | ||||
| } | ||||
|  | ||||
| with oTreasure | ||||
| { | ||||
|     if (collision_point(x, y, oSolid, 0, 0)) | ||||
|     { | ||||
|         obj = instance_place(x, y, oSolid); | ||||
|         if (obj.invincible) instance_destroy(); | ||||
|     } | ||||
| } | ||||
|  | ||||
| with oWater | ||||
| { | ||||
|     if (sprite_index == sWaterTop or sprite_index == sLavaTop) | ||||
|     { | ||||
|         scrCheckWaterTop(); | ||||
|     } | ||||
|     /* | ||||
|         obj = instance_place(x-16, y, oWater); | ||||
|         if (instance_exists(obj)) | ||||
|         { | ||||
|             if (obj.sprite_index == sWaterTop or obj.sprite_index == sLavaTop) | ||||
|             { | ||||
|                 if (type == "Lava") sprite_index = sLavaTop; | ||||
|                 else sprite_index = sWaterTop; | ||||
|             } | ||||
|         } | ||||
|         obj = instance_place(x+16, y, oWater); | ||||
|         if (instance_exists(obj)) | ||||
|         { | ||||
|             if (obj.sprite_index == sWaterTop or obj.sprite_index == sLavaTop) | ||||
|             { | ||||
|                 if (type == "Lava") sprite_index = sLavaTop; | ||||
|                 else sprite_index = sWaterTop; | ||||
|             } | ||||
|         } | ||||
|     */ | ||||
| } | ||||
|  | ||||
| global.temp3 = global.gameStart; | ||||
							
								
								
									
										22
									
								
								samples/Gnuplot/dashcolor.1.gnu
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								samples/Gnuplot/dashcolor.1.gnu
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,22 @@ | ||||
| # set terminal pngcairo  background "#ffffff" fontscale 1.0 dashed size 640, 480  | ||||
| # set output 'dashcolor.1.png' | ||||
| set label 1 "set style line 1 lt 2 lc rgb \"red\" lw 3" at -0.4, -0.25, 0 left norotate back textcolor rgb "red"  nopoint offset character 0, 0, 0 | ||||
| set label 2 "set style line 2 lt 2 lc rgb \"orange\" lw 2" at -0.4, -0.35, 0 left norotate back textcolor rgb "orange"  nopoint offset character 0, 0, 0 | ||||
| set label 3 "set style line 3 lt 2 lc rgb \"yellow\" lw 3" at -0.4, -0.45, 0 left norotate back textcolor rgb "yellow"  nopoint offset character 0, 0, 0 | ||||
| set label 4 "set style line 4 lt 2 lc rgb \"green\" lw 2" at -0.4, -0.55, 0 left norotate back textcolor rgb "green"  nopoint offset character 0, 0, 0 | ||||
| set label 5 "plot ... lt 1 lc 3 " at -0.4, -0.65, 0 left norotate back textcolor lt 3 nopoint offset character 0, 0, 0 | ||||
| set label 6 "plot ... lt 3 lc 3 " at -0.4, -0.75, 0 left norotate back textcolor lt 3 nopoint offset character 0, 0, 0 | ||||
| set label 7 "plot ... lt 5 lc 3 " at -0.4, -0.85, 0 left norotate back textcolor lt 3 nopoint offset character 0, 0, 0 | ||||
| set style line 1  linetype 2 linecolor rgb "red"  linewidth 3.000 pointtype 2 pointsize default pointinterval 0 | ||||
| set style line 2  linetype 2 linecolor rgb "orange"  linewidth 2.000 pointtype 2 pointsize default pointinterval 0 | ||||
| set style line 3  linetype 2 linecolor rgb "yellow"  linewidth 3.000 pointtype 2 pointsize default pointinterval 0 | ||||
| set style line 4  linetype 2 linecolor rgb "green"  linewidth 2.000 pointtype 2 pointsize default pointinterval 0 | ||||
| set noxtics | ||||
| set noytics | ||||
| set title "Independent colors and dot/dash styles"  | ||||
| set xlabel "You will only see dashed lines if your current terminal setting permits it"  | ||||
| set xrange [ -0.500000 : 3.50000 ] noreverse nowriteback | ||||
| set yrange [ -1.00000 : 1.40000 ] noreverse nowriteback | ||||
| set bmargin  7 | ||||
| unset colorbox | ||||
| plot cos(x)     ls 1 title 'ls 1',        cos(x-.2)  ls 2 title 'ls 2',     cos(x-.4)  ls 3 title 'ls 3',     cos(x-.6)  ls 4 title 'ls 4',      cos(x-.8)  lt 1 lc 3 title 'lt 1 lc 3',       cos(x-1.)  lt 3 lc 3 title 'lt 3 lc 3',       cos(x-1.2) lt 5 lc 3 title 'lt 5 lc 3' | ||||
							
								
								
									
										15
									
								
								samples/Gnuplot/histograms.2.gnu
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								samples/Gnuplot/histograms.2.gnu
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,15 @@ | ||||
| # set terminal pngcairo  transparent enhanced font "arial,10" fontscale 1.0 size 500, 350  | ||||
| # set output 'histograms.2.png' | ||||
| set boxwidth 0.9 absolute | ||||
| set style fill   solid 1.00 border lt -1 | ||||
| set key inside right top vertical Right noreverse noenhanced autotitles nobox | ||||
| set style histogram clustered gap 1 title  offset character 0, 0, 0 | ||||
| set datafile missing '-' | ||||
| set style data histograms | ||||
| set xtics border in scale 0,0 nomirror rotate by -45  offset character 0, 0, 0 autojustify | ||||
| set xtics  norangelimit font ",8" | ||||
| set xtics   () | ||||
| set title "US immigration from Northern Europe\nPlot selected data columns as histogram of clustered boxes"  | ||||
| set yrange [ 0.00000 : 300000. ] noreverse nowriteback | ||||
| i = 22 | ||||
| plot 'immigration.dat' using 6:xtic(1) ti col, '' u 12 ti col, '' u 13 ti col, '' u 14 ti col | ||||
							
								
								
									
										14
									
								
								samples/Gnuplot/rates.gp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								samples/Gnuplot/rates.gp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,14 @@ | ||||
| #!/usr/bin/env gnuplot | ||||
|  | ||||
| reset | ||||
|  | ||||
| set terminal png | ||||
| set output 'rates100.png' | ||||
|  | ||||
| set xlabel "A2A price" | ||||
| set ylabel "Response Rate" | ||||
|  | ||||
| #set xr [0:5] | ||||
| #set yr [0:6] | ||||
|  | ||||
| plot 'rates100.dat' pt 7 notitle | ||||
							
								
								
									
										40
									
								
								samples/Gnuplot/surface1.16.gnu
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								samples/Gnuplot/surface1.16.gnu
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,40 @@ | ||||
| # set terminal pngcairo  transparent enhanced font "arial,10" fontscale 1.0 size 500, 350  | ||||
| # set output 'surface1.16.png' | ||||
| set dummy u,v | ||||
| set label 1 "increasing v" at 6, 0, -1 left norotate back nopoint offset character 0, 0, 0 | ||||
| set label 2 "u=0" at 5, 6.5, -1 left norotate back nopoint offset character 0, 0, 0 | ||||
| set label 3 "u=1" at 5, 6.5, 0.100248 left norotate back nopoint offset character 0, 0, 0 | ||||
| set arrow 1 from 5, -5, -1.2 to 5, 5, -1.2 head back nofilled linetype -1 linewidth 1.000 | ||||
| set arrow 2 from 5, 6, -1 to 5, 5, -1 head back nofilled linetype -1 linewidth 1.000 | ||||
| set arrow 3 from 5, 6, 0.100248 to 5, 5, 0.100248 head back nofilled linetype -1 linewidth 1.000 | ||||
| set parametric | ||||
| set view 70, 20, 1, 1 | ||||
| set samples 51, 51 | ||||
| set isosamples 2, 33 | ||||
| set hidden3d back offset 1 trianglepattern 3 undefined 1 altdiagonal bentover | ||||
| set ztics -1.00000,0.25,1.00000 norangelimit | ||||
| set title "\"fence plot\" using separate parametric surfaces"  | ||||
| set xlabel "X axis"  | ||||
| set xlabel  offset character -3, -2, 0 font "" textcolor lt -1 norotate | ||||
| set xrange [ -5.00000 : 5.00000 ] noreverse nowriteback | ||||
| set ylabel "Y axis"  | ||||
| set ylabel  offset character 3, -2, 0 font "" textcolor lt -1 rotate by -270 | ||||
| set yrange [ -5.00000 : 5.00000 ] noreverse nowriteback | ||||
| set zlabel "Z axis"  | ||||
| set zlabel  offset character -5, 0, 0 font "" textcolor lt -1 norotate | ||||
| set zrange [ -1.00000 : 1.00000 ] noreverse nowriteback | ||||
| sinc(u,v) = sin(sqrt(u**2+v**2)) / sqrt(u**2+v**2) | ||||
| GPFUN_sinc = "sinc(u,v) = sin(sqrt(u**2+v**2)) / sqrt(u**2+v**2)" | ||||
| xx = 6.08888888888889 | ||||
| dx = 1.10888888888889 | ||||
| x0 = -5 | ||||
| x1 = -3.89111111111111 | ||||
| x2 = -2.78222222222222 | ||||
| x3 = -1.67333333333333 | ||||
| x4 = -0.564444444444444 | ||||
| x5 = 0.544444444444445 | ||||
| x6 = 1.65333333333333 | ||||
| x7 = 2.76222222222222 | ||||
| x8 = 3.87111111111111 | ||||
| x9 = 4.98 | ||||
| splot [u=0:1][v=-4.99:4.99] 	x0, v, (u<0.5) ? -1 : sinc(x0,v) notitle, 	x1, v, (u<0.5) ? -1 : sinc(x1,v) notitle, 	x2, v, (u<0.5) ? -1 : sinc(x2,v) notitle, 	x3, v, (u<0.5) ? -1 : sinc(x3,v) notitle, 	x4, v, (u<0.5) ? -1 : sinc(x4,v) notitle, 	x5, v, (u<0.5) ? -1 : sinc(x5,v) notitle, 	x6, v, (u<0.5) ? -1 : sinc(x6,v) notitle, 	x7, v, (u<0.5) ? -1 : sinc(x7,v) notitle, 	x8, v, (u<0.5) ? -1 : sinc(x8,v) notitle, 	x9, v, (u<0.5) ? -1 : sinc(x9,v) notitle | ||||
							
								
								
									
										46
									
								
								samples/Gnuplot/surface1.17.gnu
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								samples/Gnuplot/surface1.17.gnu
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,46 @@ | ||||
| # set terminal pngcairo  transparent enhanced font "arial,10" fontscale 1.0 size 500, 350  | ||||
| # set output 'surface1.17.png' | ||||
| set dummy u,v | ||||
| set label 1 "increasing v" at 6, 0, -1 left norotate back nopoint offset character 0, 0, 0 | ||||
| set label 2 "increasing u" at 0, -5, -1.5 left norotate back nopoint offset character 0, 0, 0 | ||||
| set label 3 "floor(u)%3=0" at 5, 6.5, -1 left norotate back nopoint offset character 0, 0, 0 | ||||
| set label 4 "floor(u)%3=1" at 5, 6.5, 0.100248 left norotate back nopoint offset character 0, 0, 0 | ||||
| set arrow 1 from 5, -5, -1.2 to 5, 5, -1.2 head back nofilled linetype -1 linewidth 1.000 | ||||
| set arrow 2 from -5, -5, -1.2 to 5, -5, -1.2 head back nofilled linetype -1 linewidth 1.000 | ||||
| set arrow 3 from 5, 6, -1 to 5, 5, -1 head back nofilled linetype -1 linewidth 1.000 | ||||
| set arrow 4 from 5, 6, 0.100248 to 5, 5, 0.100248 head back nofilled linetype -1 linewidth 1.000 | ||||
| set parametric | ||||
| set view 70, 20, 1, 1 | ||||
| set samples 51, 51 | ||||
| set isosamples 30, 33 | ||||
| set hidden3d back offset 1 trianglepattern 3 undefined 1 altdiagonal bentover | ||||
| set ztics -1.00000,0.25,1.00000 norangelimit | ||||
| set title "\"fence plot\" using single parametric surface with undefined points"  | ||||
| set xlabel "X axis"  | ||||
| set xlabel  offset character -3, -2, 0 font "" textcolor lt -1 norotate | ||||
| set xrange [ -5.00000 : 5.00000 ] noreverse nowriteback | ||||
| set ylabel "Y axis"  | ||||
| set ylabel  offset character 3, -2, 0 font "" textcolor lt -1 rotate by -270 | ||||
| set yrange [ -5.00000 : 5.00000 ] noreverse nowriteback | ||||
| set zlabel "Z axis"  | ||||
| set zlabel  offset character -5, 0, 0 font "" textcolor lt -1 norotate | ||||
| set zrange [ -1.00000 : 1.00000 ] noreverse nowriteback | ||||
| sinc(u,v) = sin(sqrt(u**2+v**2)) / sqrt(u**2+v**2) | ||||
| GPFUN_sinc = "sinc(u,v) = sin(sqrt(u**2+v**2)) / sqrt(u**2+v**2)" | ||||
| xx = 6.08888888888889 | ||||
| dx = 1.11 | ||||
| x0 = -5 | ||||
| x1 = -3.89111111111111 | ||||
| x2 = -2.78222222222222 | ||||
| x3 = -1.67333333333333 | ||||
| x4 = -0.564444444444444 | ||||
| x5 = 0.544444444444445 | ||||
| x6 = 1.65333333333333 | ||||
| x7 = 2.76222222222222 | ||||
| x8 = 3.87111111111111 | ||||
| x9 = 4.98 | ||||
| xmin = -4.99 | ||||
| xmax = 5 | ||||
| n = 10 | ||||
| zbase = -1 | ||||
| splot [u=.5:3*n-.5][v=-4.99:4.99] 	 xmin+floor(u/3)*dx, v, ((floor(u)%3)==0) ? zbase : 			 (((floor(u)%3)==1) ? sinc(xmin+u/3.*dx,v) : 1/0) notitle | ||||
							
								
								
									
										21
									
								
								samples/Gnuplot/world2.1.gnu
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								samples/Gnuplot/world2.1.gnu
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,21 @@ | ||||
| # set terminal pngcairo  transparent enhanced font "arial,10" fontscale 1.0 size 500, 350  | ||||
| # set output 'world2.1.png' | ||||
| unset border | ||||
| set dummy u,v | ||||
| set angles degrees | ||||
| set parametric | ||||
| set view 60, 136, 1.22, 1.26 | ||||
| set samples 64, 64 | ||||
| set isosamples 13, 13 | ||||
| set mapping spherical | ||||
| set noxtics | ||||
| set noytics | ||||
| set noztics | ||||
| set title "Labels colored by GeV plotted in spherical coordinate system"  | ||||
| set urange [ -90.0000 : 90.0000 ] noreverse nowriteback | ||||
| set vrange [ 0.00000 : 360.000 ] noreverse nowriteback | ||||
| set cblabel "GeV"  | ||||
| set cbrange [ 0.00000 : 8.00000 ] noreverse nowriteback | ||||
| set colorbox user | ||||
| set colorbox vertical origin screen 0.9, 0.2, 0 size screen 0.02, 0.75, 0 front bdefault | ||||
| splot cos(u)*cos(v),cos(u)*sin(v),sin(u) notitle with lines lt 5,       'world.dat' notitle with lines lt 2,       'srl.dat' using 3:2:(1):1:4 with labels notitle point pt 6 lw .1 left offset 1,0 font "Helvetica,7" tc pal | ||||
							
								
								
									
										15
									
								
								samples/Grammatical Framework/Foods.gf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								samples/Grammatical Framework/Foods.gf
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,15 @@ | ||||
| -- (c) 2009 Aarne Ranta under LGPL | ||||
|  | ||||
| abstract Foods = { | ||||
|   flags startcat = Comment ; | ||||
|   cat | ||||
|     Comment ; Item ; Kind ; Quality ; | ||||
|   fun | ||||
|     Pred : Item -> Quality -> Comment ; | ||||
|     This, That, These, Those : Kind -> Item ; | ||||
|     Mod : Quality -> Kind -> Kind ; | ||||
|     Wine, Cheese, Fish, Pizza : Kind ; | ||||
|     Very : Quality -> Quality ; | ||||
|     Fresh, Warm, Italian,  | ||||
|       Expensive, Delicious, Boring : Quality ; | ||||
| } | ||||
							
								
								
									
										79
									
								
								samples/Grammatical Framework/FoodsAfr.gf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										79
									
								
								samples/Grammatical Framework/FoodsAfr.gf
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,79 @@ | ||||
| -- (c) 2009 Laurette Pretorius Sr & Jr and Ansu Berg under LGPL | ||||
|  | ||||
| concrete FoodsAfr of Foods = open Prelude, Predef in{ | ||||
|  | ||||
| 	flags coding=utf8; | ||||
|  | ||||
| 	lincat | ||||
| 		Comment = {s: Str} ; | ||||
| 		Kind = {s: Number => Str} ; | ||||
| 		Item = {s: Str ; n: Number} ; | ||||
| 		Quality = {s: AdjAP => Str} ; | ||||
|  | ||||
| 	lin | ||||
| 		Pred item quality = {s = item.s ++ "is" ++ (quality.s ! Predic)}; | ||||
| 		This kind = {s = "hierdie" ++ (kind.s ! Sg); n = Sg}; | ||||
| 		That kind = {s = "daardie" ++ (kind.s ! Sg); n = Sg}; | ||||
| 		These kind = {s = "hierdie" ++ (kind.s ! Pl); n = Pl}; | ||||
| 		Those kind = {s = "daardie" ++ (kind.s ! Pl); n = Pl}; | ||||
| 		Mod quality kind = {s = table{n => (quality.s ! Attr) ++ (kind.s!n)}}; | ||||
|  | ||||
| 		Wine = declNoun_e "wyn"; | ||||
| 		Cheese = declNoun_aa "kaas"; | ||||
| 		Fish = declNoun_ss "vis"; | ||||
| 		Pizza = declNoun_s "pizza"; | ||||
|  | ||||
| 		Very quality = veryAdj quality; | ||||
|  | ||||
| 		Fresh = regAdj "vars"; | ||||
| 		Warm = regAdj "warm"; | ||||
| 		Italian = smartAdj_e "Italiaans"; | ||||
| 		Expensive = regAdj "duur"; | ||||
| 		Delicious = smartAdj_e "heerlik"; | ||||
| 		Boring = smartAdj_e "vervelig"; | ||||
|  | ||||
| 	param | ||||
| 		AdjAP = Attr | Predic ; | ||||
| 		Number = Sg | Pl ; | ||||
|  | ||||
| 	oper | ||||
| 		--Noun operations (wyn, kaas, vis, pizza) | ||||
|  | ||||
| 		declNoun_aa: Str -> {s: Number => Str} = \x -> | ||||
| 		let v = tk 2 x | ||||
| 		in | ||||
| 		{s = table{Sg => x ; Pl => v + (last x) +"e"}}; | ||||
|  | ||||
| 		declNoun_e: Str -> {s: Number => Str} = \x -> {s = table{Sg => x ; Pl => x + "e"}} ; | ||||
| 		declNoun_s: Str -> {s: Number => Str} = \x -> {s = table{Sg => x ; Pl => x + "s"}} ; | ||||
|  | ||||
| 		declNoun_ss: Str -> {s: Number => Str} = \x -> {s = table{Sg => x ; Pl => x + (last x) + "e"}} ; | ||||
|  | ||||
|  | ||||
| 		--Adjective operations | ||||
|  | ||||
| 		mkAdj : Str -> Str -> {s: AdjAP => Str} = \x,y -> {s = table{Attr => x; Predic => y}}; | ||||
|  | ||||
| 		declAdj_e : Str -> {s : AdjAP=> Str} = \x -> mkAdj (x + "e") x; | ||||
| 		declAdj_g : Str -> {s : AdjAP=> Str} = \w -> | ||||
| 			let v = init w | ||||
| 			in mkAdj (v + "ë") w ; | ||||
|  | ||||
| 		declAdj_oog : Str -> {s : AdjAP=> Str} = \w -> | ||||
| 			let v = init w | ||||
| 			in | ||||
| 				let i = init v | ||||
| 				in mkAdj (i + "ë") w ; | ||||
|  | ||||
| 		regAdj : Str -> {s : AdjAP=> Str} = \x -> mkAdj x x; | ||||
|  | ||||
| 		veryAdj : {s: AdjAP => Str} -> {s : AdjAP=> Str} =  \x -> {s = table{a => "baie" ++ (x.s!a)}}; | ||||
|  | ||||
|  | ||||
| 		smartAdj_e : Str -> {s : AdjAP=> Str} = \a -> case a of | ||||
| 		{ | ||||
| 			_ + "oog" 			   		=> declAdj_oog a ; | ||||
| 			_ + ("e" | "ie" | "o" | "oe") + "g" 	=> declAdj_g a ; | ||||
| 			_					   	=> declAdj_e a | ||||
| 		}; | ||||
| } | ||||
							
								
								
									
										21
									
								
								samples/Grammatical Framework/FoodsAmh.gf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								samples/Grammatical Framework/FoodsAmh.gf
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,21 @@ | ||||
| concrete FoodsAmh of Foods ={ | ||||
|  flags coding = utf8; | ||||
|  lincat | ||||
|   Comment,Item,Kind,Quality = Str; | ||||
|  lin | ||||
|   Pred item quality = item ++ quality++ "ነው::" ; | ||||
|   This kind = "ይህ" ++ kind; | ||||
|   That kind = "ያ" ++ kind; | ||||
|   Mod quality kind = quality ++ kind; | ||||
|   Wine = "ወይን"; | ||||
|   Cheese = "አይብ"; | ||||
|   Fish = "ዓሳ"; | ||||
|   Very quality = "በጣም" ++ quality; | ||||
|   Fresh = "አዲስ"; | ||||
|   Warm = "ትኩስ"; | ||||
|   Italian = "የጥልያን"; | ||||
|   Expensive = "ውድ"; | ||||
|   Delicious = "ጣፋጭ"; | ||||
|   Boring = "አስቀያሚ"; | ||||
|    | ||||
| }    | ||||
							
								
								
									
										43
									
								
								samples/Grammatical Framework/FoodsBul.gf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								samples/Grammatical Framework/FoodsBul.gf
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,43 @@ | ||||
| -- (c) 2009 Krasimir Angelov under LGPL | ||||
|  | ||||
| concrete FoodsBul of Foods = { | ||||
|    | ||||
|   flags | ||||
|     coding = utf8; | ||||
|  | ||||
|   param | ||||
|     Gender = Masc | Fem | Neutr; | ||||
|     Number = Sg | Pl; | ||||
|     Agr    = ASg Gender | APl ; | ||||
|  | ||||
|   lincat | ||||
|     Comment = Str ; | ||||
|     Quality = {s : Agr => Str} ; | ||||
|     Item = {s : Str; a : Agr} ; | ||||
|     Kind = {s : Number => Str; g : Gender} ; | ||||
|  | ||||
|   lin | ||||
|     Pred item qual = item.s ++ case item.a of {ASg _ => "е"; APl => "са"} ++ qual.s ! item.a ; | ||||
|      | ||||
|     This  kind = {s=case kind.g of {Masc=>"този"; Fem=>"тази";  Neutr=>"това" } ++ kind.s ! Sg; a=ASg kind.g} ; | ||||
|     That  kind = {s=case kind.g of {Masc=>"онзи"; Fem=>"онази"; Neutr=>"онова"} ++ kind.s ! Sg; a=ASg kind.g} ; | ||||
|     These kind = {s="тези"  ++ kind.s ! Pl; a=APl} ; | ||||
|     Those kind = {s="онези" ++ kind.s ! Pl; a=APl} ; | ||||
|      | ||||
|     Mod qual kind = {s=\\n => qual.s ! (case n of {Sg => ASg kind.g; Pl => APl}) ++ kind.s ! n; g=kind.g} ; | ||||
|  | ||||
|     Wine   = {s = table {Sg => "вино";   Pl => "вина"};   g = Neutr}; | ||||
|     Cheese = {s = table {Sg => "сирене"; Pl => "сирена"}; g = Neutr}; | ||||
|     Fish   = {s = table {Sg => "риба";   Pl => "риби"};   g = Fem}; | ||||
|     Pizza  = {s = table {Sg => "пица";   Pl => "пици"};   g = Fem}; | ||||
|  | ||||
|     Very qual = {s = \\g => "много" ++ qual.s ! g}; | ||||
|  | ||||
|     Fresh     = {s = table {ASg Masc => "свеж";        ASg Fem => "свежа";       ASg Neutr => "свежо";       APl => "свежи"}}; | ||||
|     Warm      = {s = table {ASg Masc => "горещ";       ASg Fem => "гореща";      ASg Neutr => "горещо";      APl => "горещи"}}; | ||||
|     Italian   = {s = table {ASg Masc => "италиански";  ASg Fem => "италианска";  ASg Neutr => "италианско";  APl => "италиански"}};  | ||||
|     Expensive = {s = table {ASg Masc => "скъп";        ASg Fem => "скъпа";       ASg Neutr => "скъпо";       APl => "скъпи"}}; | ||||
|     Delicious = {s = table {ASg Masc => "превъзходен"; ASg Fem => "превъзходна"; ASg Neutr => "превъзходно"; APl => "превъзходни"}}; | ||||
|     Boring    = {s = table {ASg Masc => "еднообразен"; ASg Fem => "еднообразна"; ASg Neutr => "еднообразно"; APl => "еднообразни"}}; | ||||
|      | ||||
| } | ||||
							
								
								
									
										7
									
								
								samples/Grammatical Framework/FoodsCat.gf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								samples/Grammatical Framework/FoodsCat.gf
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,7 @@ | ||||
| --# -path=.:present | ||||
|  | ||||
| -- (c) 2009 Jordi Saludes under LGPL | ||||
|  | ||||
| concrete FoodsCat of Foods = FoodsI with  | ||||
|   (Syntax = SyntaxCat), | ||||
|   (LexFoods = LexFoodsCat) ; | ||||
							
								
								
									
										35
									
								
								samples/Grammatical Framework/FoodsChi.gf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								samples/Grammatical Framework/FoodsChi.gf
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,35 @@ | ||||
| concrete FoodsChi of Foods = { | ||||
| flags coding = utf8 ; | ||||
| lincat | ||||
|     Comment, Item = Str ; | ||||
|     Kind = {s,c : Str} ;  | ||||
|     Quality = {s,p : Str} ; | ||||
| lin | ||||
|     Pred item quality = item ++ "是" ++ quality.s ++ quality.p ; | ||||
|     This kind = "这" ++ kind.c ++ kind.s ; | ||||
|     That kind = "那" ++ kind.c ++ kind.s ; | ||||
|     These kind = "这" ++ "些" ++ kind.s ; | ||||
|     Those kind = "那" ++ "些" ++ kind.s ; | ||||
|     Mod quality kind = { | ||||
|       s = quality.s ++ quality.p ++ kind.s ; | ||||
|       c = kind.c | ||||
|       } ; | ||||
|     Wine  = geKind "酒" ; | ||||
|     Pizza = geKind "比 萨 饼" ; | ||||
|     Cheese  = geKind "奶 酪" ; | ||||
|     Fish  = geKind "鱼" ; | ||||
|     Very quality = longQuality ("非 常" ++ quality.s) ; | ||||
|     Fresh  = longQuality "新 鲜" ; | ||||
|     Warm  = longQuality "温 热" ; | ||||
|     Italian  = longQuality "意 大 利 式" ; | ||||
|     Expensive  = longQuality "昂 贵" ; | ||||
|     Delicious  = longQuality "美 味" ; | ||||
|     Boring  = longQuality "难 吃" ; | ||||
| oper | ||||
|     mkKind : Str -> Str -> {s,c : Str} = \s,c -> | ||||
|       {s = s ; c = c} ; | ||||
|     geKind : Str -> {s,c : Str} = \s -> | ||||
|       mkKind s "个" ; | ||||
|     longQuality : Str -> {s,p : Str} = \s -> | ||||
|       {s = s ; p = "的"} ; | ||||
| } | ||||
							
								
								
									
										35
									
								
								samples/Grammatical Framework/FoodsCze.gf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								samples/Grammatical Framework/FoodsCze.gf
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,35 @@ | ||||
| -- (c) 2011 Katerina Bohmova under LGPL | ||||
|  | ||||
| concrete FoodsCze of Foods = open ResCze in { | ||||
|   flags  | ||||
|     coding = utf8 ; | ||||
|   lincat | ||||
|     Comment = {s : Str} ;  | ||||
|     Quality = Adjective ;  | ||||
|     Kind = Noun ;  | ||||
|     Item = NounPhrase ; | ||||
|   lin | ||||
|     Pred item quality =  | ||||
|       {s = item.s ++ copula ! item.n ++  | ||||
|            quality.s ! item.g ! item.n} ; | ||||
|     This  = det Sg "tento" "tato" "toto" ; | ||||
|     That  = det Sg "tamten" "tamta" "tamto" ; | ||||
|     These = det Pl "tyto" "tyto" "tato" ; | ||||
|     Those = det Pl "tamty" "tamty" "tamta" ; | ||||
|     Mod quality kind = { | ||||
|       s = \\n => quality.s ! kind.g ! n ++ kind.s ! n ; | ||||
|       g = kind.g | ||||
|       } ; | ||||
|     Wine = noun "víno" "vína" Neutr ; | ||||
|     Cheese = noun "sýr" "sýry" Masc ; | ||||
|     Fish = noun "ryba" "ryby" Fem ; | ||||
|     Pizza = noun "pizza" "pizzy" Fem ; | ||||
|     Very qual = {s = \\g,n => "velmi" ++ qual.s ! g ! n} ; | ||||
|     Fresh = regAdj "čerstv" ; | ||||
|     Warm = regAdj "tepl" ; | ||||
|     Italian = regAdj "italsk" ; | ||||
|     Expensive = regAdj "drah" ; | ||||
|     Delicious = regnfAdj "vynikající" ; | ||||
|     Boring = regAdj "nudn" ; | ||||
| } | ||||
|  | ||||
							
								
								
									
										58
									
								
								samples/Grammatical Framework/FoodsDut.gf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										58
									
								
								samples/Grammatical Framework/FoodsDut.gf
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,58 @@ | ||||
| -- (c) 2009 Femke Johansson under LGPL | ||||
|  | ||||
| concrete FoodsDut of Foods = { | ||||
|  | ||||
| 	lincat | ||||
| 		Comment = {s : Str}; | ||||
| 		Quality = {s : AForm => Str}; | ||||
| 		Kind = { s : Number => Str}; | ||||
| 		Item = {s : Str ; n : Number}; | ||||
| 	 | ||||
| 	lin | ||||
| 		Pred item quality =  | ||||
| 			{s = item.s ++ copula ! item.n ++ quality.s ! APred}; | ||||
| 		This = det Sg "deze"; | ||||
| 		These = det Pl "deze"; | ||||
| 		That = det Sg "die"; | ||||
| 		Those = det Pl "die"; | ||||
| 		 | ||||
| 		Mod quality kind = | ||||
| 			{s = \\n => quality.s ! AAttr ++ kind.s ! n}; | ||||
| 			Wine = regNoun "wijn"; | ||||
| 			Cheese = noun "kaas" "kazen"; | ||||
| 			Fish = noun "vis" "vissen"; | ||||
| 			Pizza = noun "pizza" "pizza's"; | ||||
| 			 | ||||
| 			Very a = {s = \\f => "erg" ++ a.s ! f}; | ||||
| 			 | ||||
| 			Fresh = regadj "vers"; | ||||
| 			Warm = regadj "warm"; | ||||
| 			Italian = regadj "Italiaans"; | ||||
| 			Expensive = adj "duur" "dure"; | ||||
| 			Delicious = regadj "lekker"; | ||||
| 			Boring = regadj "saai"; | ||||
| 		 | ||||
| 		param | ||||
| 			Number = Sg | Pl; | ||||
| 			AForm = APred | AAttr; | ||||
| 		 | ||||
| 		oper | ||||
| 			det : Number -> Str -> | ||||
| 				{s : Number => Str} -> {s : Str ; n: Number} = | ||||
| 				\n,det,noun -> {s = det ++ noun.s ! n ; n=n}; | ||||
| 				 | ||||
| 			noun : Str -> Str -> {s : Number => Str} =  | ||||
| 				\man,men -> {s = table {Sg => man; Pl => men}}; | ||||
| 				 | ||||
| 			regNoun : Str -> {s : Number => Str} = | ||||
| 				\wijn -> noun wijn (wijn + "en"); | ||||
| 				 | ||||
| 			regadj : Str -> {s : AForm => Str} = | ||||
| 				\koud -> adj koud (koud+"e"); | ||||
| 			 | ||||
| 			adj : Str -> Str -> {s : AForm => Str} = | ||||
| 				\duur, dure -> {s = table {APred => duur; AAttr => dure}}; | ||||
| 				 | ||||
| 			copula : Number => Str = | ||||
| 				table {Sg => "is" ; Pl => "zijn"}; | ||||
| } | ||||
							
								
								
									
										43
									
								
								samples/Grammatical Framework/FoodsEng.gf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								samples/Grammatical Framework/FoodsEng.gf
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,43 @@ | ||||
| -- (c) 2009 Aarne Ranta under LGPL | ||||
|  | ||||
| concrete FoodsEng of Foods = { | ||||
|   flags language = en_US; | ||||
|   lincat | ||||
|     Comment, Quality = {s : Str} ;  | ||||
|     Kind = {s : Number => Str} ;  | ||||
|     Item = {s : Str ; n : Number} ;  | ||||
|   lin | ||||
|     Pred item quality =  | ||||
|       {s = item.s ++ copula ! item.n ++ quality.s} ; | ||||
|     This  = det Sg "this" ; | ||||
|     That  = det Sg "that" ; | ||||
|     These = det Pl "these" ; | ||||
|     Those = det Pl "those" ; | ||||
|     Mod quality kind =  | ||||
|       {s = \\n => quality.s ++ kind.s ! n} ; | ||||
|     Wine = regNoun "wine" ; | ||||
|     Cheese = regNoun "cheese" ; | ||||
|     Fish = noun "fish" "fish" ; | ||||
|     Pizza = regNoun "pizza" ; | ||||
|     Very a = {s = "very" ++ a.s} ; | ||||
|     Fresh = adj "fresh" ; | ||||
|     Warm = adj "warm" ; | ||||
|     Italian = adj "Italian" ; | ||||
|     Expensive = adj "expensive" ; | ||||
|     Delicious = adj "delicious" ; | ||||
|     Boring = adj "boring" ; | ||||
|   param | ||||
|     Number = Sg | Pl ; | ||||
|   oper | ||||
|     det : Number -> Str ->  | ||||
|       {s : Number => Str} -> {s : Str ; n : Number} =  | ||||
|         \n,det,noun -> {s = det ++ noun.s ! n ; n = n} ; | ||||
|     noun : Str -> Str -> {s : Number => Str} =  | ||||
|       \man,men -> {s = table {Sg => man ; Pl => men}} ; | ||||
|     regNoun : Str -> {s : Number => Str} =  | ||||
|       \car -> noun car (car + "s") ; | ||||
|     adj : Str -> {s : Str} =  | ||||
|       \cold -> {s = cold} ; | ||||
|     copula : Number => Str =  | ||||
|       table {Sg => "is" ; Pl => "are"} ; | ||||
| } | ||||
							
								
								
									
										48
									
								
								samples/Grammatical Framework/FoodsEpo.gf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										48
									
								
								samples/Grammatical Framework/FoodsEpo.gf
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,48 @@ | ||||
| -- (c) 2009 Julia Hammar under LGPL | ||||
|  | ||||
| concrete FoodsEpo of Foods = open Prelude in { | ||||
|  | ||||
|   flags coding =utf8 ; | ||||
|  | ||||
|   lincat | ||||
|     Comment = SS ;  | ||||
|     Kind, Quality = {s : Number => Str} ;  | ||||
|     Item = {s : Str ; n : Number} ;  | ||||
|  | ||||
|   lin | ||||
|     Pred item quality = ss (item.s ++ copula ! item.n ++ quality.s ! item.n) ; | ||||
|     This = det Sg "ĉi tiu" ; | ||||
|     That  = det Sg "tiu" ; | ||||
|     These = det Pl "ĉi tiuj" ; | ||||
|     Those = det Pl "tiuj" ; | ||||
|     Mod quality kind = {s = \\n => quality.s ! n ++ kind.s ! n} ; | ||||
|     Wine = regNoun "vino" ; | ||||
|     Cheese = regNoun "fromaĝo" ; | ||||
|     Fish = regNoun "fiŝo" ; | ||||
|     Pizza = regNoun "pico" ; | ||||
|     Very quality = {s = \\n => "tre" ++ quality.s ! n} ; | ||||
|     Fresh = regAdj "freŝa" ; | ||||
|     Warm = regAdj "varma" ; | ||||
|     Italian = regAdj "itala" ; | ||||
|     Expensive = regAdj "altekosta" ; | ||||
|     Delicious = regAdj "bongusta" ; | ||||
|     Boring = regAdj "enuiga" ; | ||||
|  | ||||
|   param | ||||
|     Number = Sg | Pl ; | ||||
|  | ||||
|   oper | ||||
|     det : Number -> Str -> {s : Number => Str} -> {s : Str ; n : Number} =  | ||||
|       \n,d,cn -> { | ||||
|         s = d ++ cn.s ! n ; | ||||
|         n = n | ||||
|       } ; | ||||
|     regNoun : Str -> {s : Number => Str} =  | ||||
|       \vino -> {s = table {Sg => vino ; Pl => vino + "j"} | ||||
| 	} ; | ||||
|     regAdj : Str -> {s : Number => Str} = | ||||
|       \nova -> {s = table {Sg => nova ; Pl => nova + "j"} | ||||
|       } ; | ||||
|     copula : Number => Str = \\_ => "estas" ; | ||||
| } | ||||
|      | ||||
							
								
								
									
										7
									
								
								samples/Grammatical Framework/FoodsFin.gf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								samples/Grammatical Framework/FoodsFin.gf
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,7 @@ | ||||
| --# -path=.:present | ||||
|  | ||||
| -- (c) 2009 Aarne Ranta under LGPL | ||||
|  | ||||
| concrete FoodsFin of Foods = FoodsI with  | ||||
|   (Syntax = SyntaxFin), | ||||
|   (LexFoods = LexFoodsFin) ; | ||||
							
								
								
									
										32
									
								
								samples/Grammatical Framework/FoodsFre.gf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								samples/Grammatical Framework/FoodsFre.gf
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,32 @@ | ||||
| --# -path=.:../foods:present | ||||
|  | ||||
| concrete FoodsFre of Foods = open SyntaxFre, ParadigmsFre in { | ||||
|  | ||||
| 	flags coding = utf8 ; | ||||
| 	 | ||||
| 	lincat | ||||
| 		Comment = Utt ; | ||||
| 		Item = NP ; | ||||
| 		Kind = CN ; | ||||
| 		Quality = AP ; | ||||
| 	 | ||||
| 	lin | ||||
| 		Pred item quality = mkUtt (mkCl item quality) ; | ||||
| 		This kind = mkNP this_QuantSg kind ; | ||||
| 		That kind = mkNP that_QuantSg kind ; | ||||
| 		These kind = mkNP these_QuantPl kind ; | ||||
| 		Those kind = mkNP those_QuantPl kind ; | ||||
| 		Mod quality kind = mkCN quality kind ; | ||||
| 		Very quality = mkAP very_AdA quality ; | ||||
| 		 | ||||
| 		Wine = mkCN (mkN "vin" masculine) ; | ||||
| 		Pizza = mkCN (mkN "pizza" feminine) ; | ||||
| 		Cheese = mkCN (mkN "fromage" masculine) ; | ||||
| 		Fish = mkCN (mkN "poisson" masculine) ; | ||||
| 		Fresh = mkAP (mkA "frais" "fraîche" "frais" "fraîchement") ; | ||||
| 		Warm = mkAP (mkA "chaud") ; | ||||
| 		Italian = mkAP (mkA "italien") ; | ||||
| 		Expensive = mkAP (mkA "cher") ; | ||||
| 		Delicious = mkAP (mkA "délicieux") ; | ||||
| 		Boring = mkAP (mkA "ennuyeux") ; | ||||
| 	} | ||||
							
								
								
									
										7
									
								
								samples/Grammatical Framework/FoodsGer.gf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								samples/Grammatical Framework/FoodsGer.gf
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,7 @@ | ||||
| --# -path=.:present | ||||
|  | ||||
| -- (c) 2009 Aarne Ranta under LGPL | ||||
|  | ||||
| concrete FoodsGer of Foods = FoodsI with  | ||||
|   (Syntax = SyntaxGer), | ||||
|   (LexFoods = LexFoodsGer) ; | ||||
							
								
								
									
										108
									
								
								samples/Grammatical Framework/FoodsHeb.gf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										108
									
								
								samples/Grammatical Framework/FoodsHeb.gf
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,108 @@ | ||||
| --# -path=alltenses | ||||
|  | ||||
| --(c) 2009 Dana Dannells | ||||
| -- Licensed under LGPL | ||||
|  | ||||
| concrete FoodsHeb of Foods = open Prelude in { | ||||
|    | ||||
|   flags coding=utf8 ; | ||||
|  | ||||
|     lincat | ||||
|       Comment = SS ; | ||||
|       Quality = {s: Number => Species => Gender =>  Str} ;   | ||||
|       Kind = {s : Number => Species => Str ; g : Gender ; mod : Modified} ;  | ||||
|       Item = {s : Str ; g : Gender ; n : Number ; sp : Species ; mod : Modified} ;  | ||||
|    | ||||
|   | ||||
|     lin | ||||
|       Pred item quality = ss (item.s ++ quality.s ! item.n ! Indef ! item.g ) ;  | ||||
|       This  = det Sg Def "הזה" "הזאת";  | ||||
|       That  = det Sg Def "ההוא" "ההיא" ;  | ||||
|       These = det Pl Def "האלה" "האלה" ;  | ||||
|       Those = det Pl Def "ההם" "ההן" ;  | ||||
|       Mod quality kind = { | ||||
| 	s = \\n,sp => kind.s ! n ! sp ++ quality.s ! n ! sp ! kind.g; | ||||
| 	g = kind.g ; | ||||
| 	mod = T | ||||
| 	} ;      | ||||
|       Wine = regNoun "יין" "יינות" Masc ;  | ||||
|       Cheese = regNoun "גבינה" "גבינות" Fem ;   | ||||
|       Fish = regNoun "דג" "דגים" Masc ;  | ||||
|       Pizza = regNoun "פיצה" "פיצות" Fem ;  | ||||
|       Very qual = {s = \\g,n,sp => "מאוד" ++  qual.s ! g ! n ! sp} ; | ||||
|       Fresh = regAdj "טרי" ;  | ||||
|       Warm = regAdj "חם" ; | ||||
|       Italian = regAdj2 "איטלקי" ; | ||||
|       Expensive = regAdj "יקר" ;  | ||||
|       Delicious = regAdj "טעים" ;  | ||||
|       Boring = regAdj2 "משעמם";  | ||||
|  | ||||
|     param  | ||||
|       Number = Sg | Pl ; | ||||
|       Gender = Masc | Fem ; | ||||
|       Species = Def | Indef ;   | ||||
|       Modified = T | F ; | ||||
|  | ||||
|     oper | ||||
| 	Noun : Type = {s : Number => Species => Str ; g : Gender ; mod : Modified } ; | ||||
|   	Adj : Type = {s : Number => Species => Gender => Str} ; | ||||
|  | ||||
|       det : Number -> Species -> Str -> Str -> Noun ->  | ||||
| 	{s : Str ; g :Gender ; n : Number ; sp : Species ; mod : Modified} =  | ||||
|         \n,sp,m,f,cn -> { | ||||
| 	  s = case cn.mod of { _ => cn.s ! n ! sp ++ case cn.g of {Masc => m ; Fem  => f} }; | ||||
| 	  g = cn.g ;  | ||||
|           n = n ; | ||||
| 	  sp = sp ; | ||||
| 	  mod = cn.mod | ||||
|         } ; | ||||
|        | ||||
| 	noun : (gvina,hagvina,gvinot,hagvinot : Str) ->  Gender -> Noun =   | ||||
|       		\gvina,hagvina,gvinot,hagvinot,g -> { | ||||
|         	s = table { | ||||
|           		Sg  => table { | ||||
|              			Indef => gvina ; | ||||
|              			Def =>  hagvina  | ||||
|             		} ; | ||||
|           		Pl => table { | ||||
|              			Indef => gvinot ; | ||||
|              			Def => hagvinot   | ||||
|             		}  | ||||
|        	  	} ; | ||||
|         	g = g ; | ||||
| 		mod = F  | ||||
|       } ; | ||||
|  | ||||
| 	regNoun : Str -> Str -> Gender -> Noun =  | ||||
| 	        \gvina,gvinot, g ->  | ||||
| 		noun gvina (defH gvina) gvinot (defH gvinot) g ;  | ||||
|  | ||||
|       defH : Str -> Str = \cn -> | ||||
| 	case cn of {_ => "ה" + cn};	 | ||||
|  | ||||
|       replaceLastLetter : Str -> Str = \c -> | ||||
| 	 case c of {"ף" => "פ" ; "ם" => "מ" ; "ן" => "נ" ; "ץ" => "צ" ; "ך" => "כ"; _ => c} ; | ||||
| 	       | ||||
|       adjective : (_,_,_,_ : Str) -> Adj =  | ||||
|        \tov,tova,tovim,tovot -> { | ||||
|         s = table { | ||||
|           Sg => table {  | ||||
| 			Indef => table { Masc => tov ; Fem => tova } ;  | ||||
| 			Def => table { Masc => defH tov ; Fem => defH tova }   | ||||
|             		} ;  | ||||
|           Pl => table {  | ||||
| 			Indef => table {Masc => tovim ; Fem  => tovot } ;  | ||||
| 			Def => table { Masc => defH tovim ; Fem  => defH tovot }   | ||||
|             		} | ||||
| 	} | ||||
|       } ; | ||||
|      | ||||
|       regAdj : Str -> Adj = \tov -> | ||||
| 	case tov of { to + c@? => | ||||
| 	adjective tov (to + replaceLastLetter (c) + "ה" ) (to + replaceLastLetter (c) +"ים" ) (to + replaceLastLetter (c) + "ות" )};	  | ||||
|       | ||||
|      regAdj2 : Str -> Adj = \italki -> | ||||
|  	case italki of { italk+ c@? =>  | ||||
|     adjective italki (italk + replaceLastLetter (c)  +"ת" )  (italk + replaceLastLetter (c)+ "ים" ) (italk + replaceLastLetter (c)  + "ות" )}; | ||||
|  | ||||
| }  -- FoodsHeb   | ||||
							
								
								
									
										75
									
								
								samples/Grammatical Framework/FoodsHin.gf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										75
									
								
								samples/Grammatical Framework/FoodsHin.gf
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,75 @@ | ||||
| -- (c) 2010 Vikash Rauniyar under LGPL | ||||
|  | ||||
| concrete FoodsHin of Foods = { | ||||
|  | ||||
|   flags coding=utf8 ; | ||||
|  | ||||
|   param | ||||
|     Gender = Masc | Fem ; | ||||
|     Number = Sg | Pl ; | ||||
|   lincat | ||||
|     Comment = {s : Str} ; | ||||
|     Item    = {s : Str ; g : Gender ; n : Number} ; | ||||
|     Kind    = {s : Number => Str ; g : Gender} ; | ||||
|     Quality = {s : Gender => Number => Str} ; | ||||
|   lin | ||||
|     Pred item quality = { | ||||
|       s = item.s ++ quality.s ! item.g ! item.n ++ copula item.n | ||||
|       } ; | ||||
|     This kind = {s = "यह" ++ kind.s ! Sg ; g = kind.g ; n = Sg} ; | ||||
|     That kind = {s = "वह" ++ kind.s ! Sg ; g = kind.g ; n = Sg} ; | ||||
|     These kind = {s = "ये" ++ kind.s ! Pl ; g = kind.g ; n = Pl} ; | ||||
|     Those kind = {s = "वे" ++ kind.s ! Pl ; g = kind.g ; n = Pl} ; | ||||
|     Mod quality kind = { | ||||
|       s = \\n => quality.s ! kind.g ! n ++ kind.s ! n ;  | ||||
|       g = kind.g | ||||
|       } ; | ||||
|     Wine = regN "मदिरा" ; | ||||
|     Cheese = regN "पनीर" ; | ||||
|     Fish = regN "मछली" ; | ||||
|     Pizza = regN "पिज़्ज़ा" ; | ||||
|     Very quality = {s = \\g,n => "अति" ++ quality.s ! g ! n} ; | ||||
|     Fresh = regAdj "ताज़ा" ; | ||||
|     Warm = regAdj "गरम" ; | ||||
|     Italian = regAdj "इटली" ;  | ||||
|     Expensive = regAdj "बहुमूल्य" ; | ||||
|     Delicious = regAdj "स्वादिष्ट" ; | ||||
|     Boring = regAdj "अरुचिकर" ; | ||||
|  | ||||
|   oper | ||||
|     mkN : Str -> Str -> Gender -> {s : Number => Str ; g : Gender} =  | ||||
|       \s,p,g -> { | ||||
|         s = table { | ||||
|           Sg => s ; | ||||
|           Pl => p | ||||
|           } ; | ||||
|         g = g | ||||
|       } ; | ||||
|  | ||||
|     regN : Str -> {s : Number => Str ; g : Gender} = \s -> case s of { | ||||
|       lark + "ा" => mkN s (lark + "े") Masc ; | ||||
|       lark + "ी" => mkN s (lark + "ीयँा") Fem ; | ||||
|       _           => mkN s s Masc  | ||||
|       } ; | ||||
|  | ||||
|     mkAdj : Str -> Str -> Str -> {s : Gender => Number => Str} = \ms,mp,f -> { | ||||
|       s = table { | ||||
|         Masc => table { | ||||
|           Sg => ms ; | ||||
|           Pl => mp | ||||
|           } ; | ||||
|         Fem  => \\_ => f | ||||
|         } | ||||
|       } ; | ||||
|  | ||||
|     regAdj : Str -> {s : Gender => Number => Str} = \a -> case a of { | ||||
|       acch + "ा" => mkAdj a (acch + "े") (acch + "ी") ; | ||||
|       _          => mkAdj a a a | ||||
|       } ; | ||||
|  | ||||
|     copula : Number -> Str = \n -> case n of { | ||||
|       Sg => "है" ; | ||||
|       Pl => "हैं" | ||||
|       } ; | ||||
|  | ||||
|   } | ||||
							
								
								
									
										29
									
								
								samples/Grammatical Framework/FoodsI.gf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								samples/Grammatical Framework/FoodsI.gf
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,29 @@ | ||||
| -- (c) 2009 Aarne Ranta under LGPL | ||||
|  | ||||
| incomplete concrete FoodsI of Foods =  | ||||
|     open Syntax, LexFoods in { | ||||
|   lincat | ||||
|     Comment = Utt ;  | ||||
|     Item = NP ; | ||||
|     Kind = CN ; | ||||
|     Quality = AP ; | ||||
|   lin | ||||
|     Pred item quality = mkUtt (mkCl item quality) ; | ||||
|     This kind = mkNP this_Det kind ; | ||||
|     That kind = mkNP that_Det kind ; | ||||
|     These kind = mkNP these_Det kind ; | ||||
|     Those kind = mkNP those_Det kind ; | ||||
|     Mod quality kind = mkCN quality kind ; | ||||
|     Very quality = mkAP very_AdA quality ; | ||||
|  | ||||
|     Wine = mkCN wine_N ; | ||||
|     Pizza = mkCN pizza_N ; | ||||
|     Cheese = mkCN cheese_N ; | ||||
|     Fish = mkCN fish_N ; | ||||
|     Fresh = mkAP fresh_A ; | ||||
|     Warm = mkAP warm_A ; | ||||
|     Italian = mkAP italian_A ; | ||||
|     Expensive = mkAP expensive_A ; | ||||
|     Delicious = mkAP delicious_A ; | ||||
|     Boring = mkAP boring_A ; | ||||
| } | ||||
							
								
								
									
										84
									
								
								samples/Grammatical Framework/FoodsIce.gf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										84
									
								
								samples/Grammatical Framework/FoodsIce.gf
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,84 @@ | ||||
| --# -path=.:prelude | ||||
|  | ||||
| -- (c) 2009 Martha Dis Brandt under LGPL | ||||
|  | ||||
| concrete FoodsIce of Foods = open Prelude in { | ||||
|  | ||||
|   flags coding=utf8; | ||||
|  | ||||
|   lincat | ||||
|     Comment = SS ; | ||||
|     Quality = {s : Gender => Number => Defin => Str} ; | ||||
|     Kind = {s : Number => Str ; g : Gender} ; | ||||
|     Item = {s : Str ; g : Gender ; n : Number} ; | ||||
|  | ||||
|   lin | ||||
|     Pred item quality =  ss (item.s ++ copula item.n ++ quality.s ! item.g ! item.n ! Ind) ; | ||||
|          This, That  = det Sg "þessi"   "þessi"  "þetta" ; | ||||
|          These, Those = det Pl "þessir" "þessar" "þessi" ; | ||||
|     Mod quality kind = { s = \\n => quality.s ! kind.g ! n ! Def ++ kind.s ! n ; g = kind.g } ; | ||||
|          Wine = noun "vín" "vín" Neutr ; | ||||
|          Cheese = noun "ostur" "ostar" Masc ; | ||||
|          Fish = noun "fiskur" "fiskar" Masc ; | ||||
|          -- the word "pizza" is more commonly used in Iceland, but "flatbaka" is the Icelandic word for it | ||||
|          Pizza = noun "flatbaka" "flatbökur" Fem ; | ||||
|     Very qual = {s = \\g,n,defOrInd => "mjög" ++ qual.s ! g ! n ! defOrInd } ; | ||||
|          Fresh = regAdj "ferskur" ; | ||||
|          Warm = regAdj "heitur" ; | ||||
|          Boring = regAdj "leiðinlegur" ; | ||||
|          -- the order of the given adj forms is: mSg fSg nSg mPl fPl nPl mSgDef f/nSgDef _PlDef | ||||
|          Italian = adjective "ítalskur" "ítölsk" "ítalskt" "ítalskir" "ítalskar" "ítölsk" "ítalski" "ítalska" "ítalsku" ; | ||||
|          Expensive = adjective "dýr" "dýr" "dýrt" "dýrir" "dýrar" "dýr" "dýri" "dýra" "dýru" ; | ||||
|          Delicious = adjective "ljúffengur" "ljúffeng" "ljúffengt" "ljúffengir" "ljúffengar" "ljúffeng" "ljúffengi" "ljúffenga" "ljúffengu" ; | ||||
|  | ||||
|   param | ||||
|     Number = Sg | Pl ; | ||||
|     Gender = Masc | Fem | Neutr ; | ||||
|     Defin = Ind | Def ; | ||||
|  | ||||
|   oper | ||||
|     det : Number -> Str -> Str -> Str -> {s : Number => Str ; g : Gender} -> | ||||
|         {s : Str ; g : Gender ; n : Number} = | ||||
|       \n,masc,fem,neutr,cn -> { | ||||
|         s = case cn.g of {Masc => masc ; Fem => fem; Neutr => neutr } ++ cn.s ! n ; | ||||
|         g = cn.g ; | ||||
|         n = n | ||||
|       } ; | ||||
|  | ||||
|     noun : Str -> Str -> Gender -> {s : Number => Str ; g : Gender} = | ||||
|       \man,men,g -> { | ||||
|         s = table { | ||||
|           Sg => man ; | ||||
|           Pl => men | ||||
|           } ; | ||||
|         g = g | ||||
|       } ; | ||||
|  | ||||
|     adjective : (x1,_,_,_,_,_,_,_,x9 : Str) -> {s : Gender => Number => Defin => Str} = | ||||
|       \ferskur,fersk,ferskt,ferskir,ferskar,fersk_pl,ferski,ferska,fersku -> { | ||||
|          s = \\g,n,t => case <g,n,t> of { | ||||
|             < Masc, Sg, Ind > => ferskur ; | ||||
|             < Masc, Pl, Ind > => ferskir ; | ||||
|             < Fem, Sg, Ind > => fersk ; | ||||
|             < Fem, Pl, Ind > => ferskar ; | ||||
|             < Neutr, Sg, Ind > => ferskt ; | ||||
|             < Neutr, Pl, Ind > => fersk_pl; | ||||
|             < Masc, Sg, Def > => ferski ; | ||||
|             < Fem, Sg, Def > | < Neutr, Sg, Def > => ferska ; | ||||
|             < _ , Pl, Def > => fersku | ||||
|             } | ||||
|           } ; | ||||
|  | ||||
|     regAdj : Str -> {s : Gender => Number => Defin => Str} = \ferskur -> | ||||
|       let fersk = Predef.tk 2 ferskur | ||||
|       in adjective | ||||
|         ferskur fersk (fersk + "t") | ||||
|         (fersk + "ir") (fersk + "ar") fersk | ||||
|         (fersk + "i") (fersk + "a") (fersk + "u") ; | ||||
|  | ||||
|     copula : Number -> Str = | ||||
|       \n -> case n of { | ||||
|         Sg => "er" ; | ||||
|         Pl => "eru" | ||||
|         } ; | ||||
| } | ||||
							
								
								
									
										8
									
								
								samples/Grammatical Framework/FoodsIta.gf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								samples/Grammatical Framework/FoodsIta.gf
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,8 @@ | ||||
| --# -path=.:present | ||||
|  | ||||
| -- (c) 2009 Aarne Ranta under LGPL | ||||
|  | ||||
| concrete FoodsIta of Foods = FoodsI with  | ||||
|   (Syntax = SyntaxIta), | ||||
|   (LexFoods = LexFoodsIta) ; | ||||
|  | ||||
							
								
								
									
										72
									
								
								samples/Grammatical Framework/FoodsJpn.gf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										72
									
								
								samples/Grammatical Framework/FoodsJpn.gf
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,72 @@ | ||||
| --# -path=.:../lib/src/prelude | ||||
|  | ||||
| -- (c) 2009 Zofia Stankiewicz under LGPL | ||||
|  | ||||
| concrete FoodsJpn of Foods = open Prelude in { | ||||
|  | ||||
| flags coding=utf8 ; | ||||
|  | ||||
|   lincat | ||||
|     Comment = {s: Style => Str}; | ||||
|     Quality = {s: AdjUse => Str ; t: AdjType} ; | ||||
|     Kind = {s : Number => Str} ;  | ||||
|     Item = {s : Str ; n : Number} ;  | ||||
|  | ||||
|   lin | ||||
|     Pred item quality = {s = case quality.t of { | ||||
|       IAdj => table {Plain => item.s ++ quality.s ! APred ; Polite => item.s ++ quality.s ! APred ++ copula ! Polite ! item.n } ; | ||||
|       NaAdj => \\p => item.s ++ quality.s ! APred ++ copula ! p ! item.n }  | ||||
|       } ; | ||||
|     This  = det Sg "この" ; | ||||
|     That  = det Sg "その" ; | ||||
|     These = det Pl "この" ; | ||||
|     Those = det Pl "その" ; | ||||
|     Mod quality kind = {s = \\n => quality.s ! Attr ++ kind.s ! n} ; | ||||
|     Wine = regNoun "ワインは" ; | ||||
|     Cheese = regNoun "チーズは" ; | ||||
|     Fish = regNoun "魚は" ; | ||||
|     Pizza = regNoun "ピザは" ; | ||||
|     Very quality =  {s = \\a => "とても" ++ quality.s ! a ; t = quality.t } ; | ||||
|     Fresh = adj "新鮮な" "新鮮"; | ||||
|     Warm = regAdj "あたたかい" ; | ||||
|     Italian = adj "イタリアの" "イタリアのもの"; | ||||
|     Expensive = regAdj "たかい" ; | ||||
|     Delicious = regAdj "おいしい" ; | ||||
|     Boring = regAdj "つまらない" ; | ||||
|  | ||||
|   param | ||||
|     Number = Sg | Pl ; | ||||
|     AdjUse = Attr | APred ;        -- na-adjectives have different forms as noun attributes and predicates | ||||
|     Style = Plain | Polite ;      -- for phrase types | ||||
|     AdjType = IAdj | NaAdj ;      -- IAdj can form predicates without the copula, NaAdj cannot | ||||
|  | ||||
|   oper | ||||
|     det : Number -> Str -> {s : Number => Str} -> {s : Str ; n : Number} =  | ||||
|       \n,d,cn -> { | ||||
|         s = d ++ cn.s ! n ; | ||||
|         n = n | ||||
|       } ; | ||||
|    noun : Str -> Str -> {s : Number => Str} =  | ||||
|       \sakana,sakana -> {s = \\_ => sakana } ; | ||||
|  | ||||
|    regNoun : Str -> {s : Number => Str} =  | ||||
|       \sakana -> noun sakana sakana ; | ||||
|  | ||||
|    adj : Str -> Str -> {s : AdjUse => Str ; t : AdjType} = | ||||
|       \chosenna, chosen -> { | ||||
|        s = table {  | ||||
|          Attr => chosenna ; | ||||
|          APred => chosen | ||||
|        } ; | ||||
|        t = NaAdj  | ||||
|       } ; | ||||
|     | ||||
|    regAdj : Str -> {s: AdjUse => Str ; t : AdjType} =\akai -> { | ||||
|      s = \\_ => akai ; t = IAdj} ; | ||||
|  | ||||
|     copula : Style => Number => Str =  | ||||
|       table {  | ||||
|         Plain => \\_ => "だ" ; | ||||
|         Polite => \\_ => "です" } ; | ||||
|  | ||||
| }    | ||||
							
								
								
									
										91
									
								
								samples/Grammatical Framework/FoodsLav.gf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										91
									
								
								samples/Grammatical Framework/FoodsLav.gf
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,91 @@ | ||||
| --# -path=.:prelude | ||||
|  | ||||
| -- (c) 2009 Inese Bernsone under LGPL | ||||
|  | ||||
| concrete FoodsLav of Foods = open Prelude in { | ||||
|  | ||||
|   flags | ||||
|     coding=utf8 ; | ||||
|      | ||||
|   lincat | ||||
|     Comment = SS ;  | ||||
|     Quality = {s : Q => Gender => Number => Defin => Str } ;  | ||||
|     Kind = {s : Number => Str ; g : Gender} ;  | ||||
|     Item = {s : Str ; g : Gender ; n : Number } ;  | ||||
|  | ||||
|   lin | ||||
|     Pred item quality = ss (item.s ++ {- copula item.n -} "ir" ++ quality.s ! Q1 ! item.g ! item.n ! Ind ) ; | ||||
|       This  = det Sg "šis" "šī" ; | ||||
|       That  = det Sg "tas" "tā" ; | ||||
|       These = det Pl "šie" "šīs" ; | ||||
|       Those = det Pl "tie" "tās" ; | ||||
|     Mod quality kind = {s = \\n => quality.s ! Q1 ! kind.g ! n ! Def ++ kind.s ! n ; g = kind.g } ; | ||||
|       Wine = noun "vīns" "vīni" Masc ; | ||||
|       Cheese = noun "siers" "sieri" Masc ; | ||||
|       Fish = noun "zivs" "zivis" Fem ; | ||||
|       Pizza = noun "pica" "picas" Fem ; | ||||
|     Very qual = {s = \\q,g,n,spec => "ļoti" ++ qual.s ! Q2 ! g ! n ! spec };  | ||||
|   | ||||
|       Fresh = adjective "svaigs" "svaiga" "svaigi" "svaigas" "svaigais" "svaigā" "svaigie" "svaigās" ; | ||||
|       Warm = regAdj "silts" ; | ||||
|       Italian = specAdj "itāļu" (regAdj "itālisks") ; | ||||
|       Expensive = regAdj "dārgs" ; | ||||
|       Delicious = regAdj "garšīgs" ; | ||||
|       Boring = regAdj "garlaicīgs" ; | ||||
|  | ||||
|   param | ||||
|     Number = Sg | Pl ; | ||||
|     Gender = Masc | Fem ; | ||||
|     Defin = Ind | Def ; | ||||
|     Q = Q1 | Q2 ; | ||||
|  | ||||
|   oper | ||||
|    det : Number -> Str -> Str -> {s : Number => Str ; g : Gender} ->  | ||||
|         {s : Str ; g : Gender ; n : Number} =  | ||||
|       \n,m,f,cn -> { | ||||
|         s = case cn.g of {Masc => m ; Fem => f} ++ cn.s ! n ; | ||||
|         g = cn.g ; | ||||
|         n = n | ||||
|       } ; | ||||
|     noun : Str -> Str -> Gender -> {s : Number => Str ; g : Gender} =  | ||||
|       \man,men,g -> { | ||||
|         s = table { | ||||
|           Sg => man ; | ||||
|           Pl => men  | ||||
|           } ; | ||||
|         g = g | ||||
|       } ; | ||||
|     adjective : (_,_,_,_,_,_,_,_ : Str) -> {s : Q => Gender => Number => Defin => Str} =  | ||||
|       \skaists,skaista,skaisti,skaistas,skaistais,skaistaa,skaistie,skaistaas -> { | ||||
|         s = table { | ||||
| 		  _ => table { | ||||
|             Masc => table { | ||||
|               Sg => table {Ind => skaists ; Def => skaistais} ; | ||||
|               Pl => table {Ind => skaisti ; Def => skaistie} | ||||
|               } ;  | ||||
|             Fem => table { | ||||
|               Sg => table {Ind => skaista ; Def => skaistaa} ; | ||||
|               Pl => table {Ind => skaistas ; Def => skaistaas}  | ||||
|               } | ||||
|             }  | ||||
| 		  } | ||||
|         } ; | ||||
|        | ||||
|  {-   irregAdj : Str -> {s : Gender => Number => Defin => Str} = \itaalju -> | ||||
|      let itaalju = itaalju | ||||
|      in adjective itaalju (itaalju) (itaalju) (itaalju) (itaalju) (itaalju) (itaalju) (itaalju) ; -} | ||||
|       | ||||
|     regAdj : Str -> {s : Q => Gender => Number => Defin => Str} = \skaists -> | ||||
|       let skaist = init skaists  | ||||
|       in adjective skaists (skaist + "a") (skaist + "i") (skaist + "as") (skaist + "ais") (skaist + "ā") (skaist + "ie") (skaist + "ās"); | ||||
|  | ||||
|     Adjective : Type = {s : Q => Gender => Number => Defin => Str} ; | ||||
|  | ||||
| 	specAdj : Str -> Adjective -> Adjective = \s,a -> { | ||||
|       s = table { | ||||
|         Q2 => a.s ! Q1 ; | ||||
|         Q1 => \\_,_,_ => s | ||||
|         }		 | ||||
| 	  } ; | ||||
| 	 | ||||
| 	} | ||||
							
								
								
									
										105
									
								
								samples/Grammatical Framework/FoodsMlt.gf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										105
									
								
								samples/Grammatical Framework/FoodsMlt.gf
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,105 @@ | ||||
| -- (c) 2013 John J. Camilleri under LGPL | ||||
|  | ||||
| concrete FoodsMlt of Foods = open Prelude in { | ||||
|   flags coding=utf8 ; | ||||
|  | ||||
|   lincat | ||||
|     Comment = SS ; | ||||
|     Quality = {s : Gender => Number => Str} ; | ||||
|     Kind = {s : Number => Str ; g : Gender} ; | ||||
|     Item = {s : Str ; g : Gender ; n : Number} ; | ||||
|  | ||||
|   lin | ||||
|     -- Pred item quality = ss (item.s ++ copula item.n item.g ++ quality.s ! item.g ! item.n) ; | ||||
|     Pred item quality = ss (item.s ++ quality.s ! item.g ! item.n) ; | ||||
|  | ||||
|     This kind = det Sg "dan" "din" kind ; | ||||
|     That kind = det Sg "dak" "dik" kind ; | ||||
|     These kind = det Pl "dawn" "" kind ; | ||||
|     Those kind = det Pl "dawk" "" kind ; | ||||
|  | ||||
|     Mod quality kind = { | ||||
|       s = \\n => kind.s ! n ++ quality.s ! kind.g ! n ; | ||||
|       g = kind.g | ||||
|       } ; | ||||
|  | ||||
|     Wine = noun "inbid" "inbejjed" Masc ; | ||||
|     Cheese = noun "ġobon" "ġobniet" Masc ; | ||||
|     Fish = noun "ħuta" "ħut" Fem ; | ||||
|     Pizza = noun "pizza" "pizzez" Fem ; | ||||
|  | ||||
|     Very qual = {s = \\g,n => qual.s ! g ! n ++ "ħafna"} ; | ||||
|  | ||||
|     Warm = adjective "sħun" "sħuna" "sħan" ; | ||||
|     Expensive = adjective "għali" "għalja" "għaljin" ; | ||||
|     Delicious = adjective "tajjeb" "tajba" "tajbin" ; | ||||
|     Boring = uniAdj "tad-dwejjaq" ; | ||||
|     Fresh = regAdj "frisk" ; | ||||
|     Italian = regAdj "Taljan" ; | ||||
|  | ||||
|   param | ||||
|     Number = Sg | Pl ; | ||||
|     Gender = Masc | Fem ; | ||||
|  | ||||
|   oper | ||||
|     --Create an adjective (full function) | ||||
|     --Params: Sing Masc, Sing Fem, Plural | ||||
|     adjective : (_,_,_ : Str) -> {s : Gender => Number => Str} = \iswed,sewda,suwed -> { | ||||
|       s = table { | ||||
| 	Masc => table { | ||||
| 	  Sg => iswed ; | ||||
| 	  Pl => suwed | ||||
| 	  } ; | ||||
| 	Fem => table { | ||||
| 	  Sg => sewda ; | ||||
| 	  Pl => suwed | ||||
| 	  } | ||||
| 	} | ||||
|       } ; | ||||
|  | ||||
|     --Create a regular adjective | ||||
|     --Param: Sing Masc | ||||
|     regAdj : Str -> {s : Gender => Number => Str} = \frisk -> | ||||
|       adjective frisk (frisk + "a") (frisk + "i") ; | ||||
|  | ||||
|     --Create a "uni-adjective" eg tal-buzz | ||||
|     --Param: Sing Masc | ||||
|     uniAdj : Str -> {s : Gender => Number => Str} = \uni -> | ||||
|       adjective uni uni uni ; | ||||
|  | ||||
|     --Create a noun | ||||
|     --Params: Singular, Plural, Gender (inherent) | ||||
|     noun : Str -> Str -> Gender -> {s : Number => Str ; g : Gender} = \ktieb,kotba,g -> { | ||||
|       s = table { | ||||
| 	Sg => ktieb ; | ||||
| 	Pl => kotba | ||||
| 	} ; | ||||
|       g = g | ||||
|       } ; | ||||
|  | ||||
|     --Copula is a linking verb | ||||
|     --Params: Number, Gender | ||||
|     -- copula : Number -> Gender -> Str = \n,g -> case n of { | ||||
|     --   Sg => case g of { Masc => "huwa" ; Fem => "hija" } ; | ||||
|     --   Pl => "huma" | ||||
|     --   } ; | ||||
|  | ||||
|     --Create an article, taking into account first letter of next word | ||||
|     article = pre { | ||||
|       "a"|"e"|"i"|"o"|"u" => "l-" ; | ||||
|       --cons@("ċ"|"d"|"n"|"r"|"s"|"t"|"x"|"ż") => "i" + cons + "-" ; | ||||
|       _ => "il-" | ||||
|       } ; | ||||
|  | ||||
|     --Create a determinant | ||||
|     --Params: Sg/Pl, Masc, Fem | ||||
|     det : Number -> Str -> Str -> {s : Number => Str ; g : Gender} -> {s : Str ; g : Gender ; n : Number} = \n,m,f,cn -> { | ||||
|       s = case n of { | ||||
| 	Sg => case cn.g of {Masc => m ; Fem => f}; --string | ||||
| 	Pl => m --default to masc | ||||
| 	} ++ article ++ cn.s ! n ; | ||||
|       g = cn.g ; --gender | ||||
|       n = n --number | ||||
|       } ; | ||||
|  | ||||
| } | ||||
							
								
								
									
										49
									
								
								samples/Grammatical Framework/FoodsMon.gf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										49
									
								
								samples/Grammatical Framework/FoodsMon.gf
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,49 @@ | ||||
| --# -path=.:/GF/lib/src/prelude | ||||
|  | ||||
| -- (c) 2009 Nyamsuren Erdenebadrakh under LGPL | ||||
|  | ||||
| concrete FoodsMon of Foods = open Prelude in { | ||||
|   flags coding=utf8; | ||||
|  | ||||
|   lincat | ||||
|     Comment, Quality = SS ;  | ||||
| 	Kind = {s : Number => Str} ;  | ||||
|     Item = {s : Str ; n : Number} ;  | ||||
|  | ||||
|   lin | ||||
| 	Pred item quality = ss (item.s ++ "бол" ++ quality.s) ; | ||||
| 	This  = det Sg "энэ" ; | ||||
| 	That  = det Sg "тэр" ; | ||||
| 	These = det Pl "эдгээр" ; | ||||
| 	Those = det Pl "тэдгээр" ; | ||||
| 	Mod quality kind = {s = \\n => quality.s ++ kind.s ! n} ; | ||||
| 	Wine = regNoun "дарс" ; | ||||
| 	Cheese = regNoun "бяслаг" ; | ||||
| 	Fish = regNoun "загас" ; | ||||
| 	Pizza = regNoun "пицца" ; | ||||
| 	Very = prefixSS "маш" ; | ||||
| 	Fresh = ss "шинэ" ; | ||||
| 	Warm = ss "халуун" ; | ||||
| 	Italian = ss "итали" ; | ||||
| 	Expensive = ss "үнэтэй" ; | ||||
| 	Delicious = ss "амттай" ; | ||||
| 	Boring = ss "амтгүй" ; | ||||
|  | ||||
|   param | ||||
|     Number = Sg | Pl ; | ||||
|  | ||||
|   oper | ||||
| 	det : Number -> Str -> {s : Number => Str} -> {s : Str ; n : Number} =  | ||||
| 	\n,d,cn -> { | ||||
| 		s = d ++ cn.s ! n ; | ||||
| 		n = n | ||||
| 	} ; | ||||
|   	 | ||||
| 	regNoun : Str -> {s : Number => Str} =  | ||||
| 	\x -> {s = table { | ||||
| 		Sg => x ;  | ||||
| 		Pl => x + "нууд"} | ||||
| 		} ; | ||||
| 	} | ||||
| 	  | ||||
|      | ||||
							
								
								
									
										60
									
								
								samples/Grammatical Framework/FoodsNep.gf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										60
									
								
								samples/Grammatical Framework/FoodsNep.gf
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,60 @@ | ||||
| -- (c) 2011 Dinesh Simkhada under LGPL | ||||
|  | ||||
| concrete FoodsNep of Foods = { | ||||
|  | ||||
|   flags coding = utf8 ; | ||||
|  | ||||
|   lincat | ||||
|     Comment, Quality = {s : Str} ;  | ||||
|     Kind = {s : Number => Str} ;  | ||||
|     Item = {s : Str ; n : Number} ;  | ||||
|      | ||||
|   lin | ||||
|     Pred item quality =  | ||||
|       {s = item.s ++ quality.s ++ copula ! item.n} ; | ||||
|        | ||||
|     This  = det Sg "यो" ; | ||||
|     That  = det Sg "त्यो" ; | ||||
|     These = det Pl "यी" ; | ||||
|     Those = det Pl "ती" ; | ||||
|     Mod quality kind =  | ||||
|       {s = \\n => quality.s ++ kind.s ! n} ; | ||||
|        | ||||
|     Wine = regNoun "रक्सी" ; | ||||
|     Cheese = regNoun "चिज" ; | ||||
|     Fish = regNoun "माछा" ; | ||||
|     Pizza = regNoun "पिज्जा" ; | ||||
|     Very a = {s = "धेरै" ++ a.s} ; | ||||
|     Fresh = adj "ताजा" ; | ||||
|     Warm = adj "तातो" ; | ||||
|     Italian = adj "इटालियन" ; | ||||
|     Expensive = adj "महँगो" | adj "बहुमूल्य" ; | ||||
|     Delicious = adj "स्वादिष्ट" | adj "मीठो" ; | ||||
|     Boring = adjPl "नमिठो" ; | ||||
|    | ||||
|   param | ||||
|     Number = Sg | Pl ; | ||||
|      | ||||
|   oper | ||||
|     det : Number -> Str ->  | ||||
|       {s : Number => Str} -> {s : Str ; n : Number} =  | ||||
|         \n,det,noun -> {s = det ++ noun.s ! n ; n = n} ; | ||||
|      | ||||
|     noun : Str -> Str -> {s : Number => Str} =  | ||||
|       \man,men -> {s = table {Sg => man ; Pl => men}} ; | ||||
|      | ||||
|     regNoun : Str -> {s : Number => Str} =  | ||||
|       \car -> noun car (car + "हरु") ; | ||||
|      | ||||
|     adjPl : Str -> {s : Str} = \a -> case a of { | ||||
|       bor + "ठो" => adj (bor + "ठा") ; | ||||
|       _ => adj a | ||||
|       } ; | ||||
|        | ||||
|     adj : Str -> {s : Str} =  | ||||
|       \cold -> {s = cold} ; | ||||
|      | ||||
|     copula : Number => Str =  | ||||
|       table {Sg => "छ" ; Pl => "छन्"} ; | ||||
| } | ||||
|  | ||||
							
								
								
									
										30
									
								
								samples/Grammatical Framework/FoodsOri.gf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								samples/Grammatical Framework/FoodsOri.gf
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,30 @@ | ||||
| concrete FoodsOri of Foods = { | ||||
|  | ||||
| flags coding = utf8 ; | ||||
|  | ||||
| lincat | ||||
|     Comment = Str; | ||||
|     Item = Str; | ||||
|     Kind = Str; | ||||
|     Quality = Str; | ||||
|  | ||||
| lin | ||||
|     Pred item quality = item ++ quality ++ "ଅଟେ"; | ||||
|     This kind = "ଏଇ" ++ kind; | ||||
|     That kind = "ସେଇ" ++ kind; | ||||
|     These kind = "ଏଇ" ++ kind ++ "ଗୁଡିକ" ; | ||||
|     Those kind = "ସେଇ" ++ kind ++ "ଗୁଡିକ" ; | ||||
|     Mod quality kind = quality ++ kind; | ||||
|     Wine  = "ମଦ"; | ||||
|     Cheese  = "ଛେନା"; | ||||
|     Fish  = "ମାଛ"; | ||||
|     Pizza = "ପିଜଜ଼ା" ; | ||||
|     Very quality = "ଅତି" ++ quality; | ||||
|     Fresh  = "ତାଜା"; | ||||
|     Warm  = "ଗରମ"; | ||||
|     Italian  = "ଇଟାଲି"; | ||||
|     Expensive  = "ମୁଲ୍ୟବାନ୍"; | ||||
|     Delicious  = "ସ୍ଵାଦିସ୍ଟ "; | ||||
|     Boring  = "ଅରୁଚିକର"; | ||||
|  | ||||
| } | ||||
							
								
								
									
										65
									
								
								samples/Grammatical Framework/FoodsPes.gf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										65
									
								
								samples/Grammatical Framework/FoodsPes.gf
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,65 @@ | ||||
| concrete FoodsPes of Foods = { | ||||
|  | ||||
|       flags optimize=noexpand ; coding=utf8 ; | ||||
| 	   | ||||
|       lincat | ||||
|         Comment = {s : Str} ; | ||||
| 		Quality = {s : Add => Str; prep : Str} ; | ||||
|         Kind = {s : Add => Number => Str ; prep : Str}; | ||||
|         Item = {s : Str ; n : Number}; | ||||
|       lin | ||||
|         Pred item quality = {s = item.s ++ quality.s ! Indep ++ copula ! item.n} ; | ||||
|         This = det Sg "این" ; | ||||
|         That = det Sg "آن" ; | ||||
|         These = det Pl "این" ; | ||||
|         Those = det Pl "آن" ; | ||||
|          | ||||
|         Mod quality kind = {s = \\a,n =>  kind.s ! Attr ! n ++ kind.prep ++ quality.s ! a ;                                   | ||||
|                             prep = quality.prep              | ||||
|                             }; | ||||
|         Wine = regN "شراب" ;  | ||||
|         Cheese = regN "پنیر" ; | ||||
|         Fish = regN "ماهى" ; | ||||
|         Pizza = regN "پیتزا" ; | ||||
|         Very a = {s = \\at => "خیلی" ++ a.s ! at ; prep = a.prep} ; | ||||
|         Fresh = adj "تازه" ; | ||||
|         Warm = adj "گرم" ; | ||||
|         Italian = adj "ایتالیایی" ; | ||||
|         Expensive = adj "گران" ; | ||||
|         Delicious = adj "لذىذ" ; | ||||
|         Boring = adj "ملال آور" ;  -- it must be written as ملال آور.  | ||||
|       | ||||
|      param | ||||
|         Number = Sg | Pl ; | ||||
| 		Add = Indep | Attr ; | ||||
|      oper | ||||
|         det : Number -> Str -> {s: Add => Number => Str ; prep : Str} -> {s : Str ; n: Number} = | ||||
|            \n,det,noun -> {s = det ++ noun.s ! Indep ! n ; n = n }; | ||||
|             | ||||
|         noun : (x1,_,_,x4 : Str) -> {s : Add => Number => Str ; prep : Str} = \pytzA, pytzAy, pytzAhA,pr ->  | ||||
|          {s = \\a,n => case <a,n> of | ||||
| 		        {<Indep,Sg> => pytzA ; <Indep,Pl> => pytzAhA ; | ||||
|   				 <Attr,Sg>  =>pytzA ; <Attr,Pl>  => pytzAhA + "ى" }; | ||||
| 		 prep = pr | ||||
| 		 };		  | ||||
|           | ||||
|         regN : Str -> {s: Add => Number => Str ; prep : Str} = \mrd ->  | ||||
| 		case mrd of  | ||||
| 		{ _ + ("ا"|"ه"|"ى"|"و"|"") => noun mrd (mrd+"ى") (mrd + "ها") ""; | ||||
| 		  _                        => noun mrd mrd (mrd + "ها") "e" | ||||
| 		}; | ||||
|          | ||||
|         adj : Str -> {s : Add => Str; prep : Str} = \tAzh ->  | ||||
| 		case tAzh of  | ||||
| 		{ _ + ("ا"|"ه"|"ى"|"و"|"") => mkAdj tAzh (tAzh ++ "ى") "" ; | ||||
| 		  _                        => mkAdj tAzh tAzh "ه" | ||||
|         }; | ||||
| 		 | ||||
| 		mkAdj : Str -> Str -> Str -> {s : Add => Str; prep : Str} = \tAzh, tAzhy, pr  -> | ||||
| 		{s = table {Indep => tAzh; | ||||
| 		            Attr => tAzhy}; | ||||
| 		 prep = pr 			 | ||||
| 		}; | ||||
|         copula : Number => Str = table {Sg => "است"; Pl => "هستند"}; | ||||
|        | ||||
| } | ||||
							
								
								
									
										79
									
								
								samples/Grammatical Framework/FoodsPor.gf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										79
									
								
								samples/Grammatical Framework/FoodsPor.gf
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,79 @@ | ||||
| -- (c) 2009 Rami Shashati under LGPL | ||||
|  | ||||
| concrete FoodsPor of Foods = open Prelude in { | ||||
|   flags coding=utf8; | ||||
|  | ||||
| 	lincat | ||||
| 	  Comment = {s : Str} ; | ||||
| 	  Quality = {s : Gender => Number => Str} ; | ||||
| 	  Kind = {s : Number => Str ; g : Gender} ; | ||||
| 	  Item = {s : Str ; n : Number ; g : Gender } ; | ||||
|  | ||||
| 	lin | ||||
| 	  Pred item quality = | ||||
| 	    {s = item.s ++ copula ! item.n ++ quality.s ! item.g ! item.n } ; | ||||
| 	  This = det Sg (table {Masc => "este" ; Fem => "esta"}) ; | ||||
| 	  That = det Sg (table {Masc => "esse" ; Fem => "essa"}) ; | ||||
| 	  These = det Pl (table {Masc => "estes" ; Fem => "estas"}) ; | ||||
| 	  Those = det Pl (table {Masc => "esses" ; Fem => "essas"}) ; | ||||
|  | ||||
| 	  Mod quality kind = { s = \\n => kind.s ! n ++ quality.s ! kind.g ! n ; g = kind.g } ; | ||||
|  | ||||
| 	  Wine = regNoun "vinho" Masc ; | ||||
| 	  Cheese = regNoun "queijo" Masc ; | ||||
| 	  Fish = regNoun "peixe" Masc ; | ||||
| 	  Pizza = regNoun "pizza" Fem ; | ||||
|  | ||||
|       Very a = { s = \\g,n => "muito" ++ a.s ! g ! n } ; | ||||
|  | ||||
|       Fresh = mkAdjReg "fresco" ; | ||||
|       Warm = mkAdjReg "quente" ; | ||||
|       Italian = mkAdjReg "Italiano" ; | ||||
|       Expensive = mkAdjReg "caro" ; | ||||
|       Delicious = mkAdjReg "delicioso" ; | ||||
|       Boring = mkAdjReg "chato" ; | ||||
|  | ||||
| 	param | ||||
| 	  Number = Sg | Pl ; | ||||
| 	  Gender = Masc | Fem ; | ||||
|  | ||||
| 	oper | ||||
| 	  QualityT : Type = {s : Gender => Number => Str} ; | ||||
|  | ||||
| 	  mkAdj : (_,_,_,_ : Str) -> QualityT = \bonito,bonita,bonitos,bonitas -> { | ||||
| 	  	s = table { | ||||
| 	  		Masc => table { Sg => bonito ; Pl => bonitos } ; | ||||
| 	  		Fem => table { Sg => bonita ; Pl => bonitas } | ||||
| 	    } ; | ||||
| 	  } ; | ||||
|  | ||||
| 	  -- regular pattern | ||||
| 	  adjSozinho : Str -> QualityT = \sozinho -> | ||||
|         let sozinh = Predef.tk 1 sozinho | ||||
|         in mkAdj sozinho (sozinh + "a") (sozinh + "os") (sozinh + "as") ; | ||||
|  | ||||
|       -- for gender-independent adjectives | ||||
|       adjUtil : Str -> Str -> QualityT = \util,uteis -> | ||||
|         mkAdj util util uteis uteis ; | ||||
|  | ||||
|       -- smart paradigm for adjcetives | ||||
|       mkAdjReg : Str -> QualityT = \a -> case last a of { | ||||
|       	"o" => adjSozinho a ; | ||||
|         "e" => adjUtil a (a + "s") | ||||
|       } ; | ||||
|  | ||||
|       ItemT : Type = {s : Str ; n : Number ; g : Gender } ; | ||||
|  | ||||
|       det : Number -> (Gender => Str) -> KindT -> ItemT = | ||||
|         \num,det,noun -> {s = det ! noun.g ++ noun.s ! num ; n = num ; g = noun.g } ; | ||||
|  | ||||
| 	  KindT : Type = {s : Number => Str ; g : Gender} ; | ||||
|  | ||||
| 	  noun : Str -> Str -> Gender -> KindT = | ||||
| 	    \animal,animais,gen -> {s = table {Sg => animal ; Pl => animais} ; g = gen } ; | ||||
|  | ||||
| 	  regNoun : Str -> Gender -> KindT = | ||||
| 	    \carro,gen -> noun carro (carro + "s") gen ; | ||||
|  | ||||
| 	  copula : Number => Str = table {Sg => "é" ; Pl => "são"} ; | ||||
| } | ||||
							
								
								
									
										72
									
								
								samples/Grammatical Framework/FoodsRon.gf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										72
									
								
								samples/Grammatical Framework/FoodsRon.gf
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,72 @@ | ||||
| -- (c) 2009 Ramona Enache under LGPL | ||||
|  | ||||
| concrete FoodsRon of Foods =  | ||||
| { | ||||
| flags coding=utf8 ; | ||||
|  | ||||
| param Number = Sg | Pl ; | ||||
|       Gender = Masc | Fem ; | ||||
|       NGender = NMasc | NFem | NNeut ; | ||||
| lincat  | ||||
| Comment = {s : Str}; | ||||
| Quality = {s : Number => Gender => Str}; | ||||
| Kind = {s : Number => Str; g : NGender}; | ||||
| Item = {s : Str ; n : Number; g : Gender}; | ||||
|  | ||||
| lin | ||||
|  | ||||
| This = det Sg (mkTab "acest" "această"); | ||||
| That = det Sg (mkTab "acel" "acea"); | ||||
| These = det Pl (mkTab "acești" "aceste"); | ||||
| Those = det Pl (mkTab "acei" "acele"); | ||||
|  | ||||
| Wine = mkNoun "vin" "vinuri" NNeut ; | ||||
| Cheese = mkNoun "brânză" "brânzeturi" NFem ; | ||||
| Fish = mkNoun "peşte" "peşti" NMasc ; | ||||
| Pizza = mkNoun "pizza" "pizze" NFem; | ||||
|  | ||||
| Very a = {s = \\n,g => "foarte" ++ a.s ! n ! g}; | ||||
|  | ||||
| Fresh = mkAdj "proaspăt" "proaspătă" "proaspeţi" "proaspete" ; | ||||
| Warm = mkAdj "cald" "caldă" "calzi" "calde" ; | ||||
| Italian = mkAdj "italian" "italiană" "italieni" "italiene" ; | ||||
| Expensive = mkAdj "scump" "scumpă" "scumpi" "scumpe" ; | ||||
| Delicious = mkAdj "delicios" "delcioasă" "delicioşi" "delicioase" ; | ||||
| Boring = mkAdj "plictisitor" "plictisitoare" "plictisitori" "plictisitoare" ; | ||||
|  | ||||
| Pred item quality = {s = item.s ++ copula ! item.n ++ quality.s ! item.n ! item.g} ; | ||||
|  | ||||
| Mod quality kind = {s = \\n => kind.s ! n ++ quality.s ! n ! (getAgrGender kind.g n) ; g = kind.g}; | ||||
|  | ||||
| oper  | ||||
|  | ||||
| mkTab : Str -> Str -> {s : Gender => Str} = \acesta, aceasta -> | ||||
| {s = table{Masc => acesta; | ||||
|       Fem  => aceasta}}; | ||||
|  | ||||
| det : Number -> {s : Gender => Str} -> {s : Number => Str ; g : NGender} -> {s : Str; n : Number; g : Gender} = | ||||
| \n,det,noun -> let gg = getAgrGender noun.g n  | ||||
|   in | ||||
|    {s =  det.s ! gg  ++ noun.s ! n  ; n = n ; g = gg}; | ||||
|  | ||||
| mkNoun : Str -> Str -> NGender -> {s : Number => Str; g : NGender} = \peste, pesti,g -> | ||||
| {s = table {Sg => peste; | ||||
|             Pl => pesti}; | ||||
|  g = g | ||||
| }; | ||||
|  | ||||
| oper mkAdj : (x1,_,_,x4 : Str) -> {s : Number => Gender => Str} = \scump, scumpa, scumpi, scumpe -> | ||||
| {s = \\n,g => case <n,g> of | ||||
| {<Sg,Masc> => scump ; <Sg,Fem> => scumpa; | ||||
| <Pl,Masc> => scumpi ; <Pl,Fem> => scumpe | ||||
| }}; | ||||
|  | ||||
| copula : Number => Str = table {Sg => "este" ; Pl => "sunt"}; | ||||
|  | ||||
| getAgrGender : NGender -> Number -> Gender = \ng,n -> | ||||
| case <ng,n> of | ||||
| {<NMasc,_> => Masc ; <NFem,_> => Fem; | ||||
| <NNeut,Sg> => Masc ; <NNeut,Pl> => Fem | ||||
| }; | ||||
|  | ||||
| } | ||||
							
								
								
									
										31
									
								
								samples/Grammatical Framework/FoodsSpa.gf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								samples/Grammatical Framework/FoodsSpa.gf
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,31 @@ | ||||
| --# -path=.:present | ||||
|  | ||||
| concrete FoodsSpa of Foods = open SyntaxSpa, StructuralSpa, ParadigmsSpa in { | ||||
|  | ||||
| 	lincat | ||||
| 		Comment = Utt ; | ||||
| 		Item = NP ; | ||||
| 		Kind = CN ; | ||||
| 		Quality = AP ; | ||||
|  | ||||
| 	lin | ||||
| 		Pred item quality = mkUtt (mkCl item quality) ; | ||||
| 		This kind = mkNP this_QuantSg kind ; | ||||
| 		That kind = mkNP that_QuantSg kind ; | ||||
| 		These kind = mkNP these_QuantPl kind ; | ||||
| 		Those kind = mkNP those_QuantPl kind ; | ||||
| 		Mod quality kind = mkCN quality kind ; | ||||
| 		Very quality = mkAP very_AdA quality ; | ||||
| 		Wine = mkCN (mkN "vino") ; | ||||
|                 Pizza = mkCN (mkN "pizza") ; | ||||
|                 Cheese = mkCN (mkN "queso") ; | ||||
|                 Fish = mkCN (mkN "pescado") ; | ||||
|                 Fresh = mkAP (mkA "fresco") ; | ||||
|                 Warm = mkAP (mkA "caliente") ; | ||||
|                 Italian = mkAP (mkA "italiano") ; | ||||
|                 Expensive = mkAP (mkA "caro") ; | ||||
|                 Delicious = mkAP (mkA "delicioso") ; | ||||
|                 Boring = mkAP (mkA "aburrido") ; | ||||
|  | ||||
| } | ||||
|  | ||||
							
								
								
									
										7
									
								
								samples/Grammatical Framework/FoodsSwe.gf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								samples/Grammatical Framework/FoodsSwe.gf
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,7 @@ | ||||
| --# -path=.:present | ||||
|  | ||||
| -- (c) 2009 Aarne Ranta under LGPL | ||||
|  | ||||
| concrete FoodsSwe of Foods = FoodsI with  | ||||
|   (Syntax = SyntaxSwe), | ||||
|   (LexFoods = LexFoodsSwe) ** {flags language = sv_SE;} ; | ||||
							
								
								
									
										33
									
								
								samples/Grammatical Framework/FoodsTha.gf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								samples/Grammatical Framework/FoodsTha.gf
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,33 @@ | ||||
| --# -path=.:alltenses | ||||
|  | ||||
| concrete FoodsTha of Foods = open SyntaxTha, LexiconTha, | ||||
|   ParadigmsTha, (R=ResTha) in { | ||||
|  | ||||
|         flags coding = utf8 ; | ||||
|  | ||||
| 	lincat | ||||
| 		Comment = Utt ; | ||||
| 		Item = NP ; | ||||
| 		Kind = CN ; | ||||
| 		Quality = AP ; | ||||
|  | ||||
| 	lin | ||||
| 		Pred item quality = mkUtt (mkCl item quality) ; | ||||
| 		This kind = mkNP this_Det kind ; | ||||
| 		That kind = mkNP that_Det kind ; | ||||
| 		These kind = mkNP these_Det kind ; | ||||
| 		Those kind = mkNP those_Det kind ; | ||||
| 		Mod quality kind = mkCN quality kind ; | ||||
| 		Very quality = mkAP very_AdA quality ; | ||||
| 		Wine = mkCN (mkN (R.thword "เหล้าอ" "งุ่น") "ขวด") ; | ||||
|                 Pizza = mkCN (mkN (R.thword "พิซ" "ซา") "ถาด") ; | ||||
|                 Cheese = mkCN (mkN (R.thword "เนย" "แข็ง") "ก้อน") ; | ||||
|                 Fish = mkCN fish_N ; | ||||
|                 Fresh = mkAP (mkA "สด") ; | ||||
|                 Warm = mkAP warm_A ; | ||||
|                 Italian = mkAP (mkA " อิตาลี") ; | ||||
|                 Expensive = mkAP (mkA "แพง") ; | ||||
|                 Delicious = mkAP (mkA "อร่อย") ; | ||||
|                 Boring = mkAP (mkA (R.thword "น่า" "เบิ่อ")) ; | ||||
|  | ||||
| } | ||||
							
								
								
									
										178
									
								
								samples/Grammatical Framework/FoodsTsn.gf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										178
									
								
								samples/Grammatical Framework/FoodsTsn.gf
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,178 @@ | ||||
| --# -path=alltenses | ||||
|  | ||||
| -- (c) 2009 Laurette Pretorius Sr & Jr and Ansu Berg under LGPL | ||||
|  | ||||
| concrete FoodsTsn of Foods = open Prelude, Predef in { | ||||
| 	flags coding = utf8; | ||||
| 	lincat | ||||
| 		Comment = {s:Str}; | ||||
| 		Item = {s:Str; c:NounClass; n:Number}; | ||||
| 		Kind = {w: Number => Str; r: Str; c: NounClass; q: Number => Str; b: Bool}; | ||||
| 		Quality = {s: NounClass => Number => Str; p_form: Str; t: TType}; | ||||
| 	lin	 | ||||
| 		Pred item quality = {s = item.s ++ ((mkPredDescrCop quality.t) ! item.c ! item.n) ++ quality.p_form}; | ||||
|  | ||||
| 		This kind = {s = (kind.w ! Sg) ++ (mkDemPron1 ! kind.c ! Sg) ++ (kind.q ! Sg); c = kind.c; n = Sg}; | ||||
| 		That kind = {s = (kind.w ! Sg) ++ (mkDemPron2 ! kind.c ! Sg) ++ (kind.q ! Sg); c = kind.c; n = Sg}; | ||||
| 		These kind = {s = (kind.w ! Pl) ++ (mkDemPron1 ! kind.c ! Pl) ++ (kind.q ! Pl); c = kind.c; n = Pl}; | ||||
| 		Those kind = {s = (kind.w ! Pl) ++ (mkDemPron2 ! kind.c ! Pl) ++ (kind.q ! Pl); c = kind.c; n = Pl};	 | ||||
| 		 | ||||
| 		Mod quality kind = mkMod quality kind; | ||||
|  | ||||
| 	-- Lexicon | ||||
| 		Wine = mkNounNC14_6 "jalwa"; | ||||
| 		Cheese = mkNounNC9_10 "kase"; | ||||
| 		Fish = mkNounNC9_10 "thlapi"; | ||||
| 		Pizza = mkNounNC9_10 "pizza"; | ||||
| 		Very quality = smartVery quality;  | ||||
| 		Fresh = mkVarAdj "ntsha"; | ||||
| 		Warm = mkOrdAdj "bothitho"; | ||||
| 		Italian = mkPerAdj "Itali"; | ||||
| 		Expensive = mkVerbRel "tura";  | ||||
| 		Delicious = mkOrdAdj "monate"; | ||||
| 		Boring = mkOrdAdj "bosula"; | ||||
| 		 | ||||
| 	param | ||||
| 		NounClass = NC9_10 | NC14_6; | ||||
| 		Number = Sg | Pl; | ||||
| 		TType = P | V | ModV | R ;				 | ||||
| 	oper | ||||
| 		mkMod : {s: NounClass => Number => Str; p_form: Str; t: TType} -> {w: Number => Str; r: Str; c: NounClass; q: Number => Str; b: Bool} -> {w: Number => Str; r: Str; c: NounClass; q: Number => Str;  | ||||
| 		b: Bool} = \x,y -> case y.b of | ||||
| 		{ | ||||
| 			True => {w = y.w; r = y.r; c = y.c;  | ||||
| 				q = table { | ||||
| 				Sg => ((y.q ! Sg) ++ "le" ++ ((smartQualRelPart (x.t)) ! y.c ! Sg) ++ ((smartDescrCop (x.t)) ! 					y.c ! Sg) ++ (x.s ! y.c ! Sg));  | ||||
| 				Pl => ((y.q ! Pl) ++ "le" ++ ((smartQualRelPart (x.t))! y.c ! Pl) ++ ((smartDescrCop (x.t)) ! 					y.c ! Pl) ++(x.s ! y.c ! Pl)) | ||||
| 				  }; b = True | ||||
| 				}; | ||||
| 			False => {w = y.w; r = y.r; c = y.c;  | ||||
| 				q = table { | ||||
| 				Sg => ((y.q ! Sg) ++ ((smartQualRelPart (x.t)) ! y.c ! Sg) ++ ((smartDescrCop (x.t)) ! y.c ! Sg) 					++ (x.s ! y.c ! Sg));  | ||||
| 				Pl => ((y.q ! Pl) ++ ((smartQualRelPart (x.t)) ! y.c ! Pl) ++ ((smartDescrCop (x.t)) ! y.c ! Pl) 					++(x.s ! y.c ! Pl)) | ||||
| 				  }; b = True | ||||
| 				} | ||||
| 		}; | ||||
|  | ||||
| 		mkNounNC14_6 : Str -> {w: Number => Str; r: Str; c: NounClass; q: Number => Str; b: Bool} = \x -> {w = table {Sg => "bo" + x; Pl => "ma" + x}; r = x; c = NC14_6;  | ||||
| 		q = table {Sg => ""; Pl => ""}; b = False}; | ||||
| 		 | ||||
| 		mkNounNC9_10 : Str -> {w: Number => Str; r: Str; c: NounClass; q: Number => Str; b: Bool} = \x -> {w = table {Sg => "" + x; Pl => "di" + x}; r = x; c = NC9_10;  | ||||
| 		q = table {Sg => ""; Pl => ""}; b = False}; | ||||
|  | ||||
| 		mkVarAdj : Str -> {s: NounClass => Number => Str; p_form: Str; t: TType} = \x ->  | ||||
| 		{ | ||||
| 			s = table { | ||||
| 				NC9_10 => table {Sg => "" + x; Pl => "di" + x}; | ||||
| 				NC14_6 => table {Sg => "bo" + x; Pl => "ma" + x} | ||||
| 				}; | ||||
| 			p_form = x; | ||||
| 			t = R; | ||||
| 		}; | ||||
|  | ||||
| 		mkOrdAdj : Str -> {s: NounClass => Number => Str; p_form: Str; t: TType} = \x ->  | ||||
| 		{ | ||||
| 			s = table { | ||||
| 				NC9_10 => table {Sg => "" + x; Pl => "" + x}; | ||||
| 				NC14_6 => table {Sg => "" + x; Pl => "" + x} | ||||
| 				}; | ||||
| 			p_form = x; | ||||
| 			t = R; | ||||
| 		}; | ||||
|  | ||||
| 		mkVerbRel : Str -> {s: NounClass => Number => Str; p_form: Str; t: TType} = \x ->  | ||||
| 		{ | ||||
| 			s = table { | ||||
| 				NC9_10 => table {Sg => x + "ng"; Pl => x + "ng"}; | ||||
| 				NC14_6 => table {Sg => x + "ng"; Pl => x + "ng"} | ||||
| 				}; | ||||
| 			p_form = x; | ||||
| 			t = V; | ||||
| 		}; | ||||
|  | ||||
| 		mkPerAdj : Str -> {s: NounClass => Number => Str; p_form: Str; t: TType} = \x ->  | ||||
| 		{ | ||||
| 			s = table { | ||||
| 				NC9_10 => table {Sg => "" + x; Pl => "" + x}; | ||||
| 				NC14_6 => table {Sg => "" + x; Pl => "" + x} | ||||
| 				}; | ||||
| 			p_form = "mo" ++ x; | ||||
| 			t = P; | ||||
| 		}; | ||||
|  | ||||
| 		mkVeryAdj : {s: NounClass => Number => Str; p_form: Str; t: TType} -> {s: NounClass => Number => Str; p_form: Str; t: TType} = \x -> | ||||
| 		{ | ||||
| 			s = table{c => table{n => (x.s!c!n) ++ "thata"}}; p_form = x.p_form ++ "thata"; t = x.t | ||||
| 		}; | ||||
|  | ||||
| 		mkVeryVerb : {s: NounClass => Number => Str; p_form: Str; t: TType} -> {s: NounClass => Number => Str; p_form: Str; t: TType} = \x -> | ||||
| 		{ | ||||
| 			s = table{c => table{n => (x.s!c!n) ++ "thata"}}; p_form = x.p_form ++ "thata"; t = ModV | ||||
| 		}; | ||||
|  | ||||
| 		smartVery : {s: NounClass => Number => Str; p_form: Str; t: TType} -> {s: NounClass => Number => Str; p_form: Str; t: TType} =  | ||||
| \x -> case x.t of --(x.s!c!n) | ||||
| 		{ | ||||
| 			(V | ModV)	=>	mkVeryVerb x; | ||||
| 			--ModV	=>	mkVeryVerb x; | ||||
| 			_	=>	mkVeryAdj x | ||||
| 		}; | ||||
|  | ||||
| 		mkDemPron1 : NounClass => Number => Str = table | ||||
| 			{ | ||||
| 				NC9_10 => table {Sg => "e"; Pl => "tse"}; | ||||
| 				NC14_6 => table {Sg => "bo"; Pl => "a"} | ||||
| 			}; | ||||
| 		 | ||||
| 		mkDemPron2 : NounClass => Number => Str = table | ||||
| 			{ | ||||
| 				NC9_10 => table {Sg => "eo"; Pl => "tseo"}; | ||||
| 				NC14_6 => table {Sg => "boo"; Pl => "ao"} | ||||
| 			}; | ||||
|  | ||||
| 		smartQualRelPart : TType -> (NounClass => Number => Str) = \x -> case x of  | ||||
| 		{ | ||||
| 			P	=> mkQualRelPart_PName; | ||||
| 			_	=> mkQualRelPart | ||||
| 		}; | ||||
|  | ||||
| 		mkQualRelPart : NounClass => Number => Str = table | ||||
| 			{ | ||||
| 				NC9_10 => table {Sg => "e"; Pl => "tse"}; | ||||
| 				NC14_6 => table {Sg => "bo"; Pl => "a"} | ||||
| 			}; | ||||
|  | ||||
| 		mkQualRelPart_PName : NounClass => Number => Str = table | ||||
| 			{ | ||||
| 				NC9_10 => table {Sg => "ya"; Pl => "tsa"}; | ||||
| 				NC14_6 => table {Sg => "ba"; Pl => "a"} | ||||
| 			}; | ||||
|  | ||||
| 		smartDescrCop : TType -> (NounClass => Number => Str) = \x -> case x of | ||||
| 		{ | ||||
| 			P	=> mkDescrCop_PName; | ||||
| 			_	=> mkDescrCop | ||||
| 		}; | ||||
|  | ||||
| 		mkDescrCop : NounClass => Number => Str = table | ||||
| 			{ | ||||
| 				NC9_10 => table {Sg => "e"; Pl => "di"}; | ||||
| 				NC14_6 => table {Sg => "bo"; Pl => "a"} | ||||
| 			}; | ||||
|  | ||||
| 		mkDescrCop_PName : NounClass => Number => Str = table | ||||
| 			{ | ||||
| 				NC9_10 => table {Sg => "ga"; Pl => "ga"}; | ||||
| 				NC14_6 => table {Sg => "ga"; Pl => "ga"} | ||||
| 			}; | ||||
|  | ||||
| 		mkPredDescrCop : TType -> (NounClass => Number => Str) = \x -> case x of | ||||
| 			{ | ||||
| 				V => table 	{NC9_10 => table {Sg => "e" ++ "a"; Pl => "di" ++ "a"}; | ||||
| 						NC14_6 => table {Sg => "bo" ++ "a"; Pl => "a" ++ "a"}}; | ||||
|  | ||||
| 				_ => table	{NC9_10 => table {Sg => "e"; Pl => "di"}; | ||||
| 						NC14_6 => table {Sg => "bo"; Pl => "a"}} | ||||
| 			}; | ||||
|  | ||||
| } | ||||
							
								
								
									
										140
									
								
								samples/Grammatical Framework/FoodsTur.gf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										140
									
								
								samples/Grammatical Framework/FoodsTur.gf
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,140 @@ | ||||
| {- | ||||
|   File      : FoodsTur.gf | ||||
|   Author    : Server Çimen | ||||
|   Version   : 1.0 | ||||
|   Created on: August 26, 2009 | ||||
|  | ||||
|   This file contains concrete grammar of Foods abstract grammar for Turkish Language. | ||||
|   This grammar is to be used for Fridge demo and developed in the scope of GF Resource | ||||
|   Grammar Summer School. | ||||
|  | ||||
| -} | ||||
|  | ||||
| concrete FoodsTur of Foods = open Predef in { | ||||
|   flags | ||||
|     coding=utf8 ; | ||||
|   lincat | ||||
|     Comment = {s : Str} ; | ||||
|     Quality = {s : Str ; c : Case; softness : Softness; h : Harmony} ; | ||||
|     Kind = {s : Case => Number => Str} ; | ||||
|     Item = {s : Str; n : Number} ; | ||||
|   lin | ||||
|     This = det Sg "bu" ; | ||||
|     That = det Sg "şu" ; | ||||
|     These = det Pl "bu" ; | ||||
|     Those = det Pl "şu" ; | ||||
|     -- Reason for excluding plural form of copula: In Turkish if subject is not a human being, | ||||
|     -- then singular form of copula is used regardless of the number of subject. Since all | ||||
|     -- possible subjects are non human, copula do not need to have plural form. | ||||
|     Pred item quality = {s = item.s ++ quality.s ++ "&+" ++ copula ! quality.softness ! quality.h} ;--! item.n} ; | ||||
|     Mod quality kind = {s = case quality.c of { | ||||
|                               Nom => \\t,n => quality.s ++ kind.s ! t ! n ; | ||||
|                               Gen => \\t,n => quality.s ++ kind.s ! Gen ! n | ||||
|                             } | ||||
|                        } ; | ||||
|     Wine = mkN "şarap" "şaraplar" "şarabı" "şarapları" ; | ||||
|     Cheese = mkN "peynir" "peynirler" "peyniri" "peynirleri" ; | ||||
|     Fish = mkN "balık" "balıklar" "balığı" "balıkları" ; | ||||
|     Pizza = mkN "pizza" "pizzalar" "pizzası" "pizzaları" ; | ||||
|     Very a = {s = "çok" ++ a.s ; c = a.c; softness = a.softness; h = a.h} ; | ||||
|     Fresh = adj "taze" Nom; | ||||
|     Warm = adj "ılık" Nom; | ||||
|     Italian = adj "İtalyan" Gen ; | ||||
|     Expensive = adj "pahalı" Nom; | ||||
|     Delicious = adj "lezzetli" Nom; | ||||
|     Boring = adj "sıkıcı" Nom; | ||||
|   param | ||||
|     Number = Sg | Pl ; | ||||
|     Case = Nom | Gen ; | ||||
|     Harmony = I_Har | Ih_Har | U_Har | Uh_Har ; --Ih = İ; Uh = Ü | ||||
|     Softness = Soft | Hard ; | ||||
|   oper | ||||
|     det : Number -> Str -> {s : Case => Number => Str} -> {s : Str; n : Number} = | ||||
|       \num,det,noun -> {s = det ++ noun.s ! Nom ! num; n = num} ; | ||||
|     mkN = overload { | ||||
|       mkN : Str -> Str -> {s : Case => Number => Str} = regNoun ; | ||||
|       mkn : Str -> Str -> Str -> Str-> {s : Case => Number => Str} = noun ; | ||||
|     } ; | ||||
|     regNoun : Str -> Str -> {s : Case => Number => Str} = | ||||
|       \peynir,peynirler -> noun peynir peynirler [] [] ; | ||||
|     noun : Str -> Str -> Str -> Str-> {s : Case => Number => Str} =  | ||||
|       \sarap,saraplar,sarabi,saraplari -> { | ||||
|         s = table { | ||||
| 	      Nom =>  table { | ||||
| 			Sg => sarap ; | ||||
| 			Pl => saraplar | ||||
| 	              } ; | ||||
|               Gen =>  table { | ||||
|                         Sg => sarabi ; | ||||
| 			Pl => saraplari | ||||
| 	              } | ||||
|               } | ||||
|       }; | ||||
|   {- | ||||
|     Since there is a bug in overloading, this overload is useless. | ||||
|  | ||||
|     mkA = overload { | ||||
|       mkA : Str -> {s : Str; c : Case; softness : Softness; h : Harmony} = \base -> adj base Nom ; | ||||
|       mkA : Str -> Case -> {s : Str; c : Case; softness : Softness; h : Harmony} = adj ; | ||||
|     } ; | ||||
|   -} | ||||
|     adj : Str -> Case -> {s : Str; c : Case; softness : Softness; h : Harmony} = | ||||
|       \italyan,ca -> {s = italyan ; c = ca; softness = (getSoftness italyan); h = (getHarmony italyan)} ; | ||||
|     -- See the comment at lines 26 and 27 for excluded plural form of copula. | ||||
|     copula : Softness => Harmony {-=> Number-} => Str = | ||||
|       table { | ||||
|         Soft => table { | ||||
|                   I_Har => "dır" ;--table { | ||||
| 			   -- Sg => "dır" ; | ||||
| 			   -- Pl => "dırlar" | ||||
| 		  --} ; | ||||
| 		  Ih_Har => "dir" ;--table { | ||||
| 			    --Sg => "dir" ; | ||||
| 			    --Pl => "dirler" | ||||
| 		  --} ; | ||||
| 		  U_Har => "dur" ;--table { | ||||
| 			   -- Sg => "dur" ; | ||||
| 			   -- Pl => "durlar" | ||||
| 		  --} ; | ||||
| 		  Uh_Har => "dür" --table { | ||||
| 			    --Sg => "dür" ; | ||||
| 			    --Pl => "dürler" | ||||
| 		  --} | ||||
|         } ; | ||||
|         Hard => table { | ||||
|                   I_Har => "tır" ;--table { | ||||
| 			    --Sg => "tır" ; | ||||
| 			    --Pl => "tırlar" | ||||
| 		  --} ; | ||||
| 		  Ih_Har => "tir" ;--table { | ||||
| 			    --Sg => "tir" ; | ||||
| 			    --Pl => "tirler" | ||||
| 		  --} ; | ||||
| 		  U_Har => "tur" ;--table { | ||||
| 			   -- Sg => "tur" ; | ||||
| 			   -- Pl => "turlar" | ||||
| 		  --} ; | ||||
| 		  Uh_Har => "tür"--table { | ||||
| 			    --Sg => "tür" ; | ||||
| 			    --Pl => "türler" | ||||
| 		  --} | ||||
|         } | ||||
|       } ; | ||||
|  | ||||
|     getHarmony : Str -> Harmony | ||||
|       = \base -> case base of { | ||||
|                  _+c@("ı"|"a"|"i"|"e"|"u"|"o"|"ü"|"ö")+ | ||||
|                  ("b"|"v"|"d"|"z"|"j"|"c"|"g"|"ğ"|"l"|"r"|"m"|"n"|"y"|"p"|"f"|"t"|"s"|"ş"|"ç"|"k"|"h")* => | ||||
|                     case c of { | ||||
|                       ("ı"|"a") => I_Har ; | ||||
|                       ("i"|"e") => Ih_Har ; | ||||
|                       ("u"|"o") => U_Har  ; | ||||
|                       ("ü"|"ö") => Uh_Har | ||||
|                     } | ||||
|         } ; | ||||
|     getSoftness : Str -> Softness | ||||
|       = \base -> case base of { | ||||
| 		   _+("f"|"s"|"t"|"k"|"ç"|"ş"|"h"|"p") => Hard ; | ||||
| 		   _ => Soft | ||||
| 		 } ; | ||||
| } | ||||
							
								
								
									
										53
									
								
								samples/Grammatical Framework/FoodsUrd.gf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										53
									
								
								samples/Grammatical Framework/FoodsUrd.gf
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,53 @@ | ||||
| -- (c) 2009 Shafqat Virk under LGPL | ||||
|  | ||||
| concrete FoodsUrd of Foods = { | ||||
|  | ||||
|   flags coding=utf8 ; | ||||
|  | ||||
|    | ||||
| 	  param Number = Sg | Pl ; | ||||
|         param Gender = Masc | Fem; | ||||
| 	   | ||||
| 	 oper coupla : Number -> Str =\n -> case n of {Sg => "ہے" ; Pl => "ہیں"}; | ||||
| 	   | ||||
| 	 	   | ||||
|       lincat | ||||
|         Comment = {s : Str} ;  | ||||
| 	  Item = {s: Str ; n: Number ; g:Gender}; | ||||
| 	  Kind = {s: Number => Str ; g:Gender}; | ||||
|         Quality = {s: Gender => Number => Str}; | ||||
|    | ||||
|    lin | ||||
|     Pred item quality = {s = item.s ++ quality.s ! item.g ! item.n ++  coupla item.n} ; | ||||
| 	This kind = {s = "یھ" ++ kind.s ! Sg; n= Sg ; g = kind.g } ; | ||||
| 	These kind = {s = "یھ" ++ kind.s ! Pl; n = Pl ; g = kind.g} ; | ||||
|     That kind = {s = "وہ"  ++ kind.s ! Sg; n= Sg ; g = kind.g} ; | ||||
| 	Those kind = {s = "وہ" ++ kind.s ! Pl; n=Pl ; g = kind.g} ; | ||||
|     Mod quality kind = {s = \\n => quality.s ! kind.g ! n  ++ kind.s ! n ;  g = kind.g}; | ||||
| 	Wine = {s = table { Sg => "شراب" ; Pl => "شرابیں"} ; g = Fem}; | ||||
|     Cheese = {s = table { Sg => "پنیر" ; Pl => "پنیریں"} ; g = Fem}; | ||||
|     Fish = {s = table { Sg => "مچھلی" ; Pl => "مچھلیاں"} ; g = Fem}; | ||||
|     Pizza = {s = table { Sg => "پیزہ" ; Pl => "پیزے"} ; g = Masc}; | ||||
| 	Very quality = {s = \\g,n => "بہت" ++ quality.s ! g ! n} ; | ||||
|     Fresh = regAdj "تازہ" ; | ||||
|     Warm = regAdj "گرم" ; | ||||
|     Italian = regAdj "اٹا لوی" ; | ||||
|     Expensive = regAdj "مہنگا" ; | ||||
|     Delicious = regAdj "مزیدار" ; | ||||
|     Boring = regAdj "فضول" ; | ||||
|     | ||||
|    oper | ||||
|     regAdj : Str -> {s: Gender => Number => Str} = \a -> case a of { | ||||
|         x + "ا" => mkAdj a (x+"ے") (x+"ی"); | ||||
|         _      => mkAdj a a a | ||||
|        }; | ||||
|     mkAdj : Str -> Str -> Str -> {s: Gender => Number => Str} = \s,p,f -> { | ||||
|       s = table { | ||||
|            Masc => table { | ||||
|               Sg => s; | ||||
|               Pl => p | ||||
|               }; | ||||
|            Fem => \\_ => f | ||||
|          } | ||||
|        }; | ||||
| 	}   | ||||
							
								
								
									
										15
									
								
								samples/Grammatical Framework/LexFoods.gf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								samples/Grammatical Framework/LexFoods.gf
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,15 @@ | ||||
| -- (c) 2009 Aarne Ranta under LGPL | ||||
|  | ||||
| interface LexFoods = open Syntax in { | ||||
|   oper | ||||
|     wine_N : N ; | ||||
|     pizza_N : N ; | ||||
|     cheese_N : N ; | ||||
|     fish_N : N ; | ||||
|     fresh_A : A ; | ||||
|     warm_A : A ; | ||||
|     italian_A : A ; | ||||
|     expensive_A : A ; | ||||
|     delicious_A : A ; | ||||
|     boring_A : A ; | ||||
| } | ||||
							
								
								
									
										18
									
								
								samples/Grammatical Framework/LexFoodsCat.gf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								samples/Grammatical Framework/LexFoodsCat.gf
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,18 @@ | ||||
| -- (c) 2009 Jordi Saludes under LGPL | ||||
|  | ||||
| instance LexFoodsCat of LexFoods =  | ||||
|     open SyntaxCat, ParadigmsCat, (M = MorphoCat) in { | ||||
|   flags | ||||
| 	coding = utf8 ; | ||||
|   oper | ||||
|     wine_N = mkN "vi" "vins" M.Masc ; | ||||
|     pizza_N = mkN "pizza" ; | ||||
|     cheese_N = mkN "formatge" ; | ||||
|     fish_N = mkN "peix" "peixos" M.Masc; | ||||
|     fresh_A = mkA "fresc" "fresca" "frescos" "fresques" "frescament"; | ||||
|     warm_A = mkA "calent" ; | ||||
|     italian_A = mkA "italià" "italiana" "italians" "italianes" "italianament" ; | ||||
|     expensive_A = mkA "car" ; | ||||
|     delicious_A = mkA "deliciós" "deliciosa" "deliciosos" "delicioses" "deliciosament"; | ||||
|     boring_A = mkA "aburrit" "aburrida" "aburrits" "aburrides" "aburridament" ; | ||||
| } | ||||
							
								
								
									
										21
									
								
								samples/Grammatical Framework/LexFoodsFin.gf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								samples/Grammatical Framework/LexFoodsFin.gf
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,21 @@ | ||||
| -- (c) 2009 Aarne Ranta under LGPL | ||||
|  | ||||
| instance LexFoodsFin of LexFoods = | ||||
|     open SyntaxFin, ParadigmsFin in { | ||||
|   flags coding=utf8; | ||||
|   oper | ||||
|     wine_N = mkN "viini" ; | ||||
|     pizza_N = mkN "pizza" ; | ||||
|     cheese_N = mkN "juusto" ; | ||||
|     fish_N = mkN "kala" ; | ||||
|     fresh_A = mkA "tuore" ; | ||||
|     warm_A = mkA | ||||
|     (mkN "lämmin" "lämpimän" "lämmintä" "lämpimänä" "lämpimään" | ||||
|          "lämpiminä" "lämpimiä" "lämpimien" "lämpimissä" "lämpimiin" | ||||
| 	 ) | ||||
|     "lämpimämpi" "lämpimin" ; | ||||
|     italian_A = mkA "italialainen" ; | ||||
|     expensive_A = mkA "kallis" ; | ||||
|     delicious_A = mkA "herkullinen" ; | ||||
|     boring_A = mkA "tylsä" ; | ||||
| } | ||||
							
								
								
									
										17
									
								
								samples/Grammatical Framework/LexFoodsGer.gf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								samples/Grammatical Framework/LexFoodsGer.gf
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,17 @@ | ||||
| -- (c) 2009 Aarne Ranta under LGPL | ||||
|  | ||||
| instance LexFoodsGer of LexFoods = | ||||
|     open SyntaxGer, ParadigmsGer in { | ||||
|   flags coding=utf8; | ||||
|   oper | ||||
|     wine_N = mkN "Wein" ; | ||||
|     pizza_N = mkN "Pizza" "Pizzen" feminine ; | ||||
|     cheese_N = mkN "Käse" "Käse" masculine ; | ||||
|     fish_N = mkN "Fisch" ; | ||||
|     fresh_A = mkA "frisch" ; | ||||
|     warm_A = mkA "warm" "wärmer" "wärmste" ; | ||||
|     italian_A = mkA "italienisch" ; | ||||
|     expensive_A = mkA "teuer" ; | ||||
|     delicious_A = mkA "köstlich" ; | ||||
|     boring_A = mkA "langweilig" ; | ||||
| } | ||||
							
								
								
									
										16
									
								
								samples/Grammatical Framework/LexFoodsIta.gf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								samples/Grammatical Framework/LexFoodsIta.gf
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,16 @@ | ||||
| -- (c) 2009 Aarne Ranta under LGPL | ||||
|  | ||||
| instance LexFoodsIta of LexFoods =  | ||||
|     open SyntaxIta, ParadigmsIta in { | ||||
|   oper | ||||
|     wine_N = mkN "vino" ; | ||||
|     pizza_N = mkN "pizza" ; | ||||
|     cheese_N = mkN "formaggio" ; | ||||
|     fish_N = mkN "pesce" ; | ||||
|     fresh_A = mkA "fresco" ; | ||||
|     warm_A = mkA "caldo" ; | ||||
|     italian_A = mkA "italiano" ; | ||||
|     expensive_A = mkA "caro" ; | ||||
|     delicious_A = mkA "delizioso" ; | ||||
|     boring_A = mkA "noioso" ; | ||||
| } | ||||
							
								
								
									
										17
									
								
								samples/Grammatical Framework/LexFoodsSwe.gf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								samples/Grammatical Framework/LexFoodsSwe.gf
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,17 @@ | ||||
| -- (c) 2009 Aarne Ranta under LGPL | ||||
|  | ||||
| instance LexFoodsSwe of LexFoods = | ||||
|     open SyntaxSwe, ParadigmsSwe in { | ||||
|   flags coding=utf8; | ||||
|   oper | ||||
|     wine_N = mkN "vin" "vinet" "viner" "vinerna" ; | ||||
|     pizza_N = mkN "pizza" ; | ||||
|     cheese_N = mkN "ost" ; | ||||
|     fish_N = mkN "fisk" ; | ||||
|     fresh_A = mkA "färsk" ; | ||||
|     warm_A = mkA "varm" ; | ||||
|     italian_A = mkA "italiensk" ; | ||||
|     expensive_A = mkA "dyr" ; | ||||
|     delicious_A = mkA "läcker" ; | ||||
|     boring_A = mkA "tråkig" ; | ||||
| } | ||||
							
								
								
									
										46
									
								
								samples/Grammatical Framework/ResCze.gf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								samples/Grammatical Framework/ResCze.gf
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,46 @@ | ||||
| -- (c) 2011 Katerina Bohmova under LGPL | ||||
|  | ||||
| resource ResCze = open Prelude in { | ||||
|   flags  | ||||
|     coding = utf8 ; | ||||
|   param | ||||
|     Number = Sg | Pl ; | ||||
|     Gender = Masc | Fem | Neutr; | ||||
|   oper | ||||
|     NounPhrase : Type =  | ||||
|       {s : Str ; g : Gender ; n : Number} ;  | ||||
|     Noun : Type = {s : Number => Str ; g : Gender} ; | ||||
|     Adjective : Type = {s : Gender => Number => Str} ; | ||||
|  | ||||
|     det : Number -> Str -> Str -> Str -> Noun -> NounPhrase = | ||||
|       \n,m,f,ne,cn -> { | ||||
|         s = table {Masc => m ; Fem => f; Neutr => ne} ! cn.g ++  | ||||
|             cn.s ! n ; | ||||
|         g = cn.g ; | ||||
|         n = n | ||||
|       } ; | ||||
|     noun : Str -> Str -> Gender -> Noun = | ||||
|       \muz,muzi,g -> { | ||||
|         s = table {Sg => muz ; Pl => muzi} ; | ||||
|         g = g | ||||
|       } ; | ||||
|     adjective : (msg,fsg,nsg,mpl,fpl,npl : Str) -> Adjective = | ||||
|       \msg,fsg,nsg,mpl,fpl,npl -> { | ||||
|         s = table { | ||||
|           Masc => table {Sg => msg ; Pl => mpl} ;  | ||||
|           Fem => table {Sg => fsg ; Pl => fpl}  ; | ||||
|           Neutr => table {Sg => nsg ; Pl => npl} | ||||
|           } | ||||
|         } ; | ||||
|     regAdj : Str -> Adjective =  | ||||
|       \mlad -> | ||||
|       adjective (mlad+"ý") (mlad+"á") (mlad+"é") | ||||
| 		 (mlad+"é") (mlad+"é") (mlad+"á") ; | ||||
|     regnfAdj : Str -> Adjective =  | ||||
|       \vynikajici -> | ||||
|       adjective vynikajici vynikajici vynikajici  | ||||
| 		vynikajici vynikajici vynikajici; | ||||
|     copula : Number => Str =  | ||||
|       table {Sg => "je" ; Pl => "jsou"} ; | ||||
| } | ||||
|  | ||||
							
								
								
									
										75
									
								
								samples/Grammatical Framework/transFoodsHin.gf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										75
									
								
								samples/Grammatical Framework/transFoodsHin.gf
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,75 @@ | ||||
| -- (c) 2009 Aarne Ranta under LGPL | ||||
|  | ||||
| concrete FoodsHin of Foods = { | ||||
|  | ||||
|   flags coding=utf8 ; | ||||
|  | ||||
|   param | ||||
|     Gender = Masc | Fem ; | ||||
|     Number = Sg | Pl ; | ||||
|   lincat | ||||
|     Comment = {s : Str} ; | ||||
|     Item    = {s : Str ; g : Gender ; n : Number} ; | ||||
|     Kind    = {s : Number => Str ; g : Gender} ; | ||||
|     Quality = {s : Gender => Number => Str} ; | ||||
|   lin | ||||
|     Pred item quality = { | ||||
|       s = item.s ++ quality.s ! item.g ! item.n ++ copula item.n | ||||
|       } ; | ||||
|     This kind = {s = "yah" ++ kind.s ! Sg ; g = kind.g ; n = Sg} ; | ||||
|     That kind = {s = "vah" ++ kind.s ! Sg ; g = kind.g ; n = Sg} ; | ||||
|     These kind = {s = "ye" ++ kind.s ! Pl ; g = kind.g ; n = Pl} ; | ||||
|     Those kind = {s = "ve" ++ kind.s ! Pl ; g = kind.g ; n = Pl} ; | ||||
|     Mod quality kind = { | ||||
|       s = \\n => quality.s ! kind.g ! n ++ kind.s ! n ;  | ||||
|       g = kind.g | ||||
|       } ; | ||||
|     Wine = regN "madirA" ; | ||||
|     Cheese = regN "panIr" ; | ||||
|     Fish = regN "maClI" ; | ||||
|     Pizza = regN "pijjA" ; | ||||
|     Very quality = {s = \\g,n => "bahut" ++ quality.s ! g ! n} ; | ||||
|     Fresh = regAdj "tAzA" ; | ||||
|     Warm = regAdj "garam" ; | ||||
|     Italian = regAdj "i-t.alI" ;  | ||||
|     Expensive = regAdj "mahaNgA" ; | ||||
|     Delicious = regAdj "rucikar" ; | ||||
|     Boring = regAdj "pEriyA" ; | ||||
|  | ||||
|   oper | ||||
|     mkN : Str -> Str -> Gender -> {s : Number => Str ; g : Gender} =  | ||||
|       \s,p,g -> { | ||||
|         s = table { | ||||
|           Sg => s ; | ||||
|           Pl => p | ||||
|           } ; | ||||
|         g = g | ||||
|       } ; | ||||
|  | ||||
|     regN : Str -> {s : Number => Str ; g : Gender} = \s -> case s of { | ||||
|       lark + "A" => mkN s (lark + "e") Masc ; | ||||
|       lark + "I" => mkN s (lark + "iyaM") Fem ; | ||||
|       _           => mkN s s Masc  | ||||
|       } ; | ||||
|  | ||||
|     mkAdj : Str -> Str -> Str -> {s : Gender => Number => Str} = \ms,mp,f -> { | ||||
|       s = table { | ||||
|         Masc => table { | ||||
|           Sg => ms ; | ||||
|           Pl => mp | ||||
|           } ; | ||||
|         Fem  => \\_ => f | ||||
|         } | ||||
|       } ; | ||||
|  | ||||
|     regAdj : Str -> {s : Gender => Number => Str} = \a -> case a of { | ||||
|       acch + "A" => mkAdj a (acch + "e") (acch + "I") ; | ||||
|       _          => mkAdj a a a | ||||
|       } ; | ||||
|  | ||||
|     copula : Number -> Str = \n -> case n of { | ||||
|       Sg => "hE" ; | ||||
|       Pl => "hEN" | ||||
|       } ; | ||||
|  | ||||
|   } | ||||
							
								
								
									
										9
									
								
								samples/JSONiq/detail.jq
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								samples/JSONiq/detail.jq
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,9 @@ | ||||
| (: Query for returning one database entry :)  | ||||
|  | ||||
| import module namespace req = "http://www.28msec.com/modules/http-request"; | ||||
| import module namespace catalog = "http://guide.com/catalog"; | ||||
|  | ||||
| variable $id := (req:param-values("id"), "London")[1]; | ||||
| variable $part := (req:param-values("part"), "main")[1]; | ||||
|  | ||||
| catalog:get-data-by-key($id, $part) | ||||
							
								
								
									
										17
									
								
								samples/JSONiq/query.jq
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								samples/JSONiq/query.jq
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,17 @@ | ||||
| (: Query for searching the database for keywords :) | ||||
|  | ||||
| import module namespace index = "http://guide.com/index"; | ||||
| import module namespace catalog = "http://guide.com/catalog"; | ||||
|  | ||||
| import module namespace req = "http://www.28msec.com/modules/http-request"; | ||||
|  | ||||
| variable $phrase := (req:param-values("q"), "London")[1]; | ||||
| variable $limit := integer((req:param-values("limit"), 5)[1]); | ||||
|  | ||||
| [ | ||||
| for $result at $idx in index:index-search($phrase) | ||||
| where $idx le $limit | ||||
| let $data := catalog:get-data-by-id($result.s, $result.p) | ||||
| return  | ||||
|     {| { score : $result.r } , $data |}   | ||||
| ] | ||||
							
								
								
									
										36
									
								
								samples/M/Comment.m
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										36
									
								
								samples/M/Comment.m
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,36 @@ | ||||
| Comment ; | ||||
|   ; this is a comment block | ||||
|   ; comments always start with a semicolon | ||||
|   ; the next line, while not a comment, is a legal blank line | ||||
|    | ||||
|   ;whitespace alone is a valid line in a routine | ||||
|   ;** Comments can have any graphic character, but no "control" | ||||
|   ;** characters | ||||
|    | ||||
|   ;graphic characters such as: !@#$%^&*()_+=-{}[]|\:"?/>.<, | ||||
|   ;the space character is considered a graphic character, even  | ||||
|   ;though you can't see it. | ||||
|   ; ASCII characters whose numeric code is above 128 and below 32 | ||||
|   ; are NOT allowed on a line in a routine. | ||||
|   ;; multiple semicolons are okay | ||||
|   ; a line that has a tag must have whitespace after the tag, bug | ||||
|   ; does not have to have a comment or a command on it | ||||
| Tag1   | ||||
|   ; | ||||
|   ;Tags can start with % or an uppercase or lowercase alphabetic | ||||
|   ; or can be a series of numeric characters | ||||
| %HELO ; | ||||
|  ; | ||||
| 0123 ; | ||||
|   ; | ||||
| %987  ; | ||||
|   ; the most common label is uppercase alphabetic | ||||
| LABEL ; | ||||
|   ;  | ||||
|   ; Tags can be followed directly by an open parenthesis and a | ||||
|   ; formal list of variables, and a close parenthesis | ||||
| ANOTHER(X) ; | ||||
|   ; | ||||
|   ;Normally, a subroutine would be ended by a QUIT command, but we | ||||
|   ; are taking advantage of the rule that the END of routine is an | ||||
|   ; implicit QUIT | ||||
							
								
								
									
										3
									
								
								samples/Mathematica/Init.m
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								samples/Mathematica/Init.m
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,3 @@ | ||||
| (* Mathematica Init File *) | ||||
|  | ||||
| Get[ "Foobar`Foobar`"] | ||||
							
								
								
									
										17
									
								
								samples/Mathematica/PacletInfo.m
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								samples/Mathematica/PacletInfo.m
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,17 @@ | ||||
| (* Paclet Info File *) | ||||
|  | ||||
| (* created 2014/02/07*) | ||||
|  | ||||
| Paclet[ | ||||
|     Name -> "Foobar", | ||||
|     Version -> "0.0.1", | ||||
|     MathematicaVersion -> "8+", | ||||
|     Description -> "Example of an automatically generated PacletInfo file.", | ||||
|     Creator -> "Chris Granade", | ||||
|     Extensions ->  | ||||
|         { | ||||
|             {"Documentation", Language -> "English", MainPage -> "Guides/Foobar"} | ||||
|         } | ||||
| ] | ||||
|  | ||||
|  | ||||
							
								
								
									
										150
									
								
								samples/Mathematica/Predicates.m
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										150
									
								
								samples/Mathematica/Predicates.m
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,150 @@ | ||||
| (* ::Package:: *) | ||||
|  | ||||
| BeginPackage["Predicates`"]; | ||||
|  | ||||
|  | ||||
| (* ::Title:: *) | ||||
| (*Predicates*) | ||||
|  | ||||
|  | ||||
| (* ::Section::Closed:: *) | ||||
| (*Fuzzy Logic*) | ||||
|  | ||||
|  | ||||
| (* ::Subsection:: *) | ||||
| (*Documentation*) | ||||
|  | ||||
|  | ||||
| PossiblyTrueQ::usage="Returns True if the argument is not definitely False."; | ||||
| PossiblyFalseQ::usage="Returns True if the argument is not definitely True."; | ||||
| PossiblyNonzeroQ::usage="Returns True if and only if its argument is not definitely zero."; | ||||
|  | ||||
|  | ||||
| (* ::Subsection:: *) | ||||
| (*Implimentation*) | ||||
|  | ||||
|  | ||||
| Begin["`Private`"]; | ||||
|  | ||||
|  | ||||
| PossiblyTrueQ[expr_]:=\[Not]TrueQ[\[Not]expr] | ||||
|  | ||||
|  | ||||
| PossiblyFalseQ[expr_]:=\[Not]TrueQ[expr] | ||||
|  | ||||
|  | ||||
| End[]; | ||||
|  | ||||
|  | ||||
| (* ::Section::Closed:: *) | ||||
| (*Numbers and Lists*) | ||||
|  | ||||
|  | ||||
| (* ::Subsection:: *) | ||||
| (*Documentation*) | ||||
|  | ||||
|  | ||||
| AnyQ::usage="Given a predicate and a list, retuns True if and only if that predicate is True for at least one element of the list."; | ||||
| AnyElementQ::usage="Returns True if cond matches any element of L."; | ||||
| AllQ::usage="Given a predicate and a list, retuns True if and only if that predicate is True for all elements of the list."; | ||||
| AllElementQ::usage="Returns True if cond matches any element of L."; | ||||
|  | ||||
|  | ||||
| AnyNonzeroQ::usage="Returns True if L is a list such that at least one element is definitely not zero."; | ||||
| AnyPossiblyNonzeroQ::usage="Returns True if expr is a list such that at least one element is not definitely zero."; | ||||
|  | ||||
|  | ||||
| RealQ::usage="Returns True if and only if the argument is a real number"; | ||||
| PositiveQ::usage="Returns True if and only if the argument is a positive real number"; | ||||
| NonnegativeQ::usage="Returns True if and only if the argument is a non-negative real number"; | ||||
| PositiveIntegerQ::usage="Returns True if and only if the argument is a positive integer"; | ||||
| NonnegativeIntegerQ::usage="Returns True if and only if the argument is a non-negative integer"; | ||||
|  | ||||
|  | ||||
| IntegerListQ::usage="Returns True if and only if the input is a list of integers."; | ||||
| PositiveIntegerListQ::usage="Returns True if and only if the input is a list of positive integers."; | ||||
| NonnegativeIntegerListQ::usage="Returns True if and only if the input is a list of non-negative integers."; | ||||
| IntegerOrListQ::usage="Returns True if and only if the input is a list of integers or an integer."; | ||||
| PositiveIntegerOrListQ::usage="Returns True if and only if the input is a list of positive integers or a positive integer."; | ||||
| NonnegativeIntegerOrListQ::usage="Returns True if and only if the input is a list of positive integers or a positive integer."; | ||||
|  | ||||
|  | ||||
| SymbolQ::usage="Returns True if argument is an unassigned symbol."; | ||||
| SymbolOrNumberQ::usage="Returns True if argument is a number of has head 'Symbol'"; | ||||
|  | ||||
|  | ||||
| (* ::Subsection:: *) | ||||
| (*Implimentation*) | ||||
|  | ||||
|  | ||||
| Begin["`Private`"]; | ||||
|  | ||||
|  | ||||
| AnyQ[cond_, L_] := Fold[Or, False, cond /@ L] | ||||
|  | ||||
|  | ||||
| AnyElementQ[cond_,L_]:=AnyQ[cond,Flatten[L]] | ||||
|  | ||||
|  | ||||
| AllQ[cond_, L_] := Fold[And, True, cond /@ L] | ||||
|  | ||||
|  | ||||
| AllElementQ[cond_, L_] := Fold[And, True, cond /@ L] | ||||
|  | ||||
|  | ||||
| AnyNonzeroQ[L_]:=AnyElementQ[#!=0&,L] | ||||
|  | ||||
|  | ||||
| PossiblyNonzeroQ[expr_]:=PossiblyTrueQ[expr!=0] | ||||
|  | ||||
|  | ||||
| AnyPossiblyNonzeroQ[expr_]:=AnyElementQ[PossiblyNonzeroQ,expr] | ||||
|  | ||||
|  | ||||
| RealQ[n_]:=TrueQ[Im[n]==0]; | ||||
|  | ||||
|  | ||||
| PositiveQ[n_]:=Positive[n]; | ||||
|  | ||||
|  | ||||
| PositiveIntegerQ[n_]:=PositiveQ[n]\[And]IntegerQ[n]; | ||||
|  | ||||
|  | ||||
| NonnegativeQ[n_]:=TrueQ[RealQ[n]&&n>=0]; | ||||
|  | ||||
|  | ||||
| NonnegativeIntegerQ[n_]:=NonnegativeQ[n]\[And]IntegerQ[n]; | ||||
|  | ||||
|  | ||||
| IntegerListQ[input_]:=ListQ[input]&&Not[MemberQ[IntegerQ/@input,False]]; | ||||
|  | ||||
|  | ||||
| IntegerOrListQ[input_]:=IntegerListQ[input]||IntegerQ[input]; | ||||
|  | ||||
|  | ||||
| PositiveIntegerListQ[input_]:=IntegerListQ[input]&&Not[MemberQ[Positive[input],False]]; | ||||
|  | ||||
|  | ||||
| PositiveIntegerOrListQ[input_]:=PositiveIntegerListQ[input]||PositiveIntegerQ[input]; | ||||
|  | ||||
|  | ||||
| NonnegativeIntegerListQ[input_]:=IntegerListQ[input]&&Not[MemberQ[NonnegativeIntegerQ[input],False]]; | ||||
|  | ||||
|  | ||||
| NonnegativeIntegerOrListQ[input_]:=NonnegativeIntegerListQ[input]||NonnegativeIntegerQ[input]; | ||||
|  | ||||
|  | ||||
| SymbolQ[a_]:=Head[a]===Symbol; | ||||
|  | ||||
|  | ||||
| SymbolOrNumberQ[a_]:=NumericQ[a]||Head[a]===Symbol; | ||||
|  | ||||
|  | ||||
| End[]; | ||||
|  | ||||
|  | ||||
| (* ::Section:: *) | ||||
| (*Epilogue*) | ||||
|  | ||||
|  | ||||
| EndPackage[]; | ||||
							
								
								
									
										778
									
								
								samples/Objective-C++/EventHandlerMac.mm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										778
									
								
								samples/Objective-C++/EventHandlerMac.mm
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,778 @@ | ||||
| // grabbed from https://raw.github.com/AOKP/external_webkit/61b2fb934bdd3a5fea253e2de0bcf8a47a552333/Source/WebCore/page/mac/EventHandlerMac.mm | ||||
|  | ||||
| /* | ||||
|  * Copyright (C) 2006, 2007, 2008, 2009 Apple Inc. All rights reserved. | ||||
|  * | ||||
|  * Redistribution and use in source and binary forms, with or without | ||||
|  * modification, are permitted provided that the following conditions | ||||
|  * are met: | ||||
|  * 1. Redistributions of source code must retain the above copyright | ||||
|  *    notice, this list of conditions and the following disclaimer. | ||||
|  * 2. Redistributions in binary form must reproduce the above copyright | ||||
|  *    notice, this list of conditions and the following disclaimer in the | ||||
|  *    documentation and/or other materials provided with the distribution. | ||||
|  * | ||||
|  * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY | ||||
|  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||
|  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR | ||||
|  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR | ||||
|  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, | ||||
|  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, | ||||
|  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR | ||||
|  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY | ||||
|  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||||
|  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | ||||
|  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||
|  */ | ||||
|  | ||||
| #include "config.h" | ||||
| #include "EventHandler.h" | ||||
|  | ||||
| #include "AXObjectCache.h" | ||||
| #include "BlockExceptions.h" | ||||
| #include "Chrome.h" | ||||
| #include "ChromeClient.h" | ||||
| #include "ClipboardMac.h" | ||||
| #include "DragController.h" | ||||
| #include "EventNames.h" | ||||
| #include "FocusController.h" | ||||
| #include "Frame.h" | ||||
| #include "FrameLoader.h" | ||||
| #include "FrameView.h" | ||||
| #include "KeyboardEvent.h" | ||||
| #include "MouseEventWithHitTestResults.h" | ||||
| #include "NotImplemented.h" | ||||
| #include "Page.h" | ||||
| #include "PlatformKeyboardEvent.h" | ||||
| #include "PlatformWheelEvent.h" | ||||
| #include "RenderWidget.h" | ||||
| #include "RuntimeApplicationChecks.h" | ||||
| #include "Scrollbar.h" | ||||
| #include "Settings.h" | ||||
| #include "WebCoreSystemInterface.h" | ||||
| #include <objc/objc-runtime.h> | ||||
| #include <wtf/StdLibExtras.h> | ||||
|  | ||||
| #if !(defined(OBJC_API_VERSION) && OBJC_API_VERSION > 0) | ||||
| static inline IMP method_setImplementation(Method m, IMP i) | ||||
| { | ||||
|     IMP oi = m->method_imp; | ||||
|     m->method_imp = i; | ||||
|     return oi; | ||||
| } | ||||
| #endif | ||||
|  | ||||
| namespace WebCore { | ||||
|  | ||||
| #if ENABLE(DRAG_SUPPORT) | ||||
| const double EventHandler::TextDragDelay = 0.15; | ||||
| #endif | ||||
|  | ||||
| static RetainPtr<NSEvent>& currentNSEventSlot() | ||||
| { | ||||
|     DEFINE_STATIC_LOCAL(RetainPtr<NSEvent>, event, ()); | ||||
|     return event; | ||||
| } | ||||
|  | ||||
| NSEvent *EventHandler::currentNSEvent() | ||||
| { | ||||
|     return currentNSEventSlot().get(); | ||||
| } | ||||
|  | ||||
| class CurrentEventScope { | ||||
|      WTF_MAKE_NONCOPYABLE(CurrentEventScope); | ||||
| public: | ||||
|     CurrentEventScope(NSEvent *); | ||||
|     ~CurrentEventScope(); | ||||
|  | ||||
| private: | ||||
|     RetainPtr<NSEvent> m_savedCurrentEvent; | ||||
| #ifndef NDEBUG | ||||
|     RetainPtr<NSEvent> m_event; | ||||
| #endif | ||||
| }; | ||||
|  | ||||
| inline CurrentEventScope::CurrentEventScope(NSEvent *event) | ||||
|     : m_savedCurrentEvent(currentNSEventSlot()) | ||||
| #ifndef NDEBUG | ||||
|     , m_event(event) | ||||
| #endif | ||||
| { | ||||
|     currentNSEventSlot() = event; | ||||
| } | ||||
|  | ||||
| inline CurrentEventScope::~CurrentEventScope() | ||||
| { | ||||
|     ASSERT(currentNSEventSlot() == m_event); | ||||
|     currentNSEventSlot() = m_savedCurrentEvent; | ||||
| } | ||||
|  | ||||
| bool EventHandler::wheelEvent(NSEvent *event) | ||||
| { | ||||
|     Page* page = m_frame->page(); | ||||
|     if (!page) | ||||
|         return false; | ||||
|  | ||||
|     CurrentEventScope scope(event); | ||||
|  | ||||
|     PlatformWheelEvent wheelEvent(event, page->chrome()->platformPageClient()); | ||||
|     handleWheelEvent(wheelEvent); | ||||
|  | ||||
|     return wheelEvent.isAccepted(); | ||||
| } | ||||
|  | ||||
| PassRefPtr<KeyboardEvent> EventHandler::currentKeyboardEvent() const | ||||
| { | ||||
|     NSEvent *event = [NSApp currentEvent]; | ||||
|     if (!event) | ||||
|         return 0; | ||||
|     switch ([event type]) { | ||||
|         case NSKeyDown: { | ||||
|             PlatformKeyboardEvent platformEvent(event); | ||||
|             platformEvent.disambiguateKeyDownEvent(PlatformKeyboardEvent::RawKeyDown); | ||||
|             return KeyboardEvent::create(platformEvent, m_frame->document()->defaultView()); | ||||
|         } | ||||
|         case NSKeyUp: | ||||
|             return KeyboardEvent::create(event, m_frame->document()->defaultView()); | ||||
|         default: | ||||
|             return 0; | ||||
|     } | ||||
| } | ||||
|  | ||||
| bool EventHandler::keyEvent(NSEvent *event) | ||||
| { | ||||
|     BEGIN_BLOCK_OBJC_EXCEPTIONS; | ||||
|  | ||||
|     ASSERT([event type] == NSKeyDown || [event type] == NSKeyUp); | ||||
|  | ||||
|     CurrentEventScope scope(event); | ||||
|     return keyEvent(PlatformKeyboardEvent(event)); | ||||
|  | ||||
|     END_BLOCK_OBJC_EXCEPTIONS; | ||||
|  | ||||
|     return false; | ||||
| } | ||||
|  | ||||
| void EventHandler::focusDocumentView() | ||||
| { | ||||
|     Page* page = m_frame->page(); | ||||
|     if (!page) | ||||
|         return; | ||||
|  | ||||
|     if (FrameView* frameView = m_frame->view()) { | ||||
|         if (NSView *documentView = frameView->documentView()) | ||||
|             page->chrome()->focusNSView(documentView); | ||||
|     } | ||||
|  | ||||
|     page->focusController()->setFocusedFrame(m_frame); | ||||
| } | ||||
|  | ||||
| bool EventHandler::passWidgetMouseDownEventToWidget(const MouseEventWithHitTestResults& event) | ||||
| { | ||||
|     // Figure out which view to send the event to. | ||||
|     RenderObject* target = targetNode(event) ? targetNode(event)->renderer() : 0; | ||||
|     if (!target || !target->isWidget()) | ||||
|         return false; | ||||
|  | ||||
|     // Double-click events don't exist in Cocoa. Since passWidgetMouseDownEventToWidget will | ||||
|     // just pass currentEvent down to the widget, we don't want to call it for events that | ||||
|     // don't correspond to Cocoa events.  The mousedown/ups will have already been passed on as | ||||
|     // part of the pressed/released handling. | ||||
|     return passMouseDownEventToWidget(toRenderWidget(target)->widget()); | ||||
| } | ||||
|  | ||||
| bool EventHandler::passWidgetMouseDownEventToWidget(RenderWidget* renderWidget) | ||||
| { | ||||
|     return passMouseDownEventToWidget(renderWidget->widget()); | ||||
| } | ||||
|  | ||||
| static bool lastEventIsMouseUp() | ||||
| { | ||||
|     // Many AppKit widgets run their own event loops and consume events while the mouse is down. | ||||
|     // When they finish, currentEvent is the mouseUp that they exited on. We need to update | ||||
|     // the WebCore state with this mouseUp, which we never saw. This method lets us detect | ||||
|     // that state. Handling this was critical when we used AppKit widgets for form elements. | ||||
|     // It's not clear in what cases this is helpful now -- it's possible it can be removed. | ||||
|  | ||||
|     BEGIN_BLOCK_OBJC_EXCEPTIONS; | ||||
|     NSEvent *currentEventAfterHandlingMouseDown = [NSApp currentEvent]; | ||||
|     return EventHandler::currentNSEvent() != currentEventAfterHandlingMouseDown | ||||
|         && [currentEventAfterHandlingMouseDown type] == NSLeftMouseUp | ||||
|         && [currentEventAfterHandlingMouseDown timestamp] >= [EventHandler::currentNSEvent() timestamp]; | ||||
|     END_BLOCK_OBJC_EXCEPTIONS; | ||||
|  | ||||
|     return false; | ||||
| } | ||||
|  | ||||
| bool EventHandler::passMouseDownEventToWidget(Widget* pWidget) | ||||
| { | ||||
|     // FIXME: This function always returns true. It should be changed either to return | ||||
|     // false in some cases or the return value should be removed. | ||||
|  | ||||
|     RefPtr<Widget> widget = pWidget; | ||||
|  | ||||
|     if (!widget) { | ||||
|         LOG_ERROR("hit a RenderWidget without a corresponding Widget, means a frame is half-constructed"); | ||||
|         return true; | ||||
|     } | ||||
|  | ||||
|     // In WebKit2 we will never have an NSView. Just return early and let the regular event handler machinery take care of | ||||
|     // dispatching the event. | ||||
|     if (!widget->platformWidget()) | ||||
|         return false; | ||||
|  | ||||
|     BEGIN_BLOCK_OBJC_EXCEPTIONS; | ||||
|  | ||||
|     NSView *nodeView = widget->platformWidget(); | ||||
|     ASSERT([nodeView superview]); | ||||
|     NSView *view = [nodeView hitTest:[[nodeView superview] convertPoint:[currentNSEvent() locationInWindow] fromView:nil]]; | ||||
|     if (!view) { | ||||
|         // We probably hit the border of a RenderWidget | ||||
|         return true; | ||||
|     } | ||||
|  | ||||
|     Page* page = m_frame->page(); | ||||
|     if (!page) | ||||
|         return true; | ||||
|  | ||||
|     if (page->chrome()->client()->firstResponder() != view) { | ||||
|         // Normally [NSWindow sendEvent:] handles setting the first responder. | ||||
|         // But in our case, the event was sent to the view representing the entire web page. | ||||
|         if ([currentNSEvent() clickCount] <= 1 && [view acceptsFirstResponder] && [view needsPanelToBecomeKey]) | ||||
|             page->chrome()->client()->makeFirstResponder(view); | ||||
|     } | ||||
|  | ||||
|     // We need to "defer loading" while tracking the mouse, because tearing down the | ||||
|     // page while an AppKit control is tracking the mouse can cause a crash. | ||||
|  | ||||
|     // FIXME: In theory, WebCore now tolerates tear-down while tracking the | ||||
|     // mouse. We should confirm that, and then remove the deferrsLoading | ||||
|     // hack entirely. | ||||
|  | ||||
|     bool wasDeferringLoading = page->defersLoading(); | ||||
|     if (!wasDeferringLoading) | ||||
|         page->setDefersLoading(true); | ||||
|  | ||||
|     ASSERT(!m_sendingEventToSubview); | ||||
|     m_sendingEventToSubview = true; | ||||
|     NSView *outerView = widget->getOuterView(); | ||||
|     widget->beforeMouseDown(outerView, widget.get()); | ||||
|     [view mouseDown:currentNSEvent()]; | ||||
|     widget->afterMouseDown(outerView, widget.get()); | ||||
|     m_sendingEventToSubview = false; | ||||
|  | ||||
|     if (!wasDeferringLoading) | ||||
|         page->setDefersLoading(false); | ||||
|  | ||||
|     // Remember which view we sent the event to, so we can direct the release event properly. | ||||
|     m_mouseDownView = view; | ||||
|     m_mouseDownWasInSubframe = false; | ||||
|  | ||||
|     // Many AppKit widgets run their own event loops and consume events while the mouse is down. | ||||
|     // When they finish, currentEvent is the mouseUp that they exited on.  We need to update | ||||
|     // the EventHandler state with this mouseUp, which we never saw. | ||||
|     // If this event isn't a mouseUp, we assume that the mouseUp will be coming later.  There | ||||
|     // is a hole here if the widget consumes both the mouseUp and subsequent events. | ||||
|     if (lastEventIsMouseUp()) | ||||
|         m_mousePressed = false; | ||||
|  | ||||
|     END_BLOCK_OBJC_EXCEPTIONS; | ||||
|  | ||||
|     return true; | ||||
| } | ||||
|  | ||||
| // Note that this does the same kind of check as [target isDescendantOf:superview]. | ||||
| // There are two differences: This is a lot slower because it has to walk the whole | ||||
| // tree, and this works in cases where the target has already been deallocated. | ||||
| static bool findViewInSubviews(NSView *superview, NSView *target) | ||||
| { | ||||
|     BEGIN_BLOCK_OBJC_EXCEPTIONS; | ||||
|     NSEnumerator *e = [[superview subviews] objectEnumerator]; | ||||
|     NSView *subview; | ||||
|     while ((subview = [e nextObject])) { | ||||
|         if (subview == target || findViewInSubviews(subview, target)) { | ||||
|             return true; | ||||
|         } | ||||
|     } | ||||
|     END_BLOCK_OBJC_EXCEPTIONS; | ||||
|  | ||||
|     return false; | ||||
| } | ||||
|  | ||||
| NSView *EventHandler::mouseDownViewIfStillGood() | ||||
| { | ||||
|     // Since we have no way of tracking the lifetime of m_mouseDownView, we have to assume that | ||||
|     // it could be deallocated already. We search for it in our subview tree; if we don't find | ||||
|     // it, we set it to nil. | ||||
|     NSView *mouseDownView = m_mouseDownView; | ||||
|     if (!mouseDownView) { | ||||
|         return nil; | ||||
|     } | ||||
|     FrameView* topFrameView = m_frame->view(); | ||||
|     NSView *topView = topFrameView ? topFrameView->platformWidget() : nil; | ||||
|     if (!topView || !findViewInSubviews(topView, mouseDownView)) { | ||||
|         m_mouseDownView = nil; | ||||
|         return nil; | ||||
|     } | ||||
|     return mouseDownView; | ||||
| } | ||||
|  | ||||
| #if ENABLE(DRAG_SUPPORT) | ||||
| bool EventHandler::eventLoopHandleMouseDragged(const MouseEventWithHitTestResults&) | ||||
| { | ||||
|     NSView *view = mouseDownViewIfStillGood(); | ||||
|  | ||||
|     if (!view) | ||||
|         return false; | ||||
|  | ||||
|     if (!m_mouseDownWasInSubframe) { | ||||
|         ASSERT(!m_sendingEventToSubview); | ||||
|         m_sendingEventToSubview = true; | ||||
|         BEGIN_BLOCK_OBJC_EXCEPTIONS; | ||||
|         [view mouseDragged:currentNSEvent()]; | ||||
|         END_BLOCK_OBJC_EXCEPTIONS; | ||||
|         m_sendingEventToSubview = false; | ||||
|     } | ||||
|  | ||||
|     return true; | ||||
| } | ||||
| #endif // ENABLE(DRAG_SUPPORT) | ||||
|  | ||||
| bool EventHandler::eventLoopHandleMouseUp(const MouseEventWithHitTestResults&) | ||||
| { | ||||
|     NSView *view = mouseDownViewIfStillGood(); | ||||
|     if (!view) | ||||
|         return false; | ||||
|  | ||||
|     if (!m_mouseDownWasInSubframe) { | ||||
|         ASSERT(!m_sendingEventToSubview); | ||||
|         m_sendingEventToSubview = true; | ||||
|         BEGIN_BLOCK_OBJC_EXCEPTIONS; | ||||
|         [view mouseUp:currentNSEvent()]; | ||||
|         END_BLOCK_OBJC_EXCEPTIONS; | ||||
|         m_sendingEventToSubview = false; | ||||
|     } | ||||
|  | ||||
|     return true; | ||||
| } | ||||
|  | ||||
| bool EventHandler::passSubframeEventToSubframe(MouseEventWithHitTestResults& event, Frame* subframe, HitTestResult* hoveredNode) | ||||
| { | ||||
|     BEGIN_BLOCK_OBJC_EXCEPTIONS; | ||||
|  | ||||
|     switch ([currentNSEvent() type]) { | ||||
|         case NSLeftMouseDragged: | ||||
|         case NSOtherMouseDragged: | ||||
|         case NSRightMouseDragged: | ||||
|             // This check is bogus and results in <rdar://6813830>, but removing it breaks a number of | ||||
|             // layout tests. | ||||
|             if (!m_mouseDownWasInSubframe) | ||||
|                 return false; | ||||
| #if ENABLE(DRAG_SUPPORT) | ||||
|             if (subframe->page()->dragController()->didInitiateDrag()) | ||||
|                 return false; | ||||
| #endif | ||||
|         case NSMouseMoved: | ||||
|             // Since we're passing in currentNSEvent() here, we can call | ||||
|             // handleMouseMoveEvent() directly, since the save/restore of | ||||
|             // currentNSEvent() that mouseMoved() does would have no effect. | ||||
|             ASSERT(!m_sendingEventToSubview); | ||||
|             m_sendingEventToSubview = true; | ||||
|             subframe->eventHandler()->handleMouseMoveEvent(currentPlatformMouseEvent(), hoveredNode); | ||||
|             m_sendingEventToSubview = false; | ||||
|             return true; | ||||
|  | ||||
|         case NSLeftMouseDown: { | ||||
|             Node* node = targetNode(event); | ||||
|             if (!node) | ||||
|                 return false; | ||||
|             RenderObject* renderer = node->renderer(); | ||||
|             if (!renderer || !renderer->isWidget()) | ||||
|                 return false; | ||||
|             Widget* widget = toRenderWidget(renderer)->widget(); | ||||
|             if (!widget || !widget->isFrameView()) | ||||
|                 return false; | ||||
|             if (!passWidgetMouseDownEventToWidget(toRenderWidget(renderer))) | ||||
|                 return false; | ||||
|             m_mouseDownWasInSubframe = true; | ||||
|             return true; | ||||
|         } | ||||
|         case NSLeftMouseUp: { | ||||
|             if (!m_mouseDownWasInSubframe) | ||||
|                 return false; | ||||
|             ASSERT(!m_sendingEventToSubview); | ||||
|             m_sendingEventToSubview = true; | ||||
|             subframe->eventHandler()->handleMouseReleaseEvent(currentPlatformMouseEvent()); | ||||
|             m_sendingEventToSubview = false; | ||||
|             return true; | ||||
|         } | ||||
|         default: | ||||
|             return false; | ||||
|     } | ||||
|     END_BLOCK_OBJC_EXCEPTIONS; | ||||
|  | ||||
|     return false; | ||||
| } | ||||
|  | ||||
| static IMP originalNSScrollViewScrollWheel; | ||||
| static bool _nsScrollViewScrollWheelShouldRetainSelf; | ||||
| static void selfRetainingNSScrollViewScrollWheel(NSScrollView *, SEL, NSEvent *); | ||||
|  | ||||
| static bool nsScrollViewScrollWheelShouldRetainSelf() | ||||
| { | ||||
|     ASSERT(isMainThread()); | ||||
|  | ||||
|     return _nsScrollViewScrollWheelShouldRetainSelf; | ||||
| } | ||||
|  | ||||
| static void setNSScrollViewScrollWheelShouldRetainSelf(bool shouldRetain) | ||||
| { | ||||
|     ASSERT(isMainThread()); | ||||
|  | ||||
|     if (!originalNSScrollViewScrollWheel) { | ||||
|         Method method = class_getInstanceMethod(objc_getRequiredClass("NSScrollView"), @selector(scrollWheel:)); | ||||
|         originalNSScrollViewScrollWheel = method_setImplementation(method, reinterpret_cast<IMP>(selfRetainingNSScrollViewScrollWheel)); | ||||
|     } | ||||
|  | ||||
|     _nsScrollViewScrollWheelShouldRetainSelf = shouldRetain; | ||||
| } | ||||
|  | ||||
| static void selfRetainingNSScrollViewScrollWheel(NSScrollView *self, SEL selector, NSEvent *event) | ||||
| { | ||||
|     bool shouldRetainSelf = isMainThread() && nsScrollViewScrollWheelShouldRetainSelf(); | ||||
|  | ||||
|     if (shouldRetainSelf) | ||||
|         [self retain]; | ||||
|     originalNSScrollViewScrollWheel(self, selector, event); | ||||
|     if (shouldRetainSelf) | ||||
|         [self release]; | ||||
| } | ||||
|  | ||||
| bool EventHandler::passWheelEventToWidget(PlatformWheelEvent& wheelEvent, Widget* widget) | ||||
| { | ||||
|     BEGIN_BLOCK_OBJC_EXCEPTIONS; | ||||
|  | ||||
|     if (!widget) | ||||
|         return false; | ||||
|  | ||||
|     NSView* nodeView = widget->platformWidget(); | ||||
|     if (!nodeView) { | ||||
|         // WebKit2 code path. | ||||
|         if (!widget->isFrameView()) | ||||
|             return false; | ||||
|  | ||||
|         return static_cast<FrameView*>(widget)->frame()->eventHandler()->handleWheelEvent(wheelEvent); | ||||
|     } | ||||
|  | ||||
|     if ([currentNSEvent() type] != NSScrollWheel || m_sendingEventToSubview) | ||||
|         return false; | ||||
|  | ||||
|     ASSERT(nodeView); | ||||
|     ASSERT([nodeView superview]); | ||||
|     NSView *view = [nodeView hitTest:[[nodeView superview] convertPoint:[currentNSEvent() locationInWindow] fromView:nil]]; | ||||
|     if (!view) | ||||
|         // We probably hit the border of a RenderWidget | ||||
|         return false; | ||||
|  | ||||
|     ASSERT(!m_sendingEventToSubview); | ||||
|     m_sendingEventToSubview = true; | ||||
|     // Work around <rdar://problem/6806810> which can cause -[NSScrollView scrollWheel:] to | ||||
|     // crash if the NSScrollView is released during timer or network callback dispatch | ||||
|     // in the nested tracking runloop that -[NSScrollView scrollWheel:] runs. | ||||
|     setNSScrollViewScrollWheelShouldRetainSelf(true); | ||||
|     [view scrollWheel:currentNSEvent()]; | ||||
|     setNSScrollViewScrollWheelShouldRetainSelf(false); | ||||
|     m_sendingEventToSubview = false; | ||||
|     return true; | ||||
|  | ||||
|     END_BLOCK_OBJC_EXCEPTIONS; | ||||
|     return false; | ||||
| } | ||||
|  | ||||
| void EventHandler::mouseDown(NSEvent *event) | ||||
| { | ||||
|     FrameView* v = m_frame->view(); | ||||
|     if (!v || m_sendingEventToSubview) | ||||
|         return; | ||||
|  | ||||
|     BEGIN_BLOCK_OBJC_EXCEPTIONS; | ||||
|  | ||||
|     m_frame->loader()->resetMultipleFormSubmissionProtection(); | ||||
|  | ||||
|     m_mouseDownView = nil; | ||||
|  | ||||
|     CurrentEventScope scope(event); | ||||
|  | ||||
|     handleMousePressEvent(currentPlatformMouseEvent()); | ||||
|  | ||||
|     END_BLOCK_OBJC_EXCEPTIONS; | ||||
| } | ||||
|  | ||||
| void EventHandler::mouseDragged(NSEvent *event) | ||||
| { | ||||
|     FrameView* v = m_frame->view(); | ||||
|     if (!v || m_sendingEventToSubview) | ||||
|         return; | ||||
|  | ||||
|     BEGIN_BLOCK_OBJC_EXCEPTIONS; | ||||
|  | ||||
|     CurrentEventScope scope(event); | ||||
|     handleMouseMoveEvent(currentPlatformMouseEvent()); | ||||
|  | ||||
|     END_BLOCK_OBJC_EXCEPTIONS; | ||||
| } | ||||
|  | ||||
| void EventHandler::mouseUp(NSEvent *event) | ||||
| { | ||||
|     FrameView* v = m_frame->view(); | ||||
|     if (!v || m_sendingEventToSubview) | ||||
|         return; | ||||
|  | ||||
|     BEGIN_BLOCK_OBJC_EXCEPTIONS; | ||||
|  | ||||
|     CurrentEventScope scope(event); | ||||
|  | ||||
|     // Our behavior here is a little different that Qt. Qt always sends | ||||
|     // a mouse release event, even for a double click. To correct problems | ||||
|     // in khtml's DOM click event handling we do not send a release here | ||||
|     // for a double click. Instead we send that event from FrameView's | ||||
|     // handleMouseDoubleClickEvent. Note also that the third click of | ||||
|     // a triple click is treated as a single click, but the fourth is then | ||||
|     // treated as another double click. Hence the "% 2" below. | ||||
|     int clickCount = [event clickCount]; | ||||
|     if (clickCount > 0 && clickCount % 2 == 0) | ||||
|         handleMouseDoubleClickEvent(currentPlatformMouseEvent()); | ||||
|     else | ||||
|         handleMouseReleaseEvent(currentPlatformMouseEvent()); | ||||
|  | ||||
|     m_mouseDownView = nil; | ||||
|  | ||||
|     END_BLOCK_OBJC_EXCEPTIONS; | ||||
| } | ||||
|  | ||||
| /* | ||||
|  A hack for the benefit of AK's PopUpButton, which uses the Carbon menu manager, which thus | ||||
|  eats all subsequent events after it is starts its modal tracking loop.  After the interaction | ||||
|  is done, this routine is used to fix things up.  When a mouse down started us tracking in | ||||
|  the widget, we post a fake mouse up to balance the mouse down we started with. When a | ||||
|  key down started us tracking in the widget, we post a fake key up to balance things out. | ||||
|  In addition, we post a fake mouseMoved to get the cursor in sync with whatever we happen to | ||||
|  be over after the tracking is done. | ||||
|  */ | ||||
| void EventHandler::sendFakeEventsAfterWidgetTracking(NSEvent *initiatingEvent) | ||||
| { | ||||
|     FrameView* view = m_frame->view(); | ||||
|     if (!view) | ||||
|         return; | ||||
|  | ||||
|     BEGIN_BLOCK_OBJC_EXCEPTIONS; | ||||
|  | ||||
|     m_sendingEventToSubview = false; | ||||
|     int eventType = [initiatingEvent type]; | ||||
|     if (eventType == NSLeftMouseDown || eventType == NSKeyDown) { | ||||
|         NSEvent *fakeEvent = nil; | ||||
|         if (eventType == NSLeftMouseDown) { | ||||
|             fakeEvent = [NSEvent mouseEventWithType:NSLeftMouseUp | ||||
|                                            location:[initiatingEvent locationInWindow] | ||||
|                                       modifierFlags:[initiatingEvent modifierFlags] | ||||
|                                           timestamp:[initiatingEvent timestamp] | ||||
|                                        windowNumber:[initiatingEvent windowNumber] | ||||
|                                             context:[initiatingEvent context] | ||||
|                                         eventNumber:[initiatingEvent eventNumber] | ||||
|                                          clickCount:[initiatingEvent clickCount] | ||||
|                                            pressure:[initiatingEvent pressure]]; | ||||
|  | ||||
|             [NSApp postEvent:fakeEvent atStart:YES]; | ||||
|         } else { // eventType == NSKeyDown | ||||
|             fakeEvent = [NSEvent keyEventWithType:NSKeyUp | ||||
|                                          location:[initiatingEvent locationInWindow] | ||||
|                                     modifierFlags:[initiatingEvent modifierFlags] | ||||
|                                         timestamp:[initiatingEvent timestamp] | ||||
|                                      windowNumber:[initiatingEvent windowNumber] | ||||
|                                           context:[initiatingEvent context] | ||||
|                                        characters:[initiatingEvent characters] | ||||
|                       charactersIgnoringModifiers:[initiatingEvent charactersIgnoringModifiers] | ||||
|                                         isARepeat:[initiatingEvent isARepeat] | ||||
|                                           keyCode:[initiatingEvent keyCode]]; | ||||
|             [NSApp postEvent:fakeEvent atStart:YES]; | ||||
|         } | ||||
|         // FIXME: We should really get the current modifierFlags here, but there's no way to poll | ||||
|         // them in Cocoa, and because the event stream was stolen by the Carbon menu code we have | ||||
|         // no up-to-date cache of them anywhere. | ||||
|         fakeEvent = [NSEvent mouseEventWithType:NSMouseMoved | ||||
|                                        location:[[view->platformWidget() window] convertScreenToBase:[NSEvent mouseLocation]] | ||||
|                                   modifierFlags:[initiatingEvent modifierFlags] | ||||
|                                       timestamp:[initiatingEvent timestamp] | ||||
|                                    windowNumber:[initiatingEvent windowNumber] | ||||
|                                         context:[initiatingEvent context] | ||||
|                                     eventNumber:0 | ||||
|                                      clickCount:0 | ||||
|                                        pressure:0]; | ||||
|         [NSApp postEvent:fakeEvent atStart:YES]; | ||||
|     } | ||||
|  | ||||
|     END_BLOCK_OBJC_EXCEPTIONS; | ||||
| } | ||||
|  | ||||
| void EventHandler::mouseMoved(NSEvent *event) | ||||
| { | ||||
|     // Reject a mouse moved if the button is down - screws up tracking during autoscroll | ||||
|     // These happen because WebKit sometimes has to fake up moved events. | ||||
|     if (!m_frame->view() || m_mousePressed || m_sendingEventToSubview) | ||||
|         return; | ||||
|  | ||||
|     BEGIN_BLOCK_OBJC_EXCEPTIONS; | ||||
|     CurrentEventScope scope(event); | ||||
|     mouseMoved(currentPlatformMouseEvent()); | ||||
|     END_BLOCK_OBJC_EXCEPTIONS; | ||||
| } | ||||
|  | ||||
| static bool frameHasPlatformWidget(Frame* frame) | ||||
| { | ||||
|     if (FrameView* frameView = frame->view()) { | ||||
|         if (frameView->platformWidget()) | ||||
|             return true; | ||||
|     } | ||||
|  | ||||
|     return false; | ||||
| } | ||||
|  | ||||
| bool EventHandler::passMousePressEventToSubframe(MouseEventWithHitTestResults& mev, Frame* subframe) | ||||
| { | ||||
|     // WebKit1 code path. | ||||
|     if (frameHasPlatformWidget(m_frame)) | ||||
|         return passSubframeEventToSubframe(mev, subframe); | ||||
|  | ||||
|     // WebKit2 code path. | ||||
|     subframe->eventHandler()->handleMousePressEvent(mev.event()); | ||||
|     return true; | ||||
| } | ||||
|  | ||||
| bool EventHandler::passMouseMoveEventToSubframe(MouseEventWithHitTestResults& mev, Frame* subframe, HitTestResult* hoveredNode) | ||||
| { | ||||
|     // WebKit1 code path. | ||||
|     if (frameHasPlatformWidget(m_frame)) | ||||
|         return passSubframeEventToSubframe(mev, subframe, hoveredNode); | ||||
|  | ||||
|     // WebKit2 code path. | ||||
|     if (m_mouseDownMayStartDrag && !m_mouseDownWasInSubframe) | ||||
|         return false; | ||||
|     subframe->eventHandler()->handleMouseMoveEvent(mev.event(), hoveredNode); | ||||
|     return true; | ||||
| } | ||||
|  | ||||
| bool EventHandler::passMouseReleaseEventToSubframe(MouseEventWithHitTestResults& mev, Frame* subframe) | ||||
| { | ||||
|     // WebKit1 code path. | ||||
|     if (frameHasPlatformWidget(m_frame)) | ||||
|         return passSubframeEventToSubframe(mev, subframe); | ||||
|  | ||||
|     // WebKit2 code path. | ||||
|     subframe->eventHandler()->handleMouseReleaseEvent(mev.event()); | ||||
|     return true; | ||||
| } | ||||
|  | ||||
| PlatformMouseEvent EventHandler::currentPlatformMouseEvent() const | ||||
| { | ||||
|     NSView *windowView = nil; | ||||
|     if (Page* page = m_frame->page()) | ||||
|         windowView = page->chrome()->platformPageClient(); | ||||
|     return PlatformMouseEvent(currentNSEvent(), windowView); | ||||
| } | ||||
|  | ||||
| #if ENABLE(CONTEXT_MENUS) | ||||
| bool EventHandler::sendContextMenuEvent(NSEvent *event) | ||||
| { | ||||
|     Page* page = m_frame->page(); | ||||
|     if (!page) | ||||
|         return false; | ||||
|     return sendContextMenuEvent(PlatformMouseEvent(event, page->chrome()->platformPageClient())); | ||||
| } | ||||
| #endif // ENABLE(CONTEXT_MENUS) | ||||
|  | ||||
| #if ENABLE(DRAG_SUPPORT) | ||||
| bool EventHandler::eventMayStartDrag(NSEvent *event) | ||||
| { | ||||
|     Page* page = m_frame->page(); | ||||
|     if (!page) | ||||
|         return false; | ||||
|     return eventMayStartDrag(PlatformMouseEvent(event, page->chrome()->platformPageClient())); | ||||
| } | ||||
| #endif // ENABLE(DRAG_SUPPORT) | ||||
|  | ||||
| bool EventHandler::eventActivatedView(const PlatformMouseEvent& event) const | ||||
| { | ||||
|     return m_activationEventNumber == event.eventNumber(); | ||||
| } | ||||
|  | ||||
| #if ENABLE(DRAG_SUPPORT) | ||||
|  | ||||
| PassRefPtr<Clipboard> EventHandler::createDraggingClipboard() const | ||||
| { | ||||
|     NSPasteboard *pasteboard = [NSPasteboard pasteboardWithName:NSDragPboard]; | ||||
|     // Must be done before ondragstart adds types and data to the pboard, | ||||
|     // also done for security, as it erases data from the last drag | ||||
|     [pasteboard declareTypes:[NSArray array] owner:nil]; | ||||
|     return ClipboardMac::create(Clipboard::DragAndDrop, pasteboard, ClipboardWritable, m_frame); | ||||
| } | ||||
|  | ||||
| #endif | ||||
|  | ||||
| bool EventHandler::tabsToAllFormControls(KeyboardEvent* event) const | ||||
| { | ||||
|     Page* page = m_frame->page(); | ||||
|     if (!page) | ||||
|         return false; | ||||
|  | ||||
|     KeyboardUIMode keyboardUIMode = page->chrome()->client()->keyboardUIMode(); | ||||
|     bool handlingOptionTab = isKeyboardOptionTab(event); | ||||
|  | ||||
|     // If tab-to-links is off, option-tab always highlights all controls | ||||
|     if ((keyboardUIMode & KeyboardAccessTabsToLinks) == 0 && handlingOptionTab) | ||||
|         return true; | ||||
|  | ||||
|     // If system preferences say to include all controls, we always include all controls | ||||
|     if (keyboardUIMode & KeyboardAccessFull) | ||||
|         return true; | ||||
|  | ||||
|     // Otherwise tab-to-links includes all controls, unless the sense is flipped via option-tab. | ||||
|     if (keyboardUIMode & KeyboardAccessTabsToLinks) | ||||
|         return !handlingOptionTab; | ||||
|  | ||||
|     return handlingOptionTab; | ||||
| } | ||||
|  | ||||
| bool EventHandler::needsKeyboardEventDisambiguationQuirks() const | ||||
| { | ||||
|     Document* document = m_frame->document(); | ||||
|  | ||||
|     // RSS view needs arrow key keypress events. | ||||
|     if (applicationIsSafari() && (document->url().protocolIs("feed") || document->url().protocolIs("feeds"))) | ||||
|         return true; | ||||
|     Settings* settings = m_frame->settings(); | ||||
|     if (!settings) | ||||
|         return false; | ||||
|  | ||||
| #if ENABLE(DASHBOARD_SUPPORT) | ||||
|     if (settings->usesDashboardBackwardCompatibilityMode()) | ||||
|         return true; | ||||
| #endif | ||||
|  | ||||
|     if (settings->needsKeyboardEventDisambiguationQuirks()) | ||||
|         return true; | ||||
|  | ||||
|     return false; | ||||
| } | ||||
|  | ||||
| unsigned EventHandler::accessKeyModifiers() | ||||
| { | ||||
|     // Control+Option key combinations are usually unused on Mac OS X, but not when VoiceOver is enabled. | ||||
|     // So, we use Control in this case, even though it conflicts with Emacs-style key bindings. | ||||
|     // See <https://bugs.webkit.org/show_bug.cgi?id=21107> for more detail. | ||||
|     if (AXObjectCache::accessibilityEnhancedUserInterfaceEnabled()) | ||||
|         return PlatformKeyboardEvent::CtrlKey; | ||||
|  | ||||
|     return PlatformKeyboardEvent::CtrlKey | PlatformKeyboardEvent::AltKey; | ||||
| } | ||||
|  | ||||
| } | ||||
							
								
								
									
										1372
									
								
								samples/Objective-C++/objsql.mm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1372
									
								
								samples/Objective-C++/objsql.mm
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										34
									
								
								samples/PureScript/Control.Arrow.purs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								samples/PureScript/Control.Arrow.purs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,34 @@ | ||||
| module Control.Arrow where | ||||
|  | ||||
| import Data.Tuple | ||||
|  | ||||
| class Arrow a where | ||||
|   arr :: forall b c. (b -> c) -> a b c | ||||
|   first :: forall b c d. a b c -> a (Tuple b d) (Tuple c d) | ||||
|  | ||||
| instance arrowFunction :: Arrow (->) where | ||||
|   arr f = f | ||||
|   first f (Tuple b d) = Tuple (f b) d | ||||
|  | ||||
| second :: forall a b c d. (Category a, Arrow a) => a b c -> a (Tuple d b) (Tuple d c) | ||||
| second f = arr swap >>> first f >>> arr swap | ||||
|  | ||||
| swap :: forall a b. Tuple a b -> Tuple b a | ||||
| swap (Tuple x y) = Tuple y x | ||||
|  | ||||
| infixr 3 *** | ||||
| infixr 3 &&& | ||||
|  | ||||
| (***) :: forall a b b' c c'. (Category a, Arrow a) => a b c -> a b' c' -> a (Tuple b b') (Tuple c c') | ||||
| (***) f g = first f >>> second g | ||||
|  | ||||
| (&&&) :: forall a b b' c c'. (Category a, Arrow a) => a b c -> a b c' -> a b (Tuple c c') | ||||
| (&&&) f g = arr (\b -> Tuple b b) >>> (f *** g) | ||||
|  | ||||
| class ArrowZero a where | ||||
|   zeroArrow :: forall b c. a b c | ||||
|  | ||||
| infixr 5 <+> | ||||
|  | ||||
| class ArrowPlus a where | ||||
|   (<+>) :: forall b c. a b c -> a b c -> a b c | ||||
							
								
								
									
										111
									
								
								samples/PureScript/Data.Foreign.purs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										111
									
								
								samples/PureScript/Data.Foreign.purs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,111 @@ | ||||
| module Data.Foreign | ||||
|   ( Foreign(..) | ||||
|   , ForeignParser(ForeignParser) | ||||
|   , parseForeign | ||||
|   , parseJSON | ||||
|   , ReadForeign | ||||
|   , read | ||||
|   , prop | ||||
|   ) where | ||||
|  | ||||
| import Prelude | ||||
| import Data.Array | ||||
| import Data.Either | ||||
| import Data.Maybe | ||||
| import Data.Tuple | ||||
| import Data.Traversable | ||||
|  | ||||
| foreign import data Foreign :: * | ||||
|  | ||||
| foreign import fromString | ||||
|   "function fromString (str) { \ | ||||
|   \  try { \ | ||||
|   \    return _ps.Data_Either.Right(JSON.parse(str)); \ | ||||
|   \  } catch (e) { \ | ||||
|   \    return _ps.Data_Either.Left(e.toString()); \ | ||||
|   \  } \ | ||||
|   \}" :: String -> Either String Foreign | ||||
|  | ||||
| foreign import readPrimType | ||||
|   "function readPrimType (typeName) { \ | ||||
|   \  return function (value) { \ | ||||
|   \    if (toString.call(value) == '[object ' + typeName + ']') { \ | ||||
|   \      return _ps.Data_Either.Right(value);\ | ||||
|   \    } \ | ||||
|   \    return _ps.Data_Either.Left('Value is not a ' + typeName + ''); \ | ||||
|   \  }; \ | ||||
|   \}" :: forall a. String -> Foreign -> Either String a | ||||
|  | ||||
| foreign import readMaybeImpl | ||||
|   "function readMaybeImpl (value) { \ | ||||
|   \  return value === undefined || value === null ? _ps.Data_Maybe.Nothing : _ps.Data_Maybe.Just(value); \ | ||||
|   \}" :: forall a. Foreign -> Maybe Foreign | ||||
|  | ||||
| foreign import readPropImpl | ||||
|   "function readPropImpl (k) { \ | ||||
|   \  return function (obj) { \ | ||||
|   \    return _ps.Data_Either.Right(obj[k]);\ | ||||
|   \  }; \ | ||||
|   \}" :: forall a. String -> Foreign -> Either String Foreign | ||||
|  | ||||
| foreign import showForeignImpl | ||||
|   "var showForeignImpl = JSON.stringify;" :: Foreign -> String | ||||
|  | ||||
| instance showForeign :: Prelude.Show Foreign where | ||||
|   show = showForeignImpl | ||||
|  | ||||
| data ForeignParser a = ForeignParser (Foreign -> Either String a) | ||||
|  | ||||
| parseForeign :: forall a. ForeignParser a -> Foreign -> Either String a | ||||
| parseForeign (ForeignParser p) x = p x | ||||
|  | ||||
| parseJSON :: forall a. (ReadForeign a) => String -> Either String a | ||||
| parseJSON json = fromString json >>= parseForeign read | ||||
|  | ||||
| instance monadForeignParser :: Prelude.Monad ForeignParser where | ||||
|   return x = ForeignParser \_ -> Right x | ||||
|   (>>=) (ForeignParser p) f = ForeignParser \x -> case p x of | ||||
|       Left err -> Left err | ||||
|       Right x' -> parseForeign (f x') x | ||||
|  | ||||
| instance applicativeForeignParser :: Prelude.Applicative ForeignParser where | ||||
|   pure x = ForeignParser \_ -> Right x | ||||
|   (<*>) (ForeignParser f) (ForeignParser p) = ForeignParser \x -> case f x of | ||||
|       Left err -> Left err | ||||
|       Right f' -> f' <$> p x | ||||
|  | ||||
| instance functorForeignParser :: Prelude.Functor ForeignParser where | ||||
|   (<$>) f (ForeignParser p) = ForeignParser \x -> f <$> p x | ||||
|  | ||||
| class ReadForeign a where | ||||
|   read :: ForeignParser a | ||||
|  | ||||
| instance readString :: ReadForeign String where | ||||
|   read = ForeignParser $ readPrimType "String" | ||||
|  | ||||
| instance readNumber :: ReadForeign Number where | ||||
|   read = ForeignParser $ readPrimType "Number" | ||||
|  | ||||
| instance readBoolean :: ReadForeign Boolean where | ||||
|   read = ForeignParser $ readPrimType "Boolean" | ||||
|  | ||||
| instance readArray :: (ReadForeign a) => ReadForeign [a] where | ||||
|   read = | ||||
|     let arrayItem (Tuple i x) = case parseForeign read x of | ||||
|       Right result -> Right result | ||||
|       Left err -> Left $ "Error reading item at index " ++ (show i) ++ ":\n" ++ err | ||||
|     in | ||||
|     (ForeignParser $ readPrimType "Array") >>= \xs ->  | ||||
|       ForeignParser \_ -> arrayItem `traverse` (zip (range 0 (length xs)) xs) | ||||
|  | ||||
| instance readMaybe :: (ReadForeign a) => ReadForeign (Maybe a) where | ||||
|   read = (ForeignParser $ Right <<< readMaybeImpl) >>= \x ->  | ||||
|     ForeignParser \_ -> case x of | ||||
|       Just x' -> parseForeign read x' >>= return <<< Just | ||||
|       Nothing -> return Nothing | ||||
|  | ||||
| prop :: forall a. (ReadForeign a) => String -> ForeignParser a | ||||
| prop p = (ForeignParser \x -> readPropImpl p x) >>= \x ->  | ||||
|   ForeignParser \_ -> case parseForeign read x of | ||||
|     Right result -> Right result | ||||
|     Left err -> Left $ "Error reading property '" ++ p ++ "':\n" ++ err | ||||
							
								
								
									
										90
									
								
								samples/PureScript/Data.Map.purs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										90
									
								
								samples/PureScript/Data.Map.purs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,90 @@ | ||||
| module Data.Map | ||||
|   ( Map(), | ||||
|     empty, | ||||
|     singleton, | ||||
|     insert, | ||||
|     lookup, | ||||
|     delete, | ||||
|     alter, | ||||
|     toList, | ||||
|     fromList, | ||||
|     union, | ||||
|     map | ||||
|   ) where | ||||
|  | ||||
| import qualified Prelude as P | ||||
|  | ||||
| import Data.Array (concat) | ||||
| import Data.Foldable (foldl) | ||||
| import Data.Maybe | ||||
| import Data.Tuple | ||||
|  | ||||
| data Map k v = Leaf | Branch { key :: k, value :: v, left :: Map k v, right :: Map k v } | ||||
|  | ||||
| instance eqMap :: (P.Eq k, P.Eq v) => P.Eq (Map k v) where | ||||
|   (==) m1 m2 = toList m1 P.== toList m2 | ||||
|   (/=) m1 m2 = P.not (m1 P.== m2) | ||||
|  | ||||
| instance showMap :: (P.Show k, P.Show v) => P.Show (Map k v) where | ||||
|   show m = "fromList " P.++ P.show (toList m) | ||||
|  | ||||
| empty :: forall k v. Map k v | ||||
| empty = Leaf | ||||
|  | ||||
| singleton :: forall k v. k -> v -> Map k v | ||||
| singleton k v = Branch { key: k, value: v, left: empty, right: empty } | ||||
|  | ||||
| insert :: forall k v. (P.Eq k, P.Ord k) => k -> v -> Map k v -> Map k v | ||||
| insert k v Leaf = singleton k v | ||||
| insert k v (Branch b@{ key = k1 }) | k P.== k1 = Branch (b { key = k, value = v }) | ||||
| insert k v (Branch b@{ key = k1 }) | k P.< k1 = Branch (b { left = insert k v b.left }) | ||||
| insert k v (Branch b) = Branch (b { right = insert k v b.right }) | ||||
|  | ||||
| lookup :: forall k v. (P.Eq k, P.Ord k) => k -> Map k v -> Maybe v | ||||
| lookup k Leaf = Nothing | ||||
| lookup k (Branch { key = k1, value = v }) | k P.== k1 = Just v | ||||
| lookup k (Branch { key = k1, left = left }) | k P.< k1 = lookup k left | ||||
| lookup k (Branch { right = right }) = lookup k right | ||||
|  | ||||
| findMinKey :: forall k v. (P.Ord k) => Map k v -> Tuple k v | ||||
| findMinKey (Branch { key = k, value = v, left = Leaf }) = Tuple k v | ||||
| findMinKey (Branch b) = findMinKey b.left | ||||
|  | ||||
| delete :: forall k v. (P.Eq k, P.Ord k) => k -> Map k v -> Map k v | ||||
| delete k Leaf = Leaf | ||||
| delete k (Branch b@{ key = k1, left = Leaf }) | k P.== k1 = | ||||
|   case b of | ||||
|     { left = Leaf } -> b.right | ||||
|     { right = Leaf } -> b.left | ||||
|     _ -> glue b.left b.right | ||||
| delete k (Branch b@{ key = k1 }) | k P.< k1 = Branch (b { left = delete k b.left }) | ||||
| delete k (Branch b) = Branch (b { right = delete k b.right }) | ||||
|  | ||||
| alter :: forall k v. (P.Eq k, P.Ord k) => (Maybe v -> Maybe v) -> k -> Map k v -> Map k v | ||||
| alter f k Leaf = case f Nothing of | ||||
|   Nothing -> Leaf | ||||
|   Just v -> singleton k v | ||||
| alter f k (Branch b@{ key = k1, value = v }) | k P.== k1 = case f (Just v) of | ||||
|   Nothing -> glue b.left b.right | ||||
|   Just v' -> Branch (b { value = v' }) | ||||
| alter f k (Branch b@{ key = k1 }) | k P.< k1 = Branch (b { left = alter f k b.left }) | ||||
| alter f k (Branch b) = Branch (b { right = alter f k b.right }) | ||||
|  | ||||
| glue :: forall k v. (P.Eq k, P.Ord k) => Map k v -> Map k v -> Map k v | ||||
| glue left right =  | ||||
|   let Tuple minKey root = findMinKey right in | ||||
|   Branch { key: minKey, value: root, left: left, right: delete minKey right } | ||||
|  | ||||
| toList :: forall k v. Map k v -> [Tuple k v] | ||||
| toList Leaf = [] | ||||
| toList (Branch b) = toList b.left `concat` [Tuple b.key b.value] `concat` toList b.right | ||||
|  | ||||
| fromList :: forall k v. (P.Eq k, P.Ord k) => [Tuple k v] -> Map k v | ||||
| fromList = foldl (\m (Tuple k v) -> insert k v m) empty | ||||
|  | ||||
| union :: forall k v. (P.Eq k, P.Ord k) => Map k v -> Map k v -> Map k v | ||||
| union m1 m2 = foldl (\m (Tuple k v) -> insert k v m) m2 (toList m1) | ||||
|  | ||||
| map :: forall k v1 v2. (P.Eq k, P.Ord k) => (v1 -> v2) -> Map k v1 -> Map k v2 | ||||
| map _ Leaf = Leaf | ||||
| map f (Branch b) = Branch (b { value = f b.value, left = map f b.left, right = map f b.right }) | ||||
							
								
								
									
										128
									
								
								samples/PureScript/ReactiveJQueryTest.purs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										128
									
								
								samples/PureScript/ReactiveJQueryTest.purs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,128 @@ | ||||
| module ReactiveJQueryTest where | ||||
|  | ||||
| import Prelude ((+), (++), (<$>), (<*>), ($), (<<<), flip, return, show) | ||||
| import Control.Monad | ||||
| import Control.Monad.Eff | ||||
| import Control.Monad.JQuery | ||||
| import Control.Reactive | ||||
| import Control.Reactive.JQuery | ||||
| import Data.Array (map, head, length) | ||||
| import Data.Foldable | ||||
| import Data.Foreign | ||||
| import Data.Maybe | ||||
| import Data.Monoid | ||||
| import Data.Traversable | ||||
| import Debug.Trace | ||||
| import Global (parseInt) | ||||
|  | ||||
| main = do | ||||
|   personDemo | ||||
|   todoListDemo | ||||
|  | ||||
| greet firstName lastName = "Hello, " ++ firstName ++ " " ++ lastName ++ "!" | ||||
|  | ||||
| personDemo = do | ||||
|   -- Create new reactive variables to hold the user's names | ||||
|   firstName <- newRVar "John" | ||||
|   lastName <- newRVar "Smith" | ||||
|  | ||||
|   -- Get the document body | ||||
|   b <- body | ||||
|  | ||||
|   -- Create a text box for the first name | ||||
|   firstNameDiv <- create "<div>" | ||||
|   firstNameInput <- create "<input>" | ||||
|   "First Name: " `appendText` firstNameDiv | ||||
|   firstNameInput `append` firstNameDiv | ||||
|   firstNameDiv `append` b | ||||
|  | ||||
|   -- Create a text box for the last name | ||||
|   lastNameDiv <- create "<div>" | ||||
|   lastNameInput <- create "<input>" | ||||
|   "Last Name: " `appendText` lastNameDiv | ||||
|   lastNameInput `append` lastNameDiv | ||||
|   lastNameDiv `append` b | ||||
|  | ||||
|   -- Bind the text box values to the name variables | ||||
|   bindValueTwoWay firstName firstNameInput | ||||
|   bindValueTwoWay lastName lastNameInput | ||||
|  | ||||
|   -- Create a paragraph to display a greeting | ||||
|   greeting <- create "<p>" | ||||
|   { color: "red" } `css` greeting | ||||
|   greeting `append` b | ||||
|  | ||||
|   -- Bind the text property of the greeting paragraph to a computed property | ||||
|   let greetingC = greet <$> toComputed firstName <*> toComputed lastName | ||||
|   bindTextOneWay greetingC greeting | ||||
|  | ||||
| todoListDemo = do | ||||
|   -- Get the document body | ||||
|   b <- body | ||||
|  | ||||
|   -- Create an array | ||||
|   arr <- newRArray | ||||
|  | ||||
|   text1 <- newRVar "Learn PureScript" | ||||
|   comp1 <- newRVar false | ||||
|   insertRArray arr { text: text1, completed: comp1 } 0 | ||||
|    | ||||
|   ul <- create "<ul>" | ||||
|  | ||||
|   -- Bind the ul to the array | ||||
|   bindArray arr ul $ \entry indexR -> do | ||||
|     li <- create "<li>" | ||||
|  | ||||
|     completedInput <- create "<input>" | ||||
|     setAttr "type" "checkbox" completedInput | ||||
|     completedInput `append` li | ||||
|     sub1 <- bindCheckedTwoWay entry.completed completedInput | ||||
|      | ||||
|     textInput <- create "<input>" | ||||
|     textInput `append` li | ||||
|     sub2 <- bindValueTwoWay entry.text textInput | ||||
|  | ||||
|     btn <- create "<button>" | ||||
|     "Remove" `appendText` btn | ||||
|     flip (on "click") btn $ do | ||||
|       index <- readRVar indexR | ||||
|       removeRArray arr index | ||||
|     btn `append` li | ||||
|  | ||||
|     return { el: li, subscription: sub1 <> sub2 } | ||||
|  | ||||
|   ul `append` b | ||||
|  | ||||
|   -- Add button | ||||
|   newEntryDiv <- create "<div>" | ||||
|   btn <- create "<button>" | ||||
|   "Add" `appendText` btn | ||||
|   btn `append` newEntryDiv | ||||
|   newEntryDiv `append` b | ||||
|  | ||||
|   flip (on "click") btn $ do | ||||
|     text <- newRVar "" | ||||
|     completed <- newRVar false | ||||
|     arr' <- readRArray arr | ||||
|     insertRArray arr { text: text, completed: completed } (length arr') | ||||
|  | ||||
|   -- Create a paragraph to display the next task | ||||
|   nextTaskLabel <- create "<p>" | ||||
|   nextTaskLabel `append` b | ||||
|  | ||||
|   let nextTask = do | ||||
|     task <- head <$> toComputedArray arr | ||||
|     case task of | ||||
|       Nothing -> return "Done!" | ||||
|       Just { text = text } -> (++) "Next task: " <$> toComputed text | ||||
|   bindTextOneWay nextTask nextTaskLabel | ||||
|  | ||||
|   -- Create a paragraph to display the task counter | ||||
|   counterLabel <- create "<p>" | ||||
|   counterLabel `append` b | ||||
|  | ||||
|   let counter = (flip (++) " tasks remaining") <<< show <$> do | ||||
|     rs <- toComputedArray arr | ||||
|     cs <- map (\c -> if c then 0 else 1) <$> traverse (\entry -> toComputed entry.completed) rs | ||||
|     return $ foldl (+) 0 cs | ||||
|   bindTextOneWay counter counterLabel | ||||
							
								
								
									
										217
									
								
								samples/Rebol/GCP-datatypes.r
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										217
									
								
								samples/Rebol/GCP-datatypes.r
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,217 @@ | ||||
| Rebol [Title: "Google Code Prettify Datatypes"] | ||||
|  | ||||
| re: func [s /i] [rejoin compose ["/^^" (s) "/" either i ["i"][""]]]   ; little helper for standard grammar regex used | ||||
|  | ||||
| date-re: "\d{1,2}[\-\/](\d{1,2}|\w{3,9})[\-\/]\d{2,4}"  ; naive date! regex | ||||
|  | ||||
| string-re: {\"(?:[^^\"\\]|\\[\s\S])*(?:\"|$)} | ||||
| brace-re:  "\{(?:[^^\}\^^]|\^^[\s\S])*(?:\}|$)"   ; TODO - could build this from string-re | ||||
| block-re:  "\[(?:[^^\]\\]|\\[\s\S])*(?:\]|$)" | ||||
| tag-re:    "\<(?:[^^\>\\]|\\[\s\S])*(?:\>|$)"   ; TODO - could build this from string-re | ||||
| number-re: "(?:[.,]\d+|\d+['\d]*(?:[.,]\d*)?)(?:e[-+]?\d+)?" | ||||
| word-re: "[A-Za-z=\-?!_*+.`~&][A-Za-z0-9=\-!?_*+.`~&]*" | ||||
|  | ||||
| |: "|" | ||||
|  | ||||
| types: compose/deep [ | ||||
|     ;  comments | ||||
|     comment! [ | ||||
|         PR_LITERAL | ||||
|     ;      comment_shebang -- Script tag (shebang!) | ||||
|         (re/i "#![^^\r\n]+") | ||||
|     ;      comment_line -- A line comment that starts with ; | ||||
|         (re ";[^^\r\n]*") | ||||
|     ;      comment_multiline_string -- Multi-line comment | ||||
|         (re ["comment\s*" brace-re]) | ||||
|     ;      comment_multiline_block | ||||
|         (re ["comment\s*" block-re]) | ||||
|     ] | ||||
|     ;  type_literal | ||||
|      | ||||
|     ;  logic | ||||
|     logic! [ | ||||
|         PR_LITERAL | ||||
|         (re "#\[(?:true|false|yes|no|on|off)\]") | ||||
|     ] | ||||
|      | ||||
|     ;  none | ||||
|     none! [ | ||||
|         PR_LITERAL | ||||
|         (re "#\[none\]") | ||||
|     ] | ||||
|      | ||||
|     ;  strings | ||||
|     ;      character | ||||
|     char! [ | ||||
|         PR_LITERAL | ||||
|         (re/i "#^"(?:[^^^^^"]|\^^(?:[\^^^"\/\-A-Z]|\((?:[0-9A-F]{2,4}|tab|newline)\)))^"") | ||||
|     ] | ||||
|      | ||||
|     string! [ | ||||
|         PR_LITERAL | ||||
|     ;      string_quoted | ||||
|         (re "^"(?:[^^^"\\]|\\[\s\S])*(?:^"|$)") | ||||
|     ;      string_multiline -- Multi-line string {braces} - allowed within:  { ^{ ^} | ||||
|         (re brace-re) | ||||
|     ] | ||||
|      | ||||
|     ;      string_tag_comment | ||||
|     comment! [ | ||||
|         PR_LITERAL | ||||
|         (re "<!--(?:[^^-]|-(?!->))+-->") | ||||
|     ] | ||||
|      | ||||
|     ;      string_tag | ||||
|     tag! [ | ||||
|         PR_LITERAL | ||||
|         (re "<[^^^"<=>\x00\x09\x0A\x0D\x20\u005D\u007F][^^>\x00]*>") | ||||
|     ] | ||||
|      | ||||
|     file! [ | ||||
|         PR_LITERAL | ||||
|     ;      string_file | ||||
|         (re "%(?:[a-zA-Z?!.*&|=_~0-9'+\-,:\/\\@]|%[0-9A-F]{2})+") | ||||
|     ;      string_file_quoted | ||||
|         (re "%^"(?:[^^^"])*^"") | ||||
|     ] | ||||
|      | ||||
|     url! [ | ||||
|         PR_LITERAL | ||||
|     ;      string_url | ||||
|         (re "[a-zA-Z?!.*&|=_~][a-zA-Z?!.*&|=_~0-9'+-,]*:(?:[a-zA-Z?!.*&|=_~0-9'+\-,:\/@]|%[0-9A-F]{2})+") | ||||
|     ] | ||||
|      | ||||
|     email! [ | ||||
|         PR_LITERAL | ||||
|     ;      string_email | ||||
|         (re "[\w\d\+\-\.]+\@[\w\d\+\-\.]+\b") | ||||
|     ] | ||||
|      | ||||
|     binary! [ | ||||
|         PR_LITERAL | ||||
|     ;      binary_base_two | ||||
|         (re "2#\{(?:[01\r\n\t ])*\}") | ||||
|     ;      binary_base_sixty_four | ||||
|         (re "64#\{(?:[0-9+\/a-yA-Z=\r\n\t ])*\}") | ||||
|     ;      binary_base_sixteen | ||||
|         (re/i "(?:16)?#\{(?:[0-9a-f\r\n\t ])*\}") | ||||
|     ] | ||||
|      | ||||
|     issue! [ | ||||
|         PR_LITERAL | ||||
|     ;      string_issue | ||||
|         (re "#[\w\d\-]+(?=[\s\n\t]|$)") | ||||
|     ] | ||||
|      | ||||
|     ;  values | ||||
|     date! [ | ||||
|         PR_LITERAL | ||||
|     ;      value_date | ||||
|         (re [date-re "\/\d{1,2}\:\d{1,2}\:\d{1,2}(\+|\-)\d{1,2}\:(00|30)\b"]) | ||||
|         (re [date-re "\/\d{1,2}\:\d{1,2}\:\d{1,2}\b"]) | ||||
|         (re [date-re "\b"]) | ||||
|         (re "\d{2,4}[\/\-](\d{1,2}|\w{3,9})[\/\-]\d{1,2}(?:\/\d{1,2}\:\d{1,2}(?:\:\d{1,2})?(?:[-+]\d{1,2}:[03]0)?)?") | ||||
|     ] | ||||
|      | ||||
|     time! [ | ||||
|         PR_LITERAL | ||||
|     ;      value_time | ||||
|         (re "[-+]?\d{1,2}:\d{1,2}(?::\d{1,2}(?:\.\d+)?)?\b") | ||||
|     ] | ||||
|      | ||||
|     tuple! [ | ||||
|         PR_LITERAL | ||||
|     ;      value_tuple | ||||
|         (re "\d+(?:\.\d+){2,9}") | ||||
|     ] | ||||
|      | ||||
|     pair! [ | ||||
|         PR_LITERAL | ||||
|     ;      value_pair | ||||
|         (re/i ["[-+]?" number-re "x[-+]?" number-re]) | ||||
|     ] | ||||
|     ;  [PR['PR_LITERAL'], /^\d(?:[\.\,\'\d]*)x\d(?:[\.\,\'\d]*)\b/] | ||||
|      | ||||
|     money! [ | ||||
|         PR_LITERAL | ||||
|     ;      value_money | ||||
|         (re ["[-+]?[A-Z]{0,3}\$" number-re]) | ||||
|         ;  [PR['PR_LITERAL'], /^\$\d[\d\.\,\']*\b/] | ||||
|         ;  [PR['PR_LITERAL'], /^[\+\-\w]{1,4}\$\d[\d\.\,\']*\b/] | ||||
|     ] | ||||
|      | ||||
|     ;      value_number | ||||
|     number! [ | ||||
|         PR_LITERAL | ||||
|         (re/i ["[-+]?" number-re "%?"]) | ||||
|         ;  percent! [PR_LITERAL (re "(\+|\-|\d)(?:[\.\,\'\d]*)\%\b")] | ||||
|         ;  decimal! [PR_LITERAL (re "(\+|\-|\d)\d*(?:[\.\,]\d+)\b")] | ||||
|         ;  integer! [PR_LITERAL (re "(\+|\-|\d)\d*\b")] | ||||
|     ] | ||||
|      | ||||
|     ;  words | ||||
|     datatype! [ | ||||
|         PR_LITERAL | ||||
|     ;      word_datatype | ||||
|         (re "(?:[A-Za-z\-]+)\!(?![A-Za-z0-9\-])") | ||||
|     ] | ||||
|      | ||||
|     set-word! [ | ||||
|         PR_LITERAL | ||||
|     ;      word_set | ||||
|         (re [word-re "(?:\/" word-re "|\/\d+)*:"]) | ||||
|     ] | ||||
|      | ||||
|     ;  -- get-word! | ||||
|     get-word! [ | ||||
|         PR_LITERAL | ||||
|     ;      word_get | ||||
|         (re [":" word-re]) | ||||
|     ] | ||||
|      | ||||
|     ;  -- lit-word! | ||||
|     lit-word! [ | ||||
|         PR_LITERAL | ||||
|     ;      word_lit | ||||
|         (re ["'" word-re]) | ||||
|     ] | ||||
|      | ||||
|     refinement! [ | ||||
|         PR_LITERAL | ||||
|     ;      word_refine | ||||
|         (re reduce ["\/" replace copy find next word-re "[" "]*" "]+" "(?![A-Za-z0-9\-])"]) | ||||
|     ] | ||||
|  | ||||
|     op! [ | ||||
|         PR_LITERAL | ||||
|     ;      word_native | ||||
|         (re "(?:!=?=?|\*\*?|[+-]|\/\/?|<[=>]?|=[=?]?|>=?)(?![A-Za-z0-9\-])") | ||||
|     ] | ||||
|      | ||||
|     function! [ | ||||
|         PR_LITERAL | ||||
|         (re make-keywords-string) | ||||
|         ; [REB['function!'], /\b(?:to\-relative\-file\/as\-local|or\~|pwd|abs|map|not|rm|at|do|dp|ds|dt|cd|in|ls|to|or|if)\s/] | ||||
|     ] | ||||
|      | ||||
|     rebol! [ | ||||
|         PR_LITERAL | ||||
|     ;      word_header | ||||
|         (re/i "(?:rebol|red(?:\/system)?|world|topaz)$") | ||||
|     ] | ||||
|      | ||||
|     logic! [ | ||||
|         PR_LITERAL | ||||
|     ;      word_logic | ||||
|         (re "(?:true|false|yes|no|on|off)$") | ||||
|     ] | ||||
|      | ||||
|     ;      word_none | ||||
|     none! [PR_LITERAL (re "none$")] | ||||
|      | ||||
|     ;      word | ||||
|     word! [PR_LITERAL (re word-re)] | ||||
|  | ||||
|     ;  -- literal! | ||||
|     ; literal! [PR_LITERAL (re ["#" block-re])] | ||||
| ] | ||||
							
								
								
									
										31
									
								
								samples/Rebol/booters.r
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								samples/Rebol/booters.r
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,31 @@ | ||||
| REBOL [ | ||||
| 	System: "REBOL [R3] Language Interpreter and Run-time Environment" | ||||
| 	Title: "Special boot native function specs" | ||||
| 	Rights: { | ||||
| 		Copyright 2012 REBOL Technologies | ||||
| 		REBOL is a trademark of REBOL Technologies | ||||
| 	} | ||||
| 	License: { | ||||
| 		Licensed under the Apache License, Version 2.0. | ||||
| 		See: http://www.apache.org/licenses/LICENSE-2.0 | ||||
| 	} | ||||
| 	Purpose: { | ||||
| 		These are used to define natives and actions. | ||||
| 		Bind attributes for this block are: BIND_SET and SHALLOW | ||||
| 	} | ||||
| ] | ||||
|  | ||||
| ; Special block used as spec to the datatype test functions (e.g. time?): | ||||
| ["Returns TRUE if it is this type." value [any-type!] 0] | ||||
|  | ||||
| ; The native function must be defined first. This is a | ||||
| ; special boot function created manually within the C code. | ||||
| native: native [ | ||||
| 	{Creates native function (for internal usage only).} | ||||
| 	spec ; [block!] -- no check required, we know it is correct | ||||
| ] | ||||
|  | ||||
| action: native [ | ||||
| 	{Creates datatype action (for internal usage only).} | ||||
| 	spec ; [block!] -- no check required, we know it is correct | ||||
| ] | ||||
| @@ -1,5 +1,7 @@ | ||||
| REBOL [] | ||||
| 
 | ||||
| hello: func [] [ | ||||
|     print "hello, world!" | ||||
| ] | ||||
| 
 | ||||
| hello | ||||
							
								
								
									
										7
									
								
								samples/Rebol/hello-world.r3
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								samples/Rebol/hello-world.r3
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,7 @@ | ||||
| Rebol [] | ||||
|  | ||||
| hello: func [] [ | ||||
|     print "hello, world!" | ||||
| ] | ||||
|  | ||||
| hello | ||||
							
								
								
									
										5
									
								
								samples/Rebol/hello-world.reb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								samples/Rebol/hello-world.reb
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,5 @@ | ||||
| Rebol [] | ||||
| hello: func [] [ | ||||
|     print "hello, world!" | ||||
| ] | ||||
| hello | ||||
							
								
								
									
										9
									
								
								samples/Rebol/hello-world.rebol
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								samples/Rebol/hello-world.rebol
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,9 @@ | ||||
| Rebol [ | ||||
|   author: "Rebol user" | ||||
| ] | ||||
|  | ||||
| hello: func [] [ | ||||
|   print "hello, world!" | ||||
| ] | ||||
|  | ||||
| hello | ||||
							
								
								
									
										2
									
								
								samples/ShellSession/dollar.sh-session
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								samples/ShellSession/dollar.sh-session
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,2 @@ | ||||
| $ echo $FOOBAR | ||||
| Hello World! | ||||
							
								
								
									
										47
									
								
								samples/ShellSession/gem-install.sh-session
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										47
									
								
								samples/ShellSession/gem-install.sh-session
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,47 @@ | ||||
| $ gem install nokogiri | ||||
| ... | ||||
| Building native extensions. This could take a while... | ||||
| ... | ||||
| checking for libxml/parser.h... *** extconf.rb failed *** | ||||
| Could not create Makefile due to some reason, probably lack of | ||||
| necessary libraries and/or headers. Check the mkmf.log file for more | ||||
| details. You may need configuration options. | ||||
| ... | ||||
|   | ||||
| $ brew tap homebrew/dupes | ||||
| Cloning into '/usr/local/Library/Taps/homebrew-dupes'... | ||||
| remote: Counting objects: 1034, done. | ||||
| remote: Compressing objects: 100% (591/591), done. | ||||
| remote: Total 1034 (delta 560), reused 898 (delta 443) | ||||
| Receiving objects: 100% (1034/1034), 192.53 KiB | 0 bytes/s, done. | ||||
| Resolving deltas: 100% (560/560), done. | ||||
| Checking connectivity... done | ||||
| Warning: Could not tap homebrew/dupes/lsof over mxcl/master/lsof | ||||
| Tapped 41 formula | ||||
|   | ||||
| $ brew install apple-gcc42 | ||||
| ==> Downloading http://r.research.att.com/tools/gcc-42-5666.3-darwin11.pkg | ||||
| ######################################################################## 100.0% | ||||
| ==> Caveats | ||||
| NOTE: | ||||
| This formula provides components that were removed from XCode in the 4.2 | ||||
| release. There is no reason to install this formula if you are using a | ||||
| version of XCode prior to 4.2. | ||||
|   | ||||
| This formula contains compilers built from Apple's GCC sources, build | ||||
| 5666.3, available from: | ||||
|   | ||||
| http://opensource.apple.com/tarballs/gcc | ||||
|   | ||||
| All compilers have a `-4.2` suffix. A GFortran compiler is also included. | ||||
| ==> Summary | ||||
| 🍺 /usr/local/Cellar/apple-gcc42/4.2.1-5666.3: 104 files, 75M, built in 11 seconds | ||||
|   | ||||
| $ gem install nokogiri -v 1.5.10 | ||||
| Fetching: nokogiri-1.5.10.gem (100%) | ||||
| Building native extensions. This could take a while... | ||||
| Successfully installed nokogiri-1.5.10 | ||||
| 1 gem installed | ||||
| Installing ri documentation for nokogiri-1.5.10... | ||||
| Installing RDoc documentation for nokogiri-1.5.10... | ||||
|  | ||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user