gamefic-sdk 1.6.0 → 1.7.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (128) hide show
  1. checksums.yaml +4 -4
  2. data/html/core/engine.js +89 -20
  3. data/html/sinatra/engine.js +27 -13
  4. data/html/skins/hypertext/index.html +0 -2
  5. data/html/skins/standard/play.js +0 -66
  6. data/lib/gamefic-sdk.rb +2 -1
  7. data/lib/gamefic-sdk/build.rb +11 -19
  8. data/lib/gamefic-sdk/config.rb +126 -0
  9. data/lib/gamefic-sdk/platform.rb +12 -0
  10. data/lib/gamefic-sdk/platform/base.rb +35 -33
  11. data/lib/gamefic-sdk/platform/gfic.rb +5 -18
  12. data/lib/gamefic-sdk/platform/sinatra.rb +29 -31
  13. data/lib/gamefic-sdk/platform/web.rb +72 -65
  14. data/lib/gamefic-sdk/platform/web/app_config.rb +48 -48
  15. data/lib/gamefic-sdk/platform/web/engine.rb +10 -7
  16. data/lib/gamefic-sdk/platform/web/user.rb +3 -3
  17. data/lib/gamefic-sdk/server.rb +17 -19
  18. data/lib/gamefic-sdk/shell.rb +68 -16
  19. data/lib/gamefic-sdk/shell/init.rb +3 -19
  20. data/lib/gamefic-sdk/shell/test.rb +9 -14
  21. data/lib/gamefic-sdk/version.rb +1 -1
  22. data/scripts/save-restore-undo.plot.rb +25 -0
  23. data/scripts/snapshots.plot.rb +16 -14
  24. data/scripts/standard.plot.rb +3 -5
  25. data/scripts/standard/actions.plot.rb +1 -11
  26. data/scripts/standard/actions/drop.plot.rb +1 -1
  27. data/scripts/standard/actions/enter.plot.rb +4 -16
  28. data/scripts/standard/actions/go.plot.rb +2 -36
  29. data/scripts/standard/actions/insert.plot.rb +7 -21
  30. data/scripts/standard/actions/inventory.plot.rb +2 -1
  31. data/scripts/standard/actions/leave.plot.rb +7 -18
  32. data/scripts/standard/actions/look.plot.rb +45 -44
  33. data/scripts/standard/actions/nil.plot.rb +1 -1
  34. data/scripts/standard/actions/take.plot.rb +10 -28
  35. data/scripts/standard/actions/talk.plot.rb +9 -13
  36. data/scripts/standard/clothing.plot.rb +4 -0
  37. data/scripts/standard/clothing/actions.plot.rb +4 -0
  38. data/scripts/{clothing → standard/clothing}/actions/doff.plot.rb +0 -0
  39. data/scripts/{clothing → standard/clothing}/actions/drop.plot.rb +8 -8
  40. data/scripts/{clothing → standard/clothing}/actions/inventory.plot.rb +14 -14
  41. data/scripts/standard/clothing/actions/wear.plot.rb +20 -0
  42. data/scripts/standard/clothing/entities.plot.rb +7 -0
  43. data/scripts/{clothing → standard/clothing}/entities/clothing.plot.rb +0 -2
  44. data/scripts/standard/clothing/entities/coat.plot.rb +3 -0
  45. data/scripts/standard/clothing/entities/gloves.plot.rb +3 -0
  46. data/scripts/standard/clothing/entities/hat.plot.rb +3 -0
  47. data/scripts/standard/clothing/entities/pants.plot.rb +3 -0
  48. data/scripts/standard/clothing/entities/shirt.plot.rb +3 -0
  49. data/scripts/standard/clothing/entities/shoes.plot.rb +3 -0
  50. data/scripts/standard/container.plot.rb +28 -0
  51. data/scripts/{debug.plot.rb → standard/container/actions.plot.rb} +0 -0
  52. data/scripts/standard/container/entities.plot.rb +5 -0
  53. data/scripts/standard/direction.plot.rb +1 -2
  54. data/scripts/{edible.plot.rb → standard/edible.plot.rb} +5 -3
  55. data/scripts/standard/entities.plot.rb +3 -3
  56. data/scripts/standard/entities/character.plot.rb +9 -6
  57. data/scripts/standard/entities/fixture.plot.rb +1 -1
  58. data/scripts/standard/entities/item.plot.rb +2 -4
  59. data/scripts/standard/entities/portal.plot.rb +9 -5
  60. data/scripts/standard/entities/receptacle.plot.rb +1 -1
  61. data/scripts/standard/entities/room.plot.rb +5 -5
  62. data/scripts/standard/entities/scenery.plot.rb +2 -4
  63. data/scripts/standard/entities/supporter.plot.rb +4 -7
  64. data/scripts/standard/entities/thing.plot.rb +7 -0
  65. data/scripts/standard/{actions/give.plot.rb → give.plot.rb} +27 -25
  66. data/scripts/standard/lockable.plot.rb +79 -0
  67. data/scripts/standard/modules.plot.rb +2 -4
  68. data/scripts/standard/modules/attachable.plot.rb +1 -0
  69. data/scripts/standard/modules/locale_description.plot.rb +20 -0
  70. data/scripts/standard/{use.plot.rb → modules/use.plot.rb} +51 -47
  71. data/scripts/standard/openable.plot.rb +43 -0
  72. data/scripts/standard/pathfinder.plot.rb +11 -6
  73. data/scripts/standard/test.plot.rb +2 -0
  74. data/scripts/undo.plot.rb +13 -11
  75. metadata +30 -65
  76. data/lib/gamefic-sdk/plot_config.rb +0 -25
  77. data/scripts/ansi.plot.rb +0 -13
  78. data/scripts/autosuggest.plot.rb +0 -165
  79. data/scripts/clothing.plot.rb +0 -2
  80. data/scripts/clothing/actions.plot.rb +0 -4
  81. data/scripts/clothing/actions/wear.plot.rb +0 -19
  82. data/scripts/clothing/entities.plot.rb +0 -7
  83. data/scripts/clothing/entities/coat.plot.rb +0 -5
  84. data/scripts/clothing/entities/gloves.plot.rb +0 -5
  85. data/scripts/clothing/entities/hat.plot.rb +0 -5
  86. data/scripts/clothing/entities/pants.plot.rb +0 -5
  87. data/scripts/clothing/entities/shirt.plot.rb +0 -5
  88. data/scripts/clothing/entities/shoes.plot.rb +0 -5
  89. data/scripts/cover.plot.rb +0 -30
  90. data/scripts/furniture.plot.rb +0 -35
  91. data/scripts/hints.plot.rb +0 -31
  92. data/scripts/hypertext.plot.rb +0 -280
  93. data/scripts/media.plot.rb +0 -17
  94. data/scripts/multimedia.plot.rb +0 -41
  95. data/scripts/questions.plot.rb +0 -17
  96. data/scripts/room-modes.plot.rb +0 -48
  97. data/scripts/rough-sizes.plot.rb +0 -36
  98. data/scripts/save-restore.plot.rb +0 -22
  99. data/scripts/standard/actions/close.plot.rb +0 -16
  100. data/scripts/standard/actions/lock.plot.rb +0 -59
  101. data/scripts/standard/actions/look-under.plot.rb +0 -8
  102. data/scripts/standard/actions/open.plot.rb +0 -34
  103. data/scripts/standard/actions/read.plot.rb +0 -3
  104. data/scripts/standard/actions/search.plot.rb +0 -40
  105. data/scripts/standard/actions/show.plot.rb +0 -13
  106. data/scripts/standard/actions/unlock.plot.rb +0 -77
  107. data/scripts/standard/actions/use.plot.rb +0 -25
  108. data/scripts/standard/entities/container.plot.rb +0 -8
  109. data/scripts/standard/entities/door.plot.rb +0 -51
  110. data/scripts/standard/entities/entity.plot.rb +0 -12
  111. data/scripts/standard/entities/exterior.plot.rb +0 -5
  112. data/scripts/standard/modules/darkenable.plot.rb +0 -6
  113. data/scripts/standard/modules/lockable.plot.rb +0 -25
  114. data/scripts/standard/modules/openable.plot.rb +0 -15
  115. data/scripts/standard/modules/transparent.plot.rb +0 -6
  116. data/scripts/standard/plural.plot.rb +0 -2
  117. data/scripts/standard/plural/actions.plot.rb +0 -4
  118. data/scripts/standard/plural/actions/drop.plot.rb +0 -126
  119. data/scripts/standard/plural/actions/insert.plot.rb +0 -60
  120. data/scripts/standard/plural/actions/place.plot.rb +0 -37
  121. data/scripts/standard/plural/actions/take.plot.rb +0 -175
  122. data/scripts/standard/plural/queries.plot.rb +0 -5
  123. data/scripts/standard/plural/queries/ambiguous_visible.plot.rb +0 -13
  124. data/scripts/standard/plural/queries/any_expression.plot.rb +0 -17
  125. data/scripts/standard/plural/queries/many_visible.plot.rb +0 -13
  126. data/scripts/standard/plural/queries/not_expression.plot.rb +0 -16
  127. data/scripts/standard/plural/queries/plural_visible.plot.rb +0 -22
  128. data/scripts/suggestible.plot.rb +0 -54
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 35c508e4dd9e43547d441742324b0cc6b0ec4a65
4
- data.tar.gz: 0f27b939bb4792bfb2089d60fe501d390db3cdad
3
+ metadata.gz: 7395294d50944bd37c3f1876c55c6a946bbcf9ee
4
+ data.tar.gz: fdf9b3cbb95019b3279687b987522edc0ff3794f
5
5
  SHA512:
6
- metadata.gz: 7ad44738b0f41716518caa6e47d17bf48246ff1adf9a8a5db34abc1c11e07b86d575007665ed748080dee9ff33e0e25de8b5b914f6bf97afd6032f1d8a99830b
7
- data.tar.gz: 68f1a505049cd573c61c611247f89a85cfae8d50c2abc82dbe39acedd16c41a04103383bf5be371a7920ac059aad321236cd4520a9840f80026e0f4095918c0e
6
+ metadata.gz: b760a05656461913ac13ce5623c21c30ab8918e8afe822d3365811cb10d0e011064f4e4b7c6055d20c79586dfd395c2b9cfc3b771553d558dcd84cec17091f20
7
+ data.tar.gz: 86b311a43a5658c4fad44f8180c56ab5b1b32b5312aa3172d652a890d2c86f07c116010ee0272ddee200a1285df089ee69decabd7d5d21919ea26685a7d108c4
data/html/core/engine.js CHANGED
@@ -1,45 +1,114 @@
1
1
  var Gamefic = (function() {
2
2
  var updateCallbacks = [];
3
3
  var startCallbacks = [];
4
+ var loggingUrl = null;
5
+ var logId = null;
6
+ var logAlias = null;
7
+ var lastPrompt = null;
8
+ var lastInput = null;
9
+
10
+ var _start = function() {
11
+ startCallbacks.forEach((callback) => {
12
+ callback();
13
+ });
14
+ Opal.gvars.engine.$run();
15
+ }
16
+
17
+ var _canLog = function() {
18
+ if (!loggingUrl) {
19
+ return false;
20
+ }
21
+ var a = document.createElement('a');
22
+ a.href = loggingUrl;
23
+ return (a.host == window.location.host);
24
+ }
25
+
26
+ var _logAlias = function(name) {
27
+ logAlias = name || logAlias || 'anonymous';
28
+ return logAlias;
29
+ }
4
30
  return {
31
+ enableLogging: function(url) {
32
+ loggingUrl = url || '//gamefic.com/game/log';
33
+ return loggingUrl;
34
+ },
35
+
36
+ logAlias: function(name) {
37
+ return _logAlias(name);
38
+ },
39
+
40
+ canLog: function() {
41
+ return _canLog();
42
+ },
43
+
5
44
  start: function() {
6
- startCallbacks.forEach((callback) => {
7
- callback();
8
- });
9
- Opal.gvars.engine.$run();
45
+ if (loggingUrl) {
46
+ if (_canLog()) {
47
+ $.post(loggingUrl, { alias: _logAlias() }, function(response) {
48
+ logId = response.id;
49
+ _start();
50
+ }).fail(function(response) {
51
+ console.warn('Logging failed.');
52
+ console.warn(response);
53
+ _start();
54
+ });
55
+ } else {
56
+ console.warn('Logging was not activated for ' + loggingUrl);
57
+ _start();
58
+ }
59
+ } else {
60
+ _start();
61
+ }
10
62
  },
11
- update: function(response) {
12
- console.log('Called the Gamefic update');
13
- var state = JSON.parse(response);
14
- console.log('Output: ' + state.output);
63
+
64
+ update: function(json) {
65
+ var state = JSON.parse(json);
66
+ state.last_prompt = lastPrompt;
67
+ state.last_input = lastInput;
68
+ if (logId) {
69
+ $.post(loggingUrl + '/' + logId + '.json', { _method: 'PUT', state: state }, function(response) {
70
+
71
+ }).fail(function(response) {
72
+ console.warn('Logging update failed.');
73
+ console.warn(response);
74
+ logId = null;
75
+ });
76
+ }
15
77
  updateCallbacks.forEach(function(callback) {
16
78
  callback(state);
17
79
  });
80
+ lastPrompt = state.prompt;
18
81
  },
82
+
19
83
  receive: function(input) {
84
+ lastInput = input;
20
85
  Opal.gvars.engine.$receive(input);
21
86
  },
87
+
22
88
  onStart: function(callback) {
23
89
  startCallbacks.push(callback);
24
90
  },
91
+
25
92
  onUpdate: function(callback) {
26
93
  updateCallbacks.push(callback);
27
94
  },
95
+
28
96
  save: function(filename, data) {
29
- var json = Opal.JSON.$generate(data);
30
- localStorage.setItem(filename, json);
31
- Opal.GameficOpal.$static_character().$tell('Game saved.');
97
+ localStorage.setItem(filename, Opal.JSON.$generate(data));
32
98
  },
99
+
33
100
  restore: function(filename) {
34
- var data = Opal.JSON.$parse(localStorage.getItem(filename));
35
- var metadata = data.$fetch('metadata');
36
- // HACK Converting hashes to strings for JavaScript comparison
37
- if (metadata.$to_s() != Opal.GameficOpal.$static_plot().$metadata().$to_s()) {
38
- Opal.GameficOpal.$static_character().$tell('The saved data is not compatible with this version of the game.');
39
- return Opal.nil;
40
- } else {
41
- return data;
42
- }
101
+ var json = localStorage.getItem(filename);
102
+ var snapshot = Opal.JSON.$parse(json);
103
+ Opal.gvars.plot.$restore(snapshot);
104
+ Opal.gvars.engine.$user().$character().$flush();
105
+ Opal.gvars.engine.$user().$character().$cue(Opal.gvars.plot.$default_scene());
106
+ Opal.gvars.plot.$update();
107
+ Opal.gvars.plot.$ready();
108
+ Opal.gvars.engine.$user().$character().$tell('Game restored to last available turn.');
109
+ var state = Opal.gvars.engine.$user().$character().$state();
110
+ var json = state.$to_json();
111
+ this.update(json);
43
112
  }
44
113
  }
45
114
  })();
@@ -2,6 +2,18 @@ var Gamefic = (function() {
2
2
  var startCallbacks = [];
3
3
  var updateCallbacks = [];
4
4
  return {
5
+ enableLogging: function() {
6
+
7
+ },
8
+
9
+ logAlias: function() {
10
+
11
+ },
12
+
13
+ canLog: function() {
14
+ return false;
15
+ },
16
+
5
17
  start: function() {
6
18
  var that = this;
7
19
  $.post('/start', function(response) {
@@ -11,41 +23,43 @@ var Gamefic = (function() {
11
23
  that.update(response);
12
24
  });
13
25
  },
26
+
14
27
  update: function(response) {
15
28
  updateCallbacks.forEach(function(callback) {
16
29
  callback(response);
17
30
  });
18
31
  },
32
+
19
33
  receive: function(input) {
20
34
  var that = this;
21
35
  $.post('/update', {command: input}, function(response) {
22
- console.log(JSON.stringify(response));
23
36
  that.update(response);
24
37
  }).fail(function(response) {
25
38
  console.log('An error occurred');
26
39
  });
27
40
  },
41
+
28
42
  onUpdate: function(callback) {
29
43
  updateCallbacks.push(callback);
30
44
  },
45
+
31
46
  onStart: function(callback) {
32
47
  updateCallbacks.push(callback);
33
48
  },
49
+
34
50
  save: function(filename, data) {
35
- var json = Opal.JSON.$generate(data);
36
- localStorage.setItem(filename, json);
37
- Opal.GameficOpal.$static_character().$tell('Game saved.');
51
+ console.log('Saving ' + data);
52
+ localStorage.setItem(filename, data);
38
53
  },
54
+
39
55
  restore: function(filename) {
40
- var data = Opal.JSON.$parse(localStorage.getItem(filename));
41
- var metadata = data.$fetch('metadata');
42
- // HACK Converting hashes to strings for JavaScript comparison
43
- if (metadata.$to_s() != Opal.GameficOpal.$static_plot().$metadata().$to_s()) {
44
- Opal.GameficOpal.$static_character().$tell('The saved data is not compatible with this version of the game.');
45
- return Opal.nil;
46
- } else {
47
- return data;
48
- }
56
+ var json = localStorage.getItem(filename);
57
+ var data = JSON.parse(json);
58
+ var that = this;
59
+ $.post('/restore', {snapshot: JSON.stringify(data)}, function(response) {
60
+ console.log('Restored a snapshot.');
61
+ that.update(response);
62
+ });
49
63
  }
50
64
  }
51
65
  })();
@@ -81,7 +81,6 @@
81
81
  });
82
82
  $('#objects a, #incidentals a').each(function() {
83
83
  var name = $(this).text().replace(/^(a |an |the )/i, '');
84
- console.log('Object: ' + name);
85
84
  var regexp = new RegExp(name, 'g');
86
85
  var command = $(this).attr('data-command');
87
86
  html.find('*').each(function() {
@@ -93,7 +92,6 @@
93
92
  });
94
93
  $('#portals a').not('.disabled').each(function() {
95
94
  var name = $(this).attr('id').replace(/^(a |an |the )/i, '');
96
- console.log('Object: ' + name);
97
95
  var regexp = new RegExp(name, 'g');
98
96
  var command = $(this).attr('data-command');
99
97
  html.find('*').each(function() {
@@ -7,78 +7,12 @@ $(function() {
7
7
  $('#gamefic_command').val('');
8
8
  $('#gamefic_controls').removeClass('working');
9
9
  });
10
- /*Gamefic.onStart(function(response) {
11
- var prompt = response.prompt;
12
- if (prompt == '>') {
13
- prompt = 'What do you want to do?'
14
- }
15
- $('#gamefic_prompt').html(prompt);
16
- $('#gamefic_output a[rel="gamefic"]').addClass('disabled');
17
- });
18
- Gamefic.onInput(function(response) {
19
- if (response.input != null) {
20
- $('#gamefic_output').append('<p><kbd>' + response.prompt + ' ' + response.input + '</kbd></p>');
21
- }
22
- $('#gamefic_controls').addClass('working');
23
- });
24
- Gamefic.onFinish(function(response) {
25
- if (!response.busy) {
26
- $('#gamefic_controls').removeClass('working');
27
- }
28
- $('#gamefic_command').val('');
29
- $('#gamefic_command').focus();
30
- var outputElement = document.getElementById('gamefic_output');
31
- $('#gamefic_output').animate({
32
- scrollTop: outputElement.scrollHeight
33
- }, 500);
34
- });
35
- Gamefic.handleResponse('Active', function(response) {
36
- $('#gamefic_output').append(response.output);
37
- });
38
- Gamefic.handleResponse('YesOrNo', function(response) {
39
- $('#gamefic_output').append(response.output);
40
- $('#gamefic_output').append('<p>(<a href="#" rel="gamefic" data-command="yes">Yes</a> or <a href="#" rel="gamefic" data-command="no">No</a>)</p>');
41
- });
42
- Gamefic.handleResponse('MultipleChoice', function(response) {
43
- var jq = $('<div/>');
44
- jq.html(response.output);
45
- jq.find('ol.multiple_choice li').each(function() {
46
- var item = $(this).text();
47
- var link = $('<a/>');
48
- link.attr('href', '#');
49
- link.attr('rel', 'gamefic');
50
- link.attr('data-command', item);
51
- link.text(item);
52
- $(this).html(link);
53
- });
54
- $('#gamefic_output').append(jq);
55
- });
56
- Gamefic.handleResponse('Conclusion', function(response) {
57
- if (response.input != null) {
58
- $('#gamefic_output').append('<p><kbd>' + response.prompt + ' ' + response.input + '</kbd></p>');
59
- }
60
- $('#gamefic_console').addClass('concluded');
61
- $('#gamefic_output').append(response.output);
62
- $('#gamefic_controls').hide();
63
- });
64
- $('#gamefic_output').on('click', 'a[rel="gamefic"]', function(event) {
65
- event.preventDefault();
66
- if (!$(this).hasClass('disabled')) {
67
- Gamefic.update($(this).attr('data-command'));
68
- }
69
- });*/
70
10
  Gamefic.onUpdate((state) => {
71
- console.log('Doing the update with ' + state['output']);
72
- console.log(JSON.stringify(state));
73
11
  $('#gamefic_output').append(state['output']);
74
12
  if (state.scene == 'Conclusion') {
75
13
  $('#gamefic_console').addClass('concluded');
76
14
  }
77
15
  });
78
- console.log('Starting Gamefic');
79
16
  Gamefic.start();
80
- //console.log('Started!');
81
17
  $('#gamefic_controls').removeClass('working');
82
- //$('#gamefic_command').focus();
83
- console.log('finished play');
84
18
  });
data/lib/gamefic-sdk.rb CHANGED
@@ -1,11 +1,12 @@
1
1
  require 'gamefic'
2
2
  require 'gamefic-sdk/platform'
3
- require 'gamefic-sdk/plot_config'
3
+ #require 'gamefic-sdk/plot_config'
4
4
  require 'gamefic-sdk/debug'
5
5
  require 'gamefic-sdk/version'
6
6
 
7
7
  module Gamefic::Sdk
8
8
  autoload :Server, 'gamefic-sdk/server'
9
+ autoload :Config, 'gamefic-sdk/config'
9
10
 
10
11
  HTML_TEMPLATE_PATH = File.realpath(File.dirname(__FILE__) + "/../html/")
11
12
  GLOBAL_SCRIPT_PATH = File.realpath(File.dirname(__FILE__) + "/../scripts/")
@@ -4,34 +4,26 @@ module Gamefic::Sdk
4
4
 
5
5
  module Build
6
6
  def self.release directory, quiet = false
7
- config = YAML.load(File.read(File.join(directory, 'config.yaml')))
8
- uuid_file = File.join(directory, '.uuid')
9
- if File.file?(uuid_file)
10
- config['uuid'] = File.read(uuid_file).strip
7
+ config = Gamefic::Sdk::Config.load(directory)
8
+ if config.auto_import?
9
+ puts "Importing scripts..."
10
+ Shell.start ['import', directory, '--quiet']
11
11
  end
12
- build_file = File.join(directory, 'build.yaml')
13
- platforms = YAML.load(File.read(build_file))
14
- platforms.each_pair { |k, v|
15
- v['name'] = k
16
- cls = Gamefic::Sdk::Platform.const_get(v['platform'])
17
- plat = cls.new(directory, v)
12
+ config.targets.each_pair { |k, v|
18
13
  puts "Building #{k}..." unless quiet
14
+ plat = Gamefic::Sdk::Platform.load(config, k)
19
15
  plat.build
20
16
  }
21
- puts "Build#{platforms.length > 1 ? 's' : ''} complete." unless quiet
17
+ puts "Build#{config.targets.length > 1 ? 's' : ''} complete." unless quiet
22
18
  end
23
19
  def self.clean directory
24
- build_file = File.join(directory, 'build.yaml')
25
- config = YAML.load(File.read(build_file))
26
- config.each_pair { |k, v|
27
- v['name'] = k
20
+ config = Gamefic::Sdk::Config.load(directory)
21
+ config.targets.each_pair { |k, v|
28
22
  puts "Cleaning #{k}..."
29
- build_dir = "#{directory}/build/#{k}"
30
- platform_dir = File.join(directory, "release", k)
31
- cls = Gamefic::Sdk::Platform.const_get(v['platform'])
32
- plat = cls.new(directory, v)
23
+ plat = Gamefic::Sdk::Platform.load(config, k)
33
24
  plat.clean
34
25
  }
26
+ puts "Done."
35
27
  end
36
28
  end
37
29
 
@@ -0,0 +1,126 @@
1
+ require 'yaml'
2
+ require 'pathname'
3
+
4
+ module Gamefic
5
+ module Sdk
6
+ class Config
7
+ attr_reader :source_dir
8
+ attr_reader :data
9
+
10
+ def initialize directory, data = {}
11
+ @source_dir = directory
12
+ @data = data
13
+
14
+ @source_dir.freeze
15
+ @data.freeze
16
+ end
17
+
18
+ # The game's title.
19
+ #
20
+ # @return [String]
21
+ def title
22
+ @title ||= (data['title'] || 'Untitled')
23
+ end
24
+
25
+ # The game's author.
26
+ #
27
+ # @return [String]
28
+ def author
29
+ @author ||= (data['author'] || 'Anonymous')
30
+ end
31
+
32
+ # The absolute path to the project's script directory.
33
+ #
34
+ # @return [String]
35
+ def script_path
36
+ @script_paths ||= Pathname.new(source_dir).join(data['script_path'] || './scripts').to_s
37
+ end
38
+
39
+ # The absolute path to the project's import directory.
40
+ #
41
+ # @return [String]
42
+ def import_path
43
+ @import_paths ||= Pathname.new(source_dir).join(data['import_path'] || './imports').to_s
44
+ end
45
+
46
+ # The absolute path to the project's media directory.
47
+ #
48
+ # @return [String]
49
+ def media_path
50
+ @media_path ||= Pathname.new(source_dir).join(data['media_path'] || './media').to_s
51
+ end
52
+
53
+ # The absolute path to the project's build directory.
54
+ #
55
+ # @return [String]
56
+ def build_path
57
+ @build_path ||= Pathname.new(source_dir).join(data['build_path'] || './build').to_s
58
+ end
59
+
60
+ # The absolute path to the project's release directory.
61
+ #
62
+ # @return [String]
63
+ def release_path
64
+ @release_path ||= Pathname.new(source_dir).join(data['release_path'] || './release').to_s
65
+ end
66
+
67
+ def auto_import?
68
+ @auto_import ||= (data['auto_import'] || true)
69
+ end
70
+
71
+ # A hash of each target's name and its configuration options.
72
+ #
73
+ # @return [Hash]
74
+ def targets
75
+ @targets ||= (data['targets'] || {})
76
+ end
77
+
78
+ # A universal unique identifier for the project.
79
+ #
80
+ # @return [String]
81
+ def uuid
82
+ if @uuid.nil?
83
+ if File.file?(File.join source_dir, '.uuid')
84
+ @@uuid = File.read(File.join source_dir, '.uuid').strip
85
+ end
86
+ end
87
+ @uuid
88
+ end
89
+
90
+ # @return [Gamefic::Sdk::Config]
91
+ def self.load directory
92
+ config = {}
93
+ ['config.yml', 'config.yaml'].each do |cy|
94
+ config_file = File.join(directory, cy)
95
+ if File.exist?(config_file)
96
+ config = YAML.load(File.read(config_file))
97
+ break
98
+ end
99
+ end
100
+ Config.new(directory, config)
101
+ end
102
+
103
+ def self.generate author = 'Anonymous', title = 'Untitled'
104
+ <<-EOS
105
+ title: #{title}
106
+ author: #{author}
107
+
108
+ script_path: ./scripts
109
+ import_path: ./imports
110
+ media_path: ./media
111
+
112
+ build_path: ./build
113
+ release_path: ./release
114
+
115
+ targets:
116
+ web:
117
+ platform: Web
118
+ html: ./html
119
+ gfic:
120
+ platform: Gfic
121
+ filename: game.gfic
122
+ EOS
123
+ end
124
+ end
125
+ end
126
+ end