# Transplier
Can be found here: https://github.com/chopeks/kotlin-to-qsp-transpiler
If there are bugs or so in transpiler, let me know.
# Mod writing
1. Intellij IDEA is recommended (can be community edition)
2. check Main.kt and change directories
3. put mod files in src/main/kotlin/qsrc
- files can be placed in sub directories
- you can use 'empty_file_you_can_copy.kts' as template
- you can put qsrc files too, they'll be copied as is
Compiling this project will result in generated .qsp file!
##### NOTE: mod files have to be .kts (.kt won't transpile)
# API
There are a few apis already covered in com.chopeks.glife package, for example:
- all Girl Life locations
- most (some may be missing) of Girl Life variables
- enums for:
- arousal
- pain
- location type
- fetishes
- more to come (probably ;))
There are also some kotlin extensions in com.chopeks.glife.extensions.
These fragments of code are copied as is (with parameters replaced) during transpiling.
For example
```kotlin
fun GLExtensions.image(__image: String) {
"
"
}
// and calling it like this:
ext.image("mod/image/whatever.jpg")
```
will be translated to:
```qsp
'> src="mod/image/whatever.jpg"/>`
```
in qsrc file.
You can also define your own in mod.extensions.ModExtensions.kt
##### NOTE: no comments allowed inside of function body, it's ok to have comment outside of function body
### Other API tricks
##### GS, GT and GLLoc:
Instead of going like:
```
gs 'bed2', 'start'
```
You can do that typesafe way like this:
```kotlin
gs(GLLoc.bed2.start)
```
which will be transpiled to one above.
One note here: when using with GT,GS,XGT - it will transpile to whole path,
but when using it in if statement, or assignment, it will transpile to last value. For example:
```kotlin
// this will translate to gs 'bed2', 'start'
gs(GLLoc.bed2.start)
// this will translate to if $args[0] = 'start':
if(`$args`[0] == GLLoc.bed2.start)
// but this one will translate to if $args[0] = 'bed2':
if(`$args`[0] == GLLoc.bed2)
```
You can also define your own mod structure in ModLocation.kt
##### Separating code in one line
Qsp uses `&`, kotlin uses `;`, so:
```kotlin
// in qsp: *clr& cla
clr(); cla()
```
Note that kotlin if can only have 1 statement without brackets, so:
```kotlin
if(n == 0) clr(); cla()
```
is same as
```kotlin
if(n == 0) {
clr()
}
cla()
```
##### KillVar
you can use variable directly:
```kotlin
killVar(temp) // which will translate to killvar 'temp'
```
##### Types
There are 2 types:
- QspType - which is kotlin Any on steroids (more operators, array access etc)
- QspCodeTemplate - which is used with conjunction with dynamic() (also allows kotlin anonymous lambda)
##### Strings
Strings are normal, with " as \\" escape, while ' is '. No doubles.