.. index:: 
	single: What is new in Ring 1.12?; Introduction

=========================
What is new in Ring 1.12?
=========================

In this chapter we will learn about the changes and new features in Ring 1.12 release.

.. index:: 
	pair: What is new in Ring 1.12?; List of changes and new features

List of changes and new features
================================

Ring 1.12 comes with the next features!

* Go Game
* ASCII Table application
* BMI Calculator application
* Calendar application
* Julian Day Calendar application
* Tutorial: Number to Words
* Load Again Command
* ring_state_filetokens() function
* Embedded Ring Object File 
* Better RingRayLib
* More Improvements

.. index:: 
	pair: What is new in Ring 1.12?; Go Game

Go Game
=======

An implementation for the Go Game

.. image:: go.png
	:alt: Go Game

.. index:: 
	pair: What is new in Ring 1.12?; ASCII Table application

ASCII Table application
=======================

Simple application for displaying the ASCII table 

.. image:: asciitable.png
	:alt: ASCII Table

.. index:: 
	pair: What is new in Ring 1.12?; BMI Calculator application

BMI Calculator application
==========================

Simple application for calculating the BMI 

.. image:: BMI.png
	:alt: BMI

.. index:: 
	pair: What is new in Ring 1.12?; Calendar application

Calendar application
====================

The Calendar for Year 2020

.. image:: calendar.png
	:alt: calendar

.. index:: 
	pair: What is new in Ring 1.12?; Julian Day Calendar application

Julian Day Calendar application
===============================

The Julian Day Calendar application

.. image:: juliancalendar.png
	:alt: juliandaycalendar


.. index:: 
	pair: What is new in Ring 1.12?; Tutorial: Number to Words

Tutorial: Number to Words
=========================

Folder : ring/samples/other/number2words

.. image:: number2words.png
	:alt: Number2Words

.. index:: 
	pair: What is new in Ring 1.12?; Load Again Command

Load Again Command
==================

Ring 1.12 comes with the Load Again command

Using this command we can load the Ring source file which contains constants more than one time.

This is useful when using Ring source files for translations through global constants.

Example:

The next function is part from a project which support Arabic and English languages

The files english.ring and arabic.ring contains constants for translation

One of these files is loaded in the start of the program

Loading the same file again using the (Load) command is not possible

Because the (Load) command load the same source file only for the first time and ignore next times.

So we have to use the (Load Again) command.

Where we can use these files again during the runtime as in the next code

.. code-block:: ring

	func setLang nLanguage
		if C_ENV_DEFAULT_LANG = nLanguage
			return
		ok
		C_ENV_DEFAULT_LANG = nLanguage
		# Change the language
			switch nLanguage 
				on C_TRANSLATION_ENGLISH
					load again "translation/english.ring"
				on C_TRANSLATION_ARABIC 
					load again "translation/arabic.ring"
			off

.. index:: 
	pair: What is new in Ring 1.12?; ring_state_filetokens() function

ring_state_filetokens() function
================================

Using the ring_state_filetokens() function we can get all the tokens in the ring source code file.

.. code-block:: ring

	C_FILENAME 	= "test_tokens.ring"
	C_WIDTH		= 12

	# write the file
		write(C_FILENAME,'
				see "Hello, World!"
				? 3*2+3
				Name = "Ring"
				? Name
	')

	# Token Type
		C_KEYWORD 	= 0
		C_OPERATOR 	= 1
		C_LITERAL 	= 2
		C_NUMBER 	= 3
		C_IDENTIFIER 	= 4
		C_ENDLINE 	= 5

	# Keywords List
	aKEYWORDS = ["IF","TO","OR","AND","NOT","FOR","NEW","FUNC", 
	"FROM","NEXT","LOAD","ELSE","SEE","WHILE","OK","CLASS","RETURN","BUT", 
	"END","GIVE","BYE","EXIT","TRY","CATCH","DONE","SWITCH","ON","OTHER","OFF", 
	"IN","LOOP","PACKAGE","IMPORT","PRIVATE","STEP","DO","AGAIN","CALL","ELSEIF", 
	"PUT","GET","CASE","DEF","ENDFUNC","ENDCLASS","ENDPACKAGE", 
	"CHANGERINGKEYWORD","CHANGERINGOPERATOR","LOADSYNTAX"]

	pState = ring_state_new()
	aList = ring_state_filetokens(pState,C_FILENAME)
	PrintTokens(aList)
	ring_state_delete(pState)

	func PrintTokens aList
		for aToken in aList
			switch aToken[1]
			on C_KEYWORD 
				? Width("Keyword",C_WIDTH) + ": "  + aKeywords[0+aToken[2]]
			on C_OPERATOR 
				? Width("Operator",C_WIDTH)  + ": " + aToken[2]
			on C_LITERAL 
				? Width("Literal",C_WIDTH)  + ": " + aToken[2]
			on C_NUMBER 
				? Width("Number",C_WIDTH)  + ": " + aToken[2]
			on C_IDENTIFIER 
				? Width("Identifier",C_WIDTH)  + ": " + aToken[2]
			on C_ENDLINE 
				? "EndLine"
			other
				
			off
		next

	func Width cText,nWidth
		return cText+copy(" ",nWidth-len(cText))

Output:

.. code-block:: none

	EndLine
	Keyword     : SEE
	Literal     : Hello, World!
	EndLine
	Operator    : ?
	Number      : 3
	Operator    : *
	Number      : 2
	Operator    : +
	Number      : 3
	EndLine
	Identifier  : name
	Operator    : =
	Literal     : Ring
	EndLine
	Operator    : ?
	Identifier  : name
	EndLine

.. index:: 
	pair: What is new in Ring 1.12?; Generate Embedded Object File

Generate Embedded Ring Object File
==================================

We can generate embedded object file (C source code) from the source code file (*.ring) 
using -geo option

Command:

.. code-block:: ring

	ring test.ring -geo

This command will generate at least three files

.. code-block:: ring

	test.c
	ringappcode.c
	ringappcode.h

More files could be generated based on the project size

The generated files will pass the byte code to Ring VM to be executed

.. index:: 
	pair: What is new in Ring 1.12?; Better RingRayLib

Better RingRayLib
=================

More Samples are added to RingRayLib

	* Sound Loading Playing 
	* Texture Source 
	* Music Playing Streaming 
	* Rectangle scaling 
	* Colors Palette
	* Following Eyes
	* Collision Area
	* Bezier Lines
	* Images Generation
	* Fiften Puzzle Game
	* Cubic Map

Screen Shot:
	
.. image:: raylib_cubicmap.png
	:alt: RayLib Example	

.. index:: 
	pair: What is new in Ring 1.12?; More Improvements

More Improvements
=================

* New Samples 
	* ring/samples/other/Hex2UTF8.ring
	* ring/samples/other/CalmoSoftPrimesTable.ring
	* ring/samples/other/CalmoSoftTicTacToeGame.ring
	* ring/samples/other/CalmoSoftSimpleGoGame.ring
	* ring/samples/other/arabicmysql.ring 
	* ring/samples/other/CalmoSoftExtraCube.ring
	* ring/samples/other/DynamicCode/anonfunc.ring
	* ring/samples/other/DynamicCode/deletethisfile.ring
	* ring/samples/other/DynamicCode/modifythisfile.ring
	* ring/samples/other/changesyntax/ArabicDemo.ring
	* ring/samples/other/changesyntax/EnglishDemo.ring
	* ring/samples/other/changesyntax/ChangeKeywordsArabic.ring
	* ring/samples/other/changesyntax/ChangeKeywordsEnglish.ring
	* ring/samples/other/changesyntax/pascal.ring
	* ring/samples/other/hijridate.ring

* Ring Notepad - Project Files - set minimum width based on desktop screen width
* Ring Notepad - Output Window - Move the Cursor to the end of text
* Ring Notepad - Output Window - Correct displaying for line breaks 
* Form Designer - Better Style - Controls colors and size
* VideoMusicPlayer is updated to work as expected after RingQt update
* FlappyBird3000 - Fast response on Android 
* Snake Game : Change the default window size (800x600)
* Maze Game : Change the default window size (800x600) 
* Maze Game : Move the camera with the player
* Maze Game : Restarting the game will hide the (You Win) message
* Game Engine : display error message when we can't create the game window
* Ring Tests : Added File build.sh for building on Linux and macOS
* RingQt : Updated to Qt 5.12.6
* RingQt : Added QQMLEngine class
* RingQt : Added files for building RingQt without Bluetooth support 
* RingQt : The size of the events code is changed from 100 characters to 200 characters
* RingQt : Correct links for Qt documentation in RingQt classes chapter
* RingQt for Android : Better code for executing the ring object file (ringo)
* Ring2EXE configuration files are updated for RingQt to correctly distribute RingQt apps
* Code Generator : Convert function names to lower case when generating the functions for structures
* OSCopyFolder() function is updated to copy the files in sub folders too
* fgetpos() function is updated to work as expected
* IsFunction() function is updated to be not case sensitive
* Space() function is updated to clear the output string with spaces
* Ring Compiler : Added file buildclang.bat for building on Windows using Clang compiler
* Ring VM - Internal hash function is updated
* Ring VM - Better Code for setting pVM->aSetProperty when creating new objects
* Ring VM - Better Code for state managment
