{"action":"created","comment":{"url":"https://api.github.com/repos/4ian/GDevelop/pulls/comments/245148188","pull_request_review_id":189201602,"id":245148188,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDI0NTE0ODE4OA==","diff_hunk":"@@ -0,0 +1,586 @@\n+// @flow\r\n+import * as React from 'react';\r\n+import { Line, Column } from '../../../UI/Grid';\r\n+import Checkbox from 'material-ui/Checkbox';\r\n+import SelectField from 'material-ui/SelectField';\r\n+import MenuItem from 'material-ui/MenuItem';\r\n+import SemiControlledTextField from '../../../UI/SemiControlledTextField';\r\n+import ImagePreview from '../../../ResourcesList/ResourcePreview/ImagePreview';\r\n+import ResourceSelector from '../../../ResourcesList/ResourceSelector';\r\n+import ResourcesLoader from '../../../ResourcesLoader';\r\n+import ShapePreview from './ShapePreview.js';\r\n+import PolygonEditor from './PolygonEditor.js';\r\n+import { type BehaviorEditorProps } from '../BehaviorEditorProps.flow';\r\n+\r\n+type Props = BehaviorEditorProps;\r\n+\r\n+type State = {|\r\n+  image: string,\r\n+  imageWidth: number,\r\n+  imageHeight: number,\r\n+|};\r\n+\r\n+function NumericProperty(props: {|\r\n+  properties: gdMapStringPropertyDescriptor,\r\n+  propertyName: string,\r\n+  step: number,\r\n+  onUpdate: (newValue: string) => void,\r\n+|}) {\r\n+  const { properties, propertyName, step, onUpdate } = props;\r\n+\r\n+  return (\r\n+    <SemiControlledTextField\r\n+      value={properties.get(propertyName).getValue()}\r\n+      key={propertyName}\r\n+      floatingLabelText={properties.get(propertyName).getLabel()}\r\n+      floatingLabelFixed\r\n+      step={step}\r\n+      onChange={onUpdate}\r\n+      type=\"number\"\r\n+    />\r\n+  );\r\n+}\r\n+\r\n+function BitProperty(props: {|\r\n+  enabled: boolean,\r\n+  propertyName: string,\r\n+  pos: number,\r\n+  spacing: boolean,\r\n+  onUpdate: (enabled: boolean) => void,\r\n+|}) {\r\n+  const { enabled, propertyName, pos, spacing, onUpdate } = props;\r\n+\r\n+  return (\r\n+    <div style={{ width: spacing ? '7.5%' : '5%' }}>\r\n+      {\r\n+        <Checkbox\r\n+          checked={enabled}\r\n+          onCheck={(e, checked) => onUpdate(checked)}\r\n+        />\r\n+      }\r\n+      {spacing && (\r\n+        <div\r\n+          style={{ width: '33%' }}\r\n+          key={propertyName + '-space' + pos.toString(10)}\r\n+        />\r\n+      )}\r\n+    </div>\r\n+  );\r\n+}\r\n+\r\n+export default class Physics2Editor extends React.Component<Props, State> {\r\n+  resourcesLoader: typeof ResourcesLoader;\r\n+\r\n+  constructor(props: Props) {\r\n+    super(props);\r\n+\r\n+    this.resourcesLoader = ResourcesLoader;\r\n+\r\n+    this.state = {\r\n+      image: '',\r\n+      imageWidth: 0,\r\n+      imageHeight: 0,\r\n+    };\r\n+  }\r\n+\r\n+  _setImageSize = (width: number, height: number) => {\r\n+    this.setState({\r\n+      imageWidth: width,\r\n+      imageHeight: height,\r\n+    });\r\n+  };\r\n+\r\n+  _isBitEnabled(bitsValue: number, pos: number) {\r\n+    return !!(bitsValue & (1 << pos));\r\n+  }\r\n+\r\n+  _enableBit(bitsValue: number, pos: number, enable: boolean) {\r\n+    if (enable) bitsValue |= 1 << pos;\r\n+    else bitsValue &= ~(1 << pos);\r\n+    return bitsValue;\r\n+  }\r\n+\r\n+  render() {\r\n+    const { behavior, project } = this.props;\r\n+\r\n+    // Parsing error temporary workaround\r\n+    if (\r\n+      !Array.isArray(\r\n+        JSON.parse(\r\n+          behavior\r\n+            .getProperties()\r\n+            .get('vertices')\r\n+            .getValue()\r\n+        )\r\n+      )\r\n+    ) {\r\n+      behavior.updateProperty('vertices', '[]', project);\r\n+    }\r\n+\r\n+    const properties = behavior.getProperties(project);\r\n+    const bits = Array(16).fill(null);\r\n+    const shape = properties.get('shape').getValue();\r\n+    const layersValues = parseInt(properties.get('layers').getValue(), 10);\r\n+    const masksValues = parseInt(properties.get('masks').getValue(), 10);\r\n+\r\n+    return (\r\n+      <Column>\r\n+        <Line>\r\n+          <SelectField\r\n+            key={'type'}\r\n+            floatingLabelText={properties.get('type').getLabel()}\r\n+            floatingLabelFixed\r\n+            value={properties.get('type').getValue()}\r\n+            onChange={(e, index, newValue) => {\r\n+              behavior.updateProperty('type', newValue, project);\r\n+              this.forceUpdate();\r\n+            }}\r\n+          >\r\n+            {[\r\n+              <MenuItem\r\n+                key={'dynamic'}\r\n+                value={'Dynamic'}\r\n+                primaryText={'Dynamic'}\r\n+              />,\r\n+              <MenuItem\r\n+                key={'static'}\r\n+                value={'Static'}\r\n+                primaryText={'Static'}\r\n+              />,\r\n+              <MenuItem\r\n+                key={'kinematic'}\r\n+                value={'Kinematic'}\r\n+                primaryText={'Kinematic'}\r\n+              />,\r\n+            ]}\r\n+          </SelectField>\r\n+        </Line>\r\n+        <Line>\r\n+          <Column expand>\r\n+            <Checkbox\r\n+              label={properties.get('bullet').getLabel()}\r\n+              checked={properties.get('bullet').getValue() === 'true'}\r\n+              onCheck={(e, checked) => {\r\n+                behavior.updateProperty('bullet', checked ? '1' : '0', project);\r\n+                this.forceUpdate();\r\n+              }}\r\n+            />\r\n+          </Column>\r\n+          <Column expand>\r\n+            <Checkbox\r\n+              label={properties.get('fixedRotation').getLabel()}\r\n+              checked={properties.get('fixedRotation').getValue() === 'true'}\r\n+              onCheck={(e, checked) => {\r\n+                behavior.updateProperty(\r\n+                  'fixedRotation',\r\n+                  checked ? '1' : '0',\r\n+                  project\r\n+                );\r\n+                this.forceUpdate();\r\n+              }}\r\n+            />\r\n+          </Column>\r\n+          <Column expand>\r\n+            <Checkbox\r\n+              label={properties.get('canSleep').getLabel()}\r\n+              checked={properties.get('canSleep').getValue() === 'true'}\r\n+              onCheck={(e, checked) => {\r\n+                behavior.updateProperty(\r\n+                  'canSleep',\r\n+                  checked ? '1' : '0',\r\n+                  project\r\n+                );\r\n+                this.forceUpdate();\r\n+              }}\r\n+            />\r\n+          </Column>\r\n+        </Line>\r\n+        <Line>\r\n+          <SelectField\r\n+            floatingLabelText={properties.get('shape').getLabel()}\r\n+            floatingLabelFixed\r\n+            value={properties.get('shape').getValue()}\r\n+            onChange={(e, index, newValue) => {\r\n+              behavior.updateProperty('shape', newValue, project);\r\n+              this.forceUpdate();\r\n+            }}\r\n+          >\r\n+            <MenuItem key={'box'} value={'Box'} primaryText={'Box'} />\r\n+            <MenuItem key={'circle'} value={'Circle'} primaryText={'Circle'} />\r\n+            <MenuItem key={'edge'} value={'Edge'} primaryText={'Edge'} />\r\n+            <MenuItem\r\n+              key={'polygon'}\r\n+              value={'Polygon'}\r\n+              primaryText={'Polygon'}\r\n+            />\r\n+          </SelectField>\r\n+        </Line>\r\n+        <Line>\r\n+          {shape !== 'Polygon' && (\r\n+            <SemiControlledTextField\r\n+              value={properties\r\n+                .get(shape === 'Polygon' ? 'PolygonOriginX' : 'shapeDimensionA')\r\n+                .getValue()}\r\n+              key={'shapeDimensionA'}\r\n+              floatingLabelText={\r\n+                shape === 'Circle'\r\n+                  ? 'Radius'\r\n+                  : shape === 'Edge'\r\n+                  ? 'Length'\r\n+                  : 'Width'\r\n+              }\r\n+              floatingLabelFixed\r\n+              min={0}\r\n+              onChange={newValue => {\r\n+                behavior.updateProperty(\r\n+                  shape === 'Polygon' ? 'PolygonOriginX' : 'shapeDimensionA',\r\n+                  newValue,\r\n+                  project\r\n+                );\r\n+                this.forceUpdate();\r\n+              }}\r\n+              type=\"number\"\r\n+            />\r\n+          )}\r\n+          {shape !== 'Polygon' && shape !== 'Circle' && (\r\n+            <SemiControlledTextField\r\n+              value={properties\r\n+                .get(shape === 'Polygon' ? 'PolygonOriginY' : 'shapeDimensionB')\r\n+                .getValue()}\r\n+              key={'shapeDimensionB'}\r\n+              floatingLabelText={shape === 'Edge' ? 'Angle' : 'Height'}\r\n+              floatingLabelFixed\r\n+              min={shape === 'Edge' ? undefined : 0}\r\n+              onChange={newValue => {\r\n+                behavior.updateProperty(\r\n+                  shape === 'Polygon' ? 'PolygonOriginY' : 'shapeDimensionB',\r\n+                  newValue,\r\n+                  project\r\n+                );\r\n+                this.forceUpdate();\r\n+              }}\r\n+              type=\"number\"\r\n+            />\r\n+          )}\r\n+          {shape === 'Polygon' && (\r\n+            <SelectField\r\n+              floatingLabelText={properties.get('polygonOrigin').getLabel()}\r\n+              floatingLabelFixed\r\n+              value={properties.get('polygonOrigin').getValue()}\r\n+              onChange={(e, index, newValue) => {\r\n+                behavior.updateProperty('polygonOrigin', newValue, project);\r\n+                this.forceUpdate();\r\n+              }}\r\n+            >\r\n+              {[\r\n+                <MenuItem\r\n+                  key={'center'}\r\n+                  value={'Center'}\r\n+                  primaryText={'Center'}\r\n+                />,\r\n+                <MenuItem\r\n+                  key={'origin'}\r\n+                  value={'Origin'}\r\n+                  primaryText={'Origin'}\r\n+                />,\r\n+                <MenuItem\r\n+                  key={'topLeft'}\r\n+                  value={'TopLeft'}\r\n+                  primaryText={'Top-Left'}\r\n+                />,\r\n+              ]}\r\n+            </SelectField>\r\n+          )}\r\n+          <NumericProperty\r\n+            properties={properties}\r\n+            propertyName={'shapeOffsetX'}\r\n+            step={1}\r\n+            onUpdate={newValue => {\r\n+              behavior.updateProperty('shapeOffsetX', newValue, project);\r\n+              this.forceUpdate();\r\n+            }}\r\n+          />\r\n+          <NumericProperty\r\n+            properties={properties}\r\n+            propertyName={'shapeOffsetY'}\r\n+            step={1}\r\n+            onUpdate={newValue => {\r\n+              this.props.behavior.updateProperty(\r\n+                'shapeOffsetY',\r\n+                newValue,\r\n+                this.props.project\r\n+              );\r\n+              this.forceUpdate();\r\n+            }}\r\n+          />\r\n+        </Line>\r\n+        <Line>\r\n+          <Column expand>\r\n+            <Line>\r\n+              <ImagePreview\r\n+                resourceName={this.state.image}\r\n+                project={this.props.project}\r\n+                resourcesLoader={this.resourcesLoader}\r\n+                onSize={this._setImageSize}\r\n+              >\r\n+                <ShapePreview\r\n+                  shape={properties.get('shape').getValue()}\r\n+                  dimensionA={parseFloat(\r\n+                    properties.get('shapeDimensionA').getValue()\r\n+                  )}\r\n+                  dimensionB={parseFloat(\r\n+                    properties.get('shapeDimensionB').getValue()\r\n+                  )}\r\n+                  offsetX={parseFloat(\r\n+                    properties.get('shapeOffsetX').getValue()\r\n+                  )}\r\n+                  offsetY={parseFloat(\r\n+                    properties.get('shapeOffsetY').getValue()\r\n+                  )}\r\n+                  polygonOrigin={properties.get('polygonOrigin').getValue()}\r\n+                  vertices={JSON.parse(properties.get('vertices').getValue())}\r\n+                  width={this.state.imageWidth}\r\n+                  height={this.state.imageHeight}\r\n+                  onMoveVertex={(index, newX, newY) => {\r\n+                    let vertices = JSON.parse(\r\n+                      properties.get('vertices').getValue()\r\n+                    );\r\n+                    vertices[index].x = newX;\r\n+                    vertices[index].y = newY;\r\n+                    behavior.updateProperty(\r\n+                      'vertices',\r\n+                      JSON.stringify(vertices),\r\n+                      project\r\n+                    );\r\n+                    this.forceUpdate();\r\n+                  }}\r\n+                />\r\n+              </ImagePreview>\r\n+            </Line>\r\n+            <Line>\r\n+              <ResourceSelector\r\n+                project={this.props.project}\r\n+                resourceSources={this.props.resourceSources}\r\n+                onChooseResource={this.props.onChooseResource}\r\n+                resourceExternalEditors={this.props.resourceExternalEditors}\r\n+                resourcesLoader={this.resourcesLoader}\r\n+                resourceKind={'image'}\r\n+                initialResourceName={''}\r\n+                fullWidth={false}\r\n+                onChange={resourceName => {\r\n+                  this.setState({ image: resourceName });\r\n+                  this.forceUpdate();\r\n+                }}\r\n+              />\r\n+            </Line>\r\n+          </Column>\r\n+          {shape === 'Polygon' && (\r\n+            <PolygonEditor\r\n+              vertices={JSON.parse(properties.get('vertices').getValue())}\r\n+              onChangeVertexX={(newValue, index) => {\r\n+                let vertices = JSON.parse(\r\n+                  properties.get('vertices').getValue()\r\n+                );\r\n+                vertices[index].x = newValue;\r\n+                behavior.updateProperty(\r\n+                  'vertices',\r\n+                  JSON.stringify(vertices),\r\n+                  project\r\n+                );\r\n+                this.forceUpdate();\r\n+              }}\r\n+              onChangeVertexY={(newValue, index) => {\r\n+                let vertices = JSON.parse(\r\n+                  properties.get('vertices').getValue()\r\n+                );\r\n+                vertices[index].y = newValue;\r\n+                behavior.updateProperty(\r\n+                  'vertices',\r\n+                  JSON.stringify(vertices),\r\n+                  project\r\n+                );\r\n+                this.forceUpdate();\r\n+              }}\r\n+              onAdd={() => {\r\n+                let vertices = JSON.parse(\r\n+                  properties.get('vertices').getValue()\r\n+                );\r\n+                if (vertices.length >= 8) return;\r\n+                vertices.push({ x: 0, y: 0 });\r\n+                behavior.updateProperty(\r\n+                  'vertices',\r\n+                  JSON.stringify(vertices),\r\n+                  project\r\n+                );\r\n+                this.forceUpdate();\r\n+              }}\r\n+              onRemove={index => {\r\n+                let vertices = JSON.parse(\r\n+                  properties.get('vertices').getValue()\r\n+                );\r\n+                vertices.splice(index, 1);\r\n+                behavior.updateProperty(\r\n+                  'vertices',\r\n+                  JSON.stringify(vertices),\r\n+                  project\r\n+                );\r\n+                this.forceUpdate();\r\n+              }}\r\n+            />\r\n+          )}\r\n+        </Line>\r\n+        <Line>\r\n+          <SemiControlledTextField // Debug vertices raw content\r","path":"newIDE/app/src/BehaviorsEditor/Editors/Physics2Editor/index.js","position":433,"original_position":433,"commit_id":"d86cefca94cb5182ee912ea92cb486bf35a83faf","original_commit_id":"d86cefca94cb5182ee912ea92cb486bf35a83faf","user":{"login":"Lizard-13","id":9782647,"node_id":"MDQ6VXNlcjk3ODI2NDc=","avatar_url":"https://avatars2.githubusercontent.com/u/9782647?v=4","gravatar_id":"","url":"https://api.github.com/users/Lizard-13","html_url":"https://github.com/Lizard-13","followers_url":"https://api.github.com/users/Lizard-13/followers","following_url":"https://api.github.com/users/Lizard-13/following{/other_user}","gists_url":"https://api.github.com/users/Lizard-13/gists{/gist_id}","starred_url":"https://api.github.com/users/Lizard-13/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Lizard-13/subscriptions","organizations_url":"https://api.github.com/users/Lizard-13/orgs","repos_url":"https://api.github.com/users/Lizard-13/repos","events_url":"https://api.github.com/users/Lizard-13/events{/privacy}","received_events_url":"https://api.github.com/users/Lizard-13/received_events","type":"User","site_admin":false},"body":"Sure, this and the vertices array check/reset.","created_at":"2019-01-03T22:04:25Z","updated_at":"2019-01-03T22:04:26Z","html_url":"https://github.com/4ian/GDevelop/pull/825#discussion_r245148188","pull_request_url":"https://api.github.com/repos/4ian/GDevelop/pulls/825","author_association":"CONTRIBUTOR","_links":{"self":{"href":"https://api.github.com/repos/4ian/GDevelop/pulls/comments/245148188"},"html":{"href":"https://github.com/4ian/GDevelop/pull/825#discussion_r245148188"},"pull_request":{"href":"https://api.github.com/repos/4ian/GDevelop/pulls/825"}},"in_reply_to_id":245146769},"pull_request":{"url":"https://api.github.com/repos/4ian/GDevelop/pulls/825","id":240792715,"node_id":"MDExOlB1bGxSZXF1ZXN0MjQwNzkyNzE1","html_url":"https://github.com/4ian/GDevelop/pull/825","diff_url":"https://github.com/4ian/GDevelop/pull/825.diff","patch_url":"https://github.com/4ian/GDevelop/pull/825.patch","issue_url":"https://api.github.com/repos/4ian/GDevelop/issues/825","number":825,"state":"open","locked":false,"title":"[WIP] Physics behavior editor","user":{"login":"Lizard-13","id":9782647,"node_id":"MDQ6VXNlcjk3ODI2NDc=","avatar_url":"https://avatars2.githubusercontent.com/u/9782647?v=4","gravatar_id":"","url":"https://api.github.com/users/Lizard-13","html_url":"https://github.com/Lizard-13","followers_url":"https://api.github.com/users/Lizard-13/followers","following_url":"https://api.github.com/users/Lizard-13/following{/other_user}","gists_url":"https://api.github.com/users/Lizard-13/gists{/gist_id}","starred_url":"https://api.github.com/users/Lizard-13/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Lizard-13/subscriptions","organizations_url":"https://api.github.com/users/Lizard-13/orgs","repos_url":"https://api.github.com/users/Lizard-13/repos","events_url":"https://api.github.com/users/Lizard-13/events{/privacy}","received_events_url":"https://api.github.com/users/Lizard-13/received_events","type":"User","site_admin":false},"body":"Also adds custom polygon support.\r\n\r\n@4ian Now the parser works fine, I can make a fast test and check that un/serializing an isolated behavior content string convert the string to JSON and to string again correctly, arrays included. But for some reason, it doesn't work when opening a project file, I'm doing the following:\r\n* Create a new project\r\n* Add the physics behavior, the default values for `vertices` is `[]`\r\n* Save the project >> The array is correctly saved in the game file\r\n* Open the project >> The array is automatically converted to an empty object `{}`\r\n\r\nAgain, the parser works fine with the same isolated behavior string, am I going crazy?","created_at":"2018-12-24T16:07:02Z","updated_at":"2019-01-03T22:04:26Z","closed_at":null,"merged_at":null,"merge_commit_sha":"cf8cd9c95bf9a455faa69e7f4f3814e93bca877c","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/4ian/GDevelop/pulls/825/commits","review_comments_url":"https://api.github.com/repos/4ian/GDevelop/pulls/825/comments","review_comment_url":"https://api.github.com/repos/4ian/GDevelop/pulls/comments{/number}","comments_url":"https://api.github.com/repos/4ian/GDevelop/issues/825/comments","statuses_url":"https://api.github.com/repos/4ian/GDevelop/statuses/d86cefca94cb5182ee912ea92cb486bf35a83faf","head":{"label":"Lizard-13:physics2-behavior-editor","ref":"physics2-behavior-editor","sha":"d86cefca94cb5182ee912ea92cb486bf35a83faf","user":{"login":"Lizard-13","id":9782647,"node_id":"MDQ6VXNlcjk3ODI2NDc=","avatar_url":"https://avatars2.githubusercontent.com/u/9782647?v=4","gravatar_id":"","url":"https://api.github.com/users/Lizard-13","html_url":"https://github.com/Lizard-13","followers_url":"https://api.github.com/users/Lizard-13/followers","following_url":"https://api.github.com/users/Lizard-13/following{/other_user}","gists_url":"https://api.github.com/users/Lizard-13/gists{/gist_id}","starred_url":"https://api.github.com/users/Lizard-13/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Lizard-13/subscriptions","organizations_url":"https://api.github.com/users/Lizard-13/orgs","repos_url":"https://api.github.com/users/Lizard-13/repos","events_url":"https://api.github.com/users/Lizard-13/events{/privacy}","received_events_url":"https://api.github.com/users/Lizard-13/received_events","type":"User","site_admin":false},"repo":{"id":26711935,"node_id":"MDEwOlJlcG9zaXRvcnkyNjcxMTkzNQ==","name":"GD","full_name":"Lizard-13/GD","private":false,"owner":{"login":"Lizard-13","id":9782647,"node_id":"MDQ6VXNlcjk3ODI2NDc=","avatar_url":"https://avatars2.githubusercontent.com/u/9782647?v=4","gravatar_id":"","url":"https://api.github.com/users/Lizard-13","html_url":"https://github.com/Lizard-13","followers_url":"https://api.github.com/users/Lizard-13/followers","following_url":"https://api.github.com/users/Lizard-13/following{/other_user}","gists_url":"https://api.github.com/users/Lizard-13/gists{/gist_id}","starred_url":"https://api.github.com/users/Lizard-13/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Lizard-13/subscriptions","organizations_url":"https://api.github.com/users/Lizard-13/orgs","repos_url":"https://api.github.com/users/Lizard-13/repos","events_url":"https://api.github.com/users/Lizard-13/events{/privacy}","received_events_url":"https://api.github.com/users/Lizard-13/received_events","type":"User","site_admin":false},"html_url":"https://github.com/Lizard-13/GD","description":"GDevelop is an open source HTML5 and native game creator requiring no coding skills.","fork":true,"url":"https://api.github.com/repos/Lizard-13/GD","forks_url":"https://api.github.com/repos/Lizard-13/GD/forks","keys_url":"https://api.github.com/repos/Lizard-13/GD/keys{/key_id}","collaborators_url":"https://api.github.com/repos/Lizard-13/GD/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/Lizard-13/GD/teams","hooks_url":"https://api.github.com/repos/Lizard-13/GD/hooks","issue_events_url":"https://api.github.com/repos/Lizard-13/GD/issues/events{/number}","events_url":"https://api.github.com/repos/Lizard-13/GD/events","assignees_url":"https://api.github.com/repos/Lizard-13/GD/assignees{/user}","branches_url":"https://api.github.com/repos/Lizard-13/GD/branches{/branch}","tags_url":"https://api.github.com/repos/Lizard-13/GD/tags","blobs_url":"https://api.github.com/repos/Lizard-13/GD/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/Lizard-13/GD/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/Lizard-13/GD/git/refs{/sha}","trees_url":"https://api.github.com/repos/Lizard-13/GD/git/trees{/sha}","statuses_url":"https://api.github.com/repos/Lizard-13/GD/statuses/{sha}","languages_url":"https://api.github.com/repos/Lizard-13/GD/languages","stargazers_url":"https://api.github.com/repos/Lizard-13/GD/stargazers","contributors_url":"https://api.github.com/repos/Lizard-13/GD/contributors","subscribers_url":"https://api.github.com/repos/Lizard-13/GD/subscribers","subscription_url":"https://api.github.com/repos/Lizard-13/GD/subscription","commits_url":"https://api.github.com/repos/Lizard-13/GD/commits{/sha}","git_commits_url":"https://api.github.com/repos/Lizard-13/GD/git/commits{/sha}","comments_url":"https://api.github.com/repos/Lizard-13/GD/comments{/number}","issue_comment_url":"https://api.github.com/repos/Lizard-13/GD/issues/comments{/number}","contents_url":"https://api.github.com/repos/Lizard-13/GD/contents/{+path}","compare_url":"https://api.github.com/repos/Lizard-13/GD/compare/{base}...{head}","merges_url":"https://api.github.com/repos/Lizard-13/GD/merges","archive_url":"https://api.github.com/repos/Lizard-13/GD/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/Lizard-13/GD/downloads","issues_url":"https://api.github.com/repos/Lizard-13/GD/issues{/number}","pulls_url":"https://api.github.com/repos/Lizard-13/GD/pulls{/number}","milestones_url":"https://api.github.com/repos/Lizard-13/GD/milestones{/number}","notifications_url":"https://api.github.com/repos/Lizard-13/GD/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/Lizard-13/GD/labels{/name}","releases_url":"https://api.github.com/repos/Lizard-13/GD/releases{/id}","deployments_url":"https://api.github.com/repos/Lizard-13/GD/deployments","created_at":"2014-11-16T11:22:07Z","updated_at":"2018-12-27T11:03:31Z","pushed_at":"2019-01-03T17:04:23Z","git_url":"git://github.com/Lizard-13/GD.git","ssh_url":"git@github.com:Lizard-13/GD.git","clone_url":"https://github.com/Lizard-13/GD.git","svn_url":"https://github.com/Lizard-13/GD","homepage":"http://www.compilgames.net","size":152258,"stargazers_count":0,"watchers_count":0,"language":"C++","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":0,"license":{"key":"other","name":"Other","spdx_id":"NOASSERTION","url":null,"node_id":"MDc6TGljZW5zZTA="},"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"4ian:master","ref":"master","sha":"f69b9132ad1669b060d7a359dd243b04c0be7388","user":{"login":"4ian","id":1280130,"node_id":"MDQ6VXNlcjEyODAxMzA=","avatar_url":"https://avatars0.githubusercontent.com/u/1280130?v=4","gravatar_id":"","url":"https://api.github.com/users/4ian","html_url":"https://github.com/4ian","followers_url":"https://api.github.com/users/4ian/followers","following_url":"https://api.github.com/users/4ian/following{/other_user}","gists_url":"https://api.github.com/users/4ian/gists{/gist_id}","starred_url":"https://api.github.com/users/4ian/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/4ian/subscriptions","organizations_url":"https://api.github.com/users/4ian/orgs","repos_url":"https://api.github.com/users/4ian/repos","events_url":"https://api.github.com/users/4ian/events{/privacy}","received_events_url":"https://api.github.com/users/4ian/received_events","type":"User","site_admin":false},"repo":{"id":21331090,"node_id":"MDEwOlJlcG9zaXRvcnkyMTMzMTA5MA==","name":"GDevelop","full_name":"4ian/GDevelop","private":false,"owner":{"login":"4ian","id":1280130,"node_id":"MDQ6VXNlcjEyODAxMzA=","avatar_url":"https://avatars0.githubusercontent.com/u/1280130?v=4","gravatar_id":"","url":"https://api.github.com/users/4ian","html_url":"https://github.com/4ian","followers_url":"https://api.github.com/users/4ian/followers","following_url":"https://api.github.com/users/4ian/following{/other_user}","gists_url":"https://api.github.com/users/4ian/gists{/gist_id}","starred_url":"https://api.github.com/users/4ian/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/4ian/subscriptions","organizations_url":"https://api.github.com/users/4ian/orgs","repos_url":"https://api.github.com/users/4ian/repos","events_url":"https://api.github.com/users/4ian/events{/privacy}","received_events_url":"https://api.github.com/users/4ian/received_events","type":"User","site_admin":false},"html_url":"https://github.com/4ian/GDevelop","description":":video_game: GDevelop is an open source HTML5 and native game creator requiring no coding skills.","fork":false,"url":"https://api.github.com/repos/4ian/GDevelop","forks_url":"https://api.github.com/repos/4ian/GDevelop/forks","keys_url":"https://api.github.com/repos/4ian/GDevelop/keys{/key_id}","collaborators_url":"https://api.github.com/repos/4ian/GDevelop/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/4ian/GDevelop/teams","hooks_url":"https://api.github.com/repos/4ian/GDevelop/hooks","issue_events_url":"https://api.github.com/repos/4ian/GDevelop/issues/events{/number}","events_url":"https://api.github.com/repos/4ian/GDevelop/events","assignees_url":"https://api.github.com/repos/4ian/GDevelop/assignees{/user}","branches_url":"https://api.github.com/repos/4ian/GDevelop/branches{/branch}","tags_url":"https://api.github.com/repos/4ian/GDevelop/tags","blobs_url":"https://api.github.com/repos/4ian/GDevelop/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/4ian/GDevelop/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/4ian/GDevelop/git/refs{/sha}","trees_url":"https://api.github.com/repos/4ian/GDevelop/git/trees{/sha}","statuses_url":"https://api.github.com/repos/4ian/GDevelop/statuses/{sha}","languages_url":"https://api.github.com/repos/4ian/GDevelop/languages","stargazers_url":"https://api.github.com/repos/4ian/GDevelop/stargazers","contributors_url":"https://api.github.com/repos/4ian/GDevelop/contributors","subscribers_url":"https://api.github.com/repos/4ian/GDevelop/subscribers","subscription_url":"https://api.github.com/repos/4ian/GDevelop/subscription","commits_url":"https://api.github.com/repos/4ian/GDevelop/commits{/sha}","git_commits_url":"https://api.github.com/repos/4ian/GDevelop/git/commits{/sha}","comments_url":"https://api.github.com/repos/4ian/GDevelop/comments{/number}","issue_comment_url":"https://api.github.com/repos/4ian/GDevelop/issues/comments{/number}","contents_url":"https://api.github.com/repos/4ian/GDevelop/contents/{+path}","compare_url":"https://api.github.com/repos/4ian/GDevelop/compare/{base}...{head}","merges_url":"https://api.github.com/repos/4ian/GDevelop/merges","archive_url":"https://api.github.com/repos/4ian/GDevelop/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/4ian/GDevelop/downloads","issues_url":"https://api.github.com/repos/4ian/GDevelop/issues{/number}","pulls_url":"https://api.github.com/repos/4ian/GDevelop/pulls{/number}","milestones_url":"https://api.github.com/repos/4ian/GDevelop/milestones{/number}","notifications_url":"https://api.github.com/repos/4ian/GDevelop/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/4ian/GDevelop/labels{/name}","releases_url":"https://api.github.com/repos/4ian/GDevelop/releases{/id}","deployments_url":"https://api.github.com/repos/4ian/GDevelop/deployments","created_at":"2014-06-29T19:58:38Z","updated_at":"2019-01-03T21:07:22Z","pushed_at":"2019-01-03T21:07:23Z","git_url":"git://github.com/4ian/GDevelop.git","ssh_url":"git@github.com:4ian/GDevelop.git","clone_url":"https://github.com/4ian/GDevelop.git","svn_url":"https://github.com/4ian/GDevelop","homepage":"https://gdevelop-app.com","size":302737,"stargazers_count":1011,"watchers_count":1011,"language":"C++","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":161,"mirror_url":null,"archived":false,"open_issues_count":61,"license":{"key":"other","name":"Other","spdx_id":"NOASSERTION","url":null,"node_id":"MDc6TGljZW5zZTA="},"forks":161,"open_issues":61,"watchers":1011,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/4ian/GDevelop/pulls/825"},"html":{"href":"https://github.com/4ian/GDevelop/pull/825"},"issue":{"href":"https://api.github.com/repos/4ian/GDevelop/issues/825"},"comments":{"href":"https://api.github.com/repos/4ian/GDevelop/issues/825/comments"},"review_comments":{"href":"https://api.github.com/repos/4ian/GDevelop/pulls/825/comments"},"review_comment":{"href":"https://api.github.com/repos/4ian/GDevelop/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/4ian/GDevelop/pulls/825/commits"},"statuses":{"href":"https://api.github.com/repos/4ian/GDevelop/statuses/d86cefca94cb5182ee912ea92cb486bf35a83faf"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"Lizard-13"}}